コード例 #1
0
        public IEnumerator EndToEnd_ManagedComponents()
        {
            var guid = GUID.Generate();
            var temp = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);

            temp.name = "EndToEndTest_ManagedComponentsScene";
            EditorSceneManager.SetActiveScene(temp);
            var cube            = GameObject.CreatePrimitive(PrimitiveType.Cube);
            var entitySceneData = EditorEntityScenes.WriteEntityScene(temp, guid);

            Assert.AreEqual(1, entitySceneData.Length);

            var sceneEntity = m_Manager.CreateEntity();

            m_Manager.AddComponentData(sceneEntity, entitySceneData[0]);

            var query = m_Manager.CreateEntityQuery(typeof(ManagedObjectWithObjectReference));

            for (int i = 0; i != 10; i++)
            {
                m_Manager.AddComponentData(sceneEntity, new RequestSceneLoaded());

                Assert.AreEqual(1, m_Manager.Debug.EntityCount);

                for (int w = 0; w != 1000; w++)
                {
                    World.GetOrCreateSystem <SceneSectionStreamingSystem>().Update();
                    if (1 != m_Manager.Debug.EntityCount)
                    {
                        break;
                    }

                    yield return(null);
                }

                // 1. Scene entity
                // 2. Public ref array
                // 3. Mesh Renderer
                Assert.AreEqual(3, m_Manager.Debug.EntityCount);

                var entities = query.ToEntityArray(Collections.Allocator.TempJob);
                Assert.AreEqual(1, entities.Length);
                var component = m_Manager.GetComponentData <ManagedObjectWithObjectReference>(entities[0]);
                Assert.NotNull(component.Texture);
                Assert.AreEqual(512, component.Texture.width);
                Assert.AreEqual(512, component.Texture.height);
                entities.Dispose();

                m_Manager.RemoveComponent <RequestSceneLoaded>(sceneEntity);
                World.GetOrCreateSystem <SceneSectionStreamingSystem>().Update();

                Assert.AreEqual(1, m_Manager.Debug.EntityCount);
            }
            query.Dispose();
        }
コード例 #2
0
        public IEnumerator EndToEnd()
        {
            var guid = GUID.Generate();
            var temp = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);

            EditorSceneManager.SetActiveScene(temp);
            var cube            = GameObject.CreatePrimitive(PrimitiveType.Cube);
            var entitySceneData = EditorEntityScenes.WriteEntityScene(temp, guid);

            Assert.AreEqual(1, entitySceneData.Length);

            var sceneEntity = m_Manager.CreateEntity();

            m_Manager.AddComponentData(sceneEntity, entitySceneData[0]);

            for (int i = 0; i != 10; i++)
            {
                m_Manager.AddComponentData(sceneEntity, new RequestSceneLoaded());

                Assert.AreEqual(1, m_Manager.Debug.EntityCount);

                for (int w = 0; w != 1000; w++)
                {
                    World.GetOrCreateSystem <ResolveSceneReferenceSystem>().Update();
                    World.GetOrCreateSystem <SceneSectionStreamingSystem>().Update();
                    if (1 != m_Manager.Debug.EntityCount)
                    {
                        break;
                    }

                    yield return(null);
                }

                // 1. Scene entity
                // 2. Public ref array
                // 3. Mesh Renderer
                Assert.AreEqual(3, m_Manager.Debug.EntityCount);

                m_Manager.RemoveComponent <RequestSceneLoaded>(sceneEntity);
                World.GetOrCreateSystem <SceneSectionStreamingSystem>().Update();

                Assert.AreEqual(1, m_Manager.Debug.EntityCount);
            }
        }
コード例 #3
0
        public IEnumerator LodSplitOverSections()
        {
            var guid = GUID.Generate();
            var temp = EditorSceneManager.NewScene(NewSceneSetup.EmptyScene);

            EditorSceneManager.SetActiveScene(temp);

            // Large set of dummy entities to stress the public ref array
            const int dummyCount = 100;

            for (int i = 0; i < dummyCount; ++i)
            {
                new GameObject($"Dummy {i}");
            }

            var lod0Renderer = GameObject.CreatePrimitive(PrimitiveType.Cube);
            var lod1Renderer = GameObject.CreatePrimitive(PrimitiveType.Cube);
            var lod2Renderer = GameObject.CreatePrimitive(PrimitiveType.Cube);

            lod0Renderer.transform.position = new Vector3(0, 0, 0);
            lod1Renderer.transform.position = new Vector3(1, 0, 0);
            lod2Renderer.transform.position = new Vector3(2, 0, 0);

            var highLod = new GameObject("HighLOD");

            highLod.SetActive(false);
            var highLodGroup = highLod.AddComponent <LODGroup>();

            var lowLod = new GameObject("LowLOD");

            lowLod.SetActive(false);
            var lowLodGroup = lowLod.AddComponent <LODGroup>();

            var hlod = new GameObject("HLOD");

            hlod.SetActive(false);
            var hlodComponent = hlod.AddComponent <HLOD>();
            var hlodGroup     = hlod.GetComponent <LODGroup>();

            lod0Renderer.transform.parent = highLod.transform;
            lod1Renderer.transform.parent = highLod.transform;
            lod2Renderer.transform.parent = lowLod.transform;

            highLod.transform.parent = hlod.transform;
            lowLod.transform.parent  = hlod.transform;

            highLodGroup.SetLODs(new[]
            {
                new LOD(0.75f, new[] { lod0Renderer.GetComponent <Renderer>() }),
                new LOD(0.00f, new[] { lod1Renderer.GetComponent <Renderer>() }),
            });

            lowLodGroup.SetLODs(new[]
            {
                new LOD(0.00f, new[] { lod2Renderer.GetComponent <Renderer>() }),
            });

            hlodComponent.LODParentTransforms = new[] { highLod.transform, lowLod.transform };
            hlodGroup.SetLODs(new[]
            {
                new LOD(0.25f, new Renderer[] {}),
                new LOD(0.00f, new Renderer[] {}),
            });

            highLod.SetActive(true);
            lowLod.SetActive(true);
            hlod.SetActive(true);

            var entitySceneData = EditorEntityScenes.WriteEntityScene(temp, guid, 0);

            Assert.AreEqual(2, entitySceneData.Length);

            var sceneEntitySection0 = m_Manager.CreateEntity();

            m_Manager.AddComponentData(sceneEntitySection0, entitySceneData[0]);

            var sceneEntitySection1 = m_Manager.CreateEntity();

            m_Manager.AddComponentData(sceneEntitySection1, entitySceneData[1]);

            // Loading one scene at a time
            for (int i = 0; i != 10; i++)
            {
                Assert.AreEqual(2, m_Manager.Debug.EntityCount);

                m_Manager.AddComponentData(sceneEntitySection0, new RequestSceneLoaded());

                for (int w = 0; w != 1000; w++)
                {
                    World.GetOrCreateSystem <SubSceneStreamingSystem>().Update();
                    if (2 != m_Manager.Debug.EntityCount)
                    {
                        break;
                    }

                    Assert.AreNotEqual(999, w, "Streaming is stuck");

                    yield return(null);
                }

                // 1. Scene entity section 0
                // 2. Scene entity section 1
                // 3. Public ref array
                // 4. HLOD
                // 5. LowLod group
                // 6. LOD2 renderer
                Assert.AreEqual(dummyCount + 6, m_Manager.Debug.EntityCount);

                // Destroying and recreating the system causes the streaming worlds to reset, otherwise oversize
                // buffers could carry over and would not trigger the right asserts.
                World.DestroySystem(World.GetExistingSystem <SubSceneStreamingSystem>());

                m_Manager.AddComponentData(sceneEntitySection1, new RequestSceneLoaded());

                for (int w = 0; w != 1000; w++)
                {
                    World.GetOrCreateSystem <SubSceneStreamingSystem>().Update();
                    if (dummyCount + 6 != m_Manager.Debug.EntityCount)
                    {
                        break;
                    }

                    Assert.AreNotEqual(999, w, "Streaming is stuck");

                    yield return(null);
                }

                // 1. Scene entity section 0
                // 2. Scene entity section 1
                // 3. Public ref array
                // 4. HLOD
                // 5. LowLod group
                // 6. LOD2 renderer
                // 7. External ref array
                // 8. HighLod group
                // 9. LOD1 renderer
                // A. LOD0 renderer
                Assert.AreEqual(dummyCount + 10, m_Manager.Debug.EntityCount);

                m_Manager.RemoveComponent <RequestSceneLoaded>(sceneEntitySection1);
                World.GetOrCreateSystem <SubSceneStreamingSystem>().Update();

                Assert.AreEqual(dummyCount + 6, m_Manager.Debug.EntityCount);

                m_Manager.RemoveComponent <RequestSceneLoaded>(sceneEntitySection0);
                World.GetOrCreateSystem <SubSceneStreamingSystem>().Update();

                Assert.AreEqual(2, m_Manager.Debug.EntityCount);
            }
        }