def create_triangle(x_z_left, x_z_top, x_z_right, static=True): x1,z1 = x_z_left x2,z2 = x_z_top x3,z3 = x_z_right format = GeomVertexFormat.getV3n3c4t2() vdata=GeomVertexData('', format, Geom.UHStatic) vertex=GeomVertexWriter(vdata, 'vertex') normal=GeomVertexWriter(vdata, 'normal') vertex.addData3f(x1, 0, z1) # left vertex.addData3f(x2, 0, z2) # top vertex.addData3f(x3, 0, z3) # right for _i in range(3): normal.addData3f(0,-1,0) if static: prim_hint = Geom.UHStatic else: prim_hint = Geom.UHDynamic prim = GeomTriangles(prim_hint) prim.addVertices(0,2,1) prim.closePrimitive() geom = Geom(vdata) geom.addPrimitive(prim) node = GeomNode('') node.addGeom(geom) return node
def generate(self): format = GeomVertexFormat.getV3() data = GeomVertexData("Data", format, Geom.UHStatic) vertices = GeomVertexWriter(data, "vertex") vertices.addData3f(-self.w, -self.h, -self.d) vertices.addData3f(+self.w, -self.h, -self.d) vertices.addData3f(-self.w, +self.h, -self.d) vertices.addData3f(+self.w, +self.h, -self.d) vertices.addData3f(-self.w, -self.h, +self.d) vertices.addData3f(+self.w, -self.h, +self.d) vertices.addData3f(-self.w, +self.h, +self.d) vertices.addData3f(+self.w, +self.h, +self.d) triangles = GeomTriangles(Geom.UHStatic) def addQuad(v0, v1, v2, v3): triangles.addVertices(v0, v1, v2) triangles.addVertices(v0, v2, v3) triangles.closePrimitive() addQuad(4, 5, 7, 6) # Z+ addQuad(0, 2, 3, 1) # Z- addQuad(3, 7, 5, 1) # X+ addQuad(4, 6, 2, 0) # X- addQuad(2, 6, 7, 3) # Y+ addQuad(0, 1, 5, 4) # Y+ geom = Geom(data) geom.addPrimitive(triangles) node = GeomNode("BoxMaker") node.addGeom(geom) return NodePath(node)
def GetGeomTriangle(v1, v2, v3): tri = GeomTriangles(Geom.UHDynamic) tri.addVertex(v1) tri.addVertex(v2) tri.addVertex(v3) tri.closePrimitive() return tri
def _create_vertex_data(self): """Creates and fills the vertex data store.""" format = GeomVertexFormat.getV3n3cp() vdata = GeomVertexData("surface", format, Geom.UHDynamic) tri = GeomTriangles(Geom.UHDynamic) vertex = GeomVertexWriter(vdata, "vertex") normal = GeomVertexWriter(vdata, "normal") color = GeomVertexWriter(vdata, "color") for triangle in self._halfedge_mesh.faces: for v in triangle.iter_vertices(): vertex.addData3f(*v.coordinates) normal.addData3f(*v.normal) color.addData4f(*self._color) tri.addNextVertices(1) self._vdata = vdata tri.closePrimitive() self._geom_primitives = [tri]
def __init__(self, subdivides=3, scale=1.0): super(SphereNode, self).__init__('sphere') uniform = True # see if scale is a tuple try: xs, ys, zs = scale uniform = False except TypeError: # no, it's a scalar xs, ys, zs = scale, scale, scale north = (0.0, 1.0, 0.0) g = Octahedron() for i in range(subdivides): g.UniformSubdivide(midpointdisplace=NormalizeVert) #print "%d faces per sphere"%len(g.faces) # okay, we're gonna use setShaderInput to set constants for # surface coverages and planetary seed, so all we need per # vertex is position and normal # and we kind of don't need normal for a unit sphere, but # we want to use the same shader for other thangs format = GeomVertexFormat.getV3n3() vdata = GeomVertexData('sphere', format, Geom.UHDynamic) vertex = GeomVertexWriter(vdata, 'vertex') normal = GeomVertexWriter(vdata, 'normal') for (x, y, z) in g.verts: vertex.addData3f(x * xs, y * ys, z * zs) if uniform: normal.addData3f(x, y, z) else: n = NormalizeVert( (x / (xs * xs), y / (ys * ys), z / (zs * zs))) normal.addData3f(n[0], n[1], n[2]) trilist = GeomTriangles(Geom.UHDynamic) for (a, b, c) in g.faces: trilist.addVertex(a) trilist.addVertex(b) trilist.addVertex(c) trilist.closePrimitive() self.geom = Geom(vdata) self.geom.addPrimitive(trilist) self.addGeom(self.geom)
def __init__(self,subdivides=3,scale=1.0): super(SphereNode,self).__init__('sphere') uniform = True # see if scale is a tuple try: xs,ys,zs = scale uniform = False except TypeError: # no, it's a scalar xs,ys,zs = scale,scale,scale north = (0.0,1.0,0.0) g = Octahedron() for i in range(subdivides): g.UniformSubdivide( midpointdisplace = NormalizeVert ) #print "%d faces per sphere"%len(g.faces) # okay, we're gonna use setShaderInput to set constants for # surface coverages and planetary seed, so all we need per # vertex is position and normal # and we kind of don't need normal for a unit sphere, but # we want to use the same shader for other thangs format=GeomVertexFormat.getV3n3() vdata=GeomVertexData('sphere', format, Geom.UHDynamic) vertex=GeomVertexWriter(vdata, 'vertex') normal=GeomVertexWriter(vdata, 'normal') for (x,y,z) in g.verts: vertex.addData3f( x*xs, y*ys, z*zs ) if uniform: normal.addData3f( x, y, z ) else: n = NormalizeVert( (x/(xs*xs),y/(ys*ys),z/(zs*zs)) ) normal.addData3f( n[0], n[1], n[2] ) trilist=GeomTriangles(Geom.UHDynamic) for (a,b,c) in g.faces: trilist.addVertex(a) trilist.addVertex(b) trilist.addVertex(c) trilist.closePrimitive() self.geom = Geom(vdata) self.geom.addPrimitive( trilist ) self.addGeom( self.geom )
def draw(self): format=GeomVertexFormat.getV3n3cpt2() vdata=GeomVertexData('square', format, Geom.UHDynamic) vertex=GeomVertexWriter(vdata, 'vertex') normal=GeomVertexWriter(vdata, 'normal') color=GeomVertexWriter(vdata, 'color') circle=Geom(vdata) # Create vertices vertex.addData3f(self.pos) color.addData4f(self.color) for v in range(self._EDGES): x = self.pos.getX() + (self.size * math.cos((2*math.pi/self._EDGES)*v)) y = self.pos.getY() + (self.size * math.sin((2*math.pi/self._EDGES)*v)) z = self.pos.getZ() vertex.addData3f(x, y, z) color.addData4f(self.color) # Create triangles for t in range(self._EDGES): tri = GeomTriangles(Geom.UHDynamic) tri.addVertex(0) tri.addVertex(t+1) if (t+2) > self._EDGES: tri.addVertex(1) else: tri.addVertex(t+2) tri.closePrimitive() circle.addPrimitive(tri) gn = GeomNode('Circle') gn.addGeom(circle) np = NodePath(gn) np.setHpr(0, 90, 0) return np
def draw(self): format=GeomVertexFormat.getV3n3cpt2() vdata=GeomVertexData('square', format, Geom.UHStatic) vertex=GeomVertexWriter(vdata, 'vertex') normal=GeomVertexWriter(vdata, 'normal') color=GeomVertexWriter(vdata, 'color') texcoord=GeomVertexWriter(vdata, 'texcoord') #make sure we draw the sqaure in the right plane #if x1!=x2: vertex.addData3f(self.x1, self.y1, self.z1) vertex.addData3f(self.x2, self.y1, self.z1) vertex.addData3f(self.x2, self.y2, self.z2) vertex.addData3f(self.x1, self.y2, self.z2) normal.addData3f(Vec3(2*self.x1-1, 2*self.y1-1, 2*self.z1-1).normalize()) normal.addData3f(Vec3(2*self.x2-1, 2*self.y1-1, 2*self.z1-1).normalize()) normal.addData3f(Vec3(2*self.x2-1, 2*self.y2-1, 2*self.z2-1).normalize()) normal.addData3f(Vec3(2*self.x1-1, 2*self.y2-1, 2*self.z2-1).normalize()) #adding different colors to the vertex for visibility color.addData4f(self.r, self.g, self.b, self.a) color.addData4f(self.r, self.g, self.b, self.a) color.addData4f(self.r, self.g, self.b, self.a) color.addData4f(self.r, self.g, self.b, self.a) texcoord.addData2f(0.0, 1.0) texcoord.addData2f(0.0, 0.0) texcoord.addData2f(1.0, 0.0) texcoord.addData2f(1.0, 1.0) #quads arent directly supported by the Geom interface #you might be interested in the CardMaker class if you are #interested in rectangle though tri1=GeomTriangles(Geom.UHStatic) tri2=GeomTriangles(Geom.UHStatic) tri1.addVertex(0) tri1.addVertex(1) tri1.addVertex(3) tri2.addConsecutiveVertices(1,3) tri1.closePrimitive() tri2.closePrimitive() square=Geom(vdata) square.addPrimitive(tri1) square.addPrimitive(tri2) #square.setIntoCollideMask(BitMask32.bit(1)) self.squareNP = NodePath(GeomNode('square gnode')) self.squareNP.node().addGeom(square) self.squareNP.setTransparency(1) self.squareNP.setAlphaScale(.5) self.squareNP.setTwoSided(True) #squareNP.setCollideMask(BitMask32.bit(1)) self.squareNP.reparentTo(self.parent) return self.squareNP
def _create_vertex_data(self): """Creates and fills the vertex data store.""" format = GeomVertexFormat.getV3n3cp() vdata = GeomVertexData('surface', format, Geom.UHDynamic) tri = GeomTriangles(Geom.UHDynamic) vertex = GeomVertexWriter(vdata, 'vertex') normal = GeomVertexWriter(vdata, 'normal') color = GeomVertexWriter(vdata, 'color') vertmap = [(0, 1), (1, 2), (2, 3), (3, 0), (4, 5), (5, 6), (6, 7), (7, 4), (0, 4), (1, 5), (2, 6), (3, 7)] def generate_index(x, y, z): return x + \ y * (self._surface.mls_subdivisions+2) + \ z * (self._surface.mls_subdivisions+2)**2 numbering_scheme = [ (0, 0, 1), (1, 0, 1), (1, 0, 0), (0, 0, 0), (0, 1, 1), (1, 1, 1), (1, 1, 0), (0, 1, 0)] vertices = zeros((12,), dtype='3f') vertex_normals = zeros((12,), dtype='3f') # walk the cubes for x_index in range(self._surface.mls_subdivisions+1): for y_index in range(self._surface.mls_subdivisions+1): for z_index in range(self._surface.mls_subdivisions+1): #points = map(lambda offsets: self._surface.mls_points[generate_index(array([x_index, y_index, z_index]) + offsets)], numbering_scheme) points = [ self._surface.mls_points[generate_index(x_index + 0, y_index + 0, z_index + 1)], self._surface.mls_points[generate_index(x_index + 1, y_index + 0, z_index + 1)], self._surface.mls_points[generate_index(x_index + 1, y_index + 0, z_index + 0)], self._surface.mls_points[generate_index(x_index + 0, y_index + 0, z_index + 0)], self._surface.mls_points[generate_index(x_index + 0, y_index + 1, z_index + 1)], self._surface.mls_points[generate_index(x_index + 1, y_index + 1, z_index + 1)], self._surface.mls_points[generate_index(x_index + 1, y_index + 1, z_index + 0)], self._surface.mls_points[generate_index(x_index + 0, y_index + 1, z_index + 0)], ] values = [ self._surface.mls_distances[generate_index(x_index + 0, y_index + 0, z_index + 1)], self._surface.mls_distances[generate_index(x_index + 1, y_index + 0, z_index + 1)], self._surface.mls_distances[generate_index(x_index + 1, y_index + 0, z_index + 0)], self._surface.mls_distances[generate_index(x_index + 0, y_index + 0, z_index + 0)], self._surface.mls_distances[generate_index(x_index + 0, y_index + 1, z_index + 1)], self._surface.mls_distances[generate_index(x_index + 1, y_index + 1, z_index + 1)], self._surface.mls_distances[generate_index(x_index + 1, y_index + 1, z_index + 0)], self._surface.mls_distances[generate_index(x_index + 0, y_index + 1, z_index + 0)], ] #values = map(lambda offsets: self._surface.mls_distances[generate_index(array([x_index, y_index, z_index]) + offsets)], numbering_scheme) cubeindex = self._get_cubeindex(values) for n in range(12): if self.edge_table[cubeindex] & (2**n): t_v, t_n = self._interpolate(points[vertmap[n][0]], points[vertmap[n][1]], values[vertmap[n][0]], values[vertmap[n][1]]) vertices[n] = t_v vertex_normals[n] = t_n/norm(t_n) else: vertices[n] = 0 vertex_normals[n] = 0 triangles = [] i = 0 while self.triangle_table[cubeindex][i] != -1: triangles.append([self.triangle_table[cubeindex][i], self.triangle_table[cubeindex][i+1], self.triangle_table[cubeindex][i+2]]) i += 3 for triangle in triangles: vertex.addData3f(*vertices[triangle[0]]) vertex.addData3f(*vertices[triangle[1]]) vertex.addData3f(*vertices[triangle[2]]) normal.addData3f(*vertex_normals[triangle[0]]) normal.addData3f(*vertex_normals[triangle[1]]) normal.addData3f(*vertex_normals[triangle[2]]) #color.addData4f(self._color[0], self._color[1], self._color[2], self._color[3]) #color.addData4f(self._color[0], self._color[1], self._color[2], self._color[3]) #color.addData4f(self._color[0], self._color[1], self._color[2], self._color[3]) color.addData4f(*self._color) color.addData4f(*self._color) color.addData4f(*self._color) tri.addNextVertices(3) self._vdata = vdata tri.closePrimitive() self._geom_primitives = [tri, ]
def __init__(self, inner, outer, sectors): super(RingNode, self).__init__('ring') self.inner = inner self.outer = outer self.sectors = sectors ringgeo = RawGeometry() # inner and outer radii are the true circular limits, so expand a little bit # for the sectored mesh mesh_inner = self.inner * 0.9 mesh_outer = self.outer * 1.1 angular_width = 2.0 * math.pi / self.sectors for sector in range(self.sectors): start = sector * angular_width end = (sector + 1) * angular_width # add a quad x0 = math.sin(start) * mesh_inner x1 = math.sin(start) * mesh_outer x2 = math.sin(end) * mesh_inner x3 = math.sin(end) * mesh_outer z0 = math.cos(start) * mesh_inner z1 = math.cos(start) * mesh_outer z2 = math.cos(end) * mesh_inner z3 = math.cos(end) * mesh_outer index = len(ringgeo.verts) ringgeo.verts.append((x0, 0, z0)) ringgeo.verts.append((x1, 0, z1)) ringgeo.verts.append((x2, 0, z2)) ringgeo.verts.append((x3, 0, z3)) # double-side the faces so they render from either side # top pair... ringgeo.faces.append((index + 0, index + 1, index + 2)) ringgeo.faces.append((index + 1, index + 3, index + 2)) # bottom pair... ringgeo.faces.append((index + 0, index + 2, index + 1)) ringgeo.faces.append((index + 1, index + 2, index + 3)) format = GeomVertexFormat.getV3n3() vdata = GeomVertexData('ring', format, Geom.UHDynamic) vertex = GeomVertexWriter(vdata, 'vertex') normal = GeomVertexWriter(vdata, 'normal') for (x, y, z) in ringgeo.verts: vertex.addData3f(x, y, z) normal.addData3f(0, 1, 0) trilist = GeomTriangles(Geom.UHDynamic) for (a, b, c) in ringgeo.faces: trilist.addVertex(a) trilist.addVertex(b) trilist.addVertex(c) trilist.closePrimitive() ring = Geom(vdata) ring.addPrimitive(trilist) self.addGeom(ring)
def _create_geom_primitives(self): """Creates and fill a GeomTriangles with vertex indices.""" tri = GeomTriangles(Geom.UHDynamic) for x in xrange(self._width-1): for y in xrange(self._height-1): cur_index = x * self._height + y tri.addVertex(cur_index) tri.addVertex(cur_index+1) tri.addVertex(cur_index+self._height) tri.addVertex(cur_index+1) tri.addVertex(cur_index+self._height) tri.addVertex(cur_index+self._height+1) tri.closePrimitive() self._geom_primitives = [tri, ]
def create_table_geom(): format = GeomVertexFormat.getV3n3c4t2() # GeomVertexData. vdata = GeomVertexData('table_vertex', format, Geom.UHStatic) vertex = GeomVertexWriter(vdata, 'vertex') normal = GeomVertexWriter(vdata, 'normal') color = GeomVertexWriter(vdata, 'color') texcoord = GeomVertexWriter(vdata, 'texcoord') vertex.addData3f(xmax, ymin, 0) normal.addData3f(0, 0, 1) color.addData4f(0, 0, 1, 1) texcoord.addData2f(1, 0) vertex.addData3f(xmax, ymax, 0) normal.addData3f(0, 0, 1) color.addData4f(0, 0, 1, 1) texcoord.addData2f(1, 1) vertex.addData3f(xmin, ymax, 0) normal.addData3f(0, 0, 1) color.addData4f(0, 0, 1, 1) texcoord.addData2f(0, 1) vertex.addData3f(xmin, ymin, 0) normal.addData3f(0, 0, 1) color.addData4f(0, 0, 1, 1) texcoord.addData2f(0, 0) prim = GeomTriangles(Geom.UHStatic) prim.addVertex(0) prim.addVertex(1) prim.addVertex(2) prim.closePrimitive() prim.addVertex(0) prim.addVertex(2) prim.addVertex(3) prim.closePrimitive() geom = Geom(vdata) geom.addPrimitive(prim) return geom
def draw(self): format = GeomVertexFormat.getV3n3cpt2() vdata = GeomVertexData('square', format, Geom.UHStatic) vertex = GeomVertexWriter(vdata, 'vertex') normal = GeomVertexWriter(vdata, 'normal') color = GeomVertexWriter(vdata, 'color') texcoord = GeomVertexWriter(vdata, 'texcoord') #make sure we draw the sqaure in the right plane #if x1!=x2: vertex.addData3f(self.x1, self.y1, self.z1) vertex.addData3f(self.x2, self.y1, self.z1) vertex.addData3f(self.x2, self.y2, self.z2) vertex.addData3f(self.x1, self.y2, self.z2) normal.addData3f( Vec3(2 * self.x1 - 1, 2 * self.y1 - 1, 2 * self.z1 - 1).normalize()) normal.addData3f( Vec3(2 * self.x2 - 1, 2 * self.y1 - 1, 2 * self.z1 - 1).normalize()) normal.addData3f( Vec3(2 * self.x2 - 1, 2 * self.y2 - 1, 2 * self.z2 - 1).normalize()) normal.addData3f( Vec3(2 * self.x1 - 1, 2 * self.y2 - 1, 2 * self.z2 - 1).normalize()) #adding different colors to the vertex for visibility color.addData4f(self.r, self.g, self.b, self.a) color.addData4f(self.r, self.g, self.b, self.a) color.addData4f(self.r, self.g, self.b, self.a) color.addData4f(self.r, self.g, self.b, self.a) texcoord.addData2f(0.0, 1.0) texcoord.addData2f(0.0, 0.0) texcoord.addData2f(1.0, 0.0) texcoord.addData2f(1.0, 1.0) #quads arent directly supported by the Geom interface #you might be interested in the CardMaker class if you are #interested in rectangle though tri1 = GeomTriangles(Geom.UHStatic) tri2 = GeomTriangles(Geom.UHStatic) tri1.addVertex(0) tri1.addVertex(1) tri1.addVertex(3) tri2.addConsecutiveVertices(1, 3) tri1.closePrimitive() tri2.closePrimitive() square = Geom(vdata) square.addPrimitive(tri1) square.addPrimitive(tri2) #square.setIntoCollideMask(BitMask32.bit(1)) self.squareNP = NodePath(GeomNode('square gnode')) self.squareNP.node().addGeom(square) self.squareNP.setTransparency(1) self.squareNP.setAlphaScale(.5) self.squareNP.setTwoSided(True) #squareNP.setCollideMask(BitMask32.bit(1)) self.squareNP.reparentTo(self.parent) return self.squareNP
def make_base(self, a, b): # get data data = self.subdata[a][b] # set vertex data vdata = GeomVertexData('plane', GeomVertexFormat.getV3n3c4t2(), Geom.UHStatic) vertex = GeomVertexWriter(vdata, 'vertex') normal = GeomVertexWriter(vdata, 'normal') color = GeomVertexWriter(vdata, 'color') uv = GeomVertexWriter(vdata, 'texcoord') # set vertices number = 0 for x in range(0, len(data) - 1): for y in range(0, len(data[x]) - 1): # get vertex data v1 = Vec3(x, y, data[x][y]['h']) v2 = Vec3(x + 1, y, data[x+1][y]['h']) v3 = Vec3(x + 1, y + 1, data[x+1][y+1]['h']) v4 = Vec3(x, y + 1, data[x][y+1]['h']) n = (0, 0, 1) # normal # assign vertex colors + alpha option = 1 # black if option == 1: c = 0 c1 = [c, c, c, 1] c2 = [c, c, c, 1] c3 = [c, c, c, 1] c4 = [c, c, c, 1] # option2: color vertices if option == 2: alpha = 1.0 c1 = [data[x][y]['c'][0], data[x][y]['c'][1], data[x][y]['c'][2], alpha] c2 = [data[x+1][y]['c'][0], data[x+1][y]['c'][1], data[x+1][y]['c'][2], alpha] c3 = [data[x+1][y+1]['c'][0], data[x+1][y+1]['c'][1], data[x+1][y+1]['c'][2], alpha] c4 = [data[x][y+1]['c'][0], data[x][y+1]['c'][1], data[x][y+1]['c'][2], alpha] if option == 3: c1 = self.color_vertex(v1) c2 = self.color_vertex(v2) c3 = self.color_vertex(v3) c4 = self.color_vertex(v4) vertex.addData3f(v1) normal.addData3f(*n) color.addData4f(*c1) uv.addData2f(0,0) vertex.addData3f(v2) normal.addData3f(*n) color.addData4f(*c2) uv.addData2f(1,0) vertex.addData3f(v3) normal.addData3f(*n) color.addData4f(*c3) uv.addData2f(1,1) vertex.addData3f(v1) normal.addData3f(*n) color.addData4f(*c1) uv.addData2f(0,0) vertex.addData3f(v3) normal.addData3f(*n) color.addData4f(*c3) uv.addData2f(1,1) vertex.addData3f(v4) normal.addData3f(*n) color.addData4f(*c4) uv.addData2f(0,1) # # add vertex h # vertex.addData3f(v1) # # normal.addData3f(*n) # vertex.addData3f(v2) # # normal.addData3f(*n) # vertex.addData3f(v3) # # normal.addData3f(*n) # vertex.addData3f(v1) # # normal.addData3f(*n) # vertex.addData3f(v3) # # normal.addData3f(*n) # vertex.addData3f(v4) # # normal.addData3f(*n) # # add vertex color # color.addData4f(*c1) # color.addData4f(*c2) # color.addData4f(*c3) # color.addData4f(*c1) # color.addData4f(*c3) # color.addData4f(*c4) # iterate number = number + 2 # add triangles prim = GeomTriangles(Geom.UHStatic) for n in range(number): prim.addVertices((n * 3) + 2, (n * 3) + 0, (n * 3) + 1) prim.closePrimitive() # make geom geom = Geom(vdata) geom.addPrimitive(prim) # make geom node node = GeomNode("base" + "_" + str(a) + "_" + str(b)) node.addGeom(geom) # make mesh nodePath mesh = NodePath(node) # set render order mesh.setBin("", 1) # locate mesh mesh.setPos(self.divsep * (a * int(len(self.data[a]) / self.div)), self.divsep * (b * int(len(self.data[b]) / self.div)), 0) # reparent mesh mesh.reparentTo(self.root) # return mesh return mesh
def make_layer(self, i, a, b): # get data data = self.subdata[a][b] # set color + alpha of vertex texture def ap(n): alpha = 0 if i == n: alpha = 1.0 return alpha def tp(n): list = [0, 0, 0, 0] if i == n: list = [1, 1, 1, 0.75] return list # set vertex data vdata = GeomVertexData('plane', GeomVertexFormat.getV3n3c4t2(), Geom.UHStatic) vertex = GeomVertexWriter(vdata, 'vertex') normal = GeomVertexWriter(vdata, 'normal') color = GeomVertexWriter(vdata, 'color') uv = GeomVertexWriter(vdata, 'texcoord') # set vertices number = 0 for x in range(0, len(data) - 1): for y in range(0, len(data[x]) - 1): # get vertex data v1 = Vec3(x, y, data[x][y]['h']) c1 = data[x][y]['c'] t1 = data[x][y]['texnum'] v2 = Vec3(x+1, y, data[x+1][y]['h']) c2 = data[x+1][y]['c'] t2 = data[x+1][y]['texnum'] v3 = Vec3(x+1, y+1, data[x+1][y+1]['h']) c3 = data[x+1][y+1]['c'] t3 = data[x+1][y+1]['texnum'] v4 = Vec3(x, y+1, data[x][y+1]['h']) c4 = data[x][y+1]['c'] t4 = data[x][y+1]['texnum'] n=(0, 0, 1) # normal # assign vertex colors + alpha a1, a2, a3, a4 = ap(t1), ap(t2), ap(t3), ap(t4) t1, t2, t3, t4 = tp(t1), tp(t2), tp(t3), tp(t4) if v1[2]==0: t1 = [data[x][y]['c'][0], data[x][y]['c'][1], data[x][y]['c'][2], a1] if v2[2]==0: t2 = [data[x+1][y]['c'][0], data[x+1][y]['c'][1], data[x+1][y]['c'][2], a2] if v3[2]==0: t3 = [data[x+1][y+1]['c'][0], data[x+1][y+1]['c'][1], data[x+1][y+1]['c'][2], a3] if v4[2]==0: t4 = [data[x][y+1]['c'][0], data[x][y+1]['c'][1], data[x][y+1]['c'][2], a4] if a1 == 0 and a2 == 0 and a3 == 0 and a4 == 0: continue # add vertices vertex.addData3f(v1) normal.addData3f(*n) color.addData4f(*t1) uv.addData2f(0,0) vertex.addData3f(v2) normal.addData3f(*n) color.addData4f(*t2) uv.addData2f(1,0) vertex.addData3f(v3) normal.addData3f(*n) color.addData4f(*t3) uv.addData2f(1,1) vertex.addData3f(v1) normal.addData3f(*n) color.addData4f(*t1) uv.addData2f(0,0) vertex.addData3f(v3) normal.addData3f(*n) color.addData4f(*t3) uv.addData2f(1,1) vertex.addData3f(v4) normal.addData3f(*n) color.addData4f(*t4) uv.addData2f(0,1) number = number + 2 # add triangles prim = GeomTriangles(Geom.UHStatic) for n in range(number): prim.addVertices((n * 3) + 2, (n * 3) + 0, (n * 3) + 1) prim.closePrimitive() # make geom geom = Geom(vdata) geom.addPrimitive(prim) # make geom node node = GeomNode("layer" + str(i) + "_" + str(a) + "_" + str(b)) node.addGeom(geom) # make mesh nodePath mesh = NodePath(node) # load and assign texture txfile = self.tiles[i]['tex'] tx = base.loader.loadTexture(txfile) tx.setMinfilter(Texture.FTLinearMipmapLinear) mesh.setDepthTest(DepthTestAttrib.MLessEqual) mesh.setDepthWrite(False) mesh.setTransparency(True) mesh.setTexture(tx) # set render order mesh.setBin("", 1) # locate mesh mesh.setPos(self.divsep * (a * int(len(self.data[a]) / self.div)), self.divsep * (b * int(len(self.data[b]) / self.div)), 0.001) # reparent mesh mesh.reparentTo(self.root) # return mesh return mesh
def __init__(self,inner,outer,sectors): super(RingNode,self).__init__('ring') self.inner = inner self.outer = outer self.sectors = sectors ringgeo = RawGeometry() # inner and outer radii are the true circular limits, so expand a little bit # for the sectored mesh mesh_inner = self.inner * 0.9 mesh_outer = self.outer * 1.1 angular_width = 2.0 * math.pi / self.sectors for sector in range( self.sectors ): start = sector * angular_width end = (sector+1) * angular_width # add a quad x0 = math.sin(start) * mesh_inner x1 = math.sin(start) * mesh_outer x2 = math.sin(end ) * mesh_inner x3 = math.sin(end ) * mesh_outer z0 = math.cos(start) * mesh_inner z1 = math.cos(start) * mesh_outer z2 = math.cos(end ) * mesh_inner z3 = math.cos(end ) * mesh_outer index = len(ringgeo.verts) ringgeo.verts.append( (x0, 0, z0) ) ringgeo.verts.append( (x1, 0, z1) ) ringgeo.verts.append( (x2, 0, z2) ) ringgeo.verts.append( (x3, 0, z3) ) # double-side the faces so they render from either side # top pair... ringgeo.faces.append( (index+0,index+1,index+2) ) ringgeo.faces.append( (index+1,index+3,index+2) ) # bottom pair... ringgeo.faces.append( (index+0,index+2,index+1) ) ringgeo.faces.append( (index+1,index+2,index+3) ) format=GeomVertexFormat.getV3n3() vdata=GeomVertexData('ring', format, Geom.UHDynamic) vertex=GeomVertexWriter(vdata, 'vertex') normal=GeomVertexWriter(vdata, 'normal') for (x,y,z) in ringgeo.verts: vertex.addData3f( x, y, z ) normal.addData3f( 0, 1, 0 ) trilist=GeomTriangles(Geom.UHDynamic) for (a,b,c) in ringgeo.faces: trilist.addVertex(a) trilist.addVertex(b) trilist.addVertex(c) trilist.closePrimitive() ring = Geom(vdata) ring.addPrimitive( trilist ) self.addGeom( ring )
def addGeometry(self, geomData): debugGui = dict() format = GeomVertexFormat.getV3n3t2() vdata = GeomVertexData('name', format, Geom.UHStatic) vertex = GeomVertexWriter(vdata, 'vertex') normal = GeomVertexWriter(vdata, 'normal') texcoord = GeomVertexWriter(vdata, 'texcoord') prim = GeomTriangles(Geom.UHStatic) postphonedTriangles = list() vtxTargetId0 = vtxTargetId1 = vtxTargetId2 = None vtxDataCounter = 0 for vtxSourceId0, vtxSourceId1, vtxSourceId2 in geomData.triangles: vx0,vy0,vz0 = v0 = geomData.getVertex(vtxSourceId0) vx1,vy1,vz1 = v1 = geomData.getVertex(vtxSourceId1) vx2,vy2,vz2 = v2 = geomData.getVertex(vtxSourceId2) # prepare the vertices uvx0, uvy0 = uv0 = geomData.getUv(vtxSourceId0) uvx1, uvy1 = uv1 = geomData.getUv(vtxSourceId1) uvx2, uvy2 = uv2 = geomData.getUv(vtxSourceId2) # n0 = geomData.getNormal(vtxSourceId0) n1 = geomData.getNormal(vtxSourceId1) n2 = geomData.getNormal(vtxSourceId2) # make it wrap nicely if min(uvx0,uvx1,uvx2) < .25 and max(uvx0,uvx1,uvx2) > 0.75: if uvx0 < 0.25: uvx0 += 1.0 if uvx1 < 0.25: uvx1 += 1.0 if uvx2 < 0.25: uvx2 += 1.0 vertex.addData3f(*v0) normal.addData3f(*n0) texcoord.addData2f(*uv0) vtxTargetId0 = vtxDataCounter vtxDataCounter += 1 vertex.addData3f(*v1) normal.addData3f(*n1) texcoord.addData2f(*uv1) vtxTargetId1 = vtxDataCounter vtxDataCounter += 1 vertex.addData3f(*v2) normal.addData3f(*n2) texcoord.addData2f(*uv2) vtxTargetId2 = vtxDataCounter vtxDataCounter += 1 prim.addVertex(vtxTargetId0) prim.addVertex(vtxTargetId1) prim.addVertex(vtxTargetId2) prim.closePrimitive() if False: if vtxSourceId0 not in debugGui: i = InfoTextBillaboarded(render) i.setScale(0.05) i.billboardNodePath.setPos(Vec3(x0,y0,z0)*1.1) i.setText('%i: %.1f %.1f %.1f\n%.1f %.1f' % (vtxSourceId0, x0,y0,z0, nx0, ny0)) debugGui[vtxSourceId0] = i if vtxSourceId1 not in debugGui: i = InfoTextBillaboarded(render) i.setScale(0.05) i.billboardNodePath.setPos(Vec3(x1,y1,z1)*1.1) i.setText('%i: %.1f %.1f %.1f\n%.1f %.1f' % (vtxSourceId1, x1,y1,z1, nx1, ny1)) debugGui[vtxSourceId1] = i if vtxSourceId2 not in debugGui: i = InfoTextBillaboarded(render) i.setScale(0.05) i.billboardNodePath.setPos(Vec3(x2,y2,z2)*1.1) i.setText('%i: %.1f %.1f %.1f\n%.1f %.1f' % (vtxSourceId2, x2,y2,z2, nx2, ny2)) debugGui[vtxSourceId2] = i geom = Geom(vdata) geom.addPrimitive(prim) node = GeomNode('gnode') node.addGeom(geom) nodePath = self.attachNewNode(node) return nodePath
def draw(self): format = GeomVertexFormat.getV3n3cpt2() vdata = GeomVertexData('square', format, Geom.UHDynamic) vertex = GeomVertexWriter(vdata, 'vertex') normal = GeomVertexWriter(vdata, 'normal') color = GeomVertexWriter(vdata, 'color') circle = Geom(vdata) # Create vertices vertex.addData3f(self.pos) color.addData4f(self.color) for v in range(self._EDGES): x = self.pos.getX() + (self.size * math.cos( (2 * math.pi / self._EDGES) * v)) y = self.pos.getY() + (self.size * math.sin( (2 * math.pi / self._EDGES) * v)) z = self.pos.getZ() vertex.addData3f(x, y, z) color.addData4f(self.color) # Create triangles for t in range(self._EDGES): tri = GeomTriangles(Geom.UHDynamic) tri.addVertex(0) tri.addVertex(t + 1) if (t + 2) > self._EDGES: tri.addVertex(1) else: tri.addVertex(t + 2) tri.closePrimitive() circle.addPrimitive(tri) gn = GeomNode('Circle') gn.addGeom(circle) np = NodePath(gn) np.setHpr(0, 90, 0) return np