Beispiel #1
0
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
Beispiel #2
0
	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)
Beispiel #3
0
 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)
Beispiel #4
0
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
Beispiel #5
0
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
Beispiel #6
0
 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
Beispiel #7
0
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()
Beispiel #8
0
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