def make_fov(sweep=90, steps=16, scale=100): z = 1 + random.uniform(-0.01, 0.01) data = EggData() vp = EggVertexPool('fan') data.addChild(vp) poly = EggPolygon() data.addChild(poly) v = EggVertex() v.setPos(Point3D(0, 0, z)) poly.addVertex(vp.addVertex(v)) rads = deg2Rad(sweep) for i in range(steps + 1): a = rads * i / steps y = math.sin(a) x = math.cos(a) v = EggVertex() v.setPos(Point3D(x*scale, y*scale, z)) poly.addVertex(vp.addVertex(v)) node = loadEggData(data) np = NodePath(node) np.setH(sweep/2) return np
def createGizmo(self, angleDegrees=360, numSteps=16, axis=0, scale=10): data = EggData() vp = EggVertexPool('fan') data.addChild(vp) poly = EggPolygon() data.addChild(poly) v = EggVertex() v.setPos(Point3D(0, 0, 0)) poly.addVertex(vp.addVertex(v)) angleRadians = deg2Rad(angleDegrees) for i in range(numSteps + 1): a = angleRadians * i / numSteps y = math.sin(a) * scale x = math.cos(a) * scale v = EggVertex() if axis is 0: v.setPos(Point3D(x, 0, y)) elif axis is 1: v.setPos(Point3D(x, y, 0)) else: v.setPos(Point3D(0, x, y)) poly.addVertex(vp.addVertex(v)) node = loadEggData(data) return NodePath(node)
def DisplacementUVSphere(radius, heightmap, scale, rings=5, sectors=5, inv_texture_u=False, inv_texture_v=True): data = EggData() pool = EggVertexPool('pool') vertices = [] data.addChild(pool) R = 1. / (rings) S = 1. / (sectors) for r in range(0, rings + 1): for s in range(0, sectors + 1): cos_s = cos(2 * pi * s * S + pi) sin_s = sin(2 * pi * s * S + pi) sin_r = sin(pi * r * R) cos_r = cos(pi * r * R) x = cos_s * sin_r y = sin_s * sin_r z = cos_r vertex = EggVertex() u = s * S v = r * R height = radius + heightmap.get_height_uv(u, v) * scale vertex.setPos(LPoint3d(x * height, y * height, z * height)) if inv_texture_v: v = 1.0 - v if inv_texture_u: u = 1.0 - u vertex.setUv(LPoint2d(u, v)) pool.addVertex(vertex) vertices.append(vertex) index = 0 for r in range(0, rings): for s in range(0, sectors): poly = EggPolygon() data.addChild(poly) poly.addVertex(vertices[index + sectors + 1]) poly.addVertex(vertices[index]) poly.addVertex(vertices[index + sectors]) poly = EggPolygon() data.addChild(poly) poly.addVertex(vertices[index + sectors + 1]) poly.addVertex(vertices[index + 1]) poly.addVertex(vertices[index]) index += 1 data.removeUnusedVertices(True) data.recomputeVertexNormals(45) data.recomputeTangentBinormal(GlobPattern("")) node = loadEggData(data) path = NodePath(node) path.flattenStrong() return path
def createCuttingPlanes(self): self.planes = self.render.attachNewNode("planes") pl = self.planes.attachNewNode("pl") data = EggData() self.planedata = [] vp = EggVertexPool('plane') data.addChild(vp) fac = 1.0 expanse = 10.0 rng = 4 for i in range(-rng, rng): poly = EggPolygon() data.addChild(poly) self.planedata.append(i * fac) v = EggVertex() v.setPos(Point3D(i * fac, -expanse, -expanse)) poly.addVertex(vp.addVertex(v)) v = EggVertex() v.setPos(Point3D(i * fac, -expanse, +expanse)) poly.addVertex(vp.addVertex(v)) v = EggVertex() v.setPos(Point3D(i * fac, +expanse, +expanse)) poly.addVertex(vp.addVertex(v)) v = EggVertex() v.setPos(Point3D(i * fac, +expanse, -expanse)) poly.addVertex(vp.addVertex(v)) node = loadEggData(data) np = NodePath(node) np.reparentTo(pl) np.setColor(0, 1, 0, 1) np.setTwoSided(True) np.setTransparency(TransparencyAttrib.MAlpha) np.setAlphaScale(0.1) np.setCollideMask(BitMask32(0x0)) return self.planes
class createNurbsCurve(): def __init__(self): self.data = EggData() self.vtxPool = EggVertexPool('mopath') self.data.addChild(self.vtxPool) self.eggGroup = EggGroup('group') self.data.addChild(self.eggGroup) self.myverts = [] def addPoint(self, pos): eggVtx = EggVertex() eggVtx.setPos(Point3D(pos[0], pos[1], pos[2])) self.myverts.append(eggVtx) self.vtxPool.addVertex(eggVtx) def getNodepath(self): myCurve = EggNurbsCurve() myCurve.setup(3, len(self.myverts) + 3) myCurve.setCurveType(1) for i in self.myverts: myCurve.addVertex(i) self.eggGroup.addChild(myCurve) return NodePath(loadEggData(self.data))
def make_circle(self, num_steps): data = EggData() vertex_pool = EggVertexPool('fan') data.addChild(vertex_pool) poly = EggPolygon() data.addChild(poly) for i in range(num_steps + 1): angle = 2 * math.pi * i / num_steps y = math.sin(angle) * config.minimap.size / 2 x = math.cos(angle) * config.minimap.size / 2 vertex = EggVertex() vertex.setPos(Point3D(x, 0, y)) poly.addVertex(vertex_pool.addVertex(vertex)) node = loadEggData(data) return node
class STL2EGG(): def __init__(self, in_file, out_file): #New container for data: self.data = EggData() #New Container for vertex: self.vertexPool = EggVertexPool('model') #Adding vertexPool to the main data container: self.data.addChild(self.vertexPool) self.load(in_file) self.data.setCoordinateSystem(CSZupRight) self.data.writeEgg(out_file) def load(self, filename): f = open(filename, 'r') header = f.read(6) isASCII = ( header== 'solid ') if isASCII: self.name = f.readline() self.parseASCII(f) else: f.close f = open(filename, 'rb') self.parseBin(f) def getName(self): return self.name def readVecteur(self, data): v = EggVertex() x,y,z = struct.unpack('fff', data) v.setPos(Point3D(x,y,z)) return v def parseBin(self, f): print "Parsing Bin File" Header = f.read(80) Nb_Face = struct.unpack('i', f.read(4))[0] print "Nombre de face : %i" % (Nb_Face) for i in range(0,Nb_Face): self.poly = EggPolygon() self.data.addChild(self.poly) # Normal struct normal = self.readVecteur(f.read(12)) u = self.readVecteur(f.read(12)) v = self.readVecteur(f.read(12)) w = self.readVecteur(f.read(12)) attrib = struct.unpack('H' , f.read(2))[0] # Attributes #Adding Vertex to Triangle self.poly.addVertex(self.vertexPool.addVertex(u)) self.poly.addVertex(self.vertexPool.addVertex(v)) self.poly.addVertex(self.vertexPool.addVertex(w)) self.poly.recomputePolygonNormal() self.poly.setColor( VBase4( 0.0, 0.0, 0.5, 0.5) ) def parseASCII(self,f ): for line in f: line = line.lower().strip() commande = line.split(" ") Nb_Param = len(commande) try: {'facet' : self.facet, 'outer' : self.outer, 'vertex' : self.vertex, 'endloop' : self.endloop, 'endfacet' : self.endfacet}[commande[0]](commande,Nb_Param) except KeyError: pass def facet(self,commande,Nb_Param): if (Nb_Param==5 and commande[1] == "normal"): #We are Ignoring normal --> will be computed later #Creating a new polygon : self.poly = EggPolygon() self.data.addChild(self.poly) def outer(self,commande,Nb_Param): pass def vertex(self,commande,Nb_Param): if (Nb_Param==4): x,y,z = float(commande[1]),float(commande[2]),float(commande[3]) if (self.poly != None): #Creating a new vertex with coords : v = EggVertex() v.setPos(Point3D(x,y,z)) #Adding the new Vertex to the polygon : self.poly.addVertex(self.vertexPool.addVertex(v)) def endloop(self,commande,Nb_Param): #End of the Loop : self.poly.recomputePolygonNormal() #As STL files don't contain colors: self.poly.setColor( VBase4( 0.0, 0.0, 0.5, 0.5) ) def endfacet(self,commande,Nb_Param): pass