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]))
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()
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()
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)
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()
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()
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)