diff --git a/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs b/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs
index 89c6560aa..5ec350bdb 100644
--- a/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs
+++ b/Assets/UniGLTF/Runtime/UniGLTF/RuntimeGltfInstance.cs
@@ -1,4 +1,5 @@
using System.Collections.Generic;
+using System.Linq;
using UnityEngine;
using VRMShaders;
@@ -6,7 +7,7 @@ namespace UniGLTF
{
///
/// ImporterContext の Load 結果の GltfModel
- ///
+ ///
/// Runtime でモデルを Destory したときに関連リソース(Texture, Material...などの UnityEngine.Object)を自動的に Destroy する。
///
public class RuntimeGltfInstance : MonoBehaviour, IResponsibilityForDestroyObjects
@@ -14,25 +15,120 @@ namespace UniGLTF
///
/// this is UniGLTF root gameObject
///
- public GameObject Root => this.gameObject;
+ public GameObject Root => (this != null) ? this.gameObject : null;
- List<(SubAssetKey, UnityEngine.Object)> m_resources = new List<(SubAssetKey, UnityEngine.Object)>();
+ ///
+ /// Transforms with gltf node index.
+ ///
+ public IReadOnlyList Nodes => _nodes;
- public IReadOnlyList<(SubAssetKey, UnityEngine.Object)> RuntimeResources => m_resources;
+ ///
+ /// Runtime resources.
+ /// ex. Material, Texture, AnimationClip, Mesh.
+ ///
+ public IReadOnlyList<(SubAssetKey, UnityEngine.Object)> RuntimeResources => _resources;
+
+ ///
+ /// Materials.
+ ///
+ public IReadOnlyList Materials => _materials;
+
+ ///
+ /// Textures.
+ ///
+ public IReadOnlyList Textures => _textures;
+
+ ///
+ /// Animation Clips.
+ ///
+ public IReadOnlyList AnimationClips => _animationClips;
+
+ ///
+ /// Meshes.
+ ///
+ public IReadOnlyList Meshes => _meshes;
+
+ ///
+ /// Renderers.
+ /// ex. MeshRenderer, SkinnedMeshRenderer.
+ ///
+ public IReadOnlyList Renderers => _renderers;
+
+ ///
+ /// Mesh Renderers.
+ ///
+ public IReadOnlyList MeshRenderers => _meshRenderers;
+
+ ///
+ /// Skinned Mesh Renderers.
+ ///
+ public IReadOnlyList SkinnedMeshRenderers => _skinnedMeshRenderers;
+
+ private readonly List _nodes = new List();
+ private readonly List<(SubAssetKey, UnityEngine.Object)> _resources = new List<(SubAssetKey, UnityEngine.Object)>();
+ private readonly List _materials = new List();
+ private readonly List _textures = new List();
+ private readonly List _animationClips = new List();
+ private readonly List _meshes = new List();
+ private readonly List _renderers = new List();
+ private readonly List _meshRenderers = new List();
+ private readonly List _skinnedMeshRenderers = new List();
public static RuntimeGltfInstance AttachTo(GameObject go, ImporterContext context)
{
var loaded = go.AddComponent();
+
+ foreach (var node in context.Nodes)
+ {
+ // Maintain index order.
+ loaded._nodes.Add(node);
+ }
+
context.TransferOwnership((k, o) =>
{
- loaded.m_resources.Add((k, o));
+ if (o == null) return;
+
+ loaded._resources.Add((k, o));
+
+
+ switch (o)
+ {
+ case Material material:
+ loaded._materials.Add(material);
+ break;
+ case Texture texture:
+ loaded._textures.Add(texture);
+ break;
+ case AnimationClip animationClip:
+ loaded._animationClips.Add(animationClip);
+ break;
+ case Mesh mesh:
+ loaded._meshes.Add(mesh);
+ break;
+ }
});
+
+ foreach (var renderer in go.GetComponentsInChildren())
+ {
+ loaded._renderers.Add(renderer);
+
+ switch (renderer)
+ {
+ case MeshRenderer meshRenderer:
+ loaded._meshRenderers.Add(meshRenderer);
+ break;
+ case SkinnedMeshRenderer skinnedMeshRenderer:
+ loaded._skinnedMeshRenderers.Add(skinnedMeshRenderer);
+ break;
+ }
+ }
+
return loaded;
}
public void ShowMeshes()
{
- foreach (var r in GetComponentsInChildren())
+ foreach (var r in Renderers)
{
r.enabled = true;
}
@@ -40,27 +136,27 @@ namespace UniGLTF
public void EnableUpdateWhenOffscreen()
{
- foreach (var smr in GetComponentsInChildren())
+ foreach (var skinnedMeshRenderer in SkinnedMeshRenderers)
{
- smr.updateWhenOffscreen = true;
+ skinnedMeshRenderer.updateWhenOffscreen = true;
}
}
void OnDestroy()
{
Debug.Log("UnityResourceDestroyer.OnDestroy");
- foreach (var (key, x) in m_resources)
+ foreach (var (_, obj) in _resources)
{
- UnityObjectDestoyer.DestroyRuntimeOrEditor(x);
+ UnityObjectDestoyer.DestroyRuntimeOrEditor(obj);
}
}
public void TransferOwnership(TakeResponsibilityForDestroyObjectFunc take)
{
- foreach (var (key, x) in m_resources.ToArray())
+ foreach (var (key, x) in _resources.ToArray())
{
take(key, x);
- m_resources.Remove((key, x));
+ _resources.Remove((key, x));
}
}