From 6a9a5f182bb00a359ffec8817e88b41c6520e821 Mon Sep 17 00:00:00 2001 From: Christian Schinkoethe Date: Thu, 30 Mar 2023 14:17:27 +0100 Subject: [PATCH 1/4] Ensure parent objects are added when an object is created in a hierarchy with empty transforms. --- Runtime/Scripts/BaseMeshSync.cs | 43 ++++++++++++++++++++++----------- 1 file changed, 29 insertions(+), 14 deletions(-) diff --git a/Runtime/Scripts/BaseMeshSync.cs b/Runtime/Scripts/BaseMeshSync.cs index dc4a453ce..15ab23614 100644 --- a/Runtime/Scripts/BaseMeshSync.cs +++ b/Runtime/Scripts/BaseMeshSync.cs @@ -1746,6 +1746,24 @@ private EntityRecord UpdatePointsEntity(PointsData data, MeshSyncPlayerConfig co return rec; } + void AddClientObject(string path, out EntityRecord rec, ref Transform trans) { + if (m_clientObjects.TryGetValue(path, out rec)) + if (rec.go == null) { + m_clientObjects.Remove(path); + rec = null; + } + + if (rec == null) { + trans = FilmInternalUtilities.GameObjectUtility.FindOrCreateByPath(m_rootObject, path, false); + rec = new EntityRecord { + go = trans.gameObject, + trans = trans, + recved = true + }; + m_clientObjects.Add(path, rec); + } + } + private EntityRecord UpdateTransformEntity(TransformData data, MeshSyncPlayerConfig config) { string path = data.path; int hostID = data.hostID; @@ -1765,20 +1783,17 @@ private EntityRecord UpdateTransformEntity(TransformData data, MeshSyncPlayerCon return null; } else { - if (m_clientObjects.TryGetValue(path, out rec)) - if (rec.go == null) { - m_clientObjects.Remove(path); - rec = null; - } - - if (rec == null) { - trans = FilmInternalUtilities.GameObjectUtility.FindOrCreateByPath(m_rootObject, path, false); - rec = new EntityRecord { - go = trans.gameObject, - trans = trans, - recved = true - }; - m_clientObjects.Add(path, rec); + AddClientObject(path, out rec, ref trans); + + // Ensure any objects that were created as parent of this object are also added to m_clientObjects: + var names = path.Split("/"); + for (int i = names.Length - 1; i > 1; i--) { + var parentPath = String.Join("/", names.Take(i)); + Transform parentTrans = null; + EntityRecord parentRec = null; + AddClientObject(parentPath, out parentRec, ref parentTrans); + if (parentRec.dataType == EntityType.Unknown) + parentRec.dataType = EntityType.Transform; } } From 699a501f669e1931fb16e8d033f4b629d3e3377f Mon Sep 17 00:00:00 2001 From: Christian Schinkoethe Date: Fri, 31 Mar 2023 10:19:48 +0100 Subject: [PATCH 2/4] Fix for compiler error in yamato --- Runtime/Scripts/BaseMeshSync.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Runtime/Scripts/BaseMeshSync.cs b/Runtime/Scripts/BaseMeshSync.cs index 15ab23614..bff08ebad 100644 --- a/Runtime/Scripts/BaseMeshSync.cs +++ b/Runtime/Scripts/BaseMeshSync.cs @@ -1786,7 +1786,7 @@ private EntityRecord UpdateTransformEntity(TransformData data, MeshSyncPlayerCon AddClientObject(path, out rec, ref trans); // Ensure any objects that were created as parent of this object are also added to m_clientObjects: - var names = path.Split("/"); + var names = path.Split('/'); for (int i = names.Length - 1; i > 1; i--) { var parentPath = String.Join("/", names.Take(i)); Transform parentTrans = null; From 29fc485ad66090709110c56cc5ecc7c1186affeb Mon Sep 17 00:00:00 2001 From: Christian Schinkoethe Date: Tue, 4 Apr 2023 14:16:51 +0100 Subject: [PATCH 3/4] Refactoring to make the code more complicated --- Runtime/Scripts/BaseMeshSync.cs | 98 ++++++++++++++++++++++++++++----- 1 file changed, 83 insertions(+), 15 deletions(-) diff --git a/Runtime/Scripts/BaseMeshSync.cs b/Runtime/Scripts/BaseMeshSync.cs index bff08ebad..5ae4c4663 100644 --- a/Runtime/Scripts/BaseMeshSync.cs +++ b/Runtime/Scripts/BaseMeshSync.cs @@ -1746,7 +1746,79 @@ private EntityRecord UpdatePointsEntity(PointsData data, MeshSyncPlayerConfig co return rec; } - void AddClientObject(string path, out EntityRecord rec, ref Transform trans) { + static Transform FindOrCreateByPath(Transform parent, string path, Action parentCreationCallback, bool worldPositionStays = true) { + string[] names = path.Split('/'); + if (names.Length <= 0) + return null; + + static Transform FindFirstRoot(string objectName) { + GameObject[] roots = SceneManager.GetActiveScene().GetRootGameObjects(); + foreach (GameObject go in roots) { + if (go.name != objectName) + continue; + + return go.transform; + } + + return null; + } + + //if parent is null, search from root + Transform t = parent; + int tokenStartIdx = 0; + if (null == t) { + string rootGameObjectName = names[0]; + t = FindFirstRoot(rootGameObjectName); + if (null == t) { + GameObject go = new GameObject(rootGameObjectName); + t = go.GetComponent(); + } + + tokenStartIdx = 1; + } + + static Transform FindOrCreateChild(Transform t, string childName, out bool didCreate, bool worldPositionStays = true) { + Transform childT = t.Find(childName); + if (null != childT) { + didCreate = false; + return childT; + } + + GameObject go = new GameObject(childName); + childT = go.transform; + childT.SetParent(t, worldPositionStays); + didCreate = true; + return childT; + } + + //loop over hierarchy of names and generate parents that don't exist + int nameLength = names.Length; + List processedParents = new List(); + for (int i = tokenStartIdx; i < nameLength; ++i) { + string nameToken = names[i]; + if (string.IsNullOrEmpty(nameToken)) + continue; + + processedParents.Add(nameToken); + + t = FindOrCreateChild(t, nameToken, out var didCreate, worldPositionStays); + if (i < nameLength - 1 && didCreate) { + var parentPath = String.Join("/", processedParents); + if (!parentPath.StartsWith("/")) { + parentPath = $"/{parentPath}"; + } + + parentCreationCallback?.Invoke(parentPath); + } + + if (null == t) + return null; + } + + return t; + } + + void AddClientObject(string path, out EntityRecord rec) { if (m_clientObjects.TryGetValue(path, out rec)) if (rec.go == null) { m_clientObjects.Remove(path); @@ -1754,7 +1826,15 @@ void AddClientObject(string path, out EntityRecord rec, ref Transform trans) { } if (rec == null) { - trans = FilmInternalUtilities.GameObjectUtility.FindOrCreateByPath(m_rootObject, path, false); + var trans = FindOrCreateByPath(m_rootObject, path, + delegate(string parentPath) { + EntityRecord parentRec = null; + AddClientObject(parentPath, out parentRec); + if (parentRec.dataType == EntityType.Unknown) + parentRec.dataType = EntityType.Transform; + }, + false); + rec = new EntityRecord { go = trans.gameObject, trans = trans, @@ -1770,7 +1850,6 @@ private EntityRecord UpdateTransformEntity(TransformData data, MeshSyncPlayerCon if (path.Length == 0) return null; - Transform trans = null; EntityRecord rec = null; if (hostID != Lib.invalidID) { if (m_hostObjects.TryGetValue(hostID, out rec)) @@ -1783,18 +1862,7 @@ private EntityRecord UpdateTransformEntity(TransformData data, MeshSyncPlayerCon return null; } else { - AddClientObject(path, out rec, ref trans); - - // Ensure any objects that were created as parent of this object are also added to m_clientObjects: - var names = path.Split('/'); - for (int i = names.Length - 1; i > 1; i--) { - var parentPath = String.Join("/", names.Take(i)); - Transform parentTrans = null; - EntityRecord parentRec = null; - AddClientObject(parentPath, out parentRec, ref parentTrans); - if (parentRec.dataType == EntityType.Unknown) - parentRec.dataType = EntityType.Transform; - } + AddClientObject(path, out rec); } return UpdateTransformEntity(data, config, rec); From 75a63f94b212110944923c07a56de49400f2dac3 Mon Sep 17 00:00:00 2001 From: Christian Schinkoethe Date: Wed, 5 Apr 2023 13:40:46 +0100 Subject: [PATCH 4/4] Using existing method instead of new one --- Runtime/Scripts/BaseMeshSync.cs | 16 ++-------------- 1 file changed, 2 insertions(+), 14 deletions(-) diff --git a/Runtime/Scripts/BaseMeshSync.cs b/Runtime/Scripts/BaseMeshSync.cs index 5ae4c4663..c36b8a6d2 100644 --- a/Runtime/Scripts/BaseMeshSync.cs +++ b/Runtime/Scripts/BaseMeshSync.cs @@ -1750,25 +1750,13 @@ static Transform FindOrCreateByPath(Transform parent, string path, Action();