Ejemplo n.º 1
0
        private void FinalizePass(Entity e, bool isTransparent)
        {
            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
            });
        }
Ejemplo n.º 2
0
        protected override void OnUpdate()
        {
            // go through all known render types, and assign groups to them
            // assign groups to all renderers
            Entities.WithAny <SimpleMeshRenderer, SimpleParticleRenderer>().WithoutBurst().WithStructuralChanges().WithNone <RenderToPasses>().ForEach((Entity e, ref MeshRenderer rlmr) => {
                bool isTransparent = false;
                if (EntityManager.HasComponent <SimpleMaterial>(rlmr.material))
                {
                    isTransparent = EntityManager.GetComponentData <SimpleMaterial>(rlmr.material).transparent;
                }
                FinalizePass(e, isTransparent);
            }).Run();

            Entities.WithAny <LitMeshRenderer, LitParticleRenderer>().WithoutBurst().WithStructuralChanges()
            .WithNone <RenderToPasses>().ForEach((Entity e, ref MeshRenderer rlmr) =>
            {
                bool isTransparent = false;
                if (EntityManager.HasComponent <LitMaterial>(rlmr.material))
                {
                    isTransparent = EntityManager.GetComponentData <LitMaterial>(rlmr.material).transparent;
                }
                FinalizePass(e, isTransparent);
            }).Run();

            Entities.WithAny <LitMeshRenderer>().WithoutBurst().WithStructuralChanges().WithNone <RenderToPasses>().ForEach((Entity e, ref SkinnedMeshRenderer rlsmr) => {
                bool isTransparent = false;
                if (EntityManager.HasComponent <LitMaterial>(rlsmr.material))
                {
                    isTransparent = EntityManager.GetComponentData <LitMaterial>(rlsmr.material).transparent;
                }
                FinalizePass(e, isTransparent);
            }).Run();

            // those are things that do not render anywhere naturally, so add a to passes for gizmos
            // TODO add a GizmoRenderer tag for these
            Entities.WithoutBurst().WithStructuralChanges().WithNone <RenderToPasses>().WithAny <GizmoLight, GizmoCamera, GizmoAutoMovingDirectionalLight>().ForEach((Entity e) => {
                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
                });
            }).Run();

            Entities.WithoutBurst().WithStructuralChanges().WithNone <RenderToPasses>().WithAny <GizmoDebugOverlayTexture>().ForEach((Entity e) => {
                ShadowMask shadowMask = new ShadowMask {
                    mask = ulong.MaxValue
                };
                CameraMask cameraMask = new CameraMask {
                    mask = 0
                };
                Entity eGroup = FindOrCreateRenderGroup(new BuildGroup {
                    passTypes = RenderPassType.DebugOverlay, cameraMask = cameraMask, shadowMask = shadowMask
                });
                OptionalSetSharedComponent(e, new RenderToPasses {
                    e = eGroup
                });
            }).Run();
        }
Ejemplo n.º 3
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
        }