OpenGL の Ruby ミニライブラリ
もう一度 Ruby で OpenGL してみる - Marginalia
まだ開発中です。
miniopengl.rb
require 'opengl' require 'glu' require 'glut' require 'matrix' include Gl, Glu, Glut, Math module MiniOpenGL class Tool def initialize @clear_clr = [0, 0, 0] @clear_color_alpha = 0 @color_alpha = 1 @buffering = 0 @depth_buffer = 0 @depth = 0 end attr_accessor :clear_clr, :clear_color_alpha, :color_alpha, :buffering, :depth_buffer, :depth def draw(&bk) glutDisplayFunc(bk) end def reshape(&bk) glutReshapeFunc(bk) end def repeat(msec, value = 0, &bk) a = proc do yield glutTimerFunc(msec, a, value) end glutTimerFunc(msec, a, value) end def timer(msec, prc, value = 0) glutTimerFunc(msec, prc, value) end def block(c) glBegin(c) yield glEnd end def line(x1, y1, x2, y2) block(GL_LINES) do glVertex2d(x1, y1) glVertex2d(x2, y2) end end def line3(x1, y1, z1, x2, y2, z2) block(GL_LINES) do glVertex3d(x1, y1, z1) glVertex3d(x2, y2, z2) end end def color(r, g, b) glColor4f(r, g, b, @color_alpha) end def clear_color(r, g, b) @clear_clr = [r, g, b] end def clear glClear(GL_COLOR_BUFFER_BIT | @depth_buffer) end alias display glFlush alias finish glFinish alias redisplay glutPostRedisplay alias clr_matrix glLoadIdentity alias swap_buffers glutSwapBuffers def init_modelview modelview clr_matrix end def init_projection projection clr_matrix end def modelview glMatrixMode(GL_MODELVIEW) end def projection glMatrixMode(GL_PROJECTION) end alias mmap glMultMatrixd alias mload glLoadMatrixd alias translate glTranslated alias rotate glRotated alias scale glScaled alias viewport glViewport alias perspective gluPerspective alias frustum glFrustum alias mpush glPushMatrix alias mpop glPopMatrix def stack mpush yield mpop end alias look_at gluLookAt def key_in(&bk) glutKeyboardFunc(bk) end def key_in2(&bk) glutSpecialFunc(bk) end def draw_vertex(c, dim, vtx) glEnableClientState(GL_VERTEX_ARRAY) #頂点配列の有効化 glVertexPointer(dim, GL_DOUBLE, 0, vtx) #頂点配列の定義 glDrawArrays(c, 0, vtx.size / dim) #頂点配列の描画指定 end def draw_elements(c, dim, vtx, id) glEnableClientState(GL_VERTEX_ARRAY) glVertexPointer(dim, GL_DOUBLE, 0, vtx) glDrawElements(c, id.size, GL_UNSIGNED_BYTE, id) end end def self.app(width: 300, height: 300, x: 200, y: 100, buffering: :off, depth_buffer: :off, title: "MiniOpenGL", &bk) t = Tool.new t.buffering = GLUT_DOUBLE if buffering == :on if depth_buffer == :on t.depth_buffer = GL_DEPTH_BUFFER_BIT t.depth = GLUT_DEPTH end glutInit glutInitWindowSize(width, height) glutInitWindowPosition(x, y) glutCreateWindow(title) glutInitDisplayMode(GLUT_RGBA | t.buffering | t.depth) t.init_modelview t.init_projection t.clear t.instance_eval(&bk) glClearColor(t.clear_clr[0], t.clear_clr[1], t.clear_clr[2], t.clear_color_alpha) glutMainLoop end end