Esempio n. 1
0
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
Esempio n. 2
0
    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
Esempio n. 3
0
    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)
Esempio n. 4
0
    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
Esempio n. 5
0
    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) )
Esempio n. 6
0
    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)
Esempio n. 7
0
 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)
Esempio n. 8
0
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
Esempio n. 9
0
    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)
Esempio n. 10
0
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
Esempio n. 11
0
def makePoly(g, vlist):
  poly = EggPolygon()
  for v in vlist:
    poly.addVertex(v)
  g.addChild(poly)
Esempio n. 12
0
def makePoly(g, vlist):
    poly = EggPolygon()
    for v in vlist:
        poly.addVertex(v)
    g.addChild(poly)