示例#1
0
 def getInputList(self):
     """Gets a :class:`collada.source.InputList` representing the inputs from a primitive"""
     inpl = InputList()
     for (key, tupes) in self.sources.iteritems():
         for (offset, semantic, source, set, srcobj) in tupes:
             inpl.addInput(offset, semantic, source, set)
     return inpl
示例#2
0
def geometry_node_from_segments(collada, vertices, edges, color, name,
                                description):
    vg.shape.check(locals(), "vertices", (-1, 3))
    vg.shape.check(locals(), "edges", (-1, 2))

    vertex_source_name = f"{name}_verts"
    vertex_source = FloatSource(vertex_source_name, vertices, ("X", "Y", "Z"))
    geometry = Geometry(collada, name, description, [vertex_source])
    input_list = InputList()
    input_list.addInput(0, "VERTEX", f"#{vertex_source_name}")

    material_name = f"{name}_material"
    lineset = geometry.createLineSet(edges.ravel(), input_list, material_name)

    geometry.primitives.append(lineset)
    collada.geometries.append(geometry)

    return GeometryNode(
        geometry, [create_material(collada, name=material_name, color=color)])
示例#3
0
def geometry_node_from_mesh(collada, mesh, name):
    vertex_source_name = f"{name}_verts"
    geometry = Geometry(
        collada,
        name or "geometry0",
        str(mesh),
        [FloatSource(vertex_source_name, mesh.v.ravel(), ("X", "Y", "Z"))],
    )
    input_list = InputList()
    input_list.addInput(0, "VERTEX", f"#{vertex_source_name}")

    material_name = f"{name}_material"
    triset = geometry.createTriangleSet(mesh.f.ravel(), input_list,
                                        material_name)

    geometry.primitives.append(triset)
    collada.geometries.append(geometry)

    return GeometryNode(geometry,
                        [create_material(collada, name=material_name)])
示例#4
0
        def encode_mesh(b_mesh, b_mesh_name, b_material_slots):
            def is_trimesh(faces):
                return all([len(f.verts) == 3 for f in faces])

            #end is_trimesh

        #begin encode_mesh
            mesh_name = DATABLOCK.MESH.nameid(b_mesh_name)
            sources = []
            vert_srcid = self.next_internal_id()
            sources.append \
              (
                FloatSource
                  (
                    id = vert_srcid,
                    data = np.array([c for v in b_mesh.verts for c in v.co]),
                    components = ("X", "Y", "Z")
                  )
              )
            vnorm_srcid = self.next_internal_id()
            sources.append \
              (
                FloatSource
                  (
                    id = vnorm_srcid,
                    data = np.array([c for v in b_mesh.verts for c in v.normal]),
                    components = ("X", "Y", "Z")
                  )
              ) # todo: face normal might be different for flat shading
            uv_ids = []
            if b_mesh.loops.layers.uv.active != None:
                active_uv_name = b_mesh.loops.layers.uv.active.name
            else:
                active_uv_name = None
            #end if
            for i, (b_uvname,
                    uvlayer) in enumerate(b_mesh.loops.layers.uv.items()):
                uv_name = self.next_internal_id()
                uv_ids.append((uv_name, b_uvname))
                sources.append \
                  (
                    FloatSource
                      (
                        id = uv_name,
                        data = np.array
                          (
                            [
                                x
                                for f in b_mesh.faces
                                for l in f.loops
                                for x in l[uvlayer].uv
                            ]
                          ),
                        components = ("S", "T")
                      )
                  )
            #end for
            geom = Geometry(self._collada, mesh_name, mesh_name, sources)
            blendstuff = self.blender_technique(True, geom)
            if blendstuff != None:
                names = E.layer_names()
                for u in uv_ids:
                    names.append(E.name(name=u[1], refid=u[0], type="UV"))
                #end for
                blendstuff.append(names)
            #end if

            for slotindex in range(max(len(b_material_slots), 1)):
                slotname = make_slotname(slotindex)
                assigned = \
                    [
                        f
                        for f in b_mesh.faces
                        if f.material_index == slotindex
                    ]
                if any(assigned):
                    ilist = InputList()
                    ilist.addInput(0, "VERTEX", idurl(vert_srcid))
                    ilist.addInput(0, "NORMAL", idurl(vnorm_srcid))
                    setnr = 0
                    for u in uv_ids:
                        setnr += 1
                        ilist.addInput(1, "TEXCOORD", idurl(u[0]),
                                       (setnr, 0)[u[1] == active_uv_name])
                        # always assign set 0 to active UV layer
                    #end for
                    indices = []
                    for face in b_mesh.faces:
                        for face_loop in face.loops:
                            this_face = [face_loop.vert.index, face_loop.index]
                            indices.extend(this_face)
                        #end for
                    #end for
                    indices = np.array(indices)
                    if is_trimesh(assigned):
                        p = geom.createTriangleSet(indices, ilist, slotname)
                    else:
                        vcounts = [len(f.verts) for f in assigned]
                        p = geom.createPolylist(indices, vcounts, ilist,
                                                slotname)
                    #end if
                    geom.primitives.append(p)
                #end if
            #end for

            self._collada.geometries.append(geom)
            return geom