diff --git a/Assets/Editor/Editor.SHConfig b/Assets/Editor/Editor.SHConfig index 9bd51ca8..37edf50c 100644 --- a/Assets/Editor/Editor.SHConfig +++ b/Assets/Editor/Editor.SHConfig @@ -1,4 +1,4 @@ Start Maximized: true -Working Scene ID: 86098106 +Working Scene ID: 97158628 Window Size: {x: 1920, y: 1013} Style: 0 \ No newline at end of file diff --git a/Assets/Scenes/MainGame.shade b/Assets/Scenes/MainGame.shade index 53601e7a..591c386f 100644 --- a/Assets/Scenes/MainGame.shade +++ b/Assets/Scenes/MainGame.shade @@ -9567,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 @@ -9618,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 @@ -9676,18 +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 @@ -9714,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 @@ -10489,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 @@ -10507,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 @@ -10519,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 @@ -10531,4 +10557,155 @@ eyeOffset: [0, 1.64999998, 0] distanceToCapture: 0.5 captureTime: 0.5 - footstepSFXIntervalMultiplier: 0.5 \ No newline at end of file + 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: ~ \ No newline at end of file diff --git a/Assets/Scenes/MainMenu.shade b/Assets/Scenes/MainMenu.shade index 54208e8b..30ef368a 100644 --- a/Assets/Scenes/MainMenu.shade +++ b/Assets/Scenes/MainMenu.shade @@ -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 diff --git a/Assets/Scripts/Audio/AudioHandler.cs b/Assets/Scripts/Audio/AudioHandler.cs index f2e552c1..c6067819 100644 --- a/Assets/Scripts/Audio/AudioHandler.cs +++ b/Assets/Scripts/Audio/AudioHandler.cs @@ -19,5 +19,13 @@ namespace SHADE_Scripting.Audio h.Value.Stop(fadeOut); } } + + public static void pauseAllSounds(bool pause) + { + foreach (KeyValuePair h in audioClipHandlers) + { + h.Value.SetPause(pause); + } + } } } diff --git a/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs b/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs index a2f1ddb8..d5046db1 100644 --- a/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs +++ b/Assets/Scripts/Gameplay/Player/SC_PickAndThrow.cs @@ -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(); @@ -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); + } + } \ No newline at end of file diff --git a/Assets/Scripts/Gameplay/Player/SC_PlayerController.cs b/Assets/Scripts/Gameplay/Player/SC_PlayerController.cs index d66e7e30..202e587e 100644 --- a/Assets/Scripts/Gameplay/Player/SC_PlayerController.cs +++ b/Assets/Scripts/Gameplay/Player/SC_PlayerController.cs @@ -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; } } diff --git a/Assets/Scripts/Gameplay/Player/SC_ThirdPersonCamera.cs b/Assets/Scripts/Gameplay/Player/SC_ThirdPersonCamera.cs index b03dbf2f..c3026ce6 100644 --- a/Assets/Scripts/Gameplay/Player/SC_ThirdPersonCamera.cs +++ b/Assets/Scripts/Gameplay/Player/SC_ThirdPersonCamera.cs @@ -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; } } } diff --git a/Assets/Scripts/Gameplay/SC_GameManager.cs b/Assets/Scripts/Gameplay/SC_GameManager.cs index 83b0747a..6478b5ea 100644 --- a/Assets/Scripts/Gameplay/SC_GameManager.cs +++ b/Assets/Scripts/Gameplay/SC_GameManager.cs @@ -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; diff --git a/Assets/Scripts/SC_JumpPad.cs b/Assets/Scripts/SC_JumpPad.cs new file mode 100644 index 00000000..0e331f8c --- /dev/null +++ b/Assets/Scripts/SC_JumpPad.cs @@ -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() && info.GameObject.GetScript().currentState == PlayerController.RaccoonStates.FALLING) + { + info.GameObject.GetScript().landedOnJumpPad = true; + } + } + +} diff --git a/Assets/Scripts/SC_JumpPad.cs.shmeta b/Assets/Scripts/SC_JumpPad.cs.shmeta new file mode 100644 index 00000000..62a99f19 --- /dev/null +++ b/Assets/Scripts/SC_JumpPad.cs.shmeta @@ -0,0 +1,3 @@ +Name: SC_JumpPad +ID: 167326885 +Type: 9 diff --git a/Assets/Scripts/UI/SC_PauseMenu.cs b/Assets/Scripts/UI/SC_PauseMenu.cs new file mode 100644 index 00000000..eae7aa91 --- /dev/null +++ b/Assets/Scripts/UI/SC_PauseMenu.cs @@ -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().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(); + if (resume != null) + { + resume.OnClick.RegisterAction(() => + { + if (GameManager.Instance.GamePause) + { + GameManager.Instance.GamePause = false; + AudioHandler.pauseAllSounds(false); + if (gamePauseText) + gamePauseText.GetComponent().Enabled = false; + if (canvas) + canvas.SetActive(false); + } + }); + } + else + { + Debug.LogError("Failed to register resume button."); + } + + //retry + UIElement retry = retryBtn.GetComponent(); + 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(); + 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().Enabled = true; + if (canvas) + canvas.SetActive(true); + } + + } +} + diff --git a/Assets/Scripts/UI/SC_PauseMenu.cs.shmeta b/Assets/Scripts/UI/SC_PauseMenu.cs.shmeta new file mode 100644 index 00000000..0ddcf762 --- /dev/null +++ b/Assets/Scripts/UI/SC_PauseMenu.cs.shmeta @@ -0,0 +1,3 @@ +Name: SC_PauseMenu +ID: 151952680 +Type: 9 diff --git a/SHADE_Engine/src/Camera/SHCameraSystem.cpp b/SHADE_Engine/src/Camera/SHCameraSystem.cpp index 6154c104..59ba7ce9 100644 --- a/SHADE_Engine/src/Camera/SHCameraSystem.cpp +++ b/SHADE_Engine/src/Camera/SHCameraSystem.cpp @@ -296,7 +296,7 @@ namespace SHADE { camera.offset = arm->GetOffset(); if (arm->lookAtCameraOrigin) - CameraLookAt(camera, camera.position); + CameraLookAt(camera, camera.position + arm->GetTargetOffset()); } diff --git a/SHADE_Engine/src/Events/SHEventDefines.h b/SHADE_Engine/src/Events/SHEventDefines.h index fa5bcafb..fffe8b5f 100644 --- a/SHADE_Engine/src/Events/SHEventDefines.h +++ b/SHADE_Engine/src/Events/SHEventDefines.h @@ -26,4 +26,7 @@ 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 }; diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp index ffd5ac96..e1935634 100644 --- a/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp +++ b/SHADE_Engine/src/Graphics/MiddleEnd/TextRendering/SHTextRenderingSubSystem.cpp @@ -13,6 +13,7 @@ #include "Math/Transform/SHTransformComponent.h" #include "Graphics/MiddleEnd/GlobalData/SHGlobalDescriptorSets.h" #include "Graphics/MiddleEnd/Interface/SHRenderer.h" +#include "Scene/SHSceneManager.h" namespace SHADE { @@ -184,6 +185,9 @@ namespace SHADE for (auto& comp : textRendererComps) { + if (!SHSceneManager::CheckNodeAndComponentsActive(comp.GetEID())) + continue; + auto* transform = SHComponentManager::GetComponent(comp.GetEID()); Handle fontHandle = comp.fontHandle; diff --git a/SHADE_Engine/src/Serialization/SHSerialization.cpp b/SHADE_Engine/src/Serialization/SHSerialization.cpp index bb0f4a43..febca024 100644 --- a/SHADE_Engine/src/Serialization/SHSerialization.cpp +++ b/SHADE_Engine/src/Serialization/SHSerialization.cpp @@ -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()->DeserialiseScripts(eid, node[ScriptsNode]); + auto& sceneGraph = SHSceneManager::GetCurrentSceneGraph(); + if (node[IsActiveNode]) + { + sceneGraph.SetActive(eid, node[IsActiveNode].as()); + } + return eid; } diff --git a/SHADE_Engine/src/UI/SHButtonComponent.cpp b/SHADE_Engine/src/UI/SHButtonComponent.cpp index 35b6b3bc..cbc36ce3 100644 --- a/SHADE_Engine/src/UI/SHButtonComponent.cpp +++ b/SHADE_Engine/src/UI/SHButtonComponent.cpp @@ -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; } + + + } diff --git a/SHADE_Engine/src/UI/SHButtonComponent.h b/SHADE_Engine/src/UI/SHButtonComponent.h index bb66d224..a89a4b9e 100644 --- a/SHADE_Engine/src/UI/SHButtonComponent.h +++ b/SHADE_Engine/src/UI/SHButtonComponent.h @@ -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; diff --git a/SHADE_Engine/src/UI/SHCanvasComponent.cpp b/SHADE_Engine/src/UI/SHCanvasComponent.cpp index 1ffc7a19..5ee93bc1 100644 --- a/SHADE_Engine/src/UI/SHCanvasComponent.cpp +++ b/SHADE_Engine/src/UI/SHCanvasComponent.cpp @@ -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_("Canvas Component") .property("Canvas Width", &SHCanvasComponent::GetCanvasWidth, &SHCanvasComponent::SetCanvasWidth) .property("Canvas Height", &SHCanvasComponent::GetCanvasHeight, &SHCanvasComponent::SetCanvasHeight) + .property("Scale by canvas width", &SHCanvasComponent::scaleByCanvasWidth) ; diff --git a/SHADE_Engine/src/UI/SHCanvasComponent.h b/SHADE_Engine/src/UI/SHCanvasComponent.h index 145b3cb3..5b6c1781 100644 --- a/SHADE_Engine/src/UI/SHCanvasComponent.h +++ b/SHADE_Engine/src/UI/SHCanvasComponent.h @@ -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() }; diff --git a/SHADE_Engine/src/UI/SHToggleButtonComponent.cpp b/SHADE_Engine/src/UI/SHToggleButtonComponent.cpp index 47df669c..1ae0e9e0 100644 --- a/SHADE_Engine/src/UI/SHToggleButtonComponent.cpp +++ b/SHADE_Engine/src/UI/SHToggleButtonComponent.cpp @@ -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) { } diff --git a/SHADE_Engine/src/UI/SHToggleButtonComponent.h b/SHADE_Engine/src/UI/SHToggleButtonComponent.h index dc678fe9..1903df93 100644 --- a/SHADE_Engine/src/UI/SHToggleButtonComponent.h +++ b/SHADE_Engine/src/UI/SHToggleButtonComponent.h @@ -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; diff --git a/SHADE_Engine/src/UI/SHUIComponent.cpp b/SHADE_Engine/src/UI/SHUIComponent.cpp index 8131d081..95b93375 100644 --- a/SHADE_Engine/src/UI/SHUIComponent.cpp +++ b/SHADE_Engine/src/UI/SHUIComponent.cpp @@ -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_("UI Component") .property("Canvas ID", &SHUIComponent::GetCanvasID, &SHUIComponent::SetCanvasID) + .property("Hovered", &SHUIComponent::GetIsHovered, &SHUIComponent::SetEmptyHoveredClick) + .property("Clicked", &SHUIComponent::GetIsClicked, &SHUIComponent::SetEmptyHoveredClick) ; diff --git a/SHADE_Engine/src/UI/SHUIComponent.h b/SHADE_Engine/src/UI/SHUIComponent.h index 5a9290cc..dd5bb664 100644 --- a/SHADE_Engine/src/UI/SHUIComponent.h +++ b/SHADE_Engine/src/UI/SHUIComponent.h @@ -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() }; diff --git a/SHADE_Engine/src/UI/SHUISystem.cpp b/SHADE_Engine/src/UI/SHUISystem.cpp index 92a754bf..3552e47b 100644 --- a/SHADE_Engine/src/UI/SHUISystem.cpp +++ b/SHADE_Engine/src/UI/SHUISystem.cpp @@ -131,8 +131,17 @@ namespace SHADE auto cameraSystem = SHSystemManager::GetSystem(); 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(comp.GetEID())) - { - return; - } - auto cameraSystem = SHSystemManager::GetSystem(); - auto uiComp = SHComponentManager::GetComponent(comp.GetEID()); - //auto canvasComp = SHComponentManager::GetComponent_s(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(); 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(ws.first), static_cast(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()->editorState == SHEditor::State::PLAY) - { - if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::LMB)) - { - comp.isClicked = true; - } - } - #else + + + +#ifdef SHEDITOR + //if (SHSystemManager::GetSystem()->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(comp.GetEID())) + { + return; + } + auto cameraSystem = SHSystemManager::GetSystem(); + auto uiComp = SHComponentManager::GetComponent(comp.GetEID()); + //auto canvasComp = SHComponentManager::GetComponent_s(uiComp->canvasID); + + + + CheckButtonHoveredOrClicked(*uiComp); if (SHComponentManager::HasComponent(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(comp.GetEID()); //auto canvasComp = SHComponentManager::GetComponent_s(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()->beginContentRegionAvailable; - mousePos = SHEditorWindowManager::GetEditorWindow()->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()->GetWindow()->GetWindowSize(); - windowSize = { static_cast(ws.first), static_cast(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()->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(comp.GetEID())) { diff --git a/SHADE_Engine/src/UI/SHUISystem.h b/SHADE_Engine/src/UI/SHUISystem.h index ae1091ec..3b2bb2cf 100644 --- a/SHADE_Engine/src/UI/SHUISystem.h +++ b/SHADE_Engine/src/UI/SHUISystem.h @@ -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; diff --git a/SHADE_Managed/src/Components/Renderable.cxx b/SHADE_Managed/src/Components/Renderable.cxx index 1aa83637..929b0006 100644 --- a/SHADE_Managed/src/Components/Renderable.cxx +++ b/SHADE_Managed/src/Components/Renderable.cxx @@ -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) { diff --git a/SHADE_Managed/src/Components/Renderable.hxx b/SHADE_Managed/src/Components/Renderable.hxx index b0786035..a4417166 100644 --- a/SHADE_Managed/src/Components/Renderable.hxx +++ b/SHADE_Managed/src/Components/Renderable.hxx @@ -55,9 +55,19 @@ namespace SHADE void set(MeshAsset value); } /// - /// 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. /// property SHADE::Material Material + { + SHADE::Material get(); + } + /// + /// The shared Material used to render this Renderable and other Renderables + /// using the same base Material. + /// + property SHADE::Material SharedMaterial { SHADE::Material get(); void set(SHADE::Material value);