class SimpleScreen(Screen): """A screen with a single textured quad displaying a background image""" def __init__(self, ui, textureFile): super(SimpleScreen, self).__init__(ui) self._texture = Texture(textureFile) def draw(self): """Draw the menu background""" # Clear the screen glClearColor(0, 0, 0, 1) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glEnable(GL_TEXTURE_2D) glMatrixMode(GL_MODELVIEW) glLoadIdentity() self._texture.bind() glBegin(GL_QUADS) if True: glColor4f(1, 1, 1, 1) glTexCoord2f(0.0, 0.0) glVertex2f(-8.0, -6.0) glTexCoord2f(1.0, 0.0) glVertex2f(8.0, -6.0) glTexCoord2f(1.0, 1.0) glVertex2f(8.0, 6.0) glTexCoord2f(0.0, 1.0) glVertex2f(-8.0, 6.0) glEnd()
class SimpleScreen(Screen): """A screen with a single textured quad displaying a background image""" def __init__(self, ui, textureFile): super(SimpleScreen, self).__init__(ui) self._texture = Texture(textureFile) def draw(self): """Draw the menu background""" # Clear the screen glClearColor(0, 0, 0, 1) glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) glEnable(GL_TEXTURE_2D) glMatrixMode(GL_MODELVIEW) glLoadIdentity() self._texture.bind() glBegin(GL_QUADS) if True: glColor4f(1, 1, 1, 1) glTexCoord2f(0.0, 0.0); glVertex2f(-8.0, -6.0) glTexCoord2f(1.0, 0.0); glVertex2f( 8.0, -6.0) glTexCoord2f(1.0, 1.0); glVertex2f( 8.0, 6.0) glTexCoord2f(0.0, 1.0); glVertex2f(-8.0, 6.0) glEnd()
class PointCloud(GLArray): def __init__(self, vertex_data=None, color_data=None): GLArray.__init__(self, vertex_data, color_data) self._sprite_texture = None def sprite(self, filename): print " -- initializing point sprite {}".format(filename) self._sprite_texture = Texture(filename) def _pre_draw(self): GLArray._pre_draw(self) if self._sprite_texture == None: return glDepthMask(GL_FALSE) glEnable(GL_POINT_SMOOTH) glEnable(GL_BLEND) glBlendFunc(GL_SRC_ALPHA, GL_ONE) self._sprite_texture.bind() glTexEnvf(GL_POINT_SPRITE, GL_COORD_REPLACE, GL_TRUE) glEnable(GL_POINT_SPRITE) glPointSize(15.0) def _post_draw(self): GLArray._post_draw(self) if self._sprite_texture == None: return self._sprite_texture.unbind() glDisable(GL_BLEND) glDisable(GL_POINT_SPRITE) def center(self): try: return self._center except: self._center = [0.0, 0.0, 0.0] for i in range(3): self._center[i] = sum(v[i] for v in self._vertex_data) / len(self._vertex_data) return self._center
class GlutWindow(WindowCallback): def __init__(self, screen_size: tuple, screen_pos: tuple=(0, 0), game_mode: bool=False, title: str='Default Title', **params): width, height = screen_size self.screen_size = screen_size self.screen_pos = screen_pos self.width = width self.height = height self.z_near = 1.0 self.z_far = 100.0 self.fov = 60.0 self.game_mode = game_mode self.title = title self._vbo = None self._vao = None self._ibo = None self._program = None self._texture = None self._vertices = None self._indexes = None self._camera = None self._pipeline = None self._scale = 0.0 self._dir_light_color = 1.0, 1.0, 1.0 self._dir_light_ambient_intensity = 0.5 self._projection = ProjParams( self.width, self.height, self.z_near, self.z_far, self.fov) self._log = params.get("log", print) self._clear_color = params.get("clearcolor", (0, 0, 0, 0)) self._vertex_attributes = {"Position": -1, "TexCoord": -1} self._init_glut() self._init_gl() self._create_vertex_buffer() self._create_index_buffer() self._effect = LightingTechnique("shaders/vs.glsl", "shaders/fs_lighting.glsl") self._effect.init() self._effect.enable() self._effect.set_texture_unit(0) self._texture = Texture(GL_TEXTURE_2D, "resources/test.png") if not self._texture.load(): raise ValueError("cannot load texture") def _init_glut(self): """ Basic GLUT initialization and callbacks binding """ glutInit(sys.argv[1:]) glutInitDisplayMode(GLUT_DOUBLE | GLUT_RGBA | GLUT_3_2_CORE_PROFILE) glutInitWindowSize(self.width, self.height) if self.game_mode: glutGameModeString("{}x{}@32".format(self.width, self.height)) glutEnterGameMode() else: glutCreateWindow(self.title.encode()) glutInitWindowPosition(*self.screen_pos) # callbacks binding glutDisplayFunc(self.on_display) glutIdleFunc(self.on_display) glutPassiveMotionFunc(self.on_mouse) glutSpecialFunc(self.on_keyboard) def _init_gl(self): """ OpenGL initialization """ glEnable(GL_DEPTH_TEST) glDepthFunc(GL_LEQUAL) glClearColor(*self._clear_color) # seems strange because should be GL_BACK... maybe something with camera? glCullFace(GL_FRONT) glFrontFace(GL_CW) glEnable(GL_CULL_FACE) def _create_vertex_buffer(self): """ Creates vertex array and vertex buffer and fills last one with data. """ self._vertices = np.array([ -1.0, -1.0, 0.5773, 0.0, 0.0, 0.0, -1.0, -1.15475, 0.5, 0.0, 1.0, -1.0, 0.5773, 1.0, 0.0, 0.0, 1.0, 0.0, 0.5, 1.0 ], dtype=np.float32) self._vao = glGenVertexArrays(1) glBindVertexArray(self._vao) self._vbo = glGenBuffers(1) glBindBuffer(GL_ARRAY_BUFFER, self._vbo) glBufferData(GL_ARRAY_BUFFER, self._vertices.nbytes, self._vertices, GL_STATIC_DRAW) def _create_index_buffer(self): """ Creates index buffer. """ self._indexes = np.array([ 0, 3, 1, 1, 3, 2, 2, 3, 0, 0, 1, 2 ], dtype=np.uint32) self._ibo = glGenBuffers(1) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self._ibo) glBufferData(GL_ELEMENT_ARRAY_BUFFER, self._indexes.nbytes, self._indexes, GL_STATIC_DRAW) @property def camera(self): return self._camera @camera.setter def camera(self, value): self._camera = value def on_display(self): """ Rendering callback. """ self._camera.render() glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT) self._scale += 0.1 pipeline = Pipeline(rotation=[0, self._scale, 0], translation=[0, 0, 6], projection=self._projection) pipeline.set_camera(self._camera) self._effect.set_wvp(pipeline.get_wvp()) self._effect.set_directional_light( self._dir_light_color, self._dir_light_ambient_intensity) position, tex_coord = 0, 1 glEnableVertexAttribArray(position) glEnableVertexAttribArray(tex_coord) glBindBuffer(GL_ARRAY_BUFFER, self._vbo) glVertexAttribPointer(position, 3, GL_FLOAT, GL_FALSE, 20, ctypes.c_void_p(0)) glVertexAttribPointer(tex_coord, 2, GL_FLOAT, GL_FALSE, 20, ctypes.c_void_p(12)) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, self._ibo) self._texture.bind(GL_TEXTURE0) glDrawElements(GL_TRIANGLES, 18, GL_UNSIGNED_INT, ctypes.c_void_p(0)) glDisableVertexAttribArray(position) glDisableVertexAttribArray(tex_coord) glutSwapBuffers() def on_mouse(self, x, y): """ Mouse moving events handler. """ self._camera.mouse(x, y) def on_keyboard(self, key, x, y): """ Keyboard events handler. """ if key == GLUT_KEY_F1: if not bool(glutLeaveMainLoop): sys.exit(0) glutLeaveMainLoop() if key == GLUT_KEY_PAGE_UP: self._dir_light_ambient_intensity += 0.05 if key == GLUT_KEY_PAGE_DOWN: self._dir_light_ambient_intensity -= 0.05 if self._camera: self._camera.keyboard(key) def run(self): glutMainLoop()