From a1dbf26e376ce6b7772c46eb68365008ec144bf9 Mon Sep 17 00:00:00 2001
From: Julien Duroure <julien.duroure@gmail.com>
Date: Tue, 8 Oct 2019 22:02:44 +0200
Subject: [PATCH] glTF importer: check that primitive exists (some invalid glTF
 files don't have any)

---
 io_scene_gltf2/__init__.py                    |  2 +-
 .../blender/imp/gltf2_blender_gltf.py         | 42 ++++++++++---------
 2 files changed, 23 insertions(+), 21 deletions(-)

diff --git a/io_scene_gltf2/__init__.py b/io_scene_gltf2/__init__.py
index 6bd62dd55..8fe1a4c59 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": (1, 0, 1),
+    "version": (1, 0, 2),
     'blender': (2, 81, 6),
     'location': 'File > Import-Export',
     'description': 'Import-Export as glTF 2.0',
diff --git a/io_scene_gltf2/blender/imp/gltf2_blender_gltf.py b/io_scene_gltf2/blender/imp/gltf2_blender_gltf.py
index 6d2181fc6..5904a9749 100755
--- a/io_scene_gltf2/blender/imp/gltf2_blender_gltf.py
+++ b/io_scene_gltf2/blender/imp/gltf2_blender_gltf.py
@@ -282,27 +282,29 @@ class BlenderGlTF():
             mesh.shapekey_names = []
             used_names = set()
 
-            for sk, target in enumerate(mesh.primitives[0].targets or []):
-                if 'POSITION' not in target:
-                    mesh.shapekey_names.append(None)
-                    continue
+            # Some invalid glTF files has empty primitive tab
+            if len(mesh.primitives) > 0:
+                for sk, target in enumerate(mesh.primitives[0].targets or []):
+                    if 'POSITION' not in target:
+                        mesh.shapekey_names.append(None)
+                        continue
 
-                # Check if glTF file has some extras with targetNames. Otherwise
-                # use the name of the POSITION accessor on the first primitive.
-                shapekey_name = None
-                if mesh.extras is not None:
-                    if 'targetNames' in mesh.extras and sk < len(mesh.extras['targetNames']):
-                        shapekey_name = mesh.extras['targetNames'][sk]
-                if shapekey_name is None:
-                    if gltf.data.accessors[target['POSITION']].name is not None:
-                        shapekey_name = gltf.data.accessors[target['POSITION']].name
-                if shapekey_name is None:
-                    shapekey_name = "target_" + str(sk)
-
-                shapekey_name = BlenderGlTF.find_unused_name(used_names, shapekey_name)
-                used_names.add(shapekey_name)
-
-                mesh.shapekey_names.append(shapekey_name)
+                    # Check if glTF file has some extras with targetNames. Otherwise
+                    # use the name of the POSITION accessor on the first primitive.
+                    shapekey_name = None
+                    if mesh.extras is not None:
+                        if 'targetNames' in mesh.extras and sk < len(mesh.extras['targetNames']):
+                            shapekey_name = mesh.extras['targetNames'][sk]
+                    if shapekey_name is None:
+                        if gltf.data.accessors[target['POSITION']].name is not None:
+                            shapekey_name = gltf.data.accessors[target['POSITION']].name
+                    if shapekey_name is None:
+                        shapekey_name = "target_" + str(sk)
+
+                    shapekey_name = BlenderGlTF.find_unused_name(used_names, shapekey_name)
+                    used_names.add(shapekey_name)
+
+                    mesh.shapekey_names.append(shapekey_name)
 
     @staticmethod
     def find_unused_name(haystack, desired_name):
-- 
GitLab