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)
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))
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))
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))
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))
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))
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))
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))
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()
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()
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))