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 }); }
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(); }
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 }