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 __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 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 __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 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