[Bf-extensions-cvs] [7565f120] master: glTF importer: manage mode other than 4 (manage edges & points without faces)

Julien Duroure noreply at git.blender.org
Sat Aug 3 10:18:58 CEST 2019


Commit: 7565f120d54c9f68d4b15c3774d19bebf60a2c35
Author: Julien Duroure
Date:   Sat Aug 3 10:18:26 2019 +0200
Branches: master
https://developer.blender.org/rBA7565f120d54c9f68d4b15c3774d19bebf60a2c35

glTF importer: manage mode other than 4 (manage edges & points without faces)

===================================================================

M	io_scene_gltf2/__init__.py
M	io_scene_gltf2/blender/imp/gltf2_blender_primitive.py

===================================================================

diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index 321d7a69..28adcb8c 100755
--- a/io_scene_gltf2/__init__.py
+++ b/io_scene_gltf2/__init__.py
@@ -15,7 +15,7 @@
 bl_info = {
     'name': 'glTF 2.0 format',
     'author': 'Julien Duroure, Norbert Nopper, Urs Hanselmann, Moritz Becher, Benjamin Schmithüsen, Jim Eckerlein, and many external contributors',
-    "version": (0, 9, 39),
+    "version": (0, 9, 40),
     'blender': (2, 80, 0),
     'location': 'File > Import-Export',
     'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_primitive.py b/io_scene_gltf2/blender/imp/gltf2_blender_primitive.py
index ec74294f..0696673d 100755
--- a/io_scene_gltf2/blender/imp/gltf2_blender_primitive.py
+++ b/io_scene_gltf2/blender/imp/gltf2_blender_primitive.py
@@ -30,16 +30,12 @@ class BlenderPrimitive():
         """Primitive creation."""
         pyprimitive.blender_texcoord = {}
 
-        # TODO mode of primitive 4 for now.
         current_length = len(verts)
         pos = BinaryData.get_data_from_accessor(gltf, pyprimitive.attributes['POSITION'])
         if pyprimitive.indices is not None:
             indices = BinaryData.get_data_from_accessor(gltf, pyprimitive.indices)
         else:
-            indices = []
-            indices_ = range(0, len(pos))
-            for i in indices_:
-                indices.append((i,))
+            indices = [(i,) for i in range(len(pos))]
 
         pyprimitive.tmp_indices = indices
 
@@ -55,17 +51,19 @@ class BlenderPrimitive():
 
         prim_verts = [loc_gltf_to_blender(vert) for vert in new_pos]
 
-        pyprimitive.vertices_length = len(prim_verts)
+        mode = 4 if pyprimitive.mode is None else pyprimitive.mode
+        prim_edges, prim_faces = BlenderPrimitive.edges_and_faces(mode, indices)
+
         verts.extend(prim_verts)
-        prim_faces = []
-        for i in range(0, len(indices), 3):
-            vals = indices[i:i + 3]
-            new_vals = []
-            for y in vals:
-                new_vals.append(indice_equivalents[y[0]] + current_length)
-            prim_faces.append(tuple(new_vals))
-        faces.extend(prim_faces)
-        pyprimitive.faces_length = len(prim_faces)
+        pyprimitive.vertices_length = len(prim_verts)
+        edges.extend(
+            tuple(indice_equivalents[y] + current_length for y in e)
+            for e in prim_edges
+        )
+        faces.extend(
+            tuple(indice_equivalents[y] + current_length for y in f)
+            for f in prim_faces
+        )
 
         # manage material of primitive
         if pyprimitive.material is not None:
@@ -85,6 +83,80 @@ class BlenderPrimitive():
 
         return verts, edges, faces
 
+    @staticmethod
+    def edges_and_faces(mode, indices):
+        """Converts the indices in a particular primitive mode into standard lists of
+        edges (pairs of indices) and faces (tuples of CCW indices).
+        """
+        es = []
+        fs = []
+
+        if mode == 0:
+            # POINTS
+            pass
+        elif mode == 1:
+            # LINES
+            #   1   3
+            #  /   /
+            # 0   2
+            es = [
+                (indices[i][0], indices[i + 1][0])
+                for i in range(0, len(indices), 2)
+            ]
+        elif mode == 2:
+            # LINE LOOP
+            #   1---2
+            #  /     \
+            # 0-------3
+            es = [
+                (indices[i][0], indices[i + 1][0])
+                for i in range(0, len(indices) - 1)
+            ]
+            es.append((indices[-1][0], indices[0][0]))
+        elif mode == 3:
+            # LINE STRIP
+            #   1---2
+            #  /     \
+            # 0       3
+            es = [
+                (indices[i][0], indices[i + 1][0])
+                for i in range(0, len(indices) - 1)
+            ]
+        elif mode == 4:
+            # TRIANGLES
+            #   2     3
+            #  / \   / \
+            # 0---1 4---5
+            fs = [
+                (indices[i][0], indices[i + 1][0], indices[i + 2][0])
+                for i in range(0, len(indices), 3)
+            ]
+        elif mode == 5:
+            # TRIANGLE STRIP
+            # 0---2---4
+            #  \ / \ /
+            #   1---3
+            def alternate(i, xs):
+                even = i % 2 == 0
+                return xs if even else (xs[0], xs[2], xs[1])
+            fs = [
+                alternate(i, (indices[i][0], indices[i + 1][0], indices[i + 2][0]))
+                for i in range(0, len(indices) - 2)
+            ]
+        elif mode == 6:
+            # TRIANGLE FAN
+            #   3---2
+            #  / \ / \
+            # 4---0---1
+            fs = [
+                (indices[0][0], indices[i][0], indices[i + 1][0])
+                for i in range(1, len(indices) - 1)
+            ]
+        else:
+            raise Exception('primitive mode unimplemented: %d' % mode)
+
+        return es, fs
+
     def set_normals(gltf, pyprimitive, mesh, offset, custom_normals):
         """Set Normal."""
         if 'NORMAL' in pyprimitive.attributes.keys():



More information about the Bf-extensions-cvs mailing list