Skip to content

Commit 277948b

Browse files
committed
Creation of BehaviourEngine and event/animation wrappers is now handled in the InteractivityImporterContext automatically. Unit tests updated to create their own engine and wrappers as the tests are using generated graphs and non-interactive glbs. Added import events to GltfImportPlugin for mesh, camera, vertex colored material, and load complete.
1 parent 48b5cf7 commit 277948b

File tree

16 files changed

+309
-55
lines changed

16 files changed

+309
-55
lines changed

Runtime/Scripts/GLTFSceneImporter.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -512,7 +512,12 @@ public void Dispose()
512512

513513
if (this.progress != null)
514514
await Task.Yield();
515-
515+
516+
foreach (var plugin in Context.Plugins)
517+
{
518+
plugin.OnLoadComplete(LastLoadedScene);
519+
}
520+
516521
onLoadComplete?.Invoke(LastLoadedScene, null);
517522
}
518523

Runtime/Scripts/Interactivity/Playback/BehaviourEngine.cs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,10 @@ public class BehaviourEngine
2525

2626
public readonly PointerResolver pointerResolver;
2727

28-
public BehaviourEngine(Graph graph, GLTFSceneImporter importer)
28+
public BehaviourEngine(Graph graph, PointerResolver pointerResolver)
2929
{
3030
this.graph = graph;
31-
pointerResolver = importer != null ? new PointerResolver(importer) : null;
31+
this.pointerResolver = pointerResolver;
3232

3333
for (int i = 0; i < graph.nodes.Count; i++)
3434
{
@@ -118,7 +118,7 @@ public void SetAnimationWrapper(AnimationWrapper wrapper, Animation animation)
118118
{
119119
animationWrapper = wrapper;
120120
wrapper.SetData(this, animation);
121-
pointerResolver.RegisterAnimations(wrapper);
121+
pointerResolver.CreateAnimationPointers(wrapper);
122122
}
123123

124124
public void PlayAnimation(in AnimationPlayData data)

Runtime/Scripts/Interactivity/Playback/Context/Import/InteractivityImportContext.cs

Lines changed: 71 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,5 @@
11
using GLTF.Schema;
2+
using System;
23
using UnityEngine;
34
using UnityGLTF.Plugins;
45

@@ -7,17 +8,21 @@ namespace UnityGLTF.Interactivity.Playback
78
public class InteractivityImportContext : GLTFImportPluginContext
89
{
910
internal readonly InteractivityImportPlugin settings;
11+
private PointerResolver _pointerResolver;
12+
private GLTFImportContext _context;
1013

11-
public InteractivityImportContext(InteractivityImportPlugin interactivityLoader)
14+
public InteractivityImportContext(InteractivityImportPlugin interactivityLoader, GLTFImportContext context)
1215
{
1316
settings = interactivityLoader;
17+
_context = context;
1418
}
1519

1620
/// <summary>
1721
/// Called before import starts
1822
/// </summary>
1923
public override void OnBeforeImport()
2024
{
25+
_pointerResolver = new();
2126
Util.Log($"InteractivityImportContext::OnBeforeImport Complete");
2227
}
2328

@@ -32,6 +37,7 @@ public override void OnBeforeImportRoot()
3237
public override void OnAfterImportRoot(GLTFRoot gltfRoot)
3338
{
3439
Util.Log($"InteractivityImportContext::OnAfterImportRoot Complete: {gltfRoot.ToString()}");
40+
_pointerResolver.CreateScenePointers(gltfRoot);
3541
}
3642

3743
public override void OnBeforeImportScene(GLTFScene scene)
@@ -42,11 +48,25 @@ public override void OnBeforeImportScene(GLTFScene scene)
4248
public override void OnAfterImportNode(GLTF.Schema.Node node, int nodeIndex, GameObject nodeObject)
4349
{
4450
Util.Log($"InteractivityImportContext::OnAfterImportNode Complete: {node.ToString()}");
51+
_pointerResolver.RegisterNode(node, nodeIndex, nodeObject);
4552
}
4653

47-
public override void OnAfterImportMaterial(GLTFMaterial material, int materialIndex, Material materialObject)
54+
public override void OnAfterImportMesh(GLTFMesh mesh, int meshIndex, Mesh meshObject)
55+
{
56+
Util.Log($"InteractivityImportContext::OnAfterImportMesh Complete: {mesh.ToString()}");
57+
_pointerResolver.RegisterMesh(mesh, meshIndex, meshObject);
58+
}
59+
60+
public override void OnAfterImportMaterialWithVertexColors(GLTFMaterial material, int materialIndex, Material materialObject)
4861
{
4962
Util.Log($"InteractivityImportContext::OnAfterImportMaterial Complete: {material.ToString()}");
63+
_pointerResolver.RegisterMaterial(material, materialIndex, materialObject);
64+
}
65+
66+
public override void OnAfterImportCamera(GLTFCamera camera, int cameraIndex, Camera cameraObject)
67+
{
68+
Util.Log($"InteractivityImportContext::OnAfterImportCamera Complete: {camera.ToString()}");
69+
_pointerResolver.RegisterCamera(camera, cameraIndex, cameraObject);
5070
}
5171

5272
public override void OnAfterImportTexture(GLTFTexture texture, int textureIndex, Texture textureObject)
@@ -59,9 +79,57 @@ public override void OnAfterImportScene(GLTFScene scene, int sceneIndex, GameObj
5979
Util.Log($"InteractivityImportContext::OnAfterImportScene Complete: {scene.Extensions}");
6080
}
6181

62-
public override void OnAfterImport()
82+
public override void OnLoadComplete(GameObject sceneObject)
6383
{
6484
Util.Log($"InteractivityImportContext::OnAfterImport Complete");
85+
86+
var extensions = _context.SceneImporter.Root?.Extensions;
87+
88+
if (extensions == null)
89+
{
90+
Util.Log("Extensions are null.");
91+
return;
92+
}
93+
94+
if (!extensions.TryGetValue(InteractivityGraphExtension.EXTENSION_NAME, out IExtension extensionValue))
95+
{
96+
Util.Log("Extensions does not contain interactivity.");
97+
return;
98+
}
99+
100+
if (extensionValue is not InteractivityGraphExtension interactivityGraph)
101+
{
102+
Util.Log("Extensions does not contain a graph.");
103+
return;
104+
}
105+
106+
try
107+
{
108+
_pointerResolver.CreatePointers();
109+
110+
var defaultGraphIndex = interactivityGraph.extensionData.defaultGraphIndex;
111+
// Can be used to inject a graph created from code in a hacky way for testing.
112+
//interactivityGraph.extensionData.graphs[defaultGraphIndex] = TestGraph.CreateTestGraph();
113+
var defaultGraph = interactivityGraph.extensionData.graphs[defaultGraphIndex];
114+
var eng = new BehaviourEngine(defaultGraph, _pointerResolver);
115+
116+
AnimationWrapper animationWrapper = null;
117+
var animationComponents = sceneObject.GetComponents<Animation>();
118+
if (animationComponents != null && animationComponents.Length > 0)
119+
{
120+
animationWrapper = sceneObject.AddComponent<AnimationWrapper>();
121+
eng.SetAnimationWrapper(animationWrapper, animationComponents[0]);
122+
}
123+
124+
var eventWrapper = sceneObject.AddComponent<EventWrapper>();
125+
126+
eventWrapper.SetData(eng, interactivityGraph.extensionData);
127+
}
128+
catch (Exception e)
129+
{
130+
Debug.LogException(e);
131+
return;
132+
}
65133
}
66134
}
67135

Runtime/Scripts/Interactivity/Playback/Context/Import/InteractivityImportPlugin.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,14 @@ namespace UnityGLTF.Interactivity.Playback
66
public class InteractivityImportPlugin : GLTFImportPlugin
77
{
88
public override string DisplayName => "KHR_interactivity_Importer";
9-
public override string Description => "Imports KHR compliant interactivity graphs";
9+
public override string Description => "Imports KHR compliant interactivity graphs for runtime playback.";
1010

1111
private InteractivityImportContext _context;
1212

1313
public override GLTFImportPluginContext CreateInstance(GLTFImportContext context)
1414
{
15-
_context = new InteractivityImportContext(this);
1615
GLTFProperty.RegisterExtension(new InteractivityGraphFactory());
16+
_context = new InteractivityImportContext(this, context);
1717

1818
return _context;
1919
}

Runtime/Scripts/Interactivity/Playback/Pointers/CameraPointers.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,8 +17,9 @@ public struct CameraPointers
1717
public Pointer<float> zFar;
1818
public Pointer<float> zNear;
1919

20-
public CameraPointers(Camera cam)
20+
public CameraPointers(in CameraData data)
2121
{
22+
var cam = data.unityCamera;
2223
// Unity does not allow you to set the width of the orthographic window directly.
2324
// cam.orthographicSize is the YMag and the width is then that value multiplied by your aspect ratio.
2425
orthographicXMag = new Pointer<float>()

Runtime/Scripts/Interactivity/Playback/Pointers/Materials/MaterialPointers.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -46,8 +46,9 @@ public struct MaterialPointers
4646

4747
public Material material { get; private set; }
4848

49-
public MaterialPointers(Material mat)
49+
public MaterialPointers(in MaterialData data)
5050
{
51+
var mat = data.unityMaterial;
5152
material = mat;
5253

5354
alphaCutoff = PointerHelpers.CreateFloatPointer(mat, alphaCutoffHash);

Runtime/Scripts/Interactivity/Playback/Pointers/MeshPointers.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,8 +12,9 @@ public struct MeshPointers
1212
public ReadOnlyPointer<int> weightsLength;
1313
public Pointer<float>[] weights;
1414

15-
public MeshPointers(GLTFMesh mesh)
15+
public MeshPointers(in MeshData data)
1616
{
17+
var mesh = data.mesh;
1718
if(mesh.Weights == null || mesh.Weights.Count == 0)
1819
{
1920
weightsLength = new ReadOnlyPointer<int>(() => 0);

Runtime/Scripts/Interactivity/Playback/Pointers/NodePointers.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,8 +20,10 @@ public struct NodePointers
2020
public Pointer<float>[] weights;
2121
public GameObject gameObject;
2222

23-
public NodePointers(GameObject go, GLTF.Schema.Node schema)
23+
public NodePointers(in NodeData data)
2424
{
25+
var go = data.unityObject;
26+
var schema = data.node;
2527
gameObject = go;
2628

2729
// Unity coordinate system differs from the GLTF one.

0 commit comments

Comments
 (0)