From 49692e5c372b78363a6a8307b000224769ac541e Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Tue, 21 Feb 2023 11:16:44 +0800 Subject: [PATCH 01/12] Text Rendering now checks for UI Component --- .../MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp index ffd5ac96..7a7bea17 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp @@ -13,6 +13,7 @@ #include "Math/Transform/SHTransformComponent.h" #include "Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.h" #include "Graphics/MiddleEnd/Interface/SHRenderer.h" +#include "UI/SHUIComponent.h" namespace SHADE { @@ -205,7 +206,12 @@ namespace SHADE cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::CALCULATED_GLYPH_POSITION, comp.charPositionDataBuffer, 0); cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::GLYPH_INDEX, comp.indexingDataBuffer, 0); - cmdBuffer->SetPushConstantVariable("TestPushConstant.worldTransform", transform->GetTRS(), SH_PIPELINE_TYPE::GRAPHICS); + if (auto* uiComp = SHComponentManager::GetComponent_s(comp.GetEID())) + cmdBuffer->SetPushConstantVariable("TestPushConstant.worldTransform", uiComp->GetMatrix(), SH_PIPELINE_TYPE::GRAPHICS); + else + cmdBuffer->SetPushConstantVariable("TestPushConstant.worldTransform", transform->GetTRS(), SH_PIPELINE_TYPE::GRAPHICS); + + cmdBuffer->SetPushConstantVariable("TestPushConstant.eid", comp.GetEID(), SH_PIPELINE_TYPE::GRAPHICS); cmdBuffer->SetPushConstantVariable("TestPushConstant.textColor", SHVec3 (1.0f, 1.0f, 1.0f), SH_PIPELINE_TYPE::GRAPHICS); From 8d10c48645f758467a0948618f7fa0116d083392 Mon Sep 17 00:00:00 2001 From: Glence Date: Tue, 21 Feb 2023 19:31:50 +0800 Subject: [PATCH 02/12] Bug fixes and WIP for alpha --- Assets/Materials/UIMat.shmat | 2 +- Assets/Materials/UIMat_MainMenu.shmat | 2 +- Assets/Scenes/MainGame.shade | 39 +++++++++++++----- Assets/Scenes/MainMenu.shade | 13 +++--- Assets/Scenes/WinScene.shade | 1 + .../AIBehaviour/Implemented/Homeowner1.cs | 14 +++++++ Assets/Scripts/Gameplay/Item/SC_Item.cs | 20 +++++++++ .../Gameplay/Player/SC_PickAndThrow.cs | 17 ++++++-- .../Gameplay/Player/SC_PlayerController.cs | 18 ++++++-- .../Gameplay/Player/SC_ThirdPersonCamera.cs | 5 +++ Assets/Scripts/Gameplay/SC_GameManager.cs | 2 - Assets/Scripts/{ => Gameplay}/SC_JumpPad.cs | 0 Assets/Scripts/Gameplay/SC_JumpPad.cs.shmeta | 3 ++ Assets/Scripts/UI/SC_MainMenu.cs | 26 ++++++++++++ Assets/Scripts/UI/SC_PauseMenu.cs | 7 +--- Assets/Shaders/UI_FS.glsl | 4 +- Assets/Shaders/UI_FS.shshaderb | Bin 2101 -> 2125 bytes Assets/Shaders/UI_VS.glsl | 7 +++- Assets/Shaders/UI_VS.shshaderb | Bin 3817 -> 3901 bytes .../Graphics/MiddleEnd/Batching/SHBatch.cpp | 2 +- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 3 +- SHADE_Engine/src/UI/SHUISystem.cpp | 2 +- SHADE_Managed/src/Scene/SceneManager.cxx | 8 ++++ SHADE_Managed/src/Scene/SceneManager.hxx | 2 + 24 files changed, 156 insertions(+), 41 deletions(-) rename Assets/Scripts/{ => Gameplay}/SC_JumpPad.cs (100%) create mode 100644 Assets/Scripts/Gameplay/SC_JumpPad.cs.shmeta diff --git a/Assets/Materials/UIMat.shmat b/Assets/Materials/UIMat.shmat index 36c2f66c..b56d1bcb 100644 --- a/Assets/Materials/UIMat.shmat +++ b/Assets/Materials/UIMat.shmat @@ -4,5 +4,5 @@ Properties: data.color: {x: 1, y: 1, z: 1, w: 1} data.textureIndex: 51995224 - data.alpha: 0 + data.alpha: 1 data.beta: {x: 1, y: 1, z: 1} \ No newline at end of file diff --git a/Assets/Materials/UIMat_MainMenu.shmat b/Assets/Materials/UIMat_MainMenu.shmat index 0ca4c7a1..ba2069e9 100644 --- a/Assets/Materials/UIMat_MainMenu.shmat +++ b/Assets/Materials/UIMat_MainMenu.shmat @@ -4,5 +4,5 @@ Properties: data.color: {x: 1, y: 1, z: 1, w: 1} data.textureIndex: 54429632 - data.alpha: 0 + data.alpha: 1 data.beta: {x: 1, y: 1, z: 1} \ No newline at end of file diff --git a/Assets/Scenes/MainGame.shade b/Assets/Scenes/MainGame.shade index 591c386f..ddac35e8 100644 --- a/Assets/Scenes/MainGame.shade +++ b/Assets/Scenes/MainGame.shade @@ -8540,6 +8540,7 @@ currCategory: 1 density: 1 dontReturn: false + soundDistance: 10 - EID: 157 Name: Mesh_Meat IsActive: true @@ -8587,6 +8588,7 @@ currCategory: 1 density: 1 dontReturn: false + soundDistance: 10 - EID: 156 Name: Mesh_Meat IsActive: true @@ -8634,6 +8636,7 @@ currCategory: 1 density: 1 dontReturn: false + soundDistance: 10 - EID: 155 Name: Mesh_Cheese IsActive: true @@ -8681,6 +8684,7 @@ currCategory: 2 density: 1 dontReturn: false + soundDistance: 10 - EID: 154 Name: Mesh_Cheese IsActive: true @@ -8728,6 +8732,7 @@ currCategory: 2 density: 1 dontReturn: false + soundDistance: 10 - EID: 153 Name: Mesh_Cheese IsActive: true @@ -8775,6 +8780,7 @@ currCategory: 2 density: 1 dontReturn: false + soundDistance: 10 - EID: 65778 Name: Mesh_Apple IsActive: true @@ -8822,6 +8828,7 @@ currCategory: 0 density: 1 dontReturn: false + soundDistance: 10 - EID: 152 Name: Mesh_Apple IsActive: true @@ -8869,6 +8876,7 @@ currCategory: 0 density: 1 dontReturn: false + soundDistance: 10 - EID: 151 Name: Mesh_Apple IsActive: true @@ -8916,6 +8924,7 @@ currCategory: 0 density: 1 dontReturn: false + soundDistance: 10 - EID: 65686 Name: Watermelon IsActive: true @@ -8967,6 +8976,7 @@ currCategory: 2 density: 1 dontReturn: false + soundDistance: 10 - EID: 131220 Name: Piece1 IsActive: true @@ -9014,6 +9024,7 @@ currCategory: 1 density: 3 dontReturn: false + soundDistance: 10 - EID: 131219 Name: Piece2 IsActive: true @@ -9061,6 +9072,7 @@ currCategory: 1 density: 3 dontReturn: false + soundDistance: 10 - EID: 131221 Name: Piece3 IsActive: true @@ -9108,6 +9120,7 @@ currCategory: 0 density: 3 dontReturn: false + soundDistance: 10 - EID: 145 Name: Piece4 IsActive: true @@ -9155,6 +9168,7 @@ currCategory: 0 density: 3 dontReturn: false + soundDistance: 10 - EID: 196754 Name: Piece5 IsActive: true @@ -9202,6 +9216,7 @@ currCategory: 0 density: 3 dontReturn: false + soundDistance: 10 - EID: 144 Name: Egg IsActive: true @@ -9253,6 +9268,7 @@ currCategory: 0 density: 2 dontReturn: false + soundDistance: 10 - EID: 143 Name: Piece1 IsActive: true @@ -9653,7 +9669,7 @@ Components: Transform Component: Translate: {x: 2.35245037, y: 0.38365531, z: 7.10571432} - Rotate: {x: -0, y: 0, z: -0} + Rotate: {x: 0, y: 0.326376587, z: 0.0698131472} Scale: {x: 0.999999881, y: 1, z: 0.999999881} IsActive: true Renderable Component: @@ -9731,7 +9747,7 @@ Components: Transform Component: Translate: {x: 0, y: -5.96046448e-08, z: 0} - Rotate: {x: 0, y: 6.28318548, z: 2.23517329e-08} + Rotate: {x: 0, y: 5.95680904, z: -0.0698131248} Scale: {x: 1, y: 1, z: 1} IsActive: true Camera Component: @@ -9739,8 +9755,8 @@ Pitch: 0 Yaw: 360 Roll: 1.28065994e-06 - Width: 2560 - Height: 1369 + Width: 1055 + Height: 604 Near: 0.00999999978 Far: 10000 Perspective: true @@ -10512,14 +10528,14 @@ NumberOfChildren: 0 Components: Transform Component: - Translate: {x: 2.70000005, y: 0.100000001, z: -2} + Translate: {x: 0, y: 0, z: -2.64324665} Rotate: {x: -0, y: 0, z: -0} Scale: {x: 1, y: 1, z: 1} - IsActive: false + IsActive: true Renderable Component: Mesh: 140697366 Material: 129495479 - IsActive: false + IsActive: true RigidBody Component: Type: Dynamic Drag: 0.00999999978 @@ -10533,7 +10549,7 @@ Freeze Rotation X: true Freeze Rotation Y: false Freeze Rotation Z: true - IsActive: false + IsActive: true Collider Component: Colliders: - Is Trigger: false @@ -10545,7 +10561,7 @@ Density: 1 Position Offset: {x: 0, y: 0.899999976, z: 0} Rotation Offset: {x: 0, y: 0, z: 0} - IsActive: false + IsActive: true Scripts: - Type: Homeowner1 Enabled: true @@ -10605,6 +10621,7 @@ currCategory: 1 density: 1 dontReturn: false + soundDistance: 10 - EID: 16 Name: JumpPad IsActive: false @@ -10632,13 +10649,13 @@ Enabled: true - EID: 10 Name: Canvas - IsActive: false + IsActive: true NumberOfChildren: 3 Components: Canvas Component: Canvas Width: 1920 Canvas Height: 1080 - IsActive: false + IsActive: true Scripts: ~ - EID: 8 Name: ResumeButton diff --git a/Assets/Scenes/MainMenu.shade b/Assets/Scenes/MainMenu.shade index 30ef368a..a19514d7 100644 --- a/Assets/Scenes/MainMenu.shade +++ b/Assets/Scenes/MainMenu.shade @@ -15,7 +15,7 @@ NumberOfChildren: 0 Components: Transform Component: - Translate: {x: 0, y: 0, z: 0} + Translate: {x: 0, y: 0, z: 0.5} Rotate: {x: 0, y: 0, z: 0} Scale: {x: 1920, y: 1080, z: 1} IsActive: true @@ -35,7 +35,7 @@ NumberOfChildren: 0 Components: Transform Component: - Translate: {x: 0, y: 75, z: 0} + Translate: {x: 0, y: 75, z: 0.400000006} Rotate: {x: 0, y: 0, z: 0} Scale: {x: 400, y: 200, z: 1} IsActive: true @@ -63,7 +63,7 @@ NumberOfChildren: 0 Components: Transform Component: - Translate: {x: 0, y: -200, z: 0} + Translate: {x: 0, y: -200, z: 0.400000006} Rotate: {x: 0, y: 0, z: 0} Scale: {x: 400, y: 200, z: 1} IsActive: true @@ -113,8 +113,8 @@ Pitch: 0 Yaw: 0 Roll: 0 - Width: 1319 - Height: 622 + Width: 1055 + Height: 604 Near: 0.00999999978 Far: 10000 Perspective: true @@ -129,4 +129,5 @@ Scripts: - Type: MainMenu Enabled: true - sceneID: 96668835 \ No newline at end of file + sceneID: 96668835 + obj: 1 \ No newline at end of file diff --git a/Assets/Scenes/WinScene.shade b/Assets/Scenes/WinScene.shade index 3edd223b..0727860e 100644 --- a/Assets/Scenes/WinScene.shade +++ b/Assets/Scenes/WinScene.shade @@ -111,6 +111,7 @@ Near: 0.00999999978 Far: 10000 Perspective: true + FOV: 90 IsActive: true Scripts: ~ - EID: 4 diff --git a/Assets/Scripts/Gameplay/AIBehaviour/Implemented/Homeowner1.cs b/Assets/Scripts/Gameplay/AIBehaviour/Implemented/Homeowner1.cs index 84c7c485..e37aab36 100644 --- a/Assets/Scripts/Gameplay/AIBehaviour/Implemented/Homeowner1.cs +++ b/Assets/Scripts/Gameplay/AIBehaviour/Implemented/Homeowner1.cs @@ -74,6 +74,9 @@ public partial class Homeowner1 : BehaviourTree private float footstepSFXIntervalMultiplier; private float footstepTimeRemaining; + + //singleton for AI + public static Homeowner1 aiInstance { get; private set; } } //AI tree @@ -111,6 +114,11 @@ public partial class Homeowner1 : BehaviourTree AudioHandler.audioClipHandlers["SFXFootstep"] = Audio.CreateAudioClip("event:/Homeowner/homeowner_footsteps"); AudioHandler.audioClipHandlers["SFXDetectAh"] = Audio.CreateAudioClip("event:/Homeowner/homeowner_detect_raccoon"); AudioHandler.audioClipHandlers["SFXDetectSting"] = Audio.CreateAudioClip("event:/Music/stingers/player_detected"); + + if (aiInstance != null && aiInstance != this) + RemoveScript(); + else + aiInstance = this; } //Called every tick @@ -182,4 +190,10 @@ public partial class Homeowner1 : BehaviourTree //Debug.Log("Tree Created"); return root; } + + protected override void onDestroy() + { + if (aiInstance == this) + aiInstance = null; + } } \ No newline at end of file diff --git a/Assets/Scripts/Gameplay/Item/SC_Item.cs b/Assets/Scripts/Gameplay/Item/SC_Item.cs index 1109f8f3..e4c264be 100644 --- a/Assets/Scripts/Gameplay/Item/SC_Item.cs +++ b/Assets/Scripts/Gameplay/Item/SC_Item.cs @@ -22,6 +22,10 @@ public class Item : Script private Collider collider; public float density = 1.0f; public bool dontReturn = false; + + + private bool checkSound = false; + public float soundDistance = 10; protected override void awake() @@ -55,10 +59,25 @@ public class Item : Script returnBack = false; } + + + if (checkSound) + { +/* //need to wait for collisionEnter Fix + Vector3 itemPos = transform.LocalPosition; + Vector3 len = Homeowner1.aiInstance.GetComponent().LocalPosition - itemPos; + Debug.Log($"distance: {len.GetSqrMagnitude()}"); + if (len.GetSqrMagnitude() <= soundDistance) + { + //set ai to alert + } + checkSound = false;*/ + } } protected override void onCollisionEnter(CollisionInfo info) { + if (!caputurePos) { firstPostion = transform.LocalPosition; @@ -83,6 +102,7 @@ public class Item : Script protected override void onCollisionExit(CollisionInfo info) { playSound = true; + checkSound = true; } } \ No newline at end of file diff --git a/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs b/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs index d5046db1..4132edca 100644 --- a/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs +++ b/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs @@ -26,6 +26,7 @@ public class PickAndThrow : Script private float lastZDir; private bool inRange = false; public bool throwItem = false; + private Vector3 prevTargetOffSet; [Tooltip("Lenght of ray")] public float rayDistance = 1; @@ -56,8 +57,12 @@ public class PickAndThrow : Script } protected override void update() { + if (GameManager.Instance.GamePause) + { + return; + } - if(timer <= delayTimer) + if (timer <= delayTimer) timer += Time.DeltaTimeF; CalculateDir(); @@ -76,6 +81,7 @@ public class PickAndThrow : Script { pc.isAiming = true; pc.camArm.ArmLength = aimingLength; + prevTargetOffSet = pc.camArm.TargetOffset; pc.camArm.TargetOffset = cameraArmOffSet; pc.cam.FOV = aimingFOV; } @@ -86,7 +92,7 @@ public class PickAndThrow : Script itemRidigBody.IsGravityEnabled = true; itemCollider.GetCollisionShape(0).IsTrigger = false; pc.isAiming = false; - pc.camArm.TargetOffset = Vector3.Zero; + pc.camArm.TargetOffset = prevTargetOffSet; pc.cam.FOV = defaultFOV; if (tpc) pc.camArm.ArmLength = tpc.armLength; @@ -109,7 +115,7 @@ public class PickAndThrow : Script { pc.isAiming = false; pc.cam.FOV = defaultFOV; - pc.camArm.TargetOffset = Vector3.Zero; + pc.camArm.TargetOffset = prevTargetOffSet; if (tpc) pc.camArm.ArmLength = tpc.armLength; } @@ -134,6 +140,11 @@ public class PickAndThrow : Script protected override void fixedUpdate() { + if (GameManager.Instance.GamePause) + { + return; + } + if (throwItem && itemRidigBody && pc) { if (itemScript) diff --git a/Assets/Scripts/Gameplay/Player/SC_PlayerController.cs b/Assets/Scripts/Gameplay/Player/SC_PlayerController.cs index 202e587e..87e42032 100644 --- a/Assets/Scripts/Gameplay/Player/SC_PlayerController.cs +++ b/Assets/Scripts/Gameplay/Player/SC_PlayerController.cs @@ -124,8 +124,14 @@ public class PlayerController : Script protected override void lateUpdate() { } + protected override void update() { + if (GameManager.Instance.GamePause) + { + return; + } + if (delayTimer <= 1) delayTimer += Time.DeltaTimeF; @@ -158,22 +164,27 @@ public class PlayerController : Script if (tranform) tranform.LocalEulerAngles = new Vector3(0.0f, tranform.LocalEulerAngles.y, 0.0f); + GotCaught(); Rotation(); MoveKey(); Sprint(); Jump(); - GotCaught(); //Debug.Log($"{currentState}"); //Debug.Log($" axisX: {axisMove.x} axisY:{axisMove.y}"); //Debug.Log($"X: {rb.LinearVelocity.x}" + $" Z: {rb.LinearVelocity.z}"); //Debug.Log(currentState.ToString() + " x:" + rb.LinearVelocity.x.ToString() + " y:" + rb.LinearVelocity.y.ToString() + " z:" + rb.LinearVelocity.z.ToString()); + } protected override void fixedUpdate() { + if (GameManager.Instance.GamePause) + { + return; + } + Move(); Gravity(); - //Debug.Log($"X: {rb.LinearVelocity.x}" + $" Z: {rb.LinearVelocity.z}"); } @@ -234,7 +245,7 @@ public class PlayerController : Script private void Move() { - if (rb != null) + if (rb != null && currentState != RaccoonStates.CAUGHT) { rb.LinearVelocity += new Vector3(axisMove.x * moveForce, 0.0f, axisMove.y * moveForce) * Time.DeltaTimeF; @@ -286,7 +297,6 @@ public class PlayerController : Script } } - //press and hold jump private void Jump() { if (currentState == RaccoonStates.WALKING || currentState == RaccoonStates.RUNNING || currentState == RaccoonStates.IDLE) diff --git a/Assets/Scripts/Gameplay/Player/SC_ThirdPersonCamera.cs b/Assets/Scripts/Gameplay/Player/SC_ThirdPersonCamera.cs index c3026ce6..f339122e 100644 --- a/Assets/Scripts/Gameplay/Player/SC_ThirdPersonCamera.cs +++ b/Assets/Scripts/Gameplay/Player/SC_ThirdPersonCamera.cs @@ -41,6 +41,11 @@ namespace SHADE_Scripting protected override void update() { + if (GameManager.Instance.GamePause) + { + return; + } + CameraArm arm = GetComponent(); if (arm) { diff --git a/Assets/Scripts/Gameplay/SC_GameManager.cs b/Assets/Scripts/Gameplay/SC_GameManager.cs index 6478b5ea..3657904b 100644 --- a/Assets/Scripts/Gameplay/SC_GameManager.cs +++ b/Assets/Scripts/Gameplay/SC_GameManager.cs @@ -38,13 +38,11 @@ public class GameManager : Script private Vector3 fontScalar; public static GameManager Instance { get; private set; } - //public static int highScore { get; private set; } maybe need public bool GamePause { get; set; } protected override void start() { - base.start(); AudioHandler.audioClipHandlers["BGMAdaptive"] = Audio.CreateAudioClip("event:/Music/bgm_adaptive"); AudioHandler.audioClipHandlers["BGMAdaptive"].Play(); diff --git a/Assets/Scripts/SC_JumpPad.cs b/Assets/Scripts/Gameplay/SC_JumpPad.cs similarity index 100% rename from Assets/Scripts/SC_JumpPad.cs rename to Assets/Scripts/Gameplay/SC_JumpPad.cs diff --git a/Assets/Scripts/Gameplay/SC_JumpPad.cs.shmeta b/Assets/Scripts/Gameplay/SC_JumpPad.cs.shmeta new file mode 100644 index 00000000..c84294b0 --- /dev/null +++ b/Assets/Scripts/Gameplay/SC_JumpPad.cs.shmeta @@ -0,0 +1,3 @@ +Name: SC_JumpPad +ID: 163951275 +Type: 9 diff --git a/Assets/Scripts/UI/SC_MainMenu.cs b/Assets/Scripts/UI/SC_MainMenu.cs index 8af27d64..8c887d3c 100644 --- a/Assets/Scripts/UI/SC_MainMenu.cs +++ b/Assets/Scripts/UI/SC_MainMenu.cs @@ -5,6 +5,10 @@ using SHADE_Scripting.Audio; public class MainMenu : Script { public uint sceneID; + + public GameObject obj; + private Renderable renderable; + protected override void awake() { AudioHandler.audioClipHandlers["BGMMainMenu"] = Audio.CreateAudioClip("event:/Music/main_menu"); @@ -12,9 +16,31 @@ public class MainMenu : Script AudioHandler.audioClipHandlers["SFXUISuccess"] = Audio.CreateAudioClip("event:/UI/success"); //Audio.PlayBGMOnce2D("event:/Music/main_menu"); AudioHandler.audioClipHandlers["BGMMainMenu"].Play(); + + renderable = obj.GetComponent(); + } + + protected override void start() + { } protected override void update() { + if (Input.GetKeyDown(Input.KeyCode.K) && obj) + { + if (renderable.Material.GetProperty("data.alpha") == 1) + { + Debug.Log("ALPHA ZERO"); + Debug.Log($"{obj.EntityId}"); + obj.GetComponent().Material.SetProperty("data.alpha", 0); + } + else if (renderable.Material.GetProperty("data.alpha") == 0) + { + Debug.Log("ALPHA ONE"); + Debug.Log($"{obj.EntityId}"); + obj.GetComponent().Material.SetProperty("data.alpha", 1); + } + } + if (Input.GetKeyDown(Input.KeyCode.Space)) { //Audio.PlaySFXOnce2D("event:/UI/mouse_down_element"); diff --git a/Assets/Scripts/UI/SC_PauseMenu.cs b/Assets/Scripts/UI/SC_PauseMenu.cs index eae7aa91..521b48ea 100644 --- a/Assets/Scripts/UI/SC_PauseMenu.cs +++ b/Assets/Scripts/UI/SC_PauseMenu.cs @@ -59,8 +59,7 @@ public class PauseMenu : Script retry.OnClick.RegisterAction(() => { Audio.StopAllSounds(); - //get curr scene - //SceneManager.ChangeScene(); + SceneManager.RestartScene(); }); } else @@ -86,10 +85,6 @@ public class PauseMenu : Script protected override void update() { - if (GameManager.Instance.GamePause) - { - return; - } if (Input.GetKeyDown(Input.KeyCode.Escape) && !GameManager.Instance.GamePause) { diff --git a/Assets/Shaders/UI_FS.glsl b/Assets/Shaders/UI_FS.glsl index 3d40bc14..26abfece 100644 --- a/Assets/Shaders/UI_FS.glsl +++ b/Assets/Shaders/UI_FS.glsl @@ -5,10 +5,8 @@ struct MatPropData { - vec4 color; int textureIndex; float alpha; - vec3 beta; }; layout(location = 0) in struct @@ -39,10 +37,12 @@ layout(location = 1) out uint outEntityID; void main() { fragColor = texture(textures[nonuniformEXT(MatProp.data[In2.materialIndex].textureIndex)], In.uv); + fragColor.a = MatProp.data[In2.materialIndex].alpha; if (fragColor.a < 0.01f) { discard; } + // fragColor.a = 1.0f; outEntityID = In2.eid; } \ No newline at end of file diff --git a/Assets/Shaders/UI_FS.shshaderb b/Assets/Shaders/UI_FS.shshaderb index 024d0a3d8912a8a893cbc4520e1df418fe57781c..236eeaf5a1b24fa5af5b8c66d7f574e12705c4ef 100644 GIT binary patch literal 2125 zcmZ9LZEqA+6vwaZZfO^xMV>^UY+DqyT1zd+Gqko@n=GNRMtwKA?%r+(rZdazY(u}7 z8WZ2~CHN>BBMJZC%)PL1lC$S={^#lL%*LcCsdi-Hs4*Xyra5lbE0;NGj>uz5`N!!> z{^{l4l1(#dcD8?xHh=vo>bYSzj|WATM{(M7&*QXjj+u$_`*vrivotJvORLwHfj(hs zWd*RO&6KH2!uvK(2~3I4i?53Bi)WNiTn$RAsVie%=;OLF+ns3b$MtCF1~#{ai-vo) z=kh4~?TPCa!*_EOQd?1C)BeczU9`HgJh0uT!kGkzG14p@rSWc-??=x@Hi>s*mn+^R z-hTYJ-Pw$~gF!Sb4igt8aq6O8oU2lN;HXvN_`EpnCZpbXLPHtjb2dz)oOL(1{qM6R z%QY9i6Ox5{UW{_52`b-=b=h{-c%@;{Ok zhRb7{0Oax_rULoIpdR2NdewRdLV=UVw@w)BeFBX1`g6`N@h z7l&ILrY#KK)~p!9X4mtj_12z~O`RWv5q7-bbApdJKJE$5Ny!N@eY)F8v3ax)8bSh2Dsv({uH0&9tQdE&%et2s*VYyKBt=e*RYwdrC;VE7ylh^vrByEwbiC1`QVRJurDa{m;&TolK!D2HrU4{A$(wC zGdpxf_OxV64A!h{Zi0_`V6l6Av(niyHn^uGnGGMf*z6tOqQ^ZW9iq-z$rgraRyX7w zQwM()tDBFd(+4pyvAGXEYJTGNs^_};tLg=NPBz5s?D>i$bI=ntdH3uXKN8H(B*7;} zP3)`Q7v}if+vI=Ybuh5Mkp!PQ5oj!@*&@9yC{XpdWD^EjmO~35vf|%WLgL}$kM;FET*EBu5jodM%2S5C&aHy4{>@12N76ov1T z3J8J3|Jj}rMmjnBGXEK8?DD9|Pi5=WHe0-h z(3%Zn9NR@lMHfVOL}QA_uK^`hG?g*mlw4J0vlYy}cog(q&!#qWL4VbDTpA?HZ(Td< z{~sfl#tI@EcL%oXg4vmCJ==b#I-}I#8gUX2;&3HN*Mj#08-**OOXaWQZ$5wCY|RJl zUN7ip8<7j5Fm^#FOw}n|cl65ZlyPC)js~6KfSMwP?^!do{H`mh?LJPTB-OpJ?H146 zhis5K-Jr0Ii$Am3Vw&`x*vtyqn)Xthc9}aOgs_2YnZLj;i1P7ZXQSS#9kQ{FWv8M# zHPzTBu3jz;ZA3$tW+9VM10Scu5IWrHfOt8Z^olu*Lx*|1yjIrp1C1yTAG5l!vl+{L zQP^G0T6V*wMKm>e4-4^3UjLkA4)b_X(^L)K;Dm^S&Q4C{+CP0#I(?q1hTp|h8RKpEv5gJIF$*?*LYukl z09!*uzrErkB0d;udEANNG<64TCA#=APx02_5)G)-Imfg!| zHsxxL*DxMnhR*%=sVjXal}}CNgOZrPAv&az34q5iCr=maoF+GgPq`; zkPP2{(b8Hes#VfnYi2HYCF2R026J0b=j*!kE=$qms`nR`kyHtJ7_^Nslb19EtGd@IoyS poL`E^cTHzPQzR9!7ov@3gdt$tcM zw@?eMAJ-PbqanyJ@H&IM)>4kykk5>3WFL}0gdB(Y9GjEVCOG=!bRY|bwam+caRzbY zSM8W^FF@fAWD|%XHes)T&*3mhy$GMW2`nPM8T%qp?^c#Qj+(3MQiIPGICd9xjCo3O zoD&e4lUt8q!WMj|{~F3nG2&YG;4Ac@cajLX-6gOMq|k%khH)B~!VRwhaz_C3P1q7Z z-a!uIGC+=}^Xn?`{W|t#%slGrunm!ptij=?Y`g+{=L+MPf5Havf+Fe<0CULu%QxY3 z(1Ev13qCnMKKBTpoHD_+<;*4d>2mlIyz3``4Oq|y5@7%tjie7^qRD}d(7-5%h2`bhoU{0 zGCuxZWvk@X*1cNbU8*9*=QqFYfjOyGlyT%&gEjx!3p2Xfm3F8tRQ%&b|1{XH?s(Lq zHQmHuTKDKA`Rc9R#ErG7hB|$rG0RBtCE|2h%&ED!L93rq_MPfpaGPlN4VGvpv`FcE<01KydpbV$6kS0 l-@q@J6{kJrbtK+LQ{NDa(;DOATl~&qT_8@mzr1A@`~kbMPhAddNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data(), {"Scene", "Entity ID"}, {SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW.data()}); + auto screenSpaceNode = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data(), {"Scene", "Entity ID", "Depth Buffer"}, {SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW.data()}); auto uiSubpass = screenSpaceNode->AddSubpass(SHGraphicsConstants::RenderGraphEntityNames::UI_SUBPASS.data(), worldViewport, screenRenderer); uiSubpass->AddColorOutput("Scene"); uiSubpass->AddColorOutput("Entity ID"); + uiSubpass->AddDepthOutput("Depth Buffer"); uiSubpass->AddExteriorDrawCalls([=](Handle cmdBuffer, Handle renderer, uint32_t frameIndex) { textRenderingSubSystem->Render(cmdBuffer, renderer, frameIndex); diff --git a/SHADE_Engine/src/UI/SHUISystem.cpp b/SHADE_Engine/src/UI/SHUISystem.cpp index 3552e47b..641743b8 100644 --- a/SHADE_Engine/src/UI/SHUISystem.cpp +++ b/SHADE_Engine/src/UI/SHUISystem.cpp @@ -312,7 +312,7 @@ namespace SHADE { auto material = renderable->GetModifiableMaterial(); comp.currentTexture = textureID; - material->SetProperty("data.textureIndex", SHResourceManager::LoadOrGet(textureID)); + material->SetProperty("data.textureIndex", SHResourceManager::LoadOrGet(textureID)->TextureArrayIndex); } diff --git a/SHADE_Managed/src/Scene/SceneManager.cxx b/SHADE_Managed/src/Scene/SceneManager.cxx index 1e139a95..a0ebc3a8 100644 --- a/SHADE_Managed/src/Scene/SceneManager.cxx +++ b/SHADE_Managed/src/Scene/SceneManager.cxx @@ -22,4 +22,12 @@ namespace SHADE { SHSceneManager::RestartScene(sceneAssetID); } + void SceneManager::RestartScene() + { + SHSceneManager::RestartScene(); + } + AssetID SceneManager::GetCurrentSceneID() + { + return SHSceneManager::GetCurrentSceneAssetID(); + } } \ No newline at end of file diff --git a/SHADE_Managed/src/Scene/SceneManager.hxx b/SHADE_Managed/src/Scene/SceneManager.hxx index e1e1ec0a..712b203c 100644 --- a/SHADE_Managed/src/Scene/SceneManager.hxx +++ b/SHADE_Managed/src/Scene/SceneManager.hxx @@ -23,5 +23,7 @@ namespace SHADE { public : static void ChangeScene(AssetID sceneAssetID); + static void RestartScene(); + static AssetID GetCurrentSceneID(); }; } From f7bb8606be51cad79602516b518bac81bc42619b Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Wed, 22 Feb 2023 16:39:21 +0800 Subject: [PATCH 03/12] Shader, text, asset manager events and generic data desc sets - Made shader for shiniy effect (half done) - Text objects in scene now use a UI component for better scaling - Asset manager now creates an event for compilation of assets - Descriptor for generic data is implemented --- Assets/Materials/ShinyHightlight.shmat | 8 ++ Assets/Materials/ShinyHightlight.shmat.shmeta | 3 + Assets/Scenes/MainGame.shade | 23 +++- Assets/Shaders/DeferredComposite_CS.glsl | 4 + Assets/Shaders/DeferredComposite_CS.shshaderb | Bin 9621 -> 9949 bytes Assets/Shaders/ShinyHighlight_FS.glsl | 84 +++++++++++++++ Assets/Shaders/ShinyHighlight_FS.shshaderb | Bin 0 -> 3829 bytes .../ShinyHighlight_FS.shshaderb.shmeta | 3 + Assets/Shaders/ShinyHighlight_VS.glsl | 99 ++++++++++++++++++ Assets/Shaders/ShinyHighlight_VS.shshaderb | Bin 0 -> 5705 bytes .../ShinyHighlight_VS.shshaderb.shmeta | 3 + .../src/Assets/Events/SHAssetManagerEvents.h | 20 ++++ .../Compilers/SHShaderSourceCompiler.cpp | 10 ++ SHADE_Engine/src/Events/SHEventDefines.h | 1 + .../GenericData/SHGraphicsGenericData.cpp | 53 ++++++++++ .../GenericData/SHGraphicsGenericData.h | 51 +++++++++ .../GlobalData/SHGlobalDescriptorSets.cpp | 16 +-- .../GlobalData/SHGlobalDescriptorSets.h | 4 +- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 74 ++++++++++--- .../MiddleEnd/Interface/SHGraphicsSystem.h | 10 ++ .../SHTextRenderingSubSystem.cpp | 2 +- .../MiddleEnd/Textures/SHTextureLibrary.cpp | 33 +++--- .../MiddleEnd/Textures/SHTextureLibrary.h | 17 ++- .../SHTrajectoryRenderingSubSystem.cpp | 2 +- .../Graphics/RenderGraph/SHRenderGraph.cpp | 2 +- .../RenderGraph/SHRenderGraphNode.cpp | 2 +- .../src/Graphics/Shaders/SHVkShaderModule.cpp | 5 + .../src/Graphics/Shaders/SHVkShaderModule.h | 1 + 28 files changed, 481 insertions(+), 49 deletions(-) create mode 100644 Assets/Materials/ShinyHightlight.shmat create mode 100644 Assets/Materials/ShinyHightlight.shmat.shmeta create mode 100644 Assets/Shaders/ShinyHighlight_FS.glsl create mode 100644 Assets/Shaders/ShinyHighlight_FS.shshaderb create mode 100644 Assets/Shaders/ShinyHighlight_FS.shshaderb.shmeta create mode 100644 Assets/Shaders/ShinyHighlight_VS.glsl create mode 100644 Assets/Shaders/ShinyHighlight_VS.shshaderb create mode 100644 Assets/Shaders/ShinyHighlight_VS.shshaderb.shmeta create mode 100644 SHADE_Engine/src/Assets/Events/SHAssetManagerEvents.h create mode 100644 SHADE_Engine/src/Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.cpp create mode 100644 SHADE_Engine/src/Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.h diff --git a/Assets/Materials/ShinyHightlight.shmat b/Assets/Materials/ShinyHightlight.shmat new file mode 100644 index 00000000..bb521519 --- /dev/null +++ b/Assets/Materials/ShinyHightlight.shmat @@ -0,0 +1,8 @@ +- VertexShader: 37048829 + FragmentShader: 45685219 + SubPass: G-Buffer Write + Properties: + data.color: {x: 1, y: 1, z: 1, w: 1} + data.textureIndex: 57342922 + data.alpha: 0 + data.beta: {x: 1, y: 1, z: 1} \ No newline at end of file diff --git a/Assets/Materials/ShinyHightlight.shmat.shmeta b/Assets/Materials/ShinyHightlight.shmat.shmeta new file mode 100644 index 00000000..6ab0ac19 --- /dev/null +++ b/Assets/Materials/ShinyHightlight.shmat.shmeta @@ -0,0 +1,3 @@ +Name: ShinyHightlight +ID: 122370915 +Type: 7 diff --git a/Assets/Scenes/MainGame.shade b/Assets/Scenes/MainGame.shade index 438b5a29..83f23f1b 100644 --- a/Assets/Scenes/MainGame.shade +++ b/Assets/Scenes/MainGame.shade @@ -8599,7 +8599,7 @@ IsActive: true Renderable Component: Mesh: 136892700 - Material: 131956078 + Material: 122370915 IsActive: true RigidBody Component: Type: Dynamic @@ -9571,7 +9571,11 @@ Name: =====Text==== IsActive: true NumberOfChildren: 3 - Components: ~ + Components: + Canvas Component: + Canvas Width: 1920 + Canvas Height: 1080 + IsActive: true Scripts: ~ - EID: 237 Name: Score @@ -9587,6 +9591,9 @@ Text: My name is Brandon. Font: 176667660 IsActive: true + UI Component: + Canvas ID: 199 + IsActive: true Scripts: ~ - EID: 206 Name: Timer @@ -9602,6 +9609,9 @@ Text: My name is Brandon. Font: 176667660 IsActive: true + UI Component: + Canvas ID: 199 + IsActive: true Scripts: ~ - EID: 139 Name: Multiplier @@ -9617,6 +9627,9 @@ Text: TEST Font: 176667660 IsActive: true + UI Component: + Canvas ID: 199 + IsActive: true Scripts: ~ - EID: 198 Name: ====Raccoon==== @@ -9687,6 +9700,7 @@ aimingLength: 1 throwItem: false rayDistance: 0.75 + rayHeight: 0.100000001 - EID: 3 Name: HoldingPoint IsActive: true @@ -9713,11 +9727,12 @@ Pitch: 0 Yaw: 360 Roll: 1.28065994e-06 - Width: 1920 - Height: 1080 + Width: 1728 + Height: 832 Near: 0.00999999978 Far: 10000 Perspective: true + FOV: 90 IsActive: true Camera Arm Component: Arm Pitch: 0 diff --git a/Assets/Shaders/DeferredComposite_CS.glsl b/Assets/Shaders/DeferredComposite_CS.glsl index 745b93e0..f17c9d84 100644 --- a/Assets/Shaders/DeferredComposite_CS.glsl +++ b/Assets/Shaders/DeferredComposite_CS.glsl @@ -26,6 +26,7 @@ layout(set = 3, binding = 3, r32ui) uniform uimage2D lightLayerData; layout(set = 3, binding = 4, r8) uniform image2D ssaoBlurredImage; layout(set = 3, binding = 5, rgba8) uniform image2D positionWorldSpace; layout(set = 3, binding = 6, rgba8) uniform image2D targetImage; +layout(set = 3, binding = 7, rgba8) uniform image2D objectVFXImage; layout (set = 4, binding = 0) uniform sampler2D shadowMaps[]; // for textures (global) @@ -141,6 +142,9 @@ void main() float ssaoVal = imageLoad (ssaoBlurredImage, globalThread).r; fragColor *= ssaoVal; + vec4 objectVFXColor = imageLoad (objectVFXImage, globalThread); + fragColor += objectVFXColor.rgb * objectVFXColor.a; + // store result into result image imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor.rgb, 1.0f)); diff --git a/Assets/Shaders/DeferredComposite_CS.shshaderb b/Assets/Shaders/DeferredComposite_CS.shshaderb index ff474e272b60daadce873126ae23984c156a834f..e5a0a7303892bd790d631d8261d5fe2977587f76 100644 GIT binary patch delta 663 zcmZ9JO)o=H5Qe9%URn|Lk=j_Gi46-Pu@RC+LK+clM0{0SZI#w-%Tm(VTG&|$u@aWt zgdbrgvGrd(?{%Aqlbp^w&rE0L%)MFpUQLdCjhlZW;Z&zt$l}&xXD`WyGvnBH$jr?j z7YpZ`OIwR>)oq$Z&9R-oJX6b+i{eo$c~?$%B(3lmMI+p0>+sV@(bV_-(!aQT#hoDD z^xk6c(TvLI%u(VQt2CV<{3G-fI?SEGmu|ok*hvcAW1IM54ezmcAQV%Xe(<*Un)ryf zc8RFNJopy8hrYw+c}E|1A744*3p_=;5L3S5S+v-ibuoe20a{E~M@G}7si%kM0Lq_6 zQ={d-HV;tXnj{q|pjAj*jl>SopV-SFr-(16Tn(m}nDU>{Wwcf$Uu&qKAFykTp|u@z zE1}kJ0PatEL9(`R5+t;nSMk+ggXa1?HGDChHaiWNaGSXS(+1XQ+=s2h^nc~MgZ!j` P1sZE&HLiQJ!`avmRb)rb delta 339 zcmXwzzYf7r6vj_gZ=)h15+;di48mX~F&jj%)}NxqY!_a@YLbXokUL1sUcdu*7vI;^ zNlw1={qFg5zr)L*R6W-v4m0K1B8E7Ulij1VSEePteyObK`i4jiO(wE0X`y#ftHf`$ za-LR)m{CT{40RiI3fY8by#dQZTNu1SxA0^et@1@fHwtg(G==A$9%k4xM}3Em#Ey3^ z;K`T_$^pGsXaK`^&Nktfs6Wt&Sn*d^@MMfXTPKVdtQ$9m3FPO;I9z~6U|hffzI$LH O4)Mc09O+{v$ov3tWg=Ms diff --git a/Assets/Shaders/ShinyHighlight_FS.glsl b/Assets/Shaders/ShinyHighlight_FS.glsl new file mode 100644 index 00000000..511c0704 --- /dev/null +++ b/Assets/Shaders/ShinyHighlight_FS.glsl @@ -0,0 +1,84 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable +#extension GL_ARB_shading_language_420pack : enable +#extension GL_EXT_nonuniform_qualifier : require + +struct MatPropData +{ + int textureIndex; + float highlightPosition; +}; + +struct GenericData +{ + //! Delta time + float dt; + + //! Elapsed time of the application + float elapsedTime; + + //! Viewport width of the scene (excluding imgui, that means smaller than window) + uint viewportWidth; + + //! Ditto but for height + uint viewportHeight; +}; + + +layout(location = 0) in struct +{ + vec4 vertPos; // location 0 + vec2 uv; // location = 1 + vec4 normal; // location = 2 + vec4 worldPos; // location = 3 +} In; + +// material stuff +layout(location = 4) flat in struct +{ + int materialIndex; + uint eid; + uint lightLayerIndex; + vec3 screenSpacePos; + +} In2; + +layout (set = 0, binding = 0) uniform GenericDataBuffer +{ + GenericData data; +} genericDataBuffer; + +layout (set = 0, binding = 1) uniform sampler2D textures[]; // for textures (global) +layout (std430, set = 2, binding = 0) buffer MaterialProperties // For materials +{ + MatPropData data[]; +} MatProp; + +layout(location = 0) out vec4 position; +layout(location = 1) out uint outEntityID; +layout(location = 2) out uint lightLayerIndices; +layout(location = 3) out vec4 normals; +layout(location = 4) out vec4 albedo; +layout(location = 5) out vec4 worldSpacePosition; +layout(location = 6) out vec4 objectVFX; + +void main() +{ + position = In.vertPos; + normals = In.normal; + albedo = texture(textures[nonuniformEXT(MatProp.data[In2.materialIndex].textureIndex)], In.uv); + worldSpacePosition = In.worldPos; + + outEntityID = In2.eid; + lightLayerIndices = In2.lightLayerIndex; + + float vpHeight = float (In2.screenSpacePos.y); + float scanlineScale = 300.0f * (1.0f - In2.screenSpacePos.z); + + float lowerLimit = vpHeight - scanlineScale; + float upperLimit = vpHeight + scanlineScale; + if (gl_FragCoord.y > lowerLimit && gl_FragCoord.y < upperLimit) + objectVFX = vec4(1.0f); + else + objectVFX = vec4(0.0f, 0.0f, 0.0f, 1.0f); +} \ No newline at end of file diff --git a/Assets/Shaders/ShinyHighlight_FS.shshaderb b/Assets/Shaders/ShinyHighlight_FS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..fea73931ac0cab9fef9813b505f0739019fdbdb5 GIT binary patch literal 3829 zcmZ9OYjYG;5QYzAcY{H0aubo51O(+05CKu-l7z5{E)q!uypF@pWHT_CS!ZVheABZ0 z3;q(cEdA#1@vG&f$|~Pyb~+h2RHtw6>F(2~&n!Ft*zSrowE6I`bDP|V+vd6hliTGs z%i;?D)1CqUx#YizkGL&vap8_PdvD1L!d^Rzx_O#;Q4)lYqom`ux<;|T*;;H(_VQrz z-1#$v-tLBq48-1{e>HJv)sGS!FNn5@c8m6lj*2dbE{U#+J{5IDI~9k0DqPZ#s&(#n z1+6JUv*k_Qp7wfS*U$Vs^m;3P5N2L_|3TQ!d(UFzQn_C2C!N0E3B7Y?&vgCvL&e!b z9FCWyNk55}(`?oIrtinmaujCrkKk|Ky47sWdhKr4>*Y`4(2Jua^nxf;rf4lBR}rVg zMM*pE2US2_i0b+4u3q$@oA#nSN{gPZc^Y7v`$&npwP(D%WfUZHabetbU+Qv7xIs`Na3ocFV^++TNxWV`9- z3t8H|?&rQT4Hq_<4Li?Vpf}VH@YK2zbyi{#hp@xewf8mo6fevoKPIS-8Ig^%<6{LR z(xT>Z@iM>kA$J6a7Im1sTE??N=ovoh2%}&fOV5g$TKuy0jP9KF?D_V_&#)w-*LW(P~)q5<9(Ii^50UG|TTsLB1lL zUgD#d=Cc#hzg5{QIj8%}%X)2tyT`}cxcgzJv2>k{8rShn-7nvgQ8s9yGv`&ESx2W9 z{LDIft<;(I2@wlFIL3Ss=^uH~ zAr@HXjZZf|5J7fxTADD0}K6VlbEJ)Q!$eqFa8xxqNeWi10Hj z_&F2jv6-;*n2mVW2eT0qoAttG0o#iraCXlYk27Pldbslm5sP}ztv|bk0ynNbL*mH$ zBvI>_Xut6MW}tIFWBN-iV6k5+b!G<}_z`jN#2S@EFTi4lL&Tx}O(OinL1*T$?Ul}* zjg|U|Qm3aZ_U{x2Tdji`r4GaEYKuCoPG%PW0ZseM;?zlu>N5SHkO$-dcS!Op;^^c) zD9*x0Y;@+GH7cE1r+(tIm;1*yDw)|uC(f8SeZoc@^l=e3dN3hACSuXs!{Wr`4D|Mh zIC;Q9_=)?v_$Cp4;-VidZTOFs@}S2xcU(F-O`nv^;=I<&wYZ!+Db|>ib(3zENPO#b-p+Yx>-CI=_KcKfizIQ;I?# zc8Pe8yt&JYiSH#5_AAQBn@2bNUdiBjbB5n189R91COY_I;%|tKiYz{}_hxCIQnurg zPl(1vVDMG3C#B`1Z-kl};!P1g_Andhwx=c8_V6xj&rQkrzE|zU_(;SIWB;MF z-IB~(!$)l944cLHSTgxczbzSz#axsO20QziOKgV!L~?ci9qH`?>O!U;9q|q`X32Balrrp literal 0 HcmV?d00001 diff --git a/Assets/Shaders/ShinyHighlight_FS.shshaderb.shmeta b/Assets/Shaders/ShinyHighlight_FS.shshaderb.shmeta new file mode 100644 index 00000000..3c17101d --- /dev/null +++ b/Assets/Shaders/ShinyHighlight_FS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: ShinyHighlight_FS +ID: 45685219 +Type: 2 diff --git a/Assets/Shaders/ShinyHighlight_VS.glsl b/Assets/Shaders/ShinyHighlight_VS.glsl new file mode 100644 index 00000000..c0268737 --- /dev/null +++ b/Assets/Shaders/ShinyHighlight_VS.glsl @@ -0,0 +1,99 @@ +#version 450 +#extension GL_KHR_vulkan_glsl : enable + +layout(location = 0) in vec3 aVertexPos; +layout(location = 1) in vec2 aUV; +layout(location = 2) in vec3 aNormal; +layout(location = 3) in vec3 aTangent; +layout(location = 4) in mat4 worldTransform; +layout(location = 8) in uvec2 integerData; +layout(location = 9) in uvec4 aBoneIndices; +layout(location = 10) in vec4 aBoneWeights; +layout(location = 11) in uint firstBoneIndex; + +layout(location = 0) out struct +{ + vec4 vertPos; // location 0 + vec2 uv; // location = 1 + vec4 normal; // location = 2 + vec4 worldPos; // location = 3 + +} Out; + +struct GenericData +{ + //! Delta time + float dt; + + //! Elapsed time of the application + float elapsedTime; + + //! Viewport width of the scene (excluding imgui, that means smaller than window) + uint viewportWidth; + + //! Ditto but for height + uint viewportHeight; +}; + +// material stuff +layout(location = 4) out struct +{ + int materialIndex; + uint eid; + uint lightLayerIndex; + vec3 screenSpacePos; + + +} Out2; + +layout(set = 1, binding = 0) uniform CameraData +{ + vec4 position; + mat4 vpMat; + mat4 viewMat; + mat4 projMat; +} cameraData; + +layout (set = 0, binding = 0) uniform GenericDataBuffer +{ + GenericData data; +} genericDataBuffer; + +void main() +{ + Out2.materialIndex = gl_InstanceIndex; + Out2.eid = integerData[0]; + Out2.lightLayerIndex = integerData[1]; + + // for transforming gBuffer position and normal data + mat4 modelViewMat = cameraData.viewMat * worldTransform; + + // gBuffer position will be in view space + Out.vertPos = modelViewMat * vec4(aVertexPos, 1.0f); + + Out.worldPos = worldTransform * vec4 (aVertexPos, 1.0f); + + // uvs for texturing in fragment shader + Out.uv = aUV; + + mat3 transposeInv = mat3 (transpose(inverse(modelViewMat))); + + // normals are also in view space + Out.normal.rgb = transposeInv * aNormal.rgb; + Out.normal.rgb = normalize (Out.normal.rgb); + + // Get center of object in world position + vec4 worldPos = vec4(worldTransform[3][0], worldTransform[3][1], worldTransform[3][2], 1.0f); + + // transform to clip space + worldPos = cameraData.vpMat * worldPos; + worldPos.xyz /= worldPos.w; + + // transform to screen space + worldPos.xy = ((worldPos.xy + vec2(1.0f)) * vec2 (0.5f)) * vec2 (genericDataBuffer.data.viewportWidth, genericDataBuffer.data.viewportHeight); + + Out2.screenSpacePos = worldPos.xyz; + + // clip space for rendering + gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f); +} \ No newline at end of file diff --git a/Assets/Shaders/ShinyHighlight_VS.shshaderb b/Assets/Shaders/ShinyHighlight_VS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..9818708504495b5706c860c5448aa90b2077dc57 GIT binary patch literal 5705 zcmZ9O`*&Pb6~}LrW>QKEluD@zHEje_OKTOVRisTHn6?HIY-oL;;W~4ZUYyK~Gn2H% z2L(mI7f?m;U7sk{_X}TjE&nQiaVGd0X?z(%gF4rZ)g{MB(CpQ-ITK->3^Onj6 za6NE|-QZ5J51arGgUjGG@OSV}a0LwWZ;1KdBwb52Q`7TPGc!}u_s!Qko%vq>d^4MG z=B;eLk$1CtKVQl8TUYVRTlMC0qv|k%N42gI)>zLPj#@IhDlet|tedCJ;)SUo&4k)1OYyXWfB!gxjk$a&gB>mS=xL|j?VrvY{WJK6&3)N#ZO1Y%(%??K2wz$A z@bbb!W^MLSo1@`{V0edKVqSc`##Mj!{;Ia-{A|`8G{_ihmUn22>tS8;?xo#Vec)tY&f4XSSD)0AUA@BD3WsHw>s(f49u=&Q-{pMT?c9r@TX6@_1F;?~+IK~GP z+}hQ*F#;Dp_Cuc=uHyJmmfRrD-c;k%jr0CRF1f4Y>{~TX-MHsL#K}e66g{IcasQW&veevz6JGA?Ls``mik9@up?XG7%-gk#JI)aNn+5g~-(Jy*#tb393 zTc}^$>B#5)q#}+*8)fl)Lo9n0>zl})O zG2R%VeGI?YllFT`-ToT43*DHFz@h(j%xi$W{_4ILIqjR6jny9Un~}9!*Bh8!-#zJn z6SFpX^QrsZ8gx7(Sus|WOZ8@g*~w{G=`lGDDkl#NlpgV`F?^;h?OMO}N5t;?LQ>u;Rv$~z15 z_y@o+&~6@e-=&=PyP3`D`D$19oyyq{*Vqq|#zL|-nex=2i&uW9=w3eI2b+`QRIaE_j_XwVLq{qRbFJ)W^LbOwoWZe!1kLr>~*g7w`CAnO!sP^xsOG zy#DHbkMuYHKT6rPwX6Gm(yqRh`AVtpqo?lA+z#vd4~)M<`ucuu1Fo;``Oj8#&(pt2 zwBL)}@5BwjZ^$9CY+}9rFsjAHNB=0CV{5F^9T7 zk>f4M=CJpXV+>h7a%@L7hu;%(sE+~dJDJ}OCV+Nxj5F^7@}ciR_MKlOM*BN}KJwep})k)b)#64Qi zh3?w=M6Jh=t#uOES9SfY&2PX5zzLxLH1qvH|F|FO`o!KIMD`pua6>(}4+3l60kqAP z=Y0}coBPu?2jmk($Ti2DR`#Q6>*u8wS+^&6+3T*PI_5!XPDxCLb6?1^#u$;BO6M2!_MinHYZ<4XT*S32an&Al z%DCu(esae3nEPNim;}~oAJ#E118w2Af*gL<6@F)twT0igil23a-+5$h@tz+;b`9gT z?Fa6w%dE{a+R6NBFab6LbB!~92FR;>W}gMdc_-CB2lSDToO0&8!2ATz|8WrYJz4UR z^Yf)o+=DNm%Lzx^1K*PO;3;5^z%%9h_#&LK+GG8vkzK!fFP=fy*I~{2$VJSv$i`If z#Fx;GiFcuoT*Q1C*%;3u-o#gsjTr*2qmNwd`>V*t%ia3HGM#d7%9{ z@Knitz2q-4dnaCI{uX!%Yy^H2Tx*p1+dx~VymQ|vxrqBNdc;j4N8I<2wME?bk>zH~ z8h(ImF8QeI60)^vi~jr&*}YcJ;Ya9~fW!XiBNs70MmDB;4nIM^1mYa@k&B-G6nW6o z!T0}X=yJkgoaf;huQ2}{YygwM8q|%^?wj}(m;lu`@#~Uz&2i-4fZZVe&iE~|KJxl_ zXMYFwfw&vLFFB@F?hhqrjp6sllC$P`&woNTUVrVr=Xj5QMs|ID+`|FpzktiYJK-MH L_4_Z~*bn{(aS`y8 literal 0 HcmV?d00001 diff --git a/Assets/Shaders/ShinyHighlight_VS.shshaderb.shmeta b/Assets/Shaders/ShinyHighlight_VS.shshaderb.shmeta new file mode 100644 index 00000000..f036de5a --- /dev/null +++ b/Assets/Shaders/ShinyHighlight_VS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: ShinyHighlight_VS +ID: 37048829 +Type: 2 diff --git a/SHADE_Engine/src/Assets/Events/SHAssetManagerEvents.h b/SHADE_Engine/src/Assets/Events/SHAssetManagerEvents.h new file mode 100644 index 00000000..aaf367e3 --- /dev/null +++ b/SHADE_Engine/src/Assets/Events/SHAssetManagerEvents.h @@ -0,0 +1,20 @@ +#pragma once + +#include +#include + +namespace SHADE +{ + struct SHCompileAssetEvent + { + //! Name of the shader. Should just contain stem from file path. + std::string shaderName; + + //! NEw binary data for shader module to use + std::vector newBinaryData; + + //! Extension to check for type + std::string ext; + }; +} + diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp index fd1f6d8a..eb0b677c 100644 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp @@ -11,6 +11,8 @@ #include "SHpch.h" #include "SHShaderSourceCompiler.h" #include "shaderc/shaderc.hpp" +#include "Assets/Events/SHAssetManagerEvents.h" +#include "Events/SHEventManager.hpp" #include #include @@ -140,6 +142,14 @@ namespace SHADE return{}; } + SHCompileAssetEvent compileShaderEvent + { + .shaderName = std::filesystem::path (data->name).stem().string(), + .newBinaryData = data->spirvBinary, + .ext = GLSL_EXTENSION.data(), + }; + SHEventManager::BroadcastEvent(compileShaderEvent, SH_ASSET_COMPILE_EVENT); + return CompileShaderSourceToBinary(path, *data); } diff --git a/SHADE_Engine/src/Events/SHEventDefines.h b/SHADE_Engine/src/Events/SHEventDefines.h index fa5bcafb..3ba64580 100644 --- a/SHADE_Engine/src/Events/SHEventDefines.h +++ b/SHADE_Engine/src/Events/SHEventDefines.h @@ -26,4 +26,5 @@ constexpr SHEventIdentifier SH_GRAPHICS_LIGHT_ENABLE_SHADOW_EVENT { 17 }; constexpr SHEventIdentifier SH_BUTTON_CLICK_EVENT { 18 }; constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_DRAW_EVENT { 19 }; constexpr SHEventIdentifier SH_WINDOW_RESIZE_EVENT { 20 }; +constexpr SHEventIdentifier SH_ASSET_COMPILE_EVENT { 21 }; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.cpp new file mode 100644 index 00000000..b77c20f9 --- /dev/null +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.cpp @@ -0,0 +1,53 @@ +#include "SHpch.h" +#include "SHGraphicsGenericData.h" +#include "Graphics/Devices/SHVkLogicalDevice.h" +#include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h" +#include "Graphics/Descriptors/SHVkDescriptorSetGroup.h" +#include "Graphics/Buffers/SHVkBuffer.h" + + +namespace SHADE +{ + void SHGraphicsGenericData::Init(Handle logicalDevice, Handle descSet) noexcept + { + alignedGpuStructSize = logicalDevice->PadUBOSize(sizeof (GpuStruct)); + + gpuBuffer = logicalDevice->CreateBuffer(alignedGpuStructSize * SHGraphicsConstants::NUM_FRAME_BUFFERS, nullptr, alignedGpuStructSize * SHGraphicsConstants::NUM_FRAME_BUFFERS, vk::BufferUsageFlagBits::eUniformBuffer, VMA_MEMORY_USAGE_AUTO, VMA_ALLOCATION_CREATE_MAPPED_BIT | VMA_ALLOCATION_CREATE_HOST_ACCESS_SEQUENTIAL_WRITE_BIT, "Generic Data"); + + std::array gpuBufferArray{ gpuBuffer }; + + // We use index 0 because the descriptor set is standalone created from a single desc set layout. What the driver sees is that this set is at index 0 during updating. + static constexpr uint8_t SET_0 = 0; + + descSet->ModifyWriteDescBuffer(SET_0, SHGraphicsConstants::DescriptorSetBindings::GENERIC_DATA, std::span>{ gpuBufferArray.data(), gpuBufferArray.size()}, 0, sizeof(GpuStruct)); + + descSet->UpdateDescriptorSetBuffer(SET_0, SHGraphicsConstants::DescriptorSetBindings::GENERIC_DATA); + + } + + void SHGraphicsGenericData::UpdateBuffer(uint32_t frameIndex) noexcept + { + gpuBuffer->WriteToMemory(&data, sizeof(GpuStruct), 0, alignedGpuStructSize * frameIndex); + } + + void SHGraphicsGenericData::SetDt(float dt) noexcept + { + data.dt = dt; + } + + void SHGraphicsGenericData::UpdateElapsedTime(float dt) noexcept + { + data.elapsedTime += dt; + } + + void SHGraphicsGenericData::SetViewportWidth(uint32_t width) noexcept + { + data.viewportWidth = width; + } + + void SHGraphicsGenericData::SetViewportHeight(uint32_t height) noexcept + { + data.viewportHeight = height; + } + +} \ No newline at end of file diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.h b/SHADE_Engine/src/Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.h new file mode 100644 index 00000000..a9a590f6 --- /dev/null +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.h @@ -0,0 +1,51 @@ +#pragma once + +#include +#include "Resource/SHHandle.h" + +namespace SHADE +{ + class SHVkDescriptorSetGroup; + class SHVkBuffer; + class SHVkLogicalDevice; + + class SHGraphicsGenericData + { + public: + struct GpuStruct + { + //! Delta time + float dt{ 0.0f }; + + //! Elapsed time of the application + float elapsedTime{ 0.0f }; + + //! Viewport width of the scene (excluding imgui, that means smaller than window) + uint32_t viewportWidth{ 0 }; + + //! Ditto but for height + uint32_t viewportHeight{ 0 }; + }; + private: + + //! This will be access + GpuStruct data; + + //! Buffer to hold the generic data + Handle gpuBuffer; + + //! gpu struct size for GPU to use + uint32_t alignedGpuStructSize; + + public: + void Init (Handle logicalDevice, Handle descSet) noexcept; + void UpdateBuffer(uint32_t frameIndex) noexcept; + + void SetDt (float dt) noexcept; + void UpdateElapsedTime (float dt) noexcept; + void SetViewportWidth(uint32_t width) noexcept; + void SetViewportHeight(uint32_t height) noexcept; + + }; +} + diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.cpp index fd94968e..e079b933 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.cpp @@ -2,11 +2,13 @@ #include "SHGlobalDescriptorSets.h" #include "Graphics/MiddleEnd/Lights/SHLightingSubSystem.h" #include "Graphics/Commands/SHVkCommandBuffer.h" +#include "Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.h" +#include "Graphics/Devices/SHVkLogicalDevice.h" namespace SHADE { - Handle SHGlobalDescriptorSets::staticGlobalDataDescriptorSet; + Handle SHGlobalDescriptorSets::genericAndTextureDataDescSet; Handle SHGlobalDescriptorSets::lightingSubSystem; //void SHGlobalDescriptorSets::BindLightingData(Handle cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t firstSet) noexcept @@ -20,11 +22,13 @@ namespace SHADE lightingSubSystem->BindDescSet(cmdBuffer, setIndex, frameIndex); } - void SHGlobalDescriptorSets::BindStaticGlobalData(Handle cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t setIndex) noexcept + void SHGlobalDescriptorSets::BindGenericAndTextureData(Handle device, Handle cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t setIndex, uint32_t frameIndex) noexcept { + uint32_t alignedGenericStructSize = device->PadUBOSize(sizeof(SHGraphicsGenericData::GpuStruct)); + // Bind descriptor set for static global data - static std::array TEX_DYNAMIC_OFFSET{ 0 }; - cmdBuffer->BindDescriptorSet(staticGlobalDataDescriptorSet, pipelineType, setIndex, std::span{ TEX_DYNAMIC_OFFSET.data(), 1 }); + static std::array TEX_DYNAMIC_OFFSET = { alignedGenericStructSize, }; + cmdBuffer->BindDescriptorSet(genericAndTextureDataDescSet, pipelineType, setIndex, std::span{ TEX_DYNAMIC_OFFSET.data(), 1 }); } /***************************************************************************/ @@ -43,9 +47,9 @@ namespace SHADE lightingSubSystem = system; } - void SHGlobalDescriptorSets::SetStaticGlobalDataDescriptorSet(Handle staticGlobalDescSet) noexcept + void SHGlobalDescriptorSets::SetStaticGlobalDataDescriptorSet(Handle descSet) noexcept { - staticGlobalDataDescriptorSet = staticGlobalDescSet; + genericAndTextureDataDescSet = descSet; } } \ No newline at end of file diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.h b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.h index 2e2dca7d..4ee09a6a 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.h @@ -15,7 +15,7 @@ namespace SHADE private: //! Static global descriptor sets for miscellaneous data and textures - static Handle staticGlobalDataDescriptorSet; + static Handle genericAndTextureDataDescSet; //! Lighting sub system required to get information to bind descriptor sets for light data static Handle lightingSubSystem; @@ -25,7 +25,7 @@ namespace SHADE /* PUBLIC MEMBER FUNCTIONS */ /*-----------------------------------------------------------------------*/ static void BindLightingData (Handle cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t setIndex, uint32_t frameIndex) noexcept; - static void BindStaticGlobalData (Handle cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t setIndex) noexcept; + static void BindGenericAndTextureData (Handle device, Handle cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t setIndex, uint32_t frameIndex) noexcept; /*-----------------------------------------------------------------------*/ /* SETTERS AND GETTERS */ diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 297a86ae..c2a6d010 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -47,6 +47,7 @@ of DigiPen Institute of Technology is prohibited. #include "Events/SHEvent.h" #include "Graphics/MiddleEnd/Lights/SHLightComponent.h" #include "Input/SHInputManager.h" +#include "Assets/Events/SHAssetManagerEvents.h" namespace SHADE { @@ -210,6 +211,7 @@ namespace SHADE renderGraph->Init("World Render Graph", device, swapchain, &resourceManager, renderContextCmdPools); renderGraph->AddResource("Position", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); renderGraph->AddResource("Position World Space", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); + renderGraph->AddResource("Object VFX", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); renderGraph->AddResource("Normals", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); //worldRenderGraph->AddResource("Tangents", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); renderGraph->AddResource("Albedo", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second); @@ -235,7 +237,8 @@ namespace SHADE "Depth Buffer", "SSAO", "SSAO Blur", - "Position World Space" + "Position World Space", + "Object VFX" }, {}); // no predecessors @@ -249,6 +252,7 @@ namespace SHADE gBufferSubpass->AddColorOutput("Normals"); gBufferSubpass->AddColorOutput("Albedo"); gBufferSubpass->AddColorOutput("Position World Space"); + gBufferSubpass->AddColorOutput("Object VFX"); gBufferSubpass->AddDepthOutput("Depth Buffer", SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL); usableSubpassesMapping.emplace (std::string (SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS.data()), gBufferSubpass); @@ -297,15 +301,15 @@ namespace SHADE "Albedo", "Scene", "SSAO Blur", - "Position World Space" + "Position World Space", + "Object VFX" }, { SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS .data()}); - /*-----------------------------------------------------------------------*/ /* DEFERRED COMPOSITE SUBPASS INIT */ /*-----------------------------------------------------------------------*/ - auto deferredCompositeCompute = deferredCompositeNode->AddNodeCompute(SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_COMPUTE.data(), deferredCompositeShader, {"Position", "Normals", "Albedo", "Light Layer Indices", "SSAO Blur", "Position World Space", "Scene"}, {}, SHLightingSubSystem::MAX_SHADOWS); + auto deferredCompositeCompute = deferredCompositeNode->AddNodeCompute(SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_COMPUTE.data(), deferredCompositeShader, {"Position", "Normals", "Albedo", "Light Layer Indices", "SSAO Blur", "Position World Space", "Scene", "Object VFX"}, {}, SHLightingSubSystem::MAX_SHADOWS); deferredCompositeCompute->AddPreComputeFunction([=](Handle cmdBuffer, uint32_t frameIndex) { lightingSubSystem->PrepareShadowMapsForRead(cmdBuffer); @@ -409,7 +413,6 @@ namespace SHADE InitRenderGraph(); - // Create Semaphore for (auto& semaHandle : graphSemaphores) { @@ -491,12 +494,34 @@ namespace SHADE void SHGraphicsSystem::InitEvents(void) noexcept { - std::shared_ptr> thisReceiver + std::shared_ptr> lightEnableShadowReceiver { std::make_shared>(this, &SHGraphicsSystem::ReceiveLightEnableShadowEvent) }; - ReceiverPtr receiver = std::dynamic_pointer_cast(thisReceiver); - SHEventManager::SubscribeTo(SH_GRAPHICS_LIGHT_ENABLE_SHADOW_EVENT, receiver); + ReceiverPtr lightEnableShadowReceivePtr = std::dynamic_pointer_cast(lightEnableShadowReceiver); + SHEventManager::SubscribeTo(SH_GRAPHICS_LIGHT_ENABLE_SHADOW_EVENT, lightEnableShadowReceivePtr); + + std::shared_ptr> compileAssetReceiever + { + std::make_shared>(this, &SHGraphicsSystem::ReceiveCompileAssetEvent) + }; + ReceiverPtr compileAssetReceivePtr = std::dynamic_pointer_cast(compileAssetReceiever); + SHEventManager::SubscribeTo(SH_ASSET_COMPILE_EVENT, compileAssetReceivePtr); + } + + void SHGraphicsSystem::InitGenericDataAndTexturesDescSet(void) noexcept + { + // descriptor set for generic data and textures + genericAndTextureDescSet = descPool->Allocate(SHGraphicsPredefinedData::GetPredefinedDescSetLayouts(SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::STATIC_DATA), { SHTextureLibrary::DEFAULT_MAX_TEXTURES }); + + for (auto set : genericAndTextureDescSet->GetVkHandle()) + SET_VK_OBJ_NAME(device, vk::ObjectType::eDescriptorSet, set, "[Descriptor Set] Static Globals"); + + SHGlobalDescriptorSets::SetStaticGlobalDataDescriptorSet(genericAndTextureDescSet); + + // Create buffer for generic data and attach to descriptor set + graphicsGenericData.Init(device, genericAndTextureDescSet); + } /*---------------------------------------------------------------------------------*/ @@ -507,6 +532,7 @@ namespace SHADE InitBoilerplate(); InitMiddleEnd(); InitSubsystems(); + InitGenericDataAndTexturesDescSet(); InitBuiltInResources(); InitEvents(); } @@ -536,7 +562,7 @@ namespace SHADE */ /***************************************************************************/ - void SHGraphicsSystem::Run(double) noexcept + void SHGraphicsSystem::Run(double dt) noexcept { if (window->IsMinimized() || renderContext.GetWindowIsDead()) { @@ -572,6 +598,9 @@ namespace SHADE auto cameraSystem = SHSystemManager::GetSystem(); + graphicsGenericData.SetDt(dt); + graphicsGenericData.UpdateElapsedTime(dt); + graphicsGenericData.UpdateBuffer(frameIndex); { #ifdef SHEDITOR @@ -860,6 +889,23 @@ namespace SHADE return eventPtr->handle; } + SHEventHandle SHGraphicsSystem::ReceiveCompileAssetEvent(SHEventPtr eventPtr) noexcept + { + auto const& EVENT_DATA = reinterpret_cast*>(eventPtr.get())->data; + + auto denseIterators = SHVkInstance::GetResourceManager().GetDenseAccess(); + for (auto it = denseIterators.first; it != denseIterators.second; ++it) + { + if (it->GetName() == EVENT_DATA->shaderName) + { + it->OnChange(); + break; + } + } + + return eventPtr->handle; + } + Handle SHGraphicsSystem::AddMaterial(Handle vertShader, Handle fragShader, Handle subpass) { // Retrieve pipeline from pipeline storage or create if unavailable @@ -980,12 +1026,11 @@ namespace SHADE device->WaitIdle(); texLibrary.BuildTextures ( - device, graphicsTexCmdBuffer, graphicsQueue, descPool + device, graphicsTexCmdBuffer, graphicsQueue, genericAndTextureDescSet ); device->WaitIdle(); graphicsTexCmdBuffer.Free(); graphicsTexCmdBuffer = {}; - SHGlobalDescriptorSets::SetStaticGlobalDataDescriptorSet(texLibrary.GetTextureDescriptorSetGroup()); - + //SHGlobalDescriptorSets::SetStaticGlobalDataDescriptorSet(texLibrary.GetTextureDescriptorSetGroup()); } Handle SHGraphicsSystem::GetTextureHandle(SHTexture::Index textureId) const @@ -1134,6 +1179,10 @@ namespace SHADE resizeWidth = newWidth; resizeHeight = newHeight; + graphicsGenericData.SetViewportWidth(resizeWidth); + graphicsGenericData.SetViewportHeight(resizeHeight); + + renderContext.SetIsResized(true); } @@ -1186,6 +1235,7 @@ namespace SHADE SHEventManager::BroadcastEvent(newEvent, SH_WINDOW_RESIZE_EVENT); + #else #endif diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h index 21d18be1..0b98f843 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h @@ -37,6 +37,7 @@ of DigiPen Institute of Technology is prohibited. #include "Graphics/MiddleEnd/Interface/SHRenderer.h" #include "Graphics/Events/SHGraphicsEvents.h" #include "Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.h" +#include "Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.h" namespace SHADE { @@ -106,6 +107,7 @@ namespace SHADE void InitSubsystems (void) noexcept; void InitBuiltInResources (void); void InitEvents (void) noexcept; + void InitGenericDataAndTexturesDescSet (void) noexcept; public: class SH_API BeginRoutine final : public SHSystemRoutine @@ -181,6 +183,11 @@ namespace SHADE /*-----------------------------------------------------------------------*/ SHEventHandle ReceiveLightEnableShadowEvent (SHEventPtr eventPtr) noexcept; + /*-----------------------------------------------------------------------*/ + /* Asset Events */ + /*-----------------------------------------------------------------------*/ + SHEventHandle ReceiveCompileAssetEvent (SHEventPtr eventPtr) noexcept; + /*-----------------------------------------------------------------------------*/ /* Material Functions */ /*-----------------------------------------------------------------------------*/ @@ -433,6 +440,7 @@ namespace SHADE SHResourceHub resourceManager; SHMeshLibrary meshLibrary; SHTextureLibrary texLibrary; + SHGraphicsGenericData graphicsGenericData; SHFontLibrary fontLibrary; SHSamplerCache samplerCache; SHMaterialInstanceCache materialInstanceCache; @@ -490,6 +498,8 @@ namespace SHADE Handle debugDrawFilledDepthPipeline; Handle shadowMapPipeline; // initialized only when a shadow map is needed + Handle genericAndTextureDescSet; + // Built-In Textures Handle defaultTexture; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp index 7a7bea17..a866041e 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp @@ -194,7 +194,7 @@ namespace SHADE cmdBuffer->BindPipeline(pipeline); // Bind global data - SHGlobalDescriptorSets::BindStaticGlobalData(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex); + SHGlobalDescriptorSets::BindGenericAndTextureData(logicalDevice, cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex, frameIndex); // Bind camera data renderer->BindDescriptorSet(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, cameraSetIndex, frameIndex); diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Textures/SHTextureLibrary.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Textures/SHTextureLibrary.cpp index 0578e7a2..fd2f3ac7 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Textures/SHTextureLibrary.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Textures/SHTextureLibrary.cpp @@ -63,7 +63,7 @@ namespace SHADE isDirty = true; } - void SHTextureLibrary::BuildTextures(Handle device, Handle cmdBuffer, Handle graphicsQueue, Handle descPool) + void SHTextureLibrary::BuildTextures(Handle device, Handle cmdBuffer, Handle graphicsQueue, Handle descSet/*, Handle descPool*/) { // Don't do anything if there are no updates if (!isDirty) @@ -162,27 +162,28 @@ namespace SHADE /* Build Descriptor Set with all the Textures only if there are textures */ if (!texOrder.empty()) { - if (texDescriptors) - { - texDescriptors.Free(); - } - texDescriptors = descPool->Allocate - ( - { SHGraphicsPredefinedData::GetPredefinedDescSetLayouts(SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::STATIC_DATA) }, - { static_cast(texOrder.size()) } - ); -#ifdef _DEBUG - for (auto set : texDescriptors->GetVkHandle()) - SET_VK_OBJ_NAME(device, vk::ObjectType::eDescriptorSet, set, "[Descriptor Set] Static Globals"); -#endif + +// if (descSet) +// { +// descSet.Free(); +// } +// descSet = descPool->Allocate +// ( +// { SHGraphicsPredefinedData::GetPredefinedDescSetLayouts(SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::STATIC_DATA) }, +// { static_cast(texOrder.size()) } +// ); +//#ifdef _DEBUG +// for (auto set : descSet->GetVkHandle()) +// SET_VK_OBJ_NAME(device, vk::ObjectType::eDescriptorSet, set, "[Descriptor Set] Static Globals"); +//#endif static constexpr uint32_t TEX_DESCRIPTOR_SET_INDEX = 0; - texDescriptors->ModifyWriteDescImage + descSet->ModifyWriteDescImage ( TEX_DESCRIPTOR_SET_INDEX, SHGraphicsConstants::DescriptorSetBindings::IMAGE_AND_SAMPLERS_DATA, combinedImageSamplers ); - texDescriptors->UpdateDescriptorSetImages + descSet->UpdateDescriptorSetImages ( TEX_DESCRIPTOR_SET_INDEX, SHGraphicsConstants::DescriptorSetBindings::IMAGE_AND_SAMPLERS_DATA diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Textures/SHTextureLibrary.h b/SHADE_Engine/src/Graphics/MiddleEnd/Textures/SHTextureLibrary.h index 5b7e4914..bbc72a1a 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Textures/SHTextureLibrary.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Textures/SHTextureLibrary.h @@ -66,6 +66,13 @@ namespace SHADE class SHTextureLibrary { public: + //! This exists because a poor decision was made to place the textures and + //! generic data as 2 bindings in a single layout. Because of this, the recreation + //! of the texture library would mean the recreation of the desc set that also + //! involves the generic data, which is bad bad bad. Solution is to separate the + //! 2 desc sets. + static constexpr uint32_t DEFAULT_MAX_TEXTURES = 2000; + /*-----------------------------------------------------------------------------*/ /* Usage Functions */ /*-----------------------------------------------------------------------------*/ @@ -112,7 +119,7 @@ namespace SHADE /*! \brief - Finalises all changes to the Texture Library into the GPU buffers. + Finalizes all changes to the Texture Library into the GPU buffers. \param device Device used to create and update the buffers. @@ -123,12 +130,12 @@ namespace SHADE queue. */ /***************************************************************************/ - void BuildTextures(Handle device, Handle cmdBuffer, Handle graphicsQueue, Handle descPool); + void BuildTextures(Handle device, Handle cmdBuffer, Handle graphicsQueue, Handle descSet/*, Handle descPool*/); /*-----------------------------------------------------------------------------*/ /* Getter Functions */ /*-----------------------------------------------------------------------------*/ - Handle GetTextureDescriptorSetGroup() const noexcept { return texDescriptors; } + //Handle GetTextureDescriptorSetGroup() const noexcept { return descSet; } /***************************************************************************/ /*! * @@ -173,8 +180,8 @@ namespace SHADE std::vector> texOrder; // CPU Storage std::vector, Handle, vk::ImageLayout>> combinedImageSamplers; - // GPU Storage - Handle texDescriptors; + //// GPU Storage + //Handle descSet; // Flags bool isDirty = true; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.cpp index 740ffa92..802d085d 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.cpp @@ -164,7 +164,7 @@ namespace SHADE cmdBuffer->BindPipeline(pipeline); // Bind global data - SHGlobalDescriptorSets::BindStaticGlobalData(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex); + SHGlobalDescriptorSets::BindGenericAndTextureData(logicalDevice, cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex, frameIndex); // Bind camera data renderer->BindDescriptorSet(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, cameraSetIndex, frameIndex); diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp index c312535e..654cae77 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp @@ -584,7 +584,7 @@ namespace SHADE if (node->renderpass) { // bind static global data - SHGlobalDescriptorSets::BindStaticGlobalData(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, descMappings.at(SHPredefinedDescriptorTypes::STATIC_DATA)); + SHGlobalDescriptorSets::BindGenericAndTextureData(renderGraphStorage->logicalDevice, cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, descMappings.at(SHPredefinedDescriptorTypes::STATIC_DATA), frameIndex); // Bind all the buffers required for meshes for (auto& [buffer, bindingPoint] : MESH_DATA) diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp index b0d83172..b032ca1e 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp @@ -664,7 +664,7 @@ namespace SHADE commandBuffer->ForceSetPipelineLayout(SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::RENDER_GRAPH_NODE_COMPUTE).dummyPipelineLayout, SH_PIPELINE_TYPE::COMPUTE); // bind static global data - SHGlobalDescriptorSets::BindStaticGlobalData(commandBuffer, SH_PIPELINE_TYPE::COMPUTE, descMappings.at(SHPredefinedDescriptorTypes::STATIC_DATA)); + SHGlobalDescriptorSets::BindGenericAndTextureData(graphStorage->logicalDevice, commandBuffer, SH_PIPELINE_TYPE::COMPUTE, descMappings.at(SHPredefinedDescriptorTypes::STATIC_DATA), frameIndex); // bind lighting data SHGlobalDescriptorSets::BindLightingData(commandBuffer, SH_PIPELINE_TYPE::COMPUTE, descMappings.at(SHPredefinedDescriptorTypes::LIGHTS), frameIndex); diff --git a/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.cpp b/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.cpp index fa6b3182..9cf01b6b 100644 --- a/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.cpp +++ b/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.cpp @@ -112,4 +112,9 @@ namespace SHADE return reflectedData; } + std::string SHVkShaderModule::GetName(void) const noexcept + { + return shaderName; + } + } \ No newline at end of file diff --git a/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.h b/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.h index 492710f2..e0e1a2fb 100644 --- a/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.h +++ b/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.h @@ -77,6 +77,7 @@ namespace SHADE vk::ShaderStageFlagBits GetShaderStageFlagBits (void) const noexcept; vk::ShaderModule GetVkShaderModule (void) const noexcept; SHShaderReflected const& GetReflectedData (void) const noexcept; + std::string GetName (void) const noexcept; }; } From 5623115e29fbd39b4d4889ce3b8a61657fc578f3 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Wed, 22 Feb 2023 16:43:49 +0800 Subject: [PATCH 04/12] Added asset id into compile function to facilitate event sending --- SHADE_Engine/src/Assets/SHAssetManager.cpp | 2 +- SHADE_Engine/src/Assets/SHAssetManager.h | 2 +- .../src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp | 2 +- 3 files changed, 3 insertions(+), 3 deletions(-) diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index 363b7829..93f313b4 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -383,7 +383,7 @@ namespace SHADE return result; } - void SHAssetManager::CompileAsset(AssetPath const& path, bool genMeta) noexcept + void SHAssetManager::CompileAsset(AssetPath const& path, bool genMeta, AssetID id) noexcept { if (!std::filesystem::exists(path)) { diff --git a/SHADE_Engine/src/Assets/SHAssetManager.h b/SHADE_Engine/src/Assets/SHAssetManager.h index 6cac6c71..29bfe329 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.h +++ b/SHADE_Engine/src/Assets/SHAssetManager.h @@ -90,7 +90,7 @@ namespace SHADE static std::vector GetAllDataOfType(AssetType type) noexcept; static std::vector GetAllRecordOfType(AssetType type) noexcept; - static void CompileAsset(AssetPath const& path, bool genMeta) noexcept; + static void CompileAsset(AssetPath const& path, bool genMeta, AssetID id = 0) noexcept; static FolderPointer GetRootFolder() noexcept; static void RefreshDirectory() noexcept; diff --git a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp index 791396df..cf459a29 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp @@ -233,7 +233,7 @@ namespace SHADE { if(ImGui::Selectable("Compile")) { - SHAssetManager::CompileAsset(file.path, !file.compiled); + SHAssetManager::CompileAsset(file.path, !file.compiled, file.assetMeta->id); QueueRefresh(); } ImGui::EndPopup(); From 8e9854a13054cba27a9a09b311444fc84c9029f9 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Wed, 22 Feb 2023 16:49:21 +0800 Subject: [PATCH 05/12] Check for existing asset meta in browser file before sendin asset id --- SHADE_Engine/src/Assets/SHAssetManager.cpp | 4 ++++ .../src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp | 2 +- 2 files changed, 5 insertions(+), 1 deletion(-) diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index 93f313b4..e6dd8e4f 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -441,6 +441,10 @@ namespace SHADE if (genMeta) { GenerateNewMeta(newPath); + } + else + { + //send event here } } diff --git a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp index cf459a29..9089d478 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp @@ -233,7 +233,7 @@ namespace SHADE { if(ImGui::Selectable("Compile")) { - SHAssetManager::CompileAsset(file.path, !file.compiled, file.assetMeta->id); + SHAssetManager::CompileAsset(file.path, !file.compiled, file.assetMeta ? file.assetMeta->id : 0); QueueRefresh(); } ImGui::EndPopup(); From ff76704a860fc787a9e00065c227e5a38eace0b0 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Wed, 22 Feb 2023 19:48:49 +0800 Subject: [PATCH 06/12] New internal function in asset manager to get asset ID from name of compiled asset --- SHADE_Engine/src/Assets/SHAssetManager.cpp | 22 ++++++++++++++++--- SHADE_Engine/src/Assets/SHAssetManager.h | 5 +++-- .../AssetBrowser/SHAssetBrowser.cpp | 2 +- 3 files changed, 23 insertions(+), 6 deletions(-) diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index e6dd8e4f..b66b670c 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -167,6 +167,17 @@ namespace SHADE return {}; } + AssetID SHAssetManager::GetAssetIDFromPath(AssetPath const& path) noexcept + { + for (auto const& pair : assetCollection) + { + if (pair.second.path.stem() == path.stem()) + return pair.first; + } + + return 0; + } + /**************************************************************************** * \brief Create record for new asset. CAN ONLY CREATE FOR CUSTOM * ASSETS CREATED BY THE ENGINE. @@ -383,7 +394,7 @@ namespace SHADE return result; } - void SHAssetManager::CompileAsset(AssetPath const& path, bool genMeta, AssetID id) noexcept + void SHAssetManager::CompileAsset(AssetPath const& path, bool genMeta) noexcept { if (!std::filesystem::exists(path)) { @@ -438,14 +449,19 @@ namespace SHADE return; } + AssetID target{ 0 }; if (genMeta) { - GenerateNewMeta(newPath); + auto result = GenerateNewMeta(newPath); + target = result.has_value() ? result.value() : 0; } else { - //send event here + target = GetAssetIDFromPath(path); } + + //TODO SEND EVENT HERE + } FolderPointer SHAssetManager::GetRootFolder() noexcept diff --git a/SHADE_Engine/src/Assets/SHAssetManager.h b/SHADE_Engine/src/Assets/SHAssetManager.h index 29bfe329..c0ea9a1e 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.h +++ b/SHADE_Engine/src/Assets/SHAssetManager.h @@ -50,7 +50,7 @@ namespace SHADE * \return const& to unordered_map ****************************************************************************/ static std::vector GetAllAssets() noexcept; - static std::optional GetAsset(AssetID id) noexcept; + static std::optional GetAsset(AssetID id) noexcept; static AssetType GetType(AssetID id) noexcept; @@ -90,13 +90,14 @@ namespace SHADE static std::vector GetAllDataOfType(AssetType type) noexcept; static std::vector GetAllRecordOfType(AssetType type) noexcept; - static void CompileAsset(AssetPath const& path, bool genMeta, AssetID id = 0) noexcept; + static void CompileAsset(AssetPath const& path, bool genMeta) noexcept; static FolderPointer GetRootFolder() noexcept; static void RefreshDirectory() noexcept; private: + static AssetID GetAssetIDFromPath(AssetPath const& path) noexcept; static void InitLoaders() noexcept; static void LoadAllData() noexcept; static SHAssetData* LoadData(SHAsset const& asset) noexcept; diff --git a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp index 9089d478..791396df 100644 --- a/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp +++ b/SHADE_Engine/src/Editor/EditorWindow/AssetBrowser/SHAssetBrowser.cpp @@ -233,7 +233,7 @@ namespace SHADE { if(ImGui::Selectable("Compile")) { - SHAssetManager::CompileAsset(file.path, !file.compiled, file.assetMeta ? file.assetMeta->id : 0); + SHAssetManager::CompileAsset(file.path, !file.compiled); QueueRefresh(); } ImGui::EndPopup(); From 4dd496a6e8d7e40568c83bfc12e3aaeef59c2b5b Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Wed, 22 Feb 2023 19:51:50 +0800 Subject: [PATCH 07/12] Auto stash before merge of "SP3-1-Rendering" and "origin/SP3-1-Rendering" WIP Hot reload --- .../src/Assets/Events/SHAssetManagerEvents.h | 12 +++--- .../Compilers/SHShaderSourceCompiler.cpp | 9 ----- SHADE_Engine/src/Assets/SHAssetManager.cpp | 10 +++++ .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 16 +++++--- .../src/Graphics/Pipeline/SHVkPipeline.cpp | 3 ++ .../Graphics/Pipeline/SHVkPipelineLayout.cpp | 9 +++++ .../Graphics/Pipeline/SHVkPipelineLayout.h | 10 +++++ .../src/Graphics/Shaders/SHVkShaderModule.cpp | 39 ++++++++++++------- .../src/Graphics/Shaders/SHVkShaderModule.h | 9 +++-- 9 files changed, 78 insertions(+), 39 deletions(-) diff --git a/SHADE_Engine/src/Assets/Events/SHAssetManagerEvents.h b/SHADE_Engine/src/Assets/Events/SHAssetManagerEvents.h index aaf367e3..d61395e9 100644 --- a/SHADE_Engine/src/Assets/Events/SHAssetManagerEvents.h +++ b/SHADE_Engine/src/Assets/Events/SHAssetManagerEvents.h @@ -7,14 +7,14 @@ namespace SHADE { struct SHCompileAssetEvent { - //! Name of the shader. Should just contain stem from file path. - std::string shaderName; + //! Name of the asset (where applicable) + std::string assetName; - //! NEw binary data for shader module to use - std::vector newBinaryData; + //! asset ID of the asset + AssetID assetID; - //! Extension to check for type - std::string ext; + //! type of the asset + AssetType assetType; }; } diff --git a/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp index eb0b677c..0bde59c7 100644 --- a/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp +++ b/SHADE_Engine/src/Assets/Libraries/Compilers/SHShaderSourceCompiler.cpp @@ -11,7 +11,6 @@ #include "SHpch.h" #include "SHShaderSourceCompiler.h" #include "shaderc/shaderc.hpp" -#include "Assets/Events/SHAssetManagerEvents.h" #include "Events/SHEventManager.hpp" #include @@ -142,14 +141,6 @@ namespace SHADE return{}; } - SHCompileAssetEvent compileShaderEvent - { - .shaderName = std::filesystem::path (data->name).stem().string(), - .newBinaryData = data->spirvBinary, - .ext = GLSL_EXTENSION.data(), - }; - SHEventManager::BroadcastEvent(compileShaderEvent, SH_ASSET_COMPILE_EVENT); - return CompileShaderSourceToBinary(path, *data); } diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index b66b670c..d8bedfd3 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -28,6 +28,8 @@ #include "Filesystem/SHFileSystem.h" #include +#include "Assets/Events/SHAssetManagerEvents.h" +#include "Events/SHEventManager.hpp" namespace SHADE { @@ -458,6 +460,14 @@ namespace SHADE else { target = GetAssetIDFromPath(path); + // send compile asset event + SHCompileAssetEvent compileShaderEvent + { + .assetName = newPath.filename().stem().string(), + .assetID = id, + .assetType = AssetType::SHADER, + }; + SHEventManager::BroadcastEvent(compileShaderEvent, SH_ASSET_COMPILE_EVENT); } //TODO SEND EVENT HERE diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index c2a6d010..70a7d34f 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -893,13 +893,19 @@ namespace SHADE { auto const& EVENT_DATA = reinterpret_cast*>(eventPtr.get())->data; - auto denseIterators = SHVkInstance::GetResourceManager().GetDenseAccess(); - for (auto it = denseIterators.first; it != denseIterators.second; ++it) + // check for asset type + if (EVENT_DATA->assetType == AssetType::SHADER) { - if (it->GetName() == EVENT_DATA->shaderName) + // loop through all shaders + auto denseIterators = SHVkInstance::GetResourceManager().GetDenseAccess(); + for (auto it = denseIterators.first; it != denseIterators.second; ++it) { - it->OnChange(); - break; + if (it->GetName() == EVENT_DATA->assetName) + { + auto* shaderAsset = SHAssetManager::GetData(EVENT_DATA->assetID); + it->OnChange(shaderAsset->spirvBinary); + break; + } } } diff --git a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipeline.cpp b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipeline.cpp index 973ae72f..77559de3 100644 --- a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipeline.cpp +++ b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipeline.cpp @@ -235,6 +235,9 @@ namespace SHADE , pipelineLayout { inPipelineLayout } , created {false} { + if (pipelineLayout) + pipelineLayout->AddCallback([this]() {ConstructPipeline();}); + // We want to create a pipeline if (state != nullptr) { diff --git a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp index 6a6ef879..e08be902 100644 --- a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp +++ b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp @@ -450,6 +450,15 @@ namespace SHADE } else SHVulkanDebugUtil::ReportVkSuccess("Successfully created Pipeline Layout. "); + + // Call callbacks + for (auto& callback : onChangeCallbacks) + callback(); + } + + void SHVkPipelineLayout::AddCallback(ChangeCallback&& callback) noexcept + { + onChangeCallbacks.emplace_back(std::move(callback)); } std::vector> const& SHVkPipelineLayout::GetShaderModules(void) const noexcept diff --git a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.h b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.h index e2af02a9..a856700b 100644 --- a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.h +++ b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.h @@ -10,6 +10,9 @@ namespace SHADE class SHVkPipelineLayout { + public: + using ChangeCallback = std::function; + private: /*-----------------------------------------------------------------------*/ /* PRIVATE MEMBER VARIABLES */ @@ -51,6 +54,12 @@ namespace SHADE //! Store for pipeline layout recreation std::vector vkDescriptorSetLayoutsPipeline; + //! When pipeline layout needs to be recreated, this container could serve as an event + //! response to call all the functions that need to be called. Specifically + //! pipelines that need to use the new pipeline layout + std::vector onChangeCallbacks; + + /*-----------------------------------------------------------------------*/ /* PRIVATE MEMBER FUNCTIONS */ /*-----------------------------------------------------------------------*/ @@ -73,6 +82,7 @@ namespace SHADE /* PUBLIC MEMBER FUNCTIONS */ /*-----------------------------------------------------------------------*/ void RecreateIfNeeded (void) noexcept; + void AddCallback(ChangeCallback&& callback) noexcept; /*-----------------------------------------------------------------------*/ /* SETTERS AND GETTERS */ diff --git a/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.cpp b/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.cpp index 9cf01b6b..030909af 100644 --- a/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.cpp +++ b/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.cpp @@ -7,20 +7,16 @@ namespace SHADE { - SHVkShaderModule::SHVkShaderModule(Handle const& inLogicalDeviceHdl, std::vector const& binaryData, std::string inEntryPoint, vk::ShaderStageFlagBits stage, std::string const& name) noexcept - : logicalDeviceHdl {inLogicalDeviceHdl} - , shaderStage {stage} - , entryPoint {inEntryPoint} - , vkShaderModule {nullptr} - , spirvBinary{} - , shaderName {name} - , reflectedData {} + void SHVkShaderModule::Recompile(void) noexcept { + if (vkShaderModule) + logicalDeviceHdl->GetVkLogicalDevice().destroyShaderModule(vkShaderModule, nullptr); + // Prepare the create info vk::ShaderModuleCreateInfo moduleCreateInfo { - .codeSize = binaryData.size() * sizeof (uint32_t), - .pCode = binaryData.data(), + .codeSize = spirvBinary.size() * sizeof(uint32_t), + .pCode = spirvBinary.data(), }; if (auto result = logicalDeviceHdl->GetVkLogicalDevice().createShaderModule(&moduleCreateInfo, nullptr, &vkShaderModule); result != vk::Result::eSuccess) @@ -30,10 +26,18 @@ namespace SHADE } else SHVulkanDebugUtil::ReportVkSuccess("Successfully created shader module."); + } - // TODO: Right now, this is doing a copy, we need to figure out if its better to just move from the resource management (source library) instead. The hope is that - // shader modules only need 1 of themselves. - spirvBinary = binaryData; + SHVkShaderModule::SHVkShaderModule(Handle const& inLogicalDeviceHdl, std::vector const& binaryData, std::string inEntryPoint, vk::ShaderStageFlagBits stage, std::string const& name) noexcept + : logicalDeviceHdl {inLogicalDeviceHdl} + , shaderStage {stage} + , entryPoint {inEntryPoint} + , vkShaderModule {nullptr} + , spirvBinary{binaryData} + , shaderName {name} + , reflectedData {} + { + Recompile(); } SHVkShaderModule::SHVkShaderModule(SHVkShaderModule&& rhs) noexcept @@ -81,13 +85,18 @@ namespace SHADE } } - void SHVkShaderModule::OnChange(void) noexcept + void SHVkShaderModule::OnChange(std::vector const& newBinaryData) noexcept { + // assign new binary data and recompile shader + spirvBinary = newBinaryData; + + Recompile(); + for (auto& callback : onChangeCallbacks) callback(); } - void SHVkShaderModule::AddCallback(SHShaderChangeCallback&& callback) noexcept + void SHVkShaderModule::AddCallback(ChangeCallback&& callback) noexcept { onChangeCallbacks.emplace_back(std::move(callback)); } diff --git a/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.h b/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.h index e0e1a2fb..341b1706 100644 --- a/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.h +++ b/SHADE_Engine/src/Graphics/Shaders/SHVkShaderModule.h @@ -16,7 +16,7 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* TYPE DEFINITIONS */ /*-----------------------------------------------------------------------*/ - using SHShaderChangeCallback = std::function; + using ChangeCallback = std::function; private: /*-----------------------------------------------------------------------*/ @@ -47,12 +47,13 @@ namespace SHADE //! response to call all the functions that need to be called. Specifically //! pipeline layouts that need to re-parse the newly reflected data and create //! descriptor set layouts and push constant ranges. - std::vector onChangeCallbacks; + std::vector onChangeCallbacks; // #NoteToSelf: From Tomas module, pipeline shader stage create info isn't created here // because the struct allows specialization info which should not be part of a module itself. // This struct should be created in the pipeline instead. + void Recompile (void) noexcept; public: /*-----------------------------------------------------------------------*/ @@ -67,8 +68,8 @@ namespace SHADE /* PUBLIC MEMBER FUNCTIONS */ /*-----------------------------------------------------------------------*/ void Reflect (void) noexcept; - void OnChange (void) noexcept; - void AddCallback (SHShaderChangeCallback&& callback) noexcept; + void OnChange (std::vector const& newBinaryData) noexcept; + void AddCallback (ChangeCallback&& callback) noexcept; /*-----------------------------------------------------------------------*/ /* SETTERS AND GETTERS */ From a391d9373efbe20fa31745ee9c94faed8d2fa5bf Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Thu, 23 Feb 2023 13:35:46 +0800 Subject: [PATCH 08/12] WIP --- SHADE_Engine/src/Assets/SHAssetManager.cpp | 2 +- SHADE_Engine/src/Graphics/Pipeline/SHVkPipeline.cpp | 3 +++ 2 files changed, 4 insertions(+), 1 deletion(-) diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index d8bedfd3..b7cae8ff 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -464,7 +464,7 @@ namespace SHADE SHCompileAssetEvent compileShaderEvent { .assetName = newPath.filename().stem().string(), - .assetID = id, + .assetID = target, .assetType = AssetType::SHADER, }; SHEventManager::BroadcastEvent(compileShaderEvent, SH_ASSET_COMPILE_EVENT); diff --git a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipeline.cpp b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipeline.cpp index 77559de3..dd050627 100644 --- a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipeline.cpp +++ b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipeline.cpp @@ -362,7 +362,10 @@ namespace SHADE { // if it was created before, destroy it if (created) + { + logicalDeviceHdl->WaitIdle(); logicalDeviceHdl->GetVkLogicalDevice().destroyPipeline(vkPipeline, nullptr); + } // Set to false again. If creation succeeds after this, this will be true created = false; From 5d3e755b9b91de878aa60ccff776cd82456512e7 Mon Sep 17 00:00:00 2001 From: Xiao Qi Date: Thu, 23 Feb 2023 13:49:21 +0800 Subject: [PATCH 09/12] Reload of recompiled data --- SHADE_Engine/src/Assets/SHAssetManager.cpp | 32 +++++++++++++++------- SHADE_Engine/src/Assets/SHAssetManager.h | 2 +- 2 files changed, 23 insertions(+), 11 deletions(-) diff --git a/SHADE_Engine/src/Assets/SHAssetManager.cpp b/SHADE_Engine/src/Assets/SHAssetManager.cpp index b7cae8ff..b7f7fbb4 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.cpp +++ b/SHADE_Engine/src/Assets/SHAssetManager.cpp @@ -41,7 +41,7 @@ namespace SHADE std::vector SHAssetManager::loaders(TYPE_COUNT); std::unordered_map SHAssetManager::assetCollection; - std::unordered_map SHAssetManager::assetData; + std::unordered_map SHAssetManager::assetData; /**************************************************************************** @@ -460,18 +460,30 @@ namespace SHADE else { target = GetAssetIDFromPath(path); - // send compile asset event - SHCompileAssetEvent compileShaderEvent + + //Reload data + auto result = GetAsset(target); + if (result.has_value()) { - .assetName = newPath.filename().stem().string(), - .assetID = target, - .assetType = AssetType::SHADER, - }; - SHEventManager::BroadcastEvent(compileShaderEvent, SH_ASSET_COMPILE_EVENT); + auto const& asset{ result.value() }; + auto newData = loaders[static_cast(asset.type)]->Load(asset.path); + delete assetData[target]; + assetData[target] = newData; + } + else + { + SHLOG_ERROR("[Asset Manager] Critical: reload of existing compiled data failed"); + } } - //TODO SEND EVENT HERE - + // send compile asset event + SHCompileAssetEvent compileShaderEvent + { + .assetName = newPath.filename().stem().string(), + .assetID = target, + .assetType = AssetType::SHADER, + }; + SHEventManager::BroadcastEvent(compileShaderEvent, SH_ASSET_COMPILE_EVENT); } FolderPointer SHAssetManager::GetRootFolder() noexcept diff --git a/SHADE_Engine/src/Assets/SHAssetManager.h b/SHADE_Engine/src/Assets/SHAssetManager.h index c0ea9a1e..e5cd0359 100644 --- a/SHADE_Engine/src/Assets/SHAssetManager.h +++ b/SHADE_Engine/src/Assets/SHAssetManager.h @@ -123,7 +123,7 @@ namespace SHADE // For all resources static std::unordered_map assetCollection; - static std::unordered_map assetData; + static std::unordered_map assetData; }; } From 6faa4e676bc2b39b4beb1c6f85730b1ce1b959a9 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Fri, 24 Feb 2023 08:27:04 +0800 Subject: [PATCH 10/12] Updated shader for scanline (needs refining) Shader hot reloading is working --- Assets/Shaders/ShinyHighlight_FS.glsl | 19 +++++++++++++++--- Assets/Shaders/ShinyHighlight_FS.shshaderb | Bin 3829 -> 5201 bytes .../Graphics/Pipeline/SHVkPipelineLayout.cpp | 4 ++++ 3 files changed, 20 insertions(+), 3 deletions(-) diff --git a/Assets/Shaders/ShinyHighlight_FS.glsl b/Assets/Shaders/ShinyHighlight_FS.glsl index 511c0704..92020d9a 100644 --- a/Assets/Shaders/ShinyHighlight_FS.glsl +++ b/Assets/Shaders/ShinyHighlight_FS.glsl @@ -62,6 +62,11 @@ layout(location = 4) out vec4 albedo; layout(location = 5) out vec4 worldSpacePosition; layout(location = 6) out vec4 objectVFX; +float map (float value, float srcLow, float srcHigh, float dstLow, float dstHigh) +{ + return dstLow + (value - srcLow) * (dstHigh - dstLow) / (srcHigh - srcLow); +} + void main() { position = In.vertPos; @@ -72,13 +77,21 @@ void main() outEntityID = In2.eid; lightLayerIndices = In2.lightLayerIndex; - float vpHeight = float (In2.screenSpacePos.y); - float scanlineScale = 300.0f * (1.0f - In2.screenSpacePos.z); + float vpHeight = (float (In2.screenSpacePos.y) - (genericDataBuffer.data.elapsedTime * 4000.0f * (1.0f - In2.screenSpacePos.z))); + vpHeight = float (int (vpHeight) % genericDataBuffer.data.viewportHeight); + float scanlineScale = 2500.0f * (1.0f - In2.screenSpacePos.z); float lowerLimit = vpHeight - scanlineScale; float upperLimit = vpHeight + scanlineScale; if (gl_FragCoord.y > lowerLimit && gl_FragCoord.y < upperLimit) - objectVFX = vec4(1.0f); + { + float opacity = 0.0f; + opacity = map (abs (gl_FragCoord.y - vpHeight), 0.0f, upperLimit - vpHeight, 0.0f, 1.0f); + opacity = 1.0f - clamp (opacity, 0.0f, 1.0f); + + + objectVFX = vec4(opacity); + } else objectVFX = vec4(0.0f, 0.0f, 0.0f, 1.0f); } \ No newline at end of file diff --git a/Assets/Shaders/ShinyHighlight_FS.shshaderb b/Assets/Shaders/ShinyHighlight_FS.shshaderb index fea73931ac0cab9fef9813b505f0739019fdbdb5..af550ffe7223c404cfc381826e13c34f2c0d149f 100644 GIT binary patch literal 5201 zcmZve`hn}8Y zf~bj*06utVz$bb6h=4ze$D_aTKXFvf(c|}X`_^t}jyI`O^{uK~x2o=~p4~FOHE?Ti z&5ofU7zl=gjlrJ_Rd8LfMw-C!kK_mbtLOg^9}dW)z^m)-v(U(N~L{EyQ zMJGh(L{~*y6o-9ET+*Pj3xbaov=Xcf>XYHYrw)bPxD#bj9*5n9s2OKrI{R$g$h+72 z$fR_`R@9#FMe}jEXZL-bsPUZQtR)WRwbOR5oy?`#V)%S7Y9(_?oXI|ny?*p)eR3>p zbUI--Kh=uER??2cW|HZoWGUt>7svZ0?MAEDEIU-?QLewLiZ-d1#i(=l-2HpY{{wv2 z$+i@=dJ66Euy{9XOs2~PUSHtxWPZWfHwZVo`HFpGfxW%z`rS#pNuH#x|5f#JhkRHy zMKF0O&hn|WD_zCuxWC@gst^5dt3^=@UCsG$)5~erYO+y_*xc=ePNEj>xY*NmnEQ@e zvvD)UUJdpL=kW`9FN^*DYVd$`Pel1tmUa$Dd8CtuoK9->pEx)vvkG1n8KQ(dK z`7=M)oR>6QWAQ&J+frvdrbQB^sRp5VJ#MQv4d3gE(_wGQi+je$)zykR-MD!yS&UtM z=&5fhiI+QRmY+zP`GPR@VWU2?*{RetBYo-2L%q28R>c*UH^)%=Ds!at?)<|%|Di=SyL|Z ztOV!9Q{9R>>+l6(J~fNpez6Z<>cf}&@Re(D)qUTJkJa%bPs>)lz2PM};Yenp{8L@qJWq{7|U|u+P zjfiu>oXf&@pE%z;Y{;uQ4+dkxf7x32)l2gDid=Csz@Dmz7`%Hhd4qZLV9qCB-X6>H zHC?$*)3FCXtJU5uI=-v;&4{xs9yQGfTfMWAw~JWh175Aa;@%kF?9JZJZyWj2;~Nx( zIHQU=D2{xSBy1y&Dw>$$HxS*ZG9_1J)0g?pI{$WW=RQY-N5qMZey_*mhYo*oCmv^S zle9w|U-WQ@ICqE-h_Dj}%o{~_qwt;LBOdSc_%2}<`|lRVx10xWnmo+^UdiNPdGf}w z-=bed{u@IJ4@zTeC21s@XU zOv6Vcv#8g4IU$*t_&@ID?c&zkCncAAf7E0ApYn2%V}Y4F{IMSsCwAG+99lf|&v+mF zzvbncIDH7kks*8`dOahKjXjY#HO`3089XaOhrQutVo)=DP80+$ju~EX`1F1-XCxxq z&uUGR2;Z%Y^yA1rRQAU?K#mv$?qM>EbHY}$<%(Yrjqylp$H!%@_10+63$~T zS@{1;8oq19VUACV;D(p`Fu!YM`4pt7V7Ul1|#cZnWV z&eVF32>m`)H0rVWe^D5J=Gy#sNk)%9^AE;QGi7yuT{3$7nLRN6%+fcUe)UY=}On?HXu&?oCF{@)Z8`a$=b z2tKH(VD`Q(!k>JYOLD4-e@BE3zlL~IG%KQ~RzH5R2-{iZ3!eA7IdMDVS;=-rBH7M( zPBONa{oa;j<^jFMTa-*pZ06UNOn%tt8MA@T;--=dU2)ePVRSF4Hu~|r2p#z`>s^u6 zX7_?$?rpCtKX6aPUi2N`rzNkqJiu1>Darq@?iZ!UX7zkmGIgW3x?hsaHwPQBnRj$n zEa4wW#>ZlwmW&U2_Vax>EwcSTlw98bvM~G4_`7&TGCt_pe?}Y~?~Hfzs_2}k z{AOPBdOPEFVb1-#_M8>}kq963|5VJMh_gObFR}etgpO|?vYqu)$^B=&Asu=<>rKhz z_&0ynTaxiX|8K>!xbRQ(r6ixXMVwm|;m?`m^>c9+dExUj(FY>(LZ%<*#rcL?j_*qD z&+!-1p|>1=DVd(z9sNo&KIk{-E!M<;EgBG2MA&WbZzNNn;onLw$9hi~AN1sRL7Z5~ z7sbgH`I0!k$d|=Ue?>BH@DcqzMIOHsZ4wcO{g*`ej`N0~h= z;&+!^sgt!<^pIi>iLWck!zForN#0PBH%jL0&Ei(W7RmS+zD_c64PP&r*w&L9B;$kL ze6~s^w&5Ek6VvwGBpDy{_U*V?GO@7PzRyS|cf+?xE}#8bVSLcP=KFH1WMW~n@4{`8 NsSDeGRWF!c{tx;q5B&fD literal 3829 zcmZ9OYjYG;5QYzAcY{H0aubo51O(+05CKu-l7z5{E)q!uypF@pWHT_CS!ZVheABZ0 z3;q(cEdA#1@vG&f$|~Pyb~+h2RHtw6>F(2~&n!Ft*zSrowE6I`bDP|V+vd6hliTGs z%i;?D)1CqUx#YizkGL&vap8_PdvD1L!d^Rzx_O#;Q4)lYqom`ux<;|T*;;H(_VQrz z-1#$v-tLBq48-1{e>HJv)sGS!FNn5@c8m6lj*2dbE{U#+J{5IDI~9k0DqPZ#s&(#n z1+6JUv*k_Qp7wfS*U$Vs^m;3P5N2L_|3TQ!d(UFzQn_C2C!N0E3B7Y?&vgCvL&e!b z9FCWyNk55}(`?oIrtinmaujCrkKk|Ky47sWdhKr4>*Y`4(2Jua^nxf;rf4lBR}rVg zMM*pE2US2_i0b+4u3q$@oA#nSN{gPZc^Y7v`$&npwP(D%WfUZHabetbU+Qv7xIs`Na3ocFV^++TNxWV`9- z3t8H|?&rQT4Hq_<4Li?Vpf}VH@YK2zbyi{#hp@xewf8mo6fevoKPIS-8Ig^%<6{LR z(xT>Z@iM>kA$J6a7Im1sTE??N=ovoh2%}&fOV5g$TKuy0jP9KF?D_V_&#)w-*LW(P~)q5<9(Ii^50UG|TTsLB1lL zUgD#d=Cc#hzg5{QIj8%}%X)2tyT`}cxcgzJv2>k{8rShn-7nvgQ8s9yGv`&ESx2W9 z{LDIft<;(I2@wlFIL3Ss=^uH~ zAr@HXjZZf|5J7fxTADD0}K6VlbEJ)Q!$eqFa8xxqNeWi10Hj z_&F2jv6-;*n2mVW2eT0qoAttG0o#iraCXlYk27Pldbslm5sP}ztv|bk0ynNbL*mH$ zBvI>_Xut6MW}tIFWBN-iV6k5+b!G<}_z`jN#2S@EFTi4lL&Tx}O(OinL1*T$?Ul}* zjg|U|Qm3aZ_U{x2Tdji`r4GaEYKuCoPG%PW0ZseM;?zlu>N5SHkO$-dcS!Op;^^c) zD9*x0Y;@+GH7cE1r+(tIm;1*yDw)|uC(f8SeZoc@^l=e3dN3hACSuXs!{Wr`4D|Mh zIC;Q9_=)?v_$Cp4;-VidZTOFs@}S2xcU(F-O`nv^;=I<&wYZ!+Db|>ib(3zENPO#b-p+Yx>-CI=_KcKfizIQ;I?# zc8Pe8yt&JYiSH#5_AAQBn@2bNUdiBjbB5n189R91COY_I;%|tKiYz{}_hxCIQnurg zPl(1vVDMG3C#B`1Z-kl};!P1g_Andhwx=c8_V6xj&rQkrzE|zU_(;SIWB;MF z-IB~(!$)l944cLHSTgxczbzSz#axsO20QziOKgV!L~?ci9qH`?>O!U;9q|q`X32Balrrp diff --git a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp index e08be902..fa9bf6bf 100644 --- a/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp +++ b/SHADE_Engine/src/Graphics/Pipeline/SHVkPipelineLayout.cpp @@ -298,6 +298,10 @@ namespace SHADE descriptorSetLayoutsAllocate.clear(); + dynamicBufferBindings.clear(); + + descriptorSetLayoutsPipeline.clear(); + // We don't need to use vulkan to destroy descriptor sets here since they are just owned by the container with handles vkDescriptorSetLayoutsAllocate.clear(); vkDescriptorSetLayoutsPipeline.clear(); From 7eac238226c6677206c2b0cf0b727da211c38771 Mon Sep 17 00:00:00 2001 From: Brandon Mak Date: Fri, 24 Feb 2023 11:47:58 +0800 Subject: [PATCH 11/12] Accounted for subpass input descriptors Silhouette shader is working --- Assets/Materials/Silhouette.shmat | 8 +++ Assets/Materials/Silhouette.shmat.shmeta | 3 + Assets/Shaders/Silhouette_FS.glsl | 67 +++++++++++++++++ Assets/Shaders/Silhouette_FS.shshaderb | Bin 0 -> 2409 bytes Assets/Shaders/Silhouette_FS.shshaderb.shmeta | 3 + Assets/Shaders/Silhouette_VS.glsl | 68 ++++++++++++++++++ Assets/Shaders/Silhouette_VS.shshaderb | Bin 0 -> 4133 bytes Assets/Shaders/Silhouette_VS.shshaderb.shmeta | 3 + Assets/Shaders/ToSwapchain_FS.glsl | 2 +- Assets/Shaders/ToSwapchain_FS.shshaderb | Bin 881 -> 881 bytes .../GlobalData/SHGraphicsPredefinedData.cpp | 7 +- .../MiddleEnd/Interface/SHGraphicsConstants.h | 4 +- .../MiddleEnd/Interface/SHGraphicsSystem.cpp | 10 ++- .../Graphics/RenderGraph/SHRenderGraph.cpp | 10 +-- .../RenderGraph/SHRenderGraphNode.cpp | 10 +-- .../src/Graphics/RenderGraph/SHSubpass.cpp | 31 ++++++++ .../src/Graphics/RenderGraph/SHSubpass.h | 8 +++ 17 files changed, 219 insertions(+), 15 deletions(-) create mode 100644 Assets/Materials/Silhouette.shmat create mode 100644 Assets/Materials/Silhouette.shmat.shmeta create mode 100644 Assets/Shaders/Silhouette_FS.glsl create mode 100644 Assets/Shaders/Silhouette_FS.shshaderb create mode 100644 Assets/Shaders/Silhouette_FS.shshaderb.shmeta create mode 100644 Assets/Shaders/Silhouette_VS.glsl create mode 100644 Assets/Shaders/Silhouette_VS.shshaderb create mode 100644 Assets/Shaders/Silhouette_VS.shshaderb.shmeta diff --git a/Assets/Materials/Silhouette.shmat b/Assets/Materials/Silhouette.shmat new file mode 100644 index 00000000..912775f0 --- /dev/null +++ b/Assets/Materials/Silhouette.shmat @@ -0,0 +1,8 @@ +- VertexShader: 38847805 + FragmentShader: 42962441 + SubPass: Object VFX Subpass No Depth + Properties: + data.color: {x: 1, y: 1, z: 1, w: 1} + data.textureIndex: 0 + data.alpha: 0 + data.beta: {x: 1, y: 1, z: 1} \ No newline at end of file diff --git a/Assets/Materials/Silhouette.shmat.shmeta b/Assets/Materials/Silhouette.shmat.shmeta new file mode 100644 index 00000000..be1f7bde --- /dev/null +++ b/Assets/Materials/Silhouette.shmat.shmeta @@ -0,0 +1,3 @@ +Name: Silhouette +ID: 126391182 +Type: 7 diff --git a/Assets/Shaders/Silhouette_FS.glsl b/Assets/Shaders/Silhouette_FS.glsl new file mode 100644 index 00000000..292bdfe7 --- /dev/null +++ b/Assets/Shaders/Silhouette_FS.glsl @@ -0,0 +1,67 @@ +#version 450 +#extension GL_ARB_separate_shader_objects : enable +#extension GL_ARB_shading_language_420pack : enable +#extension GL_EXT_nonuniform_qualifier : require + +struct MatPropData +{ + vec4 color; +}; + +struct GenericData +{ + //! Delta time + float dt; + + //! Elapsed time of the application + float elapsedTime; + + //! Viewport width of the scene (excluding imgui, that means smaller than window) + uint viewportWidth; + + //! Ditto but for height + uint viewportHeight; +}; + +layout(location = 0) in struct +{ + vec4 vertPos; // location 0 + vec2 uv; // location = 1 + vec4 normal; // location = 2 + vec4 worldPos; // location = 3 +} In; + +// material stuff +layout(location = 4) flat in struct +{ + int materialIndex; + uint eid; + uint lightLayerIndex; +} In2; + +layout (set = 0, binding = 1) uniform sampler2D textures[]; // for textures (global) +layout (std430, set = 2, binding = 0) buffer MaterialProperties // For materials +{ + MatPropData data[]; +} MatProp; + +layout (set = 0, binding = 0) uniform GenericDataBuffer +{ + GenericData data; +} genericDataBuffer; + +layout(location = 0) out vec4 objectVFX; +layout(input_attachment_index = 0, set = 3, binding = 0) uniform subpassInput depthBuffer; + +void main() +{ + // Sample depth buffer using UV and save it + float currentDepth = subpassLoad (depthBuffer).r; + + // Use depth buffer to check against current fragment's depth. If fragment is behind depth buffer, render fragment. + if (currentDepth > gl_FragCoord.z) + discard; + + objectVFX = MatProp.data[In2.materialIndex].color; + +} \ No newline at end of file diff --git a/Assets/Shaders/Silhouette_FS.shshaderb b/Assets/Shaders/Silhouette_FS.shshaderb new file mode 100644 index 0000000000000000000000000000000000000000..4710b8a6b5036d5c62522adbafc8f285133bfca0 GIT binary patch literal 2409 zcmY+GX>$`t5QYaNTgC)1cespzaDzjPAtapU60TB;vw&~Qq8-ai*1KY~GVs^(F@Fjw z1yy;U*&QUBYWMWpJ>5Ostu5x>Y%!i1n@_Zi*<@zTHgl(f%ucgei1G4_ zv%AsI4q_LVHX5$QiFHx&_MPpO!ykQQO7nh{#d&`e_iePacxe##{#KkB;yif$BFc+= zl&7nOTaVt4;w)WFt&@Egd*|`vPWM678w{dh`6;temgY7}Qm0Jmh9#GeQ~RZPFB>J3 z4pZ`&eCL$qmed%Y>Ll^h&6@^QJFTJWB z{PN*zow@&u_5#1(`4aT)7&g>k1>WQFs7Epw{!vo4J@oUJQUtG?ln4N3?gqJHLD z$CchNXEBJTHJxx?*C2?uk|*|~w>7$7-wM9-iM9*P`E7NqKG`~)`~WceqGnOv>(fnAF?MmiMEMjnsY^6s~-gCVsfVMm@py$kGII zw#-f86FKYYS8u}xjpxxax25;THGcQ+s5k7;aWT1qeoSX5==2&wXTP|!qt@B0c`@`z z)v;3$IK-WklGEZjF+O2u#y$;?g&No&YN9vXM<3Tz&3=1rqc-yMo57cPg?iAL8L^|?m}(7V75AX-|Mx`457W!w@J3eo5bg9o&G}mr88@M zh{h4&{{v!j@`i)8jU0P~ z9;xx;lJqLXL8td%^ZLs^VmqQUdx#ExN)nyerzOb)MlI;<9N4_x%QuVnQ&aV>ra7lG zwPNEAI=cu)%nS9o>TT2fDxG-LLcbOzc}ta}`u<=8N5aHek|gG3F?rD0aWLk8RgyU9 zlN9trdh72p;1}j_O=s+f74Hv8>|o^kQxXCvA3DDwXkMB4y^s$M{h*)hI5uM3lH^@r z#6V}y!LF*GNcIF`PG5vfN#e_H^ZP>Hl+J$h+hSke%8S12sxfx(sW58UTjLVS*YGjG zh=F~dn7GUGXO|9%**A79_#CeBf8@h{@g3nF_-DmzOG5uCCbpyEwwU@ke^pmGgOP_F sxF}{X_??i4eOM5KFYA@;1^?k;-|)c}e0l3{V(h$$y+;40JlDkk1Hy~l!TmF35d@g1DQYK~Y2nM3EcZ1Oo{Yg7-4+4qqkFRlV$gOi5-Jd1owz^><&aHQK&s)>i zrwIDL>omrL~o1U7abQ}7JVZsL@T1lq9>xK zq7nTKi~pmfqsq{lZntJ;TGN->oqoSPC?2G7J592<-A(eiQzXkVerqd!N!Cf1x>bjo zJgRlow8vWQ!K%A8tMX!0#CZ~>Q&~5@?`>qJE6&A9ch#5r(q!RIF&#aK^U|9=IPc6- z!7*J;c{%$++Mdb=MU-`7ODkK=_aw=Rcp=U&Mnxo~?heR*vDb~$`6Rw~C89mv_jU0L z(PErO-c_D;2gd6621$|he821R2B+TTewn~9YF-X$4deFudG9Ws)HETzQ`v`_xVL+~ zJnhcqQ8u{U%NMC>#Q6b`ja()#$9XZ^8weZq70eCB`(3qhCTvS-x@x0tf1$E*t`+fUF3J|- zEZlS5zk}#}FJn@YP8|AC_iw}FH)E!573aO&PVzw!Vi?+1n8W?DG4trm;d;@bpzjdJ z&TLPr7MrDU>8we`*c{co{(P?R+42IW4@bbtIC@i!Lnn^Avi-nbjH7SWICSFv5?LIW z#kJH^>LeHEWPZm)+?(l5$t-kcx!M=z44s9YZ&Oug&d@C%-z;?YqaK?bddo5le=xXV z#DG!1VaQ_J+bfy;7Qat2F}vj15QnIx z8D#EfkMuEdFm(1B7bh?Hew~O}#Ex!+-y710Mc6q5`b5C69}F@v=!e9IMCkaVGrM5a z^{#kBL{9cSBHk2%!y)p#C(hZilLwud2P4l>@kY?`KPGud1dcyCZvu>7HN;PdoLf1A z|7l6&YKpA4X9I?PN;0w3MLu-i6d3ktapJMl->c&64TgP2oc@AaJ-k7SZ%ZzHpWkIy z7=78N_#ed^UM~B@du;{`TWKG4d{D`Qoqf=YfZ4t)(%F~3{U%ObHV3~48#w;xj|0Xz z{s=OAV@K!xk`JAkeH!%RdWY0cZWeX@E2Jil@3{B@5&NUlBfhKXr=;_)Hi>w1=M=SB ze2a)T%R4=-jOh4aXYbvj9U|TlImop~1db1H=oJw;wu;Dsj*sPdRWdnvOO}K05xC`e zO)@!nf8;>N2Rm=zP0@r1J2}S0-x7hF{*Gkc!rzL)eprMLI63JJnE8Jo84R7-`cTA7 zUsHTT{38(<%dn3ngKdO1h5NoP85`$odfYiM){OoO zafdfVbAiNs9?ohp^OA`nzs1~?3=XldRb#%8P7IjEd?^_mVp+_r&Tv)wS0ZX5H@@_V zw+PO;@%dT=W_S9nWWHg{31|6Egb(;R3J1+2X1_$b{Qo#Nh{KalJ}hwFmtWXFb3Vj2;{m zUlL7-n0uS`<$#-hPde|~zFGGr;{$GU@j&u%k@fzeWH6RtKS>6ohlc$eFzU1K(l3&U j#~=F%(X;TLewEDr_}D!@l3a+^i|7qHe*bBw6QchCv)4p1 literal 0 HcmV?d00001 diff --git a/Assets/Shaders/Silhouette_VS.shshaderb.shmeta b/Assets/Shaders/Silhouette_VS.shshaderb.shmeta new file mode 100644 index 00000000..508a8788 --- /dev/null +++ b/Assets/Shaders/Silhouette_VS.shshaderb.shmeta @@ -0,0 +1,3 @@ +Name: Silhouette_VS +ID: 38847805 +Type: 2 diff --git a/Assets/Shaders/ToSwapchain_FS.glsl b/Assets/Shaders/ToSwapchain_FS.glsl index 3cf1752f..d353c15f 100644 --- a/Assets/Shaders/ToSwapchain_FS.glsl +++ b/Assets/Shaders/ToSwapchain_FS.glsl @@ -3,7 +3,7 @@ #extension GL_ARB_shading_language_420pack : enable #extension GL_EXT_nonuniform_qualifier : require -layout (input_attachment_index = 0, set = 0, binding = 0) uniform subpassInput sceneTexture; +layout (input_attachment_index = 0, set = 3, binding = 0) uniform subpassInput sceneTexture; layout(location = 0) out vec4 fragColor; diff --git a/Assets/Shaders/ToSwapchain_FS.shshaderb b/Assets/Shaders/ToSwapchain_FS.shshaderb index 0bee0ac67036b416f1ad7249d12b6e7ea411b98d..24cb54feb17daf6424b28de97ba12ec39b15e21d 100644 GIT binary patch delta 14 Vcmey!_K|HvCnF>C<}SwPi~uZS1ycY3 delta 14 Vcmey!_K|HvCnF=n<}SwPi~uZA1yBG0 diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp index 63b39c9f..85559bc7 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.cpp @@ -25,9 +25,10 @@ namespace SHADE { perSystemData[SHUtilities::ConvertEnum(SystemType::BATCHING)].descMappings.AddMappings ({ - {SHPredefinedDescriptorTypes::STATIC_DATA, 0}, - {SHPredefinedDescriptorTypes::CAMERA, 1}, - {SHPredefinedDescriptorTypes::PER_INSTANCE_BATCH, 2}, + {SHPredefinedDescriptorTypes::STATIC_DATA, 0}, + {SHPredefinedDescriptorTypes::CAMERA, 1}, + {SHPredefinedDescriptorTypes::PER_INSTANCE_BATCH, 2}, + {SHPredefinedDescriptorTypes::RENDER_GRAPH_RESOURCE, 3}, }); perSystemData[SHUtilities::ConvertEnum(SystemType::BATCHING_ANIM)].descMappings.AddMappings diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h index 38fe9aa3..54b02608 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsConstants.h @@ -129,11 +129,13 @@ namespace SHADE static constexpr std::string_view GBUFFER_WRITE_SUBPASS = "G-Buffer Write"; static constexpr std::string_view UI_SUBPASS = "UI"; static constexpr std::string_view VFX_SUBPASS = "VFX"; + static constexpr std::string_view OBJ_VFX_SUBPASS = "Object VFX Subpass No Depth"; static constexpr std::array USABLE_SUBPASSES = { GBUFFER_WRITE_SUBPASS, - UI_SUBPASS + UI_SUBPASS, + OBJ_VFX_SUBPASS }; }; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 70a7d34f..ebd9ba8c 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -215,7 +215,7 @@ namespace SHADE renderGraph->AddResource("Normals", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); //worldRenderGraph->AddResource("Tangents", { SH_ATT_DESC_TYPE_FLAGS::COLOR, SH_ATT_DESC_TYPE_FLAGS::INPUT, SH_ATT_DESC_TYPE_FLAGS::STORAGE }, windowDims.first, windowDims.second, vk::Format::eR32G32B32A32Sfloat); renderGraph->AddResource("Albedo", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second); - renderGraph->AddResource("Depth Buffer", { SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL }, true, windowDims.first, windowDims.second, vk::Format::eD32SfloatS8Uint); + renderGraph->AddResource("Depth Buffer", { SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT }, true, windowDims.first, windowDims.second, vk::Format::eD32SfloatS8Uint); renderGraph->AddResource("Entity ID", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::SHARED }, true, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc); renderGraph->AddResource("Light Layer Indices", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE }, true, windowDims.first, windowDims.second, vk::Format::eR32Uint, 1, vk::ImageUsageFlagBits::eTransferSrc); renderGraph->AddResource("Scene", { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT, SH_RENDER_GRAPH_RESOURCE_FLAGS::STORAGE, SH_RENDER_GRAPH_RESOURCE_FLAGS::SHARED }, true, windowDims.first, windowDims.second); @@ -255,7 +255,13 @@ namespace SHADE gBufferSubpass->AddColorOutput("Object VFX"); gBufferSubpass->AddDepthOutput("Depth Buffer", SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL); - usableSubpassesMapping.emplace (std::string (SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS.data()), gBufferSubpass); + // We add the object VFX render target and depth buffer as input just in case we want to make comparisons + auto objectVfxSubpassNoDepth = gBufferNode->AddSubpass(SHGraphicsConstants::RenderGraphEntityNames::OBJ_VFX_SUBPASS.data(), worldViewport, worldRenderer); + objectVfxSubpassNoDepth->AddColorOutput("Object VFX"); + objectVfxSubpassNoDepth->AddInput ("Depth Buffer"); + + usableSubpassesMapping.emplace(std::string(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS.data()), gBufferSubpass); + usableSubpassesMapping.emplace(std::string(SHGraphicsConstants::RenderGraphEntityNames::OBJ_VFX_SUBPASS.data()), objectVfxSubpassNoDepth); /*-----------------------------------------------------------------------*/ /* SSAO PASS AND DATA INIT */ diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp index 654cae77..ea650274 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraph.cpp @@ -512,8 +512,9 @@ namespace SHADE uint32_t h = static_cast(resource->GetHeight()); cmdBuffer->SetViewportScissor(static_cast(w), static_cast(h), w, h); - static constexpr uint32_t INPUT_IMAGE_SET_INDEX = 0; - newSubpass->BindInputDescriptorSets (cmdBuffer, INPUT_IMAGE_SET_INDEX, frameIndex); + //static constexpr uint32_t INPUT_IMAGE_SET_INDEX = 0; + auto const& mappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::BATCHING); + newSubpass->BindInputDescriptorSets (cmdBuffer, mappings.at(SHPredefinedDescriptorTypes::RENDER_GRAPH_RESOURCE), frameIndex); // draw a quad. cmdBuffer->DrawArrays(4, 1, 0, 0); @@ -570,9 +571,10 @@ namespace SHADE auto cmdBuffer = commandBuffers[frameIndex]; cmdBuffer->BeginLabeledSegment(name); - auto batchingSystemData = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::BATCHING); + auto const& batchingSystemData = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::BATCHING); - // Force bind pipeline layout + + // Force bind pipeline layout cmdBuffer->ForceSetPipelineLayout(batchingSystemData.dummyPipelineLayout, SH_PIPELINE_TYPE::GRAPHICS); cmdBuffer->ForceSetPipelineLayout(batchingSystemData.dummyPipelineLayout, SH_PIPELINE_TYPE::COMPUTE); diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp index b032ca1e..e5cc231c 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHRenderGraphNode.cpp @@ -184,12 +184,13 @@ namespace SHADE for (auto& inputAtt : subpass->inputReferences) { auto resource = attResources[inputAtt.attachment]; - if (resource->resourceTypeFlags & static_cast(SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT)) + auto typeFlags = resource->resourceTypeFlags; + if (typeFlags & static_cast(SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT)) { - if (resource->resourceTypeFlags & static_cast(SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR) || - resource->resourceTypeFlags & static_cast(SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR_PRESENT)) + if (typeFlags & static_cast(SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR) || + typeFlags & static_cast(SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR_PRESENT)) colorRead |= (1 << i); - else if (resource->resourceTypeFlags & static_cast(SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL)) + else if (typeFlags & static_cast(SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL) || typeFlags & static_cast(SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH)) depthRead |= (1 << i); } else @@ -265,6 +266,7 @@ namespace SHADE // initialize input descriptors subpasses[i]->CreateInputDescriptors(); + subpasses[i]->GenerateDummyPipielineLayout(); ++i; } diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp index 96207d7a..d45789ce 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.cpp @@ -226,11 +226,15 @@ namespace SHADE commandBuffer->SetViewportScissor(static_cast(w), static_cast(h), w, h); } + commandBuffer->ForceSetPipelineLayout(dummyPipelineLayout, SH_PIPELINE_TYPE::GRAPHICS); + auto const& descMappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::BATCHING); if (renderer) renderer->BindDescriptorSet(commandBuffer, SH_PIPELINE_TYPE::GRAPHICS, descMappings.at(SHPredefinedDescriptorTypes::CAMERA), frameIndex); + BindInputDescriptorSets (commandBuffer, descMappings.at(SHPredefinedDescriptorTypes::RENDER_GRAPH_RESOURCE), frameIndex); + // If companion subpass is not a valid handle, render super batch normally if (!companionSubpass.companion) { @@ -439,6 +443,33 @@ namespace SHADE } } + /***************************************************************************/ + /*! + + \brief + Generates the dummy pipeline layout for subpass; specifically add the + input descriptor set layout if it exists. + + + \return + + */ + /***************************************************************************/ + void SHSubpass::GenerateDummyPipielineLayout(void) noexcept + { + auto const& batchingSystemData = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::BATCHING); + std::vector newLayouts = batchingSystemData.descSetLayouts; + if (inputDescriptorLayout) + { + newLayouts.push_back(inputDescriptorLayout); + } + + dummyPipelineLayout = graphStorage->logicalDevice->CreatePipelineLayoutDummy + ( + SHPipelineLayoutParamsDummy{ newLayouts } + ); + } + /***************************************************************************/ /*! diff --git a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h index 811cc70c..1300ee2b 100644 --- a/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h +++ b/SHADE_Engine/src/Graphics/RenderGraph/SHSubpass.h @@ -22,6 +22,7 @@ namespace SHADE class SHRenderer; class SHViewport; class SHVkPipeline; + class SHVkPipelineLayout; class SH_API SHSubpass : public ISelfHandle { @@ -87,6 +88,12 @@ namespace SHADE std::vector> inputSamplers; + //! Dummy pipeline layout for subpass to bind before draw. + //! // IMPORTANT NOTE: After implementing input descriptors, every subpass differs in number input descriptors. + //! Before binding the input descriptors, a pipeline layout containing the desc set layouts + //! for the input descriptors is required, making this umbrella initial dummy bind invalid. + Handle dummyPipelineLayout; + ////! subpass compute image barriers. We do this because every frame has a different ////! swapchain image. If the resource we want to transition is not a swapchain image, @@ -146,6 +153,7 @@ namespace SHADE //void InitComputeBarriers (void) noexcept; void CreateInputDescriptors (void) noexcept; void UpdateWriteDescriptors (void) noexcept; + void GenerateDummyPipielineLayout (void) noexcept; private: /*-----------------------------------------------------------------------*/ From a27b3fb80e5c11880a54a6e9a8f64fa57bdd9f3c Mon Sep 17 00:00:00 2001 From: Glence Date: Fri, 24 Feb 2023 21:10:45 +0800 Subject: [PATCH 12/12] fix vulkan red line --- .../src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp index 36359bd1..f0503741 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.cpp @@ -350,7 +350,13 @@ namespace SHADE /*-----------------------------------------------------------------------*/ /* SCREEN SPACE PASS */ /*-----------------------------------------------------------------------*/ - auto screenSpaceNode = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data(), {"Scene", "Entity ID", "Depth Buffer"}, {SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW.data()}); + auto screenSpaceNode = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data(), { "Scene", "Entity ID", "Depth Buffer" }, + { + SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data(), + SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data(), + SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW.data(), + SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW_DEPTH_PASS.data() + }); auto uiSubpass = screenSpaceNode->AddSubpass(SHGraphicsConstants::RenderGraphEntityNames::UI_SUBPASS.data(), worldViewport, screenRenderer); uiSubpass->AddColorOutput("Scene"); uiSubpass->AddColorOutput("Entity ID");