Skip to content
Snippets Groups Projects
Commit 77f26b16 authored by Campbell Barton's avatar Campbell Barton
Browse files

add support for reading vertex normals

parent 5a1de036
No related branches found
No related tags found
No related merge requests found
...@@ -70,16 +70,12 @@ def elem_repr(elem): ...@@ -70,16 +70,12 @@ def elem_repr(elem):
def elem_split_name_class(elem): def elem_split_name_class(elem):
""" Return
"""
assert(elem.props_type[-2] == data_types.STRING) assert(elem.props_type[-2] == data_types.STRING)
elem_name, elem_class = elem.props[-2].split(b'\x00\x01') elem_name, elem_class = elem.props[-2].split(b'\x00\x01')
return elem_name, elem_class return elem_name, elem_class
def elem_split_name_class_nodeattr(elem): def elem_split_name_class_nodeattr(elem):
""" Return
"""
assert(elem.props_type[-2] == data_types.STRING) assert(elem.props_type[-2] == data_types.STRING)
elem_name, elem_class = elem.props[-2].split(b'\x00\x01') elem_name, elem_class = elem.props[-2].split(b'\x00\x01')
assert(elem_class == b'NodeAttribute') assert(elem_class == b'NodeAttribute')
...@@ -206,7 +202,7 @@ def blen_read_object(fbx_obj, object_data): ...@@ -206,7 +202,7 @@ def blen_read_object(fbx_obj, object_data):
# ---- # ----
# Misc Attributes # Misc Attributes
obj.color = elem_props_get_color_rgb(fbx_props, b'Color', (0.8, 0.8, 0.8)) obj.color[0:3] = elem_props_get_color_rgb(fbx_props, b'Color', (0.8, 0.8, 0.8))
# ---- # ----
# Transformation # Transformation
...@@ -229,11 +225,12 @@ def blen_read_object(fbx_obj, object_data): ...@@ -229,11 +225,12 @@ def blen_read_object(fbx_obj, object_data):
pst_rot = elem_props_get_vector_3d(fbx_props, b'PostRotation', const_vector_zero_3d) pst_rot = elem_props_get_vector_3d(fbx_props, b'PostRotation', const_vector_zero_3d)
rot_ord = { rot_ord = {
0: 'XYZ', 0: 'XYZ',
1: 'XZY', 1: 'XYZ',
2: 'YZX', 2: 'XZY',
3: 'YXZ', 3: 'YZX',
4: 'ZXY', 4: 'YXZ',
5: 'ZYX', 5: 'ZXY',
6: 'ZYX',
}.get(elem_props_get_enum(fbx_props, b'RotationOrder', 0)) }.get(elem_props_get_enum(fbx_props, b'RotationOrder', 0))
else: else:
pre_rot = const_vector_zero_3d pre_rot = const_vector_zero_3d
...@@ -296,39 +293,100 @@ def blen_read_geom_layerinfo(fbx_layer): ...@@ -296,39 +293,100 @@ def blen_read_geom_layerinfo(fbx_layer):
) )
def blen_read_geom_uv(fbx_obj, mesh): def blen_read_geom_array_mapped_vert(
blen_data,
fbx_layer_data, fbx_layer_index,
fbx_layer_mapping, fbx_layer_ref,
stride, descr,
):
# TODO, generic mapping apply function
if fbx_layer_mapping == b'ByVertice':
if fbx_layer_ref == b'Direct':
assert(fbx_layer_index is None)
# TODO, more generic support for mapping types
for i, blen_data_item in enumerate(blen_data):
blen_data_item[:] = fbx_layer_data[(i * stride): (i * stride) + stride]
return True
else:
print("warning layer %r ref type unsupported: %r", (descr, fbx_layer_ref))
else:
print("warning layer %r mapping type unsupported: %r", (descr, fbx_layer_mapping))
return False
for uvlayer_id in (b'LayerElementUV',): def blen_read_geom_array_mapped_poly(
fbx_uvlayer = elem_find_first(fbx_obj, uvlayer_id) blen_data,
fbx_layer_data, fbx_layer_index,
fbx_layer_mapping, fbx_layer_ref,
stride, descr,
):
if fbx_layer_mapping == b'ByPolygonVertex':
if fbx_layer_ref == b'IndexToDirect':
assert(fbx_layer_index is not None)
for i, j in enumerate(fbx_layer_index):
blen_data[i][:] = fbx_layer_data[(j * stride): (j * stride) + stride]
return True
else:
print("warning layer %r ref type unsupported: %r", (descr, fbx_layer_ref))
else:
print("warning layer %r mapping type unsupported: %r", (descr, fbx_layer_mapping))
return False
if fbx_uvlayer is None:
def blen_read_geom_layer_uv(fbx_obj, mesh):
for layer_id in (b'LayerElementUV',):
fbx_layer = elem_find_first(fbx_obj, layer_id)
if fbx_layer is None:
continue continue
# all should be valid # all should be valid
(fbx_uvlayer_name, (fbx_layer_name,
fbx_uvlayer_mapping, fbx_layer_mapping,
fbx_uvlayer_ref, fbx_layer_ref,
) = blen_read_geom_layerinfo(fbx_uvlayer) ) = blen_read_geom_layerinfo(fbx_layer)
# print(fbx_uvlayer_name, fbx_uvlayer_mapping, fbx_uvlayer_ref) fbx_layer_data = elem_prop_first(elem_find_first(fbx_layer, b'UV'))
fbx_layer_index = elem_prop_first(elem_find_first(fbx_layer, b'UVIndex'))
fbx_layer_data = elem_prop_first(elem_find_first(fbx_uvlayer, b'UV'))
fbx_layer_index = elem_prop_first(elem_find_first(fbx_uvlayer, b'UVIndex')) uv_tex = mesh.uv_textures.new(name=fbx_layer_name)
uv_lay = mesh.uv_layers[fbx_layer_name]
# TODO, generic mappuing apply function blen_data = [luv.uv for luv in uv_lay.data]
if fbx_uvlayer_mapping == b'ByPolygonVertex':
if fbx_uvlayer_ref == b'IndexToDirect': blen_read_geom_array_mapped_poly(
# TODO, more generic support for mapping types blen_data,
uv_tex = mesh.uv_textures.new(name=fbx_uvlayer_name) fbx_layer_data, fbx_layer_index,
uv_lay = mesh.uv_layers[fbx_uvlayer_name] fbx_layer_mapping, fbx_layer_ref,
uv_data = [luv.uv for luv in uv_lay.data] 2, layer_id,
)
for i, j in enumerate(fbx_layer_index):
uv_data[i][:] = fbx_layer_data[(j * 2): (j * 2) + 2]
else: def blen_read_geom_layer_normal(fbx_obj, mesh):
print("warning uv layer ref type unsupported:", fbx_uvlayer_ref) fbx_layer = elem_find_first(fbx_obj, b'LayerElementNormal')
else:
print("warning uv layer mapping type unsupported:", fbx_uvlayer_mapping) if fbx_layer is None:
return False
(fbx_layer_name,
fbx_layer_mapping,
fbx_layer_ref,
) = blen_read_geom_layerinfo(fbx_layer)
layer_id = b'Normals'
fbx_layer_data = elem_prop_first(elem_find_first(fbx_layer, layer_id))
blen_data = [v.normal for v in mesh.vertices]
return blen_read_geom_array_mapped_vert(
blen_data,
fbx_layer_data, None,
fbx_layer_mapping, fbx_layer_ref,
3, layer_id,
)
def blen_read_geom(fbx_obj): def blen_read_geom(fbx_obj):
...@@ -370,10 +428,14 @@ def blen_read_geom(fbx_obj): ...@@ -370,10 +428,14 @@ def blen_read_geom(fbx_obj):
mesh.polygons.foreach_set("loop_start", poly_loop_starts) mesh.polygons.foreach_set("loop_start", poly_loop_starts)
mesh.polygons.foreach_set("loop_total", poly_loop_totals) mesh.polygons.foreach_set("loop_total", poly_loop_totals)
blen_read_geom_uv(fbx_obj, mesh) blen_read_geom_layer_uv(fbx_obj, mesh)
ok_normals = blen_read_geom_layer_normal(fbx_obj, mesh)
mesh.validate() mesh.validate()
mesh.calc_normals()
if not ok_normals:
mesh.calc_normals()
return mesh return mesh
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment