From 5fd1134b93db698eae3d336be2139c7eb756c7dc Mon Sep 17 00:00:00 2001 From: ousttrue Date: Sat, 10 Jul 2010 14:21:27 +0900 Subject: [PATCH] fix export vertex map. --- swig/blender/pmd_export.py | 92 +++++++++++++++++++++++++++++++--------------- 1 file changed, 62 insertions(+), 30 deletions(-) diff --git a/swig/blender/pmd_export.py b/swig/blender/pmd_export.py index d77189e..503cc99 100644 --- a/swig/blender/pmd_export.py +++ b/swig/blender/pmd_export.py @@ -171,7 +171,8 @@ class VertexKey(object): def __hash__(self): #return int((self.x+self.y+self.z+self.nx+self.ny+self.nz+self.u+self.v)*100) - return int((self.x+self.y+self.z)*100) + #return int((self.x+self.y+self.z)*100) + return self.index*100+self.obj def __eq__(self, rhs): #return near(self.x, rhs.x) and near(self.y, rhs.y) and near(self.z, rhs.z) and near(self.nx, rhs.nx) and near(self.ny, rhs.ny) and near(self.nz, rhs.nz) and near(self.u, rhs.u) and near(self.v, rhs.v) @@ -184,6 +185,15 @@ class VertexArray(object): """ 頂点配列 """ + __slots__=[ + 'indexArrays', + 'vertices', + 'normals', + 'uvs', + 'b0', 'b1', 'weight', + 'vertexMap', + 'objectMap', + ] def __init__(self): # マテリアル毎に分割したインデックス配列 self.indexArrays={} @@ -197,7 +207,8 @@ class VertexArray(object): self.weight=[] self.vertexMap={} - self.indexMap={} + #self.indexMap={} + self.objectMap={} def __str__(self): return "" % ( @@ -239,18 +250,26 @@ class VertexArray(object): self.weight.append(weight0) # indexのマッピングを保存する - if not base_index in self.indexMap: - self.indexMap[base_index]=set() - self.indexMap[base_index].add(index) + #if not base_index in self.indexMap: + # self.indexMap[base_index]=set() + #self.indexMap[base_index].add(index) assert(index<=65535) return index - def getMappedIndices(self, base_index): + def getMappedIndex(self, obj_name, base_index): + key=VertexKey( + self.objectMap[obj_name], base_index, + None, None, None, + None, None, None, + None, None) + return self.vertexMap[key] + + def getMappedIndices(self, obj, base_index): return self.indexMap[base_index] def addTriangle(self, - obj, material, + object_name, material, base_index0, base_index1, base_index2, pos0, pos1, pos2, n0, n1, n2, @@ -259,6 +278,11 @@ class VertexArray(object): b1_0, b1_1, b1_2, weight0, weight1, weight2 ): + if object_name in self.objectMap: + obj=self.objectMap[object_name] + else: + obj=len(self.objectMap) + self.objectMap[object_name]=obj index0=self.__getIndex(obj, base_index0, pos0, n0, uv0, b0_0, b1_0, weight0) index1=self.__getIndex(obj, base_index1, pos1, n1, uv1, b0_1, b1_1, weight1) index2=self.__getIndex(obj, base_index2, pos2, n2, uv2, b0_2, b1_2, weight2) @@ -298,7 +322,7 @@ class IKSolver(object): class OneSkinMesh(object): - __slots__=['obj_index', 'scene', 'vertexArray', 'morphList', + __slots__=['scene', 'vertexArray', 'morphList', 'rigidbodies', 'constraints', ] @@ -308,7 +332,6 @@ class OneSkinMesh(object): self.rigidbodies=[] self.constraints=[] self.scene=scene - self.obj_index=0 def __str__(self): return "" % ( @@ -377,7 +400,7 @@ class OneSkinMesh(object): return weightMap, secondWeightMap - def __processFaces(self, mesh, weightMap, secondWeightMap): + def __processFaces(self, obj_name, mesh, weightMap, secondWeightMap): # 各面の処理 for i, face in enumerate(mesh.faces): faceVertexCount=bl.face.getVertexCount(face) @@ -389,7 +412,7 @@ class OneSkinMesh(object): if faceVertexCount==3: # triangle self.vertexArray.addTriangle( - self.obj_index, material.name, + obj_name, material.name, v[2].index, v[1].index, v[0].index, @@ -417,7 +440,7 @@ class OneSkinMesh(object): elif faceVertexCount==4: # quadrangle self.vertexArray.addTriangle( - self.obj_index, material.name, + obj_name, material.name, v[2].index, v[1].index, v[0].index, @@ -442,7 +465,7 @@ class OneSkinMesh(object): weightMap[v[0].index][1] ) self.vertexArray.addTriangle( - self.obj_index, material.name, + obj_name, material.name, v[0].index, v[3].index, v[2].index, @@ -504,10 +527,9 @@ class OneSkinMesh(object): print(m.tpye) weightMap, secondWeightMap=self.__getWeightMap(copyObj, copyMesh) - self.__processFaces(copyMesh, weightMap, secondWeightMap) + self.__processFaces(obj.name, copyMesh, weightMap, secondWeightMap) bl.object.delete(copyObj) - self.obj_index+=1 def createEmptyBasicSkin(self): self.__getOrCreateMorph('base', 0) @@ -534,15 +556,19 @@ class OneSkinMesh(object): for index in vg: v=bl.shapekey.getByIndex(b, index) pos=[v[0], v[1], v[2]] - indices=self.vertexArray.getMappedIndices(index) - for i in indices: - if i in used: - continue - used.add(i) - - baseMorph.add(i, pos) - indexRelativeMap[i]=relativeIndex - relativeIndex+=1 + i=self.vertexArray.getMappedIndex(obj.name, index) + baseMorph.add(i, pos) + indexRelativeMap[i]=relativeIndex + relativeIndex+=1 + #indices=self.vertexArray.getMappedIndices(index) + #for i in indices: + # if i in used: + # continue + # used.add(i) + + # baseMorph.add(i, pos) + # indexRelativeMap[i]=relativeIndex + # relativeIndex+=1 break assert(basis) @@ -567,12 +593,18 @@ class OneSkinMesh(object): if offset[0]==0 and offset[1]==0 and offset[2]==0: continue if index in vg: - indices=self.vertexArray.getMappedIndices(index) - for i in indices: - if i in used: - continue - used.add(i) - morph.add(indexRelativeMap[i], offset) + i=self.vertexArray.getMappedIndex(obj.name, index) + if i in used: + continue + used.add(i) + morph.add(indexRelativeMap[i], offset) + #indices=self.vertexArray.getMappedIndices(index) + #for i in indices: + # if i in used: + # continue + # used.add(i) + # morph.add(indexRelativeMap[i], offset) + assert(len(morph.offsets)