Merge remote-tracking branch 'origin/main' into SP3-16-Math
This commit is contained in:
commit
a3d2f95aa0
|
@ -0,0 +1,27 @@
|
||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Report a bug that should be fixed
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Describe the bug**
|
||||||
|
A clear and concise description of what the bug is.
|
||||||
|
|
||||||
|
**To Reproduce**
|
||||||
|
Steps to reproduce the behavior:
|
||||||
|
1. Go to '...'
|
||||||
|
2. Click on '....'
|
||||||
|
3. Scroll down to '....'
|
||||||
|
4. See error
|
||||||
|
|
||||||
|
**Expected behavior**
|
||||||
|
A clear and concise description of what you expected to happen.
|
||||||
|
|
||||||
|
**Screenshots**
|
||||||
|
If applicable, add screenshots to help explain your problem.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context about the problem here.
|
|
@ -0,0 +1,20 @@
|
||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest a feature for the project
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
File diff suppressed because one or more lines are too long
Binary file not shown.
|
@ -0,0 +1,55 @@
|
||||||
|
Name: HouseModular
|
||||||
|
ID: 75328301
|
||||||
|
Type: 4
|
||||||
|
Sub Assets:
|
||||||
|
Name: FloorLarge
|
||||||
|
ID: 142812576
|
||||||
|
Type: 8
|
||||||
|
Name: FloorSmall
|
||||||
|
ID: 139921228
|
||||||
|
Type: 8
|
||||||
|
Name: FloorLong
|
||||||
|
ID: 136991843
|
||||||
|
Type: 8
|
||||||
|
Name: Pillar
|
||||||
|
ID: 150352316
|
||||||
|
Type: 8
|
||||||
|
Name: WallEnd
|
||||||
|
ID: 139594893
|
||||||
|
Type: 8
|
||||||
|
Name: WallCorner
|
||||||
|
ID: 134714737
|
||||||
|
Type: 8
|
||||||
|
Name: WallDefault
|
||||||
|
ID: 140834166
|
||||||
|
Type: 8
|
||||||
|
Name: WallLarge
|
||||||
|
ID: 142689599
|
||||||
|
Type: 8
|
||||||
|
Name: WallDiagonal
|
||||||
|
ID: 144002377
|
||||||
|
Type: 8
|
||||||
|
Name: WallTBlock
|
||||||
|
ID: 149359798
|
||||||
|
Type: 8
|
||||||
|
Name: WindowLarge
|
||||||
|
ID: 148351779
|
||||||
|
Type: 8
|
||||||
|
Name: WindowSmallOpened
|
||||||
|
ID: 149786048
|
||||||
|
Type: 8
|
||||||
|
Name: WindowSmallClosed
|
||||||
|
ID: 147863396
|
||||||
|
Type: 8
|
||||||
|
Name: WindowLargeOpen
|
||||||
|
ID: 138781993
|
||||||
|
Type: 8
|
||||||
|
Name: WallDoorHole
|
||||||
|
ID: 150924328
|
||||||
|
Type: 8
|
||||||
|
Name: Door
|
||||||
|
ID: 147152385
|
||||||
|
Type: 8
|
||||||
|
Name: DoorFrame
|
||||||
|
ID: 146862321
|
||||||
|
Type: 8
|
|
@ -1,10 +1,10 @@
|
||||||
- EID: 0
|
- EID: 0
|
||||||
Name: Default
|
Name: Camera
|
||||||
IsActive: true
|
IsActive: true
|
||||||
NumberOfChildren: 0
|
NumberOfChildren: 0
|
||||||
Components:
|
Components:
|
||||||
Camera Component:
|
Camera Component:
|
||||||
Position: {x: 0, y: 0, z: 0}
|
Position: {x: 0, y: 0, z: 8}
|
||||||
Pitch: 0
|
Pitch: 0
|
||||||
Yaw: 0
|
Yaw: 0
|
||||||
Roll: 0
|
Roll: 0
|
||||||
|
@ -22,7 +22,7 @@
|
||||||
Strength: 0
|
Strength: 0
|
||||||
Scripts: ~
|
Scripts: ~
|
||||||
- EID: 1
|
- EID: 1
|
||||||
Name: Default
|
Name: Floor
|
||||||
IsActive: true
|
IsActive: true
|
||||||
NumberOfChildren: 0
|
NumberOfChildren: 0
|
||||||
Components:
|
Components:
|
||||||
|
@ -36,8 +36,8 @@
|
||||||
RigidBody Component:
|
RigidBody Component:
|
||||||
Type: Static
|
Type: Static
|
||||||
Mass: 1
|
Mass: 1
|
||||||
Drag: 0
|
Drag: 0.00999999978
|
||||||
Angular Drag: 0
|
Angular Drag: 0.00999999978
|
||||||
Use Gravity: true
|
Use Gravity: true
|
||||||
Interpolate: true
|
Interpolate: true
|
||||||
Freeze Position X: false
|
Freeze Position X: false
|
||||||
|
@ -56,18 +56,15 @@
|
||||||
Density: 1
|
Density: 1
|
||||||
Position Offset: {x: 0, y: 0, z: 0}
|
Position Offset: {x: 0, y: 0, z: 0}
|
||||||
Scripts: ~
|
Scripts: ~
|
||||||
- EID: 2
|
- EID: 10
|
||||||
Name: Player
|
Name: Default
|
||||||
IsActive: true
|
IsActive: true
|
||||||
NumberOfChildren: 3
|
NumberOfChildren: 0
|
||||||
Components:
|
Components:
|
||||||
Transform Component:
|
Transform Component:
|
||||||
Translate: {x: -3.06177855, y: -2, z: -5}
|
Translate: {x: -4.40482807, y: 2.57871056, z: -5.21213436}
|
||||||
Rotate: {x: -0, y: 0, z: -0}
|
Rotate: {x: -0.361265004, y: 1.11661232, z: -0.626627684}
|
||||||
Scale: {x: 2, y: 2, z: 2}
|
Scale: {x: 0.999982238, y: 0.999987125, z: 0.999981165}
|
||||||
Renderable Component:
|
|
||||||
Mesh: 149697411
|
|
||||||
Material: 126974645
|
|
||||||
RigidBody Component:
|
RigidBody Component:
|
||||||
Type: Dynamic
|
Type: Dynamic
|
||||||
Mass: 1
|
Mass: 1
|
||||||
|
@ -89,10 +86,10 @@
|
||||||
Friction: 0.400000006
|
Friction: 0.400000006
|
||||||
Bounciness: 0
|
Bounciness: 0
|
||||||
Density: 1
|
Density: 1
|
||||||
Position Offset: {x: 0, y: 0.5, z: 0}
|
Position Offset: {x: 0, y: 0, z: 0}
|
||||||
Scripts: ~
|
Scripts: ~
|
||||||
- EID: 3
|
- EID: 3
|
||||||
Name: Default
|
Name: Empty
|
||||||
IsActive: true
|
IsActive: true
|
||||||
NumberOfChildren: 0
|
NumberOfChildren: 0
|
||||||
Components:
|
Components:
|
||||||
|
@ -102,7 +99,7 @@
|
||||||
Scale: {x: 1, y: 1, z: 1}
|
Scale: {x: 1, y: 1, z: 1}
|
||||||
Scripts: ~
|
Scripts: ~
|
||||||
- EID: 4
|
- EID: 4
|
||||||
Name: Default
|
Name: Empty2
|
||||||
IsActive: true
|
IsActive: true
|
||||||
NumberOfChildren: 0
|
NumberOfChildren: 0
|
||||||
Components:
|
Components:
|
||||||
|
@ -112,7 +109,7 @@
|
||||||
Scale: {x: 1, y: 1, z: 1}
|
Scale: {x: 1, y: 1, z: 1}
|
||||||
Scripts: ~
|
Scripts: ~
|
||||||
- EID: 9
|
- EID: 9
|
||||||
Name: Default
|
Name: Bag
|
||||||
IsActive: true
|
IsActive: true
|
||||||
NumberOfChildren: 0
|
NumberOfChildren: 0
|
||||||
Components:
|
Components:
|
||||||
|
@ -160,7 +157,7 @@
|
||||||
Position Offset: {x: 0, y: 0.5, z: 0}
|
Position Offset: {x: 0, y: 0.5, z: 0}
|
||||||
Scripts: ~
|
Scripts: ~
|
||||||
- EID: 7
|
- EID: 7
|
||||||
Name: Default
|
Name: BigBoi
|
||||||
IsActive: true
|
IsActive: true
|
||||||
NumberOfChildren: 0
|
NumberOfChildren: 0
|
||||||
Components:
|
Components:
|
||||||
|
@ -173,7 +170,7 @@
|
||||||
Material: 126974645
|
Material: 126974645
|
||||||
Scripts: ~
|
Scripts: ~
|
||||||
- EID: 8
|
- EID: 8
|
||||||
Name: Default
|
Name: AmbientLight
|
||||||
IsActive: true
|
IsActive: true
|
||||||
NumberOfChildren: 0
|
NumberOfChildren: 0
|
||||||
Components:
|
Components:
|
||||||
|
|
|
@ -51,7 +51,6 @@ public class AIPrototype : Script
|
||||||
|
|
||||||
private GameObject? player;
|
private GameObject? player;
|
||||||
|
|
||||||
public AIPrototype(GameObject gameObj) : base(gameObj) { }
|
|
||||||
|
|
||||||
protected override void awake()
|
protected override void awake()
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: AIPrototype
|
||||||
|
ID: 163215061
|
||||||
|
Type: 9
|
|
@ -7,7 +7,6 @@ namespace SHADE_Scripting
|
||||||
{
|
{
|
||||||
public float turnSpeed = 0.5f;
|
public float turnSpeed = 0.5f;
|
||||||
|
|
||||||
public CameraControl(GameObject go) : base(go) { }
|
|
||||||
protected override void update()
|
protected override void update()
|
||||||
{
|
{
|
||||||
//Camera
|
//Camera
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: CameraControl
|
||||||
|
ID: 158782344
|
||||||
|
Type: 9
|
|
@ -3,7 +3,6 @@ using System;
|
||||||
|
|
||||||
public class CameraFix : Script
|
public class CameraFix : Script
|
||||||
{
|
{
|
||||||
public CameraFix(GameObject gameObj) : base(gameObj) { }
|
|
||||||
|
|
||||||
private Transform tranform;
|
private Transform tranform;
|
||||||
public Vector3 pos = Vector3.Zero;
|
public Vector3 pos = Vector3.Zero;
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: CameraFix
|
||||||
|
ID: 162231964
|
||||||
|
Type: 9
|
|
@ -10,7 +10,6 @@ public class Item : Script
|
||||||
}
|
}
|
||||||
|
|
||||||
public ItemCategory currCategory;
|
public ItemCategory currCategory;
|
||||||
public Item(GameObject gameObj) : base(gameObj) { }
|
|
||||||
|
|
||||||
protected override void awake()
|
protected override void awake()
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: Item
|
||||||
|
ID: 163145289
|
||||||
|
Type: 9
|
|
@ -8,7 +8,6 @@ public class PhysicsTest : Script
|
||||||
private Transform Transform;
|
private Transform Transform;
|
||||||
private RigidBody RigidBody;
|
private RigidBody RigidBody;
|
||||||
private Collider Collider;
|
private Collider Collider;
|
||||||
public PhysicsTest(GameObject gameObj) : base(gameObj) { }
|
|
||||||
|
|
||||||
protected override void awake()
|
protected override void awake()
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: PhysicsTest
|
||||||
|
ID: 159771801
|
||||||
|
Type: 9
|
|
@ -14,7 +14,6 @@ public class PickAndThrow : Script
|
||||||
private float lastXDir;
|
private float lastXDir;
|
||||||
private float lastZDir;
|
private float lastZDir;
|
||||||
private bool inRange = false;
|
private bool inRange = false;
|
||||||
public PickAndThrow(GameObject gameObj) : base(gameObj) { }
|
|
||||||
|
|
||||||
protected override void awake()
|
protected override void awake()
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: PickAndThrow
|
||||||
|
ID: 165331952
|
||||||
|
Type: 9
|
|
@ -73,8 +73,6 @@ public class PlayerController : Script
|
||||||
public float mediumMultiper = 0.5f;
|
public float mediumMultiper = 0.5f;
|
||||||
public float heavyMultiper = 0.25f;
|
public float heavyMultiper = 0.25f;
|
||||||
|
|
||||||
public PlayerController(GameObject gameObj) : base(gameObj) { }
|
|
||||||
|
|
||||||
protected override void awake()
|
protected override void awake()
|
||||||
{
|
{
|
||||||
//default setup
|
//default setup
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: PlayerController
|
||||||
|
ID: 164563088
|
||||||
|
Type: 9
|
|
@ -2,8 +2,6 @@
|
||||||
|
|
||||||
public class PrintWhenActive : Script
|
public class PrintWhenActive : Script
|
||||||
{
|
{
|
||||||
public PrintWhenActive(GameObject gameObj) : base(gameObj) { }
|
|
||||||
|
|
||||||
protected override void update()
|
protected override void update()
|
||||||
{
|
{
|
||||||
Debug.Log("Active!");
|
Debug.Log("Active!");
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: PrintWhenActive
|
||||||
|
ID: 162536221
|
||||||
|
Type: 9
|
|
@ -1,5 +1,6 @@
|
||||||
using SHADE;
|
using SHADE;
|
||||||
using System;
|
using System;
|
||||||
|
using System.Collections.Generic;
|
||||||
|
|
||||||
public class RaccoonShowcase : Script
|
public class RaccoonShowcase : Script
|
||||||
{
|
{
|
||||||
|
@ -17,7 +18,11 @@ public class RaccoonShowcase : Script
|
||||||
private double rotation = 0.0;
|
private double rotation = 0.0;
|
||||||
private Vector3 scale = Vector3.Zero;
|
private Vector3 scale = Vector3.Zero;
|
||||||
private double originalScale = 1.0f;
|
private double originalScale = 1.0f;
|
||||||
public RaccoonShowcase(GameObject gameObj) : base(gameObj) {}
|
[Tooltip("Sample list of Vector3s.")]
|
||||||
|
public List<Vector3> vecList = new List<Vector3>(new Vector3[] { new Vector3(1, 2, 3), new Vector3(4, 5, 6) });
|
||||||
|
[Range(-5, 5)]
|
||||||
|
public List<int> intList = new List<int>(new int[] { 2, 8, 2, 6, 8, 0, 1 });
|
||||||
|
public List<Light.Type> enumList = new List<Light.Type>(new Light.Type[] { Light.Type.Point, Light.Type.Directional, Light.Type.Ambient });
|
||||||
|
|
||||||
protected override void awake()
|
protected override void awake()
|
||||||
{
|
{
|
||||||
|
@ -27,6 +32,11 @@ public class RaccoonShowcase : Script
|
||||||
Debug.LogError("Transform is NULL!");
|
Debug.LogError("Transform is NULL!");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
foreach (var child in Owner)
|
||||||
|
{
|
||||||
|
Debug.Log(child.Name);
|
||||||
|
}
|
||||||
|
|
||||||
originalScale = Transform.LocalScale.z;
|
originalScale = Transform.LocalScale.z;
|
||||||
}
|
}
|
||||||
protected override void update()
|
protected override void update()
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: RaccoonShowcase
|
||||||
|
ID: 159969631
|
||||||
|
Type: 9
|
|
@ -14,8 +14,6 @@ public class RaccoonSpin : Script
|
||||||
[SerializeField]
|
[SerializeField]
|
||||||
private CallbackEvent<int, double, Vector3> testEvent3 = new CallbackEvent<int, double, Vector3>();
|
private CallbackEvent<int, double, Vector3> testEvent3 = new CallbackEvent<int, double, Vector3>();
|
||||||
private Transform Transform;
|
private Transform Transform;
|
||||||
public RaccoonSpin(GameObject gameObj) : base(gameObj) { }
|
|
||||||
|
|
||||||
|
|
||||||
protected override void awake()
|
protected override void awake()
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: RaccoonSpin
|
||||||
|
ID: 157367824
|
||||||
|
Type: 9
|
|
@ -15,7 +15,6 @@ namespace SHADE_Scripting
|
||||||
public float turnSpeedPitch = 0.3f;
|
public float turnSpeedPitch = 0.3f;
|
||||||
public float turnSpeedYaw = 0.5f;
|
public float turnSpeedYaw = 0.5f;
|
||||||
public float pitchClamp = 45.0f;
|
public float pitchClamp = 45.0f;
|
||||||
public ThirdPersonCamera(GameObject go) : base(go) { }
|
|
||||||
|
|
||||||
protected override void awake()
|
protected override void awake()
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: ThirdPersonCamera
|
||||||
|
ID: 154161201
|
||||||
|
Type: 9
|
Binary file not shown.
4993
Assets/racoon.gltf
4993
Assets/racoon.gltf
File diff suppressed because one or more lines are too long
|
@ -75,7 +75,8 @@ project "SHADE_Application"
|
||||||
"26439",
|
"26439",
|
||||||
"26451",
|
"26451",
|
||||||
"26437",
|
"26437",
|
||||||
"4275"
|
"4275",
|
||||||
|
"4635"
|
||||||
}
|
}
|
||||||
|
|
||||||
linkoptions { "-IGNORE:4006" }
|
linkoptions { "-IGNORE:4006" }
|
||||||
|
|
|
@ -8,8 +8,8 @@
|
||||||
//#include "Scenes/SBEditorScene.h"
|
//#include "Scenes/SBEditorScene.h"
|
||||||
#endif // SHEDITOR
|
#endif // SHEDITOR
|
||||||
|
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Tools/SHFileUtilties.h"
|
#include "Tools/Utilities/SHFileUtilties.h"
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <ratio>
|
#include <ratio>
|
||||||
|
@ -24,14 +24,15 @@
|
||||||
#include "Scene/SHSceneManager.h"
|
#include "Scene/SHSceneManager.h"
|
||||||
|
|
||||||
// Systems
|
// Systems
|
||||||
#include "Scripting/SHScriptEngine.h"
|
|
||||||
#include "Physics/SHPhysicsSystem.h"
|
|
||||||
#include "Math/Transform/SHTransformSystem.h"
|
|
||||||
#include "Input/SHInputManager.h"
|
|
||||||
#include "FRC/SHFramerateController.h"
|
|
||||||
#include "AudioSystem/SHAudioSystem.h"
|
#include "AudioSystem/SHAudioSystem.h"
|
||||||
#include "Camera/SHCameraSystem.h"
|
#include "Camera/SHCameraSystem.h"
|
||||||
|
#include "FRC/SHFramerateController.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHDebugDrawSystem.h"
|
#include "Graphics/MiddleEnd/Interface/SHDebugDrawSystem.h"
|
||||||
|
#include "Input/SHInputManager.h"
|
||||||
|
#include "Math/Transform/SHTransformSystem.h"
|
||||||
|
#include "Physics/System/SHPhysicsSystem.h"
|
||||||
|
#include "Physics/System/SHPhysicsDebugDrawSystem.h"
|
||||||
|
#include "Scripting/SHScriptEngine.h"
|
||||||
|
|
||||||
// Components
|
// Components
|
||||||
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
||||||
|
@ -39,12 +40,11 @@
|
||||||
|
|
||||||
#include "Scenes/SBTestScene.h"
|
#include "Scenes/SBTestScene.h"
|
||||||
|
|
||||||
|
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
#include "Scenes/SBMainScene.h"
|
#include "Scenes/SBMainScene.h"
|
||||||
#include "Serialization/Configurations/SHConfigurationManager.h"
|
#include "Serialization/Configurations/SHConfigurationManager.h"
|
||||||
|
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Tools/SHDebugDraw.h"
|
#include "Tools/SHDebugDraw.h"
|
||||||
|
|
||||||
using namespace SHADE;
|
using namespace SHADE;
|
||||||
|
@ -60,6 +60,8 @@ namespace Sandbox
|
||||||
_In_ INT nCmdShow
|
_In_ INT nCmdShow
|
||||||
)
|
)
|
||||||
{
|
{
|
||||||
|
SHLOG_INFO_D("Initialising SHADE engine")
|
||||||
|
|
||||||
// Set working directory
|
// Set working directory
|
||||||
SHFileUtilities::SetWorkDirToExecDir();
|
SHFileUtilities::SetWorkDirToExecDir();
|
||||||
WindowData wndData{};
|
WindowData wndData{};
|
||||||
|
@ -67,16 +69,21 @@ namespace Sandbox
|
||||||
window.Create(hInstance, hPrevInstance, lpCmdLine, nCmdShow, wndData);
|
window.Create(hInstance, hPrevInstance, lpCmdLine, nCmdShow, wndData);
|
||||||
|
|
||||||
// Create Systems
|
// Create Systems
|
||||||
SHSystemManager::CreateSystem<SHGraphicsSystem>();
|
|
||||||
SHSystemManager::CreateSystem<SHScriptEngine>();
|
SHSystemManager::CreateSystem<SHScriptEngine>();
|
||||||
SHSystemManager::CreateSystem<SHPhysicsSystem>();
|
|
||||||
SHSystemManager::CreateSystem<SHTransformSystem>();
|
SHSystemManager::CreateSystem<SHTransformSystem>();
|
||||||
SHGraphicsSystem* graphicsSystem = static_cast<SHGraphicsSystem*>(SHSystemManager::GetSystem<SHGraphicsSystem>());
|
SHSystemManager::CreateSystem<SHPhysicsSystem>();
|
||||||
|
SHSystemManager::CreateSystem<SHPhysicsDebugDrawSystem>();
|
||||||
|
|
||||||
SHSystemManager::CreateSystem<SHAudioSystem>();
|
SHSystemManager::CreateSystem<SHAudioSystem>();
|
||||||
SHSystemManager::CreateSystem<SHCameraSystem>();
|
SHSystemManager::CreateSystem<SHCameraSystem>();
|
||||||
SHSystemManager::CreateSystem<SHDebugDrawSystem>();
|
|
||||||
|
|
||||||
|
SHSystemManager::CreateSystem<SHGraphicsSystem>();
|
||||||
|
SHGraphicsSystem* graphicsSystem = static_cast<SHGraphicsSystem*>(SHSystemManager::GetSystem<SHGraphicsSystem>());
|
||||||
|
|
||||||
// Link up SHDebugDraw
|
// Link up SHDebugDraw
|
||||||
|
SHSystemManager::CreateSystem<SHDebugDrawSystem>();
|
||||||
SHDebugDraw::Init(SHSystemManager::GetSystem<SHDebugDrawSystem>());
|
SHDebugDraw::Init(SHSystemManager::GetSystem<SHDebugDrawSystem>());
|
||||||
|
|
||||||
#ifdef SHEDITOR
|
#ifdef SHEDITOR
|
||||||
|
@ -101,7 +108,8 @@ namespace Sandbox
|
||||||
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsPreUpdate>();
|
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsPreUpdate>();
|
||||||
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsFixedUpdate>();
|
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsFixedUpdate>();
|
||||||
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsPostUpdate>();
|
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsPostUpdate>();
|
||||||
SHSystemManager::RegisterRoutine<SHPhysicsSystem, SHPhysicsSystem::PhysicsDebugDraw>();
|
|
||||||
|
SHSystemManager::RegisterRoutine<SHPhysicsDebugDrawSystem, SHPhysicsDebugDrawSystem::PhysicsDebugDrawRoutine>();
|
||||||
|
|
||||||
SHSystemManager::RegisterRoutine<SHTransformSystem, SHTransformSystem::TransformPostPhysicsUpdate>();
|
SHSystemManager::RegisterRoutine<SHTransformSystem, SHTransformSystem::TransformPostPhysicsUpdate>();
|
||||||
SHSystemManager::RegisterRoutine<SHDebugDrawSystem, SHDebugDrawSystem::ProcessPointsRoutine>();
|
SHSystemManager::RegisterRoutine<SHDebugDrawSystem, SHDebugDrawSystem::ProcessPointsRoutine>();
|
||||||
|
@ -165,7 +173,7 @@ namespace Sandbox
|
||||||
if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::F10))
|
if (SHInputManager::GetKeyDown(SHInputManager::SH_KEYCODE::F10))
|
||||||
{
|
{
|
||||||
drawColliders = !drawColliders;
|
drawColliders = !drawColliders;
|
||||||
SHSystemManager::GetSystem<SHPhysicsSystem>()->SetDrawColliders(drawColliders);
|
SHSystemManager::GetSystem<SHPhysicsDebugDrawSystem>()->SetDebugDrawFlag(SHPhysicsDebugDrawSystem::DebugDrawFlags::COLLIDER, drawColliders);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
// Finish all graphics jobs first
|
// Finish all graphics jobs first
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
#include "Scripting/SHScriptEngine.h"
|
#include "Scripting/SHScriptEngine.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
||||||
#include "Physics/Components/SHRigidBodyComponent.h"
|
#include "Physics/Interface/SHRigidBodyComponent.h"
|
||||||
#include "Physics/Components/SHColliderComponent.h"
|
#include "Physics/Interface/SHColliderComponent.h"
|
||||||
#include "Graphics/MiddleEnd/Lights/SHLightComponent.h"
|
#include "Graphics/MiddleEnd/Lights/SHLightComponent.h"
|
||||||
|
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
|
|
|
@ -10,8 +10,8 @@
|
||||||
#include "Scripting/SHScriptEngine.h"
|
#include "Scripting/SHScriptEngine.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
||||||
#include "Physics/Components/SHRigidBodyComponent.h"
|
#include "Physics/Interface/SHRigidBodyComponent.h"
|
||||||
#include "Physics/Components/SHColliderComponent.h"
|
#include "Physics/Interface/SHColliderComponent.h"
|
||||||
#include "Graphics/MiddleEnd/Lights/SHLightComponent.h"
|
#include "Graphics/MiddleEnd/Lights/SHLightComponent.h"
|
||||||
|
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "SBpch.h"
|
#include "SBpch.h"
|
||||||
#include <Engine/SHEngine.h>
|
#include <Engine/SHEngine.h>
|
||||||
#include <Tools/SHLogger.h>
|
#include <Tools/Logger/SHLogger.h>
|
||||||
#include <Tools/SHExceptionHandler.h>
|
#include <Tools/SHExceptionHandler.h>
|
||||||
#include "Application/SBApplication.h"
|
#include "Application/SBApplication.h"
|
||||||
|
|
||||||
|
|
|
@ -27,6 +27,12 @@ project "SHADE_CSharp"
|
||||||
|
|
||||||
warnings 'Extra'
|
warnings 'Extra'
|
||||||
|
|
||||||
|
postbuildcommands
|
||||||
|
{
|
||||||
|
"xcopy /r /y /q \"%{outputdir}\\net5.0\\SHADE_CSharp.xml\" \"%{outputdir}\"",
|
||||||
|
"xcopy /r /y /q \"%{outputdir}\\net5.0\\SHADE_CSharp.pdb\" \"%{outputdir}\""
|
||||||
|
}
|
||||||
|
|
||||||
filter "configurations:Debug"
|
filter "configurations:Debug"
|
||||||
symbols "On"
|
symbols "On"
|
||||||
defines {"_DEBUG"}
|
defines {"_DEBUG"}
|
||||||
|
@ -41,12 +47,18 @@ project "SHADE_CSharp"
|
||||||
|
|
||||||
require "vstudio"
|
require "vstudio"
|
||||||
|
|
||||||
function platformsElement(cfg)
|
function platformsElementCS(cfg)
|
||||||
_p(2,'<Platforms>x64</Platforms>')
|
_p(2,'<Platforms>x64</Platforms>')
|
||||||
end
|
end
|
||||||
|
function docsElementCS(cfg)
|
||||||
|
_p(2,'<GenerateDocumentationFile>true</GenerateDocumentationFile>')
|
||||||
|
end
|
||||||
|
function docsLocationElementCS(cfg)
|
||||||
|
_p(2,'<DocumentationFile>$(OutDir)</DocumentationFile>')
|
||||||
|
end
|
||||||
|
|
||||||
premake.override(premake.vstudio.cs2005.elements, "projectProperties", function (oldfn, cfg)
|
premake.override(premake.vstudio.cs2005.elements, "projectProperties", function (oldfn, cfg)
|
||||||
return table.join(oldfn(cfg), {
|
return table.join(oldfn(cfg), {
|
||||||
platformsElement,
|
platformsElementCS, docsElementCS, docsLocationElementCS,
|
||||||
})
|
})
|
||||||
end)
|
end)
|
|
@ -78,7 +78,8 @@ project "SHADE_Engine"
|
||||||
"26439",
|
"26439",
|
||||||
"26451",
|
"26451",
|
||||||
"26437",
|
"26437",
|
||||||
"4275"
|
"4275",
|
||||||
|
"4635"
|
||||||
}
|
}
|
||||||
|
|
||||||
linkoptions { "-IGNORE:4006" }
|
linkoptions { "-IGNORE:4006" }
|
||||||
|
|
|
@ -52,6 +52,8 @@ enum class AssetType : AssetTypeMeta
|
||||||
PREFAB,
|
PREFAB,
|
||||||
MATERIAL,
|
MATERIAL,
|
||||||
MESH,
|
MESH,
|
||||||
|
SCRIPT,
|
||||||
|
FONT,
|
||||||
MAX_COUNT
|
MAX_COUNT
|
||||||
};
|
};
|
||||||
constexpr size_t TYPE_COUNT{ static_cast<size_t>(AssetType::MAX_COUNT) };
|
constexpr size_t TYPE_COUNT{ static_cast<size_t>(AssetType::MAX_COUNT) };
|
||||||
|
@ -85,32 +87,39 @@ constexpr std::string_view SCENE_EXTENSION {".shade"};
|
||||||
constexpr std::string_view PREFAB_EXTENSION {".shprefab"};
|
constexpr std::string_view PREFAB_EXTENSION {".shprefab"};
|
||||||
constexpr std::string_view MATERIAL_EXTENSION {".shmat"};
|
constexpr std::string_view MATERIAL_EXTENSION {".shmat"};
|
||||||
constexpr std::string_view TEXTURE_EXTENSION {".shtex"};
|
constexpr std::string_view TEXTURE_EXTENSION {".shtex"};
|
||||||
constexpr std::string_view MODEL_EXTENSION {".shmodel"};
|
constexpr std::string_view MODEL_EXTENSION{ ".shmodel" };
|
||||||
|
constexpr std::string_view FONT_EXTENSION{ ".shfont" };
|
||||||
|
|
||||||
constexpr std::string_view EXTENSIONS[] = {
|
constexpr std::string_view EXTENSIONS[] = {
|
||||||
AUDIO_EXTENSION,
|
AUDIO_EXTENSION,
|
||||||
SHADER_EXTENSION,
|
SHADER_EXTENSION,
|
||||||
SHADER_BUILT_IN_EXTENSION,
|
SHADER_BUILT_IN_EXTENSION,
|
||||||
MATERIAL_EXTENSION,
|
TEXTURE_EXTENSION,
|
||||||
TEXTURE_EXTENSION,
|
|
||||||
MODEL_EXTENSION,
|
MODEL_EXTENSION,
|
||||||
SCRIPT_EXTENSION,
|
SCENE_EXTENSION,
|
||||||
SCENE_EXTENSION,
|
|
||||||
PREFAB_EXTENSION,
|
PREFAB_EXTENSION,
|
||||||
|
MATERIAL_EXTENSION,
|
||||||
|
"dummy",
|
||||||
|
SCRIPT_EXTENSION,
|
||||||
|
FONT_EXTENSION,
|
||||||
AUDIO_WAV_EXTENSION,
|
AUDIO_WAV_EXTENSION,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
constexpr size_t EXTENSIONS_COUNT{ 11 };
|
||||||
|
|
||||||
// EXTERNAL EXTENSIONS
|
// EXTERNAL EXTENSIONS
|
||||||
constexpr std::string_view GLSL_EXTENSION{ ".glsl" };
|
constexpr std::string_view GLSL_EXTENSION{ ".glsl" };
|
||||||
constexpr std::string_view DDS_EXTENSION{ ".dds" };
|
constexpr std::string_view DDS_EXTENSION{ ".dds" };
|
||||||
constexpr std::string_view FBX_EXTENSION{ ".fbx" };
|
constexpr std::string_view FBX_EXTENSION{ ".fbx" };
|
||||||
constexpr std::string_view GLTF_EXTENSION{ ".gltf" };
|
constexpr std::string_view GLTF_EXTENSION{ ".gltf" };
|
||||||
|
constexpr std::string_view TTF_EXTENSION{ ".ttf" };
|
||||||
|
|
||||||
constexpr std::string_view EXTERNALS[] = {
|
constexpr std::string_view EXTERNALS[] = {
|
||||||
GLSL_EXTENSION,
|
GLSL_EXTENSION,
|
||||||
DDS_EXTENSION,
|
DDS_EXTENSION,
|
||||||
FBX_EXTENSION,
|
FBX_EXTENSION,
|
||||||
GLTF_EXTENSION
|
GLTF_EXTENSION,
|
||||||
|
TTF_EXTENSION
|
||||||
};
|
};
|
||||||
|
|
||||||
// SHADER IDENTIFIERS
|
// SHADER IDENTIFIERS
|
||||||
|
@ -125,11 +134,4 @@ constexpr std::pair<std::string_view, SHADE::SH_SHADER_TYPE> SHADER_IDENTIFIERS[
|
||||||
};
|
};
|
||||||
|
|
||||||
constexpr size_t SHADER_TYPE_MAX_COUNT{ 3 };
|
constexpr size_t SHADER_TYPE_MAX_COUNT{ 3 };
|
||||||
|
|
||||||
// Error flags
|
|
||||||
constexpr std::string_view FILE_NOT_FOUND_ERR {"FILE NOT FOUND"};
|
|
||||||
constexpr std::string_view META_NOT_FOUND_ERR {"META NOT FOUND"};
|
|
||||||
constexpr std::string_view ASSET_NOT_FOUND_ERR {"ASSET NOT FOUND"};
|
|
||||||
constexpr std::string_view EXT_DOES_NOT_EXIST {"TYPE DOES NOT HAVE EXTENSION DEFINED"};
|
|
||||||
|
|
||||||
#endif // !SH_ASSET_MACROS_H
|
#endif // !SH_ASSET_MACROS_H
|
||||||
|
|
|
@ -83,7 +83,7 @@ namespace SHADE
|
||||||
|
|
||||||
AssetPath SHAssetManager::GenerateLocalPath(AssetPath path) noexcept
|
AssetPath SHAssetManager::GenerateLocalPath(AssetPath path) noexcept
|
||||||
{
|
{
|
||||||
if (!IsRecognised(path.extension().string().c_str()))
|
if (!SHFileSystem::IsRecognised(path.extension().string().c_str()))
|
||||||
{
|
{
|
||||||
//TODO:ASSERT UNRECOGNISED FILE TYPE
|
//TODO:ASSERT UNRECOGNISED FILE TYPE
|
||||||
return std::filesystem::path();
|
return std::filesystem::path();
|
||||||
|
@ -161,21 +161,39 @@ namespace SHADE
|
||||||
newPath += PREFAB_FOLDER;
|
newPath += PREFAB_FOLDER;
|
||||||
newPath += name;
|
newPath += name;
|
||||||
newPath += PREFAB_EXTENSION;
|
newPath += PREFAB_EXTENSION;
|
||||||
data = new SHPrefabAsset();
|
{
|
||||||
|
auto prefab = new SHPrefabAsset();
|
||||||
|
prefab->name = name;
|
||||||
|
|
||||||
|
data = prefab;
|
||||||
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AssetType::SCENE:
|
case AssetType::SCENE:
|
||||||
newPath += SCENE_FOLDER;
|
newPath += SCENE_FOLDER;
|
||||||
newPath += name;
|
newPath += name;
|
||||||
newPath += SCENE_EXTENSION;
|
newPath += SCENE_EXTENSION;
|
||||||
data = new SHSceneAsset();
|
|
||||||
|
{
|
||||||
|
auto scene = new SHSceneAsset();
|
||||||
|
scene->name = name;
|
||||||
|
|
||||||
|
data = scene;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case AssetType::MATERIAL:
|
case AssetType::MATERIAL:
|
||||||
newPath += MATERIAL_FOLDER;
|
newPath += MATERIAL_FOLDER;
|
||||||
newPath += name;
|
newPath += name;
|
||||||
newPath += MATERIAL_EXTENSION;
|
newPath += MATERIAL_EXTENSION;
|
||||||
data = new SHMaterialAsset();
|
|
||||||
|
{
|
||||||
|
auto material = new SHMaterialAsset();
|
||||||
|
material->name = name;
|
||||||
|
|
||||||
|
data = material;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
|
|
||||||
default:
|
default:
|
||||||
|
@ -192,7 +210,7 @@ namespace SHADE
|
||||||
false
|
false
|
||||||
};
|
};
|
||||||
|
|
||||||
assetCollection.insert({
|
auto result = assetCollection.emplace(
|
||||||
id,
|
id,
|
||||||
SHAsset(
|
SHAsset(
|
||||||
name,
|
name,
|
||||||
|
@ -201,10 +219,13 @@ namespace SHADE
|
||||||
newPath,
|
newPath,
|
||||||
false
|
false
|
||||||
)
|
)
|
||||||
});
|
);
|
||||||
|
|
||||||
assetData.emplace(id, data);
|
assetData.emplace(id, data);
|
||||||
|
|
||||||
|
SHAssetMetaHandler::WriteMetaData(asset);
|
||||||
|
SaveAsset(id);
|
||||||
|
|
||||||
return id;
|
return id;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -338,7 +359,7 @@ namespace SHADE
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssetManager::CompileAsset(AssetPath const& path) noexcept
|
void SHAssetManager::CompileAsset(AssetPath const& path, bool genMeta) noexcept
|
||||||
{
|
{
|
||||||
if (!std::filesystem::exists(path))
|
if (!std::filesystem::exists(path))
|
||||||
{
|
{
|
||||||
|
@ -360,10 +381,27 @@ namespace SHADE
|
||||||
std::string modelPath = path.string().substr(0, path.string().find_last_of('.'));
|
std::string modelPath = path.string().substr(0, path.string().find_last_of('.'));
|
||||||
modelPath += MODEL_EXTENSION;
|
modelPath += MODEL_EXTENSION;
|
||||||
newPath = modelPath;
|
newPath = modelPath;
|
||||||
|
}
|
||||||
GenerateNewMeta(newPath);
|
else if (ext == DDS_EXTENSION.data())
|
||||||
|
{
|
||||||
|
auto pathGen = SHTextureCompiler::CompileTextureAsset(path);
|
||||||
|
if (!pathGen.has_value())
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Texture Compilation Failed for: {}", path.string());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
newPath = pathGen.value();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHLOG_WARNING("File Type compilation not yet Implemented: {}", path.string());
|
||||||
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (genMeta)
|
||||||
|
{
|
||||||
|
GenerateNewMeta(newPath);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
FolderPointer SHAssetManager::GetRootFolder() noexcept
|
FolderPointer SHAssetManager::GetRootFolder() noexcept
|
||||||
|
@ -371,18 +409,12 @@ namespace SHADE
|
||||||
return folderRoot;
|
return folderRoot;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHAssetManager::IsRecognised(char const* ext) noexcept
|
void SHAssetManager::RefreshDirectory() noexcept
|
||||||
{
|
{
|
||||||
for (auto const& e : EXTENSIONS)
|
SHFileSystem::DestroyDirectory(folderRoot);
|
||||||
{
|
//assetCollection.clear();
|
||||||
if (strcmp(ext, e.data()) == 0)
|
BuildAssetCollection();
|
||||||
{
|
}
|
||||||
return true;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
SHAsset SHAssetManager::CreateAssetFromPath(AssetPath path) noexcept
|
SHAsset SHAssetManager::CreateAssetFromPath(AssetPath path) noexcept
|
||||||
{
|
{
|
||||||
|
@ -396,51 +428,6 @@ namespace SHADE
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssetManager::CompileAll() noexcept
|
|
||||||
{
|
|
||||||
std::vector<AssetPath> paths;
|
|
||||||
|
|
||||||
for (auto const& dir : std::filesystem::recursive_directory_iterator{ ASSET_ROOT })
|
|
||||||
{
|
|
||||||
if (dir.is_regular_file())
|
|
||||||
{
|
|
||||||
for (auto const& ext : EXTERNALS)
|
|
||||||
{
|
|
||||||
if (dir.path().extension().string() == ext.data())
|
|
||||||
{
|
|
||||||
paths.push_back(dir.path());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
for (auto const& path : paths)
|
|
||||||
{
|
|
||||||
AssetPath newPath;
|
|
||||||
auto const ext{ path.extension().string() };
|
|
||||||
if (ext == GLSL_EXTENSION.data())
|
|
||||||
{
|
|
||||||
newPath = SHShaderSourceCompiler::LoadAndCompileShader(path).value();
|
|
||||||
}
|
|
||||||
else if (ext == DDS_EXTENSION.data())
|
|
||||||
{
|
|
||||||
newPath = SHTextureCompiler::CompileTextureAsset(path).value();
|
|
||||||
}
|
|
||||||
else if (ext == GLTF_EXTENSION.data() || ext == FBX_EXTENSION.data())
|
|
||||||
{
|
|
||||||
std::string command = MODEL_COMPILER_EXE.data();
|
|
||||||
command += " " + path.string();
|
|
||||||
std::system(command.c_str());
|
|
||||||
|
|
||||||
std::string modelPath = path.string().substr(0, path.string().find_last_of('.'));
|
|
||||||
modelPath += MODEL_EXTENSION;
|
|
||||||
newPath = modelPath;
|
|
||||||
}
|
|
||||||
|
|
||||||
GenerateNewMeta(newPath);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SHAssetManager::DeleteLocalFile(AssetPath path) noexcept
|
bool SHAssetManager::DeleteLocalFile(AssetPath path) noexcept
|
||||||
{
|
{
|
||||||
//TODO Move this to dedicated library
|
//TODO Move this to dedicated library
|
||||||
|
@ -536,7 +523,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssetManager::GenerateNewMeta(AssetPath path) noexcept
|
std::optional<AssetID> SHAssetManager::GenerateNewMeta(AssetPath path) noexcept
|
||||||
{
|
{
|
||||||
auto const ext = path.extension().string();
|
auto const ext = path.extension().string();
|
||||||
if (ext == SHADER_BUILT_IN_EXTENSION.data())
|
if (ext == SHADER_BUILT_IN_EXTENSION.data())
|
||||||
|
@ -556,7 +543,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
SHAsset newAsset{
|
SHAsset newAsset{
|
||||||
path.stem().string(),
|
path.stem().string(),
|
||||||
GenerateAssetID(AssetType::SHADER_BUILT_IN),
|
GenerateAssetID(AssetType::TEXTURE),
|
||||||
AssetType::SHADER_BUILT_IN,
|
AssetType::SHADER_BUILT_IN,
|
||||||
path,
|
path,
|
||||||
false
|
false
|
||||||
|
@ -597,11 +584,63 @@ namespace SHADE
|
||||||
|
|
||||||
SHAssetMetaHandler::WriteMetaData(assetCollection[newAsset.id]);
|
SHAssetMetaHandler::WriteMetaData(assetCollection[newAsset.id]);
|
||||||
}
|
}
|
||||||
|
else if (ext == SCRIPT_EXTENSION)
|
||||||
|
{
|
||||||
|
SHAsset newAsset{
|
||||||
|
path.stem().string(),
|
||||||
|
GenerateAssetID(AssetType::SCRIPT),
|
||||||
|
AssetType::SCRIPT,
|
||||||
|
path,
|
||||||
|
false
|
||||||
|
};
|
||||||
|
assetCollection.emplace(newAsset.id, newAsset);
|
||||||
|
SHAssetMetaHandler::WriteMetaData(newAsset);
|
||||||
|
|
||||||
|
return newAsset.id;
|
||||||
|
}
|
||||||
|
else if (ext == SCENE_EXTENSION)
|
||||||
|
{
|
||||||
|
SHAsset newAsset{
|
||||||
|
path.stem().string(),
|
||||||
|
GenerateAssetID(AssetType::SCENE),
|
||||||
|
AssetType::SCENE,
|
||||||
|
path,
|
||||||
|
false
|
||||||
|
};
|
||||||
|
assetCollection.emplace(newAsset.id, newAsset);
|
||||||
|
SHAssetMetaHandler::WriteMetaData(newAsset);
|
||||||
|
|
||||||
|
return newAsset.id;
|
||||||
|
}
|
||||||
|
else if (ext == FONT_EXTENSION)
|
||||||
|
{
|
||||||
|
SHAsset newAsset{
|
||||||
|
path.stem().string(),
|
||||||
|
GenerateAssetID(AssetType::FONT),
|
||||||
|
AssetType::FONT,
|
||||||
|
path,
|
||||||
|
false
|
||||||
|
};
|
||||||
|
assetCollection.emplace(newAsset.id, newAsset);
|
||||||
|
SHAssetMetaHandler::WriteMetaData(newAsset);
|
||||||
|
|
||||||
|
return newAsset.id;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssetManager::BuildAssetCollection() noexcept
|
void SHAssetManager::BuildAssetCollection() noexcept
|
||||||
{
|
{
|
||||||
SHFileSystem::BuildDirectory(ASSET_ROOT.data(), folderRoot, assetCollection);
|
std::vector<SHFile*> toGenNew;
|
||||||
|
SHFileSystem::BuildDirectory(ASSET_ROOT.data(), folderRoot, assetCollection, toGenNew);
|
||||||
|
|
||||||
|
for (auto& file : toGenNew)
|
||||||
|
{
|
||||||
|
auto newID{ GenerateNewMeta(file->path) };
|
||||||
|
if (newID.has_value())
|
||||||
|
{
|
||||||
|
file->assetMeta = &assetCollection[newID.value()];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
for (auto& asset : std::ranges::views::values(assetCollection))
|
for (auto& asset : std::ranges::views::values(assetCollection))
|
||||||
{
|
{
|
||||||
|
@ -611,6 +650,12 @@ namespace SHADE
|
||||||
for (auto i{ 0 }; i < asset.subAssets.size(); ++i)
|
for (auto i{ 0 }; i < asset.subAssets.size(); ++i)
|
||||||
{
|
{
|
||||||
auto const id = asset.subAssets[i]->id;
|
auto const id = asset.subAssets[i]->id;
|
||||||
|
|
||||||
|
if (assetCollection.contains(id))
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
assetCollection[id] = *asset.subAssets[i];
|
assetCollection[id] = *asset.subAssets[i];
|
||||||
delete asset.subAssets[i];
|
delete asset.subAssets[i];
|
||||||
asset.subAssets[i] = &assetCollection[id];
|
asset.subAssets[i] = &assetCollection[id];
|
||||||
|
|
|
@ -87,9 +87,10 @@ namespace SHADE
|
||||||
static std::vector<SHAssetData const*> GetAllDataOfType(AssetType type) noexcept;
|
static std::vector<SHAssetData const*> GetAllDataOfType(AssetType type) noexcept;
|
||||||
static std::vector<SHAsset> GetAllRecordOfType(AssetType type) noexcept;
|
static std::vector<SHAsset> GetAllRecordOfType(AssetType type) noexcept;
|
||||||
|
|
||||||
static void CompileAsset(AssetPath const& path) noexcept;
|
static void CompileAsset(AssetPath const& path, bool genMeta) noexcept;
|
||||||
|
|
||||||
static FolderPointer GetRootFolder() noexcept;
|
static FolderPointer GetRootFolder() noexcept;
|
||||||
|
static void RefreshDirectory() noexcept;
|
||||||
|
|
||||||
private:
|
private:
|
||||||
|
|
||||||
|
@ -98,16 +99,12 @@ namespace SHADE
|
||||||
static SHAssetData* LoadData(SHAsset const& asset) noexcept;
|
static SHAssetData* LoadData(SHAsset const& asset) noexcept;
|
||||||
static SHAssetData* LoadSubData(SHAsset const& asset) noexcept;
|
static SHAssetData* LoadSubData(SHAsset const& asset) noexcept;
|
||||||
static void LoadNewData(AssetPath path) noexcept;
|
static void LoadNewData(AssetPath path) noexcept;
|
||||||
static void GenerateNewMeta(AssetPath path) noexcept;
|
static std::optional<AssetID> GenerateNewMeta(AssetPath path) noexcept;
|
||||||
|
|
||||||
inline static void BuildAssetCollection() noexcept;
|
inline static void BuildAssetCollection() noexcept;
|
||||||
|
|
||||||
static bool IsRecognised(char const*) noexcept;
|
|
||||||
|
|
||||||
static SHAsset CreateAssetFromPath(AssetPath path) noexcept;
|
static SHAsset CreateAssetFromPath(AssetPath path) noexcept;
|
||||||
|
|
||||||
static void CompileAll() noexcept;
|
|
||||||
|
|
||||||
static bool DeleteLocalFile(AssetPath path) noexcept;
|
static bool DeleteLocalFile(AssetPath path) noexcept;
|
||||||
|
|
||||||
//TODO use this function to create asset data internall at all calls to generate id
|
//TODO use this function to create asset data internall at all calls to generate id
|
||||||
|
|
|
@ -38,7 +38,7 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
AssetType SHAssetMetaHandler::GetTypeFromExtension(AssetExtension ext) noexcept
|
AssetType SHAssetMetaHandler::GetTypeFromExtension(AssetExtension ext) noexcept
|
||||||
{
|
{
|
||||||
for (int i{0}; i < EXTENSIONS->size(); ++i)
|
for (auto i{0}; i < EXTENSIONS_COUNT; ++i)
|
||||||
{
|
{
|
||||||
if (strcmp(ext.c_str(), EXTENSIONS[i].data()) == 0)
|
if (strcmp(ext.c_str(), EXTENSIONS[i].data()) == 0)
|
||||||
{
|
{
|
||||||
|
@ -98,6 +98,7 @@ namespace SHADE
|
||||||
meta.type = static_cast<AssetType>(type);
|
meta.type = static_cast<AssetType>(type);
|
||||||
|
|
||||||
meta.isSubAsset = false;
|
meta.isSubAsset = false;
|
||||||
|
meta.parent = 0;
|
||||||
|
|
||||||
// Burn Line
|
// Burn Line
|
||||||
if (std::getline(metaFile, line))
|
if (std::getline(metaFile, line))
|
||||||
|
@ -137,6 +138,7 @@ namespace SHADE
|
||||||
metaFile.close();
|
metaFile.close();
|
||||||
|
|
||||||
meta.path = path.parent_path().string() + "/" + path.stem().string();
|
meta.path = path.parent_path().string() + "/" + path.stem().string();
|
||||||
|
meta.path.make_preferred();
|
||||||
|
|
||||||
return meta;
|
return meta;
|
||||||
}
|
}
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#include "ECS_Base/Managers/SHComponentManager.h"
|
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||||
#include "ECS_Base/SHECSMacros.h"
|
#include "ECS_Base/SHECSMacros.h"
|
||||||
#include "ECS_Base/Managers/SHEntityManager.h"
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
#include "Tools/SHLog.h"
|
#include "Tools/Logger/SHLog.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -7,13 +7,15 @@
|
||||||
#include "ECS_Base/Managers/SHComponentManager.h"
|
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
#include <math.h>
|
#include <math.h>
|
||||||
|
#include "Scene/SHSceneManager.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
void SHCameraSystem::UpdateEditorCamera(double dt) noexcept
|
void SHCameraSystem::UpdateEditorCamera(double dt) noexcept
|
||||||
{
|
{
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
auto& camera = editorCamera;
|
auto& camera = editorCamera;
|
||||||
SHVec3 view, right, UP;
|
SHVec3 view, right, UP;
|
||||||
GetCameraAxis(camera, view, right, UP);
|
GetCameraAxis(camera, view, right, UP);
|
||||||
|
@ -61,63 +63,43 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
UpdateCameraComponent(editorCamera);
|
UpdateCameraComponent(editorCamera);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCameraSystem::UpdateEditorArm(double dt,bool active ,SHVec3 const& targetPos) noexcept
|
||||||
|
{
|
||||||
|
if (active == false)
|
||||||
|
{
|
||||||
|
editorCameraArm.offset = SHVec3{0.0f};
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
editorCamera.SetPosition(targetPos);
|
||||||
|
double mouseX, mouseY;
|
||||||
|
SHInputManager::GetMouseVelocity(&mouseX, &mouseY);
|
||||||
|
|
||||||
|
editorCameraArm.pitch -= mouseY * dt * editorCamera.turnSpeed.x;
|
||||||
|
editorCameraArm.yaw -= mouseX * dt * editorCamera.turnSpeed.y;
|
||||||
|
|
||||||
|
constexpr float pitchClamp = 85.0f;
|
||||||
|
|
||||||
|
if (editorCameraArm.pitch > pitchClamp)
|
||||||
|
editorCameraArm.pitch = pitchClamp;
|
||||||
|
if (editorCameraArm.pitch < -pitchClamp)
|
||||||
|
editorCameraArm.pitch = -pitchClamp;
|
||||||
|
|
||||||
|
editorCameraArm.armLength -= SHInputManager::GetMouseWheelVerticalDelta() * dt;
|
||||||
|
|
||||||
|
if (editorCameraArm.armLength < 1.0f)
|
||||||
|
editorCameraArm.armLength = 1.0f;
|
||||||
|
|
||||||
|
UpdatePivotArmComponent(editorCameraArm);
|
||||||
|
|
||||||
|
editorCamera.offset = editorCameraArm.GetOffset();
|
||||||
|
|
||||||
|
CameraLookAt(editorCamera, targetPos);
|
||||||
|
|
||||||
}
|
}
|
||||||
void SHCameraSystem::EditorCameraUpdate::Execute(double dt) noexcept
|
|
||||||
{
|
|
||||||
SHCameraSystem* system = static_cast<SHCameraSystem*>(GetSystem());
|
|
||||||
auto& camera = system->editorCamera;
|
|
||||||
SHVec3 view, right, UP;
|
|
||||||
system->GetCameraAxis(camera, view, right, UP);
|
|
||||||
|
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::A))
|
|
||||||
{
|
|
||||||
//std::cout << "Camera movement: "<<right.x<<", " << right.y << std::endl;
|
|
||||||
camera.position -= right * dt * camera.movementSpeed;
|
|
||||||
camera.dirtyView = true;
|
|
||||||
}
|
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::D))
|
|
||||||
{
|
|
||||||
camera.position += right * dt * camera.movementSpeed;
|
|
||||||
camera.dirtyView = true;
|
|
||||||
}
|
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::W))
|
|
||||||
{
|
|
||||||
camera.position += view * dt * camera.movementSpeed;
|
|
||||||
camera.dirtyView = true;
|
|
||||||
}
|
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::S))
|
|
||||||
{
|
|
||||||
camera.position -= view * dt * camera.movementSpeed;
|
|
||||||
camera.dirtyView = true;
|
|
||||||
}
|
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::Q))
|
|
||||||
{
|
|
||||||
camera.position += UP * dt * camera.movementSpeed;
|
|
||||||
camera.dirtyView = true;
|
|
||||||
}
|
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::E))
|
|
||||||
{
|
|
||||||
camera.position -= UP * dt * camera.movementSpeed;
|
|
||||||
camera.dirtyView = true;
|
|
||||||
}
|
|
||||||
if (SHInputManager::GetKey(SHInputManager::SH_KEYCODE::RMB))
|
|
||||||
{
|
|
||||||
double mouseX, mouseY;
|
|
||||||
SHInputManager::GetMouseVelocity(&mouseX,&mouseY);
|
|
||||||
|
|
||||||
//std::cout << camera.yaw << std::endl;
|
|
||||||
|
|
||||||
camera.pitch -= mouseY * dt * camera.turnSpeed.x;
|
|
||||||
camera.yaw -= mouseX * dt * camera.turnSpeed.y;
|
|
||||||
camera.dirtyView = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
//std::cout << "Camera position: " << camera.position.x << " " << camera.position.y << std::endl;
|
|
||||||
system->UpdateCameraComponent(system->editorCamera);
|
|
||||||
|
|
||||||
system->DecomposeViewMatrix(camera.viewMatrix, camera.pitch, camera.yaw, camera.roll, camera.position);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHCameraSystem::Init(void)
|
void SHCameraSystem::Init(void)
|
||||||
{
|
{
|
||||||
|
@ -164,6 +146,9 @@ namespace SHADE
|
||||||
|
|
||||||
void SHCameraSystem::UpdateCameraComponent(SHCameraComponent& camera) noexcept
|
void SHCameraSystem::UpdateCameraComponent(SHCameraComponent& camera) noexcept
|
||||||
{
|
{
|
||||||
|
if (camera.isActive == false)
|
||||||
|
return;
|
||||||
|
|
||||||
if (SHComponentManager::HasComponent<SHTransformComponent>(camera.GetEID()) == true && &camera != &editorCamera)
|
if (SHComponentManager::HasComponent<SHTransformComponent>(camera.GetEID()) == true && &camera != &editorCamera)
|
||||||
{
|
{
|
||||||
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(camera.GetEID());
|
auto transform = SHComponentManager::GetComponent<SHTransformComponent>(camera.GetEID());
|
||||||
|
@ -183,11 +168,17 @@ namespace SHADE
|
||||||
if (SHComponentManager::HasComponent<SHCameraArmComponent>(camera.GetEID()))
|
if (SHComponentManager::HasComponent<SHCameraArmComponent>(camera.GetEID()))
|
||||||
{
|
{
|
||||||
auto arm = SHComponentManager::GetComponent<SHCameraArmComponent>(camera.GetEID());
|
auto arm = SHComponentManager::GetComponent<SHCameraArmComponent>(camera.GetEID());
|
||||||
camera.offset = arm->GetOffset();
|
if (arm->isActive == true)
|
||||||
if(arm->lookAtCameraOrigin)
|
{
|
||||||
CameraLookAt(camera, camera.position);
|
camera.offset = arm->GetOffset();
|
||||||
|
if (arm->lookAtCameraOrigin)
|
||||||
|
CameraLookAt(camera, camera.position);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
SHVec3 view, right, UP;
|
SHVec3 view, right, UP;
|
||||||
|
|
||||||
|
|
||||||
|
@ -287,12 +278,14 @@ namespace SHADE
|
||||||
|
|
||||||
for (auto& pivot : pivotDense)
|
for (auto& pivot : pivotDense)
|
||||||
{
|
{
|
||||||
system->UpdatePivotArmComponent(pivot);
|
if(SHSceneManager::CheckNodeAndComponentsActive<SHCameraArmComponent>(pivot.GetEID()))
|
||||||
|
system->UpdatePivotArmComponent(pivot);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto& cam : dense)
|
for (auto& cam : dense)
|
||||||
{
|
{
|
||||||
system->UpdateCameraComponent(cam);
|
if (SHSceneManager::CheckNodeAndComponentsActive<SHCameraComponent>(cam.GetEID()))
|
||||||
|
system->UpdateCameraComponent(cam);
|
||||||
}
|
}
|
||||||
for (auto& handle : system->directorHandleList)
|
for (auto& handle : system->directorHandleList)
|
||||||
{
|
{
|
||||||
|
@ -399,7 +392,7 @@ namespace SHADE
|
||||||
SHVec3 up = { 0.0f,1.0f,0.0f };
|
SHVec3 up = { 0.0f,1.0f,0.0f };
|
||||||
|
|
||||||
|
|
||||||
////SHVec3::RotateZ(target, SHMath::DegreesToRadians(camera.roll));
|
//SHVec3::RotateZ(target, SHMath::DegreesToRadians(camera.roll));
|
||||||
|
|
||||||
//target = SHVec3::Normalise(target);
|
//target = SHVec3::Normalise(target);
|
||||||
|
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
#include "ECS_Base/System/SHSystemRoutine.h"
|
#include "ECS_Base/System/SHSystemRoutine.h"
|
||||||
#include "Resource/SHResourceLibrary.h"
|
#include "Resource/SHResourceLibrary.h"
|
||||||
#include "SHCameraDirector.h"
|
#include "SHCameraDirector.h"
|
||||||
|
#include "SHCameraArmComponent.h"
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
@ -18,6 +19,7 @@ namespace SHADE
|
||||||
//A camera component that represents editor camera.
|
//A camera component that represents editor camera.
|
||||||
//This is not tied to any entity. Hence this EID should not be used.
|
//This is not tied to any entity. Hence this EID should not be used.
|
||||||
SHCameraComponent editorCamera;
|
SHCameraComponent editorCamera;
|
||||||
|
SHCameraArmComponent editorCameraArm;
|
||||||
|
|
||||||
SHResourceLibrary<SHCameraDirector> directorLibrary;
|
SHResourceLibrary<SHCameraDirector> directorLibrary;
|
||||||
std::vector<DirectorHandle> directorHandleList;
|
std::vector<DirectorHandle> directorHandleList;
|
||||||
|
@ -34,14 +36,7 @@ namespace SHADE
|
||||||
void Init (void);
|
void Init (void);
|
||||||
void Exit (void);
|
void Exit (void);
|
||||||
|
|
||||||
class SH_API EditorCameraUpdate final : public SHSystemRoutine
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
|
|
||||||
EditorCameraUpdate() : SHSystemRoutine("Editor Camera Update", true) { };
|
|
||||||
virtual void Execute(double dt) noexcept override final;
|
|
||||||
|
|
||||||
};
|
|
||||||
friend class EditorCameraUpdate;
|
friend class EditorCameraUpdate;
|
||||||
|
|
||||||
class SH_API CameraSystemUpdate final: public SHSystemRoutine
|
class SH_API CameraSystemUpdate final: public SHSystemRoutine
|
||||||
|
@ -63,6 +58,7 @@ namespace SHADE
|
||||||
void DecomposeViewMatrix(SHMatrix const& matrix, float& pitch, float& yaw, float& roll, SHVec3& pos) noexcept;
|
void DecomposeViewMatrix(SHMatrix const& matrix, float& pitch, float& yaw, float& roll, SHVec3& pos) noexcept;
|
||||||
void SetCameraViewMatrix(SHCameraComponent& camera, SHMatrix const& viewMatrix) noexcept;
|
void SetCameraViewMatrix(SHCameraComponent& camera, SHMatrix const& viewMatrix) noexcept;
|
||||||
void CameraLookAt(SHCameraComponent& camera, SHVec3 target) noexcept;
|
void CameraLookAt(SHCameraComponent& camera, SHVec3 target) noexcept;
|
||||||
|
void UpdateEditorArm(double dt,bool active ,SHVec3 const& targetPos) noexcept;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#include "../Managers/SHSystemManager.h"
|
#include "../Managers/SHSystemManager.h"
|
||||||
#include "SHTestComponents.h"
|
#include "SHTestComponents.h"
|
||||||
#include "SHTestSystems.h"
|
#include "SHTestSystems.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -10,63 +10,102 @@
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
SHCommandManager::CommandStack SHCommandManager::undoStack{};
|
|
||||||
SHCommandManager::CommandStack SHCommandManager::redoStack{};
|
SHCommandManager::CommandStack SHCommandManager::undoStack(defaultStackSize);
|
||||||
|
SHCommandManager::CommandStack SHCommandManager::redoStack(defaultStackSize);
|
||||||
|
SHCommandManager::CommandStack SHCommandManager::secondaryUndoStack(defaultStackSize);
|
||||||
|
SHCommandManager::CommandStack SHCommandManager::secondaryRedoStack(defaultStackSize);
|
||||||
|
|
||||||
|
SHCommandManager::CommandStackPtr SHCommandManager::pCurrUndoStack(&undoStack);
|
||||||
|
SHCommandManager::CommandStackPtr SHCommandManager::pCurrRedoStack(&redoStack);
|
||||||
|
|
||||||
void SHCommandManager::PerformCommand(BaseCommandPtr commandPtr, bool const& overrideValue)
|
void SHCommandManager::PerformCommand(BaseCommandPtr commandPtr, bool const& overrideValue)
|
||||||
{
|
{
|
||||||
redoStack = CommandStack();
|
*pCurrRedoStack = CommandStack(defaultStackSize);
|
||||||
commandPtr->Execute();
|
commandPtr->Execute();
|
||||||
if (overrideValue && !undoStack.empty())
|
if (overrideValue && !pCurrUndoStack->Empty())
|
||||||
{
|
{
|
||||||
undoStack.top()->Merge(commandPtr);
|
pCurrUndoStack->Top()->Merge(commandPtr);
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
undoStack.push(commandPtr);
|
pCurrUndoStack->Push(commandPtr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCommandManager::RegisterCommand(BaseCommandPtr commandPtr)
|
void SHCommandManager::RegisterCommand(BaseCommandPtr commandPtr)
|
||||||
{
|
{
|
||||||
undoStack.push(commandPtr);
|
pCurrUndoStack->Push(commandPtr);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCommandManager::UndoCommand()
|
void SHCommandManager::UndoCommand()
|
||||||
{
|
{
|
||||||
if (undoStack.empty())
|
if (pCurrUndoStack->Empty())
|
||||||
return;
|
return;
|
||||||
undoStack.top()->Undo();
|
pCurrUndoStack->Top()->Undo();
|
||||||
redoStack.push(undoStack.top());
|
pCurrRedoStack->Push(pCurrUndoStack->Top());
|
||||||
undoStack.pop();
|
pCurrUndoStack->Pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCommandManager::RedoCommand()
|
void SHCommandManager::RedoCommand()
|
||||||
{
|
{
|
||||||
if (redoStack.empty())
|
if (pCurrRedoStack->Empty())
|
||||||
return;
|
return;
|
||||||
redoStack.top()->Execute();
|
pCurrRedoStack->Top()->Execute();
|
||||||
undoStack.push(redoStack.top());
|
pCurrUndoStack->Push(pCurrRedoStack->Top());
|
||||||
redoStack.pop();
|
pCurrRedoStack->Pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t SHCommandManager::GetUndoStackSize()
|
std::size_t SHCommandManager::GetUndoStackSize()
|
||||||
{
|
{
|
||||||
return undoStack.size();
|
return pCurrUndoStack->Size();
|
||||||
}
|
}
|
||||||
|
|
||||||
std::size_t SHCommandManager::GetRedoStackSize()
|
std::size_t SHCommandManager::GetRedoStackSize()
|
||||||
{
|
{
|
||||||
return redoStack.size();
|
return pCurrRedoStack->Size();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCommandManager::PopLatestCommandFromRedoStack()
|
void SHCommandManager::PopLatestCommandFromRedoStack()
|
||||||
{
|
{
|
||||||
redoStack.pop();
|
pCurrRedoStack->Pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCommandManager::PopLatestCommandFromUndoStack()
|
void SHCommandManager::PopLatestCommandFromUndoStack()
|
||||||
{
|
{
|
||||||
undoStack.pop();
|
pCurrUndoStack->Pop();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHCommandManager::SwapStacks()
|
||||||
|
{
|
||||||
|
if (pCurrUndoStack == &undoStack)
|
||||||
|
{
|
||||||
|
pCurrUndoStack = &secondaryUndoStack;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
secondaryUndoStack.Clear();
|
||||||
|
pCurrUndoStack = &undoStack;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (pCurrRedoStack == &redoStack)
|
||||||
|
{
|
||||||
|
pCurrRedoStack = &secondaryRedoStack;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
secondaryRedoStack.Clear();
|
||||||
|
pCurrRedoStack = &redoStack;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCommandManager::ClearAll()
|
||||||
|
{
|
||||||
|
undoStack.Clear();
|
||||||
|
redoStack.Clear();
|
||||||
|
|
||||||
|
secondaryUndoStack.Clear();
|
||||||
|
secondaryRedoStack.Clear();
|
||||||
|
}
|
||||||
|
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
|
@ -10,6 +10,7 @@
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
#include "SHCommand.hpp"
|
#include "SHCommand.hpp"
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
|
#include "Tools/SHDeque.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -22,7 +23,8 @@ namespace SHADE
|
||||||
using BaseCommandPtr = std::shared_ptr<SHBaseCommand>;
|
using BaseCommandPtr = std::shared_ptr<SHBaseCommand>;
|
||||||
template<typename T>
|
template<typename T>
|
||||||
using SHCommandPtr = std::shared_ptr<SHCommand<T>>;
|
using SHCommandPtr = std::shared_ptr<SHCommand<T>>;
|
||||||
using CommandStack = std::stack<BaseCommandPtr>;
|
using CommandStack = SHDeque<BaseCommandPtr>;
|
||||||
|
using CommandStackPtr = CommandStack*;
|
||||||
|
|
||||||
static void PerformCommand(BaseCommandPtr commandPtr, bool const& overrideValue = false);
|
static void PerformCommand(BaseCommandPtr commandPtr, bool const& overrideValue = false);
|
||||||
static void RegisterCommand(BaseCommandPtr commandPtr);
|
static void RegisterCommand(BaseCommandPtr commandPtr);
|
||||||
|
@ -34,8 +36,17 @@ namespace SHADE
|
||||||
static void PopLatestCommandFromRedoStack();
|
static void PopLatestCommandFromRedoStack();
|
||||||
static void PopLatestCommandFromUndoStack();
|
static void PopLatestCommandFromUndoStack();
|
||||||
|
|
||||||
|
static void SwapStacks();
|
||||||
|
static void ClearAll();
|
||||||
|
|
||||||
|
static constexpr CommandStack::SizeType defaultStackSize = 100;
|
||||||
private:
|
private:
|
||||||
|
static CommandStackPtr pCurrUndoStack;
|
||||||
|
static CommandStackPtr pCurrRedoStack;
|
||||||
|
|
||||||
static CommandStack undoStack;
|
static CommandStack undoStack;
|
||||||
|
static CommandStack secondaryUndoStack;
|
||||||
static CommandStack redoStack;
|
static CommandStack redoStack;
|
||||||
|
static CommandStack secondaryRedoStack;
|
||||||
};
|
};
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
|
@ -13,11 +13,12 @@
|
||||||
#include "Editor/SHEditor.h"
|
#include "Editor/SHEditor.h"
|
||||||
#include "Editor/DragDrop/SHDragDrop.hpp"
|
#include "Editor/DragDrop/SHDragDrop.hpp"
|
||||||
#include "Editor/EditorWindow/MaterialInspector/SHMaterialInspector.h"
|
#include "Editor/EditorWindow/MaterialInspector/SHMaterialInspector.h"
|
||||||
|
#include "Editor/EditorWindow/SHEditorWindowManager.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
SHAssetBrowser::SHAssetBrowser()
|
SHAssetBrowser::SHAssetBrowser()
|
||||||
:SHEditorWindow("\xee\x8b\x87 Asset Browser", ImGuiWindowFlags_MenuBar), rootFolder(SHAssetManager::GetRootFolder()), prevFolder(rootFolder), currentFolder(rootFolder), assetBeingCreated(std::nullopt)
|
:SHEditorWindow("\xee\x8b\x87 Asset Browser", ImGuiWindowFlags_MenuBar), rootFolder(SHAssetManager::GetRootFolder()), prevFolder(rootFolder), currentFolder(rootFolder)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -34,23 +35,48 @@ namespace SHADE
|
||||||
RecursivelyDrawTree(rootFolder);
|
RecursivelyDrawTree(rootFolder);
|
||||||
DrawMenuBar();
|
DrawMenuBar();
|
||||||
DrawCurrentFolder();
|
DrawCurrentFolder();
|
||||||
|
DrawAssetBeingCreated();
|
||||||
|
|
||||||
}
|
}
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
|
if(refreshQueued)
|
||||||
|
Refresh();
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHAssetBrowser::QueueRefresh() noexcept
|
||||||
|
{
|
||||||
|
refreshQueued = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHAssetBrowser::Refresh() noexcept
|
||||||
|
{
|
||||||
|
SHAssetManager::RefreshDirectory();
|
||||||
|
rootFolder = SHAssetManager::GetRootFolder();
|
||||||
|
refreshQueued = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHAssetBrowser::DrawMenuBar()
|
void SHAssetBrowser::DrawMenuBar()
|
||||||
{
|
{
|
||||||
if (ImGui::BeginMenuBar())
|
if (ImGui::BeginMenuBar())
|
||||||
{
|
{
|
||||||
|
if(ImGui::SmallButton(ICON_MD_SYNC))
|
||||||
|
{
|
||||||
|
QueueRefresh();
|
||||||
|
}
|
||||||
|
if(ImGui::SmallButton(ICON_FA_CIRCLE_PLUS))
|
||||||
|
{
|
||||||
|
isAssetBeingCreated = true;
|
||||||
|
}
|
||||||
ImGui::EndMenuBar();
|
ImGui::EndMenuBar();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
//if !compiled, set genMeta to true
|
||||||
|
|
||||||
ImRect SHAssetBrowser::RecursivelyDrawTree(FolderPointer folder)
|
ImRect SHAssetBrowser::RecursivelyDrawTree(FolderPointer folder)
|
||||||
{
|
{
|
||||||
auto const& subFolders = folder->subFolders;
|
auto const& subFolders = folder->subFolders;
|
||||||
auto const& files = folder->files;
|
auto files = folder->files;
|
||||||
const bool isSelected = std::ranges::find(selectedFolders, folder) != selectedFolders.end();
|
const bool isSelected = std::ranges::find(selectedFolders, folder) != selectedFolders.end();
|
||||||
ImGuiTreeNodeFlags flags = (subFolders.empty() && files.empty()) ? ImGuiTreeNodeFlags_Leaf : ImGuiTreeNodeFlags_OpenOnArrow;
|
ImGuiTreeNodeFlags flags = (subFolders.empty() && files.empty()) ? ImGuiTreeNodeFlags_Leaf : ImGuiTreeNodeFlags_OpenOnArrow;
|
||||||
if (isSelected)
|
if (isSelected)
|
||||||
|
@ -62,21 +88,10 @@ namespace SHADE
|
||||||
ImGuiID folderID = ImGui::GetItemID();
|
ImGuiID folderID = ImGui::GetItemID();
|
||||||
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
||||||
|
|
||||||
if (ImGui::BeginPopupContextItem())
|
//if (ImGui::BeginPopupContextItem())
|
||||||
{
|
//{
|
||||||
if (ImGui::BeginMenu("Create Asset"))
|
// ImGui::EndPopup();
|
||||||
{
|
//}
|
||||||
//TODO: Change to rttr type enum align
|
|
||||||
if (ImGui::Selectable("Material"))
|
|
||||||
{
|
|
||||||
assetBeingCreated = { folder, AssetType::MATERIAL, "New Material" };
|
|
||||||
ImGui::TreeNodeSetOpen(folderID, true);
|
|
||||||
isOpen = true;
|
|
||||||
}
|
|
||||||
ImGui::EndMenu();
|
|
||||||
}
|
|
||||||
ImGui::EndPopup();
|
|
||||||
}
|
|
||||||
|
|
||||||
if (ImGui::IsItemClicked())
|
if (ImGui::IsItemClicked())
|
||||||
{
|
{
|
||||||
|
@ -100,19 +115,15 @@ namespace SHADE
|
||||||
drawList->AddLine(ImVec2(vertLineStart.x, midPoint), ImVec2(vertLineStart.x + horizontalLineSize, midPoint), treeLineColor, 1);
|
drawList->AddLine(ImVec2(vertLineStart.x, midPoint), ImVec2(vertLineStart.x + horizontalLineSize, midPoint), treeLineColor, 1);
|
||||||
vertLineEnd.y = midPoint;
|
vertLineEnd.y = midPoint;
|
||||||
}
|
}
|
||||||
for (auto const& file : files)
|
for (auto& file : files)
|
||||||
{
|
{
|
||||||
if(file.assetMeta == nullptr)
|
|
||||||
continue;
|
|
||||||
const float horizontalLineSize = 25.0f;
|
const float horizontalLineSize = 25.0f;
|
||||||
const ImRect childRect = DrawFile(file.assetMeta);
|
const ImRect childRect = DrawFile(file);
|
||||||
const float midPoint = (childRect.Min.y + childRect.Max.y) * 0.5f;
|
const float midPoint = (childRect.Min.y + childRect.Max.y) * 0.5f;
|
||||||
drawList->AddLine(ImVec2(vertLineStart.x, midPoint), ImVec2(vertLineStart.x + horizontalLineSize, midPoint), treeLineColor, 1);
|
drawList->AddLine(ImVec2(vertLineStart.x, midPoint), ImVec2(vertLineStart.x + horizontalLineSize, midPoint), treeLineColor, 1);
|
||||||
vertLineEnd.y = midPoint;
|
vertLineEnd.y = midPoint;
|
||||||
}
|
}
|
||||||
drawList->AddLine(vertLineStart, vertLineEnd, treeLineColor, 1);
|
drawList->AddLine(vertLineStart, vertLineEnd, treeLineColor, 1);
|
||||||
if(assetBeingCreated.has_value() && std::get<0>(assetBeingCreated.value()) == folder)
|
|
||||||
DrawAssetBeingCreated();
|
|
||||||
|
|
||||||
ImGui::TreePop();
|
ImGui::TreePop();
|
||||||
}
|
}
|
||||||
|
@ -148,7 +159,33 @@ namespace SHADE
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImRect SHAssetBrowser::DrawFile(SHAsset const* const asset) noexcept
|
ImRect SHAssetBrowser::DrawFile(SHFile& file) noexcept
|
||||||
|
{
|
||||||
|
if(file.compilable)
|
||||||
|
{
|
||||||
|
ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_Leaf;
|
||||||
|
static constexpr std::string_view icon = ICON_MD_FILE_PRESENT;
|
||||||
|
ImGui::PushID(file.name.data());
|
||||||
|
bool const isOpen = ImGui::TreeNodeEx(file.name.data(), flags, "%s %s%s", icon.data(), file.name.data(), file.ext.data());
|
||||||
|
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
||||||
|
if(ImGui::BeginPopupContextItem())
|
||||||
|
{
|
||||||
|
if(ImGui::Selectable("Compile"))
|
||||||
|
{
|
||||||
|
SHAssetManager::CompileAsset(file.path, !file.compiled);
|
||||||
|
QueueRefresh();
|
||||||
|
}
|
||||||
|
ImGui::EndPopup();
|
||||||
|
}
|
||||||
|
ImGui::TreePop();
|
||||||
|
ImGui::PopID();
|
||||||
|
return nodeRect;
|
||||||
|
}
|
||||||
|
if(file.assetMeta)
|
||||||
|
DrawAsset(file.assetMeta, file.ext);
|
||||||
|
}
|
||||||
|
|
||||||
|
ImRect SHAssetBrowser::DrawAsset(SHAsset const* const asset, FileExt const& ext /*= ""*/) noexcept
|
||||||
{
|
{
|
||||||
if (asset == nullptr)
|
if (asset == nullptr)
|
||||||
return ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
return ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
||||||
|
@ -173,7 +210,7 @@ namespace SHADE
|
||||||
default:;
|
default:;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool const isOpen = ImGui::TreeNodeEx(asset, flags, "%s %s", icon.data(), asset->name.data());
|
bool const isOpen = ImGui::TreeNodeEx(asset, flags, "%s %s%s", icon.data(), asset->name.data(), ext.data());
|
||||||
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
||||||
if (SHDragDrop::BeginSource())
|
if (SHDragDrop::BeginSource())
|
||||||
{
|
{
|
||||||
|
@ -212,7 +249,6 @@ namespace SHADE
|
||||||
case AssetType::MAX_COUNT: break;
|
case AssetType::MAX_COUNT: break;
|
||||||
default:;
|
default:;
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
//TODO: Combine Draw asset and Draw Folder recursive drawing
|
//TODO: Combine Draw asset and Draw Folder recursive drawing
|
||||||
|
@ -227,7 +263,7 @@ namespace SHADE
|
||||||
for(auto const& subAsset : asset->subAssets)
|
for(auto const& subAsset : asset->subAssets)
|
||||||
{
|
{
|
||||||
const float horizontalLineSize = 25.0f;
|
const float horizontalLineSize = 25.0f;
|
||||||
const ImRect childRect = DrawFile(subAsset);
|
const ImRect childRect = DrawAsset(subAsset);
|
||||||
const float midPoint = (childRect.Min.y + childRect.Max.y) * 0.5f;
|
const float midPoint = (childRect.Min.y + childRect.Max.y) * 0.5f;
|
||||||
drawList->AddLine(ImVec2(vertLineStart.x, midPoint), ImVec2(vertLineStart.x + horizontalLineSize, midPoint), treeLineColor, 1);
|
drawList->AddLine(ImVec2(vertLineStart.x, midPoint), ImVec2(vertLineStart.x + horizontalLineSize, midPoint), treeLineColor, 1);
|
||||||
vertLineEnd.y = midPoint;
|
vertLineEnd.y = midPoint;
|
||||||
|
@ -240,19 +276,52 @@ namespace SHADE
|
||||||
|
|
||||||
void SHAssetBrowser::DrawAssetBeingCreated() noexcept
|
void SHAssetBrowser::DrawAssetBeingCreated() noexcept
|
||||||
{
|
{
|
||||||
if (!assetBeingCreated.has_value())
|
if(isAssetBeingCreated)
|
||||||
return;
|
ImGui::OpenPopup(newAssetPopup.data());
|
||||||
auto& path = std::get<0>(assetBeingCreated.value());
|
|
||||||
auto& type = std::get<1>(assetBeingCreated.value());
|
if(ImGui::BeginPopupModal(newAssetPopup.data(), &isAssetBeingCreated))
|
||||||
auto& assetName = std::get<2>(assetBeingCreated.value());
|
|
||||||
if (ImGui::InputText("##newAssetName", &assetName, ImGuiInputTextFlags_EnterReturnsTrue))
|
|
||||||
{
|
{
|
||||||
AssetID assetId = SHAssetManager::CreateNewAsset(type, assetName);
|
ImGui::RadioButton("Material", true);
|
||||||
if (auto matInspector = SHEditorWindowManager::GetEditorWindow<SHMaterialInspector>())
|
ImGui::SameLine();
|
||||||
|
if (ImGui::InputText("##newAssetName", &nameOfAssetBeingCreated, ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_AutoSelectAll))
|
||||||
{
|
{
|
||||||
matInspector->OpenMaterial(assetId, true);
|
AssetID assetId = SHAssetManager::CreateNewAsset(AssetType::MATERIAL, nameOfAssetBeingCreated);
|
||||||
|
if (auto matInspector = SHEditorWindowManager::GetEditorWindow<SHMaterialInspector>())
|
||||||
|
{
|
||||||
|
matInspector->OpenMaterial(assetId, true);
|
||||||
|
}
|
||||||
|
nameOfAssetBeingCreated.clear();
|
||||||
|
QueueRefresh();
|
||||||
|
isAssetBeingCreated = false;
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
}
|
}
|
||||||
assetBeingCreated.reset();
|
ImGui::EndPopup();
|
||||||
}
|
}
|
||||||
|
//if (ImGui::BeginMenu("Create Asset"))
|
||||||
|
//{
|
||||||
|
// //TODO: Change to rttr type enum align
|
||||||
|
// if (ImGui::Selectable("Material"))
|
||||||
|
// {
|
||||||
|
// assetBeingCreated = { folder, AssetType::MATERIAL, "NewMaterial" };
|
||||||
|
// ImGui::TreeNodeSetOpen(folderID, true);
|
||||||
|
// isOpen = true;
|
||||||
|
// }
|
||||||
|
// ImGui::EndMenu();
|
||||||
|
//}
|
||||||
|
//if (!assetBeingCreated.has_value())
|
||||||
|
// return;
|
||||||
|
//auto& path = std::get<0>(assetBeingCreated.value());
|
||||||
|
//auto& type = std::get<1>(assetBeingCreated.value());
|
||||||
|
//auto& assetName = std::get<2>(assetBeingCreated.value());
|
||||||
|
//if (ImGui::InputText("##newAssetName", &assetName, ImGuiInputTextFlags_EnterReturnsTrue | ImGuiInputTextFlags_CharsNoBlank | ImGuiInputTextFlags_AutoSelectAll))
|
||||||
|
//{
|
||||||
|
// AssetID assetId = SHAssetManager::CreateNewAsset(type, assetName);
|
||||||
|
// if (auto matInspector = SHEditorWindowManager::GetEditorWindow<SHMaterialInspector>())
|
||||||
|
// {
|
||||||
|
// matInspector->OpenMaterial(assetId, true);
|
||||||
|
// }
|
||||||
|
// assetBeingCreated.reset();
|
||||||
|
// QueueRefresh();
|
||||||
|
//}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -10,24 +10,29 @@ namespace SHADE
|
||||||
class SHAssetBrowser final : public SHEditorWindow
|
class SHAssetBrowser final : public SHEditorWindow
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using AssetEntry = std::tuple<FolderPointer, AssetType, std::string>;
|
|
||||||
SHAssetBrowser();
|
SHAssetBrowser();
|
||||||
|
|
||||||
void Init();
|
void Init();
|
||||||
void Update();
|
void Update();
|
||||||
|
|
||||||
void Refresh();
|
void QueueRefresh() noexcept;
|
||||||
private:
|
private:
|
||||||
void DrawMenuBar();
|
void DrawMenuBar();
|
||||||
ImRect RecursivelyDrawTree(FolderPointer folder);
|
ImRect RecursivelyDrawTree(FolderPointer folder);
|
||||||
void DrawCurrentFolder();
|
void DrawCurrentFolder();
|
||||||
ImRect DrawFile(SHAsset const* const asset) noexcept;
|
ImRect DrawFile(SHFile& file) noexcept;
|
||||||
|
ImRect DrawAsset(SHAsset const* const asset, FileExt const& ext = "") noexcept;
|
||||||
void DrawAssetBeingCreated() noexcept;
|
void DrawAssetBeingCreated() noexcept;
|
||||||
|
|
||||||
|
void Refresh() noexcept;
|
||||||
|
|
||||||
FolderPointer rootFolder, prevFolder, currentFolder;
|
FolderPointer rootFolder, prevFolder, currentFolder;
|
||||||
std::optional<AssetEntry> assetBeingCreated;
|
|
||||||
std::vector<FolderPointer> selectedFolders;
|
std::vector<FolderPointer> selectedFolders;
|
||||||
std::vector<AssetID> selectedAssets;
|
std::vector<AssetID> selectedAssets;
|
||||||
static constexpr float tileWidth = 50.0f;
|
static constexpr float tileWidth = 50.0f;
|
||||||
|
bool refreshQueued = false;
|
||||||
|
bool isAssetBeingCreated = false;
|
||||||
|
static constexpr std::string_view newAssetPopup = "Create New Asset";
|
||||||
|
std::string nameOfAssetBeingCreated;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -15,6 +15,7 @@
|
||||||
#include "Editor/DragDrop/SHDragDrop.hpp"
|
#include "Editor/DragDrop/SHDragDrop.hpp"
|
||||||
#include "Tools/SHException.h"
|
#include "Tools/SHException.h"
|
||||||
#include "Editor/IconsMaterialDesign.h"
|
#include "Editor/IconsMaterialDesign.h"
|
||||||
|
#include "SHHierarchyPanelCommands.h"
|
||||||
|
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| Library Includes ||
|
//|| Library Includes ||
|
||||||
|
@ -22,7 +23,7 @@
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
|
||||||
#include "Serialization/SHSerialization.h"
|
#include "Serialization/SHSerialization.h"
|
||||||
#include "Tools/SHClipboardUtilities.h"
|
#include "Tools/Utilities/SHClipboardUtilities.h"
|
||||||
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
@ -105,14 +106,21 @@ namespace SHADE
|
||||||
PasteEntities(editor->selectedEntities.back());
|
PasteEntities(editor->selectedEntities.back());
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
if(ImGui::IsKeyReleased(ImGuiKey_Delete))
|
||||||
|
{
|
||||||
|
DeleteSelectedEntities();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
if(ImGui::IsWindowHovered() && !ImGui::IsAnyItemHovered() && ImGui::IsMouseReleased(ImGuiMouseButton_Left))
|
if(ImGui::IsWindowHovered() && !ImGui::IsAnyItemHovered() && ImGui::IsMouseReleased(ImGuiMouseButton_Left))
|
||||||
{
|
{
|
||||||
ParentSelectedEntities(MAX_EID, draggingEntities);
|
if(ImGui::IsDragDropActive())
|
||||||
draggingEntities.clear();
|
{
|
||||||
ImGui::ClearDragDrop();
|
ParentSelectedEntities(MAX_EID, draggingEntities);
|
||||||
|
draggingEntities.clear();
|
||||||
|
ImGui::ClearDragDrop();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
@ -255,9 +263,10 @@ namespace SHADE
|
||||||
PasteEntities(eid);
|
PasteEntities(eid);
|
||||||
skipFrame = true;
|
skipFrame = true;
|
||||||
}
|
}
|
||||||
if (ImGui::Selectable(std::format("{} Delete", ICON_MD_DELETE).data()))
|
if (ImGui::Selectable(std::format("{} Delete selected", ICON_MD_DELETE).data()))
|
||||||
{
|
{
|
||||||
SHEntityManager::DestroyEntity(eid);
|
//SHEntityManager::DestroyEntity(eid);
|
||||||
|
DeleteSelectedEntities();
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((currentNode->GetParent() != sceneGraph.GetRoot()) && ImGui::Selectable(std::format("{} Unparent Selected", ICON_MD_NORTH_WEST).data()))
|
if ((currentNode->GetParent() != sceneGraph.GetRoot()) && ImGui::Selectable(std::format("{} Unparent Selected", ICON_MD_NORTH_WEST).data()))
|
||||||
|
@ -282,9 +291,12 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
else editor->selectedEntities.clear();
|
else editor->selectedEntities.clear();
|
||||||
}
|
}
|
||||||
else if (!ImGui::IsKeyDown(ImGuiKey_LeftCtrl))
|
else
|
||||||
editor->selectedEntities.clear();
|
{
|
||||||
editor->selectedEntities.push_back(eid);
|
if (!ImGui::IsKeyDown(ImGuiKey_LeftCtrl))
|
||||||
|
editor->selectedEntities.clear();
|
||||||
|
editor->selectedEntities.push_back(eid);
|
||||||
|
}
|
||||||
}//if not selected
|
}//if not selected
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
|
@ -333,10 +345,18 @@ namespace SHADE
|
||||||
void SHHierarchyPanel::ParentSelectedEntities(EntityID parentEID, std::vector<EntityID> const& entities) const noexcept
|
void SHHierarchyPanel::ParentSelectedEntities(EntityID parentEID, std::vector<EntityID> const& entities) const noexcept
|
||||||
{
|
{
|
||||||
auto const& sceneGraph = SHSceneManager::GetCurrentSceneGraph();
|
auto const& sceneGraph = SHSceneManager::GetCurrentSceneGraph();
|
||||||
|
|
||||||
|
std::vector<EntityID> entitiesToParent{};
|
||||||
|
std::ranges::copy_if(entities, std::back_inserter(entitiesToParent), [&sceneGraph](EntityID const& eid)
|
||||||
|
{
|
||||||
|
if (sceneGraph.GetParent(eid)->GetEntityID() == MAX_EID)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
//auto const editor = SHSystemManager::GetSystem<SHEditor>();
|
//auto const editor = SHSystemManager::GetSystem<SHEditor>();
|
||||||
SHEntityParentCommand::EntityParentData entityParentData;
|
SHEntityParentCommand::EntityParentData entityParentData;
|
||||||
std::vector<EntityID> parentedEIDS;
|
std::vector<EntityID> parentedEIDS;
|
||||||
for (auto const& eid : entities)
|
for (auto const& eid : entitiesToParent)
|
||||||
{
|
{
|
||||||
if(eid == parentEID)
|
if(eid == parentEID)
|
||||||
continue;
|
continue;
|
||||||
|
@ -365,14 +385,16 @@ namespace SHADE
|
||||||
if (eid == beginEID || eid == endEID)
|
if (eid == beginEID || eid == endEID)
|
||||||
{
|
{
|
||||||
startSelecting = true;
|
startSelecting = true;
|
||||||
editor->selectedEntities.push_back(eid);
|
if(std::ranges::find(editor->selectedEntities, eid) == editor->selectedEntities.end())
|
||||||
|
editor->selectedEntities.push_back(eid);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
if (!endSelecting)
|
if (!endSelecting)
|
||||||
{
|
{
|
||||||
editor->selectedEntities.push_back(eid);
|
if (std::ranges::find(editor->selectedEntities, eid) == editor->selectedEntities.end())
|
||||||
|
editor->selectedEntities.push_back(eid);
|
||||||
if (eid == endEID || eid == beginEID)
|
if (eid == endEID || eid == beginEID)
|
||||||
{
|
{
|
||||||
endSelecting = true;
|
endSelecting = true;
|
||||||
|
@ -397,47 +419,39 @@ namespace SHADE
|
||||||
void SHHierarchyPanel::CopySelectedEntities()
|
void SHHierarchyPanel::CopySelectedEntities()
|
||||||
{
|
{
|
||||||
const auto editor = SHSystemManager::GetSystem<SHEditor>();
|
const auto editor = SHSystemManager::GetSystem<SHEditor>();
|
||||||
SHClipboardUtilities::WriteToClipboard(SHSerialization::SerializeEntitiesToString(editor->selectedEntities));
|
auto const& sceneGraph = SHSceneManager::GetCurrentSceneGraph();
|
||||||
|
std::vector<EntityID> entitiesToCopy{};
|
||||||
|
std::ranges::copy_if(editor->selectedEntities, std::back_inserter(entitiesToCopy), [&sceneGraph](EntityID const& eid)
|
||||||
|
{
|
||||||
|
if(sceneGraph.GetParent(eid)->GetEntityID() == MAX_EID)
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
SHClipboardUtilities::WriteToClipboard(SHSerialization::SerializeEntitiesToString(entitiesToCopy));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHHierarchyPanel::PasteEntities(EntityID parentEID)
|
void SHHierarchyPanel::PasteEntities(EntityID parentEID)
|
||||||
{
|
{
|
||||||
SetScrollTo(SHSerialization::DeserializeEntitiesFromString(SHClipboardUtilities::GetDataFromClipboard(), parentEID));
|
//SetScrollTo(SHSerialization::DeserializeEntitiesFromString(SHClipboardUtilities::GetDataFromClipboard(), parentEID).front());
|
||||||
|
SHCommandManager::PerformCommand(std::make_shared<SHPasteEntitiesCommand>(SHClipboardUtilities::GetDataFromClipboard(), parentEID));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCreateEntityCommand::Execute()
|
void SHHierarchyPanel::DeleteSelectedEntities()
|
||||||
{
|
{
|
||||||
EntityID newEID = SHEntityManager::CreateEntity(eid);
|
const auto editor = SHSystemManager::GetSystem<SHEditor>();
|
||||||
if (eid == MAX_EID)
|
auto const& sceneGraph = SHSceneManager::GetCurrentSceneGraph();
|
||||||
eid = newEID;
|
|
||||||
|
std::vector<EntityID> entitiesToDelete{};
|
||||||
|
std::ranges::copy_if(editor->selectedEntities, std::back_inserter(entitiesToDelete), [&sceneGraph, &selectedEntities = editor->selectedEntities](EntityID const& eid)
|
||||||
|
{
|
||||||
|
EntityID parentEID = sceneGraph.GetParent(eid)->GetEntityID();
|
||||||
|
if (parentEID == MAX_EID)
|
||||||
|
return true;
|
||||||
|
else if(std::ranges::find(selectedEntities, parentEID) == selectedEntities.end())
|
||||||
|
return true;
|
||||||
|
return false;
|
||||||
|
});
|
||||||
|
SHCommandManager::PerformCommand(std::make_shared<SHDeleteEntitiesCommand>(entitiesToDelete));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHCreateEntityCommand::Undo()
|
|
||||||
{
|
|
||||||
SHEntityManager::DestroyEntity(eid);
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHEntityParentCommand::Execute()
|
|
||||||
{
|
|
||||||
auto& sceneGraph = SHSceneManager::GetCurrentSceneGraph();
|
|
||||||
for (auto const& eid : entities)
|
|
||||||
{
|
|
||||||
if (entityParentData[eid].newParentEID == MAX_EID)
|
|
||||||
sceneGraph.SetParent(eid, nullptr);
|
|
||||||
else
|
|
||||||
sceneGraph.SetParent(eid, entityParentData[eid].newParentEID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHEntityParentCommand::Undo()
|
|
||||||
{
|
|
||||||
auto& sceneGraph = SHSceneManager::GetCurrentSceneGraph();
|
|
||||||
for (auto const& eid : entities)
|
|
||||||
{
|
|
||||||
if (entityParentData[eid].oldParentEID == MAX_EID)
|
|
||||||
sceneGraph.SetParent(eid, nullptr);
|
|
||||||
else
|
|
||||||
sceneGraph.SetParent(eid, entityParentData[eid].oldParentEID);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
|
@ -10,7 +10,6 @@
|
||||||
#include "imgui_internal.h"
|
#include "imgui_internal.h"
|
||||||
#include "ECS_Base/SHECSMacros.h"
|
#include "ECS_Base/SHECSMacros.h"
|
||||||
#include "Editor/EditorWindow/SHEditorWindow.h"
|
#include "Editor/EditorWindow/SHEditorWindow.h"
|
||||||
#include "Editor/Command/SHCommand.hpp"
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
class SHSceneNode;
|
class SHSceneNode;
|
||||||
|
@ -33,6 +32,7 @@ namespace SHADE
|
||||||
void SelectAllEntities();
|
void SelectAllEntities();
|
||||||
void CopySelectedEntities();
|
void CopySelectedEntities();
|
||||||
void PasteEntities(EntityID parentEID = MAX_EID);
|
void PasteEntities(EntityID parentEID = MAX_EID);
|
||||||
|
void DeleteSelectedEntities();
|
||||||
bool skipFrame = false;
|
bool skipFrame = false;
|
||||||
std::string filter;
|
std::string filter;
|
||||||
bool isAnyNodeSelected = false;
|
bool isAnyNodeSelected = false;
|
||||||
|
@ -41,33 +41,4 @@ namespace SHADE
|
||||||
|
|
||||||
};//class SHHierarchyPanel
|
};//class SHHierarchyPanel
|
||||||
|
|
||||||
//Might move to a different file
|
|
||||||
class SHCreateEntityCommand final : public SHBaseCommand
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
void Execute() override;
|
|
||||||
void Undo() override;
|
|
||||||
private:
|
|
||||||
EntityID eid = MAX_EID;
|
|
||||||
};
|
|
||||||
|
|
||||||
class SHEntityParentCommand final : public SHBaseCommand
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
struct Data
|
|
||||||
{
|
|
||||||
EntityID oldParentEID = MAX_EID;
|
|
||||||
EntityID newParentEID = MAX_EID;
|
|
||||||
};
|
|
||||||
using EntityParentData = std::unordered_map<EntityID, Data>;
|
|
||||||
|
|
||||||
SHEntityParentCommand(std::vector<EntityID> entityIDs, EntityParentData inEntityParentData):entities(entityIDs),entityParentData(inEntityParentData){}
|
|
||||||
|
|
||||||
void Execute() override;
|
|
||||||
void Undo() override;
|
|
||||||
private:
|
|
||||||
std::vector<EntityID> entities;
|
|
||||||
std::unordered_map<EntityID, Data> entityParentData;
|
|
||||||
};
|
|
||||||
|
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
|
@ -0,0 +1,84 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHHierarchyPanelCommands.h"
|
||||||
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
|
#include "Scene/SHSceneManager.h"
|
||||||
|
#include "Serialization/SHSerialization.h"
|
||||||
|
#include "SHHierarchyPanel.h"
|
||||||
|
#include "Editor/EditorWindow/SHEditorWindowManager.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
void SHCreateEntityCommand::Execute()
|
||||||
|
{
|
||||||
|
EntityID newEID = SHEntityManager::CreateEntity(eid);
|
||||||
|
if (eid == MAX_EID)
|
||||||
|
eid = newEID;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHCreateEntityCommand::Undo()
|
||||||
|
{
|
||||||
|
SHEntityManager::DestroyEntity(eid);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEntityParentCommand::Execute()
|
||||||
|
{
|
||||||
|
auto& sceneGraph = SHSceneManager::GetCurrentSceneGraph();
|
||||||
|
for (auto const& eid : entities)
|
||||||
|
{
|
||||||
|
if (entityParentData[eid].newParentEID == MAX_EID)
|
||||||
|
sceneGraph.SetParent(eid, nullptr);
|
||||||
|
else
|
||||||
|
sceneGraph.SetParent(eid, entityParentData[eid].newParentEID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEntityParentCommand::Undo()
|
||||||
|
{
|
||||||
|
auto& sceneGraph = SHSceneManager::GetCurrentSceneGraph();
|
||||||
|
for (auto const& eid : entities)
|
||||||
|
{
|
||||||
|
if (entityParentData[eid].oldParentEID == MAX_EID)
|
||||||
|
sceneGraph.SetParent(eid, nullptr);
|
||||||
|
else
|
||||||
|
sceneGraph.SetParent(eid, entityParentData[eid].oldParentEID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPasteEntitiesCommand::Execute()
|
||||||
|
{
|
||||||
|
data.createdEntities.clear();
|
||||||
|
data.createdEntities = SHSerialization::DeserializeEntitiesFromString(data.entityData, data.parentEID);
|
||||||
|
data.entityData = SHSerialization::ResolveSerializedEntityIndices(data.entityData, data.createdEntities);
|
||||||
|
SHEditorWindowManager::GetEditorWindow<SHHierarchyPanel>()->SetScrollTo(data.createdEntities.begin()->second);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHPasteEntitiesCommand::Undo()
|
||||||
|
{
|
||||||
|
for (auto const& [oldEID, newEID] : data.createdEntities)
|
||||||
|
{
|
||||||
|
SHEntityManager::DestroyEntity(newEID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHDeleteEntitiesCommand::Execute()
|
||||||
|
{
|
||||||
|
if(!data.createdEntities.empty())
|
||||||
|
{
|
||||||
|
for(auto& eid : data.entitiesToDelete)
|
||||||
|
{
|
||||||
|
eid = data.createdEntities[eid];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
data.entityData = SHSerialization::SerializeEntitiesToString(data.entitiesToDelete);
|
||||||
|
for (auto const& eid : data.entitiesToDelete)
|
||||||
|
{
|
||||||
|
SHEntityManager::DestroyEntity(eid);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHDeleteEntitiesCommand::Undo()
|
||||||
|
{
|
||||||
|
data.createdEntities = SHSerialization::DeserializeEntitiesFromString(data.entityData);
|
||||||
|
data.entityData = SHSerialization::ResolveSerializedEntityIndices(data.entityData, data.createdEntities);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,72 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
|
#include "ECS_Base/SHECSMacros.h"
|
||||||
|
#include "Editor/Command/SHCommand.hpp"
|
||||||
|
#include "Serialization/SHSerialization.h"
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SHCreateEntityCommand final : public SHBaseCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
void Execute() override;
|
||||||
|
void Undo() override;
|
||||||
|
private:
|
||||||
|
EntityID eid = MAX_EID;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SHEntityParentCommand final : public SHBaseCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct Data
|
||||||
|
{
|
||||||
|
EntityID oldParentEID = MAX_EID;
|
||||||
|
EntityID newParentEID = MAX_EID;
|
||||||
|
};
|
||||||
|
using EntityParentData = std::unordered_map<EntityID, Data>;
|
||||||
|
|
||||||
|
SHEntityParentCommand(std::vector<EntityID> entityIDs, EntityParentData inEntityParentData) :entities(entityIDs), entityParentData(inEntityParentData) {}
|
||||||
|
|
||||||
|
void Execute() override;
|
||||||
|
void Undo() override;
|
||||||
|
private:
|
||||||
|
std::vector<EntityID> entities{};
|
||||||
|
std::unordered_map<EntityID, Data> entityParentData{};
|
||||||
|
};
|
||||||
|
|
||||||
|
class SHPasteEntitiesCommand final : public SHBaseCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct Data
|
||||||
|
{
|
||||||
|
EntityID parentEID{MAX_EID};
|
||||||
|
std::string entityData{};
|
||||||
|
SHSerialization::CreatedEntitiesList createdEntities{};
|
||||||
|
};
|
||||||
|
SHPasteEntitiesCommand() = delete;
|
||||||
|
SHPasteEntitiesCommand(std::string const& serializedEntityData, EntityID parentEid = MAX_EID):data({parentEid, serializedEntityData, {}}){}
|
||||||
|
|
||||||
|
void Execute() override;
|
||||||
|
void Undo() override;
|
||||||
|
private:
|
||||||
|
Data data;
|
||||||
|
};
|
||||||
|
|
||||||
|
class SHDeleteEntitiesCommand final : public SHBaseCommand
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
struct Data
|
||||||
|
{
|
||||||
|
std::vector<EntityID> entitiesToDelete{};
|
||||||
|
SHSerialization::CreatedEntitiesList createdEntities{};
|
||||||
|
std::string entityData{};
|
||||||
|
};
|
||||||
|
SHDeleteEntitiesCommand() = delete;
|
||||||
|
SHDeleteEntitiesCommand(std::vector<EntityID> entitiesToBeDeleted): data{entitiesToBeDeleted}{}
|
||||||
|
void Execute() override;
|
||||||
|
void Undo() override;
|
||||||
|
private:
|
||||||
|
Data data;
|
||||||
|
};
|
||||||
|
}
|
|
@ -15,7 +15,7 @@
|
||||||
#include "Editor/SHEditorWidgets.hpp"
|
#include "Editor/SHEditorWidgets.hpp"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
||||||
#include "Graphics/MiddleEnd/Lights/SHLightComponent.h"
|
#include "Graphics/MiddleEnd/Lights/SHLightComponent.h"
|
||||||
#include "Physics/Components/SHColliderComponent.h"
|
#include "Physics/Interface/SHColliderComponent.h"
|
||||||
#include "Reflection/SHReflectionMetadata.h"
|
#include "Reflection/SHReflectionMetadata.h"
|
||||||
#include "Resource/SHResourceManager.h"
|
#include "Resource/SHResourceManager.h"
|
||||||
|
|
||||||
|
@ -68,10 +68,10 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
if (!component)
|
if (!component)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
const auto componentType = rttr::type::get<T>();
|
const auto componentType = rttr::type::get<T>();
|
||||||
ImGui::PushID(SHFamilyID<SHComponent>::GetID<T>());
|
ImGui::PushID(SHFamilyID<SHComponent>::GetID<T>());
|
||||||
SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }, "Is Component Active");
|
SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }, "Is Component Active");
|
||||||
ImGui::PopID();
|
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
if (ImGui::CollapsingHeader(componentType.get_name().data()))
|
if (ImGui::CollapsingHeader(componentType.get_name().data()))
|
||||||
{
|
{
|
||||||
|
@ -216,6 +216,8 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else DrawContextMenu(component);
|
else DrawContextMenu(component);
|
||||||
|
ImGui::PopID();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
@ -223,6 +225,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
if (!component)
|
if (!component)
|
||||||
return;
|
return;
|
||||||
|
ImGui::PushID(SHFamilyID<SHComponent>::GetID<SHColliderComponent>());
|
||||||
|
|
||||||
const auto componentType = rttr::type::get(*component);
|
const auto componentType = rttr::type::get(*component);
|
||||||
SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }, "Is Component Active");
|
SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }, "Is Component Active");
|
||||||
|
@ -246,21 +249,21 @@ namespace SHADE
|
||||||
if (collider->GetType() == SHCollisionShape::Type::BOX)
|
if (collider->GetType() == SHCollisionShape::Type::BOX)
|
||||||
{
|
{
|
||||||
SHEditorWidgets::BeginPanel(std::format("{} Box #{}", ICON_FA_CUBE, i).data(), { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y });
|
SHEditorWidgets::BeginPanel(std::format("{} Box #{}", ICON_FA_CUBE, i).data(), { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y });
|
||||||
auto box = reinterpret_cast<SHBoundingBox*>(collider->GetShape());
|
const auto* BOX = reinterpret_cast<const SHBox*>(collider->GetShape());
|
||||||
SHEditorWidgets::DragVec3
|
SHEditorWidgets::DragVec3
|
||||||
(
|
(
|
||||||
"Half Extents", { "X", "Y", "Z" },
|
"Half Extents", { "X", "Y", "Z" },
|
||||||
[box] { return box->GetRelativeExtents(); },
|
[BOX] { return BOX->GetRelativeExtents(); },
|
||||||
[collider](SHVec3 const& vec) { collider->SetBoundingBox(vec); });
|
[collider](SHVec3 const& vec) { collider->SetBoundingBox(vec); });
|
||||||
}
|
}
|
||||||
else if (collider->GetType() == SHCollisionShape::Type::SPHERE)
|
else if (collider->GetType() == SHCollisionShape::Type::SPHERE)
|
||||||
{
|
{
|
||||||
SHEditorWidgets::BeginPanel(std::format("{} Sphere #{}", ICON_MD_CIRCLE, i).data(), { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y });
|
SHEditorWidgets::BeginPanel(std::format("{} Sphere #{}", ICON_MD_CIRCLE, i).data(), { ImGui::GetContentRegionAvail().x, ImGui::GetContentRegionAvail().y });
|
||||||
auto sphere = reinterpret_cast<SHBoundingSphere*>(collider->GetShape());
|
const auto* SPHERE = reinterpret_cast<const SHSphere*>(collider->GetShape());
|
||||||
SHEditorWidgets::DragFloat
|
SHEditorWidgets::DragFloat
|
||||||
(
|
(
|
||||||
"Radius",
|
"Radius",
|
||||||
[sphere] { return sphere->GetRelativeRadius(); },
|
[SPHERE] { return SPHERE->GetRelativeRadius(); },
|
||||||
[collider](float const& value) { collider->SetBoundingSphere(value); });
|
[collider](float const& value) { collider->SetBoundingSphere(value); });
|
||||||
}
|
}
|
||||||
else if (collider->GetType() == SHCollisionShape::Type::CAPSULE)
|
else if (collider->GetType() == SHCollisionShape::Type::CAPSULE)
|
||||||
|
@ -322,6 +325,7 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else DrawContextMenu(component);
|
else DrawContextMenu(component);
|
||||||
|
ImGui::PopID();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
@ -329,6 +333,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
if (!component)
|
if (!component)
|
||||||
return;
|
return;
|
||||||
|
ImGui::PushID(SHFamilyID<SHComponent>::GetID<SHLightComponent>());
|
||||||
const auto componentType = rttr::type::get(*component);
|
const auto componentType = rttr::type::get(*component);
|
||||||
SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }, "Is Component Active");
|
SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }, "Is Component Active");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -352,6 +357,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
DrawContextMenu(component);
|
DrawContextMenu(component);
|
||||||
}
|
}
|
||||||
|
ImGui::PopID();
|
||||||
}
|
}
|
||||||
|
|
||||||
template<>
|
template<>
|
||||||
|
@ -359,6 +365,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
if (!component)
|
if (!component)
|
||||||
return;
|
return;
|
||||||
|
ImGui::PushID(SHFamilyID<SHComponent>::GetID<SHRenderable>());
|
||||||
const auto componentType = rttr::type::get(*component);
|
const auto componentType = rttr::type::get(*component);
|
||||||
SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }, "Is Component Active");
|
SHEditorWidgets::CheckBox("##IsActive", [component]() {return component->isActive; }, [component](bool const& active) {component->isActive = active; }, "Is Component Active");
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
@ -396,5 +403,6 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
DrawContextMenu(component);
|
DrawContextMenu(component);
|
||||||
}
|
}
|
||||||
|
ImGui::PopID();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -14,8 +14,8 @@
|
||||||
#include "Scripting/SHScriptEngine.h"
|
#include "Scripting/SHScriptEngine.h"
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
|
||||||
#include "Physics/Components/SHRigidBodyComponent.h"
|
#include "Physics/Interface/SHRigidBodyComponent.h"
|
||||||
#include "Physics/Components/SHColliderComponent.h"
|
#include "Physics/Interface/SHColliderComponent.h"
|
||||||
#include "Camera/SHCameraComponent.h"
|
#include "Camera/SHCameraComponent.h"
|
||||||
#include "Camera/SHCameraArmComponent.h"
|
#include "Camera/SHCameraArmComponent.h"
|
||||||
#include "SHEditorComponentView.h"
|
#include "SHEditorComponentView.h"
|
||||||
|
@ -93,13 +93,14 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
EntityID const& eid = editor->selectedEntities[0];
|
EntityID const& eid = editor->selectedEntities[0];
|
||||||
SHEntity* entity = SHEntityManager::GetEntityByID(eid);
|
SHEntity* entity = SHEntityManager::GetEntityByID(eid);
|
||||||
if(!entity)
|
SHSceneNode* entityNode = SHSceneManager::GetCurrentSceneGraph().GetNode(eid);
|
||||||
|
if(!entity || !entityNode)
|
||||||
{
|
{
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
ImGui::TextColored(ImGuiColors::green, "EID: %zu", eid);
|
ImGui::TextColored(ImGuiColors::green, "EID: %zu", eid);
|
||||||
SHEditorWidgets::CheckBox("##IsActive", [entity]()->bool {return entity->GetActive(); }, [entity](bool const& active) {entity->SetActive(active); });
|
SHEditorWidgets::CheckBox("##IsActive", [entityNode]()->bool {return entityNode->IsActive(); }, [entityNode](bool const& active) {entityNode->SetActive(active); });
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
|
|
||||||
ImGui::InputText("##EntityName", &entity->name);
|
ImGui::InputText("##EntityName", &entity->name);
|
||||||
|
|
|
@ -23,7 +23,7 @@
|
||||||
#include "Scene/SHSceneManager.h"
|
#include "Scene/SHSceneManager.h"
|
||||||
#include "Serialization/SHSerialization.h"
|
#include "Serialization/SHSerialization.h"
|
||||||
#include "Serialization/Configurations/SHConfigurationManager.h"
|
#include "Serialization/Configurations/SHConfigurationManager.h"
|
||||||
|
#include "Editor/EditorWindow/SHEditorWindowManager.h"
|
||||||
|
|
||||||
const std::string LAYOUT_FOLDER_PATH{ std::string(ASSET_ROOT) + "/Editor/Layouts" };
|
const std::string LAYOUT_FOLDER_PATH{ std::string(ASSET_ROOT) + "/Editor/Layouts" };
|
||||||
|
|
||||||
|
@ -221,41 +221,29 @@ namespace SHADE
|
||||||
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PLAY);
|
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PLAY);
|
||||||
if(ImGui::SmallButton(ICON_MD_PLAY_ARROW))
|
if(ImGui::SmallButton(ICON_MD_PLAY_ARROW))
|
||||||
{
|
{
|
||||||
if(editor->SaveScene())
|
if(editor->editorState == SHEditor::State::STOP)
|
||||||
{
|
{
|
||||||
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
if (editor->SaveScene())
|
||||||
{
|
{
|
||||||
.previousState = editor->editorState
|
editor->Play();
|
||||||
};
|
}
|
||||||
editor->editorState = SHEditor::State::PLAY;
|
}
|
||||||
|
else
|
||||||
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_PLAY_EVENT);
|
{
|
||||||
|
editor->Play();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PAUSE);
|
ImGui::BeginDisabled(editor->editorState == SHEditor::State::STOP || editor->editorState == SHEditor::State::PAUSE);
|
||||||
if(ImGui::SmallButton(ICON_MD_PAUSE))
|
if(ImGui::SmallButton(ICON_MD_PAUSE))
|
||||||
{
|
{
|
||||||
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
editor->Pause();
|
||||||
{
|
|
||||||
.previousState = editor->editorState
|
|
||||||
};
|
|
||||||
editor->editorState = SHEditor::State::PAUSE;
|
|
||||||
|
|
||||||
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_PAUSE_EVENT);
|
|
||||||
}
|
}
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::BeginDisabled(editor->editorState == SHEditor::State::STOP);
|
ImGui::BeginDisabled(editor->editorState == SHEditor::State::STOP);
|
||||||
if(ImGui::SmallButton(ICON_MD_STOP))
|
if(ImGui::SmallButton(ICON_MD_STOP))
|
||||||
{
|
{
|
||||||
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
editor->Stop();
|
||||||
{
|
|
||||||
.previousState = editor->editorState
|
|
||||||
};
|
|
||||||
editor->editorState = SHEditor::State::STOP;
|
|
||||||
|
|
||||||
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_STOP_EVENT);
|
|
||||||
editor->LoadScene(SHSceneManager::GetCurrentSceneAssetID());
|
|
||||||
}
|
}
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::EndMenuBar();
|
ImGui::EndMenuBar();
|
||||||
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHEditorWindowManager.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
SHEditorWindowManager::EditorWindowMap SHEditorWindowManager::editorWindows{};
|
||||||
|
SHEditorWindowManager::EditorWindowID SHEditorWindowManager::windowCount{};
|
||||||
|
}
|
|
@ -0,0 +1,77 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <memory>
|
||||||
|
#include <unordered_map>
|
||||||
|
#include "SHEditorWindow.h"
|
||||||
|
#include "Tools/Logger/SHLog.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
class SH_API SHEditorWindowManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
//#==============================================================#
|
||||||
|
//|| Type Aliases ||
|
||||||
|
//#==============================================================#
|
||||||
|
using EditorWindowID = uint8_t;
|
||||||
|
using EditorWindowPtr = std::unique_ptr<SHEditorWindow>;
|
||||||
|
using EditorWindowMap = std::unordered_map<EditorWindowID, EditorWindowPtr>;
|
||||||
|
/**
|
||||||
|
* @brief Get ID for the Editor Window Type
|
||||||
|
*
|
||||||
|
* @tparam T Type of Editor Window
|
||||||
|
* @return EditorWindowID ID of Editor Window Type
|
||||||
|
*/
|
||||||
|
template <typename T, std::enable_if_t<std::is_base_of_v<SHEditorWindow, T>, bool> = true>
|
||||||
|
static EditorWindowID GetEditorWindowID()
|
||||||
|
{
|
||||||
|
static EditorWindowID id;
|
||||||
|
static bool idCreated = false;
|
||||||
|
if (!idCreated)
|
||||||
|
{
|
||||||
|
id = windowCount++;
|
||||||
|
idCreated = true;
|
||||||
|
}
|
||||||
|
return id;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Create an Editor Window
|
||||||
|
*
|
||||||
|
* @tparam T Type of Editor Window to create
|
||||||
|
*/
|
||||||
|
template <typename T, std::enable_if_t<std::is_base_of_v<SHEditorWindow, T>, bool> = true>
|
||||||
|
static void CreateEditorWindow()
|
||||||
|
{
|
||||||
|
static bool isCreated = false;
|
||||||
|
if (!isCreated)
|
||||||
|
{
|
||||||
|
editorWindows[GetEditorWindowID<T>()] = std::make_unique<T>();
|
||||||
|
isCreated = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHLog::Warning("Attempt to create duplicate of Editor window type");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Get pointer to the Editor Window
|
||||||
|
*
|
||||||
|
* @tparam T Type of editor window to retrieve
|
||||||
|
* @return T* Pointer to the editor window
|
||||||
|
*/
|
||||||
|
template <typename T, std::enable_if_t<std::is_base_of_v<SHEditorWindow, T>, bool> = true>
|
||||||
|
static T* GetEditorWindow()
|
||||||
|
{
|
||||||
|
return reinterpret_cast<T*>(editorWindows[GetEditorWindowID<T>()].get());
|
||||||
|
}
|
||||||
|
|
||||||
|
static EditorWindowMap editorWindows;
|
||||||
|
private:
|
||||||
|
// Number of windows; used for Editor Window ID Generation
|
||||||
|
static EditorWindowID windowCount;
|
||||||
|
// Map of Editor Windows
|
||||||
|
friend class SHEditor;
|
||||||
|
};
|
||||||
|
}
|
|
@ -33,12 +33,31 @@ namespace SHADE
|
||||||
void SHEditorViewport::Update()
|
void SHEditorViewport::Update()
|
||||||
{
|
{
|
||||||
SHEditorWindow::Update();
|
SHEditorWindow::Update();
|
||||||
if (shouldUpdateCamera)
|
auto camSystem = SHSystemManager::GetSystem<SHCameraSystem>();
|
||||||
|
SHEditor* editor = SHSystemManager::GetSystem<SHEditor>();
|
||||||
|
|
||||||
|
if (!editor->selectedEntities.empty())
|
||||||
|
{
|
||||||
|
if (SHTransformComponent* transform = SHComponentManager::GetComponent_s<SHTransformComponent>(editor->selectedEntities.front()))
|
||||||
|
{
|
||||||
|
targetPos = transform->GetWorldPosition();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
targetPos = {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
targetPos = {};
|
||||||
|
}
|
||||||
|
if (shouldUpdateCamera || shouldUpdateCamArm)
|
||||||
{
|
{
|
||||||
auto camSystem = SHSystemManager::GetSystem<SHCameraSystem>();
|
|
||||||
camSystem->UpdateEditorCamera(SHFrameRateController::GetRawDeltaTime());
|
camSystem->UpdateEditorCamera(SHFrameRateController::GetRawDeltaTime());
|
||||||
shouldUpdateCamera = false;
|
shouldUpdateCamera = false;
|
||||||
}
|
}
|
||||||
|
camSystem->UpdateEditorArm(SHFrameRateController::GetRawDeltaTime(), shouldUpdateCamArm, targetPos);
|
||||||
|
|
||||||
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
ImGui::PushStyleVar(ImGuiStyleVar_WindowPadding, ImVec2(0.0f, 0.0f));
|
||||||
|
|
||||||
if (Begin())
|
if (Begin())
|
||||||
|
@ -51,7 +70,6 @@ namespace SHADE
|
||||||
beginCursorPos = ImGui::GetCursorScreenPos();
|
beginCursorPos = ImGui::GetCursorScreenPos();
|
||||||
viewportMousePos = { mousePos.x - beginCursorPos.x, mousePos.y - beginCursorPos.y };
|
viewportMousePos = { mousePos.x - beginCursorPos.x, mousePos.y - beginCursorPos.y };
|
||||||
gfxSystem->GetMousePickSystem()->SetViewportMousePos(viewportMousePos);
|
gfxSystem->GetMousePickSystem()->SetViewportMousePos(viewportMousePos);
|
||||||
|
|
||||||
ImGui::Image((ImTextureID)descriptorSet, { beginContentRegionAvailable.x, beginContentRegionAvailable.y });
|
ImGui::Image((ImTextureID)descriptorSet, { beginContentRegionAvailable.x, beginContentRegionAvailable.y });
|
||||||
|
|
||||||
if (ImGui::IsWindowHovered() && ImGui::IsMouseDown(ImGuiMouseButton_Right))
|
if (ImGui::IsWindowHovered() && ImGui::IsMouseDown(ImGuiMouseButton_Right))
|
||||||
|
@ -64,24 +82,28 @@ namespace SHADE
|
||||||
|
|
||||||
shouldUpdateCamera = true;
|
shouldUpdateCamera = true;
|
||||||
}
|
}
|
||||||
if (ImGui::IsWindowFocused() && !ImGui::IsMouseDown(ImGuiMouseButton_Right))
|
|
||||||
|
shouldUpdateCamArm = ImGui::IsWindowHovered() && ImGui::IsKeyDown(ImGuiKey_LeftAlt) && ImGui::IsMouseDown(ImGuiMouseButton_Left);
|
||||||
|
|
||||||
|
if (editor->editorState != SHEditor::State::PLAY && !ImGui::IsAnyItemActive() && !ImGui::IsMouseDown(ImGuiMouseButton_Right))
|
||||||
{
|
{
|
||||||
if (ImGui::IsKeyReleased(ImGuiKey_Q))
|
if (ImGui::IsKeyReleased(ImGuiKey_W))
|
||||||
{
|
{
|
||||||
transformGizmo.operation = SHTransformGizmo::Operation::TRANSLATE;
|
transformGizmo.operation = SHTransformGizmo::Operation::TRANSLATE;
|
||||||
}
|
}
|
||||||
if (ImGui::IsKeyReleased(ImGuiKey_W))
|
if (ImGui::IsKeyReleased(ImGuiKey_E))
|
||||||
{
|
{
|
||||||
transformGizmo.operation = SHTransformGizmo::Operation::ROTATE;
|
transformGizmo.operation = SHTransformGizmo::Operation::ROTATE;
|
||||||
}
|
}
|
||||||
if (ImGui::IsKeyReleased(ImGuiKey_E))
|
if (ImGui::IsKeyReleased(ImGuiKey_R))
|
||||||
{
|
{
|
||||||
transformGizmo.operation = SHTransformGizmo::Operation::SCALE;
|
transformGizmo.operation = SHTransformGizmo::Operation::SCALE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
ImGuizmo::SetRect(beginCursorPos.x, beginCursorPos.y, beginContentRegionAvailable.x, beginContentRegionAvailable.y);
|
ImGuizmo::SetRect(beginCursorPos.x, beginCursorPos.y, beginContentRegionAvailable.x, beginContentRegionAvailable.y);
|
||||||
transformGizmo.Draw();
|
if(editor->editorState != SHEditor::State::PLAY)
|
||||||
|
transformGizmo.Draw();
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
ImGui::PopStyleVar();
|
ImGui::PopStyleVar();
|
||||||
}
|
}
|
||||||
|
@ -129,7 +151,7 @@ namespace SHADE
|
||||||
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
|
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
|
||||||
{
|
{
|
||||||
ImGui::BeginTooltip();
|
ImGui::BeginTooltip();
|
||||||
ImGui::Text("Translate [Q]");
|
ImGui::Text("Translate [W]");
|
||||||
ImGui::EndTooltip();
|
ImGui::EndTooltip();
|
||||||
}
|
}
|
||||||
if (isTranslate)
|
if (isTranslate)
|
||||||
|
@ -147,7 +169,7 @@ namespace SHADE
|
||||||
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
|
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
|
||||||
{
|
{
|
||||||
ImGui::BeginTooltip();
|
ImGui::BeginTooltip();
|
||||||
ImGui::Text("Rotate [W]");
|
ImGui::Text("Rotate [E]");
|
||||||
ImGui::EndTooltip();
|
ImGui::EndTooltip();
|
||||||
}
|
}
|
||||||
if (isRotate)
|
if (isRotate)
|
||||||
|
@ -165,7 +187,7 @@ namespace SHADE
|
||||||
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
|
if (ImGui::IsItemHovered(ImGuiHoveredFlags_AllowWhenDisabled))
|
||||||
{
|
{
|
||||||
ImGui::BeginTooltip();
|
ImGui::BeginTooltip();
|
||||||
ImGui::Text("Scale [E]");
|
ImGui::Text("Scale [R]");
|
||||||
ImGui::EndTooltip();
|
ImGui::EndTooltip();
|
||||||
}
|
}
|
||||||
if (isScale)
|
if (isScale)
|
||||||
|
|
|
@ -29,5 +29,7 @@ namespace SHADE
|
||||||
void DrawMenuBar() noexcept;
|
void DrawMenuBar() noexcept;
|
||||||
SHVec2 beginCursorPos;
|
SHVec2 beginCursorPos;
|
||||||
bool shouldUpdateCamera = false;
|
bool shouldUpdateCamera = false;
|
||||||
|
bool shouldUpdateCamArm = false;
|
||||||
|
SHVec3 targetPos;
|
||||||
};//class SHEditorViewport
|
};//class SHEditorViewport
|
||||||
}//namespace SHADE
|
}//namespace SHADE
|
||||||
|
|
|
@ -11,6 +11,8 @@
|
||||||
#include "Camera/SHCameraSystem.h"
|
#include "Camera/SHCameraSystem.h"
|
||||||
#include "Editor/Command/SHCommandManager.h"
|
#include "Editor/Command/SHCommandManager.h"
|
||||||
#include "Editor/EditorWindow/ViewportWindow/SHEditorViewport.h"
|
#include "Editor/EditorWindow/ViewportWindow/SHEditorViewport.h"
|
||||||
|
#include "Editor/EditorWindow/SHEditorWindowManager.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
void SHTransformGizmo::Init()
|
void SHTransformGizmo::Init()
|
||||||
|
|
|
@ -10,7 +10,7 @@
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| SHADE Includes ||
|
//|| SHADE Includes ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Tools/SHException.h"
|
#include "Tools/SHException.h"
|
||||||
|
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
@ -29,6 +29,7 @@
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| Editor Window Includes ||
|
//|| Editor Window Includes ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
#include "EditorWindow/SHEditorWindowManager.h"
|
||||||
#include "EditorWindow/SHEditorWindowIncludes.h"
|
#include "EditorWindow/SHEditorWindowIncludes.h"
|
||||||
|
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
@ -77,8 +78,6 @@ namespace SHADE
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//Handle<SHVkCommandPool> SHEditor::imguiCommandPool;
|
//Handle<SHVkCommandPool> SHEditor::imguiCommandPool;
|
||||||
//Handle<SHVkCommandBuffer> SHEditor::imguiCommandBuffer;
|
//Handle<SHVkCommandBuffer> SHEditor::imguiCommandBuffer;
|
||||||
SHEditorWindowManager::EditorWindowMap SHEditorWindowManager::editorWindows{};
|
|
||||||
SHEditorWindowManager::EditorWindowID SHEditorWindowManager::windowCount{};
|
|
||||||
//std::vector<EntityID> SHEditor::selectedEntities;
|
//std::vector<EntityID> SHEditor::selectedEntities;
|
||||||
|
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
@ -168,6 +167,18 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
SHCommandManager::UndoCommand();
|
SHCommandManager::UndoCommand();
|
||||||
}
|
}
|
||||||
|
if(ImGui::IsKeyReleased(ImGuiKey_F5))
|
||||||
|
{
|
||||||
|
Play();
|
||||||
|
}
|
||||||
|
else if (ImGui::IsKeyReleased(ImGuiKey_F6))
|
||||||
|
{
|
||||||
|
Pause();
|
||||||
|
}
|
||||||
|
else if (ImGui::IsKeyReleased(ImGuiKey_F7))
|
||||||
|
{
|
||||||
|
Stop();
|
||||||
|
}
|
||||||
|
|
||||||
Render();
|
Render();
|
||||||
}
|
}
|
||||||
|
@ -597,6 +608,48 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHEditor::Play()
|
||||||
|
{
|
||||||
|
if(editorState == State::PLAY)
|
||||||
|
return;
|
||||||
|
if (SaveScene())
|
||||||
|
{
|
||||||
|
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
||||||
|
{
|
||||||
|
.previousState = editorState
|
||||||
|
};
|
||||||
|
editorState = State::PLAY;
|
||||||
|
SHCommandManager::SwapStacks();
|
||||||
|
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_PLAY_EVENT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditor::Pause()
|
||||||
|
{
|
||||||
|
if (editorState == State::PAUSE)
|
||||||
|
return;
|
||||||
|
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
||||||
|
{
|
||||||
|
.previousState = editorState
|
||||||
|
};
|
||||||
|
editorState = State::PAUSE;
|
||||||
|
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_PAUSE_EVENT);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditor::Stop()
|
||||||
|
{
|
||||||
|
if (editorState == State::STOP)
|
||||||
|
return;
|
||||||
|
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
||||||
|
{
|
||||||
|
.previousState = editorState
|
||||||
|
};
|
||||||
|
editorState = SHEditor::State::STOP;
|
||||||
|
SHCommandManager::SwapStacks();
|
||||||
|
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_STOP_EVENT);
|
||||||
|
LoadScene(SHSceneManager::GetCurrentSceneAssetID());
|
||||||
|
}
|
||||||
|
|
||||||
void SHEditor::NewFrame()
|
void SHEditor::NewFrame()
|
||||||
{
|
{
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
|
|
@ -15,7 +15,7 @@
|
||||||
#include "ECS_Base/System/SHSystemRoutine.h"
|
#include "ECS_Base/System/SHSystemRoutine.h"
|
||||||
#include "Resource/SHHandle.h"
|
#include "Resource/SHHandle.h"
|
||||||
#include "EditorWindow/SHEditorWindow.h"
|
#include "EditorWindow/SHEditorWindow.h"
|
||||||
#include "Tools/SHLog.h"
|
#include "Tools/Logger/SHLog.h"
|
||||||
#include "Gizmos/SHTransformGizmo.h"
|
#include "Gizmos/SHTransformGizmo.h"
|
||||||
#include "Events/SHEventDefines.h"
|
#include "Events/SHEventDefines.h"
|
||||||
#include "Events/SHEvent.h"
|
#include "Events/SHEvent.h"
|
||||||
|
@ -36,73 +36,7 @@ namespace SHADE
|
||||||
class SHVkCommandBuffer;
|
class SHVkCommandBuffer;
|
||||||
class SHVkCommandPool;
|
class SHVkCommandPool;
|
||||||
|
|
||||||
class SHEditorWindowManager
|
|
||||||
{
|
|
||||||
public:
|
|
||||||
//#==============================================================#
|
|
||||||
//|| Type Aliases ||
|
|
||||||
//#==============================================================#
|
|
||||||
using EditorWindowID = uint8_t;
|
|
||||||
using EditorWindowPtr = std::unique_ptr<SHEditorWindow>;
|
|
||||||
using EditorWindowMap = std::unordered_map<EditorWindowID, EditorWindowPtr>;
|
|
||||||
/**
|
|
||||||
* @brief Get ID for the Editor Window Type
|
|
||||||
*
|
|
||||||
* @tparam T Type of Editor Window
|
|
||||||
* @return EditorWindowID ID of Editor Window Type
|
|
||||||
*/
|
|
||||||
template <typename T, std::enable_if_t<std::is_base_of_v<SHEditorWindow, T>, bool> = true>
|
|
||||||
static EditorWindowID GetEditorWindowID()
|
|
||||||
{
|
|
||||||
static EditorWindowID id;
|
|
||||||
static bool idCreated = false;
|
|
||||||
if (!idCreated)
|
|
||||||
{
|
|
||||||
id = windowCount++;
|
|
||||||
idCreated = true;
|
|
||||||
}
|
|
||||||
return id;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Create an Editor Window
|
|
||||||
*
|
|
||||||
* @tparam T Type of Editor Window to create
|
|
||||||
*/
|
|
||||||
template <typename T, std::enable_if_t<std::is_base_of_v<SHEditorWindow, T>, bool> = true>
|
|
||||||
static void CreateEditorWindow()
|
|
||||||
{
|
|
||||||
static bool isCreated = false;
|
|
||||||
if (!isCreated)
|
|
||||||
{
|
|
||||||
editorWindows[GetEditorWindowID<T>()] = std::make_unique<T>();
|
|
||||||
isCreated = true;
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SHLog::Warning("Attempt to create duplicate of Editor window type");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @brief Get pointer to the Editor Window
|
|
||||||
*
|
|
||||||
* @tparam T Type of editor window to retrieve
|
|
||||||
* @return T* Pointer to the editor window
|
|
||||||
*/
|
|
||||||
template <typename T, std::enable_if_t<std::is_base_of_v<SHEditorWindow, T>, bool> = true>
|
|
||||||
static T* GetEditorWindow()
|
|
||||||
{
|
|
||||||
return reinterpret_cast<T*>(editorWindows[GetEditorWindowID<T>()].get());
|
|
||||||
}
|
|
||||||
|
|
||||||
static EditorWindowMap editorWindows;
|
|
||||||
private:
|
|
||||||
// Number of windows; used for Editor Window ID Generation
|
|
||||||
static EditorWindowID windowCount;
|
|
||||||
// Map of Editor Windows
|
|
||||||
friend class SHEditor;
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief SHEditor static class contains editor variables and implementation of editor functions.
|
* @brief SHEditor static class contains editor variables and implementation of editor functions.
|
||||||
|
@ -184,6 +118,10 @@ namespace SHADE
|
||||||
|
|
||||||
void LoadScene(AssetID const& assetID) noexcept;
|
void LoadScene(AssetID const& assetID) noexcept;
|
||||||
|
|
||||||
|
void Play();
|
||||||
|
void Pause();
|
||||||
|
void Stop();
|
||||||
|
|
||||||
// List of selected entities
|
// List of selected entities
|
||||||
std::vector<EntityID> selectedEntities;
|
std::vector<EntityID> selectedEntities;
|
||||||
|
|
||||||
|
|
|
@ -53,9 +53,12 @@ namespace SHADE
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
/* ImGui Wrapper Functions - Organizers */
|
/* ImGui Wrapper Functions - Organizers */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
bool SHEditorUI::CollapsingHeader(const std::string& title)
|
bool SHEditorUI::CollapsingHeader(const std::string& title, bool* isHovered)
|
||||||
{
|
{
|
||||||
return ImGui::CollapsingHeader(title.c_str(), ImGuiTreeNodeFlags_DefaultOpen);
|
const bool OPENED = ImGui::CollapsingHeader(title.c_str(), ImGuiTreeNodeFlags_DefaultOpen);
|
||||||
|
if (isHovered)
|
||||||
|
*isHovered = ImGui::IsItemHovered();
|
||||||
|
return OPENED;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHEditorUI::SameLine()
|
void SHEditorUI::SameLine()
|
||||||
|
@ -75,7 +78,7 @@ namespace SHADE
|
||||||
|
|
||||||
bool SHEditorUI::BeginMenu(const std::string& label)
|
bool SHEditorUI::BeginMenu(const std::string& label)
|
||||||
{
|
{
|
||||||
return ImGui::BeginMenu(label.data());
|
return ImGui::BeginMenu(label.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHEditorUI::BeginMenu(const std::string& label, const char* icon)
|
bool SHEditorUI::BeginMenu(const std::string& label, const char* icon)
|
||||||
|
@ -143,7 +146,7 @@ namespace SHADE
|
||||||
|
|
||||||
bool SHEditorUI::Selectable(const std::string& label)
|
bool SHEditorUI::Selectable(const std::string& label)
|
||||||
{
|
{
|
||||||
return ImGui::Selectable(label.data());
|
return ImGui::Selectable(label.data());
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHEditorUI::Selectable(const std::string& label, const char* icon)
|
bool SHEditorUI::Selectable(const std::string& label, const char* icon)
|
||||||
|
@ -165,8 +168,10 @@ namespace SHADE
|
||||||
if (isHovered)
|
if (isHovered)
|
||||||
*isHovered = ImGui::IsItemHovered();
|
*isHovered = ImGui::IsItemHovered();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
return ImGui::InputInt("##", &value,
|
return ImGui::DragInt("##", &value, 0.001f,
|
||||||
1, 10,
|
std::numeric_limits<int>::min(),
|
||||||
|
std::numeric_limits<int>::max(),
|
||||||
|
"%d",
|
||||||
ImGuiInputTextFlags_EnterReturnsTrue);
|
ImGuiInputTextFlags_EnterReturnsTrue);
|
||||||
}
|
}
|
||||||
bool SHEditorUI::InputUnsignedInt(const std::string& label, unsigned int& value, bool* isHovered)
|
bool SHEditorUI::InputUnsignedInt(const std::string& label, unsigned int& value, bool* isHovered)
|
||||||
|
@ -190,31 +195,22 @@ namespace SHADE
|
||||||
if (isHovered)
|
if (isHovered)
|
||||||
*isHovered = ImGui::IsItemHovered();
|
*isHovered = ImGui::IsItemHovered();
|
||||||
ImGui::SameLine();
|
ImGui::SameLine();
|
||||||
return ImGui::InputFloat("##", &value,
|
return ImGui::DragFloat("##", &value, 0.001f,
|
||||||
0.1f, 1.0f, "%.3f",
|
std::numeric_limits<float>::lowest(),
|
||||||
|
std::numeric_limits<float>::max(),
|
||||||
|
"%.3f",
|
||||||
ImGuiInputTextFlags_EnterReturnsTrue);
|
ImGuiInputTextFlags_EnterReturnsTrue);
|
||||||
}
|
}
|
||||||
bool SHEditorUI::InputDouble(const std::string& label, double& value, bool* isHovered)
|
bool SHEditorUI::InputDouble(const std::string& label, double& value, bool* isHovered)
|
||||||
{
|
{
|
||||||
ImGui::Text(label.c_str());
|
float val = value;
|
||||||
if (isHovered)
|
const bool CHANGED = InputFloat(label, val, isHovered);
|
||||||
*isHovered = ImGui::IsItemHovered();
|
if (CHANGED)
|
||||||
ImGui::SameLine();
|
{
|
||||||
return ImGui::InputDouble("##", &value,
|
value = static_cast<double>(val);
|
||||||
0.1, 1.0, "%.3f",
|
}
|
||||||
ImGuiInputTextFlags_EnterReturnsTrue);
|
return CHANGED;
|
||||||
}
|
}
|
||||||
bool SHEditorUI::InputAngle(const std::string& label, double& value, bool* isHovered)
|
|
||||||
{
|
|
||||||
ImGui::Text(label.c_str());
|
|
||||||
if (isHovered)
|
|
||||||
*isHovered = ImGui::IsItemHovered();
|
|
||||||
ImGui::SameLine();
|
|
||||||
return ImGui::InputDouble("##", &value,
|
|
||||||
1.0, 45.0, "%.3f",
|
|
||||||
ImGuiInputTextFlags_EnterReturnsTrue);
|
|
||||||
}
|
|
||||||
|
|
||||||
bool SHEditorUI::InputSlider(const std::string& label, int min, int max, int& value, bool* isHovered /*= nullptr*/)
|
bool SHEditorUI::InputSlider(const std::string& label, int min, int max, int& value, bool* isHovered /*= nullptr*/)
|
||||||
{
|
{
|
||||||
ImGui::Text(label.c_str());
|
ImGui::Text(label.c_str());
|
||||||
|
@ -266,10 +262,10 @@ namespace SHADE
|
||||||
static const std::vector<std::string> COMPONENT_LABELS = { "X", "Y" };
|
static const std::vector<std::string> COMPONENT_LABELS = { "X", "Y" };
|
||||||
return SHEditorWidgets::DragN<float, 2>(label, COMPONENT_LABELS, { &value.x, &value.y }, 0.1f, "%.3f", float{}, float{}, 0, isHovered);
|
return SHEditorWidgets::DragN<float, 2>(label, COMPONENT_LABELS, { &value.x, &value.y }, 0.1f, "%.3f", float{}, float{}, 0, isHovered);
|
||||||
}
|
}
|
||||||
bool SHEditorUI::InputVec3(const std::string& label, SHVec3& value, bool* isHovered, float speed)
|
bool SHEditorUI::InputVec3(const std::string& label, SHVec3& value, bool* isHovered)
|
||||||
{
|
{
|
||||||
static const std::vector<std::string> COMPONENT_LABELS = { "X", "Y", "Z"};
|
static const std::vector<std::string> COMPONENT_LABELS = { "X", "Y", "Z"};
|
||||||
return SHEditorWidgets::DragN<float, 3>(label, COMPONENT_LABELS, { &value.x, &value.y, &value.z }, speed, "%.3f", float{}, float{}, 0, isHovered);
|
return SHEditorWidgets::DragN<float, 3>(label, COMPONENT_LABELS, { &value.x, &value.y, &value.z }, 0.1f, "%.3f", float{}, float{}, 0, isHovered);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHEditorUI::InputTextField(const std::string& label, std::string& value, bool* isHovered)
|
bool SHEditorUI::InputTextField(const std::string& label, std::string& value, bool* isHovered)
|
||||||
|
|
|
@ -85,8 +85,9 @@ namespace SHADE
|
||||||
/// Wraps up ImGui::CollapsingHeader().
|
/// Wraps up ImGui::CollapsingHeader().
|
||||||
/// </summary>
|
/// </summary>
|
||||||
/// <param name="title">Label for the header.</param>
|
/// <param name="title">Label for the header.</param>
|
||||||
|
/// <param name="isHovered>If set, stores the hover state of this widget.</param>
|
||||||
/// <returns>True if the header is open, false otherwise.</returns>
|
/// <returns>True if the header is open, false otherwise.</returns>
|
||||||
static bool CollapsingHeader(const std::string& title);
|
static bool CollapsingHeader(const std::string& title, bool* isHovered = nullptr);
|
||||||
static void SameLine();
|
static void SameLine();
|
||||||
static void Separator();
|
static void Separator();
|
||||||
|
|
||||||
|
@ -219,17 +220,6 @@ namespace SHADE
|
||||||
/// <returns>True if the value was changed.</returns>
|
/// <returns>True if the value was changed.</returns>
|
||||||
static bool InputDouble(const std::string& label, double& value, bool* isHovered = nullptr);
|
static bool InputDouble(const std::string& label, double& value, bool* isHovered = nullptr);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a decimal field widget for double input with increments of higher
|
|
||||||
/// steps meant for angle variables.
|
|
||||||
/// <br/>
|
|
||||||
/// Wraps up ImGui::InputDouble().
|
|
||||||
/// </summary>
|
|
||||||
/// <param name="label">Label used to identify this widget.</param>
|
|
||||||
/// <param name="value">Reference to the variable to store the result.</param>
|
|
||||||
/// <param name="isHovered>If set, stores the hover state of this widget.</param>
|
|
||||||
/// <returns>True if the value was changed.</returns>
|
|
||||||
static bool InputAngle(const std::string& label, double& value, bool* isHovered = nullptr);
|
|
||||||
/// <summary>
|
|
||||||
/// Creates an int slider field widget for double input.
|
/// Creates an int slider field widget for double input.
|
||||||
/// <br/>
|
/// <br/>
|
||||||
/// Wraps up ImGui::SliderInt().
|
/// Wraps up ImGui::SliderInt().
|
||||||
|
@ -296,7 +286,7 @@ namespace SHADE
|
||||||
/// <param name="value">Reference to the variable to store the result.</param>
|
/// <param name="value">Reference to the variable to store the result.</param>
|
||||||
/// <param name="isHovered>If set, stores the hover state of this widget.</param>
|
/// <param name="isHovered>If set, stores the hover state of this widget.</param>
|
||||||
/// <returns>True if the value was changed.</returns>
|
/// <returns>True if the value was changed.</returns>
|
||||||
static bool InputVec3(const std::string& label, SHVec3& value, bool* isHovered = nullptr, float speed = 0.1f);
|
static bool InputVec3(const std::string& label, SHVec3& value, bool* isHovered = nullptr);
|
||||||
/// <summary>
|
/// <summary>
|
||||||
/// Creates a text field widget for string input.
|
/// Creates a text field widget for string input.
|
||||||
/// <br/>
|
/// <br/>
|
||||||
|
|
|
@ -12,11 +12,11 @@
|
||||||
|
|
||||||
//TODO Legacy code. Delete soon
|
//TODO Legacy code. Delete soon
|
||||||
|
|
||||||
|
#include <SHpch.h>
|
||||||
|
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <cassert>
|
#include <cassert>
|
||||||
#include <SHpch.h>
|
|
||||||
#include "SHFramerateController.h"
|
#include "SHFramerateController.h"
|
||||||
#include "../Tools/SHLogger.h"
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
#include "SHFileSystem.h"
|
#include "SHFileSystem.h"
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <queue>
|
#include <queue>
|
||||||
|
#include <stack>
|
||||||
|
|
||||||
#include "Assets/SHAssetMetaHandler.h"
|
#include "Assets/SHAssetMetaHandler.h"
|
||||||
|
|
||||||
|
@ -24,29 +25,94 @@ namespace SHADE
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHFileSystem::BuildDirectory(FolderPath path, FolderPointer& root, std::unordered_map<AssetID, SHAsset>& assetCollection) noexcept
|
bool SHFileSystem::IsRecognised(char const* ext) noexcept
|
||||||
|
{
|
||||||
|
for (auto const& e : EXTENSIONS)
|
||||||
|
{
|
||||||
|
if (strcmp(ext, e.data()) == 0)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHFileSystem::IsCompilable(std::string ext) noexcept
|
||||||
|
{
|
||||||
|
for (auto const& external : EXTERNALS)
|
||||||
|
{
|
||||||
|
if (ext == external)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHFileSystem::MatchExtention(FileExt raw, FileExt compiled) noexcept
|
||||||
|
{
|
||||||
|
if (raw == GLSL_EXTENSION)
|
||||||
|
{
|
||||||
|
if (compiled == SHADER_EXTENSION ||
|
||||||
|
compiled == SHADER_BUILT_IN_EXTENSION)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (raw == DDS_EXTENSION)
|
||||||
|
{
|
||||||
|
if (compiled == TEXTURE_EXTENSION)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (raw == FBX_EXTENSION)
|
||||||
|
{
|
||||||
|
if (compiled == MODEL_EXTENSION)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else if (raw == GLTF_EXTENSION)
|
||||||
|
{
|
||||||
|
if (compiled == MODEL_EXTENSION)
|
||||||
|
{
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHFileSystem::BuildDirectory(
|
||||||
|
FolderPath path,
|
||||||
|
FolderPointer& root,
|
||||||
|
std::unordered_map<AssetID, SHAsset>& assetCollection,
|
||||||
|
std::vector<SHFile*>& toGenerate) noexcept
|
||||||
{
|
{
|
||||||
std::queue<FolderPointer> folderQueue;
|
std::stack<FolderPointer> folderStack;
|
||||||
root = new SHFolder("root");
|
root = new SHFolder("root");
|
||||||
root->path = path;
|
root->path = path;
|
||||||
folderQueue.push(root);
|
folderStack.push(root);
|
||||||
|
|
||||||
while (!folderQueue.empty())
|
while (!folderStack.empty())
|
||||||
{
|
{
|
||||||
auto const folder = folderQueue.front();
|
auto const folder = folderStack.top();
|
||||||
folderQueue.pop();
|
folderStack.pop();
|
||||||
|
|
||||||
std::vector<SHAsset> assets;
|
std::vector<SHAsset> assets;
|
||||||
|
|
||||||
for (auto const& dirEntry : std::filesystem::directory_iterator(folder->path))
|
// Get all subfolders/files in this current folder
|
||||||
|
for (auto& dirEntry : std::filesystem::directory_iterator(folder->path))
|
||||||
{
|
{
|
||||||
auto const& path = dirEntry.path();
|
auto path = dirEntry.path();
|
||||||
|
path.make_preferred();
|
||||||
if (!dirEntry.is_directory())
|
if (!dirEntry.is_directory())
|
||||||
{
|
{
|
||||||
if (path.extension().string() == META_EXTENSION)
|
if (path.extension().string() == META_EXTENSION)
|
||||||
{
|
{
|
||||||
//auto asset = SHAssetMetaHandler::RetrieveMetaData(path);
|
|
||||||
//assetCollection.insert({ asset.id, asset });
|
|
||||||
assets.push_back(SHAssetMetaHandler::RetrieveMetaData(path));
|
assets.push_back(SHAssetMetaHandler::RetrieveMetaData(path));
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
|
@ -55,28 +121,101 @@ namespace SHADE
|
||||||
path.stem().string(),
|
path.stem().string(),
|
||||||
path.string(),
|
path.string(),
|
||||||
path.extension().string(),
|
path.extension().string(),
|
||||||
nullptr
|
nullptr,
|
||||||
|
IsCompilable(path.extension().string()),
|
||||||
|
false
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// If item is folder
|
||||||
|
if (path.stem().string() == "bin"
|
||||||
|
|| path.stem().string() == "obj"
|
||||||
|
|| !std::filesystem::exists(path))
|
||||||
|
{
|
||||||
|
SHLOG_INFO("[FileSystem] Skipped paths in directory building: {}", path.string());
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
auto newFolder{ folder->CreateSubFolderHere(path.stem().string()) };
|
auto newFolder{ folder->CreateSubFolderHere(path.stem().string()) };
|
||||||
folderQueue.push(newFolder);
|
folderStack.push(newFolder);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (auto const& asset : assets)
|
for (auto& file : folder->files)
|
||||||
{
|
{
|
||||||
assetCollection.emplace(asset.id, asset);
|
if (!IsRecognised(file.ext.c_str()))
|
||||||
for(auto& file : folder->files)
|
|
||||||
{
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
bool found{ false };
|
||||||
|
for (auto const& asset : assets)
|
||||||
|
{
|
||||||
|
if (!assetCollection.contains(asset.id))
|
||||||
|
{
|
||||||
|
assetCollection.emplace(asset.id, asset);
|
||||||
|
}
|
||||||
if (file.name == asset.name)
|
if (file.name == asset.name)
|
||||||
{
|
{
|
||||||
file.assetMeta = &assetCollection[asset.id];
|
AssetPath path{ file.path };
|
||||||
break;
|
if (SHAssetMetaHandler::GetTypeFromExtension(path.extension().string()) == asset.type)
|
||||||
|
{
|
||||||
|
file.assetMeta = &assetCollection[asset.id];
|
||||||
|
found = true;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!found)
|
||||||
|
{
|
||||||
|
toGenerate.push_back(&file);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
for (auto i {0}; i < folder->files.size(); ++i)
|
||||||
|
{
|
||||||
|
auto& file = folder->files[i];
|
||||||
|
if (file.compilable)
|
||||||
|
{
|
||||||
|
for (auto j{ 0 }; j < folder->files.size(); ++j)
|
||||||
|
{
|
||||||
|
auto& check = folder->files[j];
|
||||||
|
if (i == j || check.compilable)
|
||||||
|
{
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file.name == check.name)
|
||||||
|
{
|
||||||
|
if (MatchExtention(file.ext, check.ext))
|
||||||
|
{
|
||||||
|
file.compiled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHFileSystem::DestroyDirectory(FolderPointer root) noexcept
|
||||||
|
{
|
||||||
|
std::stack<FolderPointer> folderStack;
|
||||||
|
folderStack.push(root);
|
||||||
|
|
||||||
|
while(!folderStack.empty())
|
||||||
|
{
|
||||||
|
auto const folder = folderStack.top();
|
||||||
|
folderStack.pop();
|
||||||
|
|
||||||
|
for (auto const& ptr : folder->subFolders)
|
||||||
|
{
|
||||||
|
folderStack.push(ptr);
|
||||||
|
}
|
||||||
|
|
||||||
|
delete folder;
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,10 +19,17 @@ namespace SHADE
|
||||||
class SHFileSystem
|
class SHFileSystem
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
static void BuildDirectory(FolderPath path, FolderPointer& root, std::unordered_map<AssetID, SHAsset>& assetCollection) noexcept;
|
static void BuildDirectory(
|
||||||
|
FolderPath path,
|
||||||
|
FolderPointer& root,
|
||||||
|
std::unordered_map<AssetID, SHAsset>& assetCollection,
|
||||||
|
std::vector<SHFile*>& toGenerate) noexcept;
|
||||||
|
static void DestroyDirectory(FolderPointer root) noexcept;
|
||||||
|
|
||||||
|
static bool IsRecognised(char const*) noexcept;
|
||||||
private:
|
private:
|
||||||
static bool DeleteFolder(FolderPointer location) noexcept;
|
static bool DeleteFolder(FolderPointer location) noexcept;
|
||||||
|
static bool IsCompilable(std::string ext) noexcept;
|
||||||
|
static bool MatchExtention(FileExt raw, FileExt compiled) noexcept;
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -33,6 +33,8 @@ namespace SHADE
|
||||||
FilePath path;
|
FilePath path;
|
||||||
FileExt ext;
|
FileExt ext;
|
||||||
SHAsset const* assetMeta;
|
SHAsset const* assetMeta;
|
||||||
|
bool compilable;
|
||||||
|
bool compiled;
|
||||||
};
|
};
|
||||||
|
|
||||||
class SHFolder
|
class SHFolder
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include "SHVkCommandPool.h"
|
#include "SHVkCommandPool.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "SHVkCommandPool.h"
|
#include "SHVkCommandPool.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/Renderpass/SHVkRenderpass.h"
|
#include "Graphics/Renderpass/SHVkRenderpass.h"
|
||||||
#include "Graphics/Framebuffer/SHVkFramebuffer.h"
|
#include "Graphics/Framebuffer/SHVkFramebuffer.h"
|
||||||
#include "Graphics/Pipeline/SHVkPipeline.h"
|
#include "Graphics/Pipeline/SHVkPipeline.h"
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Instance/SHVkInstance.h"
|
#include "Graphics/Instance/SHVkInstance.h"
|
||||||
#include "Resource/SHResourceLibrary.h"
|
#include "Resource/SHResourceLibrary.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "SHPch.h"
|
#include "SHPch.h"
|
||||||
#include "SHValidationLayersQuery.h"
|
#include "SHValidationLayersQuery.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,8 +3,8 @@
|
||||||
#include "SHVkDebugMessenger.h"
|
#include "SHVkDebugMessenger.h"
|
||||||
#include "SHVulkanDebugUtil.h"
|
#include "SHVulkanDebugUtil.h"
|
||||||
#include "Graphics/Instance/SHVkInstance.h"
|
#include "Graphics/Instance/SHVkInstance.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
//#include "Tools/SHLogger.h"
|
//#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "SHPch.h"
|
#include "SHPch.h"
|
||||||
#include "SHVulkanDebugUtil.h"
|
#include "SHVulkanDebugUtil.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -6,7 +6,7 @@
|
||||||
#include "SHVkDescriptorPool.h"
|
#include "SHVkDescriptorPool.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Descriptors/SHVkDescriptorSetLayout.h"
|
#include "Graphics/Descriptors/SHVkDescriptorSetLayout.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/Images/SHVkImage.h"
|
#include "Graphics/Images/SHVkImage.h"
|
||||||
#include "Graphics/Images/SHVkImageView.h"
|
#include "Graphics/Images/SHVkImageView.h"
|
||||||
#include "Graphics/Images/SHVkSampler.h"
|
#include "Graphics/Images/SHVkSampler.h"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "SHVkLogicalDevice.h"
|
#include "SHVkLogicalDevice.h"
|
||||||
#include "SHVkPhysicalDevice.h"
|
#include "SHVkPhysicalDevice.h"
|
||||||
#include "Graphics/Instance/SHVkInstance.h"
|
#include "Graphics/Instance/SHVkInstance.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/Windowing/Surface/SHVkSurface.h"
|
#include "Graphics/Windowing/Surface/SHVkSurface.h"
|
||||||
#include "Graphics/Swapchain/SHVkSwapchain.h"
|
#include "Graphics/Swapchain/SHVkSwapchain.h"
|
||||||
#include "Graphics/Commands/SHVkCommandPool.h"
|
#include "Graphics/Commands/SHVkCommandPool.h"
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include <iostream>
|
#include <iostream>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <set>
|
#include <set>
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include <unordered_map>
|
#include <unordered_map>
|
||||||
#include "SHVkPhysicalDeviceLibrary.h"
|
#include "SHVkPhysicalDeviceLibrary.h"
|
||||||
#include "Graphics/Instance/SHVkInstance.h"
|
#include "Graphics/Instance/SHVkInstance.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include "Graphics/Images/SHVkImageView.h"
|
#include "Graphics/Images/SHVkImageView.h"
|
||||||
#include "Graphics/Images/SHVkImage.h"
|
#include "Graphics/Images/SHVkImage.h"
|
||||||
#include "Graphics/Renderpass/SHVkRenderpass.h"
|
#include "Graphics/Renderpass/SHVkRenderpass.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "SHVkImage.h"
|
#include "SHVkImage.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Debugging/SHVulkanDebugUtil.h"
|
#include "Graphics/Debugging/SHVulkanDebugUtil.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "SHVkImageView.h"
|
#include "SHVkImageView.h"
|
||||||
#include "Graphics/Instance/SHVkInstance.h"
|
#include "Graphics/Instance/SHVkInstance.h"
|
||||||
#include "Graphics/Buffers/SHVkBuffer.h"
|
#include "Graphics/Buffers/SHVkBuffer.h"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "SHVkImageView.h"
|
#include "SHVkImageView.h"
|
||||||
#include "SHVkImage.h"
|
#include "SHVkImage.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include "Graphics/Debugging/SHValidationLayersQuery.h"
|
#include "Graphics/Debugging/SHValidationLayersQuery.h"
|
||||||
#include "Graphics/Debugging/SHVkDebugMessenger.h"
|
#include "Graphics/Debugging/SHVkDebugMessenger.h"
|
||||||
#include "Graphics/Devices/SHVkPhysicalDeviceLibrary.h"
|
#include "Graphics/Devices/SHVkPhysicalDeviceLibrary.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/Devices/SHVkPhysicalDeviceLibrary.h"
|
#include "Graphics/Devices/SHVkPhysicalDeviceLibrary.h"
|
||||||
//#include <vulkan/vulkan_win32.h>
|
//#include <vulkan/vulkan_win32.h>
|
||||||
|
|
||||||
|
|
|
@ -22,7 +22,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
||||||
#include "Graphics/Pipeline/SHVkPipeline.h"
|
#include "Graphics/Pipeline/SHVkPipeline.h"
|
||||||
#include "ECS_Base/Managers/SHComponentManager.h"
|
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -5,7 +5,7 @@
|
||||||
#include "Graphics/Pipeline/SHVkPipelineLayout.h"
|
#include "Graphics/Pipeline/SHVkPipelineLayout.h"
|
||||||
#include "Graphics/Descriptors/SHVkDescriptorSetLayout.h"
|
#include "Graphics/Descriptors/SHVkDescriptorSetLayout.h"
|
||||||
#include "Graphics/MiddleEnd/Lights/SHLightData.h"
|
#include "Graphics/MiddleEnd/Lights/SHLightData.h"
|
||||||
#include "Tools/SHUtilities.h"
|
#include "Tools/Utilities/SHUtilities.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -60,7 +60,7 @@ namespace SHADE
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
for (uint32_t i = 1; i <= SHUtilities::ToUnderlying(SH_LIGHT_TYPE::NUM_TYPES); ++i)
|
for (uint32_t i = 1; i <= SHUtilities::ConvertEnum(SH_LIGHT_TYPE::NUM_TYPES); ++i)
|
||||||
{
|
{
|
||||||
lightBindings.push_back (SHVkDescriptorSetLayout::Binding
|
lightBindings.push_back (SHVkDescriptorSetLayout::Binding
|
||||||
{
|
{
|
||||||
|
|
|
@ -317,13 +317,14 @@ namespace SHADE
|
||||||
|
|
||||||
void SHDebugDrawSystem::drawSphere(std::vector<PointVertex>& storage, const SHVec4& color, const SHVec3& pos, double radius)
|
void SHDebugDrawSystem::drawSphere(std::vector<PointVertex>& storage, const SHVec4& color, const SHVec3& pos, double radius)
|
||||||
{
|
{
|
||||||
if (spherePoints.empty())
|
//if (spherePoints.empty())
|
||||||
{
|
{
|
||||||
|
spherePoints.clear();
|
||||||
// Generate
|
// Generate
|
||||||
static const SHMeshData SPHERE = SHPrimitiveGenerator::Sphere();
|
static const SHMeshData SPHERE = SHPrimitiveGenerator::Sphere();
|
||||||
for (const auto& idx : SPHERE.Indices)
|
for (const auto& idx : SPHERE.Indices)
|
||||||
{
|
{
|
||||||
spherePoints.emplace_back(SPHERE.VertexPositions[idx] * radius);
|
spherePoints.emplace_back(SPHERE.VertexPositions[idx] * radius + pos);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
drawLineSet(storage, color, spherePoints.begin(), spherePoints.end());
|
drawLineSet(storage, color, spherePoints.begin(), spherePoints.end());
|
||||||
|
|
|
@ -15,7 +15,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "SHGraphicsConstants.h"
|
#include "SHGraphicsConstants.h"
|
||||||
#include "SHMaterial.h"
|
#include "SHMaterial.h"
|
||||||
#include "Graphics/Pipeline/SHVkPipeline.h"
|
#include "Graphics/Pipeline/SHVkPipeline.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -34,8 +34,11 @@ namespace SHADE
|
||||||
void SHRenderable::OnDestroy()
|
void SHRenderable::OnDestroy()
|
||||||
{
|
{
|
||||||
// Remove from SuperBatch
|
// Remove from SuperBatch
|
||||||
Handle<SHSuperBatch> superBatch = sharedMaterial->GetBaseMaterial()->GetPipeline()->GetPipelineState().GetSubpass()->GetSuperBatch();
|
if (sharedMaterial)
|
||||||
superBatch->Remove(this);
|
{
|
||||||
|
Handle<SHSuperBatch> superBatch = sharedMaterial->GetBaseMaterial()->GetPipeline()->GetPipelineState().GetSubpass()->GetSuperBatch();
|
||||||
|
superBatch->Remove(this);
|
||||||
|
}
|
||||||
|
|
||||||
// Free resources
|
// Free resources
|
||||||
if (material)
|
if (material)
|
||||||
|
|
|
@ -15,7 +15,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
|
|
||||||
#include "Graphics/Commands/SHVkCommandBuffer.h"
|
#include "Graphics/Commands/SHVkCommandBuffer.h"
|
||||||
#include "Graphics/Instance/SHVkInstance.h"
|
#include "Graphics/Instance/SHVkInstance.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "SHRenderer.h"
|
#include "SHRenderer.h"
|
||||||
#include "Resource/SHResourceLibrary.h"
|
#include "Resource/SHResourceLibrary.h"
|
||||||
#include "Graphics/RenderGraph/SHRenderGraph.h"
|
#include "Graphics/RenderGraph/SHRenderGraph.h"
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#include "SHpch.h"
|
#include "SHpch.h"
|
||||||
#include "SHLightingSubSystem.h"
|
#include "SHLightingSubSystem.h"
|
||||||
#include "Graphics/MiddleEnd/GlobalData/SHGraphicsGlobalData.h"
|
#include "Graphics/MiddleEnd/GlobalData/SHGraphicsGlobalData.h"
|
||||||
#include "Tools/SHUtilities.h"
|
#include "Tools/Utilities/SHUtilities.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Buffers/SHVkBuffer.h"
|
#include "Graphics/Buffers/SHVkBuffer.h"
|
||||||
#include "Graphics/Descriptors/SHVkDescriptorSetGroup.h"
|
#include "Graphics/Descriptors/SHVkDescriptorSetGroup.h"
|
||||||
|
@ -379,7 +379,7 @@ namespace SHADE
|
||||||
SHComponentManager::CreateComponentSparseSet<SHLightComponent>();
|
SHComponentManager::CreateComponentSparseSet<SHLightComponent>();
|
||||||
|
|
||||||
logicalDevice = device;
|
logicalDevice = device;
|
||||||
uint32_t constexpr NUM_LIGHT_TYPES = SHUtilities::ToUnderlying(SH_LIGHT_TYPE::NUM_TYPES);
|
uint32_t constexpr NUM_LIGHT_TYPES = SHUtilities::ConvertEnum(SH_LIGHT_TYPE::NUM_TYPES);
|
||||||
|
|
||||||
std::vector<uint32_t> variableSizes{ NUM_LIGHT_TYPES };
|
std::vector<uint32_t> variableSizes{ NUM_LIGHT_TYPES };
|
||||||
std::fill (variableSizes.begin(), variableSizes.end(), 1);
|
std::fill (variableSizes.begin(), variableSizes.end(), 1);
|
||||||
|
@ -431,7 +431,7 @@ namespace SHADE
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
void SHLightingSubSystem::Run(SHMatrix const& viewMat, uint32_t frameIndex) noexcept
|
void SHLightingSubSystem::Run(SHMatrix const& viewMat, uint32_t frameIndex) noexcept
|
||||||
{
|
{
|
||||||
static uint32_t constexpr NUM_LIGHT_TYPES = SHUtilities::ToUnderlying(SH_LIGHT_TYPE::NUM_TYPES);
|
static uint32_t constexpr NUM_LIGHT_TYPES = SHUtilities::ConvertEnum(SH_LIGHT_TYPE::NUM_TYPES);
|
||||||
|
|
||||||
auto& lightComps = SHComponentManager::GetDense<SHLightComponent>();
|
auto& lightComps = SHComponentManager::GetDense<SHLightComponent>();
|
||||||
bool expanded = false;
|
bool expanded = false;
|
||||||
|
@ -451,7 +451,7 @@ namespace SHADE
|
||||||
|
|
||||||
for (auto& light : lightComps)
|
for (auto& light : lightComps)
|
||||||
{
|
{
|
||||||
auto enumValue = SHUtilities::ToUnderlying(light.GetLightData().type);
|
auto enumValue = SHUtilities::ConvertEnum(light.GetLightData().type);
|
||||||
|
|
||||||
// First we want to make sure the light is already bound to the system. if it
|
// First we want to make sure the light is already bound to the system. if it
|
||||||
// isn't, we write it to the correct buffer.
|
// isn't, we write it to the correct buffer.
|
||||||
|
@ -491,7 +491,7 @@ namespace SHADE
|
||||||
// is a new buffer. If some expansion was detected, update descriptor sets.
|
// is a new buffer. If some expansion was detected, update descriptor sets.
|
||||||
if (expanded)
|
if (expanded)
|
||||||
{
|
{
|
||||||
uint32_t constexpr NUM_LIGHT_TYPES = SHUtilities::ToUnderlying(SH_LIGHT_TYPE::NUM_TYPES);
|
uint32_t constexpr NUM_LIGHT_TYPES = SHUtilities::ConvertEnum(SH_LIGHT_TYPE::NUM_TYPES);
|
||||||
for (uint32_t i = 0; i < NUM_LIGHT_TYPES; ++i)
|
for (uint32_t i = 0; i < NUM_LIGHT_TYPES; ++i)
|
||||||
{
|
{
|
||||||
UpdateDescSet(i);
|
UpdateDescSet(i);
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "SHPch.h"
|
#include "SHPch.h"
|
||||||
#include "SHRenderContext.h"
|
#include "SHRenderContext.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Swapchain/SHVkSwapchain.h"
|
#include "Graphics/Swapchain/SHVkSwapchain.h"
|
||||||
|
|
||||||
|
|
|
@ -19,7 +19,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Graphics/Buffers/SHVkBuffer.h"
|
#include "Graphics/Buffers/SHVkBuffer.h"
|
||||||
#include "Graphics/Commands/SHVkCommandBuffer.h"
|
#include "Graphics/Commands/SHVkCommandBuffer.h"
|
||||||
#include "Graphics/SHVkUtil.h"
|
#include "Graphics/SHVkUtil.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h"
|
#include "Graphics/MiddleEnd/Interface/SHGraphicsConstants.h"
|
||||||
#include "Graphics/Descriptors/SHVkDescriptorSetGroup.h"
|
#include "Graphics/Descriptors/SHVkDescriptorSetGroup.h"
|
||||||
#include "Graphics/Images/SHVkImage.h"
|
#include "Graphics/Images/SHVkImage.h"
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "SHVkPipelineLayout.h"
|
#include "SHVkPipelineLayout.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Shaders/SHVkShaderModule.h"
|
#include "Graphics/Shaders/SHVkShaderModule.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/Instance/SHVkInstance.h"
|
#include "Graphics/Instance/SHVkInstance.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "SHPch.h"
|
#include "SHPch.h"
|
||||||
#include "SHVkQueue.h"
|
#include "SHVkQueue.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Synchronization/SHVkSemaphore.h"
|
#include "Graphics/Synchronization/SHVkSemaphore.h"
|
||||||
#include "Graphics/Synchronization/SHVkFence.h"
|
#include "Graphics/Synchronization/SHVkFence.h"
|
||||||
|
|
|
@ -7,7 +7,7 @@
|
||||||
#include "Graphics/Images/SHVkImageView.h"
|
#include "Graphics/Images/SHVkImageView.h"
|
||||||
#include "Graphics/Framebuffer/SHVkFramebuffer.h"
|
#include "Graphics/Framebuffer/SHVkFramebuffer.h"
|
||||||
#include "Graphics/Buffers/SHVkBuffer.h"
|
#include "Graphics/Buffers/SHVkBuffer.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "SHAttachmentDescInitParams.h"
|
#include "SHAttachmentDescInitParams.h"
|
||||||
#include "SHRenderGraphStorage.h"
|
#include "SHRenderGraphStorage.h"
|
||||||
#include "Graphics/RenderGraph/SHRenderGraphNodeCompute.h"
|
#include "Graphics/RenderGraph/SHRenderGraphNodeCompute.h"
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "SHPch.h"
|
#include "SHPch.h"
|
||||||
#include "SHShaderBlockInterface.h"
|
#include "SHShaderBlockInterface.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
#include "SHPch.h"
|
#include "SHPch.h"
|
||||||
#include "SHShaderReflected.h"
|
#include "SHShaderReflected.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/Instance/SHVkInstance.h"
|
#include "Graphics/Instance/SHVkInstance.h"
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
#include "SHVkShaderModule.h"
|
#include "SHVkShaderModule.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Debugging/SHVulkanDebugUtil.h"
|
#include "Graphics/Debugging/SHVulkanDebugUtil.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
#include "Graphics/Devices/SHVkPhysicalDevice.h"
|
#include "Graphics/Devices/SHVkPhysicalDevice.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Windowing/Surface/SHVkSurface.h"
|
#include "Graphics/Windowing/Surface/SHVkSurface.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
#include "Graphics/Images/SHVkImage.h"
|
#include "Graphics/Images/SHVkImage.h"
|
||||||
#include "Graphics/Instance/SHVkInstance.h"
|
#include "Graphics/Instance/SHVkInstance.h"
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/Instance/SHVkInstance.h"
|
#include "Graphics/Instance/SHVkInstance.h"
|
||||||
#include "Graphics/Debugging/SHVulkanDebugUtil.h"
|
#include "Graphics/Debugging/SHVulkanDebugUtil.h"
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/Logger/SHLogger.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
#include <SHpch.h>
|
#include <SHpch.h>
|
||||||
|
|
||||||
// Primary Header
|
// Primary Header
|
||||||
#include "SHBoundingBox.h"
|
#include "SHBox.h"
|
||||||
// Project Headers
|
// Project Headers
|
||||||
#include "Math/SHMathHelpers.h"
|
#include "Math/SHMathHelpers.h"
|
||||||
#include "Math/SHRay.h"
|
#include "Math/SHRay.h"
|
||||||
|
@ -24,13 +24,13 @@ namespace SHADE
|
||||||
/* Constructors & Destructor Definitions */
|
/* Constructors & Destructor Definitions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
SHBoundingBox::SHBoundingBox() noexcept
|
SHBox::SHBox() noexcept
|
||||||
: RelativeExtents { SHVec3::One }
|
: RelativeExtents { SHVec3::One }
|
||||||
{
|
{
|
||||||
type = Type::BOX;
|
type = Type::BOX;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHBoundingBox::SHBoundingBox(const SHVec3& c, const SHVec3& hE) noexcept
|
SHBox::SHBox(const SHVec3& c, const SHVec3& hE) noexcept
|
||||||
: RelativeExtents { SHVec3::One }
|
: RelativeExtents { SHVec3::One }
|
||||||
{
|
{
|
||||||
type = Type::BOX;
|
type = Type::BOX;
|
||||||
|
@ -40,7 +40,7 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
SHBoundingBox::SHBoundingBox(const SHBoundingBox& rhs) noexcept
|
SHBox::SHBox(const SHBox& rhs) noexcept
|
||||||
{
|
{
|
||||||
if (this == &rhs)
|
if (this == &rhs)
|
||||||
return;
|
return;
|
||||||
|
@ -52,7 +52,7 @@ namespace SHADE
|
||||||
RelativeExtents = rhs.RelativeExtents;
|
RelativeExtents = rhs.RelativeExtents;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHBoundingBox::SHBoundingBox(SHBoundingBox&& rhs) noexcept
|
SHBox::SHBox(SHBox&& rhs) noexcept
|
||||||
{
|
{
|
||||||
type = Type::BOX;
|
type = Type::BOX;
|
||||||
|
|
||||||
|
@ -65,7 +65,7 @@ namespace SHADE
|
||||||
/* Operator Overload Definitions */
|
/* Operator Overload Definitions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
SHBoundingBox& SHBoundingBox::operator=(const SHBoundingBox& rhs) noexcept
|
SHBox& SHBox::operator=(const SHBox& rhs) noexcept
|
||||||
{
|
{
|
||||||
if (rhs.type != Type::BOX)
|
if (rhs.type != Type::BOX)
|
||||||
{
|
{
|
||||||
|
@ -81,7 +81,7 @@ namespace SHADE
|
||||||
return *this;
|
return *this;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHBoundingBox& SHBoundingBox::operator=(SHBoundingBox&& rhs) noexcept
|
SHBox& SHBox::operator=(SHBox&& rhs) noexcept
|
||||||
{
|
{
|
||||||
if (rhs.type != Type::BOX)
|
if (rhs.type != Type::BOX)
|
||||||
{
|
{
|
||||||
|
@ -101,27 +101,27 @@ namespace SHADE
|
||||||
/* Getter Function Definitions */
|
/* Getter Function Definitions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
SHVec3 SHBoundingBox::GetCenter() const noexcept
|
SHVec3 SHBox::GetCenter() const noexcept
|
||||||
{
|
{
|
||||||
return Center;
|
return Center;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHVec3 SHBoundingBox::GetWorldExtents() const noexcept
|
SHVec3 SHBox::GetWorldExtents() const noexcept
|
||||||
{
|
{
|
||||||
return Extents;
|
return Extents;
|
||||||
}
|
}
|
||||||
|
|
||||||
const SHVec3& SHBoundingBox::GetRelativeExtents() const noexcept
|
const SHVec3& SHBox::GetRelativeExtents() const noexcept
|
||||||
{
|
{
|
||||||
return RelativeExtents;
|
return RelativeExtents;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHVec3 SHBoundingBox::GetMin() const noexcept
|
SHVec3 SHBox::GetMin() const noexcept
|
||||||
{
|
{
|
||||||
return SHVec3{ Center.x - Extents.x, Center.y - Extents.y, Center.z - Extents.z };
|
return SHVec3{ Center.x - Extents.x, Center.y - Extents.y, Center.z - Extents.z };
|
||||||
}
|
}
|
||||||
|
|
||||||
SHVec3 SHBoundingBox::GetMax() const noexcept
|
SHVec3 SHBox::GetMax() const noexcept
|
||||||
{
|
{
|
||||||
return SHVec3{ Center.x + Extents.x, Center.y + Extents.y, Center.z + Extents.z };
|
return SHVec3{ Center.x + Extents.x, Center.y + Extents.y, Center.z + Extents.z };
|
||||||
}
|
}
|
||||||
|
@ -130,22 +130,22 @@ namespace SHADE
|
||||||
/* Setter Function Definitions */
|
/* Setter Function Definitions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
void SHBoundingBox::SetCenter(const SHVec3& newCenter) noexcept
|
void SHBox::SetCenter(const SHVec3& newCenter) noexcept
|
||||||
{
|
{
|
||||||
Center = newCenter;
|
Center = newCenter;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHBoundingBox::SetWorldExtents(const SHVec3& newWorldExtents) noexcept
|
void SHBox::SetWorldExtents(const SHVec3& newWorldExtents) noexcept
|
||||||
{
|
{
|
||||||
Extents = newWorldExtents;
|
Extents = newWorldExtents;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHBoundingBox::SetRelativeExtents(const SHVec3& newRelativeExtents) noexcept
|
void SHBox::SetRelativeExtents(const SHVec3& newRelativeExtents) noexcept
|
||||||
{
|
{
|
||||||
RelativeExtents = newRelativeExtents;
|
RelativeExtents = newRelativeExtents;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHBoundingBox::SetMin(const SHVec3& min) noexcept
|
void SHBox::SetMin(const SHVec3& min) noexcept
|
||||||
{
|
{
|
||||||
const SHVec3 MAX = GetMax();
|
const SHVec3 MAX = GetMax();
|
||||||
|
|
||||||
|
@ -153,7 +153,7 @@ namespace SHADE
|
||||||
Extents = SHVec3::Abs((MAX - min) * 0.5f);
|
Extents = SHVec3::Abs((MAX - min) * 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHBoundingBox::SetMax(const SHVec3& max) noexcept
|
void SHBox::SetMax(const SHVec3& max) noexcept
|
||||||
{
|
{
|
||||||
const SHVec3 MIN = GetMin();
|
const SHVec3 MIN = GetMin();
|
||||||
|
|
||||||
|
@ -161,13 +161,13 @@ namespace SHADE
|
||||||
Extents = SHVec3::Abs((max - MIN) * 0.5f);
|
Extents = SHVec3::Abs((max - MIN) * 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHBoundingBox::SetMinMax(const SHVec3& min, const SHVec3& max) noexcept
|
void SHBox::SetMinMax(const SHVec3& min, const SHVec3& max) noexcept
|
||||||
{
|
{
|
||||||
Center = SHVec3::Lerp(min, max, 0.5f);
|
Center = SHVec3::Lerp(min, max, 0.5f);
|
||||||
Extents = SHVec3::Abs((max - min) * 0.5f);
|
Extents = SHVec3::Abs((max - min) * 0.5f);
|
||||||
}
|
}
|
||||||
|
|
||||||
std::vector<SHVec3> SHBoundingBox::GetVertices() const noexcept
|
std::vector<SHVec3> SHBox::GetVertices() const noexcept
|
||||||
{
|
{
|
||||||
std::vector<SHVec3> vertices{ 8 };
|
std::vector<SHVec3> vertices{ 8 };
|
||||||
GetCorners(vertices.data());
|
GetCorners(vertices.data());
|
||||||
|
@ -178,27 +178,27 @@ namespace SHADE
|
||||||
/* Public Function Member Definitions */
|
/* Public Function Member Definitions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
bool SHBoundingBox::TestPoint(const SHVec3& point) noexcept
|
bool SHBox::TestPoint(const SHVec3& point) noexcept
|
||||||
{
|
{
|
||||||
return BoundingBox::Contains(point);
|
return BoundingBox::Contains(point);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHBoundingBox::Raycast(const SHRay& ray, float& distance) noexcept
|
bool SHBox::Raycast(const SHRay& ray, float& distance) noexcept
|
||||||
{
|
{
|
||||||
return BoundingBox::Intersects(ray.position, ray.direction, distance);
|
return BoundingBox::Intersects(ray.position, ray.direction, distance);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHBoundingBox::Contains(const SHBoundingBox& rhs) const noexcept
|
bool SHBox::Contains(const SHBox& rhs) const noexcept
|
||||||
{
|
{
|
||||||
return BoundingBox::Contains(rhs);
|
return BoundingBox::Contains(rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
float SHBoundingBox::Volume() const noexcept
|
float SHBox::Volume() const noexcept
|
||||||
{
|
{
|
||||||
return 8.0f * (Extents.x * Extents.y * Extents.z);
|
return 8.0f * (Extents.x * Extents.y * Extents.z);
|
||||||
}
|
}
|
||||||
|
|
||||||
float SHBoundingBox::SurfaceArea() const noexcept
|
float SHBox::SurfaceArea() const noexcept
|
||||||
{
|
{
|
||||||
return 8.0f * ((Extents.x * Extents.y)
|
return 8.0f * ((Extents.x * Extents.y)
|
||||||
+ (Extents.x * Extents.z)
|
+ (Extents.x * Extents.z)
|
||||||
|
@ -209,21 +209,21 @@ namespace SHADE
|
||||||
/* Static Function Member Definitions */
|
/* Static Function Member Definitions */
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
SHBoundingBox SHBoundingBox::Combine(const SHBoundingBox& lhs, const SHBoundingBox& rhs) noexcept
|
SHBox SHBox::Combine(const SHBox& lhs, const SHBox& rhs) noexcept
|
||||||
{
|
{
|
||||||
SHBoundingBox result;
|
SHBox result;
|
||||||
CreateMerged(result, lhs, rhs);
|
CreateMerged(result, lhs, rhs);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
bool SHBoundingBox::Intersect(const SHBoundingBox& lhs, const SHBoundingBox& rhs) noexcept
|
bool SHBox::Intersect(const SHBox& lhs, const SHBox& rhs) noexcept
|
||||||
{
|
{
|
||||||
return lhs.Intersects(rhs);
|
return lhs.Intersects(rhs);
|
||||||
}
|
}
|
||||||
|
|
||||||
SHBoundingBox SHBoundingBox::BuildFromBoxes(const SHBoundingBox* boxes, size_t numBoxes) noexcept
|
SHBox SHBox::BuildFromBoxes(const SHBox* boxes, size_t numBoxes) noexcept
|
||||||
{
|
{
|
||||||
SHBoundingBox result;
|
SHBox result;
|
||||||
|
|
||||||
for (size_t i = 1; i < numBoxes; ++i)
|
for (size_t i = 1; i < numBoxes; ++i)
|
||||||
CreateMerged(result, boxes[i - 1], boxes[i]);
|
CreateMerged(result, boxes[i - 1], boxes[i]);
|
||||||
|
@ -231,9 +231,9 @@ namespace SHADE
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHBoundingBox SHBoundingBox::BuildFromVertices(const SHVec3* vertices, size_t numVertices, size_t stride) noexcept
|
SHBox SHBox::BuildFromVertices(const SHVec3* vertices, size_t numVertices, size_t stride) noexcept
|
||||||
{
|
{
|
||||||
SHBoundingBox result;
|
SHBox result;
|
||||||
CreateFromPoints(result, numVertices, vertices, stride);
|
CreateFromPoints(result, numVertices, vertices, stride);
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue