private void UpdateInstantiatedSceneObject()

in Assets/MRTK/Providers/Experimental/WindowsSceneUnderstanding/WindowsSceneUnderstandingObserver.cs [1123:1225]


        private void UpdateInstantiatedSceneObject(SpatialAwarenessSceneObject existingSaso, SpatialAwarenessSceneObject newSaso)
        {
            if (newSaso == null)
            {
                GameObject.Destroy(existingSaso.GameObject);
                return;
            }
            
            newSaso.GameObject = existingSaso.GameObject;
            newSaso.GameObject.transform.localPosition = newSaso.Position;
            newSaso.GameObject.transform.localRotation = newSaso.Rotation;

            // Update GameObjects for Quads and Meshes
            if (RequestPlaneData)
            {
                int i = 0;
                while (i < existingSaso.Quads.Count && i < newSaso.Quads.Count)
                {
                    var gameObject = newSaso.Quads[i].GameObject = existingSaso.Quads[i].GameObject;
                    gameObject.name = $"Quad {newSaso.Quads[i].Id}";
                    gameObject.transform.localScale = new Vector3(newSaso.Quads[i].Extents.x, newSaso.Quads[i].Extents.y, 0);
                    if (RequestOcclusionMask && 
                        ((existingSaso.Quads[i].OcclusionMask == null || newSaso.Quads[i].OcclusionMask == null)
                        || !existingSaso.Quads[i].OcclusionMask.SequenceEqual(newSaso.Quads[i].OcclusionMask)))
                    {
                        var meshRender = newSaso.Quads[i].GameObject.GetComponent<MeshRenderer>();
                        meshRender.enabled = true;
                        if (newSaso.Quads[i].OcclusionMask != null)
                        {
                            var occlusionTexture = OcclusionTexture(newSaso.Quads[i].OcclusionMask);
                            meshRender.material.mainTexture = occlusionTexture;
                        }
                        else
                        {
                            meshRender.enabled = false;
                        }
                    }
                    i++;
                }

                if (existingSaso.Quads.Count < newSaso.Quads.Count)
                {
                    for (; i < newSaso.Quads.Count; i++)
                    {
                        InstantiateQuad(newSaso, newSaso.Quads[i]);
                    }

                }
                else
                {
                    for (; i < existingSaso.Quads.Count; i++)
                    {
                        GameObject.Destroy(existingSaso.Quads[i].GameObject);
                    }
                }

            }

            if (RequestMeshData)
            {
                int i = 0;
                while (i < existingSaso.Meshes.Count && i < newSaso.Meshes.Count)
                {
                    var gameObject = newSaso.Meshes[i].GameObject = existingSaso.Meshes[i].GameObject;
                    gameObject.name = $"Mesh {newSaso.Meshes[i].Id}";
                    if (DefaultWorldMeshMaterial && existingSaso.SurfaceType != newSaso.SurfaceType)
                    {
                        if (newSaso.SurfaceType == SpatialAwarenessSurfaceTypes.World)
                        {
                            newSaso.Meshes[i].GameObject.GetComponent<MeshRenderer>().sharedMaterial = DefaultWorldMeshMaterial;
                        }
                        else if (existingSaso.SurfaceType == SpatialAwarenessSurfaceTypes.World)
                        {
                            newSaso.Meshes[i].GameObject.GetComponent<MeshRenderer>().sharedMaterial = DefaultMaterial;
                        }
                    }
                    if (!existingSaso.Meshes[i].UVs.SequenceEqual(newSaso.Meshes[i].UVs) ||
                        !existingSaso.Meshes[i].Indices.SequenceEqual(newSaso.Meshes[i].Indices) ||
                        !existingSaso.Meshes[i].Vertices.SequenceEqual(newSaso.Meshes[i].Vertices))
                    {
                        var meshFilter = newSaso.Meshes[i].GameObject.GetComponent<MeshFilter>();
                        meshFilter.mesh = UnityMeshFromMeshData(newSaso.Meshes[i]);
                    }
                    i++;
                }

                if (existingSaso.Meshes.Count < newSaso.Meshes.Count)
                {
                    for (; i < newSaso.Meshes.Count; i++)
                    {
                        InstantiateMesh(newSaso, newSaso.Meshes[i]);
                    }

                }
                else
                {
                    for (; i < existingSaso.Meshes.Count; i++)
                    {
                        GameObject.Destroy(existingSaso.Meshes[i].GameObject);
                    }
                }
            }
        }