X-Git-Url: http://git.osdn.jp/view?a=blobdiff_plain;f=blender25-meshio%2Fpymeshio%2Fpmd.py;h=8efc3284c1d3c883a21e873a4c7ccf6313ae0d00;hb=b811d10dcc8b2358dfc43abe7431a2d132dde45f;hp=2c5f07209046466b2ac8e5dac1cb3d708f78a5c0;hpb=e59825fe14580205a23a2da39d5e2bd805277522;p=meshio%2Fpymeshio.git diff --git a/blender25-meshio/pymeshio/pmd.py b/blender25-meshio/pymeshio/pmd.py index 2c5f072..8efc328 100644 --- a/blender25-meshio/pymeshio/pmd.py +++ b/blender25-meshio/pymeshio/pmd.py @@ -1,7 +1,7 @@ # coding: utf-8 import os import struct -from mmd import * +from .mmd import * ############################################################################### # PMD @@ -231,6 +231,7 @@ class IK(object): def __str__(self): return "" %(self.index, self.target, self.iterations, self.weight, '-'.join([str(i) for i in self.children]), len(self.children)) + class Skin(object): __slots__=['name', 'type', 'indices', 'pos_list', 'english_name', 'vertex_count'] @@ -255,13 +256,6 @@ class Skin(object): self.name, self.type, len(self.indices)) -class ToonTexture(object): - __slots__=['name'] - def __init__(self, name): self.name=name - def getName(self): return self.name.decode('cp932') - def setName(self, u): self.name=u - - class BoneGroup(object): __slots__=['name', 'english_name'] def __init__(self, name='group'): self.name=name; self.english_name='center' @@ -278,11 +272,26 @@ class RigidBody(object): ] def __init__(self, name): self.name=name + self.position=Vector3() + self.rotation=Vector3() class Constraint(object): - def __init__(self): - pass + __slots__=[ 'name', 'rigidA', 'rigidB', 'pos', 'rot', + 'constraintPosMin', 'constraintPosMax', + 'constraintRotMin', 'constraintRotMax', + 'springPos', 'springRot', + ] + def __init__(self, name): + self.name=name + self.pos=Vector3() + self.rot=Vector3() + self.constraintPosMin=Vector3() + self.constraintPosMax=Vector3() + self.constraintRotMin=Vector3() + self.constraintRotMax=Vector3() + self.springPos=Vector3() + self.springRot=Vector3() class IO(object): @@ -314,11 +323,11 @@ class IO(object): self.bone_display_list=[] self.toon_textures=[ - ToonTexture(b'toon'), ToonTexture(b'toon'), - ToonTexture(b'toon'), ToonTexture(b'toon'), - ToonTexture(b'toon'), ToonTexture(b'toon'), - ToonTexture(b'toon'), ToonTexture(b'toon'), - ToonTexture(b'toon'), ToonTexture(b'toon'), + b'toon01.bmp', b'toon02.bmp', + b'toon03.bmp', b'toon04.bmp', + b'toon05.bmp', b'toon06.bmp', + b'toon07.bmp', b'toon08.bmp', + b'toon09.bmp', b'toon10.bmp', ] self.no_parent_bones=[] @@ -371,17 +380,12 @@ class IO(object): len(self.materials), len(self.bones), len(self.ik_list), len(self.morph_list)) def _check_position(self): - """ - if self.pos: - print(self.pos, self.io.tell()-self.pos) - """ self.pos=self.io.tell() - pass def read(self, path): size=os.path.getsize(path) - f=open(path, "rb") - return self.load(path, f, size) + with open(path, "rb") as f: + return self.load(path, f, size) def load(self, path, io, end): self.io=io @@ -539,9 +543,6 @@ class IO(object): for l in self.bone_display_list: io.write(struct.pack("=HB", *l)) - # ToDo - # Extend Data - return True @@ -578,7 +579,6 @@ class IO(object): def _loadHeader(self): signature=struct.unpack("3s", self.io.read(3))[0] - #print(signature) if signature!=b"Pmd": print("invalid signature", signature) return False @@ -671,7 +671,9 @@ class IO(object): def _loadBoneIndex(self): size = struct.unpack("I", self.io.read(4))[0] for i in xrange(size): - self.bone_display_list.append(struct.unpack("HB", self.io.read(3))) + first=struct.unpack("H", self.io.read(2))[0] + second=struct.unpack("B", self.io.read(1))[0] + self.bone_display_list.append((first, second)) return True def loadToonTexture(self): @@ -679,8 +681,8 @@ class IO(object): 100bytex10 """ for i in xrange(10): - self.toon_textures.append(ToonTexture( - truncate_zero(struct.unpack("100s", self.io.read(100))[0]))) + self.toon_textures.append( + truncate_zero(struct.unpack("100s", self.io.read(100))[0])) return True def loadEnglishName(self): @@ -689,14 +691,14 @@ class IO(object): struct.unpack("20s", self.io.read(20))[0]) self.english_comment=truncate_zero( struct.unpack("256s", self.io.read(256))[0]) - # english bone list + self._check_position() + # english bone name for bone in self.bones: english_name=truncate_zero( struct.unpack("20s", self.io.read(20))[0]) - if english_name!=bone.name: - bone.english_name=english_name + bone.english_name=english_name + self._check_position() # english skin list - #for index in self.face_list: for skin in self.morph_list: if skin.name=='base': continue @@ -705,10 +707,12 @@ class IO(object): #skin=self.morph_list[index] if english_name!=skin.name: skin.english_name=english_name + self._check_position() # english bone list for i in xrange(0, len(self.bone_group_list)): self.bone_group_list[i].english_name=truncate_zero( struct.unpack("50s", self.io.read(50))[0]) + self._check_position() return True def loadPhysics(self): @@ -717,14 +721,61 @@ class IO(object): for i in xrange(count): name=truncate_zero(struct.unpack("20s", self.io.read(20))[0]) rigidbody=RigidBody(name) - struct.unpack("63s", self.io.read(63))[0] + rigidbody.boneIndex=struct.unpack("H", self.io.read(2))[0] + rigidbody.group=struct.unpack("B", self.io.read(1))[0] + rigidbody.target=struct.unpack("H", self.io.read(2))[0] + rigidbody.shapeType=struct.unpack("B", self.io.read(1))[0] + rigidbody.w=struct.unpack("f", self.io.read(4))[0] + rigidbody.h=struct.unpack("f", self.io.read(4))[0] + rigidbody.d=struct.unpack("f", self.io.read(4))[0] + rigidbody.position.x=struct.unpack("f", self.io.read(4))[0] + rigidbody.position.y=struct.unpack("f", self.io.read(4))[0] + rigidbody.position.z=struct.unpack("f", self.io.read(4))[0] + rigidbody.rotation.x=struct.unpack("f", self.io.read(4))[0] + rigidbody.rotation.y=struct.unpack("f", self.io.read(4))[0] + rigidbody.rotation.z=struct.unpack("f", self.io.read(4))[0] + rigidbody.weight=struct.unpack("f", self.io.read(4))[0] + rigidbody.linearDamping=struct.unpack("f", self.io.read(4))[0] + rigidbody.angularDamping=struct.unpack("f", self.io.read(4))[0] + rigidbody.restitution=struct.unpack("f", self.io.read(4))[0] + rigidbody.friction=struct.unpack("f", self.io.read(4))[0] + rigidbody.processType=struct.unpack("B", self.io.read(1))[0] self.rigidbodies.append(rigidbody) + self._check_position() # ジョイントリスト count = struct.unpack("I", self.io.read(4))[0] for i in xrange(count): - struct.unpack("124s", self.io.read(124))[0] - constraint=Constraint() - self.constraints.append(Constraint) + name=truncate_zero(struct.unpack("20s", self.io.read(20))[0]) + constraint=Constraint(name) + constraint.rigidA=struct.unpack("I", self.io.read(4))[0] + constraint.rigidB=struct.unpack("I", self.io.read(4))[0] + constraint.pos.x=struct.unpack("f", self.io.read(4))[0] + constraint.pos.y=struct.unpack("f", self.io.read(4))[0] + constraint.pos.z=struct.unpack("f", self.io.read(4))[0] + constraint.rot.x=struct.unpack("f", self.io.read(4))[0] + constraint.rot.y=struct.unpack("f", self.io.read(4))[0] + constraint.rot.z=struct.unpack("f", self.io.read(4))[0] + constraint.constraintPosMin.x=struct.unpack("f", self.io.read(4))[0] + constraint.constraintPosMin.y=struct.unpack("f", self.io.read(4))[0] + constraint.constraintPosMin.z=struct.unpack("f", self.io.read(4))[0] + constraint.constraintPosMax.x=struct.unpack("f", self.io.read(4))[0] + constraint.constraintPosMax.y=struct.unpack("f", self.io.read(4))[0] + constraint.constraintPosMax.z=struct.unpack("f", self.io.read(4))[0] + constraint.constraintRotMin.x=struct.unpack("f", self.io.read(4))[0] + constraint.constraintRotMin.y=struct.unpack("f", self.io.read(4))[0] + constraint.constraintRotMin.z=struct.unpack("f", self.io.read(4))[0] + constraint.constraintRotMax.x=struct.unpack("f", self.io.read(4))[0] + constraint.constraintRotMax.y=struct.unpack("f", self.io.read(4))[0] + constraint.constraintRotMax.z=struct.unpack("f", self.io.read(4))[0] + constraint.springPos.x=struct.unpack("f", self.io.read(4))[0] + constraint.springPos.y=struct.unpack("f", self.io.read(4))[0] + constraint.springPos.z=struct.unpack("f", self.io.read(4))[0] + constraint.springRot.x=struct.unpack("f", self.io.read(4))[0] + constraint.springRot.y=struct.unpack("f", self.io.read(4))[0] + constraint.springRot.z=struct.unpack("f", self.io.read(4))[0] + self.constraints.append(constraint) + self._check_position() + return True