Implemented Animation Clip asset and animation controller #410
|
@ -1,4 +1,4 @@
|
|||
Start Maximized: true
|
||||
Working Scene ID: 86098106
|
||||
Working Scene ID: 97158628
|
||||
Window Size: {x: 1920, y: 1013}
|
||||
Style: 0
|
|
@ -8440,6 +8440,11 @@
|
|||
IsActive: true
|
||||
NumberOfChildren: 0
|
||||
Components:
|
||||
Transform Component:
|
||||
Translate: {x: 0, y: 0, z: 0}
|
||||
Rotate: {x: 0, y: 0, z: 0}
|
||||
Scale: {x: 1, y: 1, z: 1}
|
||||
IsActive: true
|
||||
Light Component:
|
||||
Position: {x: 0, y: 0, z: 0}
|
||||
Type: Directional
|
||||
|
@ -8469,14 +8474,14 @@
|
|||
NumberOfChildren: 0
|
||||
Components:
|
||||
Transform Component:
|
||||
Translate: {x: 2, y: 1.5, z: -5.5999999}
|
||||
Translate: {x: 0.242245644, y: 1.56757355, z: -6.07086945}
|
||||
Rotate: {x: -0, y: 0, z: -0}
|
||||
Scale: {x: 1, y: 1, z: 1}
|
||||
IsActive: true
|
||||
Light Component:
|
||||
Position: {x: 2, y: 1.5, z: -5.5999999}
|
||||
Type: Directional
|
||||
Direction: {x: -0.245000005, y: 0, z: 0}
|
||||
Direction: {x: 0, y: 0, z: -1}
|
||||
Color: {x: 0, y: 0, z: 0, w: 1}
|
||||
Layer: 4294967295
|
||||
Strength: 1
|
||||
|
@ -9562,10 +9567,17 @@
|
|||
maxMultiplierDuration: 5
|
||||
maxMultiplierCombo: 10
|
||||
multiplierFont: 60
|
||||
- Type: PauseMenu
|
||||
Enabled: true
|
||||
resumeBtn: 8
|
||||
retryBtn: 461
|
||||
quitBtn: 0
|
||||
gamePauseText: 11
|
||||
canvas: 10
|
||||
- EID: 199
|
||||
Name: =====Text====
|
||||
IsActive: true
|
||||
NumberOfChildren: 3
|
||||
NumberOfChildren: 4
|
||||
Components: ~
|
||||
Scripts: ~
|
||||
- EID: 237
|
||||
|
@ -9613,6 +9625,21 @@
|
|||
Font: 176667660
|
||||
IsActive: true
|
||||
Scripts: ~
|
||||
- EID: 11
|
||||
Name: GamePause
|
||||
IsActive: true
|
||||
NumberOfChildren: 0
|
||||
Components:
|
||||
Transform Component:
|
||||
Translate: {x: -250, y: 300, z: 0}
|
||||
Rotate: {x: 0, y: 0, z: 0}
|
||||
Scale: {x: 100, y: 100, z: 100}
|
||||
IsActive: true
|
||||
Text Renderer Component:
|
||||
Text: Game Pause
|
||||
Font: 176667660
|
||||
IsActive: false
|
||||
Scripts: ~
|
||||
- EID: 198
|
||||
Name: ====Raccoon====
|
||||
IsActive: true
|
||||
|
@ -9671,17 +9698,21 @@
|
|||
maxJumpHeight: 2
|
||||
maxJumpTime: 0.75
|
||||
fallMultipler: 3
|
||||
lightMultiper: 0.75
|
||||
mediumMultiper: 0.5
|
||||
heavyMultiper: 0.25
|
||||
jumpPadMultiplayer: 1.20000005
|
||||
lightMultiper: 0.899999976
|
||||
mediumMultiper: 0.699999988
|
||||
heavyMultiper: 0.5
|
||||
- Type: PickAndThrow
|
||||
Enabled: true
|
||||
throwForce: [10, 8, 10]
|
||||
cameraArmOffSet: [0, 0.25, 0]
|
||||
cameraArmOffSet: [0.25, 0.600000024, 0.200000003]
|
||||
delayTimer: 1
|
||||
aimingLength: 1
|
||||
throwItem: false
|
||||
rayDistance: 0.75
|
||||
rayHeight: 0.100000001
|
||||
aimingFOV: 50
|
||||
defaultFOV: 45
|
||||
- EID: 3
|
||||
Name: HoldingPoint
|
||||
IsActive: true
|
||||
|
@ -9708,30 +9739,31 @@
|
|||
Pitch: 0
|
||||
Yaw: 360
|
||||
Roll: 1.28065994e-06
|
||||
Width: 1920
|
||||
Height: 1080
|
||||
Width: 2560
|
||||
Height: 1369
|
||||
Near: 0.00999999978
|
||||
Far: 10000
|
||||
Perspective: true
|
||||
FOV: 45
|
||||
IsActive: true
|
||||
Camera Arm Component:
|
||||
Arm Pitch: 0
|
||||
Arm Yaw: 0
|
||||
Arm Length: 3
|
||||
Look At Camera Origin: true
|
||||
Target Offset: {x: 0, y: 0, z: 0}
|
||||
Target Offset: {x: 0, y: 0.75, z: 0}
|
||||
Camera Collision: true
|
||||
IsActive: true
|
||||
Scripts:
|
||||
- Type: SHADE_Scripting.ThirdPersonCamera
|
||||
Enabled: true
|
||||
armLength: 3
|
||||
turnSpeedPitch: 0.300000012
|
||||
turnSpeedYaw: 0.5
|
||||
pitchClamp: 45
|
||||
turnSpeedPitch: 0.200000003
|
||||
turnSpeedYaw: 0.400000006
|
||||
inverseXControls: false
|
||||
inverseYControls: true
|
||||
lowerClamp: 5
|
||||
inverseYControls: false
|
||||
pitchUpperClamp: 45
|
||||
pitchLowerClamp: 5
|
||||
- EID: 9
|
||||
Name: PlayerBag
|
||||
IsActive: true
|
||||
|
@ -10483,11 +10515,11 @@
|
|||
Translate: {x: 2.70000005, y: 0.100000001, z: -2}
|
||||
Rotate: {x: -0, y: 0, z: -0}
|
||||
Scale: {x: 1, y: 1, z: 1}
|
||||
IsActive: true
|
||||
IsActive: false
|
||||
Renderable Component:
|
||||
Mesh: 140697366
|
||||
Material: 129495479
|
||||
IsActive: true
|
||||
IsActive: false
|
||||
RigidBody Component:
|
||||
Type: Dynamic
|
||||
Drag: 0.00999999978
|
||||
|
@ -10501,7 +10533,7 @@
|
|||
Freeze Rotation X: true
|
||||
Freeze Rotation Y: false
|
||||
Freeze Rotation Z: true
|
||||
IsActive: true
|
||||
IsActive: false
|
||||
Collider Component:
|
||||
Colliders:
|
||||
- Is Trigger: false
|
||||
|
@ -10513,7 +10545,7 @@
|
|||
Density: 1
|
||||
Position Offset: {x: 0, y: 0.899999976, z: 0}
|
||||
Rotation Offset: {x: 0, y: 0, z: 0}
|
||||
IsActive: true
|
||||
IsActive: false
|
||||
Scripts:
|
||||
- Type: Homeowner1
|
||||
Enabled: true
|
||||
|
@ -10525,4 +10557,155 @@
|
|||
eyeOffset: [0, 1.64999998, 0]
|
||||
distanceToCapture: 0.5
|
||||
captureTime: 0.5
|
||||
footstepSFXIntervalMultiplier: 0.5
|
||||
footstepSFXIntervalMultiplier: 0.5
|
||||
- EID: 12
|
||||
Name: Mesh_Meat
|
||||
IsActive: true
|
||||
NumberOfChildren: 0
|
||||
Components:
|
||||
Transform Component:
|
||||
Translate: {x: 2.30459714, y: 0.209537908, z: 6.371418}
|
||||
Rotate: {x: -0, y: 0, z: -0}
|
||||
Scale: {x: 1, y: 1, z: 1}
|
||||
IsActive: true
|
||||
Renderable Component:
|
||||
Mesh: 136892700
|
||||
Material: 131956078
|
||||
IsActive: true
|
||||
RigidBody Component:
|
||||
Type: Dynamic
|
||||
Drag: 0.00999999978
|
||||
Angular Drag: 0.100000001
|
||||
Use Gravity: true
|
||||
Interpolate: false
|
||||
Sleeping Enabled: true
|
||||
Freeze Position X: false
|
||||
Freeze Position Y: false
|
||||
Freeze Position Z: false
|
||||
Freeze Rotation X: false
|
||||
Freeze Rotation Y: false
|
||||
Freeze Rotation Z: false
|
||||
IsActive: true
|
||||
Collider Component:
|
||||
Colliders:
|
||||
- Is Trigger: false
|
||||
Collision Tag: 2
|
||||
Type: Box
|
||||
Half Extents: {x: 0.300000012, y: 0.300000012, z: 0.300000012}
|
||||
Friction: 0.400000006
|
||||
Bounciness: 0
|
||||
Density: 1
|
||||
Position Offset: {x: 0, y: 0, z: 0}
|
||||
Rotation Offset: {x: 0, y: 0, z: 0}
|
||||
IsActive: true
|
||||
Scripts:
|
||||
- Type: Item
|
||||
Enabled: true
|
||||
Score: 50
|
||||
currCategory: 1
|
||||
density: 1
|
||||
dontReturn: false
|
||||
- EID: 16
|
||||
Name: JumpPad
|
||||
IsActive: false
|
||||
NumberOfChildren: 0
|
||||
Components:
|
||||
Transform Component:
|
||||
Translate: {x: 3.43332767, y: 0.149463654, z: 6.84711409}
|
||||
Rotate: {x: -0, y: 0, z: -0}
|
||||
Scale: {x: 1, y: 1, z: 1}
|
||||
IsActive: false
|
||||
Collider Component:
|
||||
Colliders:
|
||||
- Is Trigger: false
|
||||
Collision Tag: 1
|
||||
Type: Box
|
||||
Half Extents: {x: 1, y: 0.25, z: 1}
|
||||
Friction: 0.400000006
|
||||
Bounciness: 0
|
||||
Density: 1
|
||||
Position Offset: {x: 0, y: 0, z: 0}
|
||||
Rotation Offset: {x: 0, y: 0, z: 0}
|
||||
IsActive: false
|
||||
Scripts:
|
||||
- Type: JumpPad
|
||||
Enabled: true
|
||||
- EID: 10
|
||||
Name: Canvas
|
||||
IsActive: false
|
||||
NumberOfChildren: 3
|
||||
Components:
|
||||
Canvas Component:
|
||||
Canvas Width: 1920
|
||||
Canvas Height: 1080
|
||||
IsActive: false
|
||||
Scripts: ~
|
||||
- EID: 8
|
||||
Name: ResumeButton
|
||||
IsActive: true
|
||||
NumberOfChildren: 0
|
||||
Components:
|
||||
Transform Component:
|
||||
Translate: {x: 0, y: 100, z: 0}
|
||||
Rotate: {x: 0, y: 0, z: 0}
|
||||
Scale: {x: 300, y: 200, z: 500}
|
||||
IsActive: true
|
||||
Renderable Component:
|
||||
Mesh: 141771688
|
||||
Material: 129340704
|
||||
IsActive: true
|
||||
Button Component:
|
||||
Default Texture: 52901020
|
||||
Hovered Texture: 62235279
|
||||
Clicked Texture: 64722619
|
||||
IsActive: true
|
||||
UI Component:
|
||||
Canvas ID: 10
|
||||
IsActive: true
|
||||
Scripts: ~
|
||||
- EID: 0
|
||||
Name: QuitButton
|
||||
IsActive: true
|
||||
NumberOfChildren: 0
|
||||
Components:
|
||||
Transform Component:
|
||||
Translate: {x: 0, y: -300, z: 0}
|
||||
Rotate: {x: 0, y: 0, z: 0}
|
||||
Scale: {x: 300, y: 200, z: 500}
|
||||
IsActive: true
|
||||
Renderable Component:
|
||||
Mesh: 141771688
|
||||
Material: 129340704
|
||||
IsActive: true
|
||||
Button Component:
|
||||
Default Texture: 66477839
|
||||
Hovered Texture: 65045286
|
||||
Clicked Texture: 58607560
|
||||
IsActive: true
|
||||
UI Component:
|
||||
Canvas ID: 10
|
||||
IsActive: true
|
||||
Scripts: ~
|
||||
- EID: 461
|
||||
Name: RetryButton
|
||||
IsActive: true
|
||||
NumberOfChildren: 0
|
||||
Components:
|
||||
Transform Component:
|
||||
Translate: {x: 0, y: -100, z: 0}
|
||||
Rotate: {x: 0, y: 0, z: 0}
|
||||
Scale: {x: 300, y: 200, z: 500}
|
||||
IsActive: true
|
||||
Renderable Component:
|
||||
Mesh: 141771688
|
||||
Material: 129340704
|
||||
IsActive: true
|
||||
Button Component:
|
||||
Default Texture: 55782622
|
||||
Hovered Texture: 58972174
|
||||
Clicked Texture: 55224464
|
||||
IsActive: true
|
||||
UI Component:
|
||||
Canvas ID: 10
|
||||
IsActive: true
|
||||
Scripts: ~
|
|
@ -6,6 +6,7 @@
|
|||
Canvas Component:
|
||||
Canvas Width: 1920
|
||||
Canvas Height: 1080
|
||||
Scale by canvas width: false
|
||||
IsActive: true
|
||||
Scripts: ~
|
||||
- EID: 1
|
||||
|
@ -24,6 +25,8 @@
|
|||
IsActive: true
|
||||
UI Component:
|
||||
Canvas ID: 0
|
||||
Hovered: false
|
||||
Clicked: false
|
||||
IsActive: true
|
||||
Scripts: ~
|
||||
- EID: 5
|
||||
|
@ -47,6 +50,8 @@
|
|||
IsActive: true
|
||||
UI Component:
|
||||
Canvas ID: 0
|
||||
Hovered: false
|
||||
Clicked: false
|
||||
IsActive: true
|
||||
Scripts:
|
||||
- Type: ChangeSceneButton
|
||||
|
@ -73,6 +78,8 @@
|
|||
IsActive: true
|
||||
UI Component:
|
||||
Canvas ID: 0
|
||||
Hovered: false
|
||||
Clicked: false
|
||||
IsActive: true
|
||||
Scripts:
|
||||
- Type: QuitButton
|
||||
|
@ -106,11 +113,12 @@
|
|||
Pitch: 0
|
||||
Yaw: 0
|
||||
Roll: 0
|
||||
Width: 1920
|
||||
Height: 1080
|
||||
Width: 1319
|
||||
Height: 622
|
||||
Near: 0.00999999978
|
||||
Far: 10000
|
||||
Perspective: true
|
||||
FOV: 90
|
||||
IsActive: true
|
||||
Scripts: ~
|
||||
- EID: 4
|
||||
|
|
|
@ -19,5 +19,13 @@ namespace SHADE_Scripting.Audio
|
|||
h.Value.Stop(fadeOut);
|
||||
}
|
||||
}
|
||||
|
||||
public static void pauseAllSounds(bool pause)
|
||||
{
|
||||
foreach (KeyValuePair<string, AudioClipHandler> h in audioClipHandlers)
|
||||
{
|
||||
h.Value.SetPause(pause);
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -8,7 +8,7 @@ using static Item;
|
|||
|
||||
public class PickAndThrow : Script
|
||||
{
|
||||
public Vector3 throwForce = new Vector3(100.0f, 200.0f, 100.0f);
|
||||
public Vector3 throwForce = new Vector3(10.0f, 8.0f, 10.0f);
|
||||
public Vector3 cameraArmOffSet = new Vector3(0.0f, 0.25f, 0.0f);
|
||||
public GameObject item { get; set; }
|
||||
public float delayTimer = 1.0f;
|
||||
|
@ -33,6 +33,9 @@ public class PickAndThrow : Script
|
|||
[Tooltip("Height of ray")]
|
||||
public float rayHeight = 0.1f;
|
||||
|
||||
public float aimingFOV = 50;
|
||||
public float defaultFOV = 45;
|
||||
|
||||
protected override void awake()
|
||||
{
|
||||
pc = GetScript<PlayerController>();
|
||||
|
@ -74,6 +77,7 @@ public class PickAndThrow : Script
|
|||
pc.isAiming = true;
|
||||
pc.camArm.ArmLength = aimingLength;
|
||||
pc.camArm.TargetOffset = cameraArmOffSet;
|
||||
pc.cam.FOV = aimingFOV;
|
||||
}
|
||||
|
||||
if (Input.GetMouseButtonUp(Input.MouseCode.LeftButton) && pc.isAiming)
|
||||
|
@ -83,6 +87,7 @@ public class PickAndThrow : Script
|
|||
itemCollider.GetCollisionShape(0).IsTrigger = false;
|
||||
pc.isAiming = false;
|
||||
pc.camArm.TargetOffset = Vector3.Zero;
|
||||
pc.cam.FOV = defaultFOV;
|
||||
if (tpc)
|
||||
pc.camArm.ArmLength = tpc.armLength;
|
||||
pc.holdItem = false;
|
||||
|
@ -103,6 +108,7 @@ public class PickAndThrow : Script
|
|||
if (Input.GetMouseButtonDown(Input.MouseCode.RightButton) && pc.isAiming)
|
||||
{
|
||||
pc.isAiming = false;
|
||||
pc.cam.FOV = defaultFOV;
|
||||
pc.camArm.TargetOffset = Vector3.Zero;
|
||||
if (tpc)
|
||||
pc.camArm.ArmLength = tpc.armLength;
|
||||
|
@ -132,7 +138,7 @@ public class PickAndThrow : Script
|
|||
{
|
||||
if (itemScript)
|
||||
{
|
||||
Vector3 vec = new Vector3(throwForce.x * lastXDir, throwForce.y, throwForce.z * lastZDir);
|
||||
Vector3 vec = new Vector3(throwForce.x * lastXDir, throwForce.y + (throwForce.y * GetPitchRatioRange()), throwForce.z * lastZDir);
|
||||
if (itemScript.currCategory == ItemCategory.LIGHT)
|
||||
itemRidigBody.AddForce(vec * 0.2f);
|
||||
if (itemScript.currCategory == ItemCategory.MEDIUM)
|
||||
|
@ -254,5 +260,10 @@ public class PickAndThrow : Script
|
|||
return false;
|
||||
}
|
||||
|
||||
private float GetPitchRatioRange()
|
||||
{
|
||||
return (pc.camArm.Pitch - tpc.pitchUpperClamp) / (tpc.pitchLowerClamp - tpc.pitchUpperClamp);
|
||||
}
|
||||
|
||||
|
||||
}
|
|
@ -65,7 +65,7 @@ public class PlayerController : Script
|
|||
//Jumping vars==================================================================
|
||||
[Tooltip("max height of the jump")]
|
||||
public float maxJumpHeight = 1.0f;
|
||||
[Tooltip("max amt of time it will take for the jump")]
|
||||
[Tooltip("max amount of time it will take for the jump")]
|
||||
public float maxJumpTime = 0.5f;
|
||||
[Tooltip("increase gravity when falling")]
|
||||
public float fallMultipler = 3.0f;
|
||||
|
@ -73,6 +73,9 @@ public class PlayerController : Script
|
|||
private bool isGrounded = true;
|
||||
private float gravity = -9.8f;
|
||||
private float groundGravity = -0.5f;
|
||||
public bool landedOnJumpPad { get; set; }
|
||||
[Tooltip("multiply height on Jump Pad ")]
|
||||
public float jumpPadMultiplayer = 2.0f;
|
||||
|
||||
//ItemMultipler==================================================================
|
||||
[Tooltip("How light item will affect player jump")]
|
||||
|
@ -88,6 +91,7 @@ public class PlayerController : Script
|
|||
isMoveKeyPress = false;
|
||||
holdItem = false;
|
||||
isAiming = false;
|
||||
landedOnJumpPad = false;
|
||||
|
||||
//Jump setup
|
||||
float timeToApex = maxJumpTime / 2;
|
||||
|
@ -287,7 +291,7 @@ public class PlayerController : Script
|
|||
{
|
||||
if (currentState == RaccoonStates.WALKING || currentState == RaccoonStates.RUNNING || currentState == RaccoonStates.IDLE)
|
||||
{
|
||||
if (Input.GetKeyDown(Input.KeyCode.Space) && isGrounded && rb != null)
|
||||
if ( (Input.GetKeyDown(Input.KeyCode.Space) || landedOnJumpPad ) && isGrounded && rb != null)
|
||||
{
|
||||
currentState = RaccoonStates.JUMP;
|
||||
Vector3 v = rb.LinearVelocity;
|
||||
|
@ -302,6 +306,12 @@ public class PlayerController : Script
|
|||
if (item != null && item.currCategory == ItemCategory.HEAVY)
|
||||
v.y *= heavyMultiper;
|
||||
}
|
||||
|
||||
if (landedOnJumpPad)
|
||||
{
|
||||
v.y *= jumpPadMultiplayer;
|
||||
landedOnJumpPad = false;
|
||||
}
|
||||
rb.LinearVelocity = v;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -14,10 +14,10 @@ namespace SHADE_Scripting
|
|||
public float armLength = 2.0f;
|
||||
public float turnSpeedPitch = 0.3f;
|
||||
public float turnSpeedYaw = 0.5f;
|
||||
public float pitchClamp = 45.0f;
|
||||
public bool inverseXControls = false;
|
||||
public bool inverseYControls = false;
|
||||
public float lowerClamp = 5.0f;
|
||||
public float pitchUpperClamp = 45.0f;
|
||||
public float pitchLowerClamp = 5.0f;
|
||||
|
||||
protected override void awake()
|
||||
{
|
||||
|
@ -51,17 +51,17 @@ namespace SHADE_Scripting
|
|||
arm.Pitch += vel.y * turnSpeedPitch * Time.DeltaTimeF;
|
||||
|
||||
if (inverseXControls)
|
||||
arm.Yaw -= vel.x * turnSpeedYaw * Time.DeltaTimeF;
|
||||
else
|
||||
arm.Yaw += vel.x * turnSpeedYaw * Time.DeltaTimeF;
|
||||
else
|
||||
arm.Yaw -= vel.x * turnSpeedYaw * Time.DeltaTimeF;
|
||||
|
||||
if (arm.Pitch > pitchClamp)
|
||||
if (arm.Pitch > pitchUpperClamp)
|
||||
{
|
||||
arm.Pitch = pitchClamp;
|
||||
arm.Pitch = pitchUpperClamp;
|
||||
}
|
||||
else if (arm.Pitch < lowerClamp)
|
||||
else if (arm.Pitch < pitchLowerClamp)
|
||||
{
|
||||
arm.Pitch = lowerClamp;
|
||||
arm.Pitch = pitchLowerClamp;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
|
@ -38,6 +38,9 @@ public class GameManager : Script
|
|||
private Vector3 fontScalar;
|
||||
|
||||
public static GameManager Instance { get; private set; }
|
||||
//public static int highScore { get; private set; } maybe need
|
||||
|
||||
public bool GamePause { get; set; }
|
||||
|
||||
protected override void start()
|
||||
{
|
||||
|
@ -83,7 +86,11 @@ public class GameManager : Script
|
|||
|
||||
protected override void update()
|
||||
{
|
||||
Cheats();
|
||||
if (GamePause)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (currGameState == GameState.START)
|
||||
{
|
||||
timer -= Time.DeltaTimeF;
|
||||
|
@ -140,15 +147,6 @@ public class GameManager : Script
|
|||
Instance = null;
|
||||
}
|
||||
|
||||
private void Cheats()
|
||||
{
|
||||
if (Input.GetKeyDown(Input.KeyCode.Escape))
|
||||
{
|
||||
Audio.StopAllSounds();
|
||||
SceneManager.ChangeScene(97158628);
|
||||
}
|
||||
}
|
||||
|
||||
public void ItemScored()
|
||||
{
|
||||
totalItemCount -= 1;
|
||||
|
|
|
@ -0,0 +1,22 @@
|
|||
using SHADE;
|
||||
using System;
|
||||
|
||||
public class JumpPad : Script
|
||||
{
|
||||
protected override void awake()
|
||||
{
|
||||
}
|
||||
|
||||
protected override void update()
|
||||
{
|
||||
}
|
||||
|
||||
protected override void onCollisionEnter(CollisionInfo info)
|
||||
{
|
||||
if (info.GameObject.GetScript<PlayerController>() && info.GameObject.GetScript<PlayerController>().currentState == PlayerController.RaccoonStates.FALLING)
|
||||
{
|
||||
info.GameObject.GetScript<PlayerController>().landedOnJumpPad = true;
|
||||
}
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,3 @@
|
|||
Name: SC_JumpPad
|
||||
ID: 167326885
|
||||
Type: 9
|
|
@ -0,0 +1,106 @@
|
|||
using System;
|
||||
using SHADE;
|
||||
using SHADE_Scripting.Audio;
|
||||
|
||||
public class PauseMenu : Script
|
||||
{
|
||||
public GameObject resumeBtn;
|
||||
public GameObject retryBtn;
|
||||
public GameObject quitBtn;
|
||||
|
||||
public GameObject gamePauseText;
|
||||
public GameObject canvas;
|
||||
|
||||
protected override void awake()
|
||||
{
|
||||
GameManager.Instance.GamePause = false;
|
||||
if (gamePauseText)
|
||||
gamePauseText.GetComponent<TextRenderable>().Enabled = false;
|
||||
if (canvas)
|
||||
canvas.SetActive(false);
|
||||
|
||||
if (!resumeBtn)
|
||||
Debug.LogError("Resume Btn missing");
|
||||
|
||||
if (!retryBtn)
|
||||
Debug.LogError("Retry Btn missing");
|
||||
|
||||
if (!quitBtn)
|
||||
Debug.LogError("Quit Btn missing");
|
||||
}
|
||||
protected override void start()
|
||||
{
|
||||
//resume
|
||||
UIElement resume = resumeBtn.GetComponent<UIElement>();
|
||||
if (resume != null)
|
||||
{
|
||||
resume.OnClick.RegisterAction(() =>
|
||||
{
|
||||
if (GameManager.Instance.GamePause)
|
||||
{
|
||||
GameManager.Instance.GamePause = false;
|
||||
AudioHandler.pauseAllSounds(false);
|
||||
if (gamePauseText)
|
||||
gamePauseText.GetComponent<TextRenderable>().Enabled = false;
|
||||
if (canvas)
|
||||
canvas.SetActive(false);
|
||||
}
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("Failed to register resume button.");
|
||||
}
|
||||
|
||||
//retry
|
||||
UIElement retry = retryBtn.GetComponent<UIElement>();
|
||||
if (retry != null)
|
||||
{
|
||||
retry.OnClick.RegisterAction(() =>
|
||||
{
|
||||
Audio.StopAllSounds();
|
||||
//get curr scene
|
||||
//SceneManager.ChangeScene();
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("Failed to register retry button.");
|
||||
}
|
||||
|
||||
UIElement quit = quitBtn.GetComponent<UIElement>();
|
||||
if (quit != null)
|
||||
{
|
||||
quit.OnClick.RegisterAction(() =>
|
||||
{
|
||||
Audio.StopAllSounds();
|
||||
//go to main menu
|
||||
SceneManager.ChangeScene(97158628);
|
||||
});
|
||||
}
|
||||
else
|
||||
{
|
||||
Debug.LogError("Failed to register quit button.");
|
||||
}
|
||||
}
|
||||
|
||||
protected override void update()
|
||||
{
|
||||
if (GameManager.Instance.GamePause)
|
||||
{
|
||||
return;
|
||||
}
|
||||
|
||||
if (Input.GetKeyDown(Input.KeyCode.Escape) && !GameManager.Instance.GamePause)
|
||||
{
|
||||
GameManager.Instance.GamePause = true;
|
||||
AudioHandler.pauseAllSounds(true);
|
||||
if (gamePauseText)
|
||||
gamePauseText.GetComponent<TextRenderable>().Enabled = true;
|
||||
if (canvas)
|
||||
canvas.SetActive(true);
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
|
@ -0,0 +1,3 @@
|
|||
Name: SC_PauseMenu
|
||||
ID: 151952680
|
||||
Type: 9
|
|
@ -48,19 +48,34 @@ layout(std430, set = 1, binding = 4) buffer AmbientLightData
|
|||
AmbientLightStruct aLightData[];
|
||||
} AmbLightData;
|
||||
|
||||
float LinStep (float val, float low, float high)
|
||||
{
|
||||
return clamp ((val - low)/(high - low), 0.0f, 1.0f);
|
||||
}
|
||||
|
||||
float CalcShadowValue (sampler2D shadowMap, vec4 worldSpaceFragPos, mat4 lightPV)
|
||||
{
|
||||
// clip space for fragment from light view space
|
||||
vec4 fragPosLightPOV = lightPV * worldSpaceFragPos;
|
||||
|
||||
// Perform perspective division and convert to 0 to 1 range
|
||||
vec3 converted = (fragPosLightPOV.xyz / fragPosLightPOV.w) * vec3(0.5f) + vec3(0.5f);
|
||||
|
||||
float sampledDepth = texture(shadowMap, converted.xy).r;
|
||||
// float sampledDepth = texture(shadowMap, converted.xy).r;
|
||||
// float sampledDepth = texture(shadowMap, converted.xy).z;
|
||||
vec2 moments = texture(shadowMap, converted.xy).xy;
|
||||
|
||||
if (converted.x < 0.0f || converted.x > 1.0f || converted.y < 0.0f || converted.y > 1.0f)
|
||||
return 1.0f;
|
||||
|
||||
if (fragPosLightPOV.z > sampledDepth && fragPosLightPOV.w > 0.0f)
|
||||
if (fragPosLightPOV.z > moments.x && fragPosLightPOV.w > 0.0f)
|
||||
{
|
||||
return 0.7f;
|
||||
float p = step (fragPosLightPOV.z, moments.x);
|
||||
float variance = max (moments.y - (moments.x * moments.x), 0.00002f);
|
||||
|
||||
float d = fragPosLightPOV.z - moments.x;
|
||||
float pMax = LinStep (variance / (variance + (d * d)), 0.9f, 1.0f);
|
||||
return min (max (p, pMax), 1.0f);
|
||||
}
|
||||
else
|
||||
return 1.0f;
|
||||
|
|
Binary file not shown.
|
@ -3,8 +3,10 @@
|
|||
#extension GL_ARB_shading_language_420pack : enable
|
||||
#extension GL_EXT_nonuniform_qualifier : require
|
||||
|
||||
layout(location = 0) out vec4 shadowMap;
|
||||
|
||||
void main()
|
||||
{
|
||||
|
||||
// shadowMap = vec4 (0.0f, 0.0f, gl_FragCoord.z, 1.0f);
|
||||
shadowMap = vec4 (gl_FragCoord.z, gl_FragCoord.z * gl_FragCoord.z, 0.0f, 1.0f);
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,22 @@
|
|||
#version 450
|
||||
#extension GL_ARB_separate_shader_objects : enable
|
||||
#extension GL_ARB_shading_language_420pack : enable
|
||||
#extension GL_EXT_nonuniform_qualifier : require
|
||||
|
||||
|
||||
layout(location = 0) in struct
|
||||
{
|
||||
vec4 vertPos; // location 0
|
||||
vec2 uv; // location = 1
|
||||
vec4 color; // location = 2
|
||||
|
||||
} In;
|
||||
|
||||
layout(location = 0) out vec4 fragColor;
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
// default red first
|
||||
fragColor = In.color;
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
|||
Name: Trajectory_FS
|
||||
ID: 45635685
|
||||
Type: 2
|
|
@ -0,0 +1,36 @@
|
|||
#version 450
|
||||
#extension GL_KHR_vulkan_glsl : enable
|
||||
|
||||
// vertex inputs
|
||||
layout(location = 0) in vec3 aPos;
|
||||
layout(location = 1) in vec2 aUV;
|
||||
layout(location = 2) in vec4 aColor;
|
||||
layout(location = 3) in mat4 aTransform;
|
||||
|
||||
// between shader stages
|
||||
layout(location = 0) out struct
|
||||
{
|
||||
vec4 vertPos; // location 0
|
||||
vec2 uv; // location = 1
|
||||
vec4 color; // location = 2
|
||||
|
||||
} Out;
|
||||
|
||||
|
||||
// Camera data
|
||||
layout(set = 1, binding = 0) uniform CameraData
|
||||
{
|
||||
vec4 position;
|
||||
mat4 vpMat;
|
||||
mat4 viewMat;
|
||||
mat4 projMat;
|
||||
} cameraData;
|
||||
|
||||
|
||||
void main()
|
||||
{
|
||||
Out.uv = aUV;
|
||||
Out.color = aColor;
|
||||
|
||||
gl_Position = cameraData.projMat * aTransform * vec4(aPos, 1.0f);
|
||||
}
|
Binary file not shown.
|
@ -0,0 +1,3 @@
|
|||
Name: Trajectory_VS
|
||||
ID: 41042628
|
||||
Type: 2
|
|
@ -254,7 +254,8 @@ RTTR_REGISTRATION
|
|||
.property("Height", &SHCameraComponent::GetHeight, &SHCameraComponent::SetHeight)
|
||||
.property("Near", &SHCameraComponent::GetNear, &SHCameraComponent::SetNear)
|
||||
.property("Far", &SHCameraComponent::GetFar, &SHCameraComponent::SetFar)
|
||||
.property("Perspective", &SHCameraComponent::GetIsPerspective, &SHCameraComponent::SetIsPerspective);
|
||||
.property("Perspective", &SHCameraComponent::GetIsPerspective, &SHCameraComponent::SetIsPerspective)
|
||||
.property("FOV",&SHCameraComponent::GetFOV, &SHCameraComponent::SetFOV);
|
||||
|
||||
|
||||
}
|
||||
|
|
|
@ -12,6 +12,7 @@
|
|||
#include "Editor/SHEditor.h"
|
||||
#include "Math/SHRay.h"
|
||||
#include "Physics/System/SHPhysicsSystem.h"
|
||||
#include "Graphics/Events/SHGraphicsEvents.h"
|
||||
|
||||
|
||||
namespace SHADE
|
||||
|
@ -122,6 +123,13 @@ namespace SHADE
|
|||
|
||||
SHComponentManager::CreateComponentSparseSet<SHCameraComponent>();
|
||||
SHComponentManager::CreateComponentSparseSet<SHCameraArmComponent>();
|
||||
|
||||
std::shared_ptr<SHEventReceiverSpec<SHCameraSystem>> thisReceiver
|
||||
{
|
||||
std::make_shared<SHEventReceiverSpec<SHCameraSystem>>(this, &SHCameraSystem::ReceiveWindowResizeEvent)
|
||||
};
|
||||
ReceiverPtr receiver = std::dynamic_pointer_cast<SHEventReceiver>(thisReceiver);
|
||||
SHEventManager::SubscribeTo(SH_WINDOW_RESIZE_EVENT, receiver);
|
||||
|
||||
}
|
||||
|
||||
|
@ -130,6 +138,29 @@ namespace SHADE
|
|||
|
||||
}
|
||||
|
||||
SHEventHandle SHCameraSystem::ReceiveWindowResizeEvent(SHEventPtr eventPtr) noexcept
|
||||
{
|
||||
auto const& EVENT_DATA = reinterpret_cast<const SHEventSpec<SHWindowResizeEvent>*>(eventPtr.get())->data;
|
||||
|
||||
//std::cout << EVENT_DATA->resizeWidth << std::endl;
|
||||
//std::cout << EVENT_DATA->resizeHeight << std::endl;
|
||||
|
||||
|
||||
for (auto director : directorHandleList)
|
||||
{
|
||||
auto camera = SHComponentManager::GetComponent_s<SHCameraComponent>(director->mainCameraEID);
|
||||
if (camera)
|
||||
{
|
||||
camera->SetWidth(EVENT_DATA->resizeWidth);
|
||||
camera->SetHeight(EVENT_DATA->resizeHeight);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
|
||||
return eventPtr->handle;
|
||||
}
|
||||
|
||||
SHCameraComponent* SHCameraSystem::GetEditorCamera(void) noexcept
|
||||
{
|
||||
return &editorCamera;
|
||||
|
@ -204,8 +235,8 @@ namespace SHADE
|
|||
//SHLOG_INFO("CAMERA COLLISION HIT, {} armlength: {}, true armlength: {}", hitResult.distance, hitResult.distance, (cameraPos - camera->position).Length());
|
||||
//SHLOG_INFO("Racoon Position {}, {}, {}, Camera Position: {}, {}, {}, Distance {}", cameraTarget.x, cameraTarget.y, cameraTarget.z, cameraPos.x, cameraPos.y, cameraPos.z, SHVec3::Distance(cameraTarget, cameraPos));
|
||||
//SHLOG_INFO("Camera Position: {}, {}, {}", cameraPos.x, cameraPos.y, cameraPos.z);
|
||||
auto otherTransform = SHComponentManager::GetComponent_s<SHTransformComponent>(hitResult.entityHit);
|
||||
SHVec3 otherPos = hitResult.position;
|
||||
//auto otherTransform = SHComponentManager::GetComponent_s<SHTransformComponent>(hitResult.entityHit);
|
||||
//SHVec3 otherPos = hitResult.position;
|
||||
|
||||
|
||||
|
||||
|
@ -265,7 +296,7 @@ namespace SHADE
|
|||
{
|
||||
camera.offset = arm->GetOffset();
|
||||
if (arm->lookAtCameraOrigin)
|
||||
CameraLookAt(camera, camera.position);
|
||||
CameraLookAt(camera, camera.position + arm->GetTargetOffset());
|
||||
|
||||
}
|
||||
|
||||
|
|
|
@ -46,6 +46,11 @@ namespace SHADE
|
|||
};
|
||||
friend class CameraSystemUpdate;
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* Light functions */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
SHEventHandle ReceiveWindowResizeEvent(SHEventPtr eventPtr) noexcept;
|
||||
|
||||
|
||||
SHCameraComponent* GetEditorCamera (void) noexcept;
|
||||
void GetCameraAxis(SHCameraComponent const& camera, SHVec3& forward, SHVec3& right, SHVec3& up) const noexcept;
|
||||
|
|
|
@ -25,4 +25,8 @@ constexpr SHEventIdentifier SH_SCENE_EXIT_POST { 16 };
|
|||
constexpr SHEventIdentifier SH_GRAPHICS_LIGHT_ENABLE_SHADOW_EVENT { 17 };
|
||||
constexpr SHEventIdentifier SH_BUTTON_CLICK_EVENT { 18 };
|
||||
constexpr SHEventIdentifier SH_PHYSICS_COLLIDER_DRAW_EVENT { 19 };
|
||||
constexpr SHEventIdentifier SH_WINDOW_RESIZE_EVENT { 20 };
|
||||
constexpr SHEventIdentifier SH_BUTTON_RELEASE_EVENT { 21 };
|
||||
constexpr SHEventIdentifier SH_BUTTON_HOVER_ENTER_EVENT { 22 };
|
||||
constexpr SHEventIdentifier SH_BUTTON_HOVER_EXIT_EVENT { 23 };
|
||||
|
||||
|
|
|
@ -14,4 +14,13 @@ namespace SHADE
|
|||
//! Generate a renderer for the light component
|
||||
bool generateRenderer;
|
||||
};
|
||||
|
||||
struct SHWindowResizeEvent
|
||||
{
|
||||
// New width when window resizes
|
||||
uint32_t resizeWidth;
|
||||
|
||||
// New height when window resizes
|
||||
uint32_t resizeHeight;
|
||||
};
|
||||
}
|
||||
|
|
|
@ -52,6 +52,12 @@ namespace SHADE
|
|||
{SHPredefinedDescriptorTypes::RENDER_GRAPH_RESOURCE, 3},
|
||||
{SHPredefinedDescriptorTypes::RENDER_GRAPH_NODE_COMPUTE_RESOURCE, 4},
|
||||
});
|
||||
|
||||
perSystemData[SHUtilities::ConvertEnum(SystemType::TRAJECTORY_RENDERING)].descMappings.AddMappings
|
||||
({
|
||||
{SHPredefinedDescriptorTypes::STATIC_DATA, 0},
|
||||
{SHPredefinedDescriptorTypes::CAMERA, 1},
|
||||
});
|
||||
}
|
||||
|
||||
void SHGraphicsPredefinedData::InitDummyPipelineLayouts(Handle<SHVkLogicalDevice> logicalDevice) noexcept
|
||||
|
@ -222,6 +228,12 @@ namespace SHADE
|
|||
SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::CAMERA |
|
||||
SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::LIGHTS
|
||||
);
|
||||
|
||||
perSystemData[SHUtilities::ConvertEnum(SystemType::TRAJECTORY_RENDERING)].descSetLayouts = GetPredefinedDescSetLayouts
|
||||
(
|
||||
SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::STATIC_DATA |
|
||||
SHGraphicsPredefinedData::PredefinedDescSetLayoutTypes::CAMERA
|
||||
);
|
||||
}
|
||||
|
||||
void SHGraphicsPredefinedData::InitPredefinedVertexInputState(void) noexcept
|
||||
|
|
|
@ -38,6 +38,7 @@ namespace SHADE
|
|||
BATCHING_ANIM,
|
||||
TEXT_RENDERING,
|
||||
RENDER_GRAPH_NODE_COMPUTE,
|
||||
TRAJECTORY_RENDERING,
|
||||
NUM_TYPES
|
||||
};
|
||||
static constexpr int SYSTEM_TYPE_COUNT = static_cast<int>(SystemType::NUM_TYPES);
|
||||
|
|
|
@ -64,6 +64,17 @@ namespace SHADE
|
|||
/***************************************************************************/
|
||||
static constexpr std::string_view DEFERRED_COMPOSITE_PASS = "Deferred Comp Pass";
|
||||
|
||||
/***************************************************************************/
|
||||
/*!
|
||||
|
||||
\brief
|
||||
Name of vfx render graph node.
|
||||
|
||||
*/
|
||||
/***************************************************************************/
|
||||
static constexpr std::string_view VFX_PASS = "Vfx Pass";
|
||||
|
||||
|
||||
/***************************************************************************/
|
||||
/*!
|
||||
|
||||
|
@ -117,6 +128,7 @@ namespace SHADE
|
|||
|
||||
static constexpr std::string_view GBUFFER_WRITE_SUBPASS = "G-Buffer Write";
|
||||
static constexpr std::string_view UI_SUBPASS = "UI";
|
||||
static constexpr std::string_view VFX_SUBPASS = "VFX";
|
||||
|
||||
static constexpr std::array USABLE_SUBPASSES =
|
||||
{
|
||||
|
@ -282,6 +294,13 @@ namespace SHADE
|
|||
*/
|
||||
/***************************************************************************/
|
||||
static constexpr uint32_t BONE_MATRIX_FIRST_INDEX = 8;
|
||||
/***************************************************************************/
|
||||
/*!
|
||||
\brief
|
||||
Vertex buffer bindings for color
|
||||
*/
|
||||
/***************************************************************************/
|
||||
static constexpr uint32_t TRAJECTORY_COLOR = 2;
|
||||
|
||||
static constexpr uint32_t CALCULATED_GLYPH_POSITION = 0;
|
||||
static constexpr uint32_t GLYPH_INDEX = 1;
|
||||
|
|
|
@ -129,6 +129,7 @@ namespace SHADE
|
|||
|
||||
//SHAssetManager::CompileAsset("../../Assets/Shaders/DeferredComposite_CS.glsl", false);
|
||||
//SHAssetManager::CompileAsset("../../Assets/Shaders/ShadowMap_FS.glsl", false);
|
||||
//SHAssetManager::CompileAsset("../../Assets/Shaders/ShadowMap_FS.glsl", false);
|
||||
//SHAssetManager::CompileAsset("../../Assets/Shaders/SSAO_CS.glsl", false);
|
||||
//SHAssetManager::CompileAsset("../../Assets/Shaders/SSAOBlur_CS.glsl", false);
|
||||
//SHAssetManager::CompileAsset("../../Assets/Shaders/PureCopy_CS.glsl", false);
|
||||
|
@ -137,7 +138,8 @@ namespace SHADE
|
|||
//SHAssetManager::CompileAsset("../../Assets/Shaders/UI_VS.glsl", false);
|
||||
//SHAssetManager::CompileAsset("../../Assets/Shaders/UI_FS.glsl", false);
|
||||
//SHAssetManager::CompileAsset("../../Assets/Shaders/Text_VS.glsl", false);
|
||||
|
||||
//SHAssetManager::CompileAsset("../../Assets/Shaders/Trajectory_VS.glsl", false);
|
||||
//SHAssetManager::CompileAsset("../../Assets/Shaders/Trajectory_FS.glsl", false);
|
||||
|
||||
// Load Built In Shaders
|
||||
static constexpr AssetID VS_DEFAULT = 39210065; defaultVertShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(VS_DEFAULT);
|
||||
|
@ -153,8 +155,10 @@ namespace SHADE
|
|||
static constexpr AssetID TEXT_FS = 38024754; textFS = SHResourceManager::LoadOrGet<SHVkShaderModule>(TEXT_FS);
|
||||
static constexpr AssetID RENDER_SC_VS = 48082949; renderToSwapchainVS = SHResourceManager::LoadOrGet<SHVkShaderModule>(RENDER_SC_VS);
|
||||
static constexpr AssetID RENDER_SC_FS = 36869006; renderToSwapchainFS = SHResourceManager::LoadOrGet<SHVkShaderModule>(RENDER_SC_FS);
|
||||
static constexpr AssetID SHADOW_MAP_VS = 44646107; shadowMapVS = SHResourceManager::LoadOrGet<SHVkShaderModule>(SHADOW_MAP_VS);
|
||||
static constexpr AssetID SHADOW_MAP_FS = 45925790; shadowMapFS = SHResourceManager::LoadOrGet<SHVkShaderModule>(SHADOW_MAP_FS);
|
||||
static constexpr AssetID SHADOW_MAP_VS = 44646107; shadowMapVS = SHResourceManager::LoadOrGet<SHVkShaderModule>(SHADOW_MAP_VS);
|
||||
static constexpr AssetID SHADOW_MAP_FS = 45925790; shadowMapFS = SHResourceManager::LoadOrGet<SHVkShaderModule>(SHADOW_MAP_FS);
|
||||
static constexpr AssetID TRAJECTORY_VS = 41042628; trajectoryVS = SHResourceManager::LoadOrGet<SHVkShaderModule>(TRAJECTORY_VS);
|
||||
static constexpr AssetID TRAJECTORY_FS = 45635685; trajectoryFS = SHResourceManager::LoadOrGet<SHVkShaderModule>(TRAJECTORY_FS);
|
||||
|
||||
}
|
||||
|
||||
|
@ -307,13 +311,24 @@ namespace SHADE
|
|||
lightingSubSystem->PrepareShadowMapsForRead(cmdBuffer);
|
||||
});
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* VFX PASS */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
auto vfxPass = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::VFX_PASS.data(), { "Scene", "Depth Buffer" }, { SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data() });
|
||||
auto vfxSubpass = vfxPass->AddSubpass("Vfx Subpass", worldViewport, worldRenderer);
|
||||
vfxSubpass->AddColorOutput("Scene");
|
||||
vfxSubpass->AddDepthOutput("Depth Buffer");
|
||||
vfxSubpass->AddExteriorDrawCalls([=](Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHRenderer> renderer, uint32_t frameIndex)
|
||||
{
|
||||
trajectoryRenderingSubSystem->Render(cmdBuffer, renderer, frameIndex);
|
||||
});
|
||||
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* DEBUG DRAW PASS INIT */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
// Set up Debug Draw Passes
|
||||
// - Depth Tested
|
||||
auto debugDrawNodeDepth = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW_DEPTH_PASS.data(), {"Scene", "Depth Buffer"}, {SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data(), SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data()});
|
||||
auto debugDrawNodeDepth = renderGraph->AddNode(SHGraphicsConstants::RenderGraphEntityNames::DEBUG_DRAW_DEPTH_PASS.data(), {"Scene", "Depth Buffer"}, { SHGraphicsConstants::RenderGraphEntityNames::VFX_PASS.data()/*, SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data()*/});
|
||||
auto debugDrawDepthSubpass = debugDrawNodeDepth->AddSubpass("Debug Draw with Depth", worldViewport, worldRenderer);
|
||||
debugDrawDepthSubpass->AddColorOutput("Scene");
|
||||
debugDrawDepthSubpass->AddDepthOutput("Depth Buffer");
|
||||
|
@ -432,6 +447,11 @@ namespace SHADE
|
|||
auto uiNode = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data());
|
||||
textRenderingSubSystem->Init(device, uiNode->GetRenderpass(), uiNode->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::UI_SUBPASS), descPool, textVS, textFS);
|
||||
|
||||
trajectoryRenderingSubSystem = resourceManager.Create<SHTrajectoryRenderingSubSystem>();
|
||||
|
||||
auto vfxNode = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::SCREEN_SPACE_PASS.data());
|
||||
trajectoryRenderingSubSystem->Init(device, vfxNode->GetRenderpass(), vfxNode->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::UI_SUBPASS), trajectoryVS, trajectoryFS);
|
||||
|
||||
SHGlobalDescriptorSets::SetLightingSubSystem(lightingSubSystem);
|
||||
|
||||
}
|
||||
|
@ -566,6 +586,7 @@ namespace SHADE
|
|||
}
|
||||
|
||||
textRenderingSubSystem->Run(frameIndex);
|
||||
trajectoryRenderingSubSystem->Run(frameIndex);
|
||||
|
||||
|
||||
for (auto renderer : renderers)
|
||||
|
@ -588,19 +609,19 @@ namespace SHADE
|
|||
|
||||
static bool shadowAdded = false;
|
||||
|
||||
if (shadowAdded == false/* && SHInputManager::GetKey(SHInputManager::SH_KEYCODE::B)*/)
|
||||
{
|
||||
shadowAdded = true;
|
||||
auto& lightComps = SHComponentManager::GetDense<SHLightComponent>();
|
||||
if (lightComps.size() > 2)
|
||||
{
|
||||
lightComps[2].SetEnableShadow(true);
|
||||
}
|
||||
//for (auto& comp : lightComps)
|
||||
//{
|
||||
// comp.SetEnableShadow(true);
|
||||
//}
|
||||
}
|
||||
//if (shadowAdded == false && SHInputManager::GetKey(SHInputManager::SH_KEYCODE::B))
|
||||
//{
|
||||
// shadowAdded = true;
|
||||
// auto& lightComps = SHComponentManager::GetDense<SHLightComponent>();
|
||||
// //if (lightComps.size() > 2)
|
||||
// //{
|
||||
// // lightComps[2].SetEnableShadow(true);
|
||||
// //}
|
||||
// for (auto& comp : lightComps)
|
||||
// {
|
||||
// comp.SetEnableShadow(true);
|
||||
// }
|
||||
//}
|
||||
|
||||
renderGraph->Begin(frameIndex);
|
||||
auto cmdBuffer = renderGraph->GetCommandBuffer(frameIndex);
|
||||
|
@ -779,10 +800,11 @@ namespace SHADE
|
|||
// we need to wait for the device to finish using the graph first
|
||||
device->WaitIdle();
|
||||
|
||||
auto const& EVENT_DATA = reinterpret_cast<const SHEventSpec<SHLightEnableShadowEvent>*>(eventPtr.get())->data;
|
||||
auto* lightComp = SHComponentManager::GetComponent<SHLightComponent>(EVENT_DATA->lightEntity);
|
||||
std::string resourceName = "ShadowMap " + std::to_string(EVENT_DATA->lightEntity);
|
||||
Handle<SHSubpass> companionSubpass = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS);
|
||||
auto const& EVENT_DATA = reinterpret_cast<const SHEventSpec<SHLightEnableShadowEvent>*>(eventPtr.get())->data;
|
||||
auto* lightComp = SHComponentManager::GetComponent<SHLightComponent>(EVENT_DATA->lightEntity);
|
||||
std::string depthResourceName = "ShadowMap_Depth " + std::to_string(EVENT_DATA->lightEntity);
|
||||
std::string shadowMapResourceName = "ShadowMap " + std::to_string(EVENT_DATA->lightEntity);
|
||||
Handle<SHSubpass> companionSubpass = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data())->GetSubpass(SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_WRITE_SUBPASS);
|
||||
|
||||
if (EVENT_DATA->generateRenderer)
|
||||
{
|
||||
|
@ -795,14 +817,16 @@ namespace SHADE
|
|||
}
|
||||
|
||||
// Add the shadow map resource to the graph
|
||||
renderGraph->AddResource(resourceName, {SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT}, false, SHLightingSubSystem::SHADOW_MAP_WIDTH, SHLightingSubSystem::SHADOW_MAP_HEIGHT, vk::Format::eD32Sfloat);
|
||||
renderGraph->AddResource(depthResourceName, {SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH}, false, SHLightingSubSystem::SHADOW_MAP_WIDTH, SHLightingSubSystem::SHADOW_MAP_HEIGHT, vk::Format::eD32Sfloat);
|
||||
renderGraph->AddResource(shadowMapResourceName, { SH_RENDER_GRAPH_RESOURCE_FLAGS::COLOR, SH_RENDER_GRAPH_RESOURCE_FLAGS::INPUT }, false, SHLightingSubSystem::SHADOW_MAP_WIDTH, SHLightingSubSystem::SHADOW_MAP_HEIGHT, vk::Format::eR32G32B32A32Sfloat);
|
||||
|
||||
// link resource to node. This means linking the resource and regenerating the node's renderpass and framebuffer.
|
||||
auto shadowMapNode = renderGraph->AddNodeAfter(SHGraphicsConstants::RenderGraphEntityNames::SHADOW_MAP_PASS.data() + resourceName, {resourceName.c_str()}, SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data());
|
||||
auto shadowMapNode = renderGraph->AddNodeAfter(SHGraphicsConstants::RenderGraphEntityNames::SHADOW_MAP_PASS.data() + shadowMapResourceName, {depthResourceName.c_str(), shadowMapResourceName.c_str()}, SHGraphicsConstants::RenderGraphEntityNames::GBUFFER_PASS.data());
|
||||
|
||||
// Add a subpass to render to that shadow map
|
||||
auto newSubpass = shadowMapNode->RuntimeAddSubpass(resourceName + " Subpass", shadowMapViewport, lightComp->GetRenderer());
|
||||
newSubpass->AddDepthOutput(resourceName, SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH);
|
||||
auto newSubpass = shadowMapNode->RuntimeAddSubpass(shadowMapResourceName + " Subpass", shadowMapViewport, lightComp->GetRenderer());
|
||||
newSubpass->AddColorOutput(shadowMapResourceName);
|
||||
newSubpass->AddDepthOutput(depthResourceName, SH_RENDER_GRAPH_RESOURCE_FLAGS::DEPTH);
|
||||
|
||||
// regenerate the node
|
||||
shadowMapNode->RuntimeStandaloneRegenerate();
|
||||
|
@ -828,7 +852,7 @@ namespace SHADE
|
|||
newSubpass->SetCompanionSubpass(companionSubpass, shadowMapPipeline); // set companion subpass and pipeline
|
||||
|
||||
// add the shadow map to the lighting system
|
||||
uint32_t const NEW_SHADOW_MAP_INDEX = lightingSubSystem->AddShadowMap(renderGraph->GetRenderGraphResource(resourceName), EVENT_DATA->lightEntity);
|
||||
uint32_t const NEW_SHADOW_MAP_INDEX = lightingSubSystem->AddShadowMap(renderGraph->GetRenderGraphResource(shadowMapResourceName), EVENT_DATA->lightEntity);
|
||||
|
||||
auto nodeCompute = renderGraph->GetNode(SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_PASS.data())->GetNodeCompute(SHGraphicsConstants::RenderGraphEntityNames::DEFERRED_COMPOSITE_COMPUTE.data());
|
||||
nodeCompute->ModifyWriteDescImageComputeResource(SHGraphicsConstants::DescriptorSetBindings::SHADOW_MAP_IMAGE_SAMPLER_DATA, lightingSubSystem->GetViewSamplerLayout(NEW_SHADOW_MAP_INDEX), NEW_SHADOW_MAP_INDEX);
|
||||
|
@ -1154,6 +1178,14 @@ namespace SHADE
|
|||
#ifdef SHEDITOR
|
||||
cameraSystem->GetEditorCamera()->SetWidth(static_cast<float>(resizeWidth));
|
||||
cameraSystem->GetEditorCamera()->SetHeight(static_cast<float>(resizeHeight));
|
||||
|
||||
// Create new event and broadcast it
|
||||
SHWindowResizeEvent newEvent;
|
||||
newEvent.resizeWidth = resizeWidth;
|
||||
newEvent.resizeHeight = resizeHeight;
|
||||
|
||||
SHEventManager::BroadcastEvent<SHWindowResizeEvent>(newEvent, SH_WINDOW_RESIZE_EVENT);
|
||||
|
||||
#else
|
||||
|
||||
#endif
|
||||
|
|
|
@ -36,6 +36,7 @@ of DigiPen Institute of Technology is prohibited.
|
|||
#include "Graphics/MiddleEnd/TextRendering/SHFontLibrary.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHRenderer.h"
|
||||
#include "Graphics/Events/SHGraphicsEvents.h"
|
||||
#include "Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderingSubSystem.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -470,6 +471,8 @@ namespace SHADE
|
|||
Handle<SHVkShaderModule> renderToSwapchainFS;
|
||||
Handle<SHVkShaderModule> shadowMapVS;
|
||||
Handle<SHVkShaderModule> shadowMapFS;
|
||||
Handle<SHVkShaderModule> trajectoryVS;
|
||||
Handle<SHVkShaderModule> trajectoryFS;
|
||||
|
||||
// Fonts
|
||||
Handle<SHFont> testFont;
|
||||
|
@ -505,6 +508,7 @@ namespace SHADE
|
|||
Handle<SHPostOffscreenRenderSystem> postOffscreenRenderSubSystem;
|
||||
Handle<SHLightingSubSystem> lightingSubSystem;
|
||||
Handle<SHTextRenderingSubSystem> textRenderingSubSystem;
|
||||
Handle<SHTrajectoryRenderingSubSystem> trajectoryRenderingSubSystem;
|
||||
Handle<SHSSAO> ssaoStorage;
|
||||
|
||||
uint32_t resizeWidth = 1;
|
||||
|
|
|
@ -395,7 +395,11 @@ namespace SHADE
|
|||
switch (lightComp->GetLightData().type)
|
||||
{
|
||||
case SH_LIGHT_TYPE::DIRECTIONAL:
|
||||
return SHMatrix::Transpose(SHMatrix::LookAtLH(lightComp->GetLightData().position, SHVec3::Normalise (lightComp->GetLightData().direction), SHVec3(0.0f, -1.0f, 0.0f)));
|
||||
{
|
||||
SHTransformComponent* transform = SHComponentManager::GetComponent<SHTransformComponent>(lightComp->GetEID());
|
||||
|
||||
return SHMatrix::Transpose(SHMatrix::LookAtLH(transform->GetWorldPosition(), SHVec3::Normalise(lightComp->GetLightData().direction), SHVec3(0.0f, -1.0f, 0.0f)));
|
||||
}
|
||||
//return SHMatrix::Transpose(SHMatrix::LookAtLH(/*lightComp->GetLightData().position*/SHVec3(1.27862f, 4.78952f, 4.12811f), SHVec3(-0.280564f, -0.66262f, -0.69422f), SHVec3(0.0f, -1.0f, 0.0f)));
|
||||
case SH_LIGHT_TYPE::POINT:
|
||||
return {};
|
||||
|
@ -518,7 +522,7 @@ namespace SHADE
|
|||
if (auto renderer = light.GetRenderer())
|
||||
{
|
||||
//SHMatrix orthoMatrix = SHMatrix::OrthographicRH()
|
||||
renderer->UpdateDataManual(frameIndex, GetViewMatrix(&light), SHMatrix::OrthographicLH(10.0f, 10.0f, 1.0f, 50.0f));
|
||||
renderer->UpdateDataManual(frameIndex, GetViewMatrix(&light), SHMatrix::OrthographicLH(12.0f, 12.0f, 1.0f, 80.0f));
|
||||
}
|
||||
|
||||
auto enumValue = SHUtilities::ConvertEnum(light.GetLightData().type);
|
||||
|
@ -627,16 +631,16 @@ namespace SHADE
|
|||
// add to barriers
|
||||
shadowMapMemoryBarriers.push_back (vk::ImageMemoryBarrier
|
||||
{
|
||||
.srcAccessMask = vk::AccessFlagBits::eDepthStencilAttachmentWrite,
|
||||
.srcAccessMask = vk::AccessFlagBits::eColorAttachmentWrite | vk::AccessFlagBits::eColorAttachmentRead,
|
||||
.dstAccessMask = vk::AccessFlagBits::eShaderRead,
|
||||
.oldLayout = vk::ImageLayout::eDepthAttachmentOptimal,
|
||||
.oldLayout = vk::ImageLayout::eColorAttachmentOptimal,
|
||||
.newLayout = vk::ImageLayout::eShaderReadOnlyOptimal,
|
||||
.srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
.dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED,
|
||||
.image = newShadowMap->GetImage()->GetVkImage(),
|
||||
.subresourceRange = vk::ImageSubresourceRange
|
||||
{
|
||||
.aspectMask = vk::ImageAspectFlagBits::eDepth,
|
||||
.aspectMask = vk::ImageAspectFlagBits::eColor,
|
||||
.baseMipLevel = 0,
|
||||
.levelCount = 1,
|
||||
.baseArrayLayer = 0,
|
||||
|
@ -651,7 +655,7 @@ namespace SHADE
|
|||
void SHLightingSubSystem::PrepareShadowMapsForRead(Handle<SHVkCommandBuffer> cmdBuffer) noexcept
|
||||
{
|
||||
// Issue barrier to transition shadow maps for reading in compute shader
|
||||
cmdBuffer->PipelineBarrier(vk::PipelineStageFlagBits::eEarlyFragmentTests | vk::PipelineStageFlagBits::eLateFragmentTests, vk::PipelineStageFlagBits::eComputeShader, {}, {}, {}, shadowMapMemoryBarriers);
|
||||
cmdBuffer->PipelineBarrier(vk::PipelineStageFlagBits::eColorAttachmentOutput, vk::PipelineStageFlagBits::eComputeShader, {}, {}, {}, shadowMapMemoryBarriers);
|
||||
}
|
||||
|
||||
//void SHLightingSubSystem::HandleResize(Handle<SHRenderGraphNodeCompute> compute) noexcept
|
||||
|
|
|
@ -0,0 +1,41 @@
|
|||
#pragma once
|
||||
|
||||
#include "Resource/SHHandle.h"
|
||||
#include "Graphics/Pipeline/SHPipelineState.h"
|
||||
#include "Math/SHMatrix.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
class SHVkLogicalDevice;
|
||||
class SHVkDescriptorPool;
|
||||
class SHVkDescriptorSetGroup;
|
||||
class SHVkDescriptorSetLayout;
|
||||
class SHVkBuffer;
|
||||
class SHLightComponent;
|
||||
class SHVkCommandBuffer;
|
||||
class SHVkPipeline;
|
||||
class SHVkPipelineLayout;
|
||||
class SHVkRenderpass;
|
||||
class SHSubpass;
|
||||
class SHVkShaderModule;
|
||||
class SHRenderer;
|
||||
|
||||
|
||||
|
||||
class SHParticleSubSystem
|
||||
{
|
||||
private:
|
||||
|
||||
Handle<SHVkLogicalDevice> logicalDevice;
|
||||
|
||||
|
||||
public:
|
||||
void Init(Handle<SHVkLogicalDevice> device, Handle<SHVkRenderpass> compatibleRenderpass, Handle<SHSubpass> subpass) noexcept;
|
||||
|
||||
void Run(uint32_t frameIndex) noexcept;
|
||||
|
||||
void Render(Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHRenderer> renderer, uint32_t frameIndex) noexcept;
|
||||
void Exit(void) noexcept;
|
||||
|
||||
};
|
||||
}
|
|
@ -0,0 +1,7 @@
|
|||
#include "SHpch.h"
|
||||
#include "SHParticleSubSustem.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
||||
}
|
|
@ -13,6 +13,7 @@
|
|||
#include "Math/Transform/SHTransformComponent.h"
|
||||
#include "Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHRenderer.h"
|
||||
#include "Scene/SHSceneManager.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
@ -184,6 +185,9 @@ namespace SHADE
|
|||
|
||||
for (auto& comp : textRendererComps)
|
||||
{
|
||||
if (!SHSceneManager::CheckNodeAndComponentsActive<SHTextRenderableComponent>(comp.GetEID()))
|
||||
continue;
|
||||
|
||||
auto* transform = SHComponentManager::GetComponent<SHTransformComponent>(comp.GetEID());
|
||||
|
||||
Handle<SHFont> fontHandle = comp.fontHandle;
|
||||
|
|
|
@ -0,0 +1,96 @@
|
|||
#include "SHpch.h"
|
||||
#include "SHTrajectoryRenderableComponent.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
||||
/***************************************************************************/
|
||||
/*!
|
||||
|
||||
\brief
|
||||
On create the text has nothing.
|
||||
|
||||
*/
|
||||
/***************************************************************************/
|
||||
void SHTrajectoryRenderableComponent::OnCreate(void)
|
||||
{
|
||||
}
|
||||
|
||||
void SHTrajectoryRenderableComponent::OnDestroy(void)
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SHTrajectoryRenderableComponent::ClearPositions(void) noexcept
|
||||
{
|
||||
positions.clear();
|
||||
}
|
||||
|
||||
bool SHTrajectoryRenderableComponent::HasPositions(void) const noexcept
|
||||
{
|
||||
return !positions.empty();
|
||||
}
|
||||
|
||||
std::vector<SHVec3> SHTrajectoryRenderableComponent::GetPositions(void) const noexcept
|
||||
{
|
||||
return positions;
|
||||
}
|
||||
|
||||
Handle<SHMesh> SHTrajectoryRenderableComponent::GetMesh(void) const noexcept
|
||||
{
|
||||
return mesh;
|
||||
}
|
||||
|
||||
SHVec4 const& SHTrajectoryRenderableComponent::GetStartColor(void) const noexcept
|
||||
{
|
||||
return startColor;
|
||||
}
|
||||
|
||||
SHVec4 const& SHTrajectoryRenderableComponent::GetEndColor(void) const noexcept
|
||||
{
|
||||
return endColor;
|
||||
}
|
||||
|
||||
float SHTrajectoryRenderableComponent::GetColorEvolveRate(void) const noexcept
|
||||
{
|
||||
return colorEvolveRate;
|
||||
}
|
||||
|
||||
void SHTrajectoryRenderableComponent::SetMesh(Handle<SHMesh> newMesh) noexcept
|
||||
{
|
||||
mesh = newMesh;
|
||||
}
|
||||
|
||||
void SHTrajectoryRenderableComponent::SetPositions(std::vector<SHVec3> const& inPositions) noexcept
|
||||
{
|
||||
positions = inPositions;
|
||||
}
|
||||
|
||||
void SHTrajectoryRenderableComponent::SetStartColor(SHVec4 color) noexcept
|
||||
{
|
||||
startColor = color;
|
||||
}
|
||||
|
||||
void SHTrajectoryRenderableComponent::SetEndColor(SHVec4 color) noexcept
|
||||
{
|
||||
endColor = color;
|
||||
|
||||
}
|
||||
|
||||
void SHTrajectoryRenderableComponent::SetColorEvolveRate(float rate) noexcept
|
||||
{
|
||||
colorEvolveRate = rate;
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
namespace rttr
|
||||
{
|
||||
RTTR_REGISTRATION
|
||||
{
|
||||
using namespace SHADE;
|
||||
|
||||
registration::class_<SHTrajectoryRenderableComponent>("Trajectory Renderer Component");
|
||||
};
|
||||
}
|
|
@ -0,0 +1,58 @@
|
|||
#pragma once
|
||||
|
||||
#include "Math/Vector/SHVec3.h"
|
||||
#include "Math/Vector/SHVec4.h"
|
||||
#include "Resource/SHHandle.h"
|
||||
#include "ECS_Base/Components/SHComponent.h"
|
||||
#include <rttr/registration>
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
class SHMesh;
|
||||
|
||||
class SHTrajectoryRenderableComponent : public SHComponent
|
||||
{
|
||||
private:
|
||||
|
||||
//! Mesh used to render the trajectory
|
||||
Handle<SHMesh> mesh;
|
||||
|
||||
//! positions to plot for rendering. Will be cleared every frame.
|
||||
std::vector<SHVec3> positions;
|
||||
|
||||
//! Starting color of the trajectory
|
||||
SHVec4 startColor;
|
||||
|
||||
//! Color the trajectory should evolve to the longer it is
|
||||
SHVec4 endColor;
|
||||
|
||||
//! evolving rate of the color
|
||||
float colorEvolveRate;
|
||||
|
||||
public:
|
||||
/*-----------------------------------------------------------------------*/
|
||||
/* PRIVATE MEMBER FUNCTIONS */
|
||||
/*-----------------------------------------------------------------------*/
|
||||
void SetMesh(Handle<SHMesh> newMesh) noexcept;
|
||||
void SetPositions (std::vector<SHVec3> const& inPositions) noexcept;
|
||||
void SetStartColor(SHVec4 startColor) noexcept;
|
||||
void SetEndColor (SHVec4 endColor) noexcept;
|
||||
void SetColorEvolveRate (float rate) noexcept;
|
||||
|
||||
std::vector<SHVec3> GetPositions (void) const noexcept;
|
||||
Handle<SHMesh> GetMesh (void) const noexcept;
|
||||
SHVec4 const& GetStartColor (void) const noexcept;
|
||||
SHVec4 const& GetEndColor (void) const noexcept;
|
||||
float GetColorEvolveRate (void) const noexcept;
|
||||
|
||||
void OnCreate(void) override final;
|
||||
void OnDestroy(void) override final;
|
||||
|
||||
void ClearPositions(void) noexcept;
|
||||
bool HasPositions(void) const noexcept;
|
||||
|
||||
|
||||
RTTR_ENABLE()
|
||||
|
||||
};
|
||||
}
|
|
@ -0,0 +1,191 @@
|
|||
#include "SHpch.h"
|
||||
#include "SHTrajectoryRenderingSubSystem.h"
|
||||
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||
#include "Graphics/MiddleEnd/TrajectoryRendering/SHTrajectoryRenderableComponent.h"
|
||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||
#include "Math/Transform/SHTransformComponent.h"
|
||||
#include "Graphics\MiddleEnd\Interface\SHMeshLibrary.h"
|
||||
#include "Graphics/SHVkUtil.h"
|
||||
#include "Graphics/MiddleEnd/GlobalData/SHGraphicsPredefinedData.h"
|
||||
#include "Graphics/Pipeline/SHVkPipeline.h"
|
||||
#include "Graphics/RenderGraph/SHSubpass.h"
|
||||
#include "Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.h"
|
||||
#include "Graphics/MiddleEnd/Interface/SHRenderer.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
|
||||
|
||||
void SHTrajectoryRenderingSubSystem::Init(Handle<SHVkLogicalDevice> device, Handle<SHVkRenderpass> compatibleRenderpass, Handle<SHSubpass> subpass, Handle<SHVkShaderModule> trajectoryVS, Handle<SHVkShaderModule> trajectoryFS) noexcept
|
||||
{
|
||||
logicalDevice = device;
|
||||
|
||||
SHComponentManager::CreateComponentSparseSet<SHTrajectoryRenderableComponent>();
|
||||
|
||||
// prepare pipeline layout params
|
||||
SHPipelineLayoutParams plParams
|
||||
{
|
||||
.shaderModules = {trajectoryVS, trajectoryFS},
|
||||
.predefinedDescSetLayouts = SHGraphicsPredefinedData::GetSystemData(SHGraphicsPredefinedData::SystemType::TRAJECTORY_RENDERING).descSetLayouts
|
||||
};
|
||||
|
||||
pipelineLayout = logicalDevice->CreatePipelineLayout(plParams);
|
||||
|
||||
// Create pipeline
|
||||
pipeline = logicalDevice->CreateGraphicsPipeline(pipelineLayout, nullptr, compatibleRenderpass, subpass);
|
||||
|
||||
// vertex input state of the pipeline
|
||||
SHVertexInputState vertexInputState;
|
||||
vertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_3D) }); // Attribute positions at binding 0
|
||||
vertexInputState.AddBinding(false, false, { SHVertexAttribute(SHAttribFormat::FLOAT_2D) }); // Attribute uv at binding 1
|
||||
vertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::FLOAT_4D) }); // Instanced attribute color at binding 2
|
||||
vertexInputState.AddBinding(true, true, { SHVertexAttribute(SHAttribFormat::MAT_4D) }); // Instanced Transform at binding 3 - 6 (4 slots)
|
||||
|
||||
pipeline->GetPipelineState().SetVertexInputState(vertexInputState);
|
||||
|
||||
SHColorBlendState colorBlendState{};
|
||||
colorBlendState.logic_op_enable = VK_FALSE;
|
||||
colorBlendState.logic_op = vk::LogicOp::eCopy;
|
||||
|
||||
|
||||
auto const& subpassColorReferences = subpass->GetColorAttachmentReferences();
|
||||
colorBlendState.attachments.reserve(static_cast<uint32_t>(subpassColorReferences.size()));
|
||||
|
||||
for (auto& att : subpassColorReferences)
|
||||
{
|
||||
colorBlendState.attachments.push_back(vk::PipelineColorBlendAttachmentState
|
||||
{
|
||||
.blendEnable = SHVkUtil::IsBlendCompatible(subpass->GetFormatFromAttachmentReference(att.attachment)) ? true : false,
|
||||
.srcColorBlendFactor = vk::BlendFactor::eSrcAlpha,
|
||||
.dstColorBlendFactor = vk::BlendFactor::eOneMinusSrcAlpha,
|
||||
.colorBlendOp = vk::BlendOp::eAdd,
|
||||
.srcAlphaBlendFactor = vk::BlendFactor::eOne,
|
||||
.dstAlphaBlendFactor = vk::BlendFactor::eZero,
|
||||
.alphaBlendOp = vk::BlendOp::eAdd,
|
||||
.colorWriteMask = vk::ColorComponentFlagBits::eR | vk::ColorComponentFlagBits::eG | vk::ColorComponentFlagBits::eB | vk::ColorComponentFlagBits::eA,
|
||||
}
|
||||
);
|
||||
}
|
||||
|
||||
pipeline->GetPipelineState().SetColorBlenState(colorBlendState);
|
||||
}
|
||||
|
||||
void SHTrajectoryRenderingSubSystem::Run(uint32_t frameIndex) noexcept
|
||||
{
|
||||
auto& comps = SHComponentManager::GetDense<SHTrajectoryRenderableComponent>();
|
||||
for (auto& comp : comps)
|
||||
{
|
||||
comp.SetPositions(std::vector
|
||||
{
|
||||
SHVec3 {},
|
||||
SHVec3 {}
|
||||
});
|
||||
|
||||
// If has positions, feed data to buffer.
|
||||
if (comp.HasPositions())
|
||||
{
|
||||
SHTransformComponent* transform = SHComponentManager::GetComponent_s<SHTransformComponent>(comp.GetEID());
|
||||
if (transform)
|
||||
{
|
||||
// convenient variable
|
||||
SHVec4 const& startColor = comp.GetStartColor();
|
||||
SHVec4 const& endColor = comp.GetEndColor();
|
||||
float colorEvolveRate = comp.GetColorEvolveRate();
|
||||
|
||||
// trs to be reused
|
||||
SHMatrix trs = transform->GetTRS();
|
||||
|
||||
// starting color of trajectory
|
||||
SHVec4 currentColor = comp.GetStartColor();
|
||||
|
||||
// Start from 0 and slowly evolve to 1
|
||||
float lerpValue = 0.0f;
|
||||
|
||||
// Will be used for baseInstance later
|
||||
uint32_t oldTransformDataSize = transformData.size();
|
||||
|
||||
auto meshHandle = comp.GetMesh();
|
||||
|
||||
auto const& positions = comp.GetPositions();
|
||||
for (auto& pos : positions)
|
||||
{
|
||||
// modify position and reuse matrix
|
||||
trs.m[3][0] = pos.x;
|
||||
trs.m[3][1] = pos.y;
|
||||
trs.m[3][2] = pos.z;
|
||||
|
||||
transformData.push_back(trs);
|
||||
colorData.push_back(currentColor);
|
||||
|
||||
// evolve color
|
||||
currentColor = SHVec4::Lerp(startColor, endColor, lerpValue);
|
||||
|
||||
// evolve lerp value and clamp to 1
|
||||
lerpValue = std::max (1.0f, lerpValue + colorEvolveRate);
|
||||
}
|
||||
|
||||
// add draw data for this trajectory
|
||||
drawData.push_back(vk::DrawIndexedIndirectCommand
|
||||
{
|
||||
.indexCount = meshHandle->IndexCount,
|
||||
.instanceCount = static_cast<uint32_t>(transformData.size()) - oldTransformDataSize,
|
||||
.firstIndex = meshHandle->FirstIndex,
|
||||
.vertexOffset = meshHandle->FirstVertex,
|
||||
.firstInstance = oldTransformDataSize
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
// clear at the end of every frame since data is already in buffers
|
||||
comp.ClearPositions();
|
||||
}
|
||||
|
||||
if (!transformData.empty())
|
||||
{
|
||||
// read transform data to buffer
|
||||
// read draw data to buffer
|
||||
SHVkUtil::EnsureBufferAndCopyHostVisibleData(logicalDevice, transformBuffer, transformData.data(), sizeof (SHMatrix) * transformData.size(), vk::BufferUsageFlagBits::eVertexBuffer, "Trajectory System Transform Buffer");
|
||||
|
||||
SHVkUtil::EnsureBufferAndCopyHostVisibleData(logicalDevice, drawDataBuffer, drawData.data(), sizeof(vk::DrawIndexedIndirectCommand) * drawData.size(), vk::BufferUsageFlagBits::eIndirectBuffer, "Trajectory System Draw Data Buffer");
|
||||
|
||||
SHVkUtil::EnsureBufferAndCopyHostVisibleData(logicalDevice, colorBuffer, colorData.data(), sizeof(SHVec4) * colorData.size(), vk::BufferUsageFlagBits::eVertexBuffer, "Trajectory System Color Data Buffer");
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SHTrajectoryRenderingSubSystem::Render(Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHRenderer> renderer, uint32_t frameIndex) noexcept
|
||||
{
|
||||
if (!transformData.empty())
|
||||
{
|
||||
auto const& mappings = SHGraphicsPredefinedData::GetMappings(SHGraphicsPredefinedData::SystemType::TRAJECTORY_RENDERING);
|
||||
uint32_t staticGlobalSetIndex = mappings.at(SHPredefinedDescriptorTypes::STATIC_DATA);
|
||||
uint32_t cameraSetIndex = mappings.at(SHPredefinedDescriptorTypes::CAMERA);
|
||||
|
||||
cmdBuffer->BindPipeline(pipeline);
|
||||
|
||||
// Bind global data
|
||||
SHGlobalDescriptorSets::BindStaticGlobalData(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, staticGlobalSetIndex);
|
||||
|
||||
// Bind camera data
|
||||
renderer->BindDescriptorSet(cmdBuffer, SH_PIPELINE_TYPE::GRAPHICS, cameraSetIndex, frameIndex);
|
||||
|
||||
// Bind color vertex buffer
|
||||
cmdBuffer->BindVertexBuffer(SHGraphicsConstants::VertexBufferBindings::TRAJECTORY_COLOR, colorBuffer, 0);
|
||||
|
||||
// call draw call
|
||||
cmdBuffer->DrawMultiIndirect(drawDataBuffer, drawData.size());
|
||||
|
||||
// clear CPU transform and draw data
|
||||
transformData.clear();
|
||||
drawData.clear();
|
||||
colorData.clear();
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
void SHTrajectoryRenderingSubSystem::Exit(void) noexcept
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
}
|
|
@ -0,0 +1,66 @@
|
|||
#pragma once
|
||||
|
||||
#include "Resource/SHHandle.h"
|
||||
#include "Graphics/Pipeline/SHPipelineState.h"
|
||||
#include "Math/SHMatrix.h"
|
||||
|
||||
namespace SHADE
|
||||
{
|
||||
class SHVkLogicalDevice;
|
||||
class SHVkDescriptorPool;
|
||||
class SHVkDescriptorSetGroup;
|
||||
class SHVkDescriptorSetLayout;
|
||||
class SHVkBuffer;
|
||||
class SHLightComponent;
|
||||
class SHVkCommandBuffer;
|
||||
class SHVkPipeline;
|
||||
class SHVkPipelineLayout;
|
||||
class SHVkRenderpass;
|
||||
class SHSubpass;
|
||||
class SHVkShaderModule;
|
||||
class SHRenderer;
|
||||
|
||||
|
||||
|
||||
class SHTrajectoryRenderingSubSystem
|
||||
{
|
||||
private:
|
||||
|
||||
Handle<SHVkLogicalDevice> logicalDevice;
|
||||
|
||||
//! Every trajectory renderable will have one of these
|
||||
std::vector<vk::DrawIndexedIndirectCommand> drawData;
|
||||
|
||||
//! For the MDI call
|
||||
Handle<SHVkBuffer> drawDataBuffer;
|
||||
|
||||
//! matrix data to copy into buffer
|
||||
std::vector<SHMatrix> transformData;
|
||||
|
||||
//! All trajectory renderables will use this transform buffer
|
||||
Handle<SHVkBuffer> transformBuffer;
|
||||
|
||||
//! Each object will have their own color data
|
||||
std::vector<SHVec4> colorData;
|
||||
|
||||
//! buffer to hold color data for objects
|
||||
Handle<SHVkBuffer> colorBuffer;
|
||||
|
||||
//! Pipeline for rendering the trajectories
|
||||
Handle<SHVkPipeline> pipeline;
|
||||
|
||||
//! Pipeline layout for the pipeline
|
||||
Handle<SHVkPipelineLayout> pipelineLayout;
|
||||
|
||||
|
||||
|
||||
public:
|
||||
void Init (Handle<SHVkLogicalDevice> device, Handle<SHVkRenderpass> compatibleRenderpass, Handle<SHSubpass> subpass, Handle<SHVkShaderModule> textVS, Handle<SHVkShaderModule> textFS) noexcept;
|
||||
|
||||
void Run(uint32_t frameIndex) noexcept;
|
||||
|
||||
void Render(Handle<SHVkCommandBuffer> cmdBuffer, Handle<SHRenderer> renderer, uint32_t frameIndex) noexcept;
|
||||
void Exit(void) noexcept;
|
||||
|
||||
};
|
||||
}
|
|
@ -70,6 +70,7 @@ namespace SHADE
|
|||
//Compile component IDs
|
||||
const auto componentIDList = SHSerialization::GetComponentIDList(node[ComponentsNode]);
|
||||
eid = SHEntityManager::CreateEntity(componentIDList, eid, name, parentEID);
|
||||
|
||||
createdEntities[oldEID] = eid;
|
||||
//createdEntities.push_back(eid);
|
||||
if (node[NumberOfChildrenNode])
|
||||
|
@ -90,6 +91,12 @@ namespace SHADE
|
|||
if (node[ScriptsNode])
|
||||
SHSystemManager::GetSystem<SHScriptEngine>()->DeserialiseScripts(eid, node[ScriptsNode]);
|
||||
|
||||
auto& sceneGraph = SHSceneManager::GetCurrentSceneGraph();
|
||||
if (node[IsActiveNode])
|
||||
{
|
||||
sceneGraph.SetActive(eid, node[IsActiveNode].as<bool>());
|
||||
}
|
||||
|
||||
return eid;
|
||||
}
|
||||
|
||||
|
|
|
@ -6,8 +6,7 @@
|
|||
namespace SHADE
|
||||
{
|
||||
SHButtonComponent::SHButtonComponent()
|
||||
:size(1.0f), isHovered(false), isClicked(false),
|
||||
defaultTexture(0), hoveredTexture(0), clickedTexture(0), currentTexture(0)
|
||||
: defaultTexture(0), hoveredTexture(0), clickedTexture(0), currentTexture(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
@ -41,6 +40,9 @@ namespace SHADE
|
|||
clickedTexture = texture;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
|
|
@ -17,8 +17,6 @@ namespace SHADE
|
|||
SHButtonComponent();
|
||||
virtual ~SHButtonComponent() = default;
|
||||
|
||||
SHVec2 size;
|
||||
|
||||
AssetID GetClickedTexture() const noexcept;
|
||||
AssetID GetDefaultTexture() const noexcept;
|
||||
AssetID GetHoveredTexture() const noexcept;
|
||||
|
@ -32,11 +30,7 @@ namespace SHADE
|
|||
|
||||
friend class SHUISystem;
|
||||
private:
|
||||
//Set to true when mouse is hovering over the button.
|
||||
bool isHovered;
|
||||
//This is set to true when the mouse clicks down, and set back to false when mouse releases.
|
||||
//The event for the button click will be broadcasted when mouse release.
|
||||
bool isClicked;
|
||||
|
||||
AssetID defaultTexture;
|
||||
AssetID hoveredTexture;
|
||||
AssetID clickedTexture;
|
||||
|
|
|
@ -6,7 +6,7 @@ namespace SHADE
|
|||
{
|
||||
|
||||
SHCanvasComponent::SHCanvasComponent()
|
||||
:width(1),height(1), dirtyMatrix(false), canvasMatrix()
|
||||
:width(1), height(1), dirtyMatrix(false), canvasMatrix(), scaleByCanvasWidth(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -27,6 +27,8 @@ namespace SHADE
|
|||
height = val;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
SHCanvasComponent::CanvasSizeType SHCanvasComponent::GetCanvasWidth() const noexcept
|
||||
{
|
||||
|
@ -43,6 +45,8 @@ namespace SHADE
|
|||
return canvasMatrix;
|
||||
}
|
||||
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
@ -54,6 +58,7 @@ RTTR_REGISTRATION
|
|||
registration::class_<SHCanvasComponent>("Canvas Component")
|
||||
.property("Canvas Width", &SHCanvasComponent::GetCanvasWidth, &SHCanvasComponent::SetCanvasWidth)
|
||||
.property("Canvas Height", &SHCanvasComponent::GetCanvasHeight, &SHCanvasComponent::SetCanvasHeight)
|
||||
.property("Scale by canvas width", &SHCanvasComponent::scaleByCanvasWidth)
|
||||
;
|
||||
|
||||
|
||||
|
|
|
@ -21,21 +21,24 @@ namespace SHADE
|
|||
|
||||
SHCanvasComponent();
|
||||
~SHCanvasComponent() = default;
|
||||
bool scaleByCanvasWidth;
|
||||
|
||||
void SetCanvasSize(CanvasSizeType width, CanvasSizeType height) noexcept;
|
||||
void SetCanvasWidth(CanvasSizeType width) noexcept;
|
||||
void SetCanvasHeight(CanvasSizeType height) noexcept;
|
||||
|
||||
|
||||
CanvasSizeType GetCanvasWidth() const noexcept;
|
||||
CanvasSizeType GetCanvasHeight() const noexcept;
|
||||
SHMatrix const& GetMatrix() const noexcept;
|
||||
|
||||
|
||||
private:
|
||||
CanvasSizeType width;
|
||||
CanvasSizeType height;
|
||||
bool dirtyMatrix;
|
||||
SHMatrix canvasMatrix;
|
||||
|
||||
|
||||
|
||||
RTTR_ENABLE()
|
||||
};
|
||||
|
|
|
@ -5,8 +5,7 @@
|
|||
namespace SHADE
|
||||
{
|
||||
SHToggleButtonComponent::SHToggleButtonComponent()
|
||||
:size(1.0f), isHovered(false), isClicked(false), value(false),
|
||||
defaultTexture(0), toggledTexture(0), currentTexture(0)
|
||||
:value(false), defaultTexture(0), toggledTexture(0), currentTexture(0)
|
||||
{
|
||||
}
|
||||
|
||||
|
|
|
@ -17,8 +17,6 @@ namespace SHADE
|
|||
SHToggleButtonComponent();
|
||||
virtual ~SHToggleButtonComponent() = default;
|
||||
|
||||
SHVec2 size;
|
||||
|
||||
AssetID GetToggledTexture() const noexcept;
|
||||
AssetID GetDefaultTexture() const noexcept;
|
||||
bool GetValue() const noexcept;
|
||||
|
@ -33,11 +31,7 @@ namespace SHADE
|
|||
friend class SHUISystem;
|
||||
private:
|
||||
|
||||
//Set to true when mouse is hovering over the button.
|
||||
bool isHovered;
|
||||
//This is set to true when the mouse clicks down, and set back to false when mouse releases.
|
||||
//The event for the button click will be broadcasted when mouse release.
|
||||
bool isClicked;
|
||||
|
||||
bool value;
|
||||
AssetID defaultTexture;
|
||||
AssetID toggledTexture;
|
||||
|
|
|
@ -7,6 +7,7 @@ namespace SHADE
|
|||
{
|
||||
|
||||
SHUIComponent::SHUIComponent()
|
||||
:size(1.0f), isHovered(false), isClicked(false)
|
||||
{
|
||||
|
||||
}
|
||||
|
@ -27,6 +28,20 @@ namespace SHADE
|
|||
(void)id;
|
||||
}
|
||||
|
||||
bool SHUIComponent::GetIsHovered() const noexcept
|
||||
{
|
||||
return isHovered;
|
||||
}
|
||||
|
||||
bool SHUIComponent::GetIsClicked() const noexcept
|
||||
{
|
||||
return isClicked;
|
||||
}
|
||||
|
||||
void SHUIComponent::SetEmptyHoveredClick(bool value) noexcept
|
||||
{
|
||||
(void)value;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
@ -37,6 +52,8 @@ RTTR_REGISTRATION
|
|||
|
||||
registration::class_<SHUIComponent>("UI Component")
|
||||
.property("Canvas ID", &SHUIComponent::GetCanvasID, &SHUIComponent::SetCanvasID)
|
||||
.property("Hovered", &SHUIComponent::GetIsHovered, &SHUIComponent::SetEmptyHoveredClick)
|
||||
.property("Clicked", &SHUIComponent::GetIsClicked, &SHUIComponent::SetEmptyHoveredClick)
|
||||
;
|
||||
|
||||
|
||||
|
|
|
@ -5,6 +5,7 @@
|
|||
#include "SH_API.h"
|
||||
#include "ECS_Base/Components/SHComponent.h"
|
||||
#include "Math/SHMatrix.h"
|
||||
#include "Math/Vector/SHVec2.h"
|
||||
|
||||
|
||||
namespace SHADE
|
||||
|
@ -17,14 +18,29 @@ namespace SHADE
|
|||
SHUIComponent();
|
||||
~SHUIComponent() = default;
|
||||
|
||||
|
||||
SHVec2 size;
|
||||
|
||||
|
||||
SHMatrix const& GetMatrix() const noexcept;
|
||||
EntityID GetCanvasID() const noexcept;
|
||||
void SetCanvasID(EntityID id) noexcept;
|
||||
|
||||
bool GetIsHovered() const noexcept;
|
||||
bool GetIsClicked() const noexcept;
|
||||
|
||||
void SetEmptyHoveredClick(bool value)noexcept;
|
||||
|
||||
|
||||
private:
|
||||
SHMatrix localToCanvasMatrix;
|
||||
EntityID canvasID;
|
||||
|
||||
//Set to true when mouse is hovering over the button. Only set if there is a Button/Slider/ToggleButton comp.
|
||||
bool isHovered;
|
||||
//This is set to true when the mouse clicks down, and set back to false when mouse releases. Only set if there is a Button/Slider/ToggleButton comp.
|
||||
bool isClicked;
|
||||
|
||||
|
||||
RTTR_ENABLE()
|
||||
};
|
||||
|
|
|
@ -131,8 +131,17 @@ namespace SHADE
|
|||
auto cameraSystem = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||
SHVec2 camSize = cameraSystem->GetCameraWidthHeight(0);
|
||||
comp.canvasMatrix = SHMatrix::Identity;
|
||||
comp.canvasMatrix(0, 0) = camSize.x * 0.5f / (comp.GetCanvasWidth() * 0.5f);
|
||||
comp.canvasMatrix(1, 1) = camSize.y * 0.5f / (comp.GetCanvasHeight() * 0.5f);
|
||||
float scale = camSize.y / comp.GetCanvasHeight();
|
||||
if (comp.scaleByCanvasWidth)
|
||||
{
|
||||
scale = camSize.x / comp.GetCanvasWidth();
|
||||
}
|
||||
|
||||
comp.canvasMatrix(0, 0) = scale;
|
||||
comp.canvasMatrix(1, 1) = scale;
|
||||
|
||||
//comp.canvasMatrix(0, 0) = camSize.x * 0.5f / (comp.GetCanvasWidth() * 0.5f);
|
||||
//comp.canvasMatrix(1, 1) = camSize.y * 0.5f / (comp.GetCanvasHeight() * 0.5f);
|
||||
}
|
||||
|
||||
void SHUISystem::UpdateCanvasMatrixRoutine::Execute(double dt) noexcept
|
||||
|
@ -146,25 +155,15 @@ namespace SHADE
|
|||
}
|
||||
}
|
||||
|
||||
|
||||
void SHUISystem::UpdateButtonComponent(SHButtonComponent& comp) noexcept
|
||||
bool SHUISystem::CheckButtonHoveredOrClicked(SHUIComponent& comp) noexcept
|
||||
{
|
||||
if (!SHComponentManager::HasComponent<SHUIComponent>(comp.GetEID()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
auto cameraSystem = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||
auto uiComp = SHComponentManager::GetComponent<SHUIComponent>(comp.GetEID());
|
||||
//auto canvasComp = SHComponentManager::GetComponent_s<SHCanvasComponent>(uiComp->canvasID);
|
||||
SHVec4 topExtent4 = SHMatrix::Translate(-comp.size.x * 0.5f, comp.size.y * 0.5f, 0.0f) * comp.GetMatrix() * SHVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
SHVec4 btmExtent4 = SHMatrix::Translate(comp.size.x * 0.5f, -comp.size.y * 0.5f, 0.0f) * comp.GetMatrix() * SHVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
SHVec4 topExtent4 = SHMatrix::Translate(-comp.size.x * 0.5f, comp.size.y * 0.5f, 0.0f) * uiComp->GetMatrix() * SHVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
SHVec4 btmExtent4 = SHMatrix::Translate(comp.size.x * 0.5f, -comp.size.y * 0.5f, 0.0f) * uiComp->GetMatrix() * SHVec4(0.0f,0.0f, 0.0f,1.0f);
|
||||
|
||||
|
||||
SHVec2 topExtent{ topExtent4.x,topExtent4.y };
|
||||
SHVec2 btmExtent{ btmExtent4.x,btmExtent4.y };
|
||||
|
||||
|
||||
auto cameraSystem = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||
SHVec2 mousePos;
|
||||
SHVec2 windowSize;
|
||||
#ifdef SHEDITOR
|
||||
|
@ -175,7 +174,7 @@ namespace SHADE
|
|||
mousePos /= windowSize;
|
||||
//SHLOG_INFO("mouse pos normalized: {}, {}", mousePos.x, mousePos.y)
|
||||
|
||||
|
||||
|
||||
|
||||
#else
|
||||
|
||||
|
@ -187,12 +186,12 @@ namespace SHADE
|
|||
windowSize = { static_cast<float>(ws.first), static_cast<float>(ws.second) };
|
||||
mousePos /= windowSize;
|
||||
#endif
|
||||
|
||||
SHVec2 camSize{ cameraSystem->GetCameraWidthHeight(0)};
|
||||
|
||||
SHVec2 camSize{ cameraSystem->GetCameraWidthHeight(0) };
|
||||
//SHLOG_INFO("TopExtent: {}, {}", topExtent.x, topExtent.y)
|
||||
|
||||
topExtent = CanvasToScreenPoint(topExtent,true);
|
||||
btmExtent = CanvasToScreenPoint(btmExtent,true);
|
||||
topExtent = CanvasToScreenPoint(topExtent, true);
|
||||
btmExtent = CanvasToScreenPoint(btmExtent, true);
|
||||
//SHLOG_INFO("TopExtent: {}, {} Btm Extent: {}, {}", topExtent.x, topExtent.y, btmExtent.x, btmExtent.y)
|
||||
|
||||
|
||||
|
@ -200,26 +199,48 @@ namespace SHADE
|
|||
if (mousePos.x >= topExtent.x && mousePos.x <= btmExtent.x
|
||||
&& mousePos.y >= topExtent.y && mousePos.y <= btmExtent.y)
|
||||
{
|
||||
if (comp.isHovered == false)
|
||||
{
|
||||
SHButtonClickEvent clickEvent;
|
||||
clickEvent.EID = comp.GetEID();
|
||||
SHEventManager::BroadcastEvent(clickEvent, SH_BUTTON_HOVER_ENTER_EVENT);
|
||||
}
|
||||
comp.isHovered = true;
|
||||
#ifdef SHEDITOR
|
||||
//if (SHSystemManager::GetSystem<SHEditor>()->editorState == SHEditor::State::PLAY)
|
||||
{
|
||||
if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::LMB))
|
||||
{
|
||||
comp.isClicked = true;
|
||||
}
|
||||
}
|
||||
#else
|
||||
|
||||
|
||||
|
||||
#ifdef SHEDITOR
|
||||
//if (SHSystemManager::GetSystem<SHEditor>()->editorState == SHEditor::State::PLAY)
|
||||
{
|
||||
if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::LMB))
|
||||
{
|
||||
comp.isClicked = true;
|
||||
SHButtonClickEvent clickEvent;
|
||||
clickEvent.EID = comp.GetEID();
|
||||
SHEventManager::BroadcastEvent(clickEvent, SH_BUTTON_CLICK_EVENT);
|
||||
}
|
||||
#endif
|
||||
}
|
||||
#else
|
||||
if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::LMB))
|
||||
{
|
||||
comp.isClicked = true;
|
||||
SHButtonClickEvent clickEvent;
|
||||
clickEvent.EID = comp.GetEID();
|
||||
SHEventManager::BroadcastEvent(clickEvent, SH_BUTTON_CLICK_EVENT);
|
||||
}
|
||||
#endif
|
||||
|
||||
//SHLOG_INFO("HOVERED")
|
||||
}
|
||||
else
|
||||
{
|
||||
if (comp.isHovered == true)
|
||||
{
|
||||
SHButtonClickEvent clickEvent;
|
||||
clickEvent.EID = comp.GetEID();
|
||||
SHEventManager::BroadcastEvent(clickEvent, SH_BUTTON_HOVER_EXIT_EVENT);
|
||||
}
|
||||
|
||||
comp.isHovered = false;
|
||||
//SHLOG_INFO("NOT HOVERED")
|
||||
}
|
||||
|
@ -228,8 +249,30 @@ namespace SHADE
|
|||
comp.isClicked = false;
|
||||
SHButtonClickEvent clickEvent;
|
||||
clickEvent.EID = comp.GetEID();
|
||||
SHEventManager::BroadcastEvent(clickEvent, SH_BUTTON_CLICK_EVENT);
|
||||
SHEventManager::BroadcastEvent(clickEvent, SH_BUTTON_RELEASE_EVENT);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
return false;
|
||||
|
||||
}
|
||||
|
||||
|
||||
void SHUISystem::UpdateButtonComponent(SHButtonComponent& comp) noexcept
|
||||
{
|
||||
if (!SHComponentManager::HasComponent<SHUIComponent>(comp.GetEID()))
|
||||
{
|
||||
return;
|
||||
}
|
||||
auto cameraSystem = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||
auto uiComp = SHComponentManager::GetComponent<SHUIComponent>(comp.GetEID());
|
||||
//auto canvasComp = SHComponentManager::GetComponent_s<SHCanvasComponent>(uiComp->canvasID);
|
||||
|
||||
|
||||
|
||||
CheckButtonHoveredOrClicked(*uiComp);
|
||||
|
||||
if (SHComponentManager::HasComponent<SHRenderable>(comp.GetEID()))
|
||||
{
|
||||
|
@ -238,7 +281,7 @@ namespace SHADE
|
|||
|
||||
|
||||
AssetID textureID = 0;
|
||||
if (!comp.isHovered && !comp.isClicked)
|
||||
if (!uiComp->isHovered && !uiComp->isClicked)
|
||||
{
|
||||
if (comp.GetDefaultTexture() != 0 && SHAssetManager::GetType(comp.GetDefaultTexture()) == AssetType::TEXTURE)
|
||||
{
|
||||
|
@ -247,7 +290,7 @@ namespace SHADE
|
|||
//SHLOG_INFO("SETTING DEFAULT TEXTURE")
|
||||
}
|
||||
}
|
||||
else if (comp.isClicked)
|
||||
else if (uiComp->isClicked)
|
||||
{
|
||||
if (comp.GetClickedTexture() != 0 && SHAssetManager::GetType(comp.GetClickedTexture()) == AssetType::TEXTURE)
|
||||
{
|
||||
|
@ -288,80 +331,10 @@ namespace SHADE
|
|||
auto uiComp = SHComponentManager::GetComponent<SHUIComponent>(comp.GetEID());
|
||||
//auto canvasComp = SHComponentManager::GetComponent_s<SHCanvasComponent>(uiComp->canvasID);
|
||||
|
||||
SHVec4 topExtent4 = SHMatrix::Translate(-comp.size.x * 0.5f, comp.size.y * 0.5f, 0.0f) * uiComp->GetMatrix() * SHVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
SHVec4 btmExtent4 = SHMatrix::Translate(comp.size.x * 0.5f, -comp.size.y * 0.5f, 0.0f) * uiComp->GetMatrix() * SHVec4(0.0f, 0.0f, 0.0f, 1.0f);
|
||||
|
||||
|
||||
|
||||
SHVec2 topExtent{ topExtent4.x,topExtent4.y };
|
||||
SHVec2 btmExtent{ btmExtent4.x,btmExtent4.y };
|
||||
|
||||
|
||||
SHVec2 mousePos;
|
||||
SHVec2 windowSize;
|
||||
#ifdef SHEDITOR
|
||||
windowSize = SHEditorWindowManager::GetEditorWindow<SHEditorViewport>()->beginContentRegionAvailable;
|
||||
mousePos = SHEditorWindowManager::GetEditorWindow<SHEditorViewport>()->viewportMousePos;
|
||||
//mousePos.y = windowSize.y - mousePos.y;
|
||||
//SHLOG_INFO("mouse pos: {}, {}", mousePos.x, mousePos.y)
|
||||
mousePos /= windowSize;
|
||||
//SHLOG_INFO("mouse pos normalized: {}, {}", mousePos.x, mousePos.y)
|
||||
|
||||
|
||||
|
||||
#else
|
||||
|
||||
int x, y;
|
||||
SHInputManager::GetMouseScreenPosition(&x, &y);
|
||||
mousePos.x = x;
|
||||
mousePos.y = y;
|
||||
auto ws = SHSystemManager::GetSystem<SHGraphicsSystem>()->GetWindow()->GetWindowSize();
|
||||
windowSize = { static_cast<float>(ws.first), static_cast<float>(ws.second) };
|
||||
mousePos /= windowSize;
|
||||
#endif
|
||||
|
||||
SHVec2 camSize{ cameraSystem->GetCameraWidthHeight(0) };
|
||||
//SHLOG_INFO("TopExtent: {}, {}", topExtent.x, topExtent.y)
|
||||
|
||||
topExtent = CanvasToScreenPoint(topExtent, true);
|
||||
btmExtent = CanvasToScreenPoint(btmExtent, true);
|
||||
//SHLOG_INFO("TopExtent: {}, {} Btm Extent: {}, {}", topExtent.x, topExtent.y, btmExtent.x, btmExtent.y)
|
||||
|
||||
|
||||
//comp.isClicked = false;
|
||||
if (mousePos.x >= topExtent.x && mousePos.x <= btmExtent.x
|
||||
&& mousePos.y >= topExtent.y && mousePos.y <= btmExtent.y)
|
||||
{
|
||||
comp.isHovered = true;
|
||||
#ifdef SHEDITOR
|
||||
//if (SHSystemManager::GetSystem<SHEditor>()->editorState == SHEditor::State::PLAY)
|
||||
{
|
||||
if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::LMB))
|
||||
{
|
||||
comp.isClicked = true;
|
||||
}
|
||||
}
|
||||
#else
|
||||
if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::LMB))
|
||||
{
|
||||
comp.isClicked = true;
|
||||
}
|
||||
#endif
|
||||
|
||||
//SHLOG_INFO("HOVERED")
|
||||
}
|
||||
else
|
||||
{
|
||||
comp.isHovered = false;
|
||||
//SHLOG_INFO("NOT HOVERED")
|
||||
}
|
||||
if (comp.isClicked && SHInputManager::GetKeyUp(SHInputManager::SH_KEYCODE::LMB))
|
||||
{
|
||||
comp.isClicked = false;
|
||||
if (CheckButtonHoveredOrClicked(*uiComp))
|
||||
comp.value = !comp.value;
|
||||
SHButtonClickEvent clickEvent;
|
||||
clickEvent.EID = comp.GetEID();
|
||||
SHEventManager::BroadcastEvent(clickEvent, SH_BUTTON_CLICK_EVENT);
|
||||
}
|
||||
|
||||
if (SHComponentManager::HasComponent<SHRenderable>(comp.GetEID()))
|
||||
{
|
||||
|
|
|
@ -72,6 +72,11 @@ namespace SHADE
|
|||
void UpdateButtonComponent(SHButtonComponent& comp) noexcept;
|
||||
void UpdateToggleButtonComponent(SHToggleButtonComponent& comp) noexcept;
|
||||
void UpdateCanvasComponent(SHCanvasComponent& comp) noexcept;
|
||||
|
||||
//returns true on button release.
|
||||
bool CheckButtonHoveredOrClicked(SHUIComponent& comp) noexcept;
|
||||
|
||||
|
||||
|
||||
SHVec2 CanvasToScreenPoint(SHVec2& const canvasPoint, bool normalized) noexcept;
|
||||
|
||||
|
|
|
@ -47,11 +47,16 @@ namespace SHADE
|
|||
}
|
||||
}
|
||||
SHADE::Material Renderable::Material::get()
|
||||
{
|
||||
auto mat = GetNativeComponent()->GetModifiableMaterial();
|
||||
return mat ? SHADE::Material(mat) : SHADE::Material();
|
||||
}
|
||||
SHADE::Material Renderable::SharedMaterial::get()
|
||||
{
|
||||
auto mat = GetNativeComponent()->GetMaterial();
|
||||
return mat ? SHADE::Material(mat) : SHADE::Material();
|
||||
}
|
||||
void Renderable::Material::set(SHADE::Material value)
|
||||
void Renderable::SharedMaterial::set(SHADE::Material value)
|
||||
{
|
||||
if (value)
|
||||
{
|
||||
|
|
|
@ -55,9 +55,19 @@ namespace SHADE
|
|||
void set(MeshAsset value);
|
||||
}
|
||||
/// <summary>
|
||||
/// Material used to render this Renderable.
|
||||
/// Special instance of the shared Material for this Renderable. When accessing
|
||||
/// this property, a new instance of the shared Material is created and assigned
|
||||
/// to this Renderable. Hence, changes will only affect this Renderable.
|
||||
/// </summary>
|
||||
property SHADE::Material Material
|
||||
{
|
||||
SHADE::Material get();
|
||||
}
|
||||
/// <summary>
|
||||
/// The shared Material used to render this Renderable and other Renderables
|
||||
/// using the same base Material.
|
||||
/// </summary>
|
||||
property SHADE::Material SharedMaterial
|
||||
{
|
||||
SHADE::Material get();
|
||||
void set(SHADE::Material value);
|
||||
|
|
Loading…
Reference in New Issue