示例#1
0
 def generate_model(self):
     """ Generate the vertices and normals.
     """
     corner = 0.5
     vertices = [
         [[+corner, +corner, +corner], [+corner, -corner, +corner],
          [+corner, -corner, -corner], [+corner, +corner, -corner]],
         # Right face
         [[-corner, +corner, -corner], [-corner, -corner, -corner],
          [-corner, -corner, +corner], [-corner, +corner, +corner]],
         # Left face
         [[-corner, -corner, +corner], [-corner, -corner, -corner],
          [+corner, -corner, -corner], [+corner, -corner, +corner]],
         # Bottom face
         [[-corner, +corner, -corner], [-corner, +corner, +corner],
          [+corner, +corner, +corner], [+corner, +corner, -corner]],
         # Top face
         [[+corner, +corner, +corner], [-corner, +corner, +corner],
          [-corner, -corner, +corner], [+corner, -corner, +corner]],
         # Front face
         [[-corner, -corner, -corner], [-corner, +corner, -corner],
          [+corner, +corner, -corner], [+corner, -corner, -corner]]
         # Back face
     ]
     normals = [[+1, 0, 0], [-1, 0, 0], [0, -1, 0],
                [0, +1, 0], [0, 0, +1], [0, 0, -1]]
     # Draw inside (reverse winding and normals)
     for face in range(self.skip_right_face, 6):
         gl.glNormal3f(-normals[face][0], -normals[face][1],
                              -normals[face][2])
         for vertex in range(0, 3):
             gl.glVertex3f(gl.GLfloat(vertices[face][3 - vertex][0]),
                        gl.GLfloat(vertices[face][3 - vertex][1]),
                        gl.GLfloat(vertices[face][3 - vertex][2]))
         for vertex in (0, 2, 3):
             gl.glVertex3f(gl.GLfloat(vertices[face][3 - vertex][0]),
                        gl.GLfloat(vertices[face][3 - vertex][1]),
                        gl.GLfloat(vertices[face][3 - vertex][2]))
     # Draw outside
     for face in range(self.skip_right_face, 6):
         gl.glNormal3f(gl.GLfloat(normals[face][0]),
                              gl.GLfloat(normals[face][1]),
                    gl.GLfloat(normals[face][2]))
         for vertex in range(0, 3):
             gl.glVertex3f(gl.GLfloat(vertices[face][vertex][0]),
                        gl.GLfloat(vertices[face][vertex][1]),
                        gl.GLfloat(vertices[face][vertex][2]))
         for vertex in (0, 2, 3):
             gl.glVertex3f(gl.GLfloat(vertices[face][vertex][0]),
                        gl.GLfloat(vertices[face][vertex][1]),
                        gl.GLfloat(vertices[face][vertex][2]))
示例#2
0
    def init_model(self, scene):
        """ Add the pyramid normals and vertices to the View

        :param scene: The view to render the model to.
        :type scene: pyglet_helper.objects.View
        """
        # Note that this model is also used by arrow!
        scene.pyramid_model.gl_compile_begin()

        vertices = [[0, .5, .5],
                    [0, -.5, .5],
                    [0, -.5, -.5],
                    [0, .5, -.5],
                    [1, 0, 0]]
        triangle_indices = [0, 0, 0] * 6
        triangle_indices[0] = [3, 0, 4]  # top
        triangle_indices[1] = [1, 2, 4]  # bottom
        triangle_indices[2] = [0, 1, 4]  # front
        triangle_indices[3] = [3, 4, 2]  # back
        triangle_indices[4] = [0, 3, 2]  # left (base) 1
        triangle_indices[5] = [0, 2, 1]  # left (base) 2

        normals = [[1, 2, 0], [1, -2, 0], [1, 0, 2], [1, 0, -2], [-1, 0, 0],
                   [-1, 0, 0]]

        gl.glEnable(gl.GL_CULL_FACE)
        gl.glBegin(gl.GL_TRIANGLES)

        # Inside
        for face in range(0, 6):
            gl.glNormal3f(-normals[face][0], -normals[face][1], -normals[face][2])
            for vertex in range(0, 3):
                #print triangle_indices[face]
                #print vertices[triangle_indices[face]][2 - vertex]
                vert = [gl.GLfloat(i) for i in
                        vertices[triangle_indices[face][2 - vertex]]]
                gl.glVertex3f(*vert)

        # Outside
        for face in range(0, 6):
            gl.glNormal3fv(*[gl.GLfloat(i) for i in normals[face]])
            for vertex in range(0, 3):
                gl.glVertex3f(*[gl.GLfloat(i) for i in vertices[triangle_indices[
                                face][vertex]]])

        gl.glEnd()
        gl.glDisable(gl.GL_CULL_FACE)
        self.compiled = True

        scene.pyramid_model.gl_compile_end()
示例#3
0
        def paintGL(self):
                _import_gl()
                glClear(GL_COLOR_BUFFER_BIT)

                glColor3f(1.0,1.0,1.0)
                glLoadIdentity()
                self.lookAt(0.0, 0.0, 5.0, 0.0, 0.0, 0.0, 0.0, 1.0, 0.0)
                glScalef(1.0, 2.0, 1.0)
                glBegin(GL_TRIANGLES)
                glNormal3f(1,0,0)
                glVertex3f(1,0,0)
                glVertex3f(0,1,0)
                glVertex3f(1,1,0)
                glEnd()
                glFlush()
示例#4
0
文件: particles.py 项目: Tythos/hypyr
 def render(self):
     s = self.size
     gl.glDisable(gl.GL_DEPTH_TEST)
     gl.glDisable(gl.GL_LIGHTING)
     gl.glBegin(gl.GL_TRIANGLES)
     gl.glNormal3f(1.0, 0.0, 0.0)
     gl.glTexCoord2f(0.0, 0.0)
     gl.glVertex3f(0.0, -s, -s)
     gl.glTexCoord2f(1.0, 0.0)
     gl.glVertex3f(0.0, s, -s)
     gl.glTexCoord2f(1.0, 1.0)
     gl.glVertex3f(0.0, s, s)
     gl.glTexCoord2f(0.0, 0.0)
     gl.glVertex3f(0.0, -s, -s)
     gl.glTexCoord2f(1.0, 1.0)
     gl.glVertex3f(0.0, s, s)
     gl.glTexCoord2f(0.0, 1.0)
     gl.glVertex3f(0.0, -s, s)
     gl.glEnd()
     gl.glEnable(gl.GL_LIGHTING)
     gl.glEnable(gl.GL_DEPTH_TEST)
示例#5
0
    def draw_objects(self):
        '''called in the middle of ondraw after the buffer has been cleared'''
        self.create_objects()

        glPushMatrix()
        glTranslatef(0, 0, -self.dist)
        glMultMatrixd(build_rotmatrix(self.basequat))  # Rotate according to trackball
        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1))
        glTranslatef(- self.build_dimensions[3] - self.platform.width / 2,
                     - self.build_dimensions[4] - self.platform.depth / 2, 0)  # Move origin to bottom left of platform
        # Draw platform
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
        glDisable(GL_LIGHTING)
        self.platform.draw()
        glEnable(GL_LIGHTING)
        # Draw mouse
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
        inter = self.mouse_to_plane(self.mousepos[0], self.mousepos[1],
                                    plane_normal = (0, 0, 1), plane_offset = 0,
                                    local_transform = False)
        if inter is not None:
            glPushMatrix()
            glTranslatef(inter[0], inter[1], inter[2])
            glBegin(GL_TRIANGLES)
            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(1, 0, 0, 1))
            glNormal3f(0, 0, 1)
            glVertex3f(2, 2, 0)
            glVertex3f(-2, 2, 0)
            glVertex3f(-2, -2, 0)
            glVertex3f(2, -2, 0)
            glVertex3f(2, 2, 0)
            glVertex3f(-2, -2, 0)
            glEnd()
            glPopMatrix()

        # Draw objects
        glDisable(GL_CULL_FACE)
        glPushMatrix()
        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.3, 0.7, 0.5, 1))
        for i in self.parent.models:
            model = self.parent.models[i]
            glPushMatrix()
            glTranslatef(*(model.offsets))
            glRotatef(model.rot, 0.0, 0.0, 1.0)
            glTranslatef(*(model.centeroffset))
            glScalef(*model.scale)
            model.batch.draw()
            glPopMatrix()
        glPopMatrix()
        glEnable(GL_CULL_FACE)

        # Draw cutting plane
        if self.parent.cutting:
            # FIXME: make this a proper Actor
            axis = self.parent.cutting_axis
            fixed_dist = self.parent.cutting_dist
            dist, plane_width, plane_height = self.get_cutting_plane(axis, fixed_dist)
            if dist is not None:
                glPushMatrix()
                if axis == "x":
                    glRotatef(90, 0, 1, 0)
                    glRotatef(90, 0, 0, 1)
                    glTranslatef(0, 0, dist)
                elif axis == "y":
                    glRotatef(90, 1, 0, 0)
                    glTranslatef(0, 0, -dist)
                elif axis == "z":
                    glTranslatef(0, 0, dist)
                glDisable(GL_CULL_FACE)
                glBegin(GL_TRIANGLES)
                glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0, 0.9, 0.15, 0.3))
                glNormal3f(0, 0, self.parent.cutting_direction)
                glVertex3f(plane_width, plane_height, 0)
                glVertex3f(0, plane_height, 0)
                glVertex3f(0, 0, 0)
                glVertex3f(plane_width, 0, 0)
                glVertex3f(plane_width, plane_height, 0)
                glVertex3f(0, 0, 0)
                glEnd()
                glEnable(GL_CULL_FACE)
                glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
                glEnable(GL_LINE_SMOOTH)
                orig_linewidth = (GLfloat)()
                glGetFloatv(GL_LINE_WIDTH, orig_linewidth)
                glLineWidth(4.0)
                glBegin(GL_LINE_LOOP)
                glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0, 0.8, 0.15, 1))
                glVertex3f(0, 0, 0)
                glVertex3f(0, plane_height, 0)
                glVertex3f(plane_width, plane_height, 0)
                glVertex3f(plane_width, 0, 0)
                glEnd()
                glLineWidth(orig_linewidth)
                glDisable(GL_LINE_SMOOTH)
                glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
                glPopMatrix()

        glPopMatrix()
示例#6
0
    def draw_objects(self):
        '''called in the middle of ondraw after the buffer has been cleared'''
        self.create_objects()

        glPushMatrix()
        glTranslatef(0, 0, -self.dist)
        glMultMatrixd(build_rotmatrix(self.basequat))  # Rotate according to trackball
        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.2, 0.2, 0.2, 1))
        glTranslatef(- self.build_dimensions[3] - self.platform.width / 2,
                     - self.build_dimensions[4] - self.platform.depth / 2, 0)  # Move origin to bottom left of platform
        # Draw platform
        glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
        glDisable(GL_LIGHTING)
        self.platform.draw()
        glEnable(GL_LIGHTING)
        # Draw mouse
        glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
        inter = self.mouse_to_plane(self.mousepos[0], self.mousepos[1],
                                    plane_normal = (0, 0, 1), plane_offset = 0,
                                    local_transform = False)
        if inter is not None:
            glPushMatrix()
            glTranslatef(inter[0], inter[1], inter[2])
            glBegin(GL_TRIANGLES)
            glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(1, 0, 0, 1))
            glNormal3f(0, 0, 1)
            glVertex3f(2, 2, 0)
            glVertex3f(-2, 2, 0)
            glVertex3f(-2, -2, 0)
            glVertex3f(2, -2, 0)
            glVertex3f(2, 2, 0)
            glVertex3f(-2, -2, 0)
            glEnd()
            glPopMatrix()

        # Draw objects
        glDisable(GL_CULL_FACE)
        glPushMatrix()
        glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0.3, 0.7, 0.5, 1))
        for i in self.parent.models:
            model = self.parent.models[i]
            glPushMatrix()
            glTranslatef(*(model.offsets))
            glRotatef(model.rot, 0.0, 0.0, 1.0)
            glTranslatef(*(model.centeroffset))
            glScalef(*model.scale)
            model.batch.draw()
            glPopMatrix()
        glPopMatrix()
        glEnable(GL_CULL_FACE)

        # Draw cutting plane
        if self.parent.cutting:
            # FIXME: make this a proper Actor
            axis = self.parent.cutting_axis
            fixed_dist = self.parent.cutting_dist
            dist, plane_width, plane_height = self.get_cutting_plane(axis, fixed_dist)
            if dist is not None:
                glPushMatrix()
                if axis == "x":
                    glRotatef(90, 0, 1, 0)
                    glRotatef(90, 0, 0, 1)
                    glTranslatef(0, 0, dist)
                elif axis == "y":
                    glRotatef(90, 1, 0, 0)
                    glTranslatef(0, 0, -dist)
                elif axis == "z":
                    glTranslatef(0, 0, dist)
                glDisable(GL_CULL_FACE)
                glBegin(GL_TRIANGLES)
                glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0, 0.9, 0.15, 0.3))
                glNormal3f(0, 0, self.parent.cutting_direction)
                glVertex3f(plane_width, plane_height, 0)
                glVertex3f(0, plane_height, 0)
                glVertex3f(0, 0, 0)
                glVertex3f(plane_width, 0, 0)
                glVertex3f(plane_width, plane_height, 0)
                glVertex3f(0, 0, 0)
                glEnd()
                glEnable(GL_CULL_FACE)
                glPolygonMode(GL_FRONT_AND_BACK, GL_LINE)
                glEnable(GL_LINE_SMOOTH)
                orig_linewidth = (GLfloat)()
                glGetFloatv(GL_LINE_WIDTH, orig_linewidth)
                glLineWidth(4.0)
                glBegin(GL_LINE_LOOP)
                glMaterialfv(GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, vec(0, 0.8, 0.15, 1))
                glVertex3f(0, 0, 0)
                glVertex3f(0, plane_height, 0)
                glVertex3f(plane_width, plane_height, 0)
                glVertex3f(plane_width, 0, 0)
                glEnd()
                glLineWidth(orig_linewidth)
                glDisable(GL_LINE_SMOOTH)
                glPolygonMode(GL_FRONT_AND_BACK, GL_FILL)
                glPopMatrix()

        glPopMatrix()
示例#7
0
def draw_texture_rectangle(center_x, center_y, width, height, texture,
                           angle=0, alpha=1, transparent=True):
    """
    Draw a textured rectangle on-screen.

    Args:
        :center_x: x coordinate of rectangle center.
        :center_y: y coordinate of rectangle center.
        :width: width of the rectangle.
        :height: height of the rectangle.
        :texture: identifier of texture returned from load_texture() call
        :angle: rotation of the rectangle. Defaults to zero.
        :alpha: Transparency of image.
    Returns:
        None
    Raises:
        None

    :Example:

    >>> import arcade
    >>> arcade.open_window("Drawing Example", 800, 600)
    >>> arcade.set_background_color(arcade.color.WHITE)
    >>> arcade.start_render()
    >>> arcade.draw_text("draw_bitmap", 483, 3, arcade.color.BLACK, 12)
    >>> name = "examples/images/playerShip1_orange.png"
    >>> texture = arcade.load_texture(name)
    >>> scale = .6
    >>> arcade.draw_texture_rectangle(540, 120, scale * texture.width, \
scale * texture.height, texture, 0)
    >>> arcade.draw_texture_rectangle(540, 60, scale * texture.width, \
scale * texture.height, texture, 90)
    >>> arcade.finish_render()
    >>> arcade.quick_run(0.25)
    """

    if transparent:
        GL.glEnable(GL.GL_BLEND)
        GL.glBlendFunc(GL.GL_SRC_ALPHA, GL.GL_ONE_MINUS_SRC_ALPHA)
    else:
        GL.glDisable(GL.GL_BLEND)

    GL.glEnable(GL.GL_TEXTURE_2D)
    GL.glHint(GL.GL_POLYGON_SMOOTH_HINT, GL.GL_NICEST)
    GL.glHint(GL.GL_PERSPECTIVE_CORRECTION_HINT, GL.GL_NICEST)

    GL.glLoadIdentity()
    GL.glTranslatef(center_x, center_y, 0)
    if angle != 0:
        GL.glRotatef(angle, 0, 0, 1)

    GL.glColor4f(1, 1, 1, alpha)
    z = 0.5

    GL.glBindTexture(GL.GL_TEXTURE_2D, texture.texture_id)
    GL.glBegin(GL.GL_POLYGON)
    GL.glNormal3f(0.0, 0.0, 1.0)
    GL.glTexCoord2f(0, 0)
    GL.glVertex3f(-width/2, -height/2, z)
    GL.glTexCoord2f(1, 0)
    GL.glVertex3f(width/2, -height/2, z)
    GL.glTexCoord2f(1, 1)
    GL.glVertex3f(width/2, height/2, z)
    GL.glTexCoord2f(0, 1)
    GL.glVertex3f(-width/2, height/2, z)
    GL.glEnd()
示例#8
0
def draw_texture_rectangle(center_x: float,
                           center_y: float,
                           width: float,
                           height: float,
                           texture: Texture,
                           angle: float = 0,
                           alpha: float = 1,
                           transparent: bool = True,
                           repeat_count_x=1,
                           repeat_count_y=1):
    """
    Draw a textured rectangle on-screen.

    Args:
        :center_x: x coordinate of rectangle center.
        :center_y: y coordinate of rectangle center.
        :width: width of the rectangle.
        :height: height of the rectangle.
        :texture: identifier of texture returned from load_texture() call
        :angle: rotation of the rectangle. Defaults to zero.
        :alpha: Transparency of image.
    Returns:
        None
    Raises:
        None

    :Example:

    >>> import arcade
    >>> arcade.open_window(800,600,"Drawing Example")
    >>> arcade.set_background_color(arcade.color.WHITE)
    >>> arcade.start_render()
    >>> arcade.draw_text("draw_bitmap", 483, 3, arcade.color.BLACK, 12)
    >>> name = "arcade/examples/images/playerShip1_orange.png"
    >>> texture = arcade.load_texture(name)
    >>> scale = .6
    >>> arcade.draw_texture_rectangle(540, 120, scale * texture.width, \
scale * texture.height, texture, 0)
    >>> arcade.draw_texture_rectangle(540, 60, scale * texture.width, \
scale * texture.height, texture, 90)
    >>> arcade.draw_texture_rectangle(540, 60, scale * texture.width, \
scale * texture.height, texture, 90, 1, False)
    >>> arcade.finish_render()
    >>> arcade.quick_run(0.25)
    """

    if transparent:
        gl.glEnable(gl.GL_BLEND)
        gl.glBlendFunc(gl.GL_SRC_ALPHA, gl.GL_ONE_MINUS_SRC_ALPHA)
    else:
        gl.glDisable(gl.GL_BLEND)

    gl.glEnable(gl.GL_TEXTURE_2D)
    gl.glHint(gl.GL_POLYGON_SMOOTH_HINT, gl.GL_NICEST)
    gl.glHint(gl.GL_PERSPECTIVE_CORRECTION_HINT, gl.GL_NICEST)

    gl.glLoadIdentity()

    gl.glColor4f(1, 1, 1, alpha)
    z = 0.5  # pylint: disable=invalid-name

    x1 = -width / 2 + center_x
    x2 = width / 2 + center_x
    y1 = -height / 2 + center_y
    y2 = height / 2 + center_y

    p1 = x1, y1
    p2 = x2, y1
    p3 = x2, y2
    p4 = x1, y2

    if angle:
        p1 = rotate_point(p1[0], p1[1], center_x, center_y, angle)
        p2 = rotate_point(p2[0], p2[1], center_x, center_y, angle)
        p3 = rotate_point(p3[0], p3[1], center_x, center_y, angle)
        p4 = rotate_point(p4[0], p4[1], center_x, center_y, angle)

    gl.glBindTexture(gl.GL_TEXTURE_2D, texture.texture_id)
    gl.glBegin(gl.GL_POLYGON)
    gl.glNormal3f(0.0, 0.0, 1.0)
    gl.glTexCoord2f(0, 0)
    gl.glVertex3f(p1[0], p1[1], z)
    gl.glTexCoord2f(repeat_count_x, 0)
    gl.glVertex3f(p2[0], p2[1], z)
    gl.glTexCoord2f(repeat_count_x, repeat_count_y)
    gl.glVertex3f(p3[0], p3[1], z)
    gl.glTexCoord2f(0, repeat_count_y)
    gl.glVertex3f(p4[0], p4[1], z)
    gl.glEnd()
    gl.glDisable(gl.GL_TEXTURE_2D)