Added offset calculation to camera get position #366

Merged
maverickdgg merged 2 commits from SP3-141-Camera-System into main 2023-02-26 15:56:46 +08:00
70 changed files with 975 additions and 125 deletions
Showing only changes of commit 234da235b5 - Show all commits

View File

@ -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}

View File

@ -0,0 +1,3 @@
Name: ShinyHightlight
ID: 122370915
Type: 7

View File

@ -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}

View File

@ -0,0 +1,3 @@
Name: Silhouette
ID: 126391182
Type: 7

View File

@ -4,5 +4,5 @@
Properties: Properties:
data.color: {x: 1, y: 1, z: 1, w: 1} data.color: {x: 1, y: 1, z: 1, w: 1}
data.textureIndex: 51995224 data.textureIndex: 51995224
data.alpha: 0 data.alpha: 1
data.beta: {x: 1, y: 1, z: 1} data.beta: {x: 1, y: 1, z: 1}

View File

@ -4,5 +4,5 @@
Properties: Properties:
data.color: {x: 1, y: 1, z: 1, w: 1} data.color: {x: 1, y: 1, z: 1, w: 1}
data.textureIndex: 54429632 data.textureIndex: 54429632
data.alpha: 0 data.alpha: 1
data.beta: {x: 1, y: 1, z: 1} data.beta: {x: 1, y: 1, z: 1}

View File

@ -8540,6 +8540,7 @@
currCategory: 1 currCategory: 1
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 157 - EID: 157
Name: Mesh_Meat Name: Mesh_Meat
IsActive: true IsActive: true
@ -8587,6 +8588,7 @@
currCategory: 1 currCategory: 1
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 156 - EID: 156
Name: Mesh_Meat Name: Mesh_Meat
IsActive: true IsActive: true
@ -8599,7 +8601,7 @@
IsActive: true IsActive: true
Renderable Component: Renderable Component:
Mesh: 136892700 Mesh: 136892700
Material: 131956078 Material: 122370915
IsActive: true IsActive: true
RigidBody Component: RigidBody Component:
Type: Dynamic Type: Dynamic
@ -8634,6 +8636,7 @@
currCategory: 1 currCategory: 1
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 155 - EID: 155
Name: Mesh_Cheese Name: Mesh_Cheese
IsActive: true IsActive: true
@ -8681,6 +8684,7 @@
currCategory: 2 currCategory: 2
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 154 - EID: 154
Name: Mesh_Cheese Name: Mesh_Cheese
IsActive: true IsActive: true
@ -8728,6 +8732,7 @@
currCategory: 2 currCategory: 2
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 153 - EID: 153
Name: Mesh_Cheese Name: Mesh_Cheese
IsActive: true IsActive: true
@ -8775,6 +8780,7 @@
currCategory: 2 currCategory: 2
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 65778 - EID: 65778
Name: Mesh_Apple Name: Mesh_Apple
IsActive: true IsActive: true
@ -8822,6 +8828,7 @@
currCategory: 0 currCategory: 0
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 152 - EID: 152
Name: Mesh_Apple Name: Mesh_Apple
IsActive: true IsActive: true
@ -8869,6 +8876,7 @@
currCategory: 0 currCategory: 0
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 151 - EID: 151
Name: Mesh_Apple Name: Mesh_Apple
IsActive: true IsActive: true
@ -8916,6 +8924,7 @@
currCategory: 0 currCategory: 0
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 65686 - EID: 65686
Name: Watermelon Name: Watermelon
IsActive: true IsActive: true
@ -8967,6 +8976,7 @@
currCategory: 2 currCategory: 2
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 131220 - EID: 131220
Name: Piece1 Name: Piece1
IsActive: true IsActive: true
@ -9014,6 +9024,7 @@
currCategory: 1 currCategory: 1
density: 3 density: 3
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 131219 - EID: 131219
Name: Piece2 Name: Piece2
IsActive: true IsActive: true
@ -9061,6 +9072,7 @@
currCategory: 1 currCategory: 1
density: 3 density: 3
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 131221 - EID: 131221
Name: Piece3 Name: Piece3
IsActive: true IsActive: true
@ -9108,6 +9120,7 @@
currCategory: 0 currCategory: 0
density: 3 density: 3
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 145 - EID: 145
Name: Piece4 Name: Piece4
IsActive: true IsActive: true
@ -9155,6 +9168,7 @@
currCategory: 0 currCategory: 0
density: 3 density: 3
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 196754 - EID: 196754
Name: Piece5 Name: Piece5
IsActive: true IsActive: true
@ -9202,6 +9216,7 @@
currCategory: 0 currCategory: 0
density: 3 density: 3
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 144 - EID: 144
Name: Egg Name: Egg
IsActive: true IsActive: true
@ -9253,6 +9268,7 @@
currCategory: 0 currCategory: 0
density: 2 density: 2
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 143 - EID: 143
Name: Piece1 Name: Piece1
IsActive: true IsActive: true
@ -9594,6 +9610,9 @@
Text: My name is Brandon. Text: My name is Brandon.
Font: 176667660 Font: 176667660
IsActive: true IsActive: true
UI Component:
Canvas ID: 199
IsActive: true
Scripts: ~ Scripts: ~
- EID: 206 - EID: 206
Name: Timer Name: Timer
@ -9609,6 +9628,9 @@
Text: My name is Brandon. Text: My name is Brandon.
Font: 176667660 Font: 176667660
IsActive: true IsActive: true
UI Component:
Canvas ID: 199
IsActive: true
Scripts: ~ Scripts: ~
- EID: 139 - EID: 139
Name: Multiplier Name: Multiplier
@ -9624,6 +9646,9 @@
Text: TEST Text: TEST
Font: 176667660 Font: 176667660
IsActive: true IsActive: true
UI Component:
Canvas ID: 199
IsActive: true
Scripts: ~ Scripts: ~
- EID: 11 - EID: 11
Name: GamePause Name: GamePause
@ -9653,7 +9678,7 @@
Components: Components:
Transform Component: Transform Component:
Translate: {x: 2.35245037, y: 0.38365531, z: 7.10571432} 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} Scale: {x: 0.999999881, y: 1, z: 0.999999881}
IsActive: true IsActive: true
Renderable Component: Renderable Component:
@ -9731,7 +9756,7 @@
Components: Components:
Transform Component: Transform Component:
Translate: {x: 0, y: -5.96046448e-08, z: 0} 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} Scale: {x: 1, y: 1, z: 1}
IsActive: true IsActive: true
Camera Component: Camera Component:
@ -9739,8 +9764,8 @@
Pitch: 0 Pitch: 0
Yaw: 360 Yaw: 360
Roll: 1.28065994e-06 Roll: 1.28065994e-06
Width: 2560 Width: 1055
Height: 1369 Height: 604
Near: 0.00999999978 Near: 0.00999999978
Far: 10000 Far: 10000
Perspective: true Perspective: true
@ -10512,14 +10537,14 @@
NumberOfChildren: 0 NumberOfChildren: 0
Components: Components:
Transform Component: 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} Rotate: {x: -0, y: 0, z: -0}
Scale: {x: 1, y: 1, z: 1} Scale: {x: 1, y: 1, z: 1}
IsActive: false IsActive: true
Renderable Component: Renderable Component:
Mesh: 140697366 Mesh: 140697366
Material: 129495479 Material: 129495479
IsActive: false IsActive: true
RigidBody Component: RigidBody Component:
Type: Dynamic Type: Dynamic
Drag: 0.00999999978 Drag: 0.00999999978
@ -10533,7 +10558,7 @@
Freeze Rotation X: true Freeze Rotation X: true
Freeze Rotation Y: false Freeze Rotation Y: false
Freeze Rotation Z: true Freeze Rotation Z: true
IsActive: false IsActive: true
Collider Component: Collider Component:
Colliders: Colliders:
- Is Trigger: false - Is Trigger: false
@ -10545,7 +10570,7 @@
Density: 1 Density: 1
Position Offset: {x: 0, y: 0.899999976, z: 0} Position Offset: {x: 0, y: 0.899999976, z: 0}
Rotation Offset: {x: 0, y: 0, z: 0} Rotation Offset: {x: 0, y: 0, z: 0}
IsActive: false IsActive: true
Scripts: Scripts:
- Type: Homeowner1 - Type: Homeowner1
Enabled: true Enabled: true
@ -10605,6 +10630,7 @@
currCategory: 1 currCategory: 1
density: 1 density: 1
dontReturn: false dontReturn: false
soundDistance: 10
- EID: 16 - EID: 16
Name: JumpPad Name: JumpPad
IsActive: false IsActive: false
@ -10632,13 +10658,13 @@
Enabled: true Enabled: true
- EID: 10 - EID: 10
Name: Canvas Name: Canvas
IsActive: false IsActive: true
NumberOfChildren: 3 NumberOfChildren: 3
Components: Components:
Canvas Component: Canvas Component:
Canvas Width: 1920 Canvas Width: 1920
Canvas Height: 1080 Canvas Height: 1080
IsActive: false IsActive: true
Scripts: ~ Scripts: ~
- EID: 8 - EID: 8
Name: ResumeButton Name: ResumeButton

View File

@ -15,7 +15,7 @@
NumberOfChildren: 0 NumberOfChildren: 0
Components: Components:
Transform Component: Transform Component:
Translate: {x: 0, y: 0, z: 0} Translate: {x: 0, y: 0, z: 0.5}
Rotate: {x: 0, y: 0, z: 0} Rotate: {x: 0, y: 0, z: 0}
Scale: {x: 1920, y: 1080, z: 1} Scale: {x: 1920, y: 1080, z: 1}
IsActive: true IsActive: true
@ -35,7 +35,7 @@
NumberOfChildren: 0 NumberOfChildren: 0
Components: Components:
Transform Component: Transform Component:
Translate: {x: 0, y: 75, z: 0} Translate: {x: 0, y: 75, z: 0.400000006}
Rotate: {x: 0, y: 0, z: 0} Rotate: {x: 0, y: 0, z: 0}
Scale: {x: 400, y: 200, z: 1} Scale: {x: 400, y: 200, z: 1}
IsActive: true IsActive: true
@ -63,7 +63,7 @@
NumberOfChildren: 0 NumberOfChildren: 0
Components: Components:
Transform Component: Transform Component:
Translate: {x: 0, y: -200, z: 0} Translate: {x: 0, y: -200, z: 0.400000006}
Rotate: {x: 0, y: 0, z: 0} Rotate: {x: 0, y: 0, z: 0}
Scale: {x: 400, y: 200, z: 1} Scale: {x: 400, y: 200, z: 1}
IsActive: true IsActive: true
@ -129,3 +129,4 @@
- Type: MainMenu - Type: MainMenu
Enabled: true Enabled: true
sceneID: 96668835 sceneID: 96668835
obj: 1

View File

@ -111,6 +111,7 @@
Near: 0.00999999978 Near: 0.00999999978
Far: 10000 Far: 10000
Perspective: true Perspective: true
FOV: 90
IsActive: true IsActive: true
Scripts: ~ Scripts: ~
- EID: 4 - EID: 4

View File

@ -74,6 +74,9 @@ public partial class Homeowner1 : BehaviourTree
private float footstepSFXIntervalMultiplier; private float footstepSFXIntervalMultiplier;
private float footstepTimeRemaining; private float footstepTimeRemaining;
//singleton for AI
public static Homeowner1 aiInstance { get; private set; }
} }
//AI tree //AI tree
@ -111,6 +114,11 @@ public partial class Homeowner1 : BehaviourTree
AudioHandler.audioClipHandlers["SFXFootstep"] = Audio.CreateAudioClip("event:/Homeowner/homeowner_footsteps"); AudioHandler.audioClipHandlers["SFXFootstep"] = Audio.CreateAudioClip("event:/Homeowner/homeowner_footsteps");
AudioHandler.audioClipHandlers["SFXDetectAh"] = Audio.CreateAudioClip("event:/Homeowner/homeowner_detect_raccoon"); AudioHandler.audioClipHandlers["SFXDetectAh"] = Audio.CreateAudioClip("event:/Homeowner/homeowner_detect_raccoon");
AudioHandler.audioClipHandlers["SFXDetectSting"] = Audio.CreateAudioClip("event:/Music/stingers/player_detected"); AudioHandler.audioClipHandlers["SFXDetectSting"] = Audio.CreateAudioClip("event:/Music/stingers/player_detected");
if (aiInstance != null && aiInstance != this)
RemoveScript<Homeowner1>();
else
aiInstance = this;
} }
//Called every tick //Called every tick
@ -182,4 +190,10 @@ public partial class Homeowner1 : BehaviourTree
//Debug.Log("Tree Created"); //Debug.Log("Tree Created");
return root; return root;
} }
protected override void onDestroy()
{
if (aiInstance == this)
aiInstance = null;
}
} }

View File

@ -24,6 +24,10 @@ public class Item : Script
public bool dontReturn = false; public bool dontReturn = false;
private bool checkSound = false;
public float soundDistance = 10;
protected override void awake() protected override void awake()
{ {
transform = GetComponent<Transform>(); transform = GetComponent<Transform>();
@ -55,10 +59,25 @@ public class Item : Script
returnBack = false; returnBack = false;
} }
if (checkSound)
{
/* //need to wait for collisionEnter Fix
Vector3 itemPos = transform.LocalPosition;
Vector3 len = Homeowner1.aiInstance.GetComponent<Transform>().LocalPosition - itemPos;
Debug.Log($"distance: {len.GetSqrMagnitude()}");
if (len.GetSqrMagnitude() <= soundDistance)
{
//set ai to alert
}
checkSound = false;*/
}
} }
protected override void onCollisionEnter(CollisionInfo info) protected override void onCollisionEnter(CollisionInfo info)
{ {
if (!caputurePos) if (!caputurePos)
{ {
firstPostion = transform.LocalPosition; firstPostion = transform.LocalPosition;
@ -83,6 +102,7 @@ public class Item : Script
protected override void onCollisionExit(CollisionInfo info) protected override void onCollisionExit(CollisionInfo info)
{ {
playSound = true; playSound = true;
checkSound = true;
} }
} }

View File

@ -26,6 +26,7 @@ public class PickAndThrow : Script
private float lastZDir; private float lastZDir;
private bool inRange = false; private bool inRange = false;
public bool throwItem = false; public bool throwItem = false;
private Vector3 prevTargetOffSet;
[Tooltip("Lenght of ray")] [Tooltip("Lenght of ray")]
public float rayDistance = 1; public float rayDistance = 1;
@ -56,8 +57,12 @@ public class PickAndThrow : Script
} }
protected override void update() protected override void update()
{ {
if (GameManager.Instance.GamePause)
{
return;
}
if(timer <= delayTimer) if (timer <= delayTimer)
timer += Time.DeltaTimeF; timer += Time.DeltaTimeF;
CalculateDir(); CalculateDir();
@ -76,6 +81,7 @@ public class PickAndThrow : Script
{ {
pc.isAiming = true; pc.isAiming = true;
pc.camArm.ArmLength = aimingLength; pc.camArm.ArmLength = aimingLength;
prevTargetOffSet = pc.camArm.TargetOffset;
pc.camArm.TargetOffset = cameraArmOffSet; pc.camArm.TargetOffset = cameraArmOffSet;
pc.cam.FOV = aimingFOV; pc.cam.FOV = aimingFOV;
} }
@ -86,7 +92,7 @@ public class PickAndThrow : Script
itemRidigBody.IsGravityEnabled = true; itemRidigBody.IsGravityEnabled = true;
itemCollider.GetCollisionShape(0).IsTrigger = false; itemCollider.GetCollisionShape(0).IsTrigger = false;
pc.isAiming = false; pc.isAiming = false;
pc.camArm.TargetOffset = Vector3.Zero; pc.camArm.TargetOffset = prevTargetOffSet;
pc.cam.FOV = defaultFOV; pc.cam.FOV = defaultFOV;
if (tpc) if (tpc)
pc.camArm.ArmLength = tpc.armLength; pc.camArm.ArmLength = tpc.armLength;
@ -109,7 +115,7 @@ public class PickAndThrow : Script
{ {
pc.isAiming = false; pc.isAiming = false;
pc.cam.FOV = defaultFOV; pc.cam.FOV = defaultFOV;
pc.camArm.TargetOffset = Vector3.Zero; pc.camArm.TargetOffset = prevTargetOffSet;
if (tpc) if (tpc)
pc.camArm.ArmLength = tpc.armLength; pc.camArm.ArmLength = tpc.armLength;
} }
@ -134,6 +140,11 @@ public class PickAndThrow : Script
protected override void fixedUpdate() protected override void fixedUpdate()
{ {
if (GameManager.Instance.GamePause)
{
return;
}
if (throwItem && itemRidigBody && pc) if (throwItem && itemRidigBody && pc)
{ {
if (itemScript) if (itemScript)

View File

@ -124,8 +124,14 @@ public class PlayerController : Script
protected override void lateUpdate() protected override void lateUpdate()
{ {
} }
protected override void update() protected override void update()
{ {
if (GameManager.Instance.GamePause)
{
return;
}
if (delayTimer <= 1) if (delayTimer <= 1)
delayTimer += Time.DeltaTimeF; delayTimer += Time.DeltaTimeF;
@ -158,22 +164,27 @@ public class PlayerController : Script
if (tranform) if (tranform)
tranform.LocalEulerAngles = new Vector3(0.0f, tranform.LocalEulerAngles.y, 0.0f); tranform.LocalEulerAngles = new Vector3(0.0f, tranform.LocalEulerAngles.y, 0.0f);
GotCaught();
Rotation(); Rotation();
MoveKey(); MoveKey();
Sprint(); Sprint();
Jump(); Jump();
GotCaught();
//Debug.Log($"{currentState}"); //Debug.Log($"{currentState}");
//Debug.Log($" axisX: {axisMove.x} axisY:{axisMove.y}"); //Debug.Log($" axisX: {axisMove.x} axisY:{axisMove.y}");
//Debug.Log($"X: {rb.LinearVelocity.x}" + $" Z: {rb.LinearVelocity.z}"); //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()); //Debug.Log(currentState.ToString() + " x:" + rb.LinearVelocity.x.ToString() + " y:" + rb.LinearVelocity.y.ToString() + " z:" + rb.LinearVelocity.z.ToString());
} }
protected override void fixedUpdate() protected override void fixedUpdate()
{ {
if (GameManager.Instance.GamePause)
{
return;
}
Move(); Move();
Gravity(); Gravity();
//Debug.Log($"X: {rb.LinearVelocity.x}" + $" Z: {rb.LinearVelocity.z}");
} }
@ -234,7 +245,7 @@ public class PlayerController : Script
private void Move() 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; 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() private void Jump()
{ {
if (currentState == RaccoonStates.WALKING || currentState == RaccoonStates.RUNNING || currentState == RaccoonStates.IDLE) if (currentState == RaccoonStates.WALKING || currentState == RaccoonStates.RUNNING || currentState == RaccoonStates.IDLE)

View File

@ -41,6 +41,11 @@ namespace SHADE_Scripting
protected override void update() protected override void update()
{ {
if (GameManager.Instance.GamePause)
{
return;
}
CameraArm arm = GetComponent<CameraArm>(); CameraArm arm = GetComponent<CameraArm>();
if (arm) if (arm)
{ {

View File

@ -38,13 +38,11 @@ public class GameManager : Script
private Vector3 fontScalar; private Vector3 fontScalar;
public static GameManager Instance { get; private set; } public static GameManager Instance { get; private set; }
//public static int highScore { get; private set; } maybe need
public bool GamePause { get; set; } public bool GamePause { get; set; }
protected override void start() protected override void start()
{ {
base.start();
AudioHandler.audioClipHandlers["BGMAdaptive"] = Audio.CreateAudioClip("event:/Music/bgm_adaptive"); AudioHandler.audioClipHandlers["BGMAdaptive"] = Audio.CreateAudioClip("event:/Music/bgm_adaptive");
AudioHandler.audioClipHandlers["BGMAdaptive"].Play(); AudioHandler.audioClipHandlers["BGMAdaptive"].Play();

View File

@ -0,0 +1,3 @@
Name: SC_JumpPad
ID: 163951275
Type: 9

View File

@ -5,6 +5,10 @@ using SHADE_Scripting.Audio;
public class MainMenu : Script public class MainMenu : Script
{ {
public uint sceneID; public uint sceneID;
public GameObject obj;
private Renderable renderable;
protected override void awake() protected override void awake()
{ {
AudioHandler.audioClipHandlers["BGMMainMenu"] = Audio.CreateAudioClip("event:/Music/main_menu"); 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"); AudioHandler.audioClipHandlers["SFXUISuccess"] = Audio.CreateAudioClip("event:/UI/success");
//Audio.PlayBGMOnce2D("event:/Music/main_menu"); //Audio.PlayBGMOnce2D("event:/Music/main_menu");
AudioHandler.audioClipHandlers["BGMMainMenu"].Play(); AudioHandler.audioClipHandlers["BGMMainMenu"].Play();
renderable = obj.GetComponent<Renderable>();
}
protected override void start()
{
} }
protected override void update() protected override void update()
{ {
if (Input.GetKeyDown(Input.KeyCode.K) && obj)
{
if (renderable.Material.GetProperty<float>("data.alpha") == 1)
{
Debug.Log("ALPHA ZERO");
Debug.Log($"{obj.EntityId}");
obj.GetComponent<Renderable>().Material.SetProperty<float>("data.alpha", 0);
}
else if (renderable.Material.GetProperty<float>("data.alpha") == 0)
{
Debug.Log("ALPHA ONE");
Debug.Log($"{obj.EntityId}");
obj.GetComponent<Renderable>().Material.SetProperty<float>("data.alpha", 1);
}
}
if (Input.GetKeyDown(Input.KeyCode.Space)) if (Input.GetKeyDown(Input.KeyCode.Space))
{ {
//Audio.PlaySFXOnce2D("event:/UI/mouse_down_element"); //Audio.PlaySFXOnce2D("event:/UI/mouse_down_element");

View File

@ -59,8 +59,7 @@ public class PauseMenu : Script
retry.OnClick.RegisterAction(() => retry.OnClick.RegisterAction(() =>
{ {
Audio.StopAllSounds(); Audio.StopAllSounds();
//get curr scene SceneManager.RestartScene();
//SceneManager.ChangeScene();
}); });
} }
else else
@ -86,10 +85,6 @@ public class PauseMenu : Script
protected override void update() protected override void update()
{ {
if (GameManager.Instance.GamePause)
{
return;
}
if (Input.GetKeyDown(Input.KeyCode.Escape) && !GameManager.Instance.GamePause) if (Input.GetKeyDown(Input.KeyCode.Escape) && !GameManager.Instance.GamePause)
{ {

View File

@ -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 = 4, r8) uniform image2D ssaoBlurredImage;
layout(set = 3, binding = 5, rgba8) uniform image2D positionWorldSpace; layout(set = 3, binding = 5, rgba8) uniform image2D positionWorldSpace;
layout(set = 3, binding = 6, rgba8) uniform image2D targetImage; 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) layout (set = 4, binding = 0) uniform sampler2D shadowMaps[]; // for textures (global)
@ -141,6 +142,9 @@ void main()
float ssaoVal = imageLoad (ssaoBlurredImage, globalThread).r; float ssaoVal = imageLoad (ssaoBlurredImage, globalThread).r;
fragColor *= ssaoVal; fragColor *= ssaoVal;
vec4 objectVFXColor = imageLoad (objectVFXImage, globalThread);
fragColor += objectVFXColor.rgb * objectVFXColor.a;
// store result into result image // store result into result image
imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor.rgb, 1.0f)); imageStore(targetImage, ivec2(gl_GlobalInvocationID.xy), vec4(fragColor.rgb, 1.0f));

View File

@ -0,0 +1,97 @@
#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;
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;
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) - (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)
{
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);
}

Binary file not shown.

View File

@ -0,0 +1,3 @@
Name: ShinyHighlight_FS
ID: 45685219
Type: 2

View File

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

Binary file not shown.

View File

@ -0,0 +1,3 @@
Name: ShinyHighlight_VS
ID: 37048829
Type: 2

View File

@ -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;
}

Binary file not shown.

View File

@ -0,0 +1,3 @@
Name: Silhouette_FS
ID: 42962441
Type: 2

View File

@ -0,0 +1,68 @@
#version 450
#extension GL_KHR_vulkan_glsl : enable
//#include "ShaderDescriptorDefinitions.glsl"
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;
// material stuff
layout(location = 4) out struct
{
int materialIndex;
uint eid;
uint lightLayerIndex;
} Out2;
layout(set = 1, binding = 0) uniform CameraData
{
vec4 position;
mat4 vpMat;
mat4 viewMat;
mat4 projMat;
} cameraData;
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);
// clip space for rendering
gl_Position = cameraData.vpMat * worldTransform * vec4 (aVertexPos, 1.0f);
}

Binary file not shown.

View File

@ -0,0 +1,3 @@
Name: Silhouette_VS
ID: 38847805
Type: 2

View File

@ -3,7 +3,7 @@
#extension GL_ARB_shading_language_420pack : enable #extension GL_ARB_shading_language_420pack : enable
#extension GL_EXT_nonuniform_qualifier : require #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; layout(location = 0) out vec4 fragColor;

View File

@ -5,10 +5,8 @@
struct MatPropData struct MatPropData
{ {
vec4 color;
int textureIndex; int textureIndex;
float alpha; float alpha;
vec3 beta;
}; };
layout(location = 0) in struct layout(location = 0) in struct
@ -43,6 +41,8 @@ void main()
{ {
discard; discard;
} }
fragColor.a = MatProp.data[In2.materialIndex].alpha;
// fragColor.a = 1.0f;
outEntityID = In2.eid; outEntityID = In2.eid;
} }

Binary file not shown.

View File

@ -58,8 +58,11 @@ void main()
Out.normal.rgb = transposeInv * aNormal.rgb; Out.normal.rgb = transposeInv * aNormal.rgb;
Out.normal.rgb = normalize (Out.normal.rgb); Out.normal.rgb = normalize (Out.normal.rgb);
vec3 vert = aVertexPos;
vert.z += 0.1f;
// clip space for rendering // clip space for rendering
gl_Position = cameraData.projMat * worldTransform * vec4 (aVertexPos, 1.0f); gl_Position = cameraData.projMat * worldTransform * vec4 (vert, 1.0f);
gl_Position.z += 0.1f; // HAX // gl_Position.z += 0.1f; // HAX
// gl_Position = vec4 (aVertexPos, 1.0f); // gl_Position = vec4 (aVertexPos, 1.0f);
} }

Binary file not shown.

View File

@ -0,0 +1,20 @@
#pragma once
#include <string>
#include <vector>
namespace SHADE
{
struct SHCompileAssetEvent
{
//! Name of the asset (where applicable)
std::string assetName;
//! asset ID of the asset
AssetID assetID;
//! type of the asset
AssetType assetType;
};
}

View File

@ -11,6 +11,7 @@
#include "SHpch.h" #include "SHpch.h"
#include "SHShaderSourceCompiler.h" #include "SHShaderSourceCompiler.h"
#include "shaderc/shaderc.hpp" #include "shaderc/shaderc.hpp"
#include "Events/SHEventManager.hpp"
#include <fstream> #include <fstream>
#include <sstream> #include <sstream>

View File

@ -28,6 +28,8 @@
#include "Filesystem/SHFileSystem.h" #include "Filesystem/SHFileSystem.h"
#include <rttr/registration.h> #include <rttr/registration.h>
#include "Assets/Events/SHAssetManagerEvents.h"
#include "Events/SHEventManager.hpp"
namespace SHADE namespace SHADE
{ {
@ -39,7 +41,7 @@ namespace SHADE
std::vector<SHAssetLoader*> SHAssetManager::loaders(TYPE_COUNT); std::vector<SHAssetLoader*> SHAssetManager::loaders(TYPE_COUNT);
std::unordered_map<AssetID, SHAsset> SHAssetManager::assetCollection; std::unordered_map<AssetID, SHAsset> SHAssetManager::assetCollection;
std::unordered_map<AssetID, SHAssetData * const> SHAssetManager::assetData; std::unordered_map<AssetID, SHAssetData *> SHAssetManager::assetData;
/**************************************************************************** /****************************************************************************
@ -167,6 +169,17 @@ namespace SHADE
return {}; 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 * \brief Create record for new asset. CAN ONLY CREATE FOR CUSTOM
* ASSETS CREATED BY THE ENGINE. * ASSETS CREATED BY THE ENGINE.
@ -438,10 +451,39 @@ namespace SHADE
return; return;
} }
AssetID target{ 0 };
if (genMeta) if (genMeta)
{ {
GenerateNewMeta(newPath); auto result = GenerateNewMeta(newPath);
target = result.has_value() ? result.value() : 0;
} }
else
{
target = GetAssetIDFromPath(path);
//Reload data
auto result = GetAsset(target);
if (result.has_value())
{
auto const& asset{ result.value() };
auto newData = loaders[static_cast<size_t>(asset.type)]->Load(asset.path);
delete assetData[target];
assetData[target] = newData;
}
else
{
SHLOG_ERROR("[Asset Manager] Critical: reload of existing compiled data failed");
}
}
// send compile asset event
SHCompileAssetEvent compileShaderEvent
{
.assetName = newPath.filename().stem().string(),
.assetID = target,
.assetType = AssetType::SHADER,
};
SHEventManager::BroadcastEvent<SHCompileAssetEvent>(compileShaderEvent, SH_ASSET_COMPILE_EVENT);
} }
FolderPointer SHAssetManager::GetRootFolder() noexcept FolderPointer SHAssetManager::GetRootFolder() noexcept

View File

@ -50,7 +50,7 @@ namespace SHADE
* \return const& to unordered_map<AssetName, AssetID> * \return const& to unordered_map<AssetName, AssetID>
****************************************************************************/ ****************************************************************************/
static std::vector<SHAsset> GetAllAssets() noexcept; static std::vector<SHAsset> GetAllAssets() noexcept;
static std::optional<SHAsset> GetAsset(AssetID id) noexcept; static std::optional<SHAsset> GetAsset(AssetID id) noexcept;
static AssetType GetType(AssetID id) noexcept; static AssetType GetType(AssetID id) noexcept;
@ -97,6 +97,7 @@ namespace SHADE
private: private:
static AssetID GetAssetIDFromPath(AssetPath const& path) noexcept;
static void InitLoaders() noexcept; static void InitLoaders() noexcept;
static void LoadAllData() noexcept; static void LoadAllData() noexcept;
static SHAssetData* LoadData(SHAsset const& asset) noexcept; static SHAssetData* LoadData(SHAsset const& asset) noexcept;
@ -122,7 +123,7 @@ namespace SHADE
// For all resources // For all resources
static std::unordered_map<AssetID, SHAsset> assetCollection; static std::unordered_map<AssetID, SHAsset> assetCollection;
static std::unordered_map<AssetID, SHAssetData * const> assetData; static std::unordered_map<AssetID, SHAssetData *> assetData;
}; };
} }

View File

@ -59,7 +59,7 @@ namespace SHADE
camSystem->UpdateEditorArm(SHFrameRateController::GetRawDeltaTime(), shouldUpdateCamArm, targetPos); camSystem->UpdateEditorArm(SHFrameRateController::GetRawDeltaTime(), shouldUpdateCamArm, targetPos);
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f)); ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
ImGui::PushStyleColor(ImGuiCol_WindowBg, ImVec4(0.0f, 0.0f, 0.0f, 1.0f));
if (Begin()) if (Begin())
{ {
ImGuizmo::SetDrawlist(); ImGuizmo::SetDrawlist();
@ -101,6 +101,7 @@ namespace SHADE
} }
} }
} }
ImGui::PopStyleColor();
ImGuizmo::SetRect(beginCursorPos.x, beginCursorPos.y, beginContentRegionAvailable.x, beginContentRegionAvailable.y); ImGuizmo::SetRect(beginCursorPos.x, beginCursorPos.y, beginContentRegionAvailable.x, beginContentRegionAvailable.y);
if(editor->editorState != SHEditor::State::PLAY) if(editor->editorState != SHEditor::State::PLAY)
transformGizmo.Draw(); transformGizmo.Draw();

View File

@ -29,4 +29,5 @@ constexpr SHEventIdentifier SH_WINDOW_RESIZE_EVENT { 20 };
constexpr SHEventIdentifier SH_BUTTON_RELEASE_EVENT { 21 }; constexpr SHEventIdentifier SH_BUTTON_RELEASE_EVENT { 21 };
constexpr SHEventIdentifier SH_BUTTON_HOVER_ENTER_EVENT { 22 }; constexpr SHEventIdentifier SH_BUTTON_HOVER_ENTER_EVENT { 22 };
constexpr SHEventIdentifier SH_BUTTON_HOVER_EXIT_EVENT { 23 }; constexpr SHEventIdentifier SH_BUTTON_HOVER_EXIT_EVENT { 23 };
constexpr SHEventIdentifier SH_ASSET_COMPILE_EVENT { 24 };

View File

@ -345,7 +345,7 @@ namespace SHADE
else else
{ {
// Should be deactivated // Should be deactivated
static const SHMatrix ZERO_MTX = static const SHMatrix ZERO_MTX
{ {
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,
0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f, 0.0f,

View File

@ -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<SHVkLogicalDevice> logicalDevice, Handle<SHVkDescriptorSetGroup> 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<Handle<SHVkBuffer>>{ 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;
}
}

View File

@ -0,0 +1,51 @@
#pragma once
#include <cstdint>
#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<SHVkBuffer> gpuBuffer;
//! gpu struct size for GPU to use
uint32_t alignedGpuStructSize;
public:
void Init (Handle<SHVkLogicalDevice> logicalDevice, Handle<SHVkDescriptorSetGroup> 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;
};
}

View File

@ -2,11 +2,13 @@
#include "SHGlobalDescriptorSets.h" #include "SHGlobalDescriptorSets.h"
#include "Graphics/MiddleEnd/Lights/SHLightingSubSystem.h" #include "Graphics/MiddleEnd/Lights/SHLightingSubSystem.h"
#include "Graphics/Commands/SHVkCommandBuffer.h" #include "Graphics/Commands/SHVkCommandBuffer.h"
#include "Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.h"
#include "Graphics/Devices/SHVkLogicalDevice.h"
namespace SHADE namespace SHADE
{ {
Handle<SHVkDescriptorSetGroup> SHGlobalDescriptorSets::staticGlobalDataDescriptorSet; Handle<SHVkDescriptorSetGroup> SHGlobalDescriptorSets::genericAndTextureDataDescSet;
Handle<SHLightingSubSystem> SHGlobalDescriptorSets::lightingSubSystem; Handle<SHLightingSubSystem> SHGlobalDescriptorSets::lightingSubSystem;
//void SHGlobalDescriptorSets::BindLightingData(Handle<SHVkCommandBuffer> cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t firstSet) noexcept //void SHGlobalDescriptorSets::BindLightingData(Handle<SHVkCommandBuffer> cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t firstSet) noexcept
@ -20,11 +22,13 @@ namespace SHADE
lightingSubSystem->BindDescSet(cmdBuffer, setIndex, frameIndex); lightingSubSystem->BindDescSet(cmdBuffer, setIndex, frameIndex);
} }
void SHGlobalDescriptorSets::BindStaticGlobalData(Handle<SHVkCommandBuffer> cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t setIndex) noexcept void SHGlobalDescriptorSets::BindGenericAndTextureData(Handle<SHVkLogicalDevice> device, Handle<SHVkCommandBuffer> 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 // Bind descriptor set for static global data
static std::array<uint32_t, 1> TEX_DYNAMIC_OFFSET{ 0 }; static std::array TEX_DYNAMIC_OFFSET = { alignedGenericStructSize, };
cmdBuffer->BindDescriptorSet(staticGlobalDataDescriptorSet, pipelineType, setIndex, std::span{ TEX_DYNAMIC_OFFSET.data(), 1 }); cmdBuffer->BindDescriptorSet(genericAndTextureDataDescSet, pipelineType, setIndex, std::span{ TEX_DYNAMIC_OFFSET.data(), 1 });
} }
/***************************************************************************/ /***************************************************************************/
@ -43,9 +47,9 @@ namespace SHADE
lightingSubSystem = system; lightingSubSystem = system;
} }
void SHGlobalDescriptorSets::SetStaticGlobalDataDescriptorSet(Handle<SHVkDescriptorSetGroup> staticGlobalDescSet) noexcept void SHGlobalDescriptorSets::SetStaticGlobalDataDescriptorSet(Handle<SHVkDescriptorSetGroup> descSet) noexcept
{ {
staticGlobalDataDescriptorSet = staticGlobalDescSet; genericAndTextureDataDescSet = descSet;
} }
} }

View File

@ -15,7 +15,7 @@ namespace SHADE
private: private:
//! Static global descriptor sets for miscellaneous data and textures //! Static global descriptor sets for miscellaneous data and textures
static Handle<SHVkDescriptorSetGroup> staticGlobalDataDescriptorSet; static Handle<SHVkDescriptorSetGroup> genericAndTextureDataDescSet;
//! Lighting sub system required to get information to bind descriptor sets for light data //! Lighting sub system required to get information to bind descriptor sets for light data
static Handle<SHLightingSubSystem> lightingSubSystem; static Handle<SHLightingSubSystem> lightingSubSystem;
@ -25,7 +25,7 @@ namespace SHADE
/* PUBLIC MEMBER FUNCTIONS */ /* PUBLIC MEMBER FUNCTIONS */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
static void BindLightingData (Handle<SHVkCommandBuffer> cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t setIndex, uint32_t frameIndex) noexcept; static void BindLightingData (Handle<SHVkCommandBuffer> cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t setIndex, uint32_t frameIndex) noexcept;
static void BindStaticGlobalData (Handle<SHVkCommandBuffer> cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t setIndex) noexcept; static void BindGenericAndTextureData (Handle<SHVkLogicalDevice> device, Handle<SHVkCommandBuffer> cmdBuffer, SH_PIPELINE_TYPE pipelineType, uint32_t setIndex, uint32_t frameIndex) noexcept;
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* SETTERS AND GETTERS */ /* SETTERS AND GETTERS */

View File

@ -25,9 +25,10 @@ namespace SHADE
{ {
perSystemData[SHUtilities::ConvertEnum(SystemType::BATCHING)].descMappings.AddMappings perSystemData[SHUtilities::ConvertEnum(SystemType::BATCHING)].descMappings.AddMappings
({ ({
{SHPredefinedDescriptorTypes::STATIC_DATA, 0}, {SHPredefinedDescriptorTypes::STATIC_DATA, 0},
{SHPredefinedDescriptorTypes::CAMERA, 1}, {SHPredefinedDescriptorTypes::CAMERA, 1},
{SHPredefinedDescriptorTypes::PER_INSTANCE_BATCH, 2}, {SHPredefinedDescriptorTypes::PER_INSTANCE_BATCH, 2},
{SHPredefinedDescriptorTypes::RENDER_GRAPH_RESOURCE, 3},
}); });
perSystemData[SHUtilities::ConvertEnum(SystemType::BATCHING_ANIM)].descMappings.AddMappings perSystemData[SHUtilities::ConvertEnum(SystemType::BATCHING_ANIM)].descMappings.AddMappings

View File

@ -129,11 +129,13 @@ namespace SHADE
static constexpr std::string_view GBUFFER_WRITE_SUBPASS = "G-Buffer Write"; static constexpr std::string_view GBUFFER_WRITE_SUBPASS = "G-Buffer Write";
static constexpr std::string_view UI_SUBPASS = "UI"; static constexpr std::string_view UI_SUBPASS = "UI";
static constexpr std::string_view VFX_SUBPASS = "VFX"; 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 = static constexpr std::array USABLE_SUBPASSES =
{ {
GBUFFER_WRITE_SUBPASS, GBUFFER_WRITE_SUBPASS,
UI_SUBPASS UI_SUBPASS,
OBJ_VFX_SUBPASS
}; };
}; };

View File

@ -47,6 +47,7 @@ of DigiPen Institute of Technology is prohibited.
#include "Events/SHEvent.h" #include "Events/SHEvent.h"
#include "Graphics/MiddleEnd/Lights/SHLightComponent.h" #include "Graphics/MiddleEnd/Lights/SHLightComponent.h"
#include "Input/SHInputManager.h" #include "Input/SHInputManager.h"
#include "Assets/Events/SHAssetManagerEvents.h"
namespace SHADE namespace SHADE
{ {
@ -210,10 +211,11 @@ namespace SHADE
renderGraph->Init("World Render Graph", device, swapchain, &resourceManager, renderContextCmdPools); 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", { 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("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); 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); //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("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("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("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); 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);
@ -235,7 +237,8 @@ namespace SHADE
"Depth Buffer", "Depth Buffer",
"SSAO", "SSAO",
"SSAO Blur", "SSAO Blur",
"Position World Space" "Position World Space",
"Object VFX"
}, },
{}); // no predecessors {}); // no predecessors
@ -249,9 +252,16 @@ namespace SHADE
gBufferSubpass->AddColorOutput("Normals"); gBufferSubpass->AddColorOutput("Normals");
gBufferSubpass->AddColorOutput("Albedo"); gBufferSubpass->AddColorOutput("Albedo");
gBufferSubpass->AddColorOutput("Position World Space"); gBufferSubpass->AddColorOutput("Position World Space");
gBufferSubpass->AddColorOutput("Object VFX");
gBufferSubpass->AddDepthOutput("Depth Buffer", SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL); 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 */ /* SSAO PASS AND DATA INIT */
@ -297,15 +307,15 @@ namespace SHADE
"Albedo", "Albedo",
"Scene", "Scene",
"SSAO Blur", "SSAO Blur",
"Position World Space" "Position World Space",
"Object VFX"
}, },
{ SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS .data()}); { SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS .data()});
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* DEFERRED COMPOSITE SUBPASS INIT */ /* 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<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex) deferredCompositeCompute->AddPreComputeFunction([=](Handle<SHVkCommandBuffer> cmdBuffer, uint32_t frameIndex)
{ {
lightingSubSystem->PrepareShadowMapsForRead(cmdBuffer); lightingSubSystem->PrepareShadowMapsForRead(cmdBuffer);
@ -340,10 +350,17 @@ namespace SHADE
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* SCREEN SPACE PASS */ /* SCREEN SPACE PASS */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
auto screenSpaceNode = renderGraph->AddNode(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(),
SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW_DEPTH_PASS.data()
});
auto uiSubpass = screenSpaceNode->AddSubpass(SHGraphicsConstants::RenderGraphEntityNames::UI_SUBPASS.data(), worldViewport, screenRenderer); auto uiSubpass = screenSpaceNode->AddSubpass(SHGraphicsConstants::RenderGraphEntityNames::UI_SUBPASS.data(), worldViewport, screenRenderer);
uiSubpass->AddColorOutput("Scene"); uiSubpass->AddColorOutput("Scene");
uiSubpass->AddColorOutput("Entity ID"); uiSubpass->AddColorOutput("Entity ID");
uiSubpass->AddDepthOutput("Depth Buffer");
uiSubpass->AddExteriorDrawCalls([=](Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHRenderer> renderer, uint32_t frameIndex) uiSubpass->AddExteriorDrawCalls([=](Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHRenderer> renderer, uint32_t frameIndex)
{ {
textRenderingSubSystem->Render(cmdBuffer, renderer, frameIndex); textRenderingSubSystem->Render(cmdBuffer, renderer, frameIndex);
@ -409,7 +426,6 @@ namespace SHADE
InitRenderGraph(); InitRenderGraph();
// Create Semaphore // Create Semaphore
for (auto& semaHandle : graphSemaphores) for (auto& semaHandle : graphSemaphores)
{ {
@ -491,12 +507,34 @@ namespace SHADE
void SHGraphicsSystem::InitEvents(void) noexcept void SHGraphicsSystem::InitEvents(void) noexcept
{ {
std::shared_ptr<SHEventReceiverSpec<SHGraphicsSystem>> thisReceiver std::shared_ptr<SHEventReceiverSpec<SHGraphicsSystem>> lightEnableShadowReceiver
{ {
std::make_shared<SHEventReceiverSpec<SHGraphicsSystem>>(this, &SHGraphicsSystem::ReceiveLightEnableShadowEvent) std::make_shared<SHEventReceiverSpec<SHGraphicsSystem>>(this, &SHGraphicsSystem::ReceiveLightEnableShadowEvent)
}; };
ReceiverPtr receiver = std::dynamic_pointer_cast<SHEventReceiver>(thisReceiver); ReceiverPtr lightEnableShadowReceivePtr = std::dynamic_pointer_cast<SHEventReceiver>(lightEnableShadowReceiver);
SHEventManager::SubscribeTo(SH_GRAPHICS_LIGHT_ENABLE_SHADOW_EVENT, receiver); SHEventManager::SubscribeTo(SH_GRAPHICS_LIGHT_ENABLE_SHADOW_EVENT, lightEnableShadowReceivePtr);
std::shared_ptr<SHEventReceiverSpec<SHGraphicsSystem>> compileAssetReceiever
{
std::make_shared<SHEventReceiverSpec<SHGraphicsSystem>>(this, &SHGraphicsSystem::ReceiveCompileAssetEvent)
};
ReceiverPtr compileAssetReceivePtr = std::dynamic_pointer_cast<SHEventReceiver>(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 +545,7 @@ namespace SHADE
InitBoilerplate(); InitBoilerplate();
InitMiddleEnd(); InitMiddleEnd();
InitSubsystems(); InitSubsystems();
InitGenericDataAndTexturesDescSet();
InitBuiltInResources(); InitBuiltInResources();
InitEvents(); InitEvents();
} }
@ -536,7 +575,7 @@ namespace SHADE
*/ */
/***************************************************************************/ /***************************************************************************/
void SHGraphicsSystem::Run(double) noexcept void SHGraphicsSystem::Run(double dt) noexcept
{ {
if (window->IsMinimized() || renderContext.GetWindowIsDead()) if (window->IsMinimized() || renderContext.GetWindowIsDead())
{ {
@ -572,6 +611,9 @@ namespace SHADE
auto cameraSystem = SHSystemManager::GetSystem<SHCameraSystem>(); auto cameraSystem = SHSystemManager::GetSystem<SHCameraSystem>();
graphicsGenericData.SetDt(dt);
graphicsGenericData.UpdateElapsedTime(dt);
graphicsGenericData.UpdateBuffer(frameIndex);
{ {
#ifdef SHEDITOR #ifdef SHEDITOR
@ -860,6 +902,29 @@ namespace SHADE
return eventPtr->handle; return eventPtr->handle;
} }
SHEventHandle SHGraphicsSystem::ReceiveCompileAssetEvent(SHEventPtr eventPtr) noexcept
{
auto const& EVENT_DATA = reinterpret_cast<const SHEventSpec<SHCompileAssetEvent>*>(eventPtr.get())->data;
// check for asset type
if (EVENT_DATA->assetType == AssetType::SHADER)
{
// loop through all shaders
auto denseIterators = SHVkInstance::GetResourceManager().GetDenseAccess<SHVkShaderModule>();
for (auto it = denseIterators.first; it != denseIterators.second; ++it)
{
if (it->GetName() == EVENT_DATA->assetName)
{
auto* shaderAsset = SHAssetManager::GetData<SHShaderAsset>(EVENT_DATA->assetID);
it->OnChange(shaderAsset->spirvBinary);
break;
}
}
}
return eventPtr->handle;
}
Handle<SHMaterial> SHGraphicsSystem::AddMaterial(Handle<SHVkShaderModule> vertShader, Handle<SHVkShaderModule> fragShader, Handle<SHSubpass> subpass) Handle<SHMaterial> SHGraphicsSystem::AddMaterial(Handle<SHVkShaderModule> vertShader, Handle<SHVkShaderModule> fragShader, Handle<SHSubpass> subpass)
{ {
// Retrieve pipeline from pipeline storage or create if unavailable // Retrieve pipeline from pipeline storage or create if unavailable
@ -980,12 +1045,11 @@ namespace SHADE
device->WaitIdle(); device->WaitIdle();
texLibrary.BuildTextures texLibrary.BuildTextures
( (
device, graphicsTexCmdBuffer, graphicsQueue, descPool device, graphicsTexCmdBuffer, graphicsQueue, genericAndTextureDescSet
); );
device->WaitIdle(); device->WaitIdle();
graphicsTexCmdBuffer.Free(); graphicsTexCmdBuffer = {}; graphicsTexCmdBuffer.Free(); graphicsTexCmdBuffer = {};
SHGlobalDescriptorSets::SetStaticGlobalDataDescriptorSet(texLibrary.GetTextureDescriptorSetGroup()); //SHGlobalDescriptorSets::SetStaticGlobalDataDescriptorSet(texLibrary.GetTextureDescriptorSetGroup());
} }
Handle<SHTexture> SHGraphicsSystem::GetTextureHandle(SHTexture::Index textureId) const Handle<SHTexture> SHGraphicsSystem::GetTextureHandle(SHTexture::Index textureId) const
@ -1134,6 +1198,10 @@ namespace SHADE
resizeWidth = newWidth; resizeWidth = newWidth;
resizeHeight = newHeight; resizeHeight = newHeight;
graphicsGenericData.SetViewportWidth(resizeWidth);
graphicsGenericData.SetViewportHeight(resizeHeight);
renderContext.SetIsResized(true); renderContext.SetIsResized(true);
} }
@ -1186,6 +1254,7 @@ namespace SHADE
SHEventManager::BroadcastEvent<SHWindowResizeEvent>(newEvent, SH_WINDOW_RESIZE_EVENT); SHEventManager::BroadcastEvent<SHWindowResizeEvent>(newEvent, SH_WINDOW_RESIZE_EVENT);
#else #else
// Create new event and broadcast it // Create new event and broadcast it
SHWindowResizeEvent newEvent; SHWindowResizeEvent newEvent;

View File

@ -37,6 +37,7 @@ of DigiPen Institute of Technology is prohibited.
#include "Graphics/MiddleEnd/Interface/SHRenderer.h" #include "Graphics/MiddleEnd/Interface/SHRenderer.h"
#include "Graphics/Events/SHGraphicsEvents.h" #include "Graphics/Events/SHGraphicsEvents.h"
#include "Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.h" #include "Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.h"
#include "Graphics/MiddleEnd/GenericData/SHGraphicsGenericData.h"
namespace SHADE namespace SHADE
{ {
@ -106,6 +107,7 @@ namespace SHADE
void InitSubsystems (void) noexcept; void InitSubsystems (void) noexcept;
void InitBuiltInResources (void); void InitBuiltInResources (void);
void InitEvents (void) noexcept; void InitEvents (void) noexcept;
void InitGenericDataAndTexturesDescSet (void) noexcept;
public: public:
class SH_API BeginRoutine final : public SHSystemRoutine class SH_API BeginRoutine final : public SHSystemRoutine
@ -181,6 +183,11 @@ namespace SHADE
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
SHEventHandle ReceiveLightEnableShadowEvent (SHEventPtr eventPtr) noexcept; SHEventHandle ReceiveLightEnableShadowEvent (SHEventPtr eventPtr) noexcept;
/*-----------------------------------------------------------------------*/
/* Asset Events */
/*-----------------------------------------------------------------------*/
SHEventHandle ReceiveCompileAssetEvent (SHEventPtr eventPtr) noexcept;
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
/* Material Functions */ /* Material Functions */
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
@ -433,6 +440,7 @@ namespace SHADE
SHResourceHub resourceManager; SHResourceHub resourceManager;
SHMeshLibrary meshLibrary; SHMeshLibrary meshLibrary;
SHTextureLibrary texLibrary; SHTextureLibrary texLibrary;
SHGraphicsGenericData graphicsGenericData;
SHFontLibrary fontLibrary; SHFontLibrary fontLibrary;
SHSamplerCache samplerCache; SHSamplerCache samplerCache;
SHMaterialInstanceCache materialInstanceCache; SHMaterialInstanceCache materialInstanceCache;
@ -490,6 +498,8 @@ namespace SHADE
Handle<SHVkPipeline> debugDrawFilledDepthPipeline; Handle<SHVkPipeline> debugDrawFilledDepthPipeline;
Handle<SHVkPipeline> shadowMapPipeline; // initialized only when a shadow map is needed Handle<SHVkPipeline> shadowMapPipeline; // initialized only when a shadow map is needed
Handle<SHVkDescriptorSetGroup> genericAndTextureDescSet;
// Built-In Textures // Built-In Textures
Handle<SHTexture> defaultTexture; Handle<SHTexture> defaultTexture;

View File

@ -14,6 +14,7 @@
#include "Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.h" #include "Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.h"
#include "Graphics/MiddleEnd/Interface/SHRenderer.h" #include "Graphics/MiddleEnd/Interface/SHRenderer.h"
#include "Scene/SHSceneManager.h" #include "Scene/SHSceneManager.h"
#include "UI/SHUIComponent.h"
namespace SHADE namespace SHADE
{ {
@ -197,7 +198,7 @@ namespace SHADE
cmdBuffer->BindPipeline(pipeline); cmdBuffer->BindPipeline(pipeline);
// Bind global data // Bind global data
SHGlobalDescriptorSets::BindStaticGlobalData(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex); SHGlobalDescriptorSets::BindGenericAndTextureData(logicalDevice, cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex, frameIndex);
// Bind camera data // Bind camera data
renderer->BindDescriptorSet(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, cameraSetIndex, frameIndex); renderer->BindDescriptorSet(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, cameraSetIndex, frameIndex);
@ -209,7 +210,12 @@ namespace SHADE
cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::CALCULATED_GLYPH_POSITION, comp.charPositionDataBuffer, 0); cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::CALCULATED_GLYPH_POSITION, comp.charPositionDataBuffer, 0);
cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::GLYPH_INDEX, comp.indexingDataBuffer, 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<SHUIComponent>(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.eid", comp.GetEID(), SH_PIPELINE_TYPE::GRAPHICS);
cmdBuffer->SetPushConstantVariable("TestPushConstant.textColor", SHVec3 (1.0f, 1.0f, 1.0f), SH_PIPELINE_TYPE::GRAPHICS); cmdBuffer->SetPushConstantVariable("TestPushConstant.textColor", SHVec3 (1.0f, 1.0f, 1.0f), SH_PIPELINE_TYPE::GRAPHICS);

View File

@ -63,7 +63,7 @@ namespace SHADE
isDirty = true; isDirty = true;
} }
void SHTextureLibrary::BuildTextures(Handle<SHVkLogicalDevice> device, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkQueue> graphicsQueue, Handle<SHVkDescriptorPool> descPool) void SHTextureLibrary::BuildTextures(Handle<SHVkLogicalDevice> device, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkQueue> graphicsQueue, Handle<SHVkDescriptorSetGroup> descSet/*, Handle<SHVkDescriptorPool> descPool*/)
{ {
// Don't do anything if there are no updates // Don't do anything if there are no updates
if (!isDirty) if (!isDirty)
@ -162,27 +162,28 @@ namespace SHADE
/* Build Descriptor Set with all the Textures only if there are textures */ /* Build Descriptor Set with all the Textures only if there are textures */
if (!texOrder.empty()) if (!texOrder.empty())
{ {
if (texDescriptors)
{ // if (descSet)
texDescriptors.Free(); // {
} // descSet.Free();
texDescriptors = descPool->Allocate // }
( // descSet = descPool->Allocate
{ SHGraphicsPredefinedData::GetPredefinedDescSetLayouts(SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::STATIC_DATA) }, // (
{ static_cast<uint32_t>(texOrder.size()) } // { SHGraphicsPredefinedData::GetPredefinedDescSetLayouts(SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::STATIC_DATA) },
); // { static_cast<uint32_t>(texOrder.size()) }
#ifdef _DEBUG // );
for (auto set : texDescriptors->GetVkHandle()) //#ifdef _DEBUG
SET_VK_OBJ_NAME(device, vk::ObjectType::eDescriptorSet, set, "[Descriptor Set] Static Globals"); // for (auto set : descSet->GetVkHandle())
#endif // SET_VK_OBJ_NAME(device, vk::ObjectType::eDescriptorSet, set, "[Descriptor Set] Static Globals");
//#endif
static constexpr uint32_t TEX_DESCRIPTOR_SET_INDEX = 0; static constexpr uint32_t TEX_DESCRIPTOR_SET_INDEX = 0;
texDescriptors->ModifyWriteDescImage descSet->ModifyWriteDescImage
( (
TEX_DESCRIPTOR_SET_INDEX, TEX_DESCRIPTOR_SET_INDEX,
SHGraphicsConstants::DescriptorSetBindings::IMAGE_AND_SAMPLERS_DATA, SHGraphicsConstants::DescriptorSetBindings::IMAGE_AND_SAMPLERS_DATA,
combinedImageSamplers combinedImageSamplers
); );
texDescriptors->UpdateDescriptorSetImages descSet->UpdateDescriptorSetImages
( (
TEX_DESCRIPTOR_SET_INDEX, TEX_DESCRIPTOR_SET_INDEX,
SHGraphicsConstants::DescriptorSetBindings::IMAGE_AND_SAMPLERS_DATA SHGraphicsConstants::DescriptorSetBindings::IMAGE_AND_SAMPLERS_DATA

View File

@ -66,6 +66,13 @@ namespace SHADE
class SHTextureLibrary class SHTextureLibrary
{ {
public: 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 */ /* Usage Functions */
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
@ -112,7 +119,7 @@ namespace SHADE
/*! /*!
\brief \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 \param device
Device used to create and update the buffers. Device used to create and update the buffers.
@ -123,12 +130,12 @@ namespace SHADE
queue. queue.
*/ */
/***************************************************************************/ /***************************************************************************/
void BuildTextures(Handle<SHVkLogicalDevice> device, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkQueue> graphicsQueue, Handle<SHVkDescriptorPool> descPool); void BuildTextures(Handle<SHVkLogicalDevice> device, Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHVkQueue> graphicsQueue, Handle<SHVkDescriptorSetGroup> descSet/*, Handle<SHVkDescriptorPool> descPool*/);
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
/* Getter Functions */ /* Getter Functions */
/*-----------------------------------------------------------------------------*/ /*-----------------------------------------------------------------------------*/
Handle<SHVkDescriptorSetGroup> GetTextureDescriptorSetGroup() const noexcept { return texDescriptors; } //Handle<SHVkDescriptorSetGroup> GetTextureDescriptorSetGroup() const noexcept { return descSet; }
/***************************************************************************/ /***************************************************************************/
/*! /*!
* *
@ -173,8 +180,8 @@ namespace SHADE
std::vector<Handle<SHTexture>> texOrder; std::vector<Handle<SHTexture>> texOrder;
// CPU Storage // CPU Storage
std::vector<std::tuple<Handle<SHVkImageView>, Handle<SHVkSampler>, vk::ImageLayout>> combinedImageSamplers; std::vector<std::tuple<Handle<SHVkImageView>, Handle<SHVkSampler>, vk::ImageLayout>> combinedImageSamplers;
// GPU Storage //// GPU Storage
Handle<SHVkDescriptorSetGroup> texDescriptors; //Handle<SHVkDescriptorSetGroup> descSet;
// Flags // Flags
bool isDirty = true; bool isDirty = true;

View File

@ -164,7 +164,7 @@ namespace SHADE
cmdBuffer->BindPipeline(pipeline); cmdBuffer->BindPipeline(pipeline);
// Bind global data // Bind global data
SHGlobalDescriptorSets::BindStaticGlobalData(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex); SHGlobalDescriptorSets::BindGenericAndTextureData(logicalDevice, cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex, frameIndex);
// Bind camera data // Bind camera data
renderer->BindDescriptorSet(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, cameraSetIndex, frameIndex); renderer->BindDescriptorSet(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, cameraSetIndex, frameIndex);

View File

@ -235,6 +235,9 @@ namespace SHADE
, pipelineLayout { inPipelineLayout } , pipelineLayout { inPipelineLayout }
, created {false} , created {false}
{ {
if (pipelineLayout)
pipelineLayout->AddCallback([this]() {ConstructPipeline();});
// We want to create a pipeline // We want to create a pipeline
if (state != nullptr) if (state != nullptr)
{ {
@ -359,7 +362,10 @@ namespace SHADE
{ {
// if it was created before, destroy it // if it was created before, destroy it
if (created) if (created)
{
logicalDeviceHdl->WaitIdle();
logicalDeviceHdl->GetVkLogicalDevice().destroyPipeline(vkPipeline, nullptr); logicalDeviceHdl->GetVkLogicalDevice().destroyPipeline(vkPipeline, nullptr);
}
// Set to false again. If creation succeeds after this, this will be true // Set to false again. If creation succeeds after this, this will be true
created = false; created = false;

View File

@ -298,6 +298,10 @@ namespace SHADE
descriptorSetLayoutsAllocate.clear(); 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 // We don't need to use vulkan to destroy descriptor sets here since they are just owned by the container with handles
vkDescriptorSetLayoutsAllocate.clear(); vkDescriptorSetLayoutsAllocate.clear();
vkDescriptorSetLayoutsPipeline.clear(); vkDescriptorSetLayoutsPipeline.clear();
@ -450,6 +454,15 @@ namespace SHADE
} }
else else
SHVulkanDebugUtil::ReportVkSuccess("Successfully created Pipeline Layout. "); 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<Handle<SHVkShaderModule>> const& SHVkPipelineLayout::GetShaderModules(void) const noexcept std::vector<Handle<SHVkShaderModule>> const& SHVkPipelineLayout::GetShaderModules(void) const noexcept

View File

@ -10,6 +10,9 @@ namespace SHADE
class SHVkPipelineLayout class SHVkPipelineLayout
{ {
public:
using ChangeCallback = std::function<void()>;
private: private:
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* PRIVATE MEMBER VARIABLES */ /* PRIVATE MEMBER VARIABLES */
@ -51,6 +54,12 @@ namespace SHADE
//! Store for pipeline layout recreation //! Store for pipeline layout recreation
std::vector<vk::DescriptorSetLayout> vkDescriptorSetLayoutsPipeline; std::vector<vk::DescriptorSetLayout> 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<ChangeCallback> onChangeCallbacks;
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* PRIVATE MEMBER FUNCTIONS */ /* PRIVATE MEMBER FUNCTIONS */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
@ -73,6 +82,7 @@ namespace SHADE
/* PUBLIC MEMBER FUNCTIONS */ /* PUBLIC MEMBER FUNCTIONS */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
void RecreateIfNeeded (void) noexcept; void RecreateIfNeeded (void) noexcept;
void AddCallback(ChangeCallback&& callback) noexcept;
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* SETTERS AND GETTERS */ /* SETTERS AND GETTERS */

View File

@ -512,8 +512,9 @@ namespace SHADE
uint32_t h = static_cast<uint32_t>(resource->GetHeight()); uint32_t h = static_cast<uint32_t>(resource->GetHeight());
cmdBuffer->SetViewportScissor(static_cast<float>(w), static_cast<float>(h), w, h); cmdBuffer->SetViewportScissor(static_cast<float>(w), static_cast<float>(h), w, h);
static constexpr uint32_t INPUT_IMAGE_SET_INDEX = 0; //static constexpr uint32_t INPUT_IMAGE_SET_INDEX = 0;
newSubpass->BindInputDescriptorSets (cmdBuffer, INPUT_IMAGE_SET_INDEX, frameIndex); auto const& mappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::BATCHING);
newSubpass->BindInputDescriptorSets (cmdBuffer, mappings.at(SHPredefinedDescriptorTypes::RENDER_GRAPH_RESOURCE), frameIndex);
// draw a quad. // draw a quad.
cmdBuffer->DrawArrays(4, 1, 0, 0); cmdBuffer->DrawArrays(4, 1, 0, 0);
@ -570,7 +571,8 @@ namespace SHADE
auto cmdBuffer = commandBuffers[frameIndex]; auto cmdBuffer = commandBuffers[frameIndex];
cmdBuffer->BeginLabeledSegment(name); 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::GRAPHICS);
@ -584,7 +586,7 @@ namespace SHADE
if (node->renderpass) if (node->renderpass)
{ {
// bind static global data // 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 // Bind all the buffers required for meshes
for (auto& [buffer, bindingPoint] : MESH_DATA) for (auto& [buffer, bindingPoint] : MESH_DATA)

View File

@ -184,12 +184,13 @@ namespace SHADE
for (auto& inputAtt : subpass->inputReferences) for (auto& inputAtt : subpass->inputReferences)
{ {
auto resource = attResources[inputAtt.attachment]; auto resource = attResources[inputAtt.attachment];
if (resource->resourceTypeFlags & static_cast<uint32_t>(SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT)) auto typeFlags = resource->resourceTypeFlags;
if (typeFlags & static_cast<uint32_t>(SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT))
{ {
if (resource->resourceTypeFlags & static_cast<uint32_t>(SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR) || if (typeFlags & static_cast<uint32_t>(SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR) ||
resource->resourceTypeFlags & static_cast<uint32_t>(SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR_PRESENT)) typeFlags & static_cast<uint32_t>(SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR_PRESENT))
colorRead |= (1 << i); colorRead |= (1 << i);
else if (resource->resourceTypeFlags & static_cast<uint32_t>(SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL)) else if (typeFlags & static_cast<uint32_t>(SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH_STENCIL) || typeFlags & static_cast<uint32_t>(SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH))
depthRead |= (1 << i); depthRead |= (1 << i);
} }
else else
@ -265,6 +266,7 @@ namespace SHADE
// initialize input descriptors // initialize input descriptors
subpasses[i]->CreateInputDescriptors(); subpasses[i]->CreateInputDescriptors();
subpasses[i]->GenerateDummyPipielineLayout();
++i; ++i;
} }
@ -664,7 +666,7 @@ namespace SHADE
commandBuffer->ForceSetPipelineLayout(SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::RENDER_GRAPH_NODE_COMPUTE).dummyPipelineLayout, SH_PIPELINE_TYPE::COMPUTE); commandBuffer->ForceSetPipelineLayout(SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::RENDER_GRAPH_NODE_COMPUTE).dummyPipelineLayout, SH_PIPELINE_TYPE::COMPUTE);
// bind static global data // 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 // bind lighting data
SHGlobalDescriptorSets::BindLightingData(commandBuffer, SH_PIPELINE_TYPE::COMPUTE, descMappings.at(SHPredefinedDescriptorTypes::LIGHTS), frameIndex); SHGlobalDescriptorSets::BindLightingData(commandBuffer, SH_PIPELINE_TYPE::COMPUTE, descMappings.at(SHPredefinedDescriptorTypes::LIGHTS), frameIndex);

View File

@ -226,11 +226,15 @@ namespace SHADE
commandBuffer->SetViewportScissor(static_cast<float>(w), static_cast<float>(h), w, h); commandBuffer->SetViewportScissor(static_cast<float>(w), static_cast<float>(h), w, h);
} }
commandBuffer->ForceSetPipelineLayout(dummyPipelineLayout, SH_PIPELINE_TYPE::GRAPHICS);
auto const& descMappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::BATCHING); auto const& descMappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::BATCHING);
if (renderer) if (renderer)
renderer->BindDescriptorSet(commandBuffer, SH_PIPELINE_TYPE::GRAPHICS, descMappings.at(SHPredefinedDescriptorTypes::CAMERA), frameIndex); 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 companion subpass is not a valid handle, render super batch normally
if (!companionSubpass.companion) 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 }
);
}
/***************************************************************************/ /***************************************************************************/
/*! /*!

View File

@ -22,6 +22,7 @@ namespace SHADE
class SHRenderer; class SHRenderer;
class SHViewport; class SHViewport;
class SHVkPipeline; class SHVkPipeline;
class SHVkPipelineLayout;
class SH_API SHSubpass : public ISelfHandle<SHSubpass> class SH_API SHSubpass : public ISelfHandle<SHSubpass>
{ {
@ -87,6 +88,12 @@ namespace SHADE
std::vector<Handle<SHVkSampler>> inputSamplers; std::vector<Handle<SHVkSampler>> 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<SHVkPipelineLayout> dummyPipelineLayout;
////! subpass compute image barriers. We do this because every frame has a different ////! 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, ////! 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 InitComputeBarriers (void) noexcept;
void CreateInputDescriptors (void) noexcept; void CreateInputDescriptors (void) noexcept;
void UpdateWriteDescriptors (void) noexcept; void UpdateWriteDescriptors (void) noexcept;
void GenerateDummyPipielineLayout (void) noexcept;
private: private:
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/

View File

@ -40,7 +40,7 @@ namespace SHADE
if (SHVkUtil::IsDepthStencilAttachment(vkDescriptions[i].format)) if (SHVkUtil::IsDepthStencilAttachment(vkDescriptions[i].format))
clearColors[i].depthStencil = vk::ClearDepthStencilValue(1.0f, 0); clearColors[i].depthStencil = vk::ClearDepthStencilValue(1.0f, 0);
else else
clearColors[i].color = { {{0.0f, 0.0f, 0.0f, 1.0f}} }; clearColors[i].color = { {{0.0f, 0.0f, 0.0f, 0.0f}} };
} }

View File

@ -7,20 +7,16 @@
namespace SHADE namespace SHADE
{ {
SHVkShaderModule::SHVkShaderModule(Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, std::vector<uint32_t> const& binaryData, std::string inEntryPoint, vk::ShaderStageFlagBits stage, std::string const& name) noexcept void SHVkShaderModule::Recompile(void) noexcept
: logicalDeviceHdl {inLogicalDeviceHdl}
, shaderStage {stage}
, entryPoint {inEntryPoint}
, vkShaderModule {nullptr}
, spirvBinary{}
, shaderName {name}
, reflectedData {}
{ {
if (vkShaderModule)
logicalDeviceHdl->GetVkLogicalDevice().destroyShaderModule(vkShaderModule, nullptr);
// Prepare the create info // Prepare the create info
vk::ShaderModuleCreateInfo moduleCreateInfo vk::ShaderModuleCreateInfo moduleCreateInfo
{ {
.codeSize = binaryData.size() * sizeof (uint32_t), .codeSize = spirvBinary.size() * sizeof(uint32_t),
.pCode = binaryData.data(), .pCode = spirvBinary.data(),
}; };
if (auto result = logicalDeviceHdl->GetVkLogicalDevice().createShaderModule(&moduleCreateInfo, nullptr, &vkShaderModule); result != vk::Result::eSuccess) if (auto result = logicalDeviceHdl->GetVkLogicalDevice().createShaderModule(&moduleCreateInfo, nullptr, &vkShaderModule); result != vk::Result::eSuccess)
@ -30,10 +26,18 @@ namespace SHADE
} }
else else
SHVulkanDebugUtil::ReportVkSuccess("Successfully created shader module."); 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 SHVkShaderModule::SHVkShaderModule(Handle<SHVkLogicalDevice> const& inLogicalDeviceHdl, std::vector<uint32_t> const& binaryData, std::string inEntryPoint, vk::ShaderStageFlagBits stage, std::string const& name) noexcept
// shader modules only need 1 of themselves. : logicalDeviceHdl {inLogicalDeviceHdl}
spirvBinary = binaryData; , shaderStage {stage}
, entryPoint {inEntryPoint}
, vkShaderModule {nullptr}
, spirvBinary{binaryData}
, shaderName {name}
, reflectedData {}
{
Recompile();
} }
SHVkShaderModule::SHVkShaderModule(SHVkShaderModule&& rhs) noexcept SHVkShaderModule::SHVkShaderModule(SHVkShaderModule&& rhs) noexcept
@ -81,13 +85,18 @@ namespace SHADE
} }
} }
void SHVkShaderModule::OnChange(void) noexcept void SHVkShaderModule::OnChange(std::vector<uint32_t> const& newBinaryData) noexcept
{ {
// assign new binary data and recompile shader
spirvBinary = newBinaryData;
Recompile();
for (auto& callback : onChangeCallbacks) for (auto& callback : onChangeCallbacks)
callback(); callback();
} }
void SHVkShaderModule::AddCallback(SHShaderChangeCallback&& callback) noexcept void SHVkShaderModule::AddCallback(ChangeCallback&& callback) noexcept
{ {
onChangeCallbacks.emplace_back(std::move(callback)); onChangeCallbacks.emplace_back(std::move(callback));
} }
@ -112,4 +121,9 @@ namespace SHADE
return reflectedData; return reflectedData;
} }
std::string SHVkShaderModule::GetName(void) const noexcept
{
return shaderName;
}
} }

View File

@ -16,7 +16,7 @@ namespace SHADE
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* TYPE DEFINITIONS */ /* TYPE DEFINITIONS */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
using SHShaderChangeCallback = std::function<void()>; using ChangeCallback = std::function<void()>;
private: private:
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
@ -47,12 +47,13 @@ namespace SHADE
//! response to call all the functions that need to be called. Specifically //! 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 //! pipeline layouts that need to re-parse the newly reflected data and create
//! descriptor set layouts and push constant ranges. //! descriptor set layouts and push constant ranges.
std::vector<SHShaderChangeCallback> onChangeCallbacks; std::vector<ChangeCallback> onChangeCallbacks;
// #NoteToSelf: From Tomas module, pipeline shader stage create info isn't created here // #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. // because the struct allows specialization info which should not be part of a module itself.
// This struct should be created in the pipeline instead. // This struct should be created in the pipeline instead.
void Recompile (void) noexcept;
public: public:
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
@ -67,8 +68,8 @@ namespace SHADE
/* PUBLIC MEMBER FUNCTIONS */ /* PUBLIC MEMBER FUNCTIONS */
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
void Reflect (void) noexcept; void Reflect (void) noexcept;
void OnChange (void) noexcept; void OnChange (std::vector<uint32_t> const& newBinaryData) noexcept;
void AddCallback (SHShaderChangeCallback&& callback) noexcept; void AddCallback (ChangeCallback&& callback) noexcept;
/*-----------------------------------------------------------------------*/ /*-----------------------------------------------------------------------*/
/* SETTERS AND GETTERS */ /* SETTERS AND GETTERS */
@ -77,6 +78,7 @@ namespace SHADE
vk::ShaderStageFlagBits GetShaderStageFlagBits (void) const noexcept; vk::ShaderStageFlagBits GetShaderStageFlagBits (void) const noexcept;
vk::ShaderModule GetVkShaderModule (void) const noexcept; vk::ShaderModule GetVkShaderModule (void) const noexcept;
SHShaderReflected const& GetReflectedData (void) const noexcept; SHShaderReflected const& GetReflectedData (void) const noexcept;
std::string GetName (void) const noexcept;
}; };
} }

View File

@ -22,4 +22,12 @@ namespace SHADE
{ {
SHSceneManager::RestartScene(sceneAssetID); SHSceneManager::RestartScene(sceneAssetID);
} }
void SceneManager::RestartScene()
{
SHSceneManager::RestartScene();
}
AssetID SceneManager::GetCurrentSceneID()
{
return SHSceneManager::GetCurrentSceneAssetID();
}
} }

View File

@ -23,5 +23,7 @@ namespace SHADE
{ {
public : public :
static void ChangeScene(AssetID sceneAssetID); static void ChangeScene(AssetID sceneAssetID);
static void RestartScene();
static AssetID GetCurrentSceneID();
}; };
} }