Exemple #1
0
        static glTFNode ExportNode(Transform x, List <Transform> nodes, List <Renderer> renderers, List <SkinnedMeshRenderer> skins)
        {
            var node = new glTFNode
            {
                name        = x.name,
                children    = x.transform.GetChildren().Select(y => nodes.IndexOf(y)).ToArray(),
                rotation    = x.transform.localRotation.ToArray(),
                translation = x.transform.localPosition.ToArray(),
                scale       = x.transform.localScale.ToArray(),
            };

            if (x.gameObject.activeInHierarchy)
            {
                var meshRenderer = x.GetComponent <MeshRenderer>();
                if (meshRenderer != null)
                {
                    node.mesh = renderers.IndexOf(meshRenderer);
                }

                var skinnedMeshRenderer = x.GetComponent <SkinnedMeshRenderer>();
                if (skinnedMeshRenderer != null)
                {
                    node.mesh = renderers.IndexOf(skinnedMeshRenderer);
                    node.skin = skins.IndexOf(skinnedMeshRenderer);
                }
            }

            return(node);
        }
Exemple #2
0
        static glTFNode ExportNode(Transform x, List <Transform> nodes, List <Mesh> meshes, List <SkinnedMeshRenderer> skins)
        {
            var node = new glTFNode
            {
                name        = x.name,
                children    = x.transform.GetChildren().Select(y => nodes.IndexOf(y)).ToArray(),
                rotation    = x.transform.localRotation.ToArray(),
                translation = x.transform.localPosition.ToArray(),
                scale       = x.transform.localScale.ToArray(),
            };

            var meshFilter = x.GetComponent <MeshFilter>();

            if (meshFilter != null)
            {
                node.mesh = meshes.IndexOf(meshFilter.sharedMesh);
            }

            var skinnredMeshRenderer = x.GetComponent <SkinnedMeshRenderer>();

            if (skinnredMeshRenderer != null)
            {
                node.mesh = meshes.IndexOf(skinnredMeshRenderer.sharedMesh);
                node.skin = skins.IndexOf(skinnredMeshRenderer);
            }

            return(node);
        }
Exemple #3
0
        private static string RelativePathFrom(List <glTFNode> nodes, glTFNode root, glTFNode target, List <string> path)
        {
            if (path.Count == 0)
            {
                path.Add(target.name);
            }

            var targetIndex = nodes.IndexOf(target);

            foreach (var parent in nodes)
            {
                if (parent.children == null || parent.children.Length == 0)
                {
                    continue;
                }

                foreach (var child in parent.children)
                {
                    if (child != targetIndex)
                    {
                        continue;
                    }

                    if (parent == root)
                    {
                        return(string.Join("/", path));
                    }

                    path.Insert(0, parent.name);
                    return(RelativePathFrom(nodes, root, parent, path));
                }
            }

            return(string.Join("/", path));
        }
        public static string ToJson(this glTFNode self)
        {
            var f = new JsonFormatter();

            GltfSerializer.Serialize_gltf_nodes_ITEM(f, self);
            return(f.ToString());
        }
 public void NodeTestError()
 {
     var model = new glTFNode()
     {
         name   = "a",
         camera = -2,
     };
 }
Exemple #6
0
        public static string RelativePathFrom(List <glTFNode> nodes, glTFNode root, glTFNode target)
        {
            if (root == target)
            {
                return("");
            }
            var path = new List <string>();

            return(RelativePathFrom(nodes, root, target, path));
        }
 public void NodeMeshTest()
 {
     var model = new glTFNode()
     {
         name   = "a",
         mesh   = 2,
         skin   = 0,
         camera = -1,
     };
 }
Exemple #8
0
        static glTFNode ExportNode(Transform x, List <Transform> nodes, List <MeshWithRenderer> meshWithRenderers, List <SkinnedMeshRenderer> skins)
        {
            var node = new glTFNode
            {
                name        = x.name,
                children    = x.transform.GetChildren().Select(y => nodes.IndexOf(y)).ToArray(),
                rotation    = x.transform.localRotation.ToArray(),
                translation = x.transform.localPosition.ToArray(),
                scale       = x.transform.localScale.ToArray(),
            };

            if (x.gameObject.activeInHierarchy)
            {
                var meshRenderer = x.GetComponent <MeshRenderer>();

                if (meshRenderer != null)
                {
                    var meshFilter = x.GetComponent <MeshFilter>();
                    if (meshFilter != null)
                    {
                        var mesh      = meshFilter.sharedMesh;
                        var materials = meshRenderer.sharedMaterials;
                        if (TryGetSameMeshIndex(meshWithRenderers, mesh, materials, out int meshIndex))
                        {
                            node.mesh = meshIndex;
                        }
                        else
                        {
                            // MeshとMaterialが一致するものが見つからなかった
                            throw new Exception("Mesh not found.");
                        }
                    }
                }

                var skinnedMeshRenderer = x.GetComponent <SkinnedMeshRenderer>();
                if (skinnedMeshRenderer != null)
                {
                    var mesh      = skinnedMeshRenderer.sharedMesh;
                    var materials = skinnedMeshRenderer.sharedMaterials;
                    if (TryGetSameMeshIndex(meshWithRenderers, mesh, materials, out int meshIndex))
                    {
                        node.mesh = meshIndex;
                        node.skin = skins.IndexOf(skinnedMeshRenderer);
                    }
                    else
                    {
                        // MeshとMaterialが一致するものが見つからなかった
                        throw new Exception("Mesh not found.");
                    }
                }
            }

            return(node);
        }
        public void NodeTest()
        {
            var model = new glTFNode()
            {
                name   = "a",
                skin   = 0,
                camera = -1,
            };

            var json = model.ToJson();

            Assert.AreEqual(@"{""name"":""a"",""skin"":0}", json);
            Debug.Log(json);
        }
Exemple #10
0
        public static GameObject ImportNode(glTFNode node, int nodeIndex)
        {
            var nodeName = node.name;

            if (!string.IsNullOrEmpty(nodeName) && nodeName.Contains("/"))
            {
                Debug.LogWarningFormat("node {0} contains /. replace _", node.name);
                nodeName = nodeName.Replace("/", "_");
            }
            if (string.IsNullOrEmpty(nodeName))
            {
                nodeName = string.Format("nodeIndex_{0}", nodeIndex);
            }
            var go = new GameObject(nodeName);

            //
            // transform
            //
            if (node.translation != null && node.translation.Length > 0)
            {
                go.transform.localPosition = new Vector3(
                    node.translation[0],
                    node.translation[1],
                    node.translation[2]);
            }
            if (node.rotation != null && node.rotation.Length > 0)
            {
                go.transform.localRotation = new Quaternion(
                    node.rotation[0],
                    node.rotation[1],
                    node.rotation[2],
                    node.rotation[3]);
            }
            if (node.scale != null && node.scale.Length > 0)
            {
                go.transform.localScale = new Vector3(
                    node.scale[0],
                    node.scale[1],
                    node.scale[2]);
            }
            if (node.matrix != null && node.matrix.Length > 0)
            {
                var m = UnityExtensions.MatrixFromArray(node.matrix);
                go.transform.localRotation = m.ExtractRotation();
                go.transform.localPosition = m.ExtractPosition();
                go.transform.localScale    = m.ExtractScale();
            }
            return(go);
        }
Exemple #11
0
        public void NodeTestError()
        {
            var model = new glTFNode()
            {
                name   = "a",
                camera = -2,
            };

            var c = new JsonSchemaValidationContext("")
            {
                EnableDiagnosisForNotRequiredFields = true,
            };
            var ex = Assert.Throws <JsonSchemaValidationException>(
                () => JsonSchema.FromType <glTFNode>().Serialize(model, c)
                );

            Assert.AreEqual("[camera.String] minimum: ! -2>=0", ex.Message);
        }
Exemple #12
0
        public void NodeMeshTest()
        {
            var model = new glTFNode()
            {
                name   = "a",
                mesh   = 2,
                skin   = 0,
                camera = -1,
            };

            var c = new JsonSchemaValidationContext("")
            {
                EnableDiagnosisForNotRequiredFields = true,
            };
            var json = JsonSchema.FromType <glTFNode>().Serialize(model, c);

            Assert.AreEqual(@"{""name"":""a"",""mesh"":2,""skin"":0,""extras"":{}}", json);
        }
Exemple #13
0
        public static AnimationClip ConvertAnimationClip(GltfData data, glTFAnimation animation, IAxisInverter inverter, glTFNode root = null)
        {
            var clip = new AnimationClip();

            clip.ClearCurves();
            clip.legacy   = true;
            clip.name     = animation.name;
            clip.wrapMode = WrapMode.Loop;

            foreach (var channel in animation.channels)
            {
                var relativePath = RelativePathFrom(data.GLTF.nodes, root, data.GLTF.nodes[channel.target.node]);
                switch (channel.target.path)
                {
                case glTFAnimationTarget.PATH_TRANSLATION:
                {
                    var sampler = animation.samplers[channel.sampler];
                    var input   = data.GetArrayFromAccessor <float>(sampler.input);
                    var output  = data.FlatternFloatArrayFromAccessor(sampler.output);

                    AnimationImporterUtil.SetAnimationCurve(
                        clip,
                        relativePath,
                        new string[] { "localPosition.x", "localPosition.y", "localPosition.z" },
                        input,
                        output,
                        sampler.interpolation,
                        typeof(Transform),
                        (values, last) =>
                        {
                            Vector3 temp = new Vector3(values[0], values[1], values[2]);
                            return(inverter.InvertVector3(temp).ToArray());
                        }
                        );
                }
                break;

                case glTFAnimationTarget.PATH_ROTATION:
                {
                    var sampler = animation.samplers[channel.sampler];
                    var input   = data.GetArrayFromAccessor <float>(sampler.input);
                    var output  = data.FlatternFloatArrayFromAccessor(sampler.output);

                    AnimationImporterUtil.SetAnimationCurve(
                        clip,
                        relativePath,
                        new string[] { "localRotation.x", "localRotation.y", "localRotation.z", "localRotation.w" },
                        input,
                        output,
                        sampler.interpolation,
                        typeof(Transform),
                        (values, last) =>
                        {
                            Quaternion currentQuaternion = new Quaternion(values[0], values[1], values[2], values[3]);
                            Quaternion lastQuaternion    = new Quaternion(last[0], last[1], last[2], last[3]);
                            return(AnimationImporterUtil.GetShortest(lastQuaternion, inverter.InvertQuaternion(currentQuaternion)).ToArray());
                        }
                        );

                    clip.EnsureQuaternionContinuity();
                }
                break;

                case glTFAnimationTarget.PATH_SCALE:
                {
                    var sampler = animation.samplers[channel.sampler];
                    var input   = data.GetArrayFromAccessor <float>(sampler.input);
                    var output  = data.FlatternFloatArrayFromAccessor(sampler.output);

                    AnimationImporterUtil.SetAnimationCurve(
                        clip,
                        relativePath,
                        new string[] { "localScale.x", "localScale.y", "localScale.z" },
                        input,
                        output,
                        sampler.interpolation,
                        typeof(Transform),
                        (values, last) => values);
                }
                break;

                case glTFAnimationTarget.PATH_WEIGHT:
                {
                    var node      = data.GLTF.nodes[channel.target.node];
                    var mesh      = data.GLTF.meshes[node.mesh];
                    var primitive = mesh.primitives.FirstOrDefault();
                    var targets   = primitive.targets;

                    if (!gltf_mesh_extras_targetNames.TryGet(mesh, out List <string> targetNames))
                    {
                        throw new UniGLTFNotSupportedException("glTF BlendShape Animation. targetNames invalid.");
                    }

                    var keyNames = targetNames
                                   .Where(x => !string.IsNullOrEmpty(x))
                                   .Select(x => "blendShape." + x)
                                   .ToArray();

                    var sampler = animation.samplers[channel.sampler];
                    var input   = data.GetArrayFromAccessor <float>(sampler.input);
                    var output  = data.GetArrayFromAccessor <float>(sampler.output);
                    AnimationImporterUtil.SetAnimationCurve(
                        clip,
                        relativePath,
                        keyNames,
                        input,
                        output,
                        sampler.interpolation,
                        typeof(SkinnedMeshRenderer),
                        (values, last) =>
                        {
                            for (int j = 0; j < values.Length; j++)
                            {
                                values[j] *= 100.0f;
                            }
                            return(values);
                        });
                }
                break;

                default:
                    Debug.LogWarningFormat("unknown path: {0}", channel.target.path);
                    break;
                }
            }
            return(clip);
        }
Exemple #14
0
        public static void Serialize_gltf_nodes_ITEM(JsonFormatter f, glTFNode value)
        {
            f.BeginMap();


            if (!string.IsNullOrEmpty(value.name))
            {
                f.Key("name");
                f.Value(value.name);
            }

            if (value.children != null && value.children.Length >= 1)
            {
                f.Key("children");
                Serialize_gltf_nodes__children(f, value.children);
            }

            if (value.matrix != null && value.matrix.Length >= 16)
            {
                f.Key("matrix");
                Serialize_gltf_nodes__matrix(f, value.matrix);
            }

            if (value.translation != null && value.translation.Length >= 3 && !value.translation.SequenceEqual(new float[] { 0, 0, 0 }))
            {
                f.Key("translation");
                Serialize_gltf_nodes__translation(f, value.translation);
            }

            if (value.rotation != null && value.rotation.Length >= 4 && !value.rotation.SequenceEqual(new float[] { 0, 0, 0, 1 }))
            {
                f.Key("rotation");
                Serialize_gltf_nodes__rotation(f, value.rotation);
            }

            if (value.scale != null && value.scale.Length >= 3 && !value.scale.SequenceEqual(new float[] { 1, 1, 1 }))
            {
                f.Key("scale");
                Serialize_gltf_nodes__scale(f, value.scale);
            }

            if (value.mesh >= 0)
            {
                f.Key("mesh");
                f.Value(value.mesh);
            }

            if (value.skin >= 0)
            {
                f.Key("skin");
                f.Value(value.skin);
            }

            if (value.weights != null && value.weights.Length >= 1)
            {
                f.Key("weights");
                Serialize_gltf_nodes__weights(f, value.weights);
            }

            if (value.camera >= 0)
            {
                f.Key("camera");
                f.Value(value.camera);
            }

            if (value.extensions != null)
            {
                f.Key("extensions");
                value.extensions.Serialize(f);
            }

            if (value.extras != null)
            {
                f.Key("extras");
                value.extras.Serialize(f);
            }

            f.EndMap();
        }
        static GameObject ImportNode(glTFNode node)
        {
            var go = new GameObject(node.name);

            //
            // transform
            //
            if (node.translation != null && node.translation.Length > 0)
            {
                go.transform.localPosition = new Vector3(
                    node.translation[0],
                    node.translation[1],
                    node.translation[2]);
            }
            if (node.rotation != null && node.rotation.Length > 0)
            {
                go.transform.localRotation = new Quaternion(
                    node.rotation[0],
                    node.rotation[1],
                    node.rotation[2],
                    node.rotation[3]);
            }
            if (node.scale != null && node.scale.Length > 0)
            {
                go.transform.localScale = new Vector3(
                    node.scale[0],
                    node.scale[1],
                    node.scale[2]);
            }
            if (node.matrix != null && node.matrix.Length > 0)
            {
                var values = node.matrix;
#if UNITY_2017_OR_NEWER
                var col0 = new Vector4(values[0], values[1], values[2], values[3]);
                var col1 = new Vector4(values[4], values[5], values[6], values[7]);
                var col2 = new Vector4(values[8], values[9], values[10], values[11]);
                var col3 = new Vector4(values[12], values[13], values[14], values[15]);
                var m    = new Matrix4x4(col0, col1, col2, col3);
                go.transform.localRotation = m.rotation;
                go.transform.localPosition = m.GetColumn(3);
#else
                // https://forum.unity.com/threads/how-to-assign-matrix4x4-to-transform.121966/
                var m = new Matrix4x4();
                m.m00 = values[0];
                m.m10 = values[1];
                m.m20 = values[2];
                m.m30 = values[3];
                m.m01 = values[4];
                m.m11 = values[5];
                m.m21 = values[6];
                m.m31 = values[7];
                m.m02 = values[8];
                m.m12 = values[9];
                m.m22 = values[10];
                m.m32 = values[11];
                m.m03 = values[12];
                m.m13 = values[13];
                m.m23 = values[14];
                m.m33 = values[15];
                go.transform.localRotation = m.ExtractRotation();
                go.transform.localPosition = m.ExtractPosition();
#endif
            }
            return(go);
        }