[Bf-extensions-cvs] SVN commit: /data/svn/bf-extensions [3990] contrib/py/scripts/addons/ io_scene_ms3d: fixed some issues reported by paul geraskin (2012-11-20 09: 01) on tracker [#29404]
Alexander Nussbaumer
alpha-beta-release at gmx.net
Tue Nov 20 21:54:22 CET 2012
Revision: 3990
http://projects.blender.org/scm/viewvc.php?view=rev&root=bf-extensions&revision=3990
Author: beta-tester
Date: 2012-11-20 20:54:19 +0000 (Tue, 20 Nov 2012)
Log Message:
-----------
fixed some issues reported by paul geraskin (2012-11-20 09:01) on tracker [#29404]
- keyframes in nla-tracks will be catch as well.
- fixed current_time in exporter
- add operator to set units to metric.
- add export option to normalize weights to 100%
- modified verbose format
Modified Paths:
--------------
contrib/py/scripts/addons/io_scene_ms3d/__init__.py
contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py
contrib/py/scripts/addons/io_scene_ms3d/ms3d_import.py
contrib/py/scripts/addons/io_scene_ms3d/ms3d_spec.py
contrib/py/scripts/addons/io_scene_ms3d/ms3d_strings.py
contrib/py/scripts/addons/io_scene_ms3d/ms3d_ui.py
contrib/py/scripts/addons/io_scene_ms3d/ms3d_utils.py
Modified: contrib/py/scripts/addons/io_scene_ms3d/__init__.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/__init__.py 2012-11-20 11:48:27 UTC (rev 3989)
+++ contrib/py/scripts/addons/io_scene_ms3d/__init__.py 2012-11-20 20:54:19 UTC (rev 3990)
@@ -23,7 +23,7 @@
'description': "Import / Export MilkShape3D MS3D files"\
" (conform with v1.8.4)",
'author': "Alexander Nussbaumer",
- 'version': (0, 5, 0, 3),
+ 'version': (0, 5, 0, 4),
'blender': (2, 6, 3, 0),
'location': "File > Import & File > Export",
#'warning': "",
Modified: contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py
===================================================================
--- contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py 2012-11-20 11:48:27 UTC (rev 3989)
+++ contrib/py/scripts/addons/io_scene_ms3d/ms3d_export.py 2012-11-20 20:54:19 UTC (rev 3990)
@@ -35,6 +35,7 @@
from math import (
radians,
pi,
+ trunc,
)
from mathutils import (
Vector,
@@ -137,16 +138,19 @@
t2 = time()
- self.file = None
+ #self.file = None
try:
# write ms3d file to disk
- self.file = io.FileIO(self.options.filepath, "wb")
-
- ms3d_model.write(self.file)
- self.file.flush()
+ #self.file = io.FileIO(self.options.filepath, "wb")
+ with io.FileIO(self.options.filepath, "wb") as self.file:
+ ms3d_model.write(self.file)
+ self.file.flush()
+ self.file.close()
finally:
- if self.file is not None:
- self.file.close()
+ # close ms3d file
+ #if self.file is not None:
+ # self.file.close()
+ pass
# if option is set, this time will enlargs the io time
if (self.options.prop_verbose):
@@ -216,8 +220,6 @@
self.create_geometry(blender_context, ms3d_model, blender_mesh_objects, blender_to_ms3d_bones)
-
-
###########################################################################
def create_geometry(self, blender_context, ms3d_model, blender_mesh_objects, blender_to_ms3d_bones):
blender_scene = blender_context.scene
@@ -322,7 +324,6 @@
if layer_deform:
blender_vertex_group_ids = bmv[layer_deform]
if blender_vertex_group_ids:
- temp_weight = 0
count = 0
bone_ids = []
weights = []
@@ -332,26 +333,51 @@
if ms3d_joint:
if count == 0:
ms3d_vertex.bone_id = ms3d_joint.__index
- temp_weight = blender_weight
+ weights.append(int(blender_weight * 100.0))
elif count == 1:
bone_ids.append(ms3d_joint.__index)
- weights.append(int(temp_weight * 100.0))
weights.append(int(blender_weight * 100.0))
elif count == 2:
bone_ids.append(ms3d_joint.__index)
weights.append(int(blender_weight * 100.0))
- #elif count == 3:
- # bone_ids.append(ms3d_joint.__index)
-
- # only first three weights will be supported
+ elif count == 3:
+ bone_ids.append(ms3d_joint.__index)
+ self.options.report(
+ {'WARNING', 'INFO'},
+ ms3d_str['WARNING_EXPORT_SKIP_WEIGHT'])
+ else:
+ # only first three weights will be supported / four bones
+ self.options.report(
+ {'WARNING', 'INFO'},
+ ms3d_str['WARNING_EXPORT_SKIP_WEIGHT_EX'])
+ break
count+= 1
- if count > 3:
- break
while len(bone_ids) < 3:
bone_ids.append(Ms3dSpec.DEFAULT_VERTEX_BONE_ID)
while len(weights) < 3:
weights.append(0)
+
+ # normalize weights to 100
+ if self.options.normalize_weights:
+ weight_sum = 0
+ for weight in weights:
+ weight_sum += weight
+
+ if weight_sum > 100:
+ weight_normalize = 100 / weight_sum
+ else:
+ weight_normalize = 1
+
+ weight_sum = 100
+ for index, weight in enumerate(weights):
+ if index >= count-1:
+ weights[index] = weight_sum
+ break
+ normalized_weight = int(weight * weight_normalize)
+ weight_sum -= normalized_weight
+ weights[index] = normalized_weight
+
ms3d_vertex._vertex_ex_object._bone_ids = tuple(bone_ids)
ms3d_vertex._vertex_ex_object._weights = tuple(weights)
@@ -448,7 +474,7 @@
blender_scene = blender_context.scene
ms3d_model.animation_fps = blender_scene.render.fps * blender_scene.render.fps_base
ms3d_model.number_total_frames = (blender_scene.frame_end - blender_scene.frame_start) + 1
- ms3d_model.current_time = (blender_scene.frame_current - blender_scene.frame_start)\
+ ms3d_model.current_time = ((blender_scene.frame_current - blender_scene.frame_start) + 1)\
/ (blender_scene.render.fps * blender_scene.render.fps_base)
base_bone_correction = Matrix.Rotation(pi / 2, 4, 'Z')
@@ -456,12 +482,14 @@
for blender_mesh_object in blender_mesh_objects:
blender_bones = None
blender_action = None
+ blender_nla_tracks = None
for blender_modifier in blender_mesh_object.modifiers:
if blender_modifier.type == 'ARMATURE' and blender_modifier.object.pose:
blender_bones = blender_modifier.object.data.bones
+ blender_pose_bones = blender_modifier.object.pose.bones
if blender_modifier.object.animation_data:
blender_action = blender_modifier.object.animation_data.action
- blender_pose_bones = blender_modifier.object.pose.bones
+ blender_nla_tracks = blender_modifier.object.animation_data.nla_tracks
break
##########################
@@ -510,23 +538,38 @@
##########################
# animation
frames = None
- frames_loc = set()
- frames_rot = set()
+ frames_location = set()
+ frames_rotation = set()
+ frames_scale = set()
if blender_action:
- for fcurve in blender_action.fcurves:
- if fcurve.data_path.endswith(".location"):
- frames = frames_loc
- elif fcurve.data_path.endswith(".rotation_euler") or fcurve.data_path.endswith(".rotation_quaternion"):
- frames = frames_rot
+ self.fill_keyframe_sets(
+ blender_action.fcurves,
+ frames_location, frames_rotation, frames_scale,
+ 0)
- for keyframe_point in fcurve.keyframe_points:
- frames.add(keyframe_point.co.to_tuple(0)[0])
+ if blender_nla_tracks:
+ for nla_track in blender_nla_tracks:
+ if nla_track.mute:
+ continue
+ for strip in nla_track.strips:
+ if strip.mute:
+ continue
+ frame_correction = strip.frame_start - strip.action_frame_start
+ self.fill_keyframe_sets(
+ strip.action.fcurves,
+ frames_location, frames_rotation, frames_scale,
+ frame_correction)
- frames = set(frames_loc)
- frames = frames.union(frames_rot)
+ frames = set(frames_location)
+ frames = frames.union(frames_rotation)
+ frames = frames.union(frames_scale)
- frames_sorted = list(frames.intersection(range(blender_scene.frame_start, blender_scene.frame_end + 1)))
+ frames_sorted = list(
+ frames.intersection(
+ range(blender_scene.frame_start, blender_scene.frame_end + 1)
+ )
+ )
frames_sorted.sort()
time_base = 1.0 / (blender_scene.render.fps / blender_scene.render.fps_base)
@@ -537,14 +580,23 @@
current_time = current_frame * time_base
for blender_bone_name in blender_bones_ordered:
+ blender_bone = blender_bones[blender_bone_name]
blender_pose_bone = blender_pose_bones[blender_bone_name]
ms3d_joint = blender_to_ms3d_bones[blender_bone_name]
loc = blender_pose_bone.location
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list