Selaa lähdekoodia

A missing bufferview was causing a crash.

Malcolm Tyrrell 4 vuotta sitten
vanhempi
commit
01b2088dd3
1 muutettua tiedostoa jossa 24 lisäystä ja 9 poistoa
  1. 24 9
      code/AssetLib/glTF2/glTF2Asset.inl

+ 24 - 9
code/AssetLib/glTF2/glTF2Asset.inl

@@ -289,7 +289,8 @@ Ref<T> LazyDict<T>::Retrieve(unsigned int i) {
 
     // Unique ptr prevents memory leak in case of Read throws an exception
     auto inst = std::unique_ptr<T>(new T());
-    inst->id = std::string(mDictId) + "_" + to_string(i);
+    // Try to make this human readable so it can be used in error messages.
+    inst->id = std::string(mDictId) + "[" + to_string(i) + "]";
     inst->oIndex = i;
     ReadMember(obj, "name", inst->name);
     inst->Read(obj, mAsset);
@@ -637,15 +638,18 @@ inline void Accessor::Read(Value &obj, Asset &r) {
     const char *typestr;
     type = ReadMember(obj, "type", typestr) ? AttribType::FromString(typestr) : AttribType::SCALAR;
 
-    // Check length
-    unsigned long long byteLength = (unsigned long long)GetBytesPerComponent() * (unsigned long long)count;
-    if ((byteOffset + byteLength) > bufferView->byteLength || (bufferView->byteOffset + byteOffset + byteLength) > bufferView->buffer->byteLength) {
-        const uint8_t val_size = 64;
+    if (bufferView)
+    {
+        // Check length
+        unsigned long long byteLength = (unsigned long long)GetBytesPerComponent() * (unsigned long long)count;
+        if ((byteOffset + byteLength) > bufferView->byteLength || (bufferView->byteOffset + byteOffset + byteLength) > bufferView->buffer->byteLength) {
+            const uint8_t val_size = 64;
 
-        char val[val_size];
+            char val[val_size];
 
-        ai_snprintf(val, val_size, "%llu, %llu", (unsigned long long)byteOffset, (unsigned long long)byteLength);
-        throw DeadlyImportError("GLTF: Accessor with offset/length (", val, ") is out of range.");
+            ai_snprintf(val, val_size, "%llu, %llu", (unsigned long long)byteOffset, (unsigned long long)byteLength);
+            throw DeadlyImportError("GLTF: Accessor with offset/length (", val, ") is out of range.");
+        }
     }
 
     if (Value *sparseValue = FindObject(obj, "sparse")) {
@@ -737,13 +741,24 @@ inline void CopyData(size_t count,
         }
     }
 }
+
+inline std::string getContextForErrorMessages(const std::string& id, const std::string& name)
+{
+    std::string context = id;
+    if (!name.empty())
+    {
+        context += " (\"" + name + "\")";
+    }
+    return context;
+}
+
 } // namespace
 
 template <class T>
 void Accessor::ExtractData(T *&outData) {
     uint8_t *data = GetPointer();
     if (!data) {
-        throw DeadlyImportError("GLTF2: data is nullptr.");
+        throw DeadlyImportError("GLTF2: data is nullptr when extracting data from ", getContextForErrorMessages(id, name));
     }
 
     const size_t elemSize = GetElementSize();