Beispiel #1
0
class LabelOverlayManager(object):
    '''
    Manages rendering of which appears at fixed points on the screen, rather
    than text which appears at fixed points in the world.
    '''
    class Label(LabelMaker.LabelData):
        '''
        Holds state on a single label
        '''
        def __init__(self, text, color, size):
            '''
            constructor
            '''
            LabelMaker.LabelData.__init__(self, text, color, size)
            self.enabled = True
            self.x, self.y = 0, 0
            self.alpha = 1.0

    def initialize(self, gl, render_state, labels, texture_manager):
        self.labels = labels[:]  # deep copy
        self.texture = self.label_maker.initialize(gl, render_state,
                                                   self.labels,
                                                   texture_manager)

    def release_textures(self, gl):
        if self.texture != None:
            self.texture.shutdown(gl)
            self.texture = None

    def draw(self, gl, screen_width, screen_height):
        if self.texture == None or self.labels == []:
            return

        gl.glEnable(gl.GL_TEXTURE_2D)
        self.texture.bind(gl)

        gl.glEnable(gl.GL_BLEND)
        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)

        gl.glTexEnvx(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE)

        gl.glEnableClientState(gl.GL_VERTEX_ARRAY)
        gl.glEnableClientState(gl.GL_TEXTURE_COORD_ARRAY)
        gl.glDisableClientState(gl.GL_COLOR_ARRAY)

        # Change to orthographic projection, where the units in model view space
        # are the same as in screen space.
        gl.glMatrixMode(gl.GL_PROJECTION)
        gl.glPushMatrix()
        gl.glLoadIdentity()
        gl.glOrthof(0, screen_width, 0, screen_height, -100, 100)

        gl.glMatrixMode(gl.GL_MODELVIEW)
        gl.glPushMatrix()

        for label in self.labels:
            if label.enabled:
                x = label.x - label.width_in_pixels / 2
                y = label.y

                gl.glLoadIdentity()

                # Move the label to the correct offset.
                gl.glTranslatef(x, y, 0.0)

                # Scale the label to the correct size.
                gl.glScalef(label.width_in_pixels, label.height_in_pixels, 0.0)

                # Set the alpha for the label.
                gl.glColor4f(1, 1, 1, label.getAlpha())

                # Draw the label.
                self.vertex_buffer.set(gl)
                gl.glTexCoordPointer(2, gl.GL_FIXED, 0, label.tex_coords)
                self.index_buffer.draw(gl, gl.GL_TRIANGLES)

        # Restore the old matrices.
        gl.glMatrixMode(gl.GL_PROJECTION)
        gl.glPopMatrix()

        gl.glMatrixMode(gl.GL_MODELVIEW)
        gl.glPopMatrix()

        gl.glTexEnvf(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_REPLACE)
        gl.glDisable(gl.GL_BLEND)
        gl.glDisableClientState(gl.GL_TEXTURE_COORD_ARRAY)

        gl.glDisable(gl.GL_TEXTURE_2D)

    def __init__(self):
        '''
        Constructor
        '''
        self.labels = []
        self.label_maker = LabelMaker(True)
        self.texture = None
        self.vertex_buffer = VertexBuffer(4, False)
        self.index_buffer = IndexBuffer(6)
        #private Paint mLabelPaint = new Paint();
        #mLabelPaint.setAntiAlias(true);

        self.vertex_buffer.add_point(0, 0, 0)  # Bottom left
        self.vertex_buffer.add_point(0, 1, 0)  # Top left
        self.vertex_buffer.add_point(1, 0, 0)  # Bottom right
        self.vertex_buffer.add_point(1, 1, 0)  # Top right

        # Triangle one: bottom left, top left, bottom right.
        self.index_buffer.add_index(0)
        self.index_buffer.add_index(1)
        self.index_buffer.add_index(2)

        # Triangle two: bottom right, top left, top right.
        self.index_buffer.add_index(2)
        self.index_buffer.add_index(1)
        self.index_buffer.add_index(3)
class LabelOverlayManager(object):
    """
    Manages rendering of which appears at fixed points on the screen, rather
    than text which appears at fixed points in the world.
    """

    class Label(LabelMaker.LabelData):
        """
        Holds state on a single label
        """

        def __init__(self, text, color, size):
            """
            constructor
            """
            LabelMaker.LabelData.__init__(self, text, color, size)
            self.enabled = True
            self.x, self.y = 0, 0
            self.alpha = 1.0

    def initialize(self, gl, render_state, labels, texture_manager):
        self.labels = labels[:]  # deep copy
        self.texture = self.label_maker.initialize(gl, render_state, self.labels, texture_manager)

    def release_textures(self, gl):
        if self.texture != None:
            self.texture.shutdown(gl)
            self.texture = None

    def draw(self, gl, screen_width, screen_height):
        if self.texture == None or self.labels == []:
            return

        gl.glEnable(gl.GL_TEXTURE_2D)
        self.texture.bind(gl)

        gl.glEnable(gl.GL_BLEND)
        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)

        gl.glTexEnvx(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_MODULATE)

        gl.glEnableClientState(gl.GL_VERTEX_ARRAY)
        gl.glEnableClientState(gl.GL_TEXTURE_COORD_ARRAY)
        gl.glDisableClientState(gl.GL_COLOR_ARRAY)

        # Change to orthographic projection, where the units in model view space
        # are the same as in screen space.
        gl.glMatrixMode(gl.GL_PROJECTION)
        gl.glPushMatrix()
        gl.glLoadIdentity()
        gl.glOrthof(0, screen_width, 0, screen_height, -100, 100)

        gl.glMatrixMode(gl.GL_MODELVIEW)
        gl.glPushMatrix()

        for label in self.labels:
            if label.enabled:
                x = label.x - label.width_in_pixels / 2
                y = label.y

                gl.glLoadIdentity()

                # Move the label to the correct offset.
                gl.glTranslatef(x, y, 0.0)

                # Scale the label to the correct size.
                gl.glScalef(label.width_in_pixels, label.height_in_pixels, 0.0)

                # Set the alpha for the label.
                gl.glColor4f(1, 1, 1, label.getAlpha())

                # Draw the label.
                self.vertex_buffer.set(gl)
                gl.glTexCoordPointer(2, gl.GL_FIXED, 0, label.tex_coords)
                self.index_buffer.draw(gl, gl.GL_TRIANGLES)

        # Restore the old matrices.
        gl.glMatrixMode(gl.GL_PROJECTION)
        gl.glPopMatrix()

        gl.glMatrixMode(gl.GL_MODELVIEW)
        gl.glPopMatrix()

        gl.glTexEnvf(gl.GL_TEXTURE_ENV, gl.GL_TEXTURE_ENV_MODE, gl.GL_REPLACE)
        gl.glDisable(gl.GL_BLEND)
        gl.glDisableClientState(gl.GL_TEXTURE_COORD_ARRAY)

        gl.glDisable(gl.GL_TEXTURE_2D)

    def __init__(self):
        """
        Constructor
        """
        self.labels = []
        self.label_maker = LabelMaker(True)
        self.texture = None
        self.vertex_buffer = VertexBuffer(4, False)
        self.index_buffer = IndexBuffer(6)
        # private Paint mLabelPaint = new Paint();
        # mLabelPaint.setAntiAlias(true);

        self.vertex_buffer.add_point(0, 0, 0)  # Bottom left
        self.vertex_buffer.add_point(0, 1, 0)  # Top left
        self.vertex_buffer.add_point(1, 0, 0)  # Bottom right
        self.vertex_buffer.add_point(1, 1, 0)  # Top right

        # Triangle one: bottom left, top left, bottom right.
        self.index_buffer.add_index(0)
        self.index_buffer.add_index(1)
        self.index_buffer.add_index(2)

        # Triangle two: bottom right, top left, top right.
        self.index_buffer.add_index(2)
        self.index_buffer.add_index(1)
        self.index_buffer.add_index(3)