def draw(self, uniforms, entity, models, textures=(), color=(1.0, 1.0, 1.0), *args, **kwargs): glUseProgram(self) glDisable(GL_DEPTH_TEST) # Draw objects once as invisible to set stencil values. glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE) # Don't write any color values to color buffer. glStencilMask(0xFF) # Enable writing. model = models[entity.model] model.positions.enable() model.indices.enable() self.uniforms[b'perspective'].load( uniforms.get(b'perspective').ctypes.data_as(POINTER(GLfloat))) self.uniforms[b'view'].load( uniforms.get(b'view').ctypes.data_as(POINTER(GLfloat))) self.uniforms[b'color'].load(*color) entity.get_transformation_matrix( location=self.uniforms[b'transformation']) model.draw() # Draw again with larger model. glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) glStencilFunc(GL_NOTEQUAL, 1, 0xFF) # Update with 1's where the objects are rendered. glStencilMask( 0x00 ) # Value that AND's the value written to buffer. 0x00 basically disables writing to stencil. glUniformMatrix4fv( self.uniforms[b'transformation'], 1, GL_TRUE, create_transformation_matrix( *entity._location, *entity.rotation, *(entity.scale + 0.05)).ctypes.data_as(POINTER(GLfloat))) model.draw() glBindBuffer(GL_ARRAY_BUFFER, 0) glBindBuffer(GL_ELEMENT_ARRAY_BUFFER, 0) glDisableVertexAttribArray(0) glEnable(GL_DEPTH_TEST) glStencilMask(0xFF)
def draw_shadow_lem(self): with push_attrib(gl.GL_STENCIL_BUFFER_BIT | gl.GL_COLOR_BUFFER_BIT): gl.glStencilFunc(gl.GL_NOTEQUAL, 1, 1) gl.glStencilOp(gl.GL_KEEP, gl.GL_KEEP, gl.GL_REPLACE) gl.glEnable(gl.GL_STENCIL_TEST) gl.glEnable(gl.GL_BLEND) gl.glBlendFunc(gl.GL_ZERO, gl.GL_CONSTANT_ALPHA) gl.glBlendColor(1.0, 1.0, 1.0, 0.3) with push_matrix(gl.GL_MODELVIEW): gl.glMultTransposeMatrixf( float_ctype_array(1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0)) self.draw_lem_model()
def draw_shadow_lem (self): with push_attrib(gl.GL_STENCIL_BUFFER_BIT | gl.GL_COLOR_BUFFER_BIT): gl.glStencilFunc(gl.GL_NOTEQUAL, 1, 1) gl.glStencilOp(gl.GL_KEEP, gl.GL_KEEP, gl.GL_REPLACE) gl.glEnable(gl.GL_STENCIL_TEST) gl.glEnable(gl.GL_BLEND) gl.glBlendFunc(gl.GL_ZERO, gl.GL_CONSTANT_ALPHA) gl.glBlendColor(1.0, 1.0, 1.0, 0.3) with push_matrix(gl.GL_MODELVIEW): gl.glMultTransposeMatrixf(float_ctype_array(1.0, -1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0, 0.0, 0.0, 0.0, 1.0)) self.draw_lem_model()
def draw_rectangle(self, ellipse=False): loader = self.loader if loader.fillType == MOTIF_FILL: if ellipse: self.motif_batch.draw() else: glEnable(GL_STENCIL_TEST) glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE) glStencilFunc(GL_ALWAYS, 1, 1) glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE) self.motif_stencil.draw(GL_QUADS) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) glStencilFunc(GL_EQUAL, 1, 1) self.motif_batch.draw() else: self.vertex.draw(GL_QUADS)
def draw(self): glPushMatrix() glPushAttrib(GL_STENCIL_BUFFER_BIT) glClear(GL_STENCIL_BUFFER_BIT) glTranslatef(self.parent.x, self.parent.y, 0) glDisable(GL_TEXTURE_2D) loader = self.loader if loader.shape == LINE_SHAPE: glEnable(GL_LINE_SMOOTH) glEnable(GL_POINT_SMOOTH) glLineWidth(loader.borderSize) glPointSize(loader.borderSize) self.vertex.draw(GL_LINES) self.vertex.draw(GL_POINTS) elif loader.shape == RECTANGLE_SHAPE: width = self.parent.width height = self.parent.height if loader.fillType != NONE_FILL: # for counters if self.counter_stencil: glEnable(GL_STENCIL_TEST) glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE) glStencilFunc(GL_ALWAYS, 1, 1) glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE) self.counter_stencil.draw(GL_QUADS) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) glStencilFunc(GL_EQUAL, 1, 1) self.draw_rectangle() glDisable(GL_STENCIL_TEST) else: self.draw_rectangle() if self.border is not None: self.border.draw(GL_QUADS) elif loader.shape == ELLIPSE_SHAPE: if loader.fillType != NONE_FILL: glEnable(GL_STENCIL_TEST) glColorMask(GL_FALSE, GL_FALSE, GL_FALSE, GL_FALSE) glStencilFunc(GL_ALWAYS, 1, 1) glStencilOp(GL_REPLACE, GL_REPLACE, GL_REPLACE) self.stencil.draw(GL_TRIANGLES) glColorMask(GL_TRUE, GL_TRUE, GL_TRUE, GL_TRUE) glStencilFunc(GL_EQUAL, 1, 1) self.draw_rectangle(True) glDisable(GL_STENCIL_TEST) if self.border: self.border.draw(GL_QUADS) glPopAttrib() glPopMatrix()
def enable(self): gl.glClear(gl.GL_COLOR_BUFFER_BIT | gl.GL_DEPTH_BUFFER_BIT | gl.GL_STENCIL_BUFFER_BIT) gl.glDisable(gl.GL_DEPTH_TEST) gl.glColorMask(gl.GL_FALSE, gl.GL_FALSE, gl.GL_FALSE, gl.GL_FALSE) gl.glEnable(gl.GL_STENCIL_TEST) gl.glStencilOp(gl.GL_REPLACE, gl.GL_REPLACE, gl.GL_REPLACE) gl.glStencilFunc(gl.GL_ALWAYS, 1, 0xffffffff) gl.glEnable(gl.GL_BLEND) gl.glBlendFunc(Blend.SRC_ALPHA, Blend.ONE_MINUS_SRC_ALPHA) self.ground.draw() gl.glColorMask(gl.GL_TRUE, gl.GL_TRUE, gl.GL_TRUE, gl.GL_TRUE) gl.glEnable(gl.GL_DEPTH_TEST) gl.glStencilFunc(gl.GL_EQUAL, 1, 0xffffffff) gl.glStencilOp(gl.GL_KEEP, gl.GL_KEEP, gl.GL_KEEP) gl.glPushMatrix() gl.glCullFace(gl.GL_FRONT) gl.glEnable(gl.GL_NORMALIZE) gl.glEnable(gl.GL_BLEND) gl.glBlendFunc(Blend.SRC_ALPHA, Blend.ONE_MINUS_SRC_ALPHA) self.camera.render(lights=self.lights, effect_pass=1, before_render=self._before_visible) gl.glDisable(gl.GL_NORMALIZE) gl.glCullFace(gl.GL_BACK) gl.glPopMatrix() gl.glDisable(gl.GL_STENCIL_TEST) gl.glEnable(gl.GL_BLEND) gl.glBlendFunc(Blend.SRC_ALPHA, Blend.ONE_MINUS_SRC_ALPHA) self.ground.draw()