@@ -1746,13 +1746,98 @@ private EntityRecord UpdatePointsEntity(PointsData data, MeshSyncPlayerConfig co
1746
1746
return rec ;
1747
1747
}
1748
1748
1749
+ static Transform FindOrCreateByPath ( Transform parent , string path , Action < string > parentCreationCallback , bool worldPositionStays = true ) {
1750
+ string [ ] names = path . Split ( '/' ) ;
1751
+ if ( names . Length <= 0 )
1752
+ return null ;
1753
+
1754
+ //if parent is null, search from root
1755
+ Transform t = parent ;
1756
+ int tokenStartIdx = 0 ;
1757
+ if ( null == t ) {
1758
+ string rootGameObjectName = names [ 0 ] ;
1759
+ t = FilmInternalUtilities . GameObjectUtility . FindFirstRoot ( rootGameObjectName ) ;
1760
+ if ( null == t ) {
1761
+ GameObject go = new GameObject ( rootGameObjectName ) ;
1762
+ t = go . GetComponent < Transform > ( ) ;
1763
+ }
1764
+
1765
+ tokenStartIdx = 1 ;
1766
+ }
1767
+
1768
+ static Transform FindOrCreateChild ( Transform t , string childName , out bool didCreate , bool worldPositionStays = true ) {
1769
+ Transform childT = t . Find ( childName ) ;
1770
+ if ( null != childT ) {
1771
+ didCreate = false ;
1772
+ return childT ;
1773
+ }
1774
+
1775
+ GameObject go = new GameObject ( childName ) ;
1776
+ childT = go . transform ;
1777
+ childT . SetParent ( t , worldPositionStays ) ;
1778
+ didCreate = true ;
1779
+ return childT ;
1780
+ }
1781
+
1782
+ //loop over hierarchy of names and generate parents that don't exist
1783
+ int nameLength = names . Length ;
1784
+ List < string > processedParents = new List < string > ( ) ;
1785
+ for ( int i = tokenStartIdx ; i < nameLength ; ++ i ) {
1786
+ string nameToken = names [ i ] ;
1787
+ if ( string . IsNullOrEmpty ( nameToken ) )
1788
+ continue ;
1789
+
1790
+ processedParents . Add ( nameToken ) ;
1791
+
1792
+ t = FindOrCreateChild ( t , nameToken , out var didCreate , worldPositionStays ) ;
1793
+ if ( i < nameLength - 1 && didCreate ) {
1794
+ var parentPath = String . Join ( "/" , processedParents ) ;
1795
+ if ( ! parentPath . StartsWith ( "/" ) ) {
1796
+ parentPath = $ "/{ parentPath } ";
1797
+ }
1798
+
1799
+ parentCreationCallback ? . Invoke ( parentPath ) ;
1800
+ }
1801
+
1802
+ if ( null == t )
1803
+ return null ;
1804
+ }
1805
+
1806
+ return t ;
1807
+ }
1808
+
1809
+ void AddClientObject ( string path , out EntityRecord rec ) {
1810
+ if ( m_clientObjects . TryGetValue ( path , out rec ) )
1811
+ if ( rec . go == null ) {
1812
+ m_clientObjects . Remove ( path ) ;
1813
+ rec = null ;
1814
+ }
1815
+
1816
+ if ( rec == null ) {
1817
+ var trans = FindOrCreateByPath ( m_rootObject , path ,
1818
+ delegate ( string parentPath ) {
1819
+ EntityRecord parentRec = null ;
1820
+ AddClientObject ( parentPath , out parentRec ) ;
1821
+ if ( parentRec . dataType == EntityType . Unknown )
1822
+ parentRec . dataType = EntityType . Transform ;
1823
+ } ,
1824
+ false ) ;
1825
+
1826
+ rec = new EntityRecord {
1827
+ go = trans . gameObject ,
1828
+ trans = trans ,
1829
+ recved = true
1830
+ } ;
1831
+ m_clientObjects . Add ( path , rec ) ;
1832
+ }
1833
+ }
1834
+
1749
1835
private EntityRecord UpdateTransformEntity ( TransformData data , MeshSyncPlayerConfig config ) {
1750
1836
string path = data . path ;
1751
1837
int hostID = data . hostID ;
1752
1838
if ( path . Length == 0 )
1753
1839
return null ;
1754
1840
1755
- Transform trans = null ;
1756
1841
EntityRecord rec = null ;
1757
1842
if ( hostID != Lib . invalidID ) {
1758
1843
if ( m_hostObjects . TryGetValue ( hostID , out rec ) )
@@ -1765,21 +1850,7 @@ private EntityRecord UpdateTransformEntity(TransformData data, MeshSyncPlayerCon
1765
1850
return null ;
1766
1851
}
1767
1852
else {
1768
- if ( m_clientObjects . TryGetValue ( path , out rec ) )
1769
- if ( rec . go == null ) {
1770
- m_clientObjects . Remove ( path ) ;
1771
- rec = null ;
1772
- }
1773
-
1774
- if ( rec == null ) {
1775
- trans = FilmInternalUtilities . GameObjectUtility . FindOrCreateByPath ( m_rootObject , path , false ) ;
1776
- rec = new EntityRecord {
1777
- go = trans . gameObject ,
1778
- trans = trans ,
1779
- recved = true
1780
- } ;
1781
- m_clientObjects . Add ( path , rec ) ;
1782
- }
1853
+ AddClientObject ( path , out rec ) ;
1783
1854
}
1784
1855
1785
1856
return UpdateTransformEntity ( data , config , rec ) ;
0 commit comments