def getGeomData(geom=None): """ returns a dict : data = {"prims":[], "vertices" : [], "normals" : [], "texcoords" : []} with the data found inside the Geom's GeomPrimitive """ if not geom: return None data = {"vertices" : [], "normals" : [], "texcoords" : [], "colors" : [], "tangents":[], "binormals":[], "lines":[], "triangles":[], "tristrips":[], "trifans":[]} #prim = geom.getPrimitive(0) #prims = {} #print "before decompose : prim = %s" % (prim) #prim = prim.decompose() #print "after decompose : prim = %s" % (prim) for gPrim in geom.getPrimitives(): for p in range(gPrim.getNumPrimitives()): s = gPrim.getPrimitiveStart(p) e = gPrim.getPrimitiveEnd(p) vertexList = [] for i in range(s, e): vi = gPrim.getVertex(i) vertexList.append(vi) if type(gPrim) is GeomLinestrips: data["lines"].append(vertexList) elif type(gPrim) is GeomTriangles: data["triangles"].append(vertexList) elif type(gPrim) is GeomTristrips: data["tristrips"].append(vertexList) elif type(gPrim) is GeomTrifans: data["trifans"].append(vertexList) #print "appended primitive number %s, type is %s" % (p, type(gPrim)) vdata = geom.getVertexData() vreader = GeomVertexReader(vdata, 'vertex') nreader = GeomVertexReader(vdata, 'normal') treader = GeomVertexReader(vdata, 'texcoord') creader = GeomVertexReader(vdata, 'color') tanReader = GeomVertexReader(vdata, 'tangent') binReader = GeomVertexReader(vdata, 'binormal') while not vreader.isAtEnd(): v = vreader.getData3f() n = nreader.getData3f() t = treader.getData2f() c = creader.getData4f() tangent = tanReader.getData3f() binormal = binReader.getData3f() data["vertices"].append(v) data["normals"].append(n) data["texcoords"].append(t) data["colors"].append(c) data["tangents"].append(tangent) data["binormals"].append(binormal) return data
def processVertexData(self): vreader = GeomVertexReader(self.vdata, 'vertex') nvreader = GeomVertexReader(self.vdata, 'normal') tvreader = GeomVertexReader(self.vdata, 'texcoord') while not vreader.isAtEnd(): v = vreader.getData3f() n = nvreader.getData3f() t = tvreader.getData2f() self.vertices.append(v) self.normals.append(n) self.texcoords.append(t)
def getGeomData(geomNode, scale=1): """ returns a dict : data = {"prims":[], "vertices" : [], "normals" : [], "texcoords" : []} with the data found inside the GeomNode's Geom's GeomPrimitive """ if not geomNode: return None data = {"prims":[], "vertices" : [], "normals" : [], "texcoords" : []} if geomNode.getNumGeoms()!=1: print "error : num geoms = %s" % (geomNode.getNumGeoms()) return None geom = geomNode.getGeom(0) prim = geom.getPrimitive(0) prims = {} #print "before decompose : prim = %s" % (prim) prim = prim.decompose() #print "after decompose : prim = %s" % (prim) for p in range(prim.getNumPrimitives()): s = prim.getPrimitiveStart(p) e = prim.getPrimitiveEnd(p) vertexList = [] #print "adding vertices from %s to %s" % (s, e) for i in range(s, e): ''' vi = prim.getVertex(i) vreader.setRow(vi) v = vreader.getData3f() v = VBase3(v[0]*scale, v[1]*scale, v[2]*scale) vertexList.append(v) ''' vi = prim.getVertex(i) vertexList.append(vi) prims[p]=vertexList data["prims"].append(vertexList) vdata = geom.getVertexData() vreader = GeomVertexReader(vdata, 'vertex') nvreader = GeomVertexReader(vdata, 'normal') tvreader = GeomVertexReader(vdata, 'texcoord') while not vreader.isAtEnd(): v = vreader.getData3f() n = nvreader.getData3f() t = tvreader.getData2f() data["vertices"].append(v) data["normals"].append(n) data["texcoords"].append(t) return data
def getGeomData(geomNode, scale=1): """ returns a dict : data = {"prims":[], "vertices" : [], "normals" : [], "texcoords" : []} with the data found inside the GeomNode's Geom's GeomPrimitive """ if not geomNode: return None data = {"prims": [], "vertices": [], "normals": [], "texcoords": []} if geomNode.getNumGeoms() != 1: print "error : num geoms = %s" % (geomNode.getNumGeoms()) return None geom = geomNode.getGeom(0) prim = geom.getPrimitive(0) prims = {} #print "before decompose : prim = %s" % (prim) prim = prim.decompose() #print "after decompose : prim = %s" % (prim) for p in range(prim.getNumPrimitives()): s = prim.getPrimitiveStart(p) e = prim.getPrimitiveEnd(p) vertexList = [] #print "adding vertices from %s to %s" % (s, e) for i in range(s, e): ''' vi = prim.getVertex(i) vreader.setRow(vi) v = vreader.getData3f() v = VBase3(v[0]*scale, v[1]*scale, v[2]*scale) vertexList.append(v) ''' vi = prim.getVertex(i) vertexList.append(vi) prims[p] = vertexList data["prims"].append(vertexList) vdata = geom.getVertexData() vreader = GeomVertexReader(vdata, 'vertex') nvreader = GeomVertexReader(vdata, 'normal') tvreader = GeomVertexReader(vdata, 'texcoord') while not vreader.isAtEnd(): v = vreader.getData3f() n = nvreader.getData3f() t = tvreader.getData2f() data["vertices"].append(v) data["normals"].append(n) data["texcoords"].append(t) return data
def uvs(self): vertex_reader = GeomVertexReader(self.vertex_data, 'texcoord') vertices = list() while not vertex_reader.isAtEnd(): vertices.append([e for e in vertex_reader.getData2f()]) return vertices
def processModel(path): scene = loadModel(path) if scene.isEmpty(): print("Error converting `{0}`!".format(path)) return fPath = Filename.fromOsSpecific(path) outputPath = Filename.toOsSpecific( Filename("bam2smd/" + fPath.getDirname() + "/" + fPath.getBasenameWoExtension() + "/")) if not os.path.exists(outputPath): os.makedirs(outputPath) isCharacter = not scene.find("**/+Character").isEmpty() isAnimation = not scene.find("**/+AnimBundleNode").isEmpty() if not isAnimation: if isCharacter: nodes = Skeleton(scene.findAllMatches("**/+Character")) else: nodes = Skeleton(None) names = {} for geomNp in scene.findAllMatches("**/+GeomNode"): smd = "version 1\n" smd += str(nodes) smd += "skeleton\n" smd += "time 0\n" if isCharacter: boneIds = sorted(nodes.bones.keys()) for iBone in range(len(boneIds)): boneId = boneIds[iBone] bone = nodes.bones[boneId] if isinstance(bone, CharacterJoint): boneTform = bone.getTransformState() pos = boneTform.getPos() boneMat = boneTform.getMat().getUpper3() #boneMat.transposeInPlace() rot = mat3NormalizedToEulO(boneMat) else: pos = Vec3() rot = Vec3() smd += boneFrameString(boneId, pos, rot) else: smd += "0 0 0 0 0 0 0\n" smd += "end\n" smd += "triangles\n" for geom in geomNp.node().getGeoms(): geom = geom.decompose() vdata = geom.getVertexData() blendTable = vdata.getTransformBlendTable() for prim in geom.getPrimitives(): numTris = prim.getNumPrimitives() for nTri in range(numTris): start = prim.getPrimitiveStart(nTri) end = prim.getPrimitiveEnd(nTri) smd += "no_material\n" for primVert in range(start, end): vertIdx = prim.getVertex(primVert) reader = GeomVertexReader(vdata) reader.setColumn(InternalName.getVertex()) reader.setRow(vertIdx) pos = reader.getData3f() uv = Vec2(0, 0) if vdata.hasColumn(InternalName.getTexcoord()): reader.setColumn(InternalName.getTexcoord()) reader.setRow(vertIdx) uv = reader.getData2f() norm = Vec3.forward() if vdata.hasColumn(InternalName.getNormal()): reader.setColumn(InternalName.getNormal()) reader.setRow(vertIdx) norm = reader.getData3f() smd += "0 {0:.6f} {1:.6f} {2:.6f} {3:.6f} {4:.6f} {5:.6f} {6:.6f} {7:.6f} ".format( pos[0], pos[1], pos[2], norm[0], norm[1], norm[2], uv[0], uv[1]) if (isCharacter and blendTable and vdata.getNumArrays() > 1 and vdata.getArray(1).hasColumn( InternalName.getTransformBlend())): reader.setColumn( 1, vdata.getArray( 1).getArrayFormat().getColumn( InternalName.getTransformBlend())) reader.setRow(vertIdx) nBlend = reader.getData1i() blend = blendTable.getBlend(nBlend) numTransforms = blend.getNumTransforms() smd += "{0} ".format(numTransforms) for nTransform in range(numTransforms): transform = blend.getTransform(nTransform) if isinstance(transform, JointVertexTransform): boneId = nodes.getBoneId( transform.getJoint()) smd += "{0} {1:.6f} ".format( boneId, blend.getWeight(nTransform)) else: smd += "1 0 1.0" smd += "\n" smd += "end\n" smdFile = geomNp.getName() if len(smdFile) == 0: smdFile = getUnknownName() elif names.get(smdFile, 0) > 0: smdFile = smdFile + "_{0}".format(names[smdFile]) names[smdFile] += 1 else: names[smdFile] = 1 smdFile += ".smd" outFile = open(outputPath + "\\" + smdFile, "w") outFile.write(smd) outFile.flush() outFile.close() else: bundles = scene.findAllMatches("**/+AnimBundleNode") bundle = bundles[0].node().getBundle() nodes = Skeleton(bundles) smd = "version 1\n" smd += str(nodes) smd += "skeleton\n" numFrames = bundle.getNumFrames() boneIds = sorted(nodes.bones.keys()) for iFrame in range(numFrames): smd += "time {0}\n".format(iFrame) for iBone in range(len(boneIds)): bone = nodes.getBone(boneIds[iBone]) if isinstance(bone, AnimChannelACMatrixSwitchType): boneFrameMat = Mat4() bone.getValueNoScaleShear(iFrame, boneFrameMat) boneFrameTransform = TransformState.makeMat(boneFrameMat) pos = boneFrameTransform.getPos() rotMat = boneFrameMat.getUpper3() #rotMat.transposeInPlace() rot = mat3NormalizedToEulO(rotMat) smd += boneFrameString(boneIds[iBone], pos, rot) smd += "end\n" smdFile = fPath.getBasenameWoExtension() + ".smd" outFile = open(outputPath + "\\" + smdFile, "w") outFile.write(smd) outFile.flush() outFile.close()
def getGeomData(geom=None): """ returns a dict : data = {"prims":[], "vertices" : [], "normals" : [], "texcoords" : []} with the data found inside the Geom's GeomPrimitive """ if not geom: return None data = { "vertices": [], "normals": [], "texcoords": [], "colors": [], "tangents": [], "binormals": [], "lines": [], "triangles": [], "tristrips": [], "trifans": [] } #prim = geom.getPrimitive(0) #prims = {} #print "before decompose : prim = %s" % (prim) #prim = prim.decompose() #print "after decompose : prim = %s" % (prim) for gPrim in geom.getPrimitives(): for p in range(gPrim.getNumPrimitives()): s = gPrim.getPrimitiveStart(p) e = gPrim.getPrimitiveEnd(p) vertexList = [] for i in range(s, e): vi = gPrim.getVertex(i) vertexList.append(vi) if type(gPrim) is GeomLinestrips: data["lines"].append(vertexList) elif type(gPrim) is GeomTriangles: data["triangles"].append(vertexList) elif type(gPrim) is GeomTristrips: data["tristrips"].append(vertexList) elif type(gPrim) is GeomTrifans: data["trifans"].append(vertexList) #print "appended primitive number %s, type is %s" % (p, type(gPrim)) vdata = geom.getVertexData() vreader = GeomVertexReader(vdata, 'vertex') nreader = GeomVertexReader(vdata, 'normal') treader = GeomVertexReader(vdata, 'texcoord') creader = GeomVertexReader(vdata, 'color') tanReader = GeomVertexReader(vdata, 'tangent') binReader = GeomVertexReader(vdata, 'binormal') while not vreader.isAtEnd(): v = vreader.getData3f() n = nreader.getData3f() t = treader.getData2f() c = creader.getData4f() tangent = tanReader.getData3f() binormal = binReader.getData3f() data["vertices"].append(v) data["normals"].append(n) data["texcoords"].append(t) data["colors"].append(c) data["tangents"].append(tangent) data["binormals"].append(binormal) return data