void CreateGameObjects(int nodeIndex, Dictionary <int, GameObject> gameObjects) { var gltf = Container.Gltf; var gltfNode = gltf.Nodes[nodeIndex]; var go = new GameObject(); go.name = gltfNode.Name; var matrix = PrimitiveImporter.AsMatrix4x4(gltfNode.Matrix); if (!matrix.isIdentity) { throw new NotImplementedException("matrix is not implemented"); } else { var t = PrimitiveImporter.AsVector3(gltfNode.Translation); var r = PrimitiveImporter.AsQuaternion(gltfNode.Rotation); var s = PrimitiveImporter.AsVector3(gltfNode.Scale); go.transform.localPosition = CoordUtils.ConvertSpace(t); go.transform.localRotation = CoordUtils.ConvertSpace(r); go.transform.localScale = s; } gameObjects.Add(nodeIndex, go); if (gltfNode.Children != null) { foreach (var childIndex in gltfNode.Children) { if (gameObjects.ContainsKey(childIndex)) { throw new NotImplementedException("Node duplication"); // TODO: } CreateGameObjects(childIndex, gameObjects); var childGo = gameObjects[childIndex]; childGo.transform.SetParent(go.transform, false); } } }
public IndexedResource <Transform> ForceExport(Transform trans) { var go = trans.gameObject; IndexedResource <Mesh> meshResource = null; int?skinIndex = null; var mr = go.GetComponent <MeshRenderer>(); var smr = go.GetComponent <SkinnedMeshRenderer>(); if (mr != null) { var meshFilter = mr.gameObject.GetComponent <MeshFilter>(); var sharedMesh = meshFilter.sharedMesh; meshResource = Meshes.Export(mr, sharedMesh); } else if (smr != null) { var sharedMesh = smr.sharedMesh; meshResource = Meshes.Export(smr, sharedMesh); if (smr.bones.Length > 0) { skinIndex = ExportSkin(smr, sharedMesh).Index; } } var t = CoordUtils.ConvertSpace(go.transform.localPosition); var r = CoordUtils.ConvertSpace(go.transform.localRotation); var s = go.transform.localScale; var gltfNode = new Types.Node { Name = go.name, Mesh = meshResource != null ? (int?)meshResource.Index : null, Skin = skinIndex, Matrix = null, Translation = new float[] { t.x, t.y, t.z }, Rotation = new float[] { r.x, r.y, r.z, r.w }, Scale = new float[] { s.x, s.y, s.z }, }; var nodesIndices = new List <int>(); for (int i = 0; i < go.transform.childCount; ++i) { var c = go.transform.GetChild(i); var nodeResource = Export(c.gameObject); nodesIndices.Add(nodeResource.Index); } if (nodesIndices.Count > 0) { gltfNode.Children = nodesIndices.ToArray(); } foreach (var h in Hooks) { h.PostHook(this, trans, gltfNode); } return(new IndexedResource <Transform> { Index = Types.GltfExtensions.AddNode(Gltf, gltfNode), Value = trans, }); }