Пример #1
0
    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)
Пример #2
0
 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()
Пример #3
0
 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()
Пример #4
0
 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)
Пример #5
0
 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)
Пример #6
0
 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()
Пример #7
0
 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()
Пример #8
0
    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()