Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender-addons.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'io_mesh_stl/blender_utils.py')
-rw-r--r--io_mesh_stl/blender_utils.py26
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