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 __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 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 __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 __polylinestoegg(self, egg, objname, groupname): selectedlines = self.__linesby(objname, groupname) if len(selectedlines) == 0: return eobj = EggGroup(objname) egg.addChild(eobj) egrp = EggGroup(groupname) eobj.addChild(egrp) evpool = EggVertexPool(groupname) egrp.addChild(evpool) for line in selectedlines: (vlist, mdata) = line (wobj, wgrp, wmat) = mdata eline = EggLine() egrp.addChild(eline) self.__eggifymats(eline, wmat) self.__eggifyverts(eline, evpool, vlist)
def __facestoegg(self, egg, objname, groupname): selectedfaces = self.__facesby(objname, groupname) if len(selectedfaces) == 0: return eobj = EggGroup(objname) egg.addChild(eobj) egrp = EggGroup(groupname) eobj.addChild(egrp) evpool = EggVertexPool(groupname) egrp.addChild(evpool) for face in selectedfaces: (vlist, mdata) = face (wobj, wgrp, wmat) = mdata epoly = EggPolygon() egrp.addChild(epoly) self.__eggifymats(epoly, wmat) self.__eggifyverts(epoly, evpool, vlist)
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
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
def makeEgg(filename): # Egg data vp = EggVertexPool('sky') data = EggData() data.addChild(vp) data.setCoordinateSystem(1) # CS_zup_right # Vertices vmap = {} for idx, (x, y, z) in enumerate(vertices): vmap[idx] = makeVertex(vp, x, y, z) # Faces for (i1, i2, i3) in indices: v1 = vmap[i1] v2 = vmap[i2] v3 = vmap[i3] makePoly(data, [v1, v2, v3]) # Save data.recomputePolygonNormals() data.writeEgg(Filename(filename))
def make_geom(self, node, obj, can_merge=False): triangulate = not is_collision(obj) if self._geom_scale != 1: obj.scale.x = self._geom_scale obj.scale.y = self._geom_scale obj.scale.z = self._geom_scale apply_modifiers(obj, triangulate=triangulate) mesh = obj2mesh(obj, triangulate=triangulate) # get or create materials and textures egg_materials = {} egg_textures = {} egg_material_textures = {} if not self._no_materials and not is_collision(obj): for material in mesh.materials.values(): # material for child in self._root.get_children(): # existing material if (isinstance(child, EggMaterial) and child.get_name() == material.name): egg_materials[material.name] = child break else: # new material egg_material = self.make_material(material) self._root.add_child(egg_material) egg_materials[material.name] = egg_material # material -> textures if material.name not in egg_material_textures: egg_material_textures[material.name] = {} # textures if not self._no_textures: for type_, _, egg_texture in self.make_textures(material): tname = egg_texture.get_name() for child in self._root.get_children(): # existing texture if (isinstance(child, EggTexture) and child.get_name() == tname): egg_textures[tname] = child egg_material_textures[material.name][tname] = child break else: # new texture self._root.add_child(egg_texture) egg_textures[tname] = egg_texture egg_material_textures[material.name][tname] = egg_texture # get or create vertex pool egg_vertex_pool = None egg_vertex_id = 0 if can_merge: for child in node.get_children(): # existing vertex pool if isinstance(child, EggVertexPool): egg_vertex_pool = child egg_vertex_id = egg_vertex_pool.get_highest_index() break if egg_vertex_pool is None: # new vertex pool egg_vertex_pool = EggVertexPool(node.get_name()) egg_vertex_id = egg_vertex_pool.get_highest_index() node.add_child(egg_vertex_pool) # get armature and joints armature = get_armature(obj) egg_joints = {} if armature: for child in self._root.get_children(): if (isinstance(child, EggGroup) and child.get_dart_type() == EggGroup.DT_structured and child.get_name() == armature.name): egg_joints = self._get_joints(child) sharp_vertices = {} uv_tb = {} if not is_collision(obj): sharp_vertices = self.get_sharp_vertices(mesh) uv_tb = self.get_tangent_bitangent(mesh) egg_vertices = {} obj_matrix = get_object_matrix(obj, armature) parent_obj_matrix = obj_matrix if armature: parent_obj_matrix = get_object_matrix(armature) for polygon in mesh.polygons: # <-- polygon material = None mname = None if not self._no_materials: try: material = mesh.materials[polygon.material_index] mname = material.name except IndexError: pass # make polygon egg_polygon = EggPolygon(mname or node.get_name()) # set material and textures if material and not self._no_materials and not is_collision(obj): if mname in egg_materials: egg_polygon.set_material(egg_materials[mname]) # set textures if mname in egg_material_textures and not self._no_textures: for egg_texture in egg_material_textures[mname].values(): egg_polygon.add_texture(egg_texture) # vertices for i, vertex_id in enumerate(polygon.vertices): # i is vertex counter inside a polygon # (0, 1, 2) for triangle # vertex_id is reusable id, # because multiple polygons can share the same vertices # <-- vertex vertex = mesh.vertices[vertex_id] use_smooth = ( polygon.use_smooth and vertex_id not in sharp_vertices and not is_collision(obj)) # try to reuse shared vertices if (polygon.use_smooth and vertex_id in egg_vertices and not is_collision(obj)): shared = False for egg_vertex in egg_vertices[vertex_id]: loop_id = polygon.loop_indices[i] egg_vertex_uv = egg_vertex.get_uv_obj( self._get_uv_name(mesh.uv_layers.active)) if not egg_vertex_uv: egg_polygon.add_vertex(egg_vertex) shared = True break if self.can_share_vertex(mesh, loop_id, egg_vertex_uv.get_uv()): egg_polygon.add_vertex(egg_vertex) shared = True break if shared: continue # make new vertex data egg_vertex = self.make_vertex( parent_obj_matrix, obj_matrix, polygon, vertex, use_smooth=use_smooth) # uv layers if not is_collision(obj): for uv_name, uv_layer in mesh.uv_layers.items(): # <-- vertex uv loop_id = polygon.loop_indices[i] uv_loop = uv_layer.data[loop_id] # not active layer and extra UV disabled if not uv_layer.active and self._no_extra_uv: continue egg_vertex_uv = self.make_vertex_uv(uv_layer, uv_loop.uv) if uv_name in uv_tb: t, b, s = uv_tb[uv_name][loop_id] tangent = parent_obj_matrix @ t binormal = parent_obj_matrix @ b egg_vertex_uv.set_tangent(tuple(tangent)) egg_vertex_uv.set_binormal(tuple(binormal)) egg_vertex.set_uv_obj(egg_vertex_uv) # vertex uv --> # generate new ID, add vertex and save last ID egg_vertex_id += 1 egg_vertex_pool.add_vertex(egg_vertex, egg_vertex_id) egg_vertex_pool.set_highest_index(egg_vertex_id) egg_polygon.add_vertex(egg_vertex) # save vertex data for sharing if vertex_id not in egg_vertices: egg_vertices[vertex_id] = [] egg_vertices[vertex_id].append(egg_vertex) # attach joints to vertex if armature: for vertex_group in vertex.groups: obj_vertex_group = obj.vertex_groups[vertex_group.group] if obj_vertex_group.name in egg_joints: egg_joint = egg_joints[obj_vertex_group.name] egg_joint.set_vertex_membership( egg_vertex, vertex_group.weight) # vertex --> node.add_child(egg_polygon)