texture.image = image
return texture, image
-
def materialAddTexture(material, texture):
material.mode = material.mode | Blender.Material.Modes.TEXFACE
material.setTexture(0, texture, Blender.Texture.TexCo.UV)
def createArmatureBone(armature, name):
bone=Blender.Armature.Editbone()
- bone.name=name
+ bone.name=name.encode(INTERNAL_ENCODING)
armature.bones[name]=bone
return bone
def armatureUpdate(armature):
armature.update()
-def boneLayerMask(bone, mask):
+def boneLayerMask(bone, layers):
mask=0
- for i, enable in enumerate(mask):
- mask+=(1<<i)
+ for i, enable in enumerate(layers):
+ if enable!=0:
+ mask+=(1<<i)
bone.layerMask=mask
+def objectPinShape(o):
+ o.pinShape=True
+
+def objectAddShapeKey(o, name):
+ mesh=o.getData(mesh=True)
+ mesh.insertKey()
+ block=mesh.key.blocks[-1]
+ block.name=name.encode(INTERNAL_ENCODING)
+ return block
+
+def objectActivateShapeKey(o, index):
+ o.activeShape=index
+
+def shapeKeyAssign(shapeKey, index, pos):
+ shapeKey.data[index]=pos
+
+
"""
MMD_SHAPE_GROUP_NAME='_MMD_SHAPE'
+BASE_SHAPE_NAME='Basis'
###############################################################################
"""
return (pos.x, pos.z, pos.y)
+
def convert_uv(uv):
return (uv.x, 1.0 - uv.y)
+
def to_radian(degree):
return math.pi * degree / 180
-if isBlender24():
- # functions
- def get_bone_name(l, index):
- name=englishmap.getEnglishBoneName(l.bones[index].getName())
- return name if name else l.bones[index].getName().encode(bl.INTERNAL_ENCODING)
+def get_bone_name(l, index):
+ name=englishmap.getEnglishBoneName(l.bones[index].getName())
+ return name if name else l.bones[index].getName()
+def __importShape(obj, l, vertex_map):
+ if len(l.morph_list)==0:
+ return
- def importShape(obj, l, vertex_map):
- if len(l.morph_list)==0:
- return
- obj.pinShape=True
- mesh=obj.getData(mesh=True)
+ # set shape_key pin
+ bl.objectPinShape(obj)
- # find base
- base=None
- for s in l.morph_list:
- if s.type==0:
- base=s
-
- # create vertex group
- mesh.addVertGroup(MMD_SHAPE_GROUP_NAME)
- indices=[]
- hasShape=False
- for i in s.indices:
- if i in vertex_map:
- hasShape=True
- indices.append(vertex_map[i])
- mesh.assignVertsToGroup(MMD_SHAPE_GROUP_NAME, indices, 0,
- Blender.Mesh.AssignModes.ADD)
- if not hasShape:
- return
-
- # create base key
- mesh.insertKey()
- assert(len(mesh.key.blocks)==1)
- baseShapeIndex=0
- baseShapeBlock=mesh.key.blocks[baseShapeIndex]
- baseShapeBlock.name='Basis'
- obj.activeShape=baseShapeIndex
- mesh.update()
- break
+ # find base
+ base=None
+ for s in l.morph_list:
+ if s.type==0:
+ base=s
- assert(base)
+ # create vertex group
+ bl.meshAddVertexGroup(obj, MMD_SHAPE_GROUP_NAME)
+ hasShape=False
+ for i in s.indices:
+ if i in vertex_map:
+ hasShape=True
+ bl.meshAssignVertexGroup(
+ obj, MMD_SHAPE_GROUP_NAME, vertex_map[i], 0)
+ if not hasShape:
+ return
+ assert(base)
+
+ # create base key
+ baseShapeBlock=bl.objectAddShapeKey(obj, BASE_SHAPE_NAME)
+ # mesh
+ mesh=bl.objectGetData(obj)
+ mesh.update()
- # each skin
- for s in l.morph_list:
- if s.name==base.name:
- continue
+ # each skin
+ for s in l.morph_list:
+ if s.type==0:
+ continue
+
+ # name
+ name=englishmap.getEnglishSkinName(s.getName())
+ if not name:
+ name=s.getName()
+ if isBlender24():
+ # 24
for index, offset in zip(s.indices, s.pos_list):
try:
vertex_index=vertex_map[base.indices[index]]
v[0]+=offset[0]
v[1]+=offset[1]
v[2]+=offset[2]
- except IndexErrora as msg:
+ except IndexError as msg:
print(msg)
print(index, len(base.indices), len(vertex_map))
print(len(mesh.verts))
#print 'this mesh not has shape vertices'
break
- # get skin name
- name=englishmap.getEnglishSkinName(s.getName())
- if not name:
- name=s.getName().encode(bl.INTERNAL_ENCODING)
- print(name)
-
# create shapekey block
- mesh.insertKey()
- shapeIndex=len(mesh.key.blocks)-1
- keyBlock=mesh.key.blocks[shapeIndex]
- keyBlock.name=name
+ new_shape_key=bl.objectAddShapeKey(obj, name)
# copy vertex to shape key
mesh.update()
mv.co[2] = v[2]
mesh.update()
- # select base shape
- obj.activeShape=baseShapeIndex
-
-else:
- # for 2.5
- def get_bone_name(l, index):
- name=englishmap.getEnglishBoneName(l.bones[index].getName())
- return name if name else l.bones[index].getName()
-
-
- def create_texture(directory, texture_name):
- texture=bpy.data.textures.new(texture_name)
- texture.type='IMAGE'
- texture=texture.recast_type()
- texturePath=os.path.join(directory, texture_name)
- print('create_texture', texturePath)
- image=bpy.data.images.load(texturePath)
- texture.image=image
- texture.mipmap = True
- texture.interpolation = True
- texture.use_alpha = True
- return texture
-
-
-
- def importShape(meshObject, l, vertex_map):
- if len(l.morph_list)==0:
- return
-
- # base
- base=None
- for s in l.morph_list:
- if s.type!=0:
- continue
- base=s
- break
- assert(base)
-
- # create base key
- baseblock=meshObject.add_shape_key("Basis")
-
- # mesh
- mesh=meshObject.data
-
- # each skin
- for s in l.morph_list:
- if s.getName()==base.name:
- # skip base
- continue
+ else:
+ # 25
+ new_shape_key=bl.objectAddShapeKey(obj, name)
- # restore
- #for v, base_pos in zip(mesh.verts, baseblock.data):
- # v.co=base_pos.co
- #mesh.update()
-
- # name
- name=englishmap.getEnglishSkinName(s.getName())
- if not name:
- name=s.getName()
- new_shape_key=meshObject.add_shape_key(name)
- #new_shape_key.value=1.0
-
- # morph
- for i, offset in zip(s.indices, s.pos_list):
+ for index, offset in zip(s.indices, s.pos_list):
try:
- vertex_index=base.indices[i]
- new_shape_key.data[vertex_index].co=[p+o for p, o in zip(
- mesh.verts[vertex_index].co, convert_coord(offset))]
+ vertex_index=base.indices[index]
+ bl.shapeKeyAssign(new_shape_key, vertex_index,
+ mesh.verts[vertex_index].co+
+ bl.createVector(*convert_coord(offset)))
except IndexError as msg:
- print(IndexError, msg)
- print(i, len(base.indices))
- print(vertex_index, len(mesh.verts))
- print(base.indices[i])
+ print(msg)
+ print(index, len(base.indices), len(vertex_map))
+ print(len(mesh.verts))
+ print(base.indices[index])
+ print(vertex_index)
break
except KeyError:
#print 'this mesh not has shape vertices'
break
-
- # set ipo curve
- #icu=ipo.addCurve(name)
- #icu.interpolation = Blender.IpoCurve.InterpTypes.LINEAR
- #icu.append( (0.0, 0.0) )
+
+ # select base shape
+ bl.objectActivateShapeKey(obj, 0)
+
def __build(armature, b, p, parent):
name=englishmap.getEnglishBoneName(b.getName())
return armature_object
+
def __import16MaerialAndMesh(meshObject, l,
material_order, face_map, tex_dir):
bl.enterEditMode()
# crete shape key
- importShape(meshObject, io, vertex_map)
+ __importShape(meshObject, io, vertex_map)
# exit Edit Mode
bl.exitEditMode()
return mesh_objects
+
def __execute(filename, scene):
"""
load pmd file to context.