diff --git a/code/glTFAsset.h b/code/glTFAsset.h index c7045a609..f2d375c6b 100644 --- a/code/glTFAsset.h +++ b/code/glTFAsset.h @@ -355,6 +355,10 @@ namespace glTF { return false; } virtual ~Object() {} + + //! Maps special IDs to another ID, where needed. Subclasses may override it (statically) + static const char* TranslateId(Asset& r, const char* id) + { return id; } }; @@ -484,6 +488,8 @@ namespace glTF bool IsSpecial() const { return mIsSpecial; } + + static const char* TranslateId(Asset& r, const char* id); }; @@ -766,7 +772,7 @@ namespace glTF //! (Implemented in glTFAssetWriter.h) template void WriteLazyDict(LazyDict& d, AssetWriter& w); - + //! Manages lazy loading of the glTF top-level objects, and keeps a reference to them by ID //! It is the owner the loaded objects, so when it is destroyed it also deletes them diff --git a/code/glTFAsset.inl b/code/glTFAsset.inl index 168de1dad..6bfe288d3 100644 --- a/code/glTFAsset.inl +++ b/code/glTFAsset.inl @@ -184,6 +184,8 @@ Ref LazyDict::Get(unsigned int i) template Ref LazyDict::Get(const char* id) { + id = T::TranslateId(mAsset, id); + typename Dict::iterator it = mObjsById.find(id); if (it != mObjsById.end()) { // already created? return Ref(mObjs, it->second); @@ -191,7 +193,7 @@ Ref LazyDict::Get(const char* id) // read it from the JSON object if (!mDict) { - return Ref(); // section is missing + throw DeadlyImportError("GLTF: Missing section \"" + std::string(mDictId) + "\""); } Value::MemberIterator obj = mDict->FindMember(id); @@ -242,6 +244,15 @@ inline Buffer::Buffer() : byteLength(0), type(Type_arraybuffer), mIsSpecial(false) { } +inline const char* Buffer::TranslateId(Asset& r, const char* id) +{ + // Compatibility with old spec + if (r.extensionsUsed.KHR_binary_glTF && strcmp(id, "KHR_binary_glTF") == 0) { + return "binary_glTF"; + } + + return id; +} inline void Buffer::Read(Value& obj, Asset& r) { @@ -266,10 +277,16 @@ inline void Buffer::Read(Value& obj, Asset& r) this->mData.reset(data); if (statedLength > 0 && this->byteLength != statedLength) { - throw DeadlyImportError("GLTF: buffer length mismatch"); + throw DeadlyImportError("GLTF: buffer \"" + id + "\", expected " + std::to_string(statedLength) + + " bytes, but found " + std::to_string(dataURI.dataLength)); } } else { // assume raw data + if (statedLength != dataURI.dataLength) { + throw DeadlyImportError("GLTF: buffer \"" + id + "\", expected " + std::to_string(statedLength) + + " bytes, but found " + std::to_string(dataURI.dataLength)); + } + this->mData.reset(new uint8_t[dataURI.dataLength]); memcmp(dataURI.data, this->mData.get(), dataURI.dataLength); } @@ -589,14 +606,16 @@ inline void Material::Read(Value& material, Asset& r) else if (strcmp(t, "CONSTANT") == 0) technique = Technique_CONSTANT; } - ReadMaterialProperty(r, *ext, "ambient", this->ambient); - ReadMaterialProperty(r, *ext, "diffuse", this->diffuse); - ReadMaterialProperty(r, *ext, "specular", this->specular); + if (Value* values = FindObject(*ext, "values")) { + ReadMaterialProperty(r, *values, "ambient", this->ambient); + ReadMaterialProperty(r, *values, "diffuse", this->diffuse); + ReadMaterialProperty(r, *values, "specular", this->specular); - ReadMember(*ext, "doubleSided", doubleSided); - ReadMember(*ext, "transparent", transparent); - ReadMember(*ext, "transparency", transparency); - ReadMember(*ext, "shininess", shininess); + ReadMember(*values, "doubleSided", doubleSided); + ReadMember(*values, "transparent", transparent); + ReadMember(*values, "transparency", transparency); + ReadMember(*values, "shininess", shininess); + } } } } diff --git a/code/glTFImporter.cpp b/code/glTFImporter.cpp index a17076d63..6a6619b81 100644 --- a/code/glTFImporter.cpp +++ b/code/glTFImporter.cpp @@ -214,14 +214,14 @@ void glTFImporter::ImportMaterials(glTF::Asset& r) } -inline void SetFace(aiFace& face, int a) +static inline void SetFace(aiFace& face, int a) { face.mNumIndices = 1; face.mIndices = new unsigned int[1]; face.mIndices[0] = a; } -inline void SetFace(aiFace& face, int a, int b) +static inline void SetFace(aiFace& face, int a, int b) { face.mNumIndices = 2; face.mIndices = new unsigned int[2]; @@ -229,7 +229,7 @@ inline void SetFace(aiFace& face, int a, int b) face.mIndices[1] = b; } -inline void SetFace(aiFace& face, int a, int b, int c) +static inline void SetFace(aiFace& face, int a, int b, int c) { face.mNumIndices = 3; face.mIndices = new unsigned int[3]; @@ -238,6 +238,18 @@ inline void SetFace(aiFace& face, int a, int b, int c) face.mIndices[2] = c; } +static inline bool CheckValidFacesIndices(aiFace* faces, unsigned nFaces, unsigned nVerts) +{ + for (unsigned i = 0; i < nFaces; ++i) { + for (unsigned j = 0; j < faces[i].mNumIndices; ++j) { + unsigned idx = faces[i].mIndices[j]; + if (idx >= nVerts) + return false; + } + } + return true; +} + void glTFImporter::ImportMeshes(glTF::Asset& r) { std::vector meshes; @@ -294,6 +306,11 @@ void glTFImporter::ImportMeshes(glTF::Asset& r) for (size_t tc = 0; tc < attr.texcoord.size() && tc <= AI_MAX_NUMBER_OF_TEXTURECOORDS; ++tc) { attr.texcoord[tc]->ExtractData(aim->mTextureCoords[tc]); aim->mNumUVComponents[tc] = attr.texcoord[tc]->GetNumComponents(); + + aiVector3D* values = aim->mTextureCoords[tc]; + for (unsigned int i = 0; i < aim->mNumVertices; ++i) { + values[i].y = 1 - values[i].y; // Flip Y coords + } } @@ -304,7 +321,7 @@ void glTFImporter::ImportMeshes(glTF::Asset& r) unsigned int count = prim.indices->count; Accessor::Indexer data = prim.indices->GetIndexer(); - assert(data.IsValid()); + ai_assert(data.IsValid()); switch (prim.mode) { case PrimitiveMode_POINTS: { @@ -369,6 +386,7 @@ void glTFImporter::ImportMeshes(glTF::Asset& r) if (faces) { aim->mFaces = faces; aim->mNumFaces = nFaces; + ai_assert(CheckValidFacesIndices(faces, nFaces, aim->mNumVertices)); } } @@ -466,7 +484,7 @@ aiNode* ImportNode(aiScene* pScene, glTF::Asset& r, std::vector& m } } - aiMatrix4x4 matrix = ainode->mTransformation; + aiMatrix4x4& matrix = ainode->mTransformation; if (node.matrix.isPresent) { CopyValue(node.matrix.value, matrix); } diff --git a/test/models/glTF/BoxTextured-glTF-Binary/BoxTextured.glb b/test/models/glTF/BoxTextured-glTF-Binary/BoxTextured.glb new file mode 100644 index 000000000..f2ddc024c Binary files /dev/null and b/test/models/glTF/BoxTextured-glTF-Binary/BoxTextured.glb differ diff --git a/test/models/glTF/BoxTextured-glTF-Embedded/BoxTextured.gltf b/test/models/glTF/BoxTextured-glTF-Embedded/BoxTextured.gltf new file mode 100644 index 000000000..3554d4289 --- /dev/null +++ b/test/models/glTF/BoxTextured-glTF-Embedded/BoxTextured.gltf @@ -0,0 +1,339 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_29", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + "accessor_23": { + "bufferView": "bufferView_30", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_30", + "byteOffset": 288, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + "accessor_27": { + "bufferView": "bufferView_30", + "byteOffset": 576, + "byteStride": 8, + "componentType": 5126, + "count": 24, + "max": [ + 6, + 1 + ], + "min": [ + 0, + 0 + ], + "type": "VEC2" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@027f74366341d569dea42e9a68b7104cc3892054", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_29": { + "buffer": "BoxTextured", + "byteLength": 72, + "byteOffset": 0, + "target": 34963 + }, + "bufferView_30": { + "buffer": "BoxTextured", + "byteLength": 768, + "byteOffset": 72, + "target": 34962 + } + }, + "buffers": { + "BoxTextured": { + "byteLength": 840, + "type": "arraybuffer", + "uri": "data:application/octet-stream;base64,AAABAAIAAwACAAEABAAFAAYABwAGAAUACAAJAAoACwAKAAkADAANAA4ADwAOAA0AEAARABIAEwASABEAFAAVABYAFwAWABUAAAAAvwAAAL8AAAA/AAAAPwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAPwAAAL8AAAA/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAvwAAAD8AAAA/AAAAPwAAAD8AAAA/AAAAvwAAAD8AAAC/AAAAPwAAAD8AAAC/AAAAPwAAAL8AAAA/AAAAvwAAAL8AAAA/AAAAPwAAAL8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAL8AAAA/AAAAvwAAAD8AAAA/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAvwAAAL8AAAC/AAAAvwAAAD8AAAC/AAAAPwAAAL8AAAC/AAAAPwAAAD8AAAC/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AAAAAAAAAAAAAIA/AACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAACAPwAAAAAAAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgD8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAAAAAAAAgL8AAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAACAvwAAAAAAAAAAAAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AAAAAAAAAAAAAIC/AADAQAAAAAAAAKBAAAAAAAAAwED+/38/AACgQP7/fz8AAIBAAAAAAAAAoEAAAAAAAACAQAAAgD8AAKBAAACAPwAAAEAAAAAAAACAPwAAAAAAAABAAACAPwAAgD8AAIA/AABAQAAAAAAAAIBAAAAAAAAAQEAAAIA/AACAQAAAgD8AAEBAAAAAAAAAAEAAAAAAAABAQAAAgD8AAABAAACAPwAAAAAAAAAAAAAAAP7/fz8AAIA/AAAAAAAAgD/+/38/" + } + }, + "images": { + "Image0001": { + "name": "Image0001", + "uri": "data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAANMAAADTCAIAAACUZbGOAAAACXBIWXMAAAsTAAALEwEAmpwYAAA4JmlUWHRYTUw6Y29tLmFkb2JlLnhtcAAAAAAAPD94cGFja2V0IGJlZ2luPSLvu78iIGlkPSJXNU0wTXBDZWhpSHpyZVN6TlRjemtjOWQiPz4KPHg6eG1wbWV0YSB4bWxuczp4PSJhZG9iZTpuczptZXRhLyIgeDp4bXB0az0iQWRvYmUgWE1QIENvcmUgNS42LWMwMTQgNzkuMTU2Nzk3LCAyMDE0LzA4LzIwLTA5OjUzOjAyICAgICAgICAiPgogICA8cmRmOlJERiB4bWxuczpyZGY9Imh0dHA6Ly93d3cudzMub3JnLzE5OTkvMDIvMjItcmRmLXN5bnRheC1ucyMiPgogICAgICA8cmRmOkRlc2NyaXB0aW9uIHJkZjphYm91dD0iIgogICAgICAgICAgICB4bWxuczp4bXA9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmRjPSJodHRwOi8vcHVybC5vcmcvZGMvZWxlbWVudHMvMS4xLyIKICAgICAgICAgICAgeG1sbnM6cGhvdG9zaG9wPSJodHRwOi8vbnMuYWRvYmUuY29tL3Bob3Rvc2hvcC8xLjAvIgogICAgICAgICAgICB4bWxuczp4bXBNTT0iaHR0cDovL25zLmFkb2JlLmNvbS94YXAvMS4wL21tLyIKICAgICAgICAgICAgeG1sbnM6c3RFdnQ9Imh0dHA6Ly9ucy5hZG9iZS5jb20veGFwLzEuMC9zVHlwZS9SZXNvdXJjZUV2ZW50IyIKICAgICAgICAgICAgeG1sbnM6dGlmZj0iaHR0cDovL25zLmFkb2JlLmNvbS90aWZmLzEuMC8iCiAgICAgICAgICAgIHhtbG5zOmV4aWY9Imh0dHA6Ly9ucy5hZG9iZS5jb20vZXhpZi8xLjAvIj4KICAgICAgICAgPHhtcDpDcmVhdG9yVG9vbD5BZG9iZSBQaG90b3Nob3AgQ0MgMjAxNCAoV2luZG93cyk8L3htcDpDcmVhdG9yVG9vbD4KICAgICAgICAgPHhtcDpDcmVhdGVEYXRlPjIwMTUtMDMtMDJUMDg6NDc6NTQtMDU6MDA8L3htcDpDcmVhdGVEYXRlPgogICAgICAgICA8eG1wOk1vZGlmeURhdGU+MjAxNS0wMy0wMlQwODo1MTo1Mi0wNTowMDwveG1wOk1vZGlmeURhdGU+CiAgICAgICAgIDx4bXA6TWV0YWRhdGFEYXRlPjIwMTUtMDMtMDJUMDg6NTE6NTItMDU6MDA8L3htcDpNZXRhZGF0YURhdGU+CiAgICAgICAgIDxkYzpmb3JtYXQ+aW1hZ2UvcG5nPC9kYzpmb3JtYXQ+CiAgICAgICAgIDxwaG90b3Nob3A6Q29sb3JNb2RlPjM8L3Bob3Rvc2hvcDpDb2xvck1vZGU+CiAgICAgICAgIDx4bXBNTTpJbnN0YW5jZUlEPnhtcC5paWQ6ZmFhN2VhN2MtN2ZlZS0yZTQ3LWExNmUtMGVjNTc2YTkzZmY2PC94bXBNTTpJbnN0YW5jZUlEPgogICAgICAgICA8eG1wTU06RG9jdW1lbnRJRD54bXAuZGlkOmZhYTdlYTdjLTdmZWUtMmU0Ny1hMTZlLTBlYzU3NmE5M2ZmNjwveG1wTU06RG9jdW1lbnRJRD4KICAgICAgICAgPHhtcE1NOk9yaWdpbmFsRG9jdW1lbnRJRD54bXAuZGlkOmZhYTdlYTdjLTdmZWUtMmU0Ny1hMTZlLTBlYzU3NmE5M2ZmNjwveG1wTU06T3JpZ2luYWxEb2N1bWVudElEPgogICAgICAgICA8eG1wTU06SGlzdG9yeT4KICAgICAgICAgICAgPHJkZjpTZXE+CiAgICAgICAgICAgICAgIDxyZGY6bGkgcmRmOnBhcnNlVHlwZT0iUmVzb3VyY2UiPgogICAgICAgICAgICAgICAgICA8c3RFdnQ6YWN0aW9uPmNyZWF0ZWQ8L3N0RXZ0OmFjdGlvbj4KICAgICAgICAgICAgICAgICAgPHN0RXZ0Omluc3RhbmNlSUQ+eG1wLmlpZDpmYWE3ZWE3Yy03ZmVlLTJlNDctYTE2ZS0wZWM1NzZhOTNmZjY8L3N0RXZ0Omluc3RhbmNlSUQ+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDp3aGVuPjIwMTUtMDMtMDJUMDg6NDc6NTQtMDU6MDA8L3N0RXZ0OndoZW4+CiAgICAgICAgICAgICAgICAgIDxzdEV2dDpzb2Z0d2FyZUFnZW50PkFkb2JlIFBob3Rvc2hvcCBDQyAyMDE0IChXaW5kb3dzKTwvc3RFdnQ6c29mdHdhcmVBZ2VudD4KICAgICAgICAgICAgICAgPC9yZGY6bGk+CiAgICAgICAgICAgIDwvcmRmOlNlcT4KICAgICAgICAgPC94bXBNTTpIaXN0b3J5PgogICAgICAgICA8dGlmZjpPcmllbnRhdGlvbj4xPC90aWZmOk9yaWVudGF0aW9uPgogICAgICAgICA8dGlmZjpYUmVzb2x1dGlvbj43MjAwMDAvMTAwMDA8L3RpZmY6WFJlc29sdXRpb24+CiAgICAgICAgIDx0aWZmOllSZXNvbHV0aW9uPjcyMDAwMC8xMDAwMDwvdGlmZjpZUmVzb2x1dGlvbj4KICAgICAgICAgPHRpZmY6UmVzb2x1dGlvblVuaXQ+MjwvdGlmZjpSZXNvbHV0aW9uVW5pdD4KICAgICAgICAgPGV4aWY6Q29sb3JTcGFjZT42NTUzNTwvZXhpZjpDb2xvclNwYWNlPgogICAgICAgICA8ZXhpZjpQaXhlbFhEaW1lbnNpb24+MjExPC9leGlmOlBpeGVsWERpbWVuc2lvbj4KICAgICAgICAgPGV4aWY6UGl4ZWxZRGltZW5zaW9uPjIxMTwvZXhpZjpQaXhlbFlEaW1lbnNpb24+CiAgICAgIDwvcmRmOkRlc2NyaXB0aW9uPgogICA8L3JkZjpSREY+CjwveDp4bXBtZXRhPgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAg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" + } + }, + "materials": { + "Effect-Texture": { + "name": "Texture", + "technique": "technique0", + "values": { + "diffuse": "texture_Image0001", + "shininess": 256, + "specular": [ + 0.2, + 0.2, + 0.2, + 1 + ] + } + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23", + "TEXCOORD_0": "accessor_27" + }, + "indices": "accessor_21", + "material": "Effect-Texture", + "mode": 4 + } + ] + } + }, + "nodes": { + "Geometry-mesh002Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "meshes": [ + "Geometry-mesh002" + ], + "name": "Mesh" + }, + "groupLocator030Node": { + "children": [ + "txtrLocator026Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Texture_Group" + }, + "node_3": { + "children": [ + "Geometry-mesh002Node", + "groupLocator030Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Y_UP_Transform" + }, + "txtrLocator026Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Cesium_Logo_Flat__Image___Texture_" + } + }, + "programs": { + "program_0": { + "attributes": [ + "a_normal", + "a_position", + "a_texcoord0" + ], + "fragmentShader": "BoxTextured0FS", + "vertexShader": "BoxTextured0VS" + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "node_3" + ] + } + }, + "shaders": { + "BoxTextured0FS": { + "type": 35632, + "uri": "data:text/plain;base64,cHJlY2lzaW9uIGhpZ2hwIGZsb2F0Owp2YXJ5aW5nIHZlYzMgdl9ub3JtYWw7CnZhcnlpbmcgdmVjMiB2X3RleGNvb3JkMDsKdW5pZm9ybSBzYW1wbGVyMkQgdV9kaWZmdXNlOwp1bmlmb3JtIHZlYzQgdV9zcGVjdWxhcjsKdW5pZm9ybSBmbG9hdCB1X3NoaW5pbmVzczsKdm9pZCBtYWluKHZvaWQpIHsKdmVjMyBub3JtYWwgPSBub3JtYWxpemUodl9ub3JtYWwpOwp2ZWM0IGNvbG9yID0gdmVjNCgwLiwgMC4sIDAuLCAwLik7CnZlYzQgZGlmZnVzZSA9IHZlYzQoMC4sIDAuLCAwLiwgMS4pOwp2ZWM0IHNwZWN1bGFyOwpkaWZmdXNlID0gdGV4dHVyZTJEKHVfZGlmZnVzZSwgdl90ZXhjb29yZDApOwpzcGVjdWxhciA9IHVfc3BlY3VsYXI7CmRpZmZ1c2UueHl6ICo9IG1heChkb3Qobm9ybWFsLHZlYzMoMC4sMC4sMS4pKSwgMC4pOwpjb2xvci54eXogKz0gZGlmZnVzZS54eXo7CmNvbG9yID0gdmVjNChjb2xvci5yZ2IgKiBkaWZmdXNlLmEsIGRpZmZ1c2UuYSk7CmdsX0ZyYWdDb2xvciA9IGNvbG9yOwp9Cg==" + }, + "BoxTextured0VS": { + "type": 35633, + "uri": "data:text/plain;base64,cHJlY2lzaW9uIGhpZ2hwIGZsb2F0OwphdHRyaWJ1dGUgdmVjMyBhX3Bvc2l0aW9uOwphdHRyaWJ1dGUgdmVjMyBhX25vcm1hbDsKdmFyeWluZyB2ZWMzIHZfbm9ybWFsOwp1bmlmb3JtIG1hdDMgdV9ub3JtYWxNYXRyaXg7CnVuaWZvcm0gbWF0NCB1X21vZGVsVmlld01hdHJpeDsKdW5pZm9ybSBtYXQ0IHVfcHJvamVjdGlvbk1hdHJpeDsKYXR0cmlidXRlIHZlYzIgYV90ZXhjb29yZDA7CnZhcnlpbmcgdmVjMiB2X3RleGNvb3JkMDsKdm9pZCBtYWluKHZvaWQpIHsKdmVjNCBwb3MgPSB1X21vZGVsVmlld01hdHJpeCAqIHZlYzQoYV9wb3NpdGlvbiwxLjApOwp2X25vcm1hbCA9IHVfbm9ybWFsTWF0cml4ICogYV9ub3JtYWw7CnZfdGV4Y29vcmQwID0gYV90ZXhjb29yZDA7CmdsX1Bvc2l0aW9uID0gdV9wcm9qZWN0aW9uTWF0cml4ICogcG9zOwp9Cg==" + } + }, + "skins": {}, + "techniques": { + "technique0": { + "attributes": { + "a_normal": "normal", + "a_position": "position", + "a_texcoord0": "texcoord0" + }, + "parameters": { + "diffuse": { + "type": 35678 + }, + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "shininess": { + "type": 5126 + }, + "specular": { + "type": 35666 + }, + "texcoord0": { + "semantic": "TEXCOORD_0", + "type": 35664 + } + }, + "program": "program_0", + "states": { + "enable": [ + 2929, + 2884 + ] + }, + "uniforms": { + "u_diffuse": "diffuse", + "u_modelViewMatrix": "modelViewMatrix", + "u_normalMatrix": "normalMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_shininess": "shininess", + "u_specular": "specular" + } + } + }, + "textures": { + "texture_Image0001": { + "format": 6408, + "internalFormat": 6408, + "sampler": "sampler_0", + "source": "Image0001", + "target": 3553, + "type": 5121 + } + } +} \ No newline at end of file diff --git a/test/models/glTF/BoxTextured-glTF-MaterialsCommon/BoxTextured.bin b/test/models/glTF/BoxTextured-glTF-MaterialsCommon/BoxTextured.bin new file mode 100644 index 000000000..79f5db410 Binary files /dev/null and b/test/models/glTF/BoxTextured-glTF-MaterialsCommon/BoxTextured.bin differ diff --git a/test/models/glTF/BoxTextured-glTF-MaterialsCommon/BoxTextured.gltf b/test/models/glTF/BoxTextured-glTF-MaterialsCommon/BoxTextured.gltf new file mode 100644 index 000000000..b3f483e9c --- /dev/null +++ b/test/models/glTF/BoxTextured-glTF-MaterialsCommon/BoxTextured.gltf @@ -0,0 +1,269 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_29", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + "accessor_23": { + "bufferView": "bufferView_30", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_30", + "byteOffset": 288, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + "accessor_27": { + "bufferView": "bufferView_30", + "byteOffset": 576, + "byteStride": 8, + "componentType": 5126, + "count": 24, + "max": [ + 6, + 1 + ], + "min": [ + 0, + 0 + ], + "type": "VEC2" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@027f74366341d569dea42e9a68b7104cc3892054", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_29": { + "buffer": "BoxTextured", + "byteLength": 72, + "byteOffset": 0, + "target": 34963 + }, + "bufferView_30": { + "buffer": "BoxTextured", + "byteLength": 768, + "byteOffset": 72, + "target": 34962 + } + }, + "buffers": { + "BoxTextured": { + "byteLength": 840, + "type": "arraybuffer", + "uri": "BoxTextured.bin" + } + }, + "extensionsUsed": [ + "KHR_materials_common" + ], + "images": { + "Image0001": { + "name": "Image0001", + "uri": "CesiumLogoFlat.png" + } + }, + "materials": { + "Effect-Texture": { + "extensions": { + "KHR_materials_common": { + "doubleSided": false, + "jointCount": 0, + "technique": "PHONG", + "transparent": false, + "values": { + "diffuse": "texture_Image0001", + "shininess": 256, + "specular": [ + 0.2, + 0.2, + 0.2, + 1 + ] + } + } + }, + "name": "Texture" + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23", + "TEXCOORD_0": "accessor_27" + }, + "indices": "accessor_21", + "material": "Effect-Texture", + "mode": 4 + } + ] + } + }, + "nodes": { + "Geometry-mesh002Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "meshes": [ + "Geometry-mesh002" + ], + "name": "Mesh" + }, + "groupLocator030Node": { + "children": [ + "txtrLocator026Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Texture_Group" + }, + "node_3": { + "children": [ + "Geometry-mesh002Node", + "groupLocator030Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Y_UP_Transform" + }, + "txtrLocator026Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Cesium_Logo_Flat__Image___Texture_" + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "node_3" + ] + } + }, + "skins": {}, + "textures": { + "texture_Image0001": { + "format": 6408, + "internalFormat": 6408, + "sampler": "sampler_0", + "source": "Image0001", + "target": 3553, + "type": 5121 + } + } +} \ No newline at end of file diff --git a/test/models/glTF/BoxTextured-glTF-MaterialsCommon/CesiumLogoFlat.png b/test/models/glTF/BoxTextured-glTF-MaterialsCommon/CesiumLogoFlat.png new file mode 100644 index 000000000..88bada374 Binary files /dev/null and b/test/models/glTF/BoxTextured-glTF-MaterialsCommon/CesiumLogoFlat.png differ diff --git a/test/models/glTF/BoxTextured-glTF/BoxTextured.bin b/test/models/glTF/BoxTextured-glTF/BoxTextured.bin new file mode 100644 index 000000000..79f5db410 Binary files /dev/null and b/test/models/glTF/BoxTextured-glTF/BoxTextured.bin differ diff --git a/test/models/glTF/BoxTextured-glTF/BoxTextured.gltf b/test/models/glTF/BoxTextured-glTF/BoxTextured.gltf new file mode 100644 index 000000000..c80476823 --- /dev/null +++ b/test/models/glTF/BoxTextured-glTF/BoxTextured.gltf @@ -0,0 +1,339 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_29", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + "accessor_23": { + "bufferView": "bufferView_30", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_30", + "byteOffset": 288, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + }, + "accessor_27": { + "bufferView": "bufferView_30", + "byteOffset": 576, + "byteStride": 8, + "componentType": 5126, + "count": 24, + "max": [ + 6, + 1 + ], + "min": [ + 0, + 0 + ], + "type": "VEC2" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@027f74366341d569dea42e9a68b7104cc3892054", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_29": { + "buffer": "BoxTextured", + "byteLength": 72, + "byteOffset": 0, + "target": 34963 + }, + "bufferView_30": { + "buffer": "BoxTextured", + "byteLength": 768, + "byteOffset": 72, + "target": 34962 + } + }, + "buffers": { + "BoxTextured": { + "byteLength": 840, + "type": "arraybuffer", + "uri": "BoxTextured.bin" + } + }, + "images": { + "Image0001": { + "name": "Image0001", + "uri": "CesiumLogoFlat.png" + } + }, + "materials": { + "Effect-Texture": { + "name": "Texture", + "technique": "technique0", + "values": { + "diffuse": "texture_Image0001", + "shininess": 256, + "specular": [ + 0.2, + 0.2, + 0.2, + 1 + ] + } + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23", + "TEXCOORD_0": "accessor_27" + }, + "indices": "accessor_21", + "material": "Effect-Texture", + "mode": 4 + } + ] + } + }, + "nodes": { + "Geometry-mesh002Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "meshes": [ + "Geometry-mesh002" + ], + "name": "Mesh" + }, + "groupLocator030Node": { + "children": [ + "txtrLocator026Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Texture_Group" + }, + "node_3": { + "children": [ + "Geometry-mesh002Node", + "groupLocator030Node" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Y_UP_Transform" + }, + "txtrLocator026Node": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Cesium_Logo_Flat__Image___Texture_" + } + }, + "programs": { + "program_0": { + "attributes": [ + "a_normal", + "a_position", + "a_texcoord0" + ], + "fragmentShader": "BoxTextured0FS", + "vertexShader": "BoxTextured0VS" + } + }, + "samplers": { + "sampler_0": { + "magFilter": 9729, + "minFilter": 9987, + "wrapS": 10497, + "wrapT": 10497 + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "node_3" + ] + } + }, + "shaders": { + "BoxTextured0FS": { + "type": 35632, + "uri": "BoxTextured0FS.glsl" + }, + "BoxTextured0VS": { + "type": 35633, + "uri": "BoxTextured0VS.glsl" + } + }, + "skins": {}, + "techniques": { + "technique0": { + "attributes": { + "a_normal": "normal", + "a_position": "position", + "a_texcoord0": "texcoord0" + }, + "parameters": { + "diffuse": { + "type": 35678 + }, + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "shininess": { + "type": 5126 + }, + "specular": { + "type": 35666 + }, + "texcoord0": { + "semantic": "TEXCOORD_0", + "type": 35664 + } + }, + "program": "program_0", + "states": { + "enable": [ + 2929, + 2884 + ] + }, + "uniforms": { + "u_diffuse": "diffuse", + "u_modelViewMatrix": "modelViewMatrix", + "u_normalMatrix": "normalMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_shininess": "shininess", + "u_specular": "specular" + } + } + }, + "textures": { + "texture_Image0001": { + "format": 6408, + "internalFormat": 6408, + "sampler": "sampler_0", + "source": "Image0001", + "target": 3553, + "type": 5121 + } + } +} \ No newline at end of file diff --git a/test/models/glTF/BoxTextured-glTF/BoxTextured0FS.glsl b/test/models/glTF/BoxTextured-glTF/BoxTextured0FS.glsl new file mode 100644 index 000000000..782e1f416 --- /dev/null +++ b/test/models/glTF/BoxTextured-glTF/BoxTextured0FS.glsl @@ -0,0 +1,18 @@ +precision highp float; +varying vec3 v_normal; +varying vec2 v_texcoord0; +uniform sampler2D u_diffuse; +uniform vec4 u_specular; +uniform float u_shininess; +void main(void) { +vec3 normal = normalize(v_normal); +vec4 color = vec4(0., 0., 0., 0.); +vec4 diffuse = vec4(0., 0., 0., 1.); +vec4 specular; +diffuse = texture2D(u_diffuse, v_texcoord0); +specular = u_specular; +diffuse.xyz *= max(dot(normal,vec3(0.,0.,1.)), 0.); +color.xyz += diffuse.xyz; +color = vec4(color.rgb * diffuse.a, diffuse.a); +gl_FragColor = color; +} diff --git a/test/models/glTF/BoxTextured-glTF/BoxTextured0VS.glsl b/test/models/glTF/BoxTextured-glTF/BoxTextured0VS.glsl new file mode 100644 index 000000000..cacc9ed99 --- /dev/null +++ b/test/models/glTF/BoxTextured-glTF/BoxTextured0VS.glsl @@ -0,0 +1,15 @@ +precision highp float; +attribute vec3 a_position; +attribute vec3 a_normal; +varying vec3 v_normal; +uniform mat3 u_normalMatrix; +uniform mat4 u_modelViewMatrix; +uniform mat4 u_projectionMatrix; +attribute vec2 a_texcoord0; +varying vec2 v_texcoord0; +void main(void) { +vec4 pos = u_modelViewMatrix * vec4(a_position,1.0); +v_normal = u_normalMatrix * a_normal; +v_texcoord0 = a_texcoord0; +gl_Position = u_projectionMatrix * pos; +} diff --git a/test/models/glTF/BoxTextured-glTF/CesiumLogoFlat.png b/test/models/glTF/BoxTextured-glTF/CesiumLogoFlat.png new file mode 100644 index 000000000..88bada374 Binary files /dev/null and b/test/models/glTF/BoxTextured-glTF/CesiumLogoFlat.png differ diff --git a/test/models/glTF/TwoBoxes/Box.bin b/test/models/glTF/TwoBoxes/Box.bin new file mode 100644 index 000000000..29a29e138 Binary files /dev/null and b/test/models/glTF/TwoBoxes/Box.bin differ diff --git a/test/models/glTF/TwoBoxes/Box0FS.glsl b/test/models/glTF/TwoBoxes/Box0FS.glsl new file mode 100644 index 000000000..6e928dc70 --- /dev/null +++ b/test/models/glTF/TwoBoxes/Box0FS.glsl @@ -0,0 +1,17 @@ +precision highp float; +varying vec3 v_normal; +uniform vec4 u_diffuse; +uniform vec4 u_specular; +uniform float u_shininess; +void main(void) { +vec3 normal = normalize(v_normal); +vec4 color = vec4(0., 0., 0., 0.); +vec4 diffuse = vec4(0., 0., 0., 1.); +vec4 specular; +diffuse = u_diffuse; +specular = u_specular; +diffuse.xyz *= max(dot(normal,vec3(0.,0.,1.)), 0.); +color.xyz += diffuse.xyz; +color = vec4(color.rgb * diffuse.a, diffuse.a); +gl_FragColor = color; +} diff --git a/test/models/glTF/TwoBoxes/Box0VS.glsl b/test/models/glTF/TwoBoxes/Box0VS.glsl new file mode 100644 index 000000000..9e3592280 --- /dev/null +++ b/test/models/glTF/TwoBoxes/Box0VS.glsl @@ -0,0 +1,12 @@ +precision highp float; +attribute vec3 a_position; +attribute vec3 a_normal; +varying vec3 v_normal; +uniform mat3 u_normalMatrix; +uniform mat4 u_modelViewMatrix; +uniform mat4 u_projectionMatrix; +void main(void) { +vec4 pos = u_modelViewMatrix * vec4(a_position,1.0); +v_normal = u_normalMatrix * a_normal; +gl_Position = u_projectionMatrix * pos; +} diff --git a/test/models/glTF/TwoBoxes/TwoBoxes.gltf b/test/models/glTF/TwoBoxes/TwoBoxes.gltf new file mode 100644 index 000000000..a1953e5be --- /dev/null +++ b/test/models/glTF/TwoBoxes/TwoBoxes.gltf @@ -0,0 +1,276 @@ +{ + "accessors": { + "accessor_21": { + "bufferView": "bufferView_29", + "byteOffset": 0, + "byteStride": 0, + "componentType": 5123, + "count": 36, + "type": "SCALAR" + }, + "accessor_23": { + "bufferView": "bufferView_30", + "byteOffset": 0, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 0.5, + 0.5, + 0.5 + ], + "min": [ + -0.5, + -0.5, + -0.5 + ], + "type": "VEC3" + }, + "accessor_25": { + "bufferView": "bufferView_30", + "byteOffset": 288, + "byteStride": 12, + "componentType": 5126, + "count": 24, + "max": [ + 1, + 1, + 1 + ], + "min": [ + -1, + -1, + -1 + ], + "type": "VEC3" + } + }, + "animations": {}, + "asset": { + "generator": "collada2gltf@027f74366341d569dea42e9a68b7104cc3892054", + "premultipliedAlpha": true, + "profile": { + "api": "WebGL", + "version": "1.0.2" + }, + "version": "1.0" + }, + "bufferViews": { + "bufferView_29": { + "buffer": "Box", + "byteLength": 72, + "byteOffset": 0, + "target": 34963 + }, + "bufferView_30": { + "buffer": "Box", + "byteLength": 576, + "byteOffset": 72, + "target": 34962 + } + }, + "buffers": { + "Box": { + "byteLength": 648, + "type": "arraybuffer", + "uri": "Box.bin" + } + }, + "materials": { + "Effect-Red": { + "name": "Red", + "technique": "technique0", + "values": { + "diffuse": [ + 0.8, + 0, + 0, + 1 + ], + "shininess": 256, + "specular": [ + 0.2, + 0.2, + 0.2, + 1 + ] + } + } + }, + "meshes": { + "Geometry-mesh002": { + "name": "Mesh", + "primitives": [ + { + "attributes": { + "NORMAL": "accessor_25", + "POSITION": "accessor_23" + }, + "indices": "accessor_21", + "material": "Effect-Red", + "mode": 4 + } + ] + } + }, + "nodes": { + "BottomBox": { + "children": [], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 1 + ], + "meshes": [ + "Geometry-mesh002" + ], + "name": "BottomBox" + }, + "TopBox": { + "children": [], + "matrix": [ + 0.5, + 0, + 0, + 0, + 0, + 0.5, + 0, + 0, + 0, + 0, + 0.5, + 0, + 0, + 0, + 1, + 1 + ], + "meshes": [ + "Geometry-mesh002" + ], + "name": "TopBox" + }, + "node_1": { + "children": [ + "BottomBox", + "TopBox" + ], + "matrix": [ + 1, + 0, + 0, + 0, + 0, + 0, + -1, + 0, + 0, + 1, + 0, + 0, + 0, + 0, + 0, + 1 + ], + "name": "Y_UP_Transform" + } + }, + "programs": { + "program_0": { + "attributes": [ + "a_normal", + "a_position" + ], + "fragmentShader": "Box0FS", + "vertexShader": "Box0VS" + } + }, + "scene": "defaultScene", + "scenes": { + "defaultScene": { + "nodes": [ + "node_1" + ] + } + }, + "shaders": { + "Box0FS": { + "type": 35632, + "uri": "Box0FS.glsl" + }, + "Box0VS": { + "type": 35633, + "uri": "Box0VS.glsl" + } + }, + "skins": {}, + "techniques": { + "technique0": { + "attributes": { + "a_normal": "normal", + "a_position": "position" + }, + "parameters": { + "diffuse": { + "type": 35666 + }, + "modelViewMatrix": { + "semantic": "MODELVIEW", + "type": 35676 + }, + "normal": { + "semantic": "NORMAL", + "type": 35665 + }, + "normalMatrix": { + "semantic": "MODELVIEWINVERSETRANSPOSE", + "type": 35675 + }, + "position": { + "semantic": "POSITION", + "type": 35665 + }, + "projectionMatrix": { + "semantic": "PROJECTION", + "type": 35676 + }, + "shininess": { + "type": 5126 + }, + "specular": { + "type": 35666 + } + }, + "program": "program_0", + "states": { + "enable": [ + 2929, + 2884 + ] + }, + "uniforms": { + "u_diffuse": "diffuse", + "u_modelViewMatrix": "modelViewMatrix", + "u_normalMatrix": "normalMatrix", + "u_projectionMatrix": "projectionMatrix", + "u_shininess": "shininess", + "u_specular": "specular" + } + } + } +} \ No newline at end of file diff --git a/test/regression/db.zip b/test/regression/db.zip index fba468a7b..c483e70b9 100644 Binary files a/test/regression/db.zip and b/test/regression/db.zip differ