diff --git a/Assets/UniGLTF/Runtime/Extensions/glTFExtensions.cs b/Assets/UniGLTF/Runtime/Extensions/glTFExtensions.cs index ceb8e9642..1cc651848 100644 --- a/Assets/UniGLTF/Runtime/Extensions/glTFExtensions.cs +++ b/Assets/UniGLTF/Runtime/Extensions/glTFExtensions.cs @@ -476,5 +476,51 @@ namespace UniGLTF self.RemoveUnusedExtensions(json); return (json, self.buffers); } + + public static bool IsGeneratedUniGLTFAndOlderThan(string generatorVersion, int major, int minor) + { + if (string.IsNullOrEmpty(generatorVersion)) return false; + if (generatorVersion == "UniGLTF") return true; + if (!generatorVersion.FastStartsWith("UniGLTF-")) return false; + + try + { + var splitted = generatorVersion.Substring(8).Split('.'); + var generatorMajor = int.Parse(splitted[0]); + var generatorMinor = int.Parse(splitted[1]); + + if (generatorMajor < major) + { + return true; + } + else if (generatorMajor > major) + { + return false; + } + else + { + if (generatorMinor >= minor) + { + return false; + } + else + { + return true; + } + } + } + catch (Exception ex) + { + Debug.LogWarningFormat("{0}: {1}", generatorVersion, ex); + return false; + } + } + + public static bool IsGeneratedUniGLTFAndOlder(this glTF gltf, int major, int minor) + { + if (gltf == null) return false; + if (gltf.asset == null) return false; + return IsGeneratedUniGLTFAndOlderThan(gltf.asset.generator, major, minor); + } } } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs index d08aad586..cc561be08 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/GltfParser.cs @@ -25,51 +25,6 @@ namespace UniGLTF /// public IStorage Storage; - public static bool IsGeneratedUniGLTFAndOlderThan(string generatorVersion, int major, int minor) - { - if (string.IsNullOrEmpty(generatorVersion)) return false; - if (generatorVersion == "UniGLTF") return true; - if (!generatorVersion.FastStartsWith("UniGLTF-")) return false; - - try - { - var splitted = generatorVersion.Substring(8).Split('.'); - var generatorMajor = int.Parse(splitted[0]); - var generatorMinor = int.Parse(splitted[1]); - - if (generatorMajor < major) - { - return true; - } - else if (generatorMajor > major) - { - return false; - } - else - { - if (generatorMinor >= minor) - { - return false; - } - else - { - return true; - } - } - } - catch (Exception ex) - { - Debug.LogWarningFormat("{0}: {1}", generatorVersion, ex); - return false; - } - } - - public bool IsGeneratedUniGLTFAndOlder(int major, int minor) - { - if (GLTF == null) return false; - if (GLTF.asset == null) return false; - return IsGeneratedUniGLTFAndOlderThan(GLTF.asset.generator, major, minor); - } #region Parse public void ParsePath(string path) diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs index e77e54f7a..1634b8192 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/ImporterContext.cs @@ -126,7 +126,7 @@ namespace UniGLTF var index = i; using (MeasureTime("ReadMesh")) { - var x = meshImporter.ReadMesh(this, index, inverter); + var x = meshImporter.ReadMesh(GLTF, index, inverter); var y = await BuildMeshAsync(awaitCaller, MeasureTime, x, index); Meshes.Add(y); } diff --git a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshImporter.cs b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshImporter.cs index 42c87fddd..cd6d73f85 100644 --- a/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshImporter.cs +++ b/Assets/UniGLTF/Runtime/UniGLTF/IO/MeshImporter.cs @@ -124,7 +124,7 @@ namespace UniGLTF /// /// /// - public void ImportMeshIndependentVertexBuffer(ImporterContext ctx, glTFMesh gltfMesh, IAxisInverter inverter) + public void ImportMeshIndependentVertexBuffer(glTF gltf, glTFMesh gltfMesh, IAxisInverter inverter) { foreach (var prim in gltfMesh.primitives) { @@ -132,14 +132,14 @@ namespace UniGLTF var indexBuffer = prim.indices; // position は必ずある - var positions = ctx.GLTF.GetArrayFromAccessor(prim.attributes.POSITION); + var positions = gltf.GetArrayFromAccessor(prim.attributes.POSITION); var fillLength = m_positions.Count; m_positions.AddRange(positions.Select(inverter.InvertVector3)); // normal if (prim.attributes.NORMAL != -1) { - var normals = ctx.GLTF.GetArrayFromAccessor(prim.attributes.NORMAL); + var normals = gltf.GetArrayFromAccessor(prim.attributes.NORMAL); if (normals.Length != positions.Length) { throw new Exception("different length"); @@ -151,7 +151,7 @@ namespace UniGLTF #if false if (prim.attributes.TANGENT != -1) { - var tangents = ctx.GLTF.GetArrayFromAccessor(prim.attributes.TANGENT); + var tangents = gltf.GetArrayFromAccessor(prim.attributes.TANGENT); if (tangents.Length != positions.Length) { throw new Exception("different length"); @@ -164,12 +164,12 @@ namespace UniGLTF // uv if (prim.attributes.TEXCOORD_0 != -1) { - var uvs = ctx.GLTF.GetArrayFromAccessor(prim.attributes.TEXCOORD_0); + var uvs = gltf.GetArrayFromAccessor(prim.attributes.TEXCOORD_0); if (uvs.Length != positions.Length) { throw new Exception("different length"); } - if (ctx.Parser.IsGeneratedUniGLTFAndOlder(1, 16)) + if (gltf.IsGeneratedUniGLTFAndOlder(1, 16)) { #pragma warning disable 0612 // backward compatibility @@ -187,7 +187,7 @@ namespace UniGLTF // uv2 if (prim.attributes.TEXCOORD_1 != -1) { - var uvs = ctx.GLTF.GetArrayFromAccessor(prim.attributes.TEXCOORD_1); + var uvs = gltf.GetArrayFromAccessor(prim.attributes.TEXCOORD_1); if (uvs.Length != positions.Length) { throw new Exception("different length"); @@ -199,7 +199,7 @@ namespace UniGLTF // color if (prim.attributes.COLOR_0 != -1) { - var colors = ctx.GLTF.GetArrayFromAccessor(prim.attributes.COLOR_0); + var colors = gltf.GetArrayFromAccessor(prim.attributes.COLOR_0); if (colors.Length != positions.Length) { throw new Exception("different length"); @@ -211,8 +211,8 @@ namespace UniGLTF // skin if (prim.attributes.JOINTS_0 != -1 && prim.attributes.WEIGHTS_0 != -1) { - var (joints0, jointsLength) = JointsAccessor.GetAccessor(ctx.GLTF, prim.attributes.JOINTS_0); - var (weights0, weightsLength) = WeightsAccessor.GetAccessor(ctx.GLTF, prim.attributes.WEIGHTS_0); + var (joints0, jointsLength) = JointsAccessor.GetAccessor(gltf, prim.attributes.JOINTS_0); + var (weights0, weightsLength) = WeightsAccessor.GetAccessor(gltf, prim.attributes.WEIGHTS_0); if (jointsLength != positions.Length) { throw new Exception("different length"); @@ -256,7 +256,7 @@ namespace UniGLTF var blendShape = new BlendShape(i.ToString()); if (primTarget.POSITION != -1) { - var array = ctx.GLTF.GetArrayFromAccessor(primTarget.POSITION); + var array = gltf.GetArrayFromAccessor(primTarget.POSITION); if (array.Length != positions.Length) { throw new Exception("different length"); @@ -266,7 +266,7 @@ namespace UniGLTF } if (primTarget.NORMAL != -1) { - var array = ctx.GLTF.GetArrayFromAccessor(primTarget.NORMAL); + var array = gltf.GetArrayFromAccessor(primTarget.NORMAL); if (array.Length != positions.Length) { throw new Exception("different length"); @@ -276,7 +276,7 @@ namespace UniGLTF } if (primTarget.TANGENT != -1) { - var array = ctx.GLTF.GetArrayFromAccessor(primTarget.TANGENT); + var array = gltf.GetArrayFromAccessor(primTarget.TANGENT); if (array.Length != positions.Length) { throw new Exception("different length"); @@ -290,7 +290,7 @@ namespace UniGLTF var indices = (indexBuffer >= 0) - ? ctx.GLTF.GetIndices(indexBuffer) + ? gltf.GetIndices(indexBuffer) : TriangleUtil.FlipTriangle(Enumerable.Range(0, m_positions.Count)).ToArray() // without index array ; for (int i = 0; i < indices.Length; ++i) @@ -313,55 +313,55 @@ namespace UniGLTF /// /// /// - public void ImportMeshSharingVertexBuffer(ImporterContext ctx, glTFMesh gltfMesh, IAxisInverter inverter) + public void ImportMeshSharingVertexBuffer(glTF gltf, glTFMesh gltfMesh, IAxisInverter inverter) { { // 同じVertexBufferを共有しているので先頭のモノを使う var prim = gltfMesh.primitives.First(); - m_positions.AddRange(ctx.GLTF.GetArrayFromAccessor(prim.attributes.POSITION).SelectInplace(inverter.InvertVector3)); + m_positions.AddRange(gltf.GetArrayFromAccessor(prim.attributes.POSITION).SelectInplace(inverter.InvertVector3)); // normal if (prim.attributes.NORMAL != -1) { - m_normals.AddRange(ctx.GLTF.GetArrayFromAccessor(prim.attributes.NORMAL).SelectInplace(inverter.InvertVector3)); + m_normals.AddRange(gltf.GetArrayFromAccessor(prim.attributes.NORMAL).SelectInplace(inverter.InvertVector3)); } #if false // tangent if (prim.attributes.TANGENT != -1) { - tangents.AddRange(ctx.GLTF.GetArrayFromAccessor(prim.attributes.TANGENT).SelectInplace(inverter.InvertVector4)); + tangents.AddRange(gltf.GetArrayFromAccessor(prim.attributes.TANGENT).SelectInplace(inverter.InvertVector4)); } #endif // uv if (prim.attributes.TEXCOORD_0 != -1) { - if (ctx.Parser.IsGeneratedUniGLTFAndOlder(1, 16)) + if (gltf.IsGeneratedUniGLTFAndOlder(1, 16)) { #pragma warning disable 0612 // backward compatibility - m_uv.AddRange(ctx.GLTF.GetArrayFromAccessor(prim.attributes.TEXCOORD_0).SelectInplace(x => x.ReverseY())); + m_uv.AddRange(gltf.GetArrayFromAccessor(prim.attributes.TEXCOORD_0).SelectInplace(x => x.ReverseY())); #pragma warning restore 0612 } else { - m_uv.AddRange(ctx.GLTF.GetArrayFromAccessor(prim.attributes.TEXCOORD_0).SelectInplace(x => x.ReverseUV())); + m_uv.AddRange(gltf.GetArrayFromAccessor(prim.attributes.TEXCOORD_0).SelectInplace(x => x.ReverseUV())); } } // uv2 if (prim.attributes.TEXCOORD_1 != -1) { - m_uv2.AddRange(ctx.GLTF.GetArrayFromAccessor(prim.attributes.TEXCOORD_1).SelectInplace(x => x.ReverseUV())); + m_uv2.AddRange(gltf.GetArrayFromAccessor(prim.attributes.TEXCOORD_1).SelectInplace(x => x.ReverseUV())); } // color if (prim.attributes.COLOR_0 != -1) { - if (ctx.GLTF.accessors[prim.attributes.COLOR_0].TypeCount == 3) + if (gltf.accessors[prim.attributes.COLOR_0].TypeCount == 3) { - var vec3Color = ctx.GLTF.GetArrayFromAccessor(prim.attributes.COLOR_0); + var vec3Color = gltf.GetArrayFromAccessor(prim.attributes.COLOR_0); m_colors.AddRange(new Color[vec3Color.Length]); for (int i = 0; i < vec3Color.Length; i++) @@ -370,21 +370,21 @@ namespace UniGLTF m_colors[i] = new Color(color.x, color.y, color.z); } } - else if (ctx.GLTF.accessors[prim.attributes.COLOR_0].TypeCount == 4) + else if (gltf.accessors[prim.attributes.COLOR_0].TypeCount == 4) { - m_colors.AddRange(ctx.GLTF.GetArrayFromAccessor(prim.attributes.COLOR_0)); + m_colors.AddRange(gltf.GetArrayFromAccessor(prim.attributes.COLOR_0)); } else { - throw new NotImplementedException(string.Format("unknown color type {0}", ctx.GLTF.accessors[prim.attributes.COLOR_0].type)); + throw new NotImplementedException(string.Format("unknown color type {0}", gltf.accessors[prim.attributes.COLOR_0].type)); } } // skin if (prim.attributes.JOINTS_0 != -1 && prim.attributes.WEIGHTS_0 != -1) { - var (joints0, jointsLength) = JointsAccessor.GetAccessor(ctx.GLTF, prim.attributes.JOINTS_0); - var (weights0, weightsLength) = WeightsAccessor.GetAccessor(ctx.GLTF, prim.attributes.WEIGHTS_0); + var (joints0, jointsLength) = JointsAccessor.GetAccessor(gltf, prim.attributes.JOINTS_0); + var (weights0, weightsLength) = WeightsAccessor.GetAccessor(gltf, prim.attributes.WEIGHTS_0); for (int j = 0; j < jointsLength; ++j) { @@ -424,17 +424,17 @@ namespace UniGLTF if (primTarget.POSITION != -1) { blendShape.Positions.Assign( - ctx.GLTF.GetArrayFromAccessor(primTarget.POSITION), inverter.InvertVector3); + gltf.GetArrayFromAccessor(primTarget.POSITION), inverter.InvertVector3); } if (primTarget.NORMAL != -1) { blendShape.Normals.Assign( - ctx.GLTF.GetArrayFromAccessor(primTarget.NORMAL), inverter.InvertVector3); + gltf.GetArrayFromAccessor(primTarget.NORMAL), inverter.InvertVector3); } if (primTarget.TANGENT != -1) { blendShape.Tangents.Assign( - ctx.GLTF.GetArrayFromAccessor(primTarget.TANGENT), inverter.InvertVector3); + gltf.GetArrayFromAccessor(primTarget.TANGENT), inverter.InvertVector3); } } } @@ -448,7 +448,7 @@ namespace UniGLTF } else { - var indices = ctx.GLTF.GetIndices(prim.indices); + var indices = gltf.GetIndices(prim.indices); m_subMeshes.Add(indices); } @@ -530,18 +530,18 @@ namespace UniGLTF return sharedAttributes; } - public MeshContext ReadMesh(ImporterContext ctx, int meshIndex, IAxisInverter inverter) + public MeshContext ReadMesh(glTF gltf, int meshIndex, IAxisInverter inverter) { - var gltfMesh = ctx.GLTF.meshes[meshIndex]; + var gltfMesh = gltf.meshes[meshIndex]; var meshContext = new MeshContext(gltfMesh.name, meshIndex); if (HasSharedVertexBuffer(gltfMesh)) { - meshContext.ImportMeshSharingVertexBuffer(ctx, gltfMesh, inverter); + meshContext.ImportMeshSharingVertexBuffer(gltf, gltfMesh, inverter); } else { - meshContext.ImportMeshIndependentVertexBuffer(ctx, gltfMesh, inverter); + meshContext.ImportMeshIndependentVertexBuffer(gltf, gltfMesh, inverter); } meshContext.RenameBlendShape(gltfMesh); diff --git a/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs b/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs index b2750e424..9cf2512a1 100644 --- a/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs +++ b/Assets/UniGLTF/Tests/UniGLTF/UniGLTFTests.cs @@ -185,12 +185,12 @@ namespace UniGLTF [Test] public void VersionChecker() { - Assert.False(GltfParser.IsGeneratedUniGLTFAndOlderThan("hoge", 1, 16)); - Assert.False(GltfParser.IsGeneratedUniGLTFAndOlderThan("UniGLTF-1.16", 1, 16)); - Assert.True(GltfParser.IsGeneratedUniGLTFAndOlderThan("UniGLTF-1.15", 1, 16)); - Assert.False(GltfParser.IsGeneratedUniGLTFAndOlderThan("UniGLTF-11.16", 1, 16)); - Assert.True(GltfParser.IsGeneratedUniGLTFAndOlderThan("UniGLTF-0.16", 1, 16)); - Assert.True(GltfParser.IsGeneratedUniGLTFAndOlderThan("UniGLTF", 1, 16)); + Assert.False(glTFExtensions.IsGeneratedUniGLTFAndOlderThan("hoge", 1, 16)); + Assert.False(glTFExtensions.IsGeneratedUniGLTFAndOlderThan("UniGLTF-1.16", 1, 16)); + Assert.True(glTFExtensions.IsGeneratedUniGLTFAndOlderThan("UniGLTF-1.15", 1, 16)); + Assert.False(glTFExtensions.IsGeneratedUniGLTFAndOlderThan("UniGLTF-11.16", 1, 16)); + Assert.True(glTFExtensions.IsGeneratedUniGLTFAndOlderThan("UniGLTF-0.16", 1, 16)); + Assert.True(glTFExtensions.IsGeneratedUniGLTFAndOlderThan("UniGLTF", 1, 16)); } [Test]