Ejemplo n.º 1
0
        protected override void OnUpdate()
        {
            if (!SceneService.AreStartupScenesLoaded(World))
            {
                return;
            }
#if DEBUG
            var countEntsStart = GetNumEntities();
#endif
            Entity eMainView = FindMainViewNode();
            if (eMainView == Entity.Null)
            {
                // we only build a default graph if there are no existing nodes - otherwise assume they are already built
                RenderDebug.Log("Auto building default render graph");
                eMainView = BuildDefaultRenderGraph(1920, 1080);
            }

            // build light nodes for lights that have no node associated
            BuildAllLightNodes(eMainView);

#if DEBUG
            var countEntsEnd = GetNumEntities();
            if (countEntsEnd != countEntsStart)
            {
                RenderDebug.LogFormatAlways("Render graph builder added entities (was {0}, now {1})", countEntsStart, countEntsEnd);
            }
#endif
            //Disable Render graph builder system. We need to create it only once
            Enabled = false;
        }
Ejemplo n.º 2
0
        protected override void OnUpdate()
        {
            if (!SceneService.AreStartupScenesLoaded(World))
            {
                return;
            }
#if DEBUG
            var countEntsStart = GetNumEntities();
#endif
            // gather all passes
            var q = GetEntityQuery(ComponentType.ReadOnly <RenderPass>());
            m_allPasses = q.ToEntityArray(Allocator.TempJob);

            // go through lit renderers and assign lighting setup to them
            // create light
            // TEMP HACK
            var    q2        = GetEntityQuery(ComponentType.ReadOnly <LightingBGFX>());
            Entity eLighting = Entity.Null;
            if (q2.CalculateEntityCount() == 0)
            {
                eLighting = EntityManager.CreateEntity();
                EntityManager.AddComponentData(eLighting, new LightingBGFX());
                // add both ways lookup lighting setup <-> light
                var b1 = EntityManager.AddBuffer <LightToBGFXLightingSetup>(eLighting);
                Entities.WithAll <Light>().ForEach((Entity e) =>
                {
                    b1.Add(new LightToBGFXLightingSetup {
                        e = e
                    });
                });
                Entities.WithAll <Light>().ForEach((Entity e) =>
                {
                    var b = EntityManager.AddBuffer <LightToBGFXLightingSetup>(e);
                    b.Add(new LightToBGFXLightingSetup {
                        e = eLighting
                    });
                });
            }
            else
            {
                var a = q2.ToEntityArray(Allocator.TempJob);
                Assert.IsTrue(a.Length == 1);
                eLighting = a[0];
                a.Dispose();
            }
            Entities.WithNone <LightingRef>().ForEach((Entity e, ref MeshRenderer rlmr, ref LitMeshReference meshRef) =>
            {
                OptionalSetSharedComponent(e, new LightingRef {
                    e = eLighting
                });
            });
            // EOH

            m_buildGroups = new NativeHashMap <BuildGroup, Entity>(256, Allocator.TempJob);

            // find existing groups and add them to builder
            Entities.WithAll <RenderGroup>().ForEach((Entity e, ref BuildGroup bg) =>
            {
                m_buildGroups.Add(bg, e);
            });

            // go through all known render types, and assign groups to them
            // assign groups to all renderers
            Entities.WithNone <RenderToPasses>().ForEach((Entity e, ref MeshRenderer rlmr) =>
            {
                bool isTransparent = false;
                if (EntityManager.HasComponent <SimpleMeshReference>(e))
                {
                    if (EntityManager.HasComponent <SimpleMaterial>(rlmr.material))
                    {
                        isTransparent = EntityManager.GetComponentData <SimpleMaterial>(rlmr.material).transparent;
                    }
                    else if (EntityManager.HasComponent <SimpleMaterialBGFX>(rlmr.material))
                    {
                        var matBGFX   = EntityManager.GetComponentData <SimpleMaterialBGFX>(rlmr.material);
                        isTransparent = (matBGFX.state & (ulong)bgfx.StateFlags.WriteZ) != (ulong)bgfx.StateFlags.WriteZ;
                    }
                }
                else if (EntityManager.HasComponent <LitMeshReference>(e))
                {
                    if (EntityManager.HasComponent <LitMaterial>(rlmr.material))
                    {
                        isTransparent = EntityManager.GetComponentData <LitMaterial>(rlmr.material).transparent;
                    }
                    else if (EntityManager.HasComponent <LitMaterialBGFX>(rlmr.material))
                    {
                        var matBGFX   = EntityManager.GetComponentData <LitMaterialBGFX>(rlmr.material);
                        isTransparent = (matBGFX.state & (ulong)bgfx.StateFlags.WriteZ) != (ulong)bgfx.StateFlags.WriteZ;
                    }
                }

                CameraMask cameraMask = new CameraMask {
                    mask = ulong.MaxValue
                };
                if (EntityManager.HasComponent <CameraMask>(e))
                {
                    cameraMask = EntityManager.GetComponentData <CameraMask>(e);
                }
                ShadowMask shadowMask = new ShadowMask {
                    mask = ulong.MaxValue
                };
                if (EntityManager.HasComponent <ShadowMask>(e))
                {
                    shadowMask = EntityManager.GetComponentData <ShadowMask>(e);
                }
                Entity eGroup;
                if (isTransparent)
                {
                    eGroup = FindOrCreateRenderGroup(new BuildGroup {
                        passTypes = RenderPassType.Transparent, cameraMask = cameraMask, shadowMask = shadowMask
                    });
                }
                else
                {
                    eGroup = FindOrCreateRenderGroup(new BuildGroup {
                        passTypes = RenderPassType.Opaque | RenderPassType.ZOnly | RenderPassType.ShadowMap, cameraMask = cameraMask, shadowMask = shadowMask
                    });
                }

                OptionalSetSharedComponent(e, new RenderToPasses {
                    e = eGroup
                });
            });

            Entities.WithNone <RenderToPasses>().ForEach((Entity e, ref GizmoLight rlgmr) =>
            {
                ShadowMask shadowMask = new ShadowMask {
                    mask = ulong.MaxValue
                };
                CameraMask cameraMask = new CameraMask {
                    mask = 0
                };
                Entity eGroup = FindOrCreateRenderGroup(new BuildGroup {
                    passTypes = RenderPassType.Transparent, cameraMask = cameraMask, shadowMask = shadowMask
                });
                OptionalSetSharedComponent(e, new RenderToPasses {
                    e = eGroup
                });
            });


            m_buildGroups.Dispose();
            m_allPasses.Dispose();

            // TODO: remove any passes that are not referenced by anything

#if DEBUG
            var countEntsEnd = GetNumEntities();
            if (countEntsEnd != countEntsStart)
            {
                RenderDebug.LogFormatAlways("Render graph builder added entities (was {0}, now {1})", countEntsStart, countEntsEnd);
            }
#endif
        }