Skip to content

Commit 6aa9c4d

Browse files
committed
Colliders only get added to nodes/children of nodes that contain a selectability or hoverability extension if a collider is not already present.
1 parent 2da88e0 commit 6aa9c4d

File tree

2 files changed

+38
-22
lines changed

2 files changed

+38
-22
lines changed

Runtime/Scripts/Interactivity/Playback/Context/Export/InteractivityExportContext.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -29,31 +29,31 @@ public override void AfterSceneExport(GLTFSceneExporter exporter, GLTFRoot gltfR
2929
Util.Log($"InteractivityExportContext::AfterSceneExport ");
3030

3131
if (exporter.RootTransforms == null) return;
32-
GLTFInteractivityPlayback wrapper = null;
32+
GLTFInteractivityPlayback playback = null;
3333
Transform t;
3434

3535
// This assumes that EventWrapper exists on one of the root transforms which I think must be true due to how we import.
3636
foreach (var transform in exporter.RootTransforms)
3737
{
3838
t = transform;
3939

40-
if (t.TryGetComponent(out wrapper))
40+
if (t.TryGetComponent(out playback))
4141
break;
4242

4343
while (t.parent != null)
4444
{
45-
if (t.parent.TryGetComponent(out wrapper))
45+
if (t.parent.TryGetComponent(out playback))
4646
break;
4747

4848
t = t.parent;
4949
}
5050
}
5151

52-
if (wrapper == null)
52+
if (playback == null)
5353
return;
5454

5555
exporter.DeclareExtensionUsage(InteractivityGraphExtension.EXTENSION_NAME, true);
56-
gltfRoot.AddExtension(InteractivityGraphExtension.EXTENSION_NAME, new InteractivityGraphExtension(wrapper.extensionData));
56+
gltfRoot.AddExtension(InteractivityGraphExtension.EXTENSION_NAME, new InteractivityGraphExtension(playback.extensionData));
5757
}
5858
public override void AfterTextureExport(GLTFSceneExporter exporter, GLTFSceneExporter.UniqueTexture texture, int index, GLTFTexture tex)
5959
{

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

Lines changed: 33 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -13,6 +13,7 @@ public class InteractivityImportContext : GLTFImportPluginContext
1313
private GLTFImportContext _context;
1414
private InteractivityGraphExtension _interactivityGraph;
1515
private bool _hasSelectOrHoverNode;
16+
private List<GameObject> _selectableOrHoverableObjects;
1617

1718
public InteractivityImportContext(InteractivityImportPlugin interactivityLoader, GLTFImportContext context)
1819
{
@@ -25,6 +26,8 @@ public InteractivityImportContext(InteractivityImportPlugin interactivityLoader,
2526
/// </summary>
2627
public override void OnBeforeImport()
2728
{
29+
_hasSelectOrHoverNode = false;
30+
_selectableOrHoverableObjects = new();
2831
_pointerResolver = new();
2932
Util.Log($"InteractivityImportContext::OnBeforeImport Complete");
3033
}
@@ -92,29 +95,19 @@ public override void OnBeforeImportScene(GLTFScene scene)
9295

9396
public override void OnAfterImportNode(GLTF.Schema.Node node, int nodeIndex, GameObject nodeObject)
9497
{
95-
AddColliderIfNecessary(node, nodeIndex, nodeObject);
98+
CheckIfNodeIsInteractable(node, nodeIndex, nodeObject);
9699

97100
Util.Log($"InteractivityImportContext::OnAfterImportNode Complete: {node.ToString()}");
98101
_pointerResolver.RegisterNode(node, nodeIndex, nodeObject);
99102
}
100103

101-
private void AddColliderIfNecessary(GLTF.Schema.Node node, int nodeIndex, GameObject nodeObject)
104+
private void CheckIfNodeIsInteractable(GLTF.Schema.Node node, int nodeIndex, GameObject nodeObject)
102105
{
103-
if (!_hasSelectOrHoverNode || nodeObject.TryGetComponent(out Collider collider))
106+
if (!_hasSelectOrHoverNode)
104107
return;
105108

106-
Mesh mesh = null;
107-
108-
if (nodeObject.TryGetComponent(out MeshFilter mf))
109-
mesh = mf.sharedMesh;
110-
else if (nodeObject.TryGetComponent(out SkinnedMeshRenderer smr))
111-
mesh = smr.sharedMesh;
112-
113-
if (mesh == null)
114-
return;
115-
116-
var selectable = true;
117-
var hoverable = true;
109+
var selectable = false;
110+
var hoverable = false;
118111

119112
if (node.Extensions != null)
120113
{
@@ -127,8 +120,8 @@ private void AddColliderIfNecessary(GLTF.Schema.Node node, int nodeIndex, GameOb
127120

128121
if (!selectable && !hoverable)
129122
return;
130-
131-
nodeObject.AddComponent<BoxCollider>();
123+
124+
_selectableOrHoverableObjects.Add(nodeObject);
132125
}
133126

134127
public override void OnAfterImportMesh(GLTFMesh mesh, int meshIndex, Mesh meshObject)
@@ -161,6 +154,11 @@ public override void OnAfterImportScene(GLTFScene scene, int sceneIndex, GameObj
161154
if (_interactivityGraph == null)
162155
return;
163156

157+
for (int i = 0; i < _selectableOrHoverableObjects.Count; i++)
158+
{
159+
AddCollidersToChildrenOfInteractableNode(_selectableOrHoverableObjects[i]);
160+
}
161+
164162
try
165163
{
166164
_pointerResolver.RegisterSceneData(_context.SceneImporter.Root);
@@ -206,5 +204,23 @@ public override void OnAfterImportScene(GLTFScene scene, int sceneIndex, GameObj
206204
return;
207205
}
208206
}
207+
208+
private void AddCollidersToChildrenOfInteractableNode(GameObject nodeObject)
209+
{
210+
var meshFilters = nodeObject.GetComponentsInChildren<MeshFilter>();
211+
212+
if (meshFilters.Length <= 0)
213+
return;
214+
215+
GameObject go;
216+
217+
for (int i = 0; i < meshFilters.Length; i++)
218+
{
219+
go = meshFilters[i].gameObject;
220+
221+
if (!go.TryGetComponent(out Collider collider))
222+
go.AddComponent<BoxCollider>();
223+
}
224+
}
209225
}
210226
}

0 commit comments

Comments
 (0)