[Bf-extensions-cvs] [0ec518a] master: Cleanup/enhancements suggested by Campbell, thanks!
Bastien Montagne
noreply at git.blender.org
Thu Mar 13 15:57:21 CET 2014
Commit: 0ec518ab4be39982f116311bf3f0ec3b9be7c63b
Author: Bastien Montagne
Date: Thu Mar 13 12:15:46 2014 +0100
https://developer.blender.org/rBA0ec518ab4be39982f116311bf3f0ec3b9be7c63b
Cleanup/enhancements suggested by Campbell, thanks!
===================================================================
M io_scene_fbx/export_fbx_bin.py
===================================================================
diff --git a/io_scene_fbx/export_fbx_bin.py b/io_scene_fbx/export_fbx_bin.py
index 7dc3340..7f60213 100644
--- a/io_scene_fbx/export_fbx_bin.py
+++ b/io_scene_fbx/export_fbx_bin.py
@@ -34,6 +34,7 @@ from itertools import zip_longest, chain
import bpy
import bpy_extras
+from bpy.types import Object, Bone
from mathutils import Vector, Matrix
from . import encode_bin, data_types
@@ -111,10 +112,13 @@ UNITS = {
def units_convert(val, u_from, u_to):
"""Convert value."""
conv = UNITS[u_to] / UNITS[u_from]
- try:
- return (v * conv for v in val)
- except:
- return val * conv
+ return val * conv
+
+
+def units_convert_iter(it, u_from, u_to):
+ """Convert value."""
+ conv = UNITS[u_to] / UNITS[u_from]
+ return (v * conv for v in it)
def matrix_to_array(mat):
@@ -677,7 +681,7 @@ def object_matrix(scene_data, obj, armature=None, global_space=False):
If obj is a bone, and global_space is True, armature must be provided (it's the bone's armature object!).
Applies specific rotation to bones, lamps and cameras (conversion Blender -> FBX).
"""
- is_bone = isinstance(obj, bpy.types.Bone)
+ is_bone = isinstance(obj, Bone)
# Objects which are not bones and do not have any parent are *always* in global space!
is_global = global_space or not (is_bone or (obj.parent and obj.parent in scene_data.objects))
@@ -882,7 +886,7 @@ def fbx_data_mesh_elements(root, me, scene_data):
elem_data_single_int32(geom, b"GeometryVersion", FBX_GEOMETRY_VERSION)
# Vertex cos.
- t_co = array.array(data_types.ARRAY_FLOAT64, [0.0] * len(me.vertices) * 3)
+ t_co = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.vertices) * 3
me.vertices.foreach_get("co", t_co)
elem_data_single_float64_array(geom, b"Vertices", t_co)
del t_co
@@ -893,7 +897,7 @@ def fbx_data_mesh_elements(root, me, scene_data):
#
# Note we have to process Edges in the same time, as they are based on poly's loops...
loop_nbr = len(me.loops)
- t_pvi = array.array(data_types.ARRAY_INT32, (0,) * loop_nbr)
+ t_pvi = array.array(data_types.ARRAY_INT32, (0,)) * loop_nbr
t_ls = [None] * len(me.polygons)
me.loops.foreach_get("vertex_index", t_pvi)
@@ -961,12 +965,12 @@ def fbx_data_mesh_elements(root, me, scene_data):
t_ps = None
_map = b""
if smooth_type == 'FACE':
- t_ps = array.array(data_types.ARRAY_INT32, [0] * len(me.polygons))
+ t_ps = array.array(data_types.ARRAY_INT32, (0,)) * len(me.polygons)
me.polygons.foreach_get("use_smooth", t_ps)
_map = b"ByPolygon"
else: # EDGE
# Write Edge Smoothing.
- t_ps = array.array(data_types.ARRAY_INT32, (0,) * edges_nbr)
+ t_ps = array.array(data_types.ARRAY_INT32, (0,)) * edges_nbr
for e in me.edges:
if e.key not in edges_map:
continue # Only loose edges, in theory!
@@ -994,7 +998,7 @@ def fbx_data_mesh_elements(root, me, scene_data):
def _nortuples_gen(raw_nors):
return zip(*(iter(raw_nors),) * 3)
- t_ln = array.array(data_types.ARRAY_FLOAT64, [0.0] * len(me.loops) * 3)
+ t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops) * 3
me.loops.foreach_get("normal", t_ln)
lay_nor = elem_data_single_int32(geom, b"LayerElementNormal", 0)
elem_data_single_int32(lay_nor, b"Version", FBX_GEOMETRY_NORMAL_VERSION)
@@ -1005,16 +1009,18 @@ def fbx_data_mesh_elements(root, me, scene_data):
ln2idx = tuple(set(_nortuples_gen(t_ln)))
elem_data_single_float64_array(lay_nor, b"Normals", chain(*ln2idx))
# Normal weights, no idea what it is.
- elem_data_single_float64_array(lay_nor, b"NormalsW", (0.0,) * len(ln2idx))
+ t_lnw = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(ln2idx)
+ elem_data_single_float64_array(lay_nor, b"NormalsW", t_lnw)
ln2idx = {nor: idx for idx, nor in enumerate(ln2idx)}
elem_data_single_int32_array(lay_nor, b"NormalIndex", (ln2idx[n] for n in _nortuples_gen(t_ln)))
del ln2idx
del t_ln
+ del t_lnw
del _nortuples_gen
else:
- t_ln = array.array(data_types.ARRAY_FLOAT64, [0.0] * len(me.loops) * 3)
+ t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops) * 3
me.loops.foreach_get("normal", t_ln)
lay_nor = elem_data_single_int32(geom, b"LayerElementNormal", 0)
elem_data_single_int32(lay_nor, b"Version", FBX_GEOMETRY_NORMAL_VERSION)
@@ -1023,7 +1029,8 @@ def fbx_data_mesh_elements(root, me, scene_data):
elem_data_single_string(lay_nor, b"ReferenceInformationType", b"Direct")
elem_data_single_float64_array(lay_nor, b"Normals", t_ln)
# Normal weights, no idea what it is.
- elem_data_single_float64_array(lay_nor, b"NormalsW", (0.0,) * len(t_ln))
+ t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops)
+ elem_data_single_float64_array(lay_nor, b"NormalsW", t_ln)
del t_ln
# tspace
@@ -1031,7 +1038,8 @@ def fbx_data_mesh_elements(root, me, scene_data):
if scene_data.settings.use_tspace:
tspacenumber = len(me.uv_layers)
if tspacenumber:
- t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,) * len(me.loops) * 3)
+ t_ln = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops) * 3
+ t_lnw = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops)
for idx, uvlayer in enumerate(me.uv_layers):
name = uvlayer.name
me.calc_tangents(name)
@@ -1045,7 +1053,7 @@ def fbx_data_mesh_elements(root, me, scene_data):
elem_data_single_string(lay_nor, b"ReferenceInformationType", b"Direct")
elem_data_single_float64_array(lay_nor, b"Binormals", t_ln)
# Binormal weights, no idea what it is.
- elem_data_single_float64_array(lay_nor, b"BinormalsW", (0.0,) * len(t_ln))
+ elem_data_single_float64_array(lay_nor, b"BinormalsW", t_lnw)
# Loop tangents.
# NOTE: this is not supported by importer currently.
@@ -1057,9 +1065,10 @@ def fbx_data_mesh_elements(root, me, scene_data):
elem_data_single_string(lay_nor, b"ReferenceInformationType", b"Direct")
elem_data_single_float64_array(lay_nor, b"Tangents", t_ln)
# Tangent weights, no idea what it is.
- elem_data_single_float64_array(lay_nor, b"TangentsW", (0.0,) * len(t_ln))
+ elem_data_single_float64_array(lay_nor, b"TangentsW", t_lnw)
del t_ln
+ del t_lnw
me.free_tangents()
me.free_normals_split()
@@ -1074,7 +1083,7 @@ def fbx_data_mesh_elements(root, me, scene_data):
yield val
return zip(*(iter(raw_cols),) * 3 + (_infinite_gen(1.0),)) # We need a fake alpha...
- t_lc = array.array(data_types.ARRAY_FLOAT64, [0.0] * len(me.loops) * 3)
+ t_lc = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops) * 3
for colindex, collayer in enumerate(me.vertex_colors):
collayer.data.foreach_get("color", t_lc)
lay_vcol = elem_data_single_int32(geom, b"LayerElementColor", colindex)
@@ -1100,7 +1109,7 @@ def fbx_data_mesh_elements(root, me, scene_data):
def _uvtuples_gen(raw_uvs):
return zip(*(iter(raw_uvs),) * 2)
- t_luv = array.array(data_types.ARRAY_FLOAT64, [0.0] * len(me.loops) * 2)
+ t_luv = array.array(data_types.ARRAY_FLOAT64, (0.0,)) * len(me.loops) * 2
for uvindex, uvlayer in enumerate(me.uv_layers):
uvlayer.data.foreach_get("uv", t_luv)
lay_uv = elem_data_single_int32(geom, b"LayerElementUV", uvindex)
@@ -1129,7 +1138,7 @@ def fbx_data_mesh_elements(root, me, scene_data):
elem_data_single_string(lay_mat, b"Name", b"")
nbr_mats = len(me_fbxmats_idx)
if nbr_mats > 1:
- t_pm = array.array(data_types.ARRAY_INT32, [0] * len(me.polygons))
+ t_pm = array.array(data_types.ARRAY_INT32, (0,)) * len(me.polygons)
me.polygons.foreach_get("material_index", t_pm)
# We have to validate mat indices, and map them to FBX indices.
@@ -1454,7 +1463,7 @@ def fbx_data_object_elements(root, obj, scene_data):
Note we handle "Model" part of bones as well here!
"""
obj_type = b"Null" # default, sort of empty...
- if isinstance(obj, bpy.types.Bone):
+ if isinstance(obj, Bone):
obj_type = b"LimbNode"
elif (obj.type == 'MESH'):
obj_type = b"Mesh"
@@ -1471,7 +1480,7 @@ def fbx_data_object_elements(root, obj, scene_data):
# Object transform info.
loc, rot, scale, matrix, matrix_rot = object_tx(scene_data, obj)
- rot = tuple(units_convert(rot, "radian", "degree"))
+ rot = tuple(units_convert_iter(rot, "radian", "degree"))
tmpl = scene_data.templates[b"Model"]
# For now add only loc/rot/scale...
@@ -1493,7 +1502,7 @@ def fbx_data_object_elements(root, obj, scene_data):
elem_data_single_bool(model, b"Shading", True)
elem_data_single_string(model, b"Culling", b"CullingOff")
- if isinstance(obj, bpy.types.Object) and obj.type == 'CAMERA':
+ if isinstance(obj, Object) and obj.type == 'CAMERA':
# Why, oh why are FBX cameras such a mess???
# And WHY add camera data HERE??? Not even sure this is needed...
render = scene_data.scene.render
@@ -1583,7 +1592,7 @@ def fbx_skeleton_from_armature(scene, settings, armature, objects, data_bones, d
bones[bo.name] = bo
for obj in objects.keys():
- if not isinstance(obj, bpy.types.Object):
+ if not isinstance(obj, Object):
continue
if obj.type not in {'MESH'}:
continue
@@ -1658,7 +1667,7 @@ def fbx_data_from_scene(scene, settings):
data_materials = {}
for obj in objects:
# Only meshes for now!
- if not isinstance(obj, bpy.
@@ Diff output truncated at 10240 characters. @@
More information about the Bf-extensions-cvs
mailing list