diff options
author | Bastien Montagne <montagne29@wanadoo.fr> | 2015-05-03 12:58:53 +0300 |
---|---|---|
committer | Bastien Montagne <montagne29@wanadoo.fr> | 2015-05-03 13:00:49 +0300 |
commit | e75551f7062c6ef3d2eee456492a7c6d6bc6aeb2 (patch) | |
tree | b70d372b3d8ee5b503749101b7b07dd32f99060b /io_mesh_stl/blender_utils.py | |
parent | b5afec7389dde946c18571675775b0cb8bf22124 (diff) |
Fix T44536: Add (limited!) normal import for STL.
Limited, because STL only stores face normals, so we can only fake this by setting
all clnors of a same face to that face normal... Guess use case are rather limited,
but does not hurt to have it either.
Diffstat (limited to 'io_mesh_stl/blender_utils.py')
-rw-r--r-- | io_mesh_stl/blender_utils.py | 26 |
1 files changed, 24 insertions, 2 deletions
diff --git a/io_mesh_stl/blender_utils.py b/io_mesh_stl/blender_utils.py index ff507b31..a5492d07 100644 --- a/io_mesh_stl/blender_utils.py +++ b/io_mesh_stl/blender_utils.py @@ -19,9 +19,11 @@ # <pep8 compliant> import bpy +import array +from itertools import chain -def create_and_link_mesh(name, faces, points, global_matrix): +def create_and_link_mesh(name, faces, face_nors, points, global_matrix): """ Create a blender mesh and object called name from a list of *points* and *faces* and link it in the current scene. @@ -29,10 +31,30 @@ def create_and_link_mesh(name, faces, points, global_matrix): mesh = bpy.data.meshes.new(name) mesh.from_pydata(points, [], faces) + + if face_nors: + # Note: we store 'temp' normals in loops, since validate() may alter final mesh, + # we can only set custom lnors *after* calling it. + mesh.create_normals_split() + lnors = tuple(chain(*chain(*zip(face_nors, face_nors, face_nors)))) + mesh.loops.foreach_set("normal", lnors) + mesh.transform(global_matrix) # update mesh to allow proper display - mesh.validate() + mesh.validate(clean_customdata=False) # *Very* important to not remove lnors here! + + if face_nors: + clnors = array.array('f', [0.0] * (len(mesh.loops) * 3)) + mesh.loops.foreach_get("normal", clnors) + + mesh.polygons.foreach_set("use_smooth", [True] * len(mesh.polygons)) + + mesh.normals_split_custom_set(tuple(zip(*(iter(clnors),) * 3))) + mesh.use_auto_smooth = True + mesh.show_edge_sharp = True + mesh.free_normals_split() + mesh.update() scene = bpy.context.scene |