Esempio n. 1
0
def render_cb():
    state.frame += 1
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    projection = Transform().perspective(45.0, state.aspect, 0.1, 10.0)
    view = Transform().lookat(0.0, 0.0, 4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
    model = Transform().rotate(state.azimuth, 0.0, 1.0,
                               0.0).rotate(state.elevation, 1.0, 0.0, 0.0)
    cam_pos = view.inverse() * (0.0, 0.0, 0.0)

    # enable the shader
    state.shader.use()

    # view and projection matricies
    state.shader['view'] = view.matrix()
    state.shader['projection'] = projection.matrix()
    state.shader['camera_pos'] = cam_pos

    # world-space lighting
    state.shader['light_pos'] = (1.0, 10.0, 4.0)

    # per object/material stuff
    state.shader['model'] = model.matrix()
    state.shader['in_normal'] = state.mesh.normals
    state.shader['in_position'] = state.mesh.vertices

    # draw each material individually with its
    # specific (hacked a bit here) materials
    for matname, (start, end) in state.mesh.material_triangles.items():
        mat = state.materials[matname]
        state.shader['diffuse'] = mat.diffuse
        state.shader['ambient'] = mat.diffuse * 0.25
        state.shader['specular'] = (1.0, 1.0, 1.0)
        state.shader['spec_exp'] = 70.0
        glDrawArrays(GL_TRIANGLES, start * 3, (end - start) * 3)
Esempio n. 2
0
 def test_scale(self):
     s = [2.0, 3.0, 4.0]
     glMatrixMode(GL_MODELVIEW)
     glLoadIdentity()
     glScalef(s[0], s[1], s[2])
     Mgl = glGetFloatv(GL_MODELVIEW_MATRIX).transpose()
     M = Transform().scale(s[0], s[1], s[2]).matrix()
     self.assertTrue(numpy.allclose(M, Mgl))
Esempio n. 3
0
 def test_translate(self):
     t = [1.0, 2.0, 3.0]
     glMatrixMode(GL_MODELVIEW)
     glLoadIdentity()
     glTranslatef(t[0], t[1], t[2])
     Mgl = glGetFloatv(GL_MODELVIEW_MATRIX).transpose()
     M = Transform().translate(t[0], t[1], t[2]).matrix()
     self.assertTrue(numpy.allclose(M, Mgl))
Esempio n. 4
0
 def test_ortho(self):
     for i in range(1000):
         p = numpy.random.randn(6)
         glMatrixMode(GL_MODELVIEW)
         glLoadIdentity()
         glOrtho(*p)
         Mgl = glGetFloatv(GL_MODELVIEW_MATRIX).transpose()
         M = Transform().ortho(*p).matrix()
         self.assertTrue(numpy.allclose(M, Mgl))
Esempio n. 5
0
 def test_lookat(self):
     for i in range(1000):
         params = numpy.random.randn(9)
         glMatrixMode(GL_MODELVIEW)
         glLoadIdentity()
         gluLookAt(*params)
         Mgl = glGetFloatv(GL_MODELVIEW_MATRIX).transpose()
         M = Transform().lookat(*params).matrix()
         self.assertTrue(numpy.allclose(M, Mgl, rtol=1e-5, atol=1e-5))
Esempio n. 6
0
 def test_rotate(self):
     for i in range(1000):
         deg = (numpy.random.rand() - 0.5) * 360.0
         axis = numpy.random.randn(3)
         glMatrixMode(GL_MODELVIEW)
         glLoadIdentity()
         glRotatef(deg, axis[0], axis[1], axis[2])
         Mgl = glGetFloatv(GL_MODELVIEW_MATRIX).transpose()
         M = Transform().rotate(deg, axis[0], axis[1], axis[2]).matrix()
         self.assertTrue(numpy.allclose(M, Mgl, rtol=1e-5, atol=1e-5))
Esempio n. 7
0
 def test_frustum(self):
     for i in range(1000):
         p = numpy.random.randn(6)
         p[4] = abs(p[4])
         p[5] = abs(p[5])
         glMatrixMode(GL_MODELVIEW)
         glLoadIdentity()
         glFrustum(*p)
         Mgl = glGetFloatv(GL_MODELVIEW_MATRIX).transpose()
         M = Transform().frustum(*p).matrix()
         self.assertTrue(numpy.allclose(M, Mgl))
Esempio n. 8
0
 def test_perspective(self):
     for i in range(1000):
         fov = numpy.random.uniform(1.0, 70.0)
         aspect = numpy.random.uniform(0.5, 2.0)
         near = numpy.random.uniform()
         far = near + numpy.random.uniform()
         glMatrixMode(GL_MODELVIEW)
         glLoadIdentity()
         gluPerspective(fov, aspect, near, far)
         Mgl = glGetFloatv(GL_MODELVIEW_MATRIX).transpose()
         M = Transform().perspective(fov, aspect, near, far).matrix()
         self.assertTrue(numpy.allclose(M, Mgl, rtol=1e-5, atol=1e-5))
Esempio n. 9
0
def render():
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    proj = Transform().perspective(45.0, aspect, 0.1, 10.0).matrix()
    model = Transform().lookat(0.0, 2.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0,
                               0.0).matrix()

    glMatrixMode(GL_PROJECTION)
    glLoadMatrixf(proj.transpose())

    glMatrixMode(GL_MODELVIEW)
    glLoadMatrixf(model.transpose())

    glPointSize(5.0)
    glLineWidth(5.0)
    glBegin(GL_LINES)
    glColor3f(1.0, 0.0, 0.0)
    glVertex3f(1.0, 0.0, 0.0)
    glVertex3f(0.0, 0.0, 0.0)
    glColor3f(0.0, 1.0, 0.0)
    glVertex3f(0.0, 1.0, 0.0)
    glVertex3f(0.0, 0.0, 0.0)
    glColor3f(0.0, 0.0, 1.0)
    glVertex3f(0.0, 0.0, 1.0)
    glVertex3f(0.0, 0.0, 0.0)
    glEnd()
Esempio n. 10
0
def render_cb():
    # camera stuff
    projection = Transform().perspective(45.0, state.aspect, 0.1, 10.0)
    modelview = Transform().lookat(4.0, 4.0, 4.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)

    ## Selection code.
    glClearColor(0.0, 0.0, 0.0, 0.0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)
    state.select_shader.use()
    state.select_shader['modelview'] = modelview.matrix()
    state.select_shader['projection'] = projection.matrix()

    state.select_shader['position'] = state.positions
    state.select_shader['id'] = state.ids

    # draw scene here
    glPointSize(10.0)
    glDrawArrays(GL_POINTS, 0, state.positions.shape[0])
    glFlush()

    # read the pixel under the mouse and convert to an integer,
    # if the result is in the map of ids, mark as selected
    rgb = glReadPixels(state.mouse[0], state.mouse[1], 1, 1, GL_RGBA,
                       GL_UNSIGNED_BYTE, None)
    idx = int(rgb[0]) + int(rgb[1]) * 256 + int(rgb[2]) * 65536
    if idx in state.id_map:
        selected = state.id_map[idx]
    else:
        selected = -1

    # Rendering code
    glClearColor(0.7, 0.7, 1.0, 0.0)
    glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT)

    # highlight the selected point in yellow
    tcolors = state.colors.copy()
    if selected >= 0:
        tcolors[selected] = (1.0, 1.0, 0.0)

    state.render_shader.use()
    state.render_shader['modelview'] = modelview.matrix()
    state.render_shader['projection'] = projection.matrix()

    state.render_shader['position'] = state.positions
    state.render_shader['color'] = tcolors

    glPointSize(10.0)
    glDrawArrays(GL_POINTS, 0, state.positions.shape[0])
    glFlush()
Esempio n. 11
0
    def test_mul(self):
        pos = numpy.random.randn(3)
        deg = numpy.random.uniform(-180, 180)
        axis = numpy.random.randn(3)
        T = Transform().translate(*pos)
        R = Transform().rotate(deg, *axis)

        M1 = Transform().translate(*pos).rotate(deg, *axis)
        M2 = R * T
        M3 = R * T.matrix()
        self.assertTrue(numpy.allclose(M1.matrix(), M2.matrix()))
        self.assertTrue(numpy.allclose(M1.matrix(), M3))