Merge branch 'main' into SP3-1-DebugLabels
This commit is contained in:
commit
37c765d5cd
|
@ -0,0 +1,4 @@
|
||||||
|
Start in Fullscreen: false
|
||||||
|
Starting Scene ID: 94283040
|
||||||
|
Window Size: {x: 1920, y: 1080}
|
||||||
|
Window Title: SHADE Engine
|
Binary file not shown.
|
@ -1,3 +0,0 @@
|
||||||
Name: Cube.003
|
|
||||||
ID: 71245919
|
|
||||||
Type: 4
|
|
|
@ -1,3 +0,0 @@
|
||||||
Name: Cube.012
|
|
||||||
ID: 80365422
|
|
||||||
Type: 4
|
|
|
@ -0,0 +1,8 @@
|
||||||
|
- VertexShader: 39210065
|
||||||
|
FragmentShader: 46377769
|
||||||
|
SubPass: G-Buffer Write
|
||||||
|
Properties:
|
||||||
|
data.color: {x: 1, y: 1, z: 1, w: 1}
|
||||||
|
data.textureIndex: 58303057
|
||||||
|
data.alpha: 0
|
||||||
|
data.beta: {x: 1, y: 1, z: 1}
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: BagMaterial
|
||||||
|
ID: 123745521
|
||||||
|
Type: 7
|
|
@ -2,7 +2,7 @@
|
||||||
FragmentShader: 46377769
|
FragmentShader: 46377769
|
||||||
SubPass: G-Buffer Write
|
SubPass: G-Buffer Write
|
||||||
Properties:
|
Properties:
|
||||||
data.color: {x: 1, y: 0.200000003, z: 0.100000001, w: 1}
|
data.color: {x: 1, y: 1, z: 1, w: 1}
|
||||||
data.textureIndex: 64651793
|
data.textureIndex: 64651793
|
||||||
data.alpha: 0
|
data.alpha: 0
|
||||||
data.beta: {x: 1, y: 1, z: 1}
|
data.beta: {x: 1, y: 1, z: 1}
|
|
@ -0,0 +1,8 @@
|
||||||
|
- VertexShader: 39210065
|
||||||
|
FragmentShader: 46377769
|
||||||
|
SubPass: G-Buffer Write
|
||||||
|
Properties:
|
||||||
|
data.color: {x: 1, y: 1, z: 1, w: 1}
|
||||||
|
data.textureIndex: 0
|
||||||
|
data.alpha: 0
|
||||||
|
data.beta: {x: 1, y: 1, z: 1}
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: WhiteMat
|
||||||
|
ID: 124370424
|
||||||
|
Type: 7
|
Binary file not shown.
File diff suppressed because one or more lines are too long
Binary file not shown.
|
@ -0,0 +1,10 @@
|
||||||
|
Name: racoon
|
||||||
|
ID: 77816045
|
||||||
|
Type: 4
|
||||||
|
Sub Assets:
|
||||||
|
Name: Bag
|
||||||
|
ID: 144838771
|
||||||
|
Type: 8
|
||||||
|
Name: Raccoon
|
||||||
|
ID: 149697411
|
||||||
|
Type: 8
|
|
@ -0,0 +1,259 @@
|
||||||
|
- EID: 0
|
||||||
|
Name: Default
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Camera Component:
|
||||||
|
Position: {x: 0, y: 0, z: 0}
|
||||||
|
Pitch: 0
|
||||||
|
Yaw: 0
|
||||||
|
Roll: 0
|
||||||
|
Width: 1920
|
||||||
|
Height: 1080
|
||||||
|
Near: 0.00999999978
|
||||||
|
Far: 10000
|
||||||
|
Perspective: true
|
||||||
|
Light Component:
|
||||||
|
Position: {x: 0, y: 0, z: 0}
|
||||||
|
Type: Directional
|
||||||
|
Direction: {x: 1.79999995, y: 0, z: 1}
|
||||||
|
Color: {x: 0.951541841, y: 0.921719015, z: 0.553319454, w: 1}
|
||||||
|
Layer: 4294967295
|
||||||
|
Strength: 0
|
||||||
|
Scripts: ~
|
||||||
|
- EID: 1
|
||||||
|
Name: Default
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: -1.440328, y: -4.41369677, z: -5}
|
||||||
|
Rotate: {x: -0, y: 0, z: -0}
|
||||||
|
Scale: {x: 49.4798889, y: 0.5, z: 17.5}
|
||||||
|
Renderable Component:
|
||||||
|
Mesh: 149697411
|
||||||
|
Material: 126974645
|
||||||
|
RigidBody Component:
|
||||||
|
Type: Static
|
||||||
|
Mass: 1
|
||||||
|
Drag: 0
|
||||||
|
Angular Drag: 0
|
||||||
|
Use Gravity: true
|
||||||
|
Interpolate: true
|
||||||
|
Freeze Position X: false
|
||||||
|
Freeze Position Y: false
|
||||||
|
Freeze Position Z: false
|
||||||
|
Freeze Rotation X: false
|
||||||
|
Freeze Rotation Y: false
|
||||||
|
Freeze Rotation Z: false
|
||||||
|
Collider Component:
|
||||||
|
Colliders:
|
||||||
|
- Is Trigger: false
|
||||||
|
Type: Box
|
||||||
|
Half Extents: {x: 24.7399445, y: 0.25, z: 8.75}
|
||||||
|
Friction: 0.400000006
|
||||||
|
Bounciness: 0
|
||||||
|
Density: 1
|
||||||
|
Position Offset: {x: 0, y: 0, z: 0}
|
||||||
|
Scripts: ~
|
||||||
|
- EID: 2
|
||||||
|
Name: Player
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 3
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: -3.06177855, y: -2, z: -5}
|
||||||
|
Rotate: {x: -0, y: 0, z: -0}
|
||||||
|
Scale: {x: 2, y: 2, z: 2}
|
||||||
|
Renderable Component:
|
||||||
|
Mesh: 149697411
|
||||||
|
Material: 126974645
|
||||||
|
RigidBody Component:
|
||||||
|
Type: Dynamic
|
||||||
|
Mass: 1
|
||||||
|
Drag: 0
|
||||||
|
Angular Drag: 0
|
||||||
|
Use Gravity: true
|
||||||
|
Interpolate: true
|
||||||
|
Freeze Position X: false
|
||||||
|
Freeze Position Y: false
|
||||||
|
Freeze Position Z: false
|
||||||
|
Freeze Rotation X: false
|
||||||
|
Freeze Rotation Y: false
|
||||||
|
Freeze Rotation Z: false
|
||||||
|
Collider Component:
|
||||||
|
Colliders:
|
||||||
|
- Is Trigger: false
|
||||||
|
Type: Box
|
||||||
|
Half Extents: {x: 1, y: 1, z: 1}
|
||||||
|
Friction: 0.400000006
|
||||||
|
Bounciness: 0
|
||||||
|
Density: 1
|
||||||
|
Position Offset: {x: 0, y: 0.5, z: 0}
|
||||||
|
Scripts:
|
||||||
|
- Type: PlayerController
|
||||||
|
drag: 2
|
||||||
|
currentState: 0
|
||||||
|
maxMoveVel: 2
|
||||||
|
moveForce: 50
|
||||||
|
sprintMultiplier: 2
|
||||||
|
rotationFactorPerFrame: 1
|
||||||
|
maxJumpHeight: 4
|
||||||
|
maxJumpTime: 0.75
|
||||||
|
fallMultipler: 2
|
||||||
|
lightMultiper: 0.75
|
||||||
|
mediumMultiper: 0.5
|
||||||
|
heavyMultiper: 0.25
|
||||||
|
- Type: PickAndThrow
|
||||||
|
throwForce: [200, 300, 200]
|
||||||
|
item: 5
|
||||||
|
- EID: 3
|
||||||
|
Name: Default
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: -0.0094268322, y: 0, z: 0}
|
||||||
|
Rotate: {x: -0, y: 0, z: -0}
|
||||||
|
Scale: {x: 1, y: 1, z: 1}
|
||||||
|
Scripts: ~
|
||||||
|
- EID: 4
|
||||||
|
Name: Default
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: 0, y: 0, z: 0}
|
||||||
|
Rotate: {x: 0, y: 0, z: 0}
|
||||||
|
Scale: {x: 1, y: 1, z: 1}
|
||||||
|
Scripts:
|
||||||
|
- Type: SHADE_Scripting.ThirdPersonCamera
|
||||||
|
armLength: 2
|
||||||
|
turnSpeedPitch: 0.300000012
|
||||||
|
turnSpeedYaw: 0.5
|
||||||
|
pitchClamp: 45
|
||||||
|
- EID: 9
|
||||||
|
Name: Default
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: 0, y: 0, z: 0}
|
||||||
|
Rotate: {x: 0, y: 0, z: 0}
|
||||||
|
Scale: {x: 1, y: 1, z: 1}
|
||||||
|
Renderable Component:
|
||||||
|
Mesh: 144838771
|
||||||
|
Material: 123745521
|
||||||
|
Scripts: ~
|
||||||
|
- EID: 5
|
||||||
|
Name: item
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: 0, y: -2, z: -5}
|
||||||
|
Rotate: {x: 0, y: 0, z: 0}
|
||||||
|
Scale: {x: 2, y: 2, z: 2}
|
||||||
|
Renderable Component:
|
||||||
|
Mesh: 144838771
|
||||||
|
Material: 123745521
|
||||||
|
RigidBody Component:
|
||||||
|
Type: Dynamic
|
||||||
|
Mass: 1
|
||||||
|
Drag: 0
|
||||||
|
Angular Drag: 0
|
||||||
|
Use Gravity: true
|
||||||
|
Interpolate: false
|
||||||
|
Freeze Position X: false
|
||||||
|
Freeze Position Y: false
|
||||||
|
Freeze Position Z: false
|
||||||
|
Freeze Rotation X: true
|
||||||
|
Freeze Rotation Y: true
|
||||||
|
Freeze Rotation Z: true
|
||||||
|
Collider Component:
|
||||||
|
Colliders:
|
||||||
|
- Is Trigger: false
|
||||||
|
Type: Box
|
||||||
|
Half Extents: {x: 1, y: 1, z: 1}
|
||||||
|
Friction: 0.400000006
|
||||||
|
Bounciness: 0
|
||||||
|
Density: 1
|
||||||
|
Position Offset: {x: 0, y: 0.5, z: 0}
|
||||||
|
- Is Trigger: true
|
||||||
|
Type: Box
|
||||||
|
Half Extents: {x: 2, y: 2, z: 2}
|
||||||
|
Friction: 0.400000006
|
||||||
|
Bounciness: 0
|
||||||
|
Density: 1
|
||||||
|
Position Offset: {x: 0, y: 0.5, z: 0}
|
||||||
|
Scripts:
|
||||||
|
- Type: Item
|
||||||
|
currCategory: 0
|
||||||
|
- EID: 6
|
||||||
|
Name: AI
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: -8, y: -2, z: 2.5}
|
||||||
|
Rotate: {x: 0, y: 0, z: 0}
|
||||||
|
Scale: {x: 1, y: 1, z: 1}
|
||||||
|
Renderable Component:
|
||||||
|
Mesh: 149697411
|
||||||
|
Material: 126974645
|
||||||
|
RigidBody Component:
|
||||||
|
Type: Dynamic
|
||||||
|
Mass: 1
|
||||||
|
Drag: 0
|
||||||
|
Angular Drag: 0
|
||||||
|
Use Gravity: true
|
||||||
|
Interpolate: false
|
||||||
|
Freeze Position X: false
|
||||||
|
Freeze Position Y: false
|
||||||
|
Freeze Position Z: false
|
||||||
|
Freeze Rotation X: true
|
||||||
|
Freeze Rotation Y: true
|
||||||
|
Freeze Rotation Z: true
|
||||||
|
Collider Component:
|
||||||
|
Colliders:
|
||||||
|
- Is Trigger: false
|
||||||
|
Type: Box
|
||||||
|
Half Extents: {x: 0.5, y: 0.5, z: 0.5}
|
||||||
|
Friction: 0.400000006
|
||||||
|
Bounciness: 0
|
||||||
|
Density: 1
|
||||||
|
Position Offset: {x: 0, y: 0.5, z: 0}
|
||||||
|
Scripts:
|
||||||
|
- Type: AIPrototype
|
||||||
|
movementForceMultiplier: 100
|
||||||
|
patrolSpeed: 0.400000006
|
||||||
|
chaseSpeed: 0.800000012
|
||||||
|
distanceToCapture: 1.20000005
|
||||||
|
distanceToStartChase: 2
|
||||||
|
distanceToEndChase: 2.5
|
||||||
|
- EID: 7
|
||||||
|
Name: Default
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: 0, y: -16.8647861, z: -14.039052}
|
||||||
|
Rotate: {x: -0, y: 0, z: -0}
|
||||||
|
Scale: {x: 28.1434975, y: 28.1434975, z: 28.1434975}
|
||||||
|
Renderable Component:
|
||||||
|
Mesh: 149697411
|
||||||
|
Material: 126974645
|
||||||
|
Scripts: ~
|
||||||
|
- EID: 8
|
||||||
|
Name: Default
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Light Component:
|
||||||
|
Position: {x: 0, y: 0, z: 0}
|
||||||
|
Type: Ambient
|
||||||
|
Direction: {x: 0, y: 0, z: 1}
|
||||||
|
Color: {x: 1, y: 1, z: 1, w: 1}
|
||||||
|
Layer: 4294967295
|
||||||
|
Strength: 0.25
|
||||||
|
Scripts: ~
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: M2Scene
|
||||||
|
ID: 94283040
|
||||||
|
Type: 5
|
|
@ -0,0 +1,72 @@
|
||||||
|
- EID: 0
|
||||||
|
Name: Default
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: 0, y: 0.304069757, z: 1.73034382}
|
||||||
|
Rotate: {x: 0, y: 0, z: 0}
|
||||||
|
Scale: {x: 1, y: 1, z: 1}
|
||||||
|
Camera Component:
|
||||||
|
Position: {x: 0, y: 0.304069757, z: 1.73034382}
|
||||||
|
Pitch: 0
|
||||||
|
Yaw: 0
|
||||||
|
Roll: 0
|
||||||
|
Width: 1200
|
||||||
|
Height: 1080
|
||||||
|
Near: 0.00999999978
|
||||||
|
Far: 10000
|
||||||
|
Perspective: true
|
||||||
|
Scripts: ~
|
||||||
|
- EID: 1
|
||||||
|
Name: Raccoon
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 1
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: 0, y: 0, z: 0}
|
||||||
|
Rotate: {x: 0, y: 0, z: 0}
|
||||||
|
Scale: {x: 1, y: 1, z: 1}
|
||||||
|
Renderable Component:
|
||||||
|
Mesh: 149697411
|
||||||
|
Material: 126974645
|
||||||
|
Scripts: ~
|
||||||
|
- EID: 3
|
||||||
|
Name: Bag
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Transform Component:
|
||||||
|
Translate: {x: 0.006237939, y: -0.000393368304, z: 0}
|
||||||
|
Rotate: {x: -0, y: 2.79945588, z: 0}
|
||||||
|
Scale: {x: 1.0000881, y: 1, z: 1.0000881}
|
||||||
|
Renderable Component:
|
||||||
|
Mesh: 144838771
|
||||||
|
Material: 123745521
|
||||||
|
Scripts: ~
|
||||||
|
- EID: 2
|
||||||
|
Name: DirectionalLight
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Light Component:
|
||||||
|
Position: {x: 0, y: 0, z: 0}
|
||||||
|
Type: Directional
|
||||||
|
Direction: {x: 0, y: 0, z: 1}
|
||||||
|
Color: {x: 1, y: 1, z: 1, w: 1}
|
||||||
|
Layer: 4294967295
|
||||||
|
Strength: 0
|
||||||
|
Scripts: ~
|
||||||
|
- EID: 4
|
||||||
|
Name: AmbientLight
|
||||||
|
IsActive: true
|
||||||
|
NumberOfChildren: 0
|
||||||
|
Components:
|
||||||
|
Light Component:
|
||||||
|
Position: {x: 0, y: 0, z: 0}
|
||||||
|
Type: Ambient
|
||||||
|
Direction: {x: 0, y: 0, z: 1}
|
||||||
|
Color: {x: 1, y: 1, z: 1, w: 1}
|
||||||
|
Layer: 4294967295
|
||||||
|
Strength: 0.600000024
|
||||||
|
Scripts: ~
|
|
@ -0,0 +1,3 @@
|
||||||
|
Name: Scene2
|
||||||
|
ID: 87285316
|
||||||
|
Type: 5
|
|
@ -7,7 +7,7 @@ echo "SHADE DEPENDENCIES (Default - All in 10 Seconds)"
|
||||||
echo "A - All"
|
echo "A - All"
|
||||||
echo "B - VMA"
|
echo "B - VMA"
|
||||||
echo "C - msdf"
|
echo "C - msdf"
|
||||||
echo "D - assimp"
|
echo "D - ModelCompiler"
|
||||||
echo "E - spdlog"
|
echo "E - spdlog"
|
||||||
echo "F - reactphysics3d"
|
echo "F - reactphysics3d"
|
||||||
echo "G - imgui"
|
echo "G - imgui"
|
||||||
|
@ -29,7 +29,7 @@ set _e=%ERRORLEVEL%
|
||||||
if %_e%==1 goto VMA
|
if %_e%==1 goto VMA
|
||||||
if %_e%==2 goto VMA
|
if %_e%==2 goto VMA
|
||||||
if %_e%==3 goto MSDF
|
if %_e%==3 goto MSDF
|
||||||
if %_e%==4 goto assimp
|
if %_e%==4 goto ModelCompiler
|
||||||
if %_e%==5 goto spdlog
|
if %_e%==5 goto spdlog
|
||||||
if %_e%==6 goto reactphysics3d
|
if %_e%==6 goto reactphysics3d
|
||||||
if %_e%==7 goto imgui
|
if %_e%==7 goto imgui
|
||||||
|
@ -53,12 +53,13 @@ if %_e%==2 (goto :done) else (goto :MSDF)
|
||||||
echo -----------------------MSDF----------------------------
|
echo -----------------------MSDF----------------------------
|
||||||
rmdir "Dependencies/msdf" /S /Q
|
rmdir "Dependencies/msdf" /S /Q
|
||||||
git clone --recurse-submodules https://github.com/SHADE-DP/msdf-atlas-gen.git "Dependencies/msdf"
|
git clone --recurse-submodules https://github.com/SHADE-DP/msdf-atlas-gen.git "Dependencies/msdf"
|
||||||
if %_e%==3 (goto :done) else (goto :assimp)
|
if %_e%==3 (goto :done) else (goto :ModelCompiler)
|
||||||
|
|
||||||
:assimp
|
:ModelCompiler
|
||||||
echo -----------------------assimp----------------------------
|
echo -----------------------ModelCompiler----------------------------
|
||||||
rmdir "Dependencies/assimp" /S /Q
|
rmdir "Dependencies/ModelCompiler" /S /Q
|
||||||
git clone https://github.com/SHADE-DP/assimp.git "Dependencies/assimp"
|
git clone https://github.com/SHADE-DP/ModelCompiler.git "Dependencies/ModelCompiler"
|
||||||
|
git clone https://github.com/SHADE-DP/assimp.git "Dependencies/ModelCompiler/Dependencies/assimp"
|
||||||
if %_e%==4 (goto :done) else (goto :spdlog)
|
if %_e%==4 (goto :done) else (goto :spdlog)
|
||||||
|
|
||||||
@REM :ktx
|
@REM :ktx
|
||||||
|
|
|
@ -1,5 +1,5 @@
|
||||||
IncludeDir = {}
|
IncludeDir = {}
|
||||||
IncludeDir["assimp"] = "%{wks.location}\\Dependencies\\assimp"
|
IncludeDir["ModelCompiler"] = "%{wks.location}\\Dependencies\\ModelCompiler"
|
||||||
IncludeDir["imgui"] = "%{wks.location}\\Dependencies\\imgui"
|
IncludeDir["imgui"] = "%{wks.location}\\Dependencies\\imgui"
|
||||||
IncludeDir["imguizmo"] = "%{wks.location}\\Dependencies\\imguizmo"
|
IncludeDir["imguizmo"] = "%{wks.location}\\Dependencies\\imguizmo"
|
||||||
IncludeDir["imnodes"] = "%{wks.location}\\Dependencies\\imnodes"
|
IncludeDir["imnodes"] = "%{wks.location}\\Dependencies\\imnodes"
|
||||||
|
|
|
@ -41,6 +41,8 @@
|
||||||
|
|
||||||
|
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
|
#include "Scenes/SBMainScene.h"
|
||||||
|
#include "Serialization/Configurations/SHConfigurationManager.h"
|
||||||
|
|
||||||
#include "Tools/SHLogger.h"
|
#include "Tools/SHLogger.h"
|
||||||
#include "Tools/SHDebugDraw.h"
|
#include "Tools/SHDebugDraw.h"
|
||||||
|
@ -60,8 +62,9 @@ namespace Sandbox
|
||||||
{
|
{
|
||||||
// Set working directory
|
// Set working directory
|
||||||
SHFileUtilities::SetWorkDirToExecDir();
|
SHFileUtilities::SetWorkDirToExecDir();
|
||||||
|
WindowData wndData{};
|
||||||
window.Create(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
|
auto& appConfig = SHConfigurationManager::LoadApplicationConfig(&wndData);
|
||||||
|
window.Create(hInstance, hPrevInstance, lpCmdLine, nCmdShow, wndData);
|
||||||
|
|
||||||
// Create Systems
|
// Create Systems
|
||||||
SHSystemManager::CreateSystem<SHGraphicsSystem>();
|
SHSystemManager::CreateSystem<SHGraphicsSystem>();
|
||||||
|
@ -80,7 +83,11 @@ namespace Sandbox
|
||||||
SDL_Init(SDL_INIT_VIDEO);
|
SDL_Init(SDL_INIT_VIDEO);
|
||||||
sdlWindow = SDL_CreateWindowFrom(window.GetHWND());
|
sdlWindow = SDL_CreateWindowFrom(window.GetHWND());
|
||||||
SHSystemManager::CreateSystem<SHEditor>();
|
SHSystemManager::CreateSystem<SHEditor>();
|
||||||
SHSystemManager::GetSystem<SHEditor>()->SetSDLWindow(sdlWindow);
|
if(auto editor = SHSystemManager::GetSystem<SHEditor>())
|
||||||
|
{
|
||||||
|
editor->SetSDLWindow(sdlWindow);
|
||||||
|
editor->SetSHWindow(&window);
|
||||||
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Create Routines
|
// Create Routines
|
||||||
|
@ -128,7 +135,7 @@ namespace Sandbox
|
||||||
|
|
||||||
SHSystemManager::Init();
|
SHSystemManager::Init();
|
||||||
|
|
||||||
SHSceneManager::InitSceneManager<SBTestScene>("TestScene");
|
SHSceneManager::InitSceneManager<SBMainScene>(appConfig.startingSceneID);
|
||||||
|
|
||||||
SHFrameRateController::UpdateFRC();
|
SHFrameRateController::UpdateFRC();
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,62 @@
|
||||||
|
#include "SBpch.h"
|
||||||
|
#include "SBMainScene.h"
|
||||||
|
|
||||||
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
|
#include "Graphics/MiddleEnd/Meshes/SHPrimitiveGenerator.h"
|
||||||
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
||||||
|
#include "Scene/SHSceneManager.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHGraphicsSystem.h"
|
||||||
|
#include "Scripting/SHScriptEngine.h"
|
||||||
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
||||||
|
#include "Physics/Components/SHRigidBodyComponent.h"
|
||||||
|
#include "Physics/Components/SHColliderComponent.h"
|
||||||
|
#include "Graphics/MiddleEnd/Lights/SHLightComponent.h"
|
||||||
|
|
||||||
|
#include "Assets/SHAssetManager.h"
|
||||||
|
#include "Camera/SHCameraComponent.h"
|
||||||
|
#include "Resource/SHResourceManager.h"
|
||||||
|
#include "Serialization/SHSerialization.h"
|
||||||
|
|
||||||
|
using namespace SHADE;
|
||||||
|
|
||||||
|
namespace Sandbox
|
||||||
|
{
|
||||||
|
|
||||||
|
void SBMainScene::WindowFocusFunc([[maybe_unused]] void* window, int focused)
|
||||||
|
{
|
||||||
|
if (focused)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SBMainScene::Load()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SBMainScene::Init()
|
||||||
|
{
|
||||||
|
sceneName = SHSerialization::DeserializeSceneFromFile(sceneAssetID);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SBMainScene::Update(float dt)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SBMainScene::Render()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SBMainScene::Unload()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SBMainScene::Free()
|
||||||
|
{
|
||||||
|
//SHSerialization::SerializeScene("resources/scenes/Scene01.SHADE");
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,30 @@
|
||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include "Scene/SHScene.h"
|
||||||
|
#include "Scene/SHSceneManager.h"
|
||||||
|
|
||||||
|
namespace Sandbox
|
||||||
|
{
|
||||||
|
class SBMainScene : public SHADE::SHScene
|
||||||
|
{
|
||||||
|
private:
|
||||||
|
EntityID camera;
|
||||||
|
EntityID testObj;
|
||||||
|
std::vector<EntityID> stressTestObjects;
|
||||||
|
|
||||||
|
public:
|
||||||
|
virtual void Load();
|
||||||
|
virtual void Init();
|
||||||
|
virtual void Update(float dt);
|
||||||
|
virtual void Render();
|
||||||
|
virtual void Free();
|
||||||
|
virtual void Unload();
|
||||||
|
|
||||||
|
//TODO: Change to new window DO IT IN CPP TOO
|
||||||
|
void WindowFocusFunc(void* window, int focused);
|
||||||
|
|
||||||
|
SBMainScene(void) = default;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
|
@ -53,7 +53,7 @@ namespace Sandbox
|
||||||
switch (asset.type)
|
switch (asset.type)
|
||||||
{
|
{
|
||||||
case AssetType::MESH:
|
case AssetType::MESH:
|
||||||
if (asset.name == "Cube.012")
|
if (asset.name == "Raccoon")
|
||||||
handles.emplace_back(SHResourceManager::LoadOrGet<SHMesh>(asset.id));
|
handles.emplace_back(SHResourceManager::LoadOrGet<SHMesh>(asset.id));
|
||||||
break;
|
break;
|
||||||
case AssetType::TEXTURE:
|
case AssetType::TEXTURE:
|
||||||
|
@ -182,6 +182,7 @@ namespace Sandbox
|
||||||
scriptEngine->AddScript(racoon, "PickAndThrow");
|
scriptEngine->AddScript(racoon, "PickAndThrow");
|
||||||
scriptEngine->AddScript(racoonCamera, "ThirdPersonCamera");
|
scriptEngine->AddScript(racoonCamera, "ThirdPersonCamera");
|
||||||
scriptEngine->AddScript(AI, "AIPrototype");
|
scriptEngine->AddScript(AI, "AIPrototype");
|
||||||
|
scriptEngine->AddScript(item, "Item");
|
||||||
|
|
||||||
auto raccoonShowcase = SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
auto raccoonShowcase = SHEntityManager::CreateEntity<SHRenderable, SHTransformComponent>();
|
||||||
auto& renderableShowcase = *SHComponentManager::GetComponent_s<SHRenderable>(raccoonShowcase);
|
auto& renderableShowcase = *SHComponentManager::GetComponent_s<SHRenderable>(raccoonShowcase);
|
||||||
|
|
|
@ -26,7 +26,6 @@ project "SHADE_Engine"
|
||||||
|
|
||||||
externalincludedirs
|
externalincludedirs
|
||||||
{
|
{
|
||||||
"%{IncludeDir.assimp}\\include",
|
|
||||||
"%{IncludeDir.imgui}",
|
"%{IncludeDir.imgui}",
|
||||||
"%{IncludeDir.imguizmo}",
|
"%{IncludeDir.imguizmo}",
|
||||||
"%{IncludeDir.imnodes}",
|
"%{IncludeDir.imnodes}",
|
||||||
|
@ -52,8 +51,6 @@ project "SHADE_Engine"
|
||||||
{
|
{
|
||||||
"%{prj.location}/libs",
|
"%{prj.location}/libs",
|
||||||
"%{IncludeDir.VULKAN}/Lib",
|
"%{IncludeDir.VULKAN}/Lib",
|
||||||
"%{IncludeDir.assimp}/lib/Debug",
|
|
||||||
"%{IncludeDir.assimp}/lib/Release",
|
|
||||||
"%{IncludeDir.RTTR}/lib",
|
"%{IncludeDir.RTTR}/lib",
|
||||||
"%{IncludeDir.SDL}/lib",
|
"%{IncludeDir.SDL}/lib",
|
||||||
"%{IncludeDir.spdlog}/lib",
|
"%{IncludeDir.spdlog}/lib",
|
||||||
|
@ -119,7 +116,8 @@ project "SHADE_Engine"
|
||||||
filter "configurations:Debug"
|
filter "configurations:Debug"
|
||||||
postbuildcommands
|
postbuildcommands
|
||||||
{
|
{
|
||||||
"xcopy /r /y /q \"%{IncludeDir.assimp}\\bin\\Debug\\assimp-vc142-mtd.dll\" \"$(OutDir)\"",
|
"xcopy /r /y /q \"%{IncludeDir.ModelCompiler}\\bin\\Debug\\assimp-vc142-mtd.dll\" \"$(OutDir)\"",
|
||||||
|
"xcopy /r /y /q \"%{IncludeDir.ModelCompiler}\\bin\\Debug\\ModelCompiler.exe\" \"$(OutDir)\"",
|
||||||
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmodL.dll\" \"$(OutDir)\"",
|
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmodL.dll\" \"$(OutDir)\"",
|
||||||
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmodstudioL.dll\" \"$(OutDir)\""
|
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmodstudioL.dll\" \"$(OutDir)\""
|
||||||
}
|
}
|
||||||
|
@ -127,7 +125,8 @@ project "SHADE_Engine"
|
||||||
filter "configurations:Release"
|
filter "configurations:Release"
|
||||||
postbuildcommands
|
postbuildcommands
|
||||||
{
|
{
|
||||||
"xcopy /r /y /q \"%{IncludeDir.assimp}\\bin\\Release\\assimp-vc142-mt.dll\" \"$(OutDir)\"",
|
"xcopy /r /y /q \"%{IncludeDir.ModelCompiler}\\bin\\Release\\assimp-vc142-mt.dll\" \"$(OutDir)\"",
|
||||||
|
"xcopy /r /y /q \"%{IncludeDir.ModelCompiler}\\bin\\Release\\ModelCompiler.exe\" \"$(OutDir)\"",
|
||||||
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmod.dll\" \"$(OutDir)\"",
|
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmod.dll\" \"$(OutDir)\"",
|
||||||
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmodstudio.dll\" \"$(OutDir)\""
|
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmodstudio.dll\" \"$(OutDir)\""
|
||||||
}
|
}
|
||||||
|
@ -135,32 +134,35 @@ project "SHADE_Engine"
|
||||||
filter "configurations:Publish"
|
filter "configurations:Publish"
|
||||||
postbuildcommands
|
postbuildcommands
|
||||||
{
|
{
|
||||||
"xcopy /r /y /q \"%{IncludeDir.assimp}\\bin\\Release\\assimp-vc142-mt.dll\" \"$(OutDir)\"",
|
--"xcopy /r /y /q \"%{IncludeDir.assimp}\\bin\\Release\\assimp-vc142-mt.dll\" \"$(OutDir)\"",
|
||||||
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmod.dll\" \"$(OutDir)\"",
|
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmod.dll\" \"$(OutDir)\"",
|
||||||
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmodstudio.dll\" \"$(OutDir)\""
|
"xcopy /r /y /q \"%{IncludeDir.fmod}\\lib\\fmodstudio.dll\" \"$(OutDir)\""
|
||||||
}
|
}
|
||||||
|
|
||||||
filter "configurations:Publish"
|
filter "configurations:Publish"
|
||||||
postbuildcommands {"xcopy /r /y /q \"%{IncludeDir.assimp}\\bin\\Release\\assimp-vc142-mt.dll\" \"$(OutDir)\""}
|
postbuildcommands
|
||||||
|
{
|
||||||
|
--"xcopy /r /y /q \"%{IncludeDir.assimp}\\bin\\Release\\assimp-vc142-mt.dll\" \"$(OutDir)\""
|
||||||
|
}
|
||||||
|
|
||||||
warnings 'Extra'
|
warnings 'Extra'
|
||||||
|
|
||||||
filter "configurations:Debug"
|
filter "configurations:Debug"
|
||||||
symbols "On"
|
symbols "On"
|
||||||
defines {"_DEBUG", "SHEDITOR"}
|
defines {"_DEBUG", "SHEDITOR"}
|
||||||
links{"assimp-vc142-mtd.lib", "librttr_core_d.lib", "spdlogd.lib"}
|
links{"librttr_core_d.lib", "spdlogd.lib"}
|
||||||
links{"fmodstudioL_vc.lib", "fmodL_vc.lib"}
|
links{"fmodstudioL_vc.lib", "fmodL_vc.lib"}
|
||||||
|
|
||||||
filter "configurations:Release"
|
filter "configurations:Release"
|
||||||
optimize "On"
|
optimize "On"
|
||||||
defines{"_RELEASE", "SHEDITOR"}
|
defines{"_RELEASE", "SHEDITOR"}
|
||||||
links{"assimp-vc142-mt.lib", "librttr_core.lib", "spdlog.lib"}
|
links{"librttr_core.lib", "spdlog.lib"}
|
||||||
links{"fmodstudio_vc.lib", "fmod_vc.lib"}
|
links{"fmodstudio_vc.lib", "fmod_vc.lib"}
|
||||||
|
|
||||||
filter "configurations:Publish"
|
filter "configurations:Publish"
|
||||||
optimize "On"
|
optimize "On"
|
||||||
defines{"_RELEASE", "_PUBLISH"}
|
defines{"_RELEASE", "_PUBLISH"}
|
||||||
links{"assimp-vc142-mt.lib", "librttr_core.lib", "spdlog.lib"}
|
links{"librttr_core.lib", "spdlog.lib"}
|
||||||
excludes
|
excludes
|
||||||
{
|
{
|
||||||
-- "%{prj.location}/src/Editor/**.cpp",
|
-- "%{prj.location}/src/Editor/**.cpp",
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include "SHMeshAsset.h"
|
#include "SHModelAsset.h"
|
||||||
#include "SHTextureAsset.h"
|
#include "SHTextureAsset.h"
|
|
@ -18,24 +18,31 @@
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
struct SH_API SHMeshAssetHeader
|
struct SHMeshAssetHeader
|
||||||
{
|
{
|
||||||
uint32_t vertexCount;
|
uint32_t vertexCount;
|
||||||
uint32_t indexCount;
|
uint32_t indexCount;
|
||||||
std::string name;
|
std::string name;
|
||||||
};
|
};
|
||||||
|
|
||||||
struct SH_API SHMeshAsset : SHAssetData
|
struct SHModelAssetHeader
|
||||||
{
|
{
|
||||||
bool compiled;
|
size_t meshCount;
|
||||||
bool changed;
|
};
|
||||||
|
|
||||||
SHMeshAssetHeader header;
|
struct SH_API SHMeshData : SHAssetData
|
||||||
|
{
|
||||||
|
SHMeshAssetHeader header;
|
||||||
|
std::vector<SHVec3> VertexPositions;
|
||||||
|
std::vector<SHVec3> VertexTangents;
|
||||||
|
std::vector<SHVec3> VertexNormals;
|
||||||
|
std::vector<SHVec2> VertexTexCoords;
|
||||||
|
std::vector<uint32_t> Indices;
|
||||||
|
};
|
||||||
|
|
||||||
std::vector<SHVec3> vertexPosition;
|
struct SH_API SHModelAsset : SHAssetData
|
||||||
std::vector<SHVec3> vertexTangent;
|
{
|
||||||
std::vector<SHVec3> vertexNormal;
|
SHModelAssetHeader header;
|
||||||
std::vector<SHVec2> texCoords;
|
std::vector<SHMeshData*> subMeshes;
|
||||||
std::vector<uint32_t> indices;
|
};
|
||||||
};
|
|
||||||
}
|
}
|
|
@ -1,201 +0,0 @@
|
||||||
/*************************************************************************//**
|
|
||||||
* \file SHMeshCompiler.cpp
|
|
||||||
* \author Loh Xiao Qi
|
|
||||||
* \date 30 September 2022
|
|
||||||
* \brief Library to write data in SHMeshAsset into binary file for faster
|
|
||||||
* loading in the future
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
|
||||||
* disclosure of this file or its contents without the prior written consent
|
|
||||||
* of DigiPen Institute of Technology is prohibited.
|
|
||||||
*****************************************************************************/
|
|
||||||
#include "SHpch.h"
|
|
||||||
#include "SHMeshCompiler.h"
|
|
||||||
#include "Graphics/MiddleEnd/Meshes/SHMeshData.h"
|
|
||||||
#include <assimp/postprocess.h>
|
|
||||||
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
|
|
||||||
Assimp::Importer SHMeshCompiler::aiImporter;
|
|
||||||
|
|
||||||
void SHMeshCompiler::ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes) noexcept
|
|
||||||
{
|
|
||||||
for (size_t i{ 0 }; i < node.mNumMeshes; ++i)
|
|
||||||
{
|
|
||||||
aiMesh* mesh = scene.mMeshes[node.mMeshes[i]];
|
|
||||||
meshes.push_back(ProcessMesh(*mesh));
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i{ 0 }; i < node.mNumChildren; ++i)
|
|
||||||
{
|
|
||||||
ProcessNode(*node.mChildren[i], scene, meshes);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHMeshCompiler::ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept
|
|
||||||
{
|
|
||||||
if (scene.HasAnimations())
|
|
||||||
{
|
|
||||||
std::vector<SHAnimationAsset> anims(scene.mNumAnimations);
|
|
||||||
for (auto i{ 0 }; i < scene.mNumAnimations; ++i)
|
|
||||||
{
|
|
||||||
auto const& anim{ *scene.mAnimations[i] };
|
|
||||||
|
|
||||||
anims[i].name = anim.mName.C_Str();
|
|
||||||
|
|
||||||
anims[i].duration = anim.mDuration;
|
|
||||||
anims[i].ticksPerSecond = anim.mTicksPerSecond;
|
|
||||||
|
|
||||||
std::copy_n(anim.mChannels, anim.mNumChannels, anims[i].nodeChannels.data());
|
|
||||||
std::copy_n(anim.mMeshChannels, anim.mNumMeshChannels, anims[i].meshChannels.data());
|
|
||||||
std::copy_n(anim.mMorphMeshChannels, anim.mNumMorphMeshChannels, anims[i].morphMeshChannels.data());
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SHMeshAsset* SHMeshCompiler::ProcessMesh(aiMesh const& mesh) noexcept
|
|
||||||
{
|
|
||||||
SHMeshAsset* result = new SHMeshAsset();
|
|
||||||
result->compiled = false;
|
|
||||||
result->changed = false;
|
|
||||||
|
|
||||||
for (size_t i{ 0 }; i < mesh.mNumVertices; ++i)
|
|
||||||
{
|
|
||||||
// Vertex position
|
|
||||||
SHVec3 vertex;
|
|
||||||
vertex.x = mesh.mVertices[i].x;
|
|
||||||
vertex.y = mesh.mVertices[i].y;
|
|
||||||
vertex.z = mesh.mVertices[i].z;
|
|
||||||
result->vertexPosition.push_back(vertex);
|
|
||||||
|
|
||||||
// Tex coords
|
|
||||||
SHVec2 texCoord{ 0.f, 0.f };
|
|
||||||
if (mesh.mTextureCoords[0])
|
|
||||||
{
|
|
||||||
texCoord.x = mesh.mTextureCoords[0][i].x;
|
|
||||||
texCoord.y = mesh.mTextureCoords[0][i].y;
|
|
||||||
}
|
|
||||||
result->texCoords.push_back(texCoord);
|
|
||||||
|
|
||||||
// Normals
|
|
||||||
SHVec3 normal{ 0.f, 0.f, 0.f };
|
|
||||||
if (mesh.mNormals)
|
|
||||||
{
|
|
||||||
normal.x = mesh.mNormals[i].x;
|
|
||||||
normal.y = mesh.mNormals[i].y;
|
|
||||||
normal.z = mesh.mNormals[i].z;
|
|
||||||
}
|
|
||||||
result->vertexNormal.push_back(normal);
|
|
||||||
|
|
||||||
// Tangent
|
|
||||||
SHVec3 tangent{ 0.f, 0.f, 0.f };
|
|
||||||
if (mesh.mTangents)
|
|
||||||
{
|
|
||||||
tangent.x = mesh.mTangents[i].x;
|
|
||||||
tangent.y = mesh.mTangents[i].y;
|
|
||||||
tangent.z = mesh.mTangents[i].z;
|
|
||||||
}
|
|
||||||
result->vertexTangent.push_back(tangent);
|
|
||||||
}
|
|
||||||
|
|
||||||
for (size_t i{ 0 }; i < mesh.mNumFaces; ++i)
|
|
||||||
{
|
|
||||||
aiFace face = mesh.mFaces[i];
|
|
||||||
for (size_t j{ 0 }; j < face.mNumIndices; ++j)
|
|
||||||
{
|
|
||||||
result->indices.push_back(face.mIndices[j]);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
result->header.vertexCount = static_cast<uint32_t>(result->vertexPosition.size());
|
|
||||||
result->header.indexCount = static_cast<uint32_t>(result->indices.size());
|
|
||||||
result->header.name = mesh.mName.C_Str();
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHMeshCompiler::LoadFromFile(AssetPath path, MeshVectorRef meshes, AnimVectorRef anims) noexcept
|
|
||||||
{
|
|
||||||
const aiScene* scene = aiImporter.ReadFile(path.string().c_str(),
|
|
||||||
aiProcess_Triangulate // Make sure we get triangles rather than nvert polygons
|
|
||||||
| aiProcess_GenUVCoords // Convert any type of mapping to uv mapping
|
|
||||||
| aiProcess_TransformUVCoords // preprocess UV transformations (scaling, translation ...)
|
|
||||||
| aiProcess_FindInstances // search for instanced meshes and remove them by references to one master
|
|
||||||
| aiProcess_CalcTangentSpace // calculate tangents and bitangents if possible
|
|
||||||
| aiProcess_JoinIdenticalVertices // join identical vertices/ optimize indexing
|
|
||||||
| aiProcess_RemoveRedundantMaterials // remove redundant materials
|
|
||||||
| aiProcess_FindInvalidData // detect invalid model data, such as invalid normal vectors
|
|
||||||
| aiProcess_FlipUVs // flip the V to match the Vulkans way of doing UVs
|
|
||||||
);
|
|
||||||
|
|
||||||
if (!scene || !scene->HasMeshes())
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("ERROR in GLTF::ASSIMP: {}\nFile: {}", aiImporter.GetErrorString(), path.string());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
//ExtractAnimations(*scene, anims);
|
|
||||||
|
|
||||||
ProcessNode(*scene->mRootNode, *scene, meshes);
|
|
||||||
|
|
||||||
aiImporter.FreeScene();
|
|
||||||
}
|
|
||||||
|
|
||||||
std::optional<AssetPath> SHMeshCompiler::CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept
|
|
||||||
{
|
|
||||||
std::string newPath{ path.parent_path().string() + '/' };
|
|
||||||
newPath += asset.header.name + MESH_EXTENSION.data();
|
|
||||||
|
|
||||||
std::ofstream file{ newPath, std::ios::out | std::ios::binary | std::ios::trunc };
|
|
||||||
if (!file.is_open())
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("Unable to open file for writing mesh file: {}", path.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(&(asset.header.vertexCount)),
|
|
||||||
sizeof(uint32_t)
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<const char*>(&(asset.header.indexCount)),
|
|
||||||
sizeof(uint32_t)
|
|
||||||
);
|
|
||||||
|
|
||||||
auto const vertexVec3Byte{ sizeof(SHVec3) * asset.header.vertexCount };
|
|
||||||
auto const vertexVec2Byte{ sizeof(SHVec2) * asset.header.vertexCount };
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.vertexPosition.data()),
|
|
||||||
vertexVec3Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.vertexTangent.data()),
|
|
||||||
vertexVec3Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.vertexNormal.data()),
|
|
||||||
vertexVec3Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.texCoords.data()),
|
|
||||||
vertexVec2Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.indices.data()),
|
|
||||||
sizeof(uint32_t) * asset.header.indexCount
|
|
||||||
);
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
|
|
||||||
return newPath;
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -1,40 +0,0 @@
|
||||||
/*************************************************************************//**
|
|
||||||
* \file SHMeshCompiler.h
|
|
||||||
* \author Loh Xiao Qi
|
|
||||||
* \date 30 September 2022
|
|
||||||
* \brief Library to write data in SHMeshAsset into binary file for faster
|
|
||||||
* loading in the future
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
|
||||||
* disclosure of this file or its contents without the prior written consent
|
|
||||||
* of DigiPen Institute of Technology is prohibited.
|
|
||||||
*****************************************************************************/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
#include <assimp/Importer.hpp>
|
|
||||||
#include <assimp/scene.h>
|
|
||||||
#include <vector>
|
|
||||||
|
|
||||||
#include "Assets/Asset Types/SHAnimationAsset.h"
|
|
||||||
#include "Assets/Asset Types/SHMeshAsset.h"
|
|
||||||
#include "Assets/SHAssetMacros.h"
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
class SHMeshCompiler
|
|
||||||
{
|
|
||||||
|
|
||||||
using MeshVectorRef = std::vector<SHMeshAsset*>&;
|
|
||||||
using AnimVectorRef = std::vector<SHAnimationAsset*>&;
|
|
||||||
|
|
||||||
static Assimp::Importer aiImporter;
|
|
||||||
static void ProcessNode(aiNode const& node, aiScene const& scene, MeshVectorRef meshes) noexcept;
|
|
||||||
static void ExtractAnimations(aiScene const& scene, AnimVectorRef anims) noexcept;
|
|
||||||
static SHMeshAsset* ProcessMesh(aiMesh const& mesh) noexcept;
|
|
||||||
|
|
||||||
public:
|
|
||||||
static void LoadFromFile(AssetPath path, MeshVectorRef meshes, AnimVectorRef anims) noexcept;
|
|
||||||
static std::optional<AssetPath> CompileMeshBinary(SHMeshAsset const& asset, AssetPath path) noexcept;
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -1,130 +0,0 @@
|
||||||
/*************************************************************************//**
|
|
||||||
* \file SHMeshLoader.cpp
|
|
||||||
* \author Loh Xiao Qi
|
|
||||||
* \date 30 September 2022
|
|
||||||
* \brief Implementation for Mesh loader. Accounts for custom binary format
|
|
||||||
* as well as GLTF file format.
|
|
||||||
*
|
|
||||||
*
|
|
||||||
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
|
||||||
* disclosure of this file or its contents without the prior written consent
|
|
||||||
* of DigiPen Institute of Technology is prohibited.
|
|
||||||
*****************************************************************************/
|
|
||||||
#include "SHpch.h"
|
|
||||||
#include "SHMeshLoader.h"
|
|
||||||
#include <fstream>
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
void SHMeshLoader::LoadSHMesh(AssetPath path, SHMeshAsset& mesh) noexcept
|
|
||||||
{
|
|
||||||
std::ifstream file{ path.string(), std::ios::in | std::ios::binary };
|
|
||||||
if (!file.is_open())
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("Unable to open SHMesh File: {}", path.string());
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
const std::string name{ path.stem().string() };
|
|
||||||
|
|
||||||
file.seekg(0);
|
|
||||||
|
|
||||||
uint32_t vertCount, indexCount;
|
|
||||||
std::vector<SHVec3> vertPos, vertTan, vertNorm;
|
|
||||||
std::vector<SHVec2> texCoord;
|
|
||||||
std::vector<uint32_t> indices;
|
|
||||||
|
|
||||||
file.read(reinterpret_cast<char*>(&vertCount), sizeof(uint32_t));
|
|
||||||
file.read(reinterpret_cast<char*>(&indexCount), sizeof(uint32_t));
|
|
||||||
|
|
||||||
auto const vertexVec3Byte{ sizeof(SHVec3) * vertCount };
|
|
||||||
auto const vertexVec2Byte{ sizeof(SHVec2) * vertCount };
|
|
||||||
|
|
||||||
vertPos.resize(vertCount);
|
|
||||||
vertTan.resize(vertCount);
|
|
||||||
vertNorm.resize(vertCount);
|
|
||||||
texCoord.resize(vertCount);
|
|
||||||
indices.resize(indexCount);
|
|
||||||
|
|
||||||
file.read(reinterpret_cast<char *>(vertPos.data()), vertexVec3Byte);
|
|
||||||
file.read(reinterpret_cast<char *>(vertTan.data()), vertexVec3Byte);
|
|
||||||
file.read(reinterpret_cast<char *>(vertNorm.data()), vertexVec3Byte);
|
|
||||||
file.read(reinterpret_cast<char *>(texCoord.data()), vertexVec2Byte);
|
|
||||||
file.read(reinterpret_cast<char *>(indices.data()), sizeof(uint32_t) * indexCount);
|
|
||||||
|
|
||||||
mesh.compiled = true;
|
|
||||||
mesh.changed = false;
|
|
||||||
|
|
||||||
mesh.header.indexCount = indexCount;
|
|
||||||
mesh.header.vertexCount = vertCount;
|
|
||||||
mesh.header.name = name;
|
|
||||||
|
|
||||||
mesh.vertexPosition = std::move(vertPos);
|
|
||||||
mesh.vertexTangent = std::move(vertTan);
|
|
||||||
mesh.vertexNormal = std::move(vertNorm);
|
|
||||||
mesh.texCoords = std::move(texCoord);
|
|
||||||
mesh.indices = std::move(indices);
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
|
|
||||||
SHAssetData* SHMeshLoader::Load(AssetPath path)
|
|
||||||
{
|
|
||||||
auto result = new SHMeshAsset();
|
|
||||||
|
|
||||||
LoadSHMesh(path, *result);
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
void SHMeshLoader::Write(SHAssetData const* data, AssetPath path)
|
|
||||||
{
|
|
||||||
std::ofstream file{ path, std::ios::out | std::ios::binary | std::ios::trunc };
|
|
||||||
if (!file.is_open())
|
|
||||||
{
|
|
||||||
SHLOG_ERROR("Unable to open file for writing mesh file: {}", path.string());
|
|
||||||
}
|
|
||||||
|
|
||||||
auto asset = *dynamic_cast<SHMeshAsset const*>(data);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(&(asset.header.vertexCount)),
|
|
||||||
sizeof(uint32_t)
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<const char*>(&(asset.header.indexCount)),
|
|
||||||
sizeof(uint32_t)
|
|
||||||
);
|
|
||||||
|
|
||||||
auto const vertexVec3Byte{ sizeof(SHVec3) * asset.header.vertexCount };
|
|
||||||
auto const vertexVec2Byte{ sizeof(SHVec2) * asset.header.vertexCount };
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.vertexPosition.data()),
|
|
||||||
vertexVec3Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.vertexTangent.data()),
|
|
||||||
vertexVec3Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.vertexNormal.data()),
|
|
||||||
vertexVec3Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.texCoords.data()),
|
|
||||||
vertexVec2Byte
|
|
||||||
);
|
|
||||||
|
|
||||||
file.write(
|
|
||||||
reinterpret_cast<char const*>(asset.indices.data()),
|
|
||||||
sizeof(uint32_t) * asset.header.indexCount
|
|
||||||
);
|
|
||||||
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
}
|
|
|
@ -0,0 +1,91 @@
|
||||||
|
/*************************************************************************//**
|
||||||
|
* \file SHModelLoader.cpp
|
||||||
|
* \author Loh Xiao Qi
|
||||||
|
* \date 30 September 2022
|
||||||
|
* \brief Implementation for Mesh loader. Accounts for custom binary format
|
||||||
|
* as well as GLTF file format.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Copyright (C) 2022 DigiPen Institute of Technology. Reproduction or
|
||||||
|
* disclosure of this file or its contents without the prior written consent
|
||||||
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
|
*****************************************************************************/
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHModelLoader.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
void SHModelLoader::ReadHeader(std::ifstream& file, SHMeshLoaderHeader& header) noexcept
|
||||||
|
{
|
||||||
|
file.read(
|
||||||
|
reinterpret_cast<char*>(&header),
|
||||||
|
sizeof(SHMeshLoaderHeader)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHModelLoader::ReadData(std::ifstream& file, SHMeshLoaderHeader const& header, SHMeshData& data) noexcept
|
||||||
|
{
|
||||||
|
auto const vertexVec3Byte{ sizeof(SHVec3) * header.vertexCount };
|
||||||
|
auto const vertexVec2Byte{ sizeof(SHVec2) * header.vertexCount };
|
||||||
|
|
||||||
|
data.VertexPositions.resize(header.vertexCount);
|
||||||
|
data.VertexTangents.resize(header.vertexCount);
|
||||||
|
data.VertexNormals.resize(header.vertexCount);
|
||||||
|
data.VertexTexCoords.resize(header.vertexCount);
|
||||||
|
data.Indices.resize(header.indexCount);
|
||||||
|
data.header.name.resize(header.charCount);
|
||||||
|
|
||||||
|
file.read(data.header.name.data(), header.charCount);
|
||||||
|
file.read(reinterpret_cast<char*>(data.VertexPositions.data()), vertexVec3Byte);
|
||||||
|
file.read(reinterpret_cast<char*>(data.VertexTangents.data()), vertexVec3Byte);
|
||||||
|
file.read(reinterpret_cast<char*>(data.VertexNormals.data()), vertexVec3Byte);
|
||||||
|
file.read(reinterpret_cast<char*>(data.VertexTexCoords.data()), vertexVec2Byte);
|
||||||
|
file.read(reinterpret_cast<char*>(data.Indices.data()), sizeof(uint32_t) * header.indexCount);
|
||||||
|
|
||||||
|
data.header.vertexCount = header.vertexCount;
|
||||||
|
data.header.indexCount = header.indexCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHModelLoader::LoadSHMesh(AssetPath path, SHModelAsset& model) noexcept
|
||||||
|
{
|
||||||
|
std::ifstream file{ path.string(), std::ios::in | std::ios::binary };
|
||||||
|
if (!file.is_open())
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Unable to open SHMesh File: {}", path.string());
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
file.seekg(0);
|
||||||
|
|
||||||
|
file.read(
|
||||||
|
reinterpret_cast<char*>(&model.header),
|
||||||
|
sizeof(SHModelAssetHeader)
|
||||||
|
);
|
||||||
|
|
||||||
|
std::vector<SHMeshLoaderHeader> headers(model.header.meshCount);
|
||||||
|
model.subMeshes.resize(model.header.meshCount);
|
||||||
|
|
||||||
|
for (auto i{ 0 }; i < model.header.meshCount; ++i)
|
||||||
|
{
|
||||||
|
model.subMeshes[i] = new SHMeshData();
|
||||||
|
ReadHeader(file, headers[i]);
|
||||||
|
ReadData(file, headers[i], *model.subMeshes[i]);
|
||||||
|
}
|
||||||
|
file.close();
|
||||||
|
}
|
||||||
|
|
||||||
|
SHAssetData* SHModelLoader::Load(AssetPath path)
|
||||||
|
{
|
||||||
|
auto result = new SHModelAsset();
|
||||||
|
|
||||||
|
LoadSHMesh(path, *result);
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHModelLoader::Write(SHAssetData const* data, AssetPath path)
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,5 +1,5 @@
|
||||||
/*************************************************************************//**
|
/*************************************************************************//**
|
||||||
* \file SHMeshLoader.h
|
* \file SHModelLoader.h
|
||||||
* \author Loh Xiao Qi
|
* \author Loh Xiao Qi
|
||||||
* \date 30 September 2022
|
* \date 30 September 2022
|
||||||
* \brief Library to load gltf mesh files and custom binary format
|
* \brief Library to load gltf mesh files and custom binary format
|
||||||
|
@ -10,14 +10,27 @@
|
||||||
* of DigiPen Institute of Technology is prohibited.
|
* of DigiPen Institute of Technology is prohibited.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
#pragma once
|
#pragma once
|
||||||
#include "Assets/Asset Types/SHMeshAsset.h"
|
#include "Assets/Asset Types/SHModelAsset.h"
|
||||||
#include "SHAssetLoader.h"
|
#include "SHAssetLoader.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
struct SHMeshLoader : SHAssetLoader
|
class SHModelLoader : public SHAssetLoader
|
||||||
{
|
{
|
||||||
void LoadSHMesh(AssetPath path, SHMeshAsset& meshes) noexcept;
|
struct SHMeshLoaderHeader
|
||||||
|
{
|
||||||
|
uint32_t vertexCount;
|
||||||
|
uint32_t indexCount;
|
||||||
|
uint32_t charCount;
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
void ReadHeader(std::ifstream& file, SHMeshLoaderHeader& header) noexcept;
|
||||||
|
void ReadData(std::ifstream& file, SHMeshLoaderHeader const& header, SHMeshData& data) noexcept;
|
||||||
|
|
||||||
|
public:
|
||||||
|
void LoadSHMesh(AssetPath path, SHModelAsset& model) noexcept;
|
||||||
SHAssetData* Load(AssetPath path) override;
|
SHAssetData* Load(AssetPath path) override;
|
||||||
void Write(SHAssetData const* data, AssetPath path) override;
|
void Write(SHAssetData const* data, AssetPath path) override;
|
||||||
};
|
};
|
|
@ -21,6 +21,11 @@ namespace SHADE
|
||||||
AssetName name;
|
AssetName name;
|
||||||
AssetID id;
|
AssetID id;
|
||||||
AssetType type;
|
AssetType type;
|
||||||
AssetPath path;
|
AssetPath path;
|
||||||
|
bool isSubAsset;
|
||||||
|
|
||||||
|
std::vector<SHAsset*> subAssets;
|
||||||
|
|
||||||
|
AssetID parent;
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -47,10 +47,11 @@ enum class AssetType : AssetTypeMeta
|
||||||
SHADER,
|
SHADER,
|
||||||
SHADER_BUILT_IN,
|
SHADER_BUILT_IN,
|
||||||
TEXTURE,
|
TEXTURE,
|
||||||
MESH,
|
MODEL,
|
||||||
SCENE,
|
SCENE,
|
||||||
PREFAB,
|
PREFAB,
|
||||||
MATERIAL,
|
MATERIAL,
|
||||||
|
MESH,
|
||||||
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) };
|
||||||
|
@ -64,6 +65,9 @@ constexpr std::string_view ASSET_ROOT {"../../Assets"};
|
||||||
constexpr std::string_view BUILT_IN_ASSET_ROOT{ "../../Built_In" };
|
constexpr std::string_view BUILT_IN_ASSET_ROOT{ "../../Built_In" };
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
// COMPILER PATHS
|
||||||
|
constexpr std::string_view MODEL_COMPILER_EXE{ "ModelCompiler.exe" };
|
||||||
|
|
||||||
// INTERNAL ASSET PATHS
|
// INTERNAL ASSET PATHS
|
||||||
constexpr std::string_view SCENE_FOLDER{ "/Scenes/" };
|
constexpr std::string_view SCENE_FOLDER{ "/Scenes/" };
|
||||||
constexpr std::string_view PREFAB_FOLDER{ "/Prefabs/" };
|
constexpr std::string_view PREFAB_FOLDER{ "/Prefabs/" };
|
||||||
|
@ -81,7 +85,7 @@ 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 MESH_EXTENSION {".shmesh"};
|
constexpr std::string_view MODEL_EXTENSION {".shmodel"};
|
||||||
|
|
||||||
constexpr std::string_view EXTENSIONS[] = {
|
constexpr std::string_view EXTENSIONS[] = {
|
||||||
AUDIO_EXTENSION,
|
AUDIO_EXTENSION,
|
||||||
|
@ -89,7 +93,7 @@ constexpr std::string_view EXTENSIONS[] = {
|
||||||
SHADER_BUILT_IN_EXTENSION,
|
SHADER_BUILT_IN_EXTENSION,
|
||||||
MATERIAL_EXTENSION,
|
MATERIAL_EXTENSION,
|
||||||
TEXTURE_EXTENSION,
|
TEXTURE_EXTENSION,
|
||||||
MESH_EXTENSION,
|
MODEL_EXTENSION,
|
||||||
SCRIPT_EXTENSION,
|
SCRIPT_EXTENSION,
|
||||||
SCENE_EXTENSION,
|
SCENE_EXTENSION,
|
||||||
PREFAB_EXTENSION,
|
PREFAB_EXTENSION,
|
||||||
|
|
|
@ -11,15 +11,17 @@
|
||||||
#include <random>
|
#include <random>
|
||||||
#include <chrono>
|
#include <chrono>
|
||||||
#include <ranges>
|
#include <ranges>
|
||||||
|
#include <cstdlib>
|
||||||
|
|
||||||
#include "SHAssetManager.h"
|
#include "SHAssetManager.h"
|
||||||
#include "SHAssetMetaHandler.h"
|
#include "SHAssetMetaHandler.h"
|
||||||
|
|
||||||
#include "Libraries/Loaders/SHMeshLoader.h"
|
#include "Libraries/Loaders/SHModelLoader.h"
|
||||||
#include "Libraries/Loaders/SHTextureLoader.h"
|
#include "Libraries/Loaders/SHTextureLoader.h"
|
||||||
#include "Libraries/Loaders/SHShaderSourceLoader.h"
|
#include "Libraries/Loaders/SHShaderSourceLoader.h"
|
||||||
#include "Libraries/Loaders/SHTextBasedLoader.h"
|
#include "Libraries/Loaders/SHTextBasedLoader.h"
|
||||||
|
|
||||||
#include "Libraries/Compilers/SHMeshCompiler.h"
|
//#include "Libraries/Compilers/SHMeshCompiler.h"
|
||||||
#include "Libraries/Compilers/SHTextureCompiler.h"
|
#include "Libraries/Compilers/SHTextureCompiler.h"
|
||||||
#include "Libraries/Compilers/SHShaderSourceCompiler.h"
|
#include "Libraries/Compilers/SHShaderSourceCompiler.h"
|
||||||
|
|
||||||
|
@ -186,7 +188,8 @@ namespace SHADE
|
||||||
name,
|
name,
|
||||||
id,
|
id,
|
||||||
type,
|
type,
|
||||||
newPath
|
newPath,
|
||||||
|
false
|
||||||
};
|
};
|
||||||
|
|
||||||
assetCollection.insert({
|
assetCollection.insert({
|
||||||
|
@ -195,7 +198,8 @@ namespace SHADE
|
||||||
name,
|
name,
|
||||||
id,
|
id,
|
||||||
type,
|
type,
|
||||||
newPath
|
newPath,
|
||||||
|
false
|
||||||
)
|
)
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -334,25 +338,32 @@ namespace SHADE
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
|
|
||||||
AssetID SHAssetManager::CompileAsset(AssetPath const& path) noexcept
|
void SHAssetManager::CompileAsset(AssetPath const& path) noexcept
|
||||||
{
|
{
|
||||||
SHAsset newAsset
|
if (!std::filesystem::exists(path))
|
||||||
{
|
{
|
||||||
.name = path.stem().string()
|
SHLOG_ERROR("Path provided does not point to a file: {}", path.string());
|
||||||
};
|
return;
|
||||||
|
}
|
||||||
|
AssetPath newPath;
|
||||||
auto const ext{ path.extension().string() };
|
auto const ext{ path.extension().string() };
|
||||||
if (ext == GLSL_EXTENSION.data())
|
if (ext == GLSL_EXTENSION.data())
|
||||||
{
|
{
|
||||||
newAsset.path = SHShaderSourceCompiler::LoadAndCompileShader(path).value();
|
newPath = SHShaderSourceCompiler::LoadAndCompileShader(path).value();
|
||||||
newAsset.id = GenerateAssetID(AssetType::SHADER_BUILT_IN);
|
|
||||||
newAsset.type = AssetType::SHADER_BUILT_IN;
|
|
||||||
}
|
}
|
||||||
|
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());
|
||||||
|
|
||||||
assetCollection.insert({ newAsset.id, newAsset });
|
std::string modelPath = path.string().substr(0, path.string().find_last_of('.'));
|
||||||
SHAssetMetaHandler::WriteMetaData(newAsset);
|
modelPath += MODEL_EXTENSION;
|
||||||
|
newPath = modelPath;
|
||||||
|
|
||||||
|
GenerateNewMeta(newPath);
|
||||||
|
}
|
||||||
|
|
||||||
return newAsset.id;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
FolderPointer SHAssetManager::GetRootFolder() noexcept
|
FolderPointer SHAssetManager::GetRootFolder() noexcept
|
||||||
|
@ -405,46 +416,28 @@ namespace SHADE
|
||||||
|
|
||||||
for (auto const& path : paths)
|
for (auto const& path : paths)
|
||||||
{
|
{
|
||||||
SHAsset newAsset
|
AssetPath newPath;
|
||||||
{
|
|
||||||
.name = path.stem().string()
|
|
||||||
};
|
|
||||||
|
|
||||||
auto const ext{ path.extension().string() };
|
auto const ext{ path.extension().string() };
|
||||||
if (ext == GLSL_EXTENSION.data())
|
if (ext == GLSL_EXTENSION.data())
|
||||||
{
|
{
|
||||||
newAsset.path = SHShaderSourceCompiler::LoadAndCompileShader(path).value();
|
newPath = SHShaderSourceCompiler::LoadAndCompileShader(path).value();
|
||||||
newAsset.id = GenerateAssetID(AssetType::SHADER_BUILT_IN);
|
|
||||||
newAsset.type = AssetType::SHADER_BUILT_IN;
|
|
||||||
}
|
}
|
||||||
else if (ext == DDS_EXTENSION.data())
|
else if (ext == DDS_EXTENSION.data())
|
||||||
{
|
{
|
||||||
newAsset.path = SHTextureCompiler::CompileTextureAsset(path).value();
|
newPath = SHTextureCompiler::CompileTextureAsset(path).value();
|
||||||
newAsset.id = GenerateAssetID(AssetType::TEXTURE);
|
|
||||||
newAsset.type = AssetType::TEXTURE;
|
|
||||||
}
|
}
|
||||||
else if (ext == GLTF_EXTENSION.data() || ext == FBX_EXTENSION.data())
|
else if (ext == GLTF_EXTENSION.data() || ext == FBX_EXTENSION.data())
|
||||||
{
|
{
|
||||||
std::vector<SHMeshAsset*> meshes;
|
std::string command = MODEL_COMPILER_EXE.data();
|
||||||
std::vector<SHAnimationAsset*> anims;
|
command += " " + path.string();
|
||||||
SHMeshCompiler::LoadFromFile(path, meshes, anims);
|
std::system(command.c_str());
|
||||||
|
|
||||||
for (auto const& mesh : meshes)
|
std::string modelPath = path.string().substr(0, path.string().find_last_of('.'));
|
||||||
{
|
modelPath += MODEL_EXTENSION;
|
||||||
SHAsset meshAsset{
|
newPath = modelPath;
|
||||||
.name = mesh->header.name
|
|
||||||
};
|
|
||||||
meshAsset.path = SHMeshCompiler::CompileMeshBinary(*mesh, path).value();
|
|
||||||
meshAsset.id = GenerateAssetID(AssetType::MESH);
|
|
||||||
meshAsset.type = AssetType::MESH;
|
|
||||||
assetCollection.insert({ meshAsset.id, meshAsset });
|
|
||||||
SHAssetMetaHandler::WriteMetaData(meshAsset);
|
|
||||||
}
|
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
assetCollection.insert({ newAsset.id, newAsset });
|
GenerateNewMeta(newPath);
|
||||||
SHAssetMetaHandler::WriteMetaData(newAsset);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -459,10 +452,11 @@ namespace SHADE
|
||||||
loaders[static_cast<size_t>(AssetType::SHADER)] = dynamic_cast<SHAssetLoader*>(new SHShaderSourceLoader());
|
loaders[static_cast<size_t>(AssetType::SHADER)] = dynamic_cast<SHAssetLoader*>(new SHShaderSourceLoader());
|
||||||
loaders[static_cast<size_t>(AssetType::SHADER_BUILT_IN)] = loaders[static_cast<size_t>(AssetType::SHADER)];
|
loaders[static_cast<size_t>(AssetType::SHADER_BUILT_IN)] = loaders[static_cast<size_t>(AssetType::SHADER)];
|
||||||
loaders[static_cast<size_t>(AssetType::TEXTURE)] = dynamic_cast<SHAssetLoader*>(new SHTextureLoader());
|
loaders[static_cast<size_t>(AssetType::TEXTURE)] = dynamic_cast<SHAssetLoader*>(new SHTextureLoader());
|
||||||
loaders[static_cast<size_t>(AssetType::MESH)] = dynamic_cast<SHAssetLoader*>(new SHMeshLoader());
|
loaders[static_cast<size_t>(AssetType::MODEL)] = dynamic_cast<SHAssetLoader*>(new SHModelLoader());
|
||||||
loaders[static_cast<size_t>(AssetType::SCENE)] = dynamic_cast<SHAssetLoader*>(new SHTextBasedLoader());
|
loaders[static_cast<size_t>(AssetType::SCENE)] = dynamic_cast<SHAssetLoader*>(new SHTextBasedLoader());
|
||||||
loaders[static_cast<size_t>(AssetType::PREFAB)] = loaders[static_cast<size_t>(AssetType::SCENE)];
|
loaders[static_cast<size_t>(AssetType::PREFAB)] = loaders[static_cast<size_t>(AssetType::SCENE)];
|
||||||
loaders[static_cast<size_t>(AssetType::MATERIAL)] = loaders[static_cast<size_t>(AssetType::SCENE)];
|
loaders[static_cast<size_t>(AssetType::MATERIAL)] = loaders[static_cast<size_t>(AssetType::SCENE)];
|
||||||
|
loaders[static_cast<size_t>(AssetType::MESH)] = nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -470,9 +464,9 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void SHAssetManager::Load() noexcept
|
void SHAssetManager::Load() noexcept
|
||||||
{
|
{
|
||||||
//CompileAll();
|
|
||||||
BuildAssetCollection();
|
BuildAssetCollection();
|
||||||
InitLoaders();
|
InitLoaders();
|
||||||
|
//CompileAll();
|
||||||
//LoadAllData();
|
//LoadAllData();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -490,8 +484,12 @@ namespace SHADE
|
||||||
|
|
||||||
SHAssetData* SHAssetManager::LoadData(SHAsset const& asset) noexcept
|
SHAssetData* SHAssetManager::LoadData(SHAsset const& asset) noexcept
|
||||||
{
|
{
|
||||||
SHAssetData* data = loaders[static_cast<size_t>(asset.type)]->Load(asset.path);
|
if (asset.isSubAsset)
|
||||||
|
{
|
||||||
|
return LoadSubData(asset);
|
||||||
|
}
|
||||||
|
|
||||||
|
SHAssetData* data = loaders[static_cast<size_t>(asset.type)]->Load(asset.path);
|
||||||
if (data == nullptr)
|
if (data == nullptr)
|
||||||
{
|
{
|
||||||
SHLOG_ERROR("Unable to load asset into memory: {}\n", asset.path.string());
|
SHLOG_ERROR("Unable to load asset into memory: {}\n", asset.path.string());
|
||||||
|
@ -504,8 +502,120 @@ namespace SHADE
|
||||||
return data;
|
return data;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
SHAssetData* SHAssetManager::LoadSubData(SHAsset const& asset) noexcept
|
||||||
|
{
|
||||||
|
auto const& parent = assetCollection[asset.parent];
|
||||||
|
auto parentData = loaders[static_cast<size_t>(parent.type)]->Load(parent.path);
|
||||||
|
|
||||||
|
if (parentData == nullptr)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Unable to load asset into memory: {}\n", parent.path.string());
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
assetData.emplace(parent.id, parentData);
|
||||||
|
if (parent.type == AssetType::MODEL)
|
||||||
|
{
|
||||||
|
auto parentModel = reinterpret_cast<SHModelAsset*>(parentData);
|
||||||
|
for (auto i {0}; i < parent.subAssets.size(); ++i)
|
||||||
|
{
|
||||||
|
assetData.emplace(
|
||||||
|
parent.subAssets[i]->id,
|
||||||
|
parentModel->subMeshes[i]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return assetData[asset.id];
|
||||||
|
}
|
||||||
|
|
||||||
|
return parentData;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHAssetManager::LoadNewData(AssetPath path) noexcept
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHAssetManager::GenerateNewMeta(AssetPath path) noexcept
|
||||||
|
{
|
||||||
|
auto const ext = path.extension().string();
|
||||||
|
if (ext == SHADER_BUILT_IN_EXTENSION.data())
|
||||||
|
{
|
||||||
|
SHAsset newAsset{
|
||||||
|
path.stem().string(),
|
||||||
|
GenerateAssetID(AssetType::SHADER_BUILT_IN),
|
||||||
|
AssetType::SHADER_BUILT_IN,
|
||||||
|
path,
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
|
assetCollection.emplace(newAsset.id, newAsset);
|
||||||
|
SHAssetMetaHandler::WriteMetaData(newAsset);
|
||||||
|
}
|
||||||
|
else if (ext == TEXTURE_EXTENSION.data())
|
||||||
|
{
|
||||||
|
SHAsset newAsset{
|
||||||
|
path.stem().string(),
|
||||||
|
GenerateAssetID(AssetType::SHADER_BUILT_IN),
|
||||||
|
AssetType::SHADER_BUILT_IN,
|
||||||
|
path,
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
|
assetCollection.emplace(newAsset.id, newAsset);
|
||||||
|
SHAssetMetaHandler::WriteMetaData(newAsset);
|
||||||
|
}
|
||||||
|
else if (ext == MODEL_EXTENSION)
|
||||||
|
{
|
||||||
|
SHAsset newAsset{
|
||||||
|
path.stem().string(),
|
||||||
|
GenerateAssetID(AssetType::MODEL),
|
||||||
|
AssetType::MODEL,
|
||||||
|
path,
|
||||||
|
false
|
||||||
|
};
|
||||||
|
|
||||||
|
assetCollection.emplace(newAsset.id, newAsset);
|
||||||
|
|
||||||
|
SHModelAsset* const data = reinterpret_cast<SHModelAsset*>(LoadData(newAsset));
|
||||||
|
assetData.emplace(newAsset.id, data);
|
||||||
|
for(auto const& subMesh : data->subMeshes)
|
||||||
|
{
|
||||||
|
SHAsset subAsset{
|
||||||
|
.name = subMesh->header.name,
|
||||||
|
.id = GenerateAssetID(AssetType::MESH),
|
||||||
|
.type = AssetType::MESH,
|
||||||
|
.isSubAsset = true,
|
||||||
|
.parent = newAsset.id
|
||||||
|
};
|
||||||
|
|
||||||
|
assetCollection.emplace(subAsset.id, subAsset);
|
||||||
|
assetCollection[newAsset.id].subAssets.push_back(&assetCollection[subAsset.id]);
|
||||||
|
|
||||||
|
assetData.emplace(subAsset.id, subMesh);
|
||||||
|
}
|
||||||
|
|
||||||
|
SHAssetMetaHandler::WriteMetaData(assetCollection[newAsset.id]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SHAssetManager::BuildAssetCollection() noexcept
|
void SHAssetManager::BuildAssetCollection() noexcept
|
||||||
{
|
{
|
||||||
SHFileSystem::BuildDirectory(ASSET_ROOT.data(), folderRoot, assetCollection);
|
SHFileSystem::BuildDirectory(ASSET_ROOT.data(), folderRoot, assetCollection);
|
||||||
|
|
||||||
|
for (auto& asset : std::ranges::views::values(assetCollection))
|
||||||
|
{
|
||||||
|
if (!asset.subAssets.empty())
|
||||||
|
{
|
||||||
|
// Add subasset data into map, replace pointer and free heap memory
|
||||||
|
for (auto i{ 0 }; i < asset.subAssets.size(); ++i)
|
||||||
|
{
|
||||||
|
auto const id = asset.subAssets[i]->id;
|
||||||
|
assetCollection[id] = *asset.subAssets[i];
|
||||||
|
delete asset.subAssets[i];
|
||||||
|
asset.subAssets[i] = &assetCollection[id];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -87,7 +87,7 @@ 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 AssetID CompileAsset(AssetPath const& path) noexcept;
|
static void CompileAsset(AssetPath const& path) noexcept;
|
||||||
|
|
||||||
static FolderPointer GetRootFolder() noexcept;
|
static FolderPointer GetRootFolder() noexcept;
|
||||||
|
|
||||||
|
@ -95,7 +95,11 @@ namespace SHADE
|
||||||
|
|
||||||
static void InitLoaders() noexcept;
|
static void InitLoaders() noexcept;
|
||||||
static void LoadAllData() noexcept;
|
static void LoadAllData() noexcept;
|
||||||
static SHAssetData* LoadData(SHAsset const& asset) noexcept;
|
static SHAssetData* LoadData(SHAsset const& asset) noexcept;
|
||||||
|
static SHAssetData* LoadSubData(SHAsset const& asset) noexcept;
|
||||||
|
static void LoadNewData(AssetPath path) noexcept;
|
||||||
|
static void GenerateNewMeta(AssetPath path) noexcept;
|
||||||
|
|
||||||
inline static void BuildAssetCollection() noexcept;
|
inline static void BuildAssetCollection() noexcept;
|
||||||
|
|
||||||
static bool IsRecognised(char const*) noexcept;
|
static bool IsRecognised(char const*) noexcept;
|
||||||
|
|
|
@ -9,7 +9,6 @@
|
||||||
******************************************************************************/
|
******************************************************************************/
|
||||||
#include "SHpch.h"
|
#include "SHpch.h"
|
||||||
#include "SHAssetMetaHandler.h"
|
#include "SHAssetMetaHandler.h"
|
||||||
#include <fstream>
|
|
||||||
#include <sstream>
|
#include <sstream>
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
@ -21,11 +20,15 @@ namespace SHADE
|
||||||
* \brief Helper function to retrieve field value from meta data file
|
* \brief Helper function to retrieve field value from meta data file
|
||||||
* for processing
|
* for processing
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void GetFieldValue(std::ifstream& file, std::string& line) noexcept
|
bool GetFieldValue(std::ifstream& file, std::string& line) noexcept
|
||||||
{
|
{
|
||||||
line = "";
|
line = "";
|
||||||
std::getline(file, line);
|
if (std::getline(file, line))
|
||||||
line = line.substr(line.find_last_of(':') + 2, line.length());
|
{
|
||||||
|
line = line.substr(line.find_last_of(':') + 2, line.length());
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
/****************************************************************************
|
/****************************************************************************
|
||||||
|
@ -66,7 +69,8 @@ namespace SHADE
|
||||||
std::ifstream metaFile{ path.string(), std::ios_base::in };
|
std::ifstream metaFile{ path.string(), std::ios_base::in };
|
||||||
if (!metaFile.is_open())
|
if (!metaFile.is_open())
|
||||||
{
|
{
|
||||||
// Error unable to open
|
SHLOG_ERROR("Unable to open meta file: {}", path.string());
|
||||||
|
return {};
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string line;
|
std::string line;
|
||||||
|
@ -92,6 +96,43 @@ namespace SHADE
|
||||||
AssetTypeMeta type;
|
AssetTypeMeta type;
|
||||||
typeStream >> type;
|
typeStream >> type;
|
||||||
meta.type = static_cast<AssetType>(type);
|
meta.type = static_cast<AssetType>(type);
|
||||||
|
|
||||||
|
meta.isSubAsset = false;
|
||||||
|
|
||||||
|
// Burn Line
|
||||||
|
if (std::getline(metaFile, line))
|
||||||
|
{
|
||||||
|
// Name Line
|
||||||
|
while(GetFieldValue(metaFile, line))
|
||||||
|
{
|
||||||
|
auto subAsset = new SHAsset();
|
||||||
|
|
||||||
|
// Get resource name
|
||||||
|
std::stringstream nameStream{ line };
|
||||||
|
AssetName name;
|
||||||
|
nameStream >> name;
|
||||||
|
subAsset->name = name;
|
||||||
|
|
||||||
|
// Get resource id
|
||||||
|
GetFieldValue(metaFile, line);
|
||||||
|
std::stringstream idStream{ line };
|
||||||
|
AssetID id;
|
||||||
|
idStream >> id;
|
||||||
|
subAsset->id = id;
|
||||||
|
|
||||||
|
// Get resource type
|
||||||
|
GetFieldValue(metaFile, line);
|
||||||
|
std::stringstream typeStream{ line };
|
||||||
|
AssetTypeMeta type;
|
||||||
|
typeStream >> type;
|
||||||
|
subAsset->type = static_cast<AssetType>(type);
|
||||||
|
|
||||||
|
subAsset->isSubAsset = true;
|
||||||
|
subAsset->parent = meta.id;
|
||||||
|
|
||||||
|
meta.subAssets.push_back(subAsset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
metaFile.close();
|
metaFile.close();
|
||||||
|
|
||||||
|
@ -108,6 +149,12 @@ namespace SHADE
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
void SHAssetMetaHandler::WriteMetaData(SHAsset const& meta) noexcept
|
void SHAssetMetaHandler::WriteMetaData(SHAsset const& meta) noexcept
|
||||||
{
|
{
|
||||||
|
if (meta.isSubAsset)
|
||||||
|
{
|
||||||
|
SHLOG_WARNING("Cannot write subasset meta: {}", meta.name);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
//TODO: Write into binary eventually
|
//TODO: Write into binary eventually
|
||||||
std::string path{ meta.path.string() };
|
std::string path{ meta.path.string() };
|
||||||
path.append(META_EXTENSION);
|
path.append(META_EXTENSION);
|
||||||
|
@ -124,7 +171,23 @@ namespace SHADE
|
||||||
metaFile << "ID: " << meta.id << "\n";
|
metaFile << "ID: " << meta.id << "\n";
|
||||||
metaFile << "Type: " << static_cast<AssetTypeMeta>(meta.type) << std::endl;
|
metaFile << "Type: " << static_cast<AssetTypeMeta>(meta.type) << std::endl;
|
||||||
|
|
||||||
|
if (!meta.subAssets.empty())
|
||||||
|
{
|
||||||
|
metaFile << "Sub Assets:\n";
|
||||||
|
|
||||||
|
for (auto const& subAsset : meta.subAssets)
|
||||||
|
{
|
||||||
|
WriteSubAssetMeta(metaFile, *subAsset);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
metaFile.close();
|
metaFile.close();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHAssetMetaHandler::WriteSubAssetMeta(std::ofstream& metaFile, SHAsset const& subAsset) noexcept
|
||||||
|
{
|
||||||
|
metaFile << "Name: " << subAsset.name << "\n";
|
||||||
|
metaFile << "ID: " << subAsset.id << "\n";
|
||||||
|
metaFile << "Type: " << static_cast<AssetTypeMeta>(subAsset.type) << std::endl;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -12,6 +12,7 @@
|
||||||
|
|
||||||
#include "SHAssetMacros.h"
|
#include "SHAssetMacros.h"
|
||||||
#include "SHAsset.h"
|
#include "SHAsset.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -45,6 +46,8 @@ namespace SHADE
|
||||||
* \brief Writes meta data into text file
|
* \brief Writes meta data into text file
|
||||||
****************************************************************************/
|
****************************************************************************/
|
||||||
static void WriteMetaData(SHAsset const&) noexcept;
|
static void WriteMetaData(SHAsset const&) noexcept;
|
||||||
|
|
||||||
|
static void WriteSubAssetMeta(std::ofstream&, SHAsset const&) noexcept;
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -102,8 +102,10 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
for (auto const& file : files)
|
for (auto const& file : files)
|
||||||
{
|
{
|
||||||
|
if(file.assetMeta == nullptr)
|
||||||
|
continue;
|
||||||
const float horizontalLineSize = 25.0f;
|
const float horizontalLineSize = 25.0f;
|
||||||
const ImRect childRect = DrawFile(file);
|
const ImRect childRect = DrawFile(file.assetMeta);
|
||||||
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;
|
||||||
|
@ -146,59 +148,65 @@ namespace SHADE
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
ImRect SHAssetBrowser::DrawFile(SHFile const& file) noexcept
|
ImRect SHAssetBrowser::DrawFile(SHAsset const* const asset) noexcept
|
||||||
{
|
{
|
||||||
if (file.assetMeta == nullptr)
|
if (asset == nullptr)
|
||||||
return ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
return ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
||||||
const bool isSelected = std::ranges::find(selectedAssets, file.assetMeta->id) != selectedAssets.end();
|
const bool isSelected = std::ranges::find(selectedAssets, asset->id) != selectedAssets.end();
|
||||||
ImGuiTreeNodeFlags flags = ImGuiTreeNodeFlags_Leaf;
|
ImGuiTreeNodeFlags flags = (!asset->subAssets.empty()) ? ImGuiTreeNodeFlags_OpenOnArrow : ImGuiTreeNodeFlags_Leaf;
|
||||||
if (isSelected)
|
if (isSelected)
|
||||||
flags |= ImGuiTreeNodeFlags_Selected;
|
flags |= ImGuiTreeNodeFlags_Selected;
|
||||||
std::string icon{};
|
std::string icon{};
|
||||||
|
|
||||||
switch (file.assetMeta->type)
|
switch (asset->type)
|
||||||
{
|
{
|
||||||
case AssetType::INVALID: break;
|
case AssetType::INVALID: break;
|
||||||
case AssetType::SHADER: icon = ICON_FA_FILE_CODE; break;
|
case AssetType::SHADER: icon = ICON_FA_FILE_CODE; break;
|
||||||
case AssetType::SHADER_BUILT_IN: icon = ICON_FA_FILE_CODE; break;
|
case AssetType::SHADER_BUILT_IN: icon = ICON_FA_FILE_CODE; break;
|
||||||
case AssetType::TEXTURE: icon = ICON_FA_IMAGES; break;
|
case AssetType::TEXTURE: icon = ICON_FA_IMAGES; break;
|
||||||
case AssetType::MESH: icon = ICON_FA_CUBES; break;
|
case AssetType::MODEL: icon = ICON_FA_CUBES_STACKED; break;
|
||||||
case AssetType::SCENE: icon = ICON_MD_IMAGE; break;
|
case AssetType::SCENE: icon = ICON_MD_IMAGE; break;
|
||||||
case AssetType::PREFAB: icon = ICON_FA_BOX_OPEN; break;
|
case AssetType::PREFAB: icon = ICON_FA_BOX_OPEN; break;
|
||||||
case AssetType::MATERIAL: break;
|
case AssetType::MATERIAL: break;
|
||||||
|
case AssetType::MESH: icon = ICON_FA_CUBES; break;
|
||||||
case AssetType::MAX_COUNT: break;
|
case AssetType::MAX_COUNT: break;
|
||||||
default:;
|
default:;
|
||||||
}
|
}
|
||||||
|
|
||||||
ImGui::TreeNodeEx(file.assetMeta, flags, "%s %s", icon.data(), file.assetMeta->name.data());
|
bool const isOpen = ImGui::TreeNodeEx(asset, flags, "%s %s", icon.data(), asset->name.data());
|
||||||
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
const ImRect nodeRect = ImRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax());
|
||||||
if (SHDragDrop::BeginSource())
|
if (SHDragDrop::BeginSource())
|
||||||
{
|
{
|
||||||
auto id = file.assetMeta->id;
|
auto id = asset->id;
|
||||||
ImGui::Text("Moving Asset: %s [%zu]", file.name.data(), file.assetMeta->id);
|
ImGui::Text("Moving Asset: %s [%zu]", asset->name.data(), asset->id);
|
||||||
SHDragDrop::SetPayload<AssetID>(SHDragDrop::DRAG_RESOURCE, &id);
|
SHDragDrop::SetPayload<AssetID>(SHDragDrop::DRAG_RESOURCE, &id);
|
||||||
SHDragDrop::EndSource();
|
SHDragDrop::EndSource();
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemClicked())
|
if (ImGui::IsItemClicked())
|
||||||
{
|
{
|
||||||
selectedAssets.clear();
|
selectedAssets.clear();
|
||||||
selectedAssets.push_back(file.assetMeta->id);
|
selectedAssets.push_back(asset->id);
|
||||||
}
|
}
|
||||||
if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left))
|
if (ImGui::IsItemHovered() && ImGui::IsMouseDoubleClicked(ImGuiMouseButton_Left))
|
||||||
{
|
{
|
||||||
switch (file.assetMeta->type)
|
switch (asset->type)
|
||||||
{
|
{
|
||||||
case AssetType::INVALID: break;
|
case AssetType::INVALID: break;
|
||||||
case AssetType::SHADER: icon = ICON_FA_FILE_CODE; break;
|
case AssetType::SHADER: break;
|
||||||
case AssetType::SHADER_BUILT_IN: icon = ICON_FA_FILE_CODE; break;
|
case AssetType::SHADER_BUILT_IN: break;
|
||||||
case AssetType::TEXTURE: icon = ICON_FA_IMAGES; break;
|
case AssetType::TEXTURE: break;
|
||||||
case AssetType::MESH: icon = ICON_FA_CUBES; break;
|
case AssetType::MESH: break;
|
||||||
case AssetType::SCENE: icon = ICON_MD_IMAGE; break;
|
case AssetType::SCENE:
|
||||||
case AssetType::PREFAB: icon = ICON_FA_BOX_OPEN; break;
|
if(auto editor = SHSystemManager::GetSystem<SHEditor>())
|
||||||
|
{
|
||||||
|
editor->LoadScene(asset->id);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case AssetType::PREFAB: break;
|
||||||
case AssetType::MATERIAL:
|
case AssetType::MATERIAL:
|
||||||
if (auto matInspector = SHEditorWindowManager::GetEditorWindow<SHMaterialInspector>())
|
if (auto matInspector = SHEditorWindowManager::GetEditorWindow<SHMaterialInspector>())
|
||||||
{
|
{
|
||||||
matInspector->OpenMaterial(file.assetMeta->id);
|
matInspector->OpenMaterial(asset->id);
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
case AssetType::MAX_COUNT: break;
|
case AssetType::MAX_COUNT: break;
|
||||||
|
@ -206,7 +214,27 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
ImGui::TreePop();
|
|
||||||
|
//TODO: Combine Draw asset and Draw Folder recursive drawing
|
||||||
|
const ImColor treeLineColor = ImGui::GetColorU32(ImGuiCol_CheckMark);
|
||||||
|
const float horizontalOffset = 0.0f;
|
||||||
|
ImDrawList* drawList = ImGui::GetWindowDrawList();
|
||||||
|
ImVec2 vertLineStart = ImGui::GetCursorScreenPos();
|
||||||
|
vertLineStart.x += horizontalOffset;
|
||||||
|
ImVec2 vertLineEnd = vertLineStart;
|
||||||
|
if(isOpen)
|
||||||
|
{
|
||||||
|
for(auto const& subAsset : asset->subAssets)
|
||||||
|
{
|
||||||
|
const float horizontalLineSize = 25.0f;
|
||||||
|
const ImRect childRect = DrawFile(subAsset);
|
||||||
|
const float midPoint = (childRect.Min.y + childRect.Max.y) * 0.5f;
|
||||||
|
drawList->AddLine(ImVec2(vertLineStart.x, midPoint), ImVec2(vertLineStart.x + horizontalLineSize, midPoint), treeLineColor, 1);
|
||||||
|
vertLineEnd.y = midPoint;
|
||||||
|
}
|
||||||
|
drawList->AddLine(vertLineStart, vertLineEnd, treeLineColor, 1);
|
||||||
|
ImGui::TreePop();
|
||||||
|
}
|
||||||
return nodeRect;
|
return nodeRect;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -217,7 +245,7 @@ namespace SHADE
|
||||||
auto& path = std::get<0>(assetBeingCreated.value());
|
auto& path = std::get<0>(assetBeingCreated.value());
|
||||||
auto& type = std::get<1>(assetBeingCreated.value());
|
auto& type = std::get<1>(assetBeingCreated.value());
|
||||||
auto& assetName = std::get<2>(assetBeingCreated.value());
|
auto& assetName = std::get<2>(assetBeingCreated.value());
|
||||||
if (ImGui::InputText("##newAssetname", &assetName, ImGuiInputTextFlags_EnterReturnsTrue))
|
if (ImGui::InputText("##newAssetName", &assetName, ImGuiInputTextFlags_EnterReturnsTrue))
|
||||||
{
|
{
|
||||||
AssetID assetId = SHAssetManager::CreateNewAsset(type, assetName);
|
AssetID assetId = SHAssetManager::CreateNewAsset(type, assetName);
|
||||||
if (auto matInspector = SHEditorWindowManager::GetEditorWindow<SHMaterialInspector>())
|
if (auto matInspector = SHEditorWindowManager::GetEditorWindow<SHMaterialInspector>())
|
||||||
|
|
|
@ -21,7 +21,7 @@ namespace SHADE
|
||||||
void DrawMenuBar();
|
void DrawMenuBar();
|
||||||
ImRect RecursivelyDrawTree(FolderPointer folder);
|
ImRect RecursivelyDrawTree(FolderPointer folder);
|
||||||
void DrawCurrentFolder();
|
void DrawCurrentFolder();
|
||||||
ImRect DrawFile(SHFile const& file) noexcept;
|
ImRect DrawFile(SHAsset const* const asset) noexcept;
|
||||||
void DrawAssetBeingCreated() noexcept;
|
void DrawAssetBeingCreated() noexcept;
|
||||||
|
|
||||||
FolderPointer rootFolder, prevFolder, currentFolder;
|
FolderPointer rootFolder, prevFolder, currentFolder;
|
||||||
|
|
|
@ -6,8 +6,8 @@
|
||||||
|
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
#include "Editor/IconsMaterialDesign.h"
|
#include "Editor/IconsMaterialDesign.h"
|
||||||
#include "Graphics/MiddleEnd/Materials/SHMaterialSpec.h"
|
|
||||||
#include "Editor/SHEditorWidgets.hpp"
|
#include "Editor/SHEditorWidgets.hpp"
|
||||||
|
#include "Graphics/MiddleEnd/Materials/SHMaterialSpec.h"
|
||||||
#include "Resource/SHResourceManager.h"
|
#include "Resource/SHResourceManager.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
|
|
@ -3,6 +3,7 @@
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| SHADE Includes ||
|
//|| SHADE Includes ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
#include "Editor/SHEditorWidgets.hpp"
|
||||||
#include "Editor/SHEditor.h"
|
#include "Editor/SHEditor.h"
|
||||||
#include "SHEditorMenuBar.h"
|
#include "SHEditorMenuBar.h"
|
||||||
#include "Editor/IconsMaterialDesign.h"
|
#include "Editor/IconsMaterialDesign.h"
|
||||||
|
@ -17,7 +18,11 @@
|
||||||
#include <imgui_internal.h>
|
#include <imgui_internal.h>
|
||||||
#include <rttr/type>
|
#include <rttr/type>
|
||||||
|
|
||||||
|
#include "Assets/SHAssetManager.h"
|
||||||
|
#include "Assets/Asset Types/SHSceneAsset.h"
|
||||||
|
#include "Scene/SHSceneManager.h"
|
||||||
#include "Serialization/SHSerialization.h"
|
#include "Serialization/SHSerialization.h"
|
||||||
|
#include "Serialization/Configurations/SHConfigurationManager.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -75,13 +80,17 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
if (ImGui::BeginMenu("File"))
|
if (ImGui::BeginMenu("File"))
|
||||||
{
|
{
|
||||||
|
if(ImGui::Selectable("New Scene"))
|
||||||
|
{
|
||||||
|
SHSystemManager::GetSystem<SHEditor>()->NewScene();
|
||||||
|
}
|
||||||
if(ImGui::Selectable("Save"))
|
if(ImGui::Selectable("Save"))
|
||||||
{
|
{
|
||||||
SHSerialization::SerializeSceneToFile("../../Assets/Scenes/Test.SHADE");
|
SHSystemManager::GetSystem<SHEditor>()->SaveScene();
|
||||||
}
|
}
|
||||||
if(ImGui::Selectable("Load"))
|
if(ImGui::Selectable("Load"))
|
||||||
{
|
{
|
||||||
SHSerialization::DeserializeSceneFromFile("../../Assets/Scenes/Test.SHADE");
|
//SHSystemManager::GetSystem<SHEditor>()->LoadScene()
|
||||||
}
|
}
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
@ -108,16 +117,22 @@ namespace SHADE
|
||||||
auto* scriptEngine = static_cast<SHScriptEngine*>(SHSystemManager::GetSystem<SHScriptEngine>());
|
auto* scriptEngine = static_cast<SHScriptEngine*>(SHSystemManager::GetSystem<SHScriptEngine>());
|
||||||
scriptEngine->GenerateScriptsCsProjFile();
|
scriptEngine->GenerateScriptsCsProjFile();
|
||||||
}
|
}
|
||||||
|
ImGui::BeginDisabled(SHSystemManager::GetSystem<SHEditor>()->editorState != SHEditor::State::STOP);
|
||||||
if (ImGui::Selectable("Build Scripts - Debug"))
|
if (ImGui::Selectable("Build Scripts - Debug"))
|
||||||
{
|
{
|
||||||
auto* scriptEngine = static_cast<SHScriptEngine*>(SHSystemManager::GetSystem<SHScriptEngine>());
|
auto* scriptEngine = static_cast<SHScriptEngine*>(SHSystemManager::GetSystem<SHScriptEngine>());
|
||||||
|
SHSerialization::SerializeSceneToFile(SHSceneManager::GetCurrentSceneAssetID());
|
||||||
scriptEngine->BuildScriptAssembly(true, true);
|
scriptEngine->BuildScriptAssembly(true, true);
|
||||||
|
SHSceneManager::RestartScene(SHSceneManager::GetCurrentSceneAssetID());
|
||||||
}
|
}
|
||||||
if (ImGui::Selectable("Build Scripts - Release"))
|
if (ImGui::Selectable("Build Scripts - Release"))
|
||||||
{
|
{
|
||||||
auto* scriptEngine = static_cast<SHScriptEngine*>(SHSystemManager::GetSystem<SHScriptEngine>());
|
auto* scriptEngine = static_cast<SHScriptEngine*>(SHSystemManager::GetSystem<SHScriptEngine>());
|
||||||
scriptEngine->BuildScriptAssembly(false, true);
|
SHSerialization::SerializeSceneToFile(SHSceneManager::GetCurrentSceneAssetID());
|
||||||
|
scriptEngine->BuildScriptAssembly(false, true);
|
||||||
|
SHSceneManager::RestartScene(SHSceneManager::GetCurrentSceneAssetID());
|
||||||
}
|
}
|
||||||
|
ImGui::EndDisabled();
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -155,6 +170,35 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
ImGui::EndMenu();
|
ImGui::EndMenu();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (ImGui::BeginMenu("Application Config"))
|
||||||
|
{
|
||||||
|
auto& appConfig = SHConfigurationManager::applicationConfig;
|
||||||
|
ImGui::InputText("Window Title", &appConfig.windowTitle);
|
||||||
|
ImGui::Checkbox("Start in Fullscreen", &appConfig.startInFullScreen);
|
||||||
|
SHEditorWidgets::DragN<float, 2>("Window Size", { "Width", "Height" }, { &appConfig.windowSize.x, &appConfig.windowSize.y });
|
||||||
|
//ImGui::InputScalar("Starting Scene", ImGuiDataType_U32, &appConfig.startingSceneID);
|
||||||
|
auto sceneAsset = SHAssetManager::GetData<SHSceneAsset>(appConfig.startingSceneID);
|
||||||
|
|
||||||
|
if(ImGui::BeginCombo("Starting Scne", sceneAsset ? sceneAsset->name.data() : ""))
|
||||||
|
{
|
||||||
|
auto scenes = SHAssetManager::GetAllRecordOfType(AssetType::SCENE);
|
||||||
|
for(auto const& scene : scenes)
|
||||||
|
{
|
||||||
|
if(ImGui::Selectable(scene.name.data()))
|
||||||
|
{
|
||||||
|
appConfig.startingSceneID = scene.id;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
ImGui::EndCombo();
|
||||||
|
}
|
||||||
|
if (ImGui::Button("Save"))
|
||||||
|
{
|
||||||
|
SHConfigurationManager::SaveApplicationConfig();
|
||||||
|
}
|
||||||
|
ImGui::EndMenu();
|
||||||
|
}
|
||||||
|
|
||||||
ImGui::EndMainMenuBar();
|
ImGui::EndMainMenuBar();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -175,13 +219,16 @@ 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))
|
||||||
{
|
{
|
||||||
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
if(editor->SaveScene())
|
||||||
{
|
{
|
||||||
.previousState = editor->editorState
|
const SHEditorStateChangeEvent STATE_CHANGE_EVENT
|
||||||
};
|
{
|
||||||
editor->editorState = SHEditor::State::PLAY;
|
.previousState = editor->editorState
|
||||||
|
};
|
||||||
|
editor->editorState = SHEditor::State::PLAY;
|
||||||
|
|
||||||
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_PLAY_EVENT);
|
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_PLAY_EVENT);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PAUSE);
|
ImGui::BeginDisabled(editor->editorState == SHEditor::State::PAUSE);
|
||||||
|
@ -206,6 +253,7 @@ namespace SHADE
|
||||||
editor->editorState = SHEditor::State::STOP;
|
editor->editorState = SHEditor::State::STOP;
|
||||||
|
|
||||||
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_STOP_EVENT);
|
SHEventManager::BroadcastEvent<SHEditorStateChangeEvent>(STATE_CHANGE_EVENT, SH_EDITOR_ON_STOP_EVENT);
|
||||||
|
editor->LoadScene(SHSceneManager::GetCurrentSceneAssetID());
|
||||||
}
|
}
|
||||||
ImGui::EndDisabled();
|
ImGui::EndDisabled();
|
||||||
ImGui::EndMenuBar();
|
ImGui::EndMenuBar();
|
||||||
|
|
|
@ -45,7 +45,11 @@
|
||||||
#include <backends/imgui_impl_sdl.h>
|
#include <backends/imgui_impl_sdl.h>
|
||||||
#include <backends/imgui_impl_vulkan.h>
|
#include <backends/imgui_impl_vulkan.h>
|
||||||
|
|
||||||
|
#include "Assets/SHAssetManager.h"
|
||||||
|
#include "Assets/Asset Types/SHSceneAsset.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHMousePickSystem.h"
|
#include "Graphics/MiddleEnd/Interface/SHMousePickSystem.h"
|
||||||
|
#include "Scene/SHSceneManager.h"
|
||||||
|
#include "Serialization/SHSerialization.h"
|
||||||
#include "Tools/SHDebugDraw.h"
|
#include "Tools/SHDebugDraw.h"
|
||||||
|
|
||||||
RTTR_REGISTRATION
|
RTTR_REGISTRATION
|
||||||
|
@ -147,7 +151,9 @@ namespace SHADE
|
||||||
window->Update();
|
window->Update();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
RenderSceneNamePrompt();
|
||||||
|
RenderUnsavedChangesPrompt();
|
||||||
//PollPicking();
|
//PollPicking();
|
||||||
|
|
||||||
if(ImGui::IsKeyDown(ImGuiKey_LeftShift) && ImGui::IsKeyDown(ImGuiKey_LeftCtrl) && ImGui::IsKeyReleased(ImGuiKey_Z))
|
if(ImGui::IsKeyDown(ImGuiKey_LeftShift) && ImGui::IsKeyDown(ImGuiKey_LeftCtrl) && ImGui::IsKeyReleased(ImGuiKey_Z))
|
||||||
|
@ -172,6 +178,60 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHEditor::RenderSceneNamePrompt() noexcept
|
||||||
|
{
|
||||||
|
if(isSceneNamePromptOpen)
|
||||||
|
{
|
||||||
|
ImGui::OpenPopup(sceneNamePromptName.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ImGui::BeginPopupModal(sceneNamePromptName.data(), &isSceneNamePromptOpen))
|
||||||
|
{
|
||||||
|
static std::string newSceneName{};
|
||||||
|
ImGui::Text("Enter new scene name");
|
||||||
|
ImGui::InputText("##name", &newSceneName);
|
||||||
|
ImGui::BeginDisabled(newSceneName.empty());
|
||||||
|
if(ImGui::Button("Save"))
|
||||||
|
{
|
||||||
|
SaveScene(newSceneName);
|
||||||
|
newSceneName.clear();
|
||||||
|
isSceneNamePromptOpen = false;
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
}
|
||||||
|
ImGui::EndDisabled();
|
||||||
|
ImGui::SameLine();
|
||||||
|
if(ImGui::Button("Cancel"))
|
||||||
|
{
|
||||||
|
isSceneNamePromptOpen = false;
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
}
|
||||||
|
ImGui::EndPopup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditor::RenderUnsavedChangesPrompt() noexcept
|
||||||
|
{
|
||||||
|
if(isUnsavedChangesPromptOpen)
|
||||||
|
{
|
||||||
|
ImGui::OpenPopup(unsavedChangesPromptName.data());
|
||||||
|
}
|
||||||
|
|
||||||
|
if(ImGui::BeginPopupModal(unsavedChangesPromptName.data(), &isUnsavedChangesPromptOpen))
|
||||||
|
{
|
||||||
|
ImGui::Text("You have unsaved changes!");
|
||||||
|
if(ImGui::Button("Save"))
|
||||||
|
{
|
||||||
|
isSceneNamePromptOpen = true;
|
||||||
|
}
|
||||||
|
ImGui::SameLine();
|
||||||
|
if(ImGui::Button("Cancel"))
|
||||||
|
{
|
||||||
|
isUnsavedChangesPromptOpen = false;
|
||||||
|
ImGui::CloseCurrentPopup();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SHEditor::InitLayout() noexcept
|
void SHEditor::InitLayout() noexcept
|
||||||
{
|
{
|
||||||
if(!std::filesystem::exists(io->IniFilename))
|
if(!std::filesystem::exists(io->IniFilename))
|
||||||
|
@ -473,6 +533,66 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHEditor::NewScene()
|
||||||
|
{
|
||||||
|
if(shWindow->IsUnsavedChanges())
|
||||||
|
{
|
||||||
|
//Unsaved changes prompt
|
||||||
|
sceneToLoad = 0;
|
||||||
|
isUnsavedChangesPromptOpen = true;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SHSceneManager::RestartScene(0);
|
||||||
|
shWindow->ToggleUnsavedChanges();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
bool SHEditor::SaveScene(std::string const& newSceneName)
|
||||||
|
{
|
||||||
|
auto const data = SHAssetManager::GetData<SHSceneAsset>(SHSceneManager::GetCurrentSceneAssetID());
|
||||||
|
if (!data)
|
||||||
|
{
|
||||||
|
if (newSceneName.empty())
|
||||||
|
{
|
||||||
|
//Prompt for scene name
|
||||||
|
isSceneNamePromptOpen = true;
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
//Else We have a new name
|
||||||
|
|
||||||
|
SHSceneManager::SetCurrentSceneName(newSceneName);
|
||||||
|
SHSceneManager::SetCurrentSceneAssetID(SHAssetManager::CreateNewAsset(AssetType::SCENE, newSceneName));
|
||||||
|
}
|
||||||
|
//Get data, if data is null, asset doesn't exist, prompt for a name and create a new asset with the name
|
||||||
|
|
||||||
|
//serialize the scene
|
||||||
|
if(SHSerialization::SerializeSceneToFile(SHSceneManager::GetCurrentSceneAssetID()))
|
||||||
|
{
|
||||||
|
if(shWindow->IsUnsavedChanges())
|
||||||
|
shWindow->ToggleUnsavedChanges();
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHEditor::LoadScene(AssetID const& assetID) noexcept
|
||||||
|
{
|
||||||
|
if(shWindow->IsUnsavedChanges())
|
||||||
|
{
|
||||||
|
//Unsaved changes prompt
|
||||||
|
isUnsavedChangesPromptOpen = true;
|
||||||
|
sceneToLoad = assetID;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
//Load the scene
|
||||||
|
sceneToLoad = 0;
|
||||||
|
SHSceneManager::RestartScene(assetID);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void SHEditor::NewFrame()
|
void SHEditor::NewFrame()
|
||||||
{
|
{
|
||||||
SDL_Event event;
|
SDL_Event event;
|
||||||
|
|
|
@ -16,15 +16,18 @@
|
||||||
#include "Resource/SHHandle.h"
|
#include "Resource/SHHandle.h"
|
||||||
#include "EditorWindow/SHEditorWindow.h"
|
#include "EditorWindow/SHEditorWindow.h"
|
||||||
#include "Tools/SHLog.h"
|
#include "Tools/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"
|
||||||
|
#include "Graphics/Windowing/SHWindow.h"
|
||||||
|
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
//|| Library Includes ||
|
//|| Library Includes ||
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
#include <SDL_video.h>
|
#include <SDL_video.h>
|
||||||
|
|
||||||
|
#include "Assets/SHAssetMacros.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
//#==============================================================#
|
//#==============================================================#
|
||||||
|
@ -171,9 +174,16 @@ namespace SHADE
|
||||||
void InitBackend();
|
void InitBackend();
|
||||||
|
|
||||||
void SetSDLWindow(SDL_Window* inSDLWindow){sdlWindow = inSDLWindow;};
|
void SetSDLWindow(SDL_Window* inSDLWindow){sdlWindow = inSDLWindow;};
|
||||||
|
void SetSHWindow(SHWindow* inWindow){shWindow = inWindow;}
|
||||||
|
|
||||||
void PollPicking();
|
void PollPicking();
|
||||||
|
|
||||||
|
void NewScene();
|
||||||
|
|
||||||
|
bool SaveScene(std::string const& newSceneName = {});
|
||||||
|
|
||||||
|
void LoadScene(AssetID const& assetID) noexcept;
|
||||||
|
|
||||||
// List of selected entities
|
// List of selected entities
|
||||||
std::vector<EntityID> selectedEntities;
|
std::vector<EntityID> selectedEntities;
|
||||||
|
|
||||||
|
@ -191,6 +201,10 @@ namespace SHADE
|
||||||
*/
|
*/
|
||||||
void Render();
|
void Render();
|
||||||
|
|
||||||
|
void RenderSceneNamePrompt() noexcept;
|
||||||
|
|
||||||
|
void RenderUnsavedChangesPrompt() noexcept;
|
||||||
|
|
||||||
void InitLayout() noexcept;
|
void InitLayout() noexcept;
|
||||||
|
|
||||||
void InitFonts() noexcept;
|
void InitFonts() noexcept;
|
||||||
|
@ -199,12 +213,22 @@ namespace SHADE
|
||||||
|
|
||||||
SHEventHandle onEditorStateChanged(SHEventPtr eventPtr);
|
SHEventHandle onEditorStateChanged(SHEventPtr eventPtr);
|
||||||
|
|
||||||
|
bool isSceneNamePromptOpen = false;
|
||||||
|
|
||||||
|
bool isUnsavedChangesPromptOpen = false;
|
||||||
|
|
||||||
|
static constexpr std::string_view sceneNamePromptName = "Save scene as...";
|
||||||
|
static constexpr std::string_view unsavedChangesPromptName = "Unsaved Changes";
|
||||||
|
|
||||||
|
AssetID sceneToLoad = 0;
|
||||||
|
|
||||||
// Handle to command pool used for ImGui Vulkan Backend
|
// Handle to command pool used for ImGui Vulkan Backend
|
||||||
Handle<SHVkCommandPool> imguiCommandPool;
|
Handle<SHVkCommandPool> imguiCommandPool;
|
||||||
// Handle to command buffer used for ImGui Vulkan Backend
|
// Handle to command buffer used for ImGui Vulkan Backend
|
||||||
Handle<SHVkCommandBuffer> imguiCommandBuffer;
|
Handle<SHVkCommandBuffer> imguiCommandBuffer;
|
||||||
|
|
||||||
SDL_Window* sdlWindow {nullptr};
|
SDL_Window* sdlWindow {nullptr};
|
||||||
|
SHWindow* shWindow {nullptr};
|
||||||
|
|
||||||
ImGuiIO* io{nullptr};
|
ImGuiIO* io{nullptr};
|
||||||
|
|
||||||
|
|
|
@ -88,6 +88,7 @@ namespace SHADE
|
||||||
/* Getter Functions */
|
/* Getter Functions */
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
Handle<SHVkPipeline> GetPipeline() const noexcept { return pipeline; };
|
Handle<SHVkPipeline> GetPipeline() const noexcept { return pipeline; };
|
||||||
|
bool IsEmpty() const noexcept { return subBatches.empty(); }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
|
|
|
@ -68,6 +68,10 @@ namespace SHADE
|
||||||
return;
|
return;
|
||||||
|
|
||||||
batch->Remove(renderable);
|
batch->Remove(renderable);
|
||||||
|
|
||||||
|
// If batch is empty, remove batch
|
||||||
|
if (batch->IsEmpty())
|
||||||
|
batches.erase(batch);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHSuperBatch::Clear() noexcept
|
void SHSuperBatch::Clear() noexcept
|
||||||
|
|
|
@ -14,7 +14,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
// STL Includes
|
// STL Includes
|
||||||
#include <algorithm>
|
#include <algorithm>
|
||||||
// Project Includes
|
// Project Includes
|
||||||
#include "../Meshes/SHMeshData.h"
|
#include "Assets/Asset Types/SHModelAsset.h"
|
||||||
#include "../Meshes/SHPrimitiveGenerator.h"
|
#include "../Meshes/SHPrimitiveGenerator.h"
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
#include "SHGraphicsSystem.h"
|
#include "SHGraphicsSystem.h"
|
||||||
|
|
|
@ -41,6 +41,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Resource/SHResourceManager.h"
|
#include "Resource/SHResourceManager.h"
|
||||||
#include "Graphics/SHVkUtil.h"
|
#include "Graphics/SHVkUtil.h"
|
||||||
#include "Graphics/RenderGraph/SHRenderGraphNodeCompute.h"
|
#include "Graphics/RenderGraph/SHRenderGraphNodeCompute.h"
|
||||||
|
#include "../Meshes/SHPrimitiveGenerator.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -259,7 +260,6 @@ namespace SHADE
|
||||||
// Generate world render graph
|
// Generate world render graph
|
||||||
worldRenderGraph->Generate();
|
worldRenderGraph->Generate();
|
||||||
|
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
/* BIND RENDER GRAPH TO RENDERER */
|
/* BIND RENDER GRAPH TO RENDERER */
|
||||||
/*-----------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------*/
|
||||||
|
@ -269,9 +269,6 @@ namespace SHADE
|
||||||
|
|
||||||
worldRenderer->SetCameraDirector(cameraSystem->CreateDirector());
|
worldRenderer->SetCameraDirector(cameraSystem->CreateDirector());
|
||||||
|
|
||||||
// Create default materials
|
|
||||||
defaultMaterial = AddMaterial(defaultVertShader, defaultFragShader, gBufferSubpass);
|
|
||||||
|
|
||||||
// Create debug draw pipeline
|
// Create debug draw pipeline
|
||||||
debugDrawPipeline = createDebugDrawPipeline(debugDrawNode->GetRenderpass(), debugDrawSubpass);
|
debugDrawPipeline = createDebugDrawPipeline(debugDrawNode->GetRenderpass(), debugDrawSubpass);
|
||||||
debugDrawDepthPipeline = createDebugDrawPipeline(debugDrawNodeDepth->GetRenderpass(), debugDrawDepthSubpass);
|
debugDrawDepthPipeline = createDebugDrawPipeline(debugDrawNodeDepth->GetRenderpass(), debugDrawDepthSubpass);
|
||||||
|
@ -313,7 +310,29 @@ namespace SHADE
|
||||||
|
|
||||||
lightingSubSystem = resourceManager.Create<SHLightingSubSystem>();
|
lightingSubSystem = resourceManager.Create<SHLightingSubSystem>();
|
||||||
lightingSubSystem->Init(device, descPool);
|
lightingSubSystem->Init(device, descPool);
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHGraphicsSystem::InitBuiltInResources(void)
|
||||||
|
{
|
||||||
|
// Create default texture
|
||||||
|
std::array<SHTexture::PixelChannel, 4> defaultTextureData = { 255, 255, 255, 255 };
|
||||||
|
std::vector<uint32_t> mipOffsets{};
|
||||||
|
mipOffsets.push_back(0);
|
||||||
|
defaultTexture = AddTexture(4, defaultTextureData.data(), 1, 1, SHTexture::TextureFormat::eR8G8B8A8Unorm, mipOffsets);
|
||||||
|
BuildTextures();
|
||||||
|
|
||||||
|
// Create default meshes
|
||||||
|
primitiveMeshes[static_cast<int>(PrimitiveType::Cube)] = SHPrimitiveGenerator::Cube(meshLibrary);
|
||||||
|
primitiveMeshes[static_cast<int>(PrimitiveType::Sphere)] = SHPrimitiveGenerator::Sphere(meshLibrary);
|
||||||
|
BuildMeshBuffers();
|
||||||
|
|
||||||
|
// Create default materials
|
||||||
|
defaultMaterial = AddMaterial
|
||||||
|
(
|
||||||
|
defaultVertShader, defaultFragShader,
|
||||||
|
worldRenderGraph->GetNode("G-Buffer")->GetSubpass("G-Buffer Write")
|
||||||
|
);
|
||||||
|
defaultMaterial->SetProperty("data.textureIndex", defaultTexture->TextureArrayIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef SHEDITOR
|
#ifdef SHEDITOR
|
||||||
|
@ -356,8 +375,7 @@ namespace SHADE
|
||||||
InitBoilerplate();
|
InitBoilerplate();
|
||||||
InitMiddleEnd();
|
InitMiddleEnd();
|
||||||
InitSubsystems();
|
InitSubsystems();
|
||||||
|
InitBuiltInResources();
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHGraphicsSystem::Exit(void)
|
void SHGraphicsSystem::Exit(void)
|
||||||
|
@ -682,7 +700,7 @@ namespace SHADE
|
||||||
|
|
||||||
SHADE::Handle<SHADE::SHMaterialInstance> SHGraphicsSystem::AddMaterialInstanceCopy(Handle<SHMaterialInstance> materialInst)
|
SHADE::Handle<SHADE::SHMaterialInstance> SHGraphicsSystem::AddMaterialInstanceCopy(Handle<SHMaterialInstance> materialInst)
|
||||||
{
|
{
|
||||||
return resourceManager.Create<SHMaterialInstance>(materialInst->GetBaseMaterial());
|
return resourceManager.Create<SHMaterialInstance>(materialInst->GetBaseMaterial());
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHGraphicsSystem::RemoveMaterialInstance(Handle<SHMaterialInstance> materialInstance)
|
void SHGraphicsSystem::RemoveMaterialInstance(Handle<SHMaterialInstance> materialInstance)
|
||||||
|
@ -695,26 +713,38 @@ namespace SHADE
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
SHADE::Handle<SHADE::SHMesh> SHGraphicsSystem::AddMesh(uint32_t vertexCount, const SHMesh::VertexPosition* const positions, const SHMesh::VertexTexCoord* const texCoords, const SHMesh::VertexTangent* const tangents, const SHMesh::VertexNormal* const normals, uint32_t indexCount, const SHMesh::Index* const indices)
|
SHADE::Handle<SHADE::SHMesh> SHGraphicsSystem::AddMesh(uint32_t vertexCount, const SHMesh::VertexPosition* const positions, const SHMesh::VertexTexCoord* const texCoords, const SHMesh::VertexTangent* const tangents, const SHMesh::VertexNormal* const normals, uint32_t indexCount, const SHMesh::Index* const indices)
|
||||||
{
|
{
|
||||||
return meshLibrary.AddMesh(vertexCount, positions, texCoords, tangents, normals, indexCount, indices);
|
return meshLibrary.AddMesh(vertexCount, positions, texCoords, tangents, normals, indexCount, indices);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHGraphicsSystem::RemoveMesh(Handle<SHMesh> mesh)
|
void SHGraphicsSystem::RemoveMesh(Handle<SHMesh> mesh)
|
||||||
{
|
{
|
||||||
meshLibrary.RemoveMesh(mesh);
|
meshLibrary.RemoveMesh(mesh);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHGraphicsSystem::BuildMeshBuffers()
|
void SHGraphicsSystem::BuildMeshBuffers()
|
||||||
{
|
{
|
||||||
transferCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
transferCmdBuffer = graphicsCmdPool->RequestCommandBuffer(SH_CMD_BUFFER_TYPE::PRIMARY);
|
||||||
device->WaitIdle();
|
device->WaitIdle();
|
||||||
transferCmdBuffer->BeginRecording();
|
transferCmdBuffer->BeginRecording();
|
||||||
meshLibrary.BuildBuffers(device, transferCmdBuffer);
|
meshLibrary.BuildBuffers(device, transferCmdBuffer);
|
||||||
transferCmdBuffer->EndRecording();
|
transferCmdBuffer->EndRecording();
|
||||||
graphicsQueue->SubmitCommandBuffer({ transferCmdBuffer });
|
graphicsQueue->SubmitCommandBuffer({ transferCmdBuffer });
|
||||||
device->WaitIdle();
|
device->WaitIdle();
|
||||||
transferCmdBuffer.Free(); transferCmdBuffer = {};
|
transferCmdBuffer.Free(); transferCmdBuffer = {};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Handle<SHMesh> SHGraphicsSystem::GetMeshPrimitive(PrimitiveType type) const noexcept
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case PrimitiveType::Cube:
|
||||||
|
case PrimitiveType::Sphere:
|
||||||
|
return primitiveMeshes[static_cast<int>(type)];
|
||||||
|
default:
|
||||||
|
return {};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Texture Registration Functions */
|
/* Texture Registration Functions */
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
@ -764,6 +794,7 @@ namespace SHADE
|
||||||
|
|
||||||
void SHGraphicsSystem::BeginRoutine::Execute(double) noexcept
|
void SHGraphicsSystem::BeginRoutine::Execute(double) noexcept
|
||||||
{
|
{
|
||||||
|
SHResourceManager::FinaliseChanges();
|
||||||
reinterpret_cast<SHGraphicsSystem*>(system)->BeginRender();
|
reinterpret_cast<SHGraphicsSystem*>(system)->BeginRender();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -789,7 +820,6 @@ namespace SHADE
|
||||||
void SHGraphicsSystem::EndRoutine::Execute(double) noexcept
|
void SHGraphicsSystem::EndRoutine::Execute(double) noexcept
|
||||||
{
|
{
|
||||||
reinterpret_cast<SHGraphicsSystem*>(system)->EndRender();
|
reinterpret_cast<SHGraphicsSystem*>(system)->EndRender();
|
||||||
SHResourceManager::FinaliseChanges();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------------*/
|
||||||
|
@ -801,16 +831,11 @@ namespace SHADE
|
||||||
|
|
||||||
void SHGraphicsSystem::BatcherDispatcherRoutine::Execute(double) noexcept
|
void SHGraphicsSystem::BatcherDispatcherRoutine::Execute(double) noexcept
|
||||||
{
|
{
|
||||||
auto& renderables = SHComponentManager::GetDense<SHRenderable>();
|
auto& renderables = SHComponentManager::GetDense<SHRenderable>();
|
||||||
for (auto& renderable : renderables)
|
for (auto& renderable : renderables)
|
||||||
{
|
{
|
||||||
if (!renderable.HasChanged())
|
if (!renderable.HasChanged())
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
if (!renderable.GetMesh())
|
|
||||||
{
|
|
||||||
SHLOG_CRITICAL("NULL Mesh provided!");
|
|
||||||
}
|
|
||||||
|
|
||||||
// Remove from the SuperBatch it is previously in (prevMat if mat has changed)
|
// Remove from the SuperBatch it is previously in (prevMat if mat has changed)
|
||||||
Handle<SHMaterialInstance> prevMaterial = renderable.HasMaterialChanged() ? renderable.GetPrevMaterial() : renderable.GetMaterial();
|
Handle<SHMaterialInstance> prevMaterial = renderable.HasMaterialChanged() ? renderable.GetPrevMaterial() : renderable.GetMaterial();
|
||||||
|
@ -821,8 +846,9 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
|
|
||||||
// Add to new SuperBatch if there is a material
|
// Add to new SuperBatch if there is a material
|
||||||
|
// Add to new SuperBatch if there is a material and a mesh to render
|
||||||
Handle<SHMaterialInstance> newMatInstance = renderable.GetMaterial();
|
Handle<SHMaterialInstance> newMatInstance = renderable.GetMaterial();
|
||||||
if (newMatInstance)
|
if (newMatInstance && renderable.GetMesh())
|
||||||
{
|
{
|
||||||
Handle<SHSuperBatch> newSuperBatch = newMatInstance->GetBaseMaterial()->GetPipeline()->GetPipelineState().GetSubpass()->GetSuperBatch();
|
Handle<SHSuperBatch> newSuperBatch = newMatInstance->GetBaseMaterial()->GetPipeline()->GetPipelineState().GetSubpass()->GetSuperBatch();
|
||||||
newSuperBatch->Add(&renderable);
|
newSuperBatch->Add(&renderable);
|
||||||
|
|
|
@ -58,6 +58,19 @@ namespace SHADE
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
/* Type Definitions */
|
/* Type Definitions */
|
||||||
/*---------------------------------------------------------------------------------*/
|
/*---------------------------------------------------------------------------------*/
|
||||||
|
/***********************************************************************************/
|
||||||
|
/*!
|
||||||
|
\brief
|
||||||
|
Type of built-in primitive meshes that are available.
|
||||||
|
*/
|
||||||
|
/***********************************************************************************/
|
||||||
|
enum class PrimitiveType
|
||||||
|
{
|
||||||
|
Cube,
|
||||||
|
Sphere
|
||||||
|
};
|
||||||
|
static constexpr int MAX_PRIMITIVE_TYPES = 2;
|
||||||
|
|
||||||
/***********************************************************************************/
|
/***********************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
\brief
|
\brief
|
||||||
|
@ -72,6 +85,7 @@ namespace SHADE
|
||||||
void InitSceneRenderGraph (void) noexcept;
|
void InitSceneRenderGraph (void) noexcept;
|
||||||
void InitMiddleEnd (void) noexcept;
|
void InitMiddleEnd (void) noexcept;
|
||||||
void InitSubsystems (void) noexcept;
|
void InitSubsystems (void) noexcept;
|
||||||
|
void InitBuiltInResources (void);
|
||||||
|
|
||||||
#ifdef SHEDITOR
|
#ifdef SHEDITOR
|
||||||
void InitEditorRenderGraph (void) noexcept;
|
void InitEditorRenderGraph (void) noexcept;
|
||||||
|
@ -81,25 +95,25 @@ namespace SHADE
|
||||||
class SH_API BeginRoutine final : public SHSystemRoutine
|
class SH_API BeginRoutine final : public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BeginRoutine();
|
BeginRoutine();
|
||||||
virtual void Execute(double dt) noexcept override final;
|
virtual void Execute(double dt) noexcept override final;
|
||||||
};
|
};
|
||||||
class SH_API RenderRoutine final : public SHSystemRoutine
|
class SH_API RenderRoutine final : public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
RenderRoutine();
|
RenderRoutine();
|
||||||
virtual void Execute(double dt) noexcept override final;
|
virtual void Execute(double dt) noexcept override final;
|
||||||
};
|
};
|
||||||
class SH_API EndRoutine final : public SHSystemRoutine
|
class SH_API EndRoutine final : public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
EndRoutine();
|
EndRoutine();
|
||||||
virtual void Execute(double dt) noexcept override final;
|
virtual void Execute(double dt) noexcept override final;
|
||||||
};
|
};
|
||||||
class SH_API BatcherDispatcherRoutine final : public SHSystemRoutine
|
class SH_API BatcherDispatcherRoutine final : public SHSystemRoutine
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
BatcherDispatcherRoutine();
|
BatcherDispatcherRoutine();
|
||||||
virtual void Execute(double dt) noexcept override final;
|
virtual void Execute(double dt) noexcept override final;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -152,34 +166,34 @@ namespace SHADE
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
\brief
|
\brief
|
||||||
Adds a mesh to the Mesh Library. But this does not mean that the meshes have
|
Adds a mesh to the Mesh Library. But this does not mean that the meshes have
|
||||||
been added yet. A call to "BuildBuffers()" is required to transfer all
|
been added yet. A call to "BuildBuffers()" is required to transfer all
|
||||||
meshes into the GPU.
|
meshes into the GPU.
|
||||||
|
|
||||||
\param vertexCount
|
\param vertexCount
|
||||||
Number of vertices in this Mesh.
|
Number of vertices in this Mesh.
|
||||||
\param positions
|
\param positions
|
||||||
Pointer to the first in a contiguous array of SHMathVec3s that define vertex
|
Pointer to the first in a contiguous array of SHMathVec3s that define vertex
|
||||||
positions.
|
positions.
|
||||||
\param texCoords
|
\param texCoords
|
||||||
Pointer to the first in a contiguous array of SHMathVec2s that define vertex
|
Pointer to the first in a contiguous array of SHMathVec2s that define vertex
|
||||||
texture coordinates.
|
texture coordinates.
|
||||||
\param tangents
|
\param tangents
|
||||||
Pointer to the first in a contiguous array of SHMathVec3s that define vertex
|
Pointer to the first in a contiguous array of SHMathVec3s that define vertex
|
||||||
tangents.
|
tangents.
|
||||||
\param normals
|
\param normals
|
||||||
Pointer to the first in a contiguous array of SHMathVec3s that define vertex
|
Pointer to the first in a contiguous array of SHMathVec3s that define vertex
|
||||||
normals.
|
normals.
|
||||||
\param indexCount
|
\param indexCount
|
||||||
Number of indices in this mesh.
|
Number of indices in this mesh.
|
||||||
\param indices
|
\param indices
|
||||||
Pointer to the first in a contiguous array of uint32_ts that define mesh
|
Pointer to the first in a contiguous array of uint32_ts that define mesh
|
||||||
indices.
|
indices.
|
||||||
|
|
||||||
\return
|
\return
|
||||||
Handle to the created Mesh. This is not valid to be used until a call to
|
Handle to the created Mesh. This is not valid to be used until a call to
|
||||||
BuildBuffers().
|
BuildBuffers().
|
||||||
|
|
||||||
*/
|
*/
|
||||||
/*******************************************************************************/
|
/*******************************************************************************/
|
||||||
|
@ -188,9 +202,9 @@ namespace SHADE
|
||||||
/*!
|
/*!
|
||||||
|
|
||||||
\brief
|
\brief
|
||||||
Removes a mesh from the MeshLibrary. But this does not mean that the meshes
|
Removes a mesh from the MeshLibrary. But this does not mean that the meshes
|
||||||
have been removed yet. A call to "BuildBuffers()" is required to finalise all
|
have been removed yet. A call to "BuildBuffers()" is required to finalise all
|
||||||
changes.
|
changes.
|
||||||
|
|
||||||
\param mesh
|
\param mesh
|
||||||
Handle to the mesh to remove.
|
Handle to the mesh to remove.
|
||||||
|
@ -207,6 +221,21 @@ namespace SHADE
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
void BuildMeshBuffers();
|
void BuildMeshBuffers();
|
||||||
|
/*******************************************************************************/
|
||||||
|
/*!
|
||||||
|
|
||||||
|
\brief
|
||||||
|
Retrieves the built-in mesh specified.
|
||||||
|
|
||||||
|
\param type
|
||||||
|
Type of built-in mesh to retrieve.
|
||||||
|
|
||||||
|
\returns
|
||||||
|
Handle to the mesh that was specfied. However, if an invalid type is specified,
|
||||||
|
a null Handle will be returned.
|
||||||
|
*/
|
||||||
|
/*******************************************************************************/
|
||||||
|
Handle<SHMesh> GetMeshPrimitive(PrimitiveType type) const noexcept;
|
||||||
|
|
||||||
/*-----------------------------------------------------------------------------*/
|
/*-----------------------------------------------------------------------------*/
|
||||||
/* Texture Registration Functions */
|
/* Texture Registration Functions */
|
||||||
|
@ -278,6 +307,18 @@ namespace SHADE
|
||||||
*/
|
*/
|
||||||
/***************************************************************************/
|
/***************************************************************************/
|
||||||
Handle<SHTexture> GetTextureHandle(SHTexture::Index textureId) const;
|
Handle<SHTexture> GetTextureHandle(SHTexture::Index textureId) const;
|
||||||
|
/***************************************************************************/
|
||||||
|
/*!
|
||||||
|
*
|
||||||
|
\brief
|
||||||
|
Retrieves the handle to the default texture. A white 1x1 texture.
|
||||||
|
|
||||||
|
\returns
|
||||||
|
Handle to the default texture.
|
||||||
|
|
||||||
|
*/
|
||||||
|
/***************************************************************************/
|
||||||
|
Handle<SHTexture> GetDefaultTexture() const noexcept { return defaultTexture; }
|
||||||
|
|
||||||
void PrepareResize(uint32_t newWidth, uint32_t newHeight) noexcept;
|
void PrepareResize(uint32_t newWidth, uint32_t newHeight) noexcept;
|
||||||
void HandleResize(void) noexcept;
|
void HandleResize(void) noexcept;
|
||||||
|
@ -378,6 +419,13 @@ namespace SHADE
|
||||||
Handle<SHVkPipeline> debugDrawPipeline;
|
Handle<SHVkPipeline> debugDrawPipeline;
|
||||||
Handle<SHVkPipeline> debugDrawDepthPipeline;
|
Handle<SHVkPipeline> debugDrawDepthPipeline;
|
||||||
|
|
||||||
|
// Built-In Textures
|
||||||
|
Handle<SHTexture> defaultTexture;
|
||||||
|
|
||||||
|
// Built-In Meshes
|
||||||
|
std::array<Handle<SHMesh>, MAX_PRIMITIVE_TYPES> primitiveMeshes;
|
||||||
|
|
||||||
|
// Render Graphs
|
||||||
Handle<SHRenderGraph> worldRenderGraph;
|
Handle<SHRenderGraph> worldRenderGraph;
|
||||||
|
|
||||||
// Sub systems
|
// Sub systems
|
||||||
|
|
|
@ -1,36 +0,0 @@
|
||||||
/************************************************************************************//*!
|
|
||||||
\file SHPrimitiveGenerator.h
|
|
||||||
\author Tng Kah Wei, kahwei.tng, 390009620
|
|
||||||
\par email: kahwei.tng\@digipen.edu
|
|
||||||
\date Sep 18, 2022
|
|
||||||
\brief Contains the static class definition of SHPrimitiveGenerator.
|
|
||||||
|
|
||||||
Copyright (C) 2022 DigiPen Institute of Technology.
|
|
||||||
Reproduction or disclosure of this file or its contents without the prior written consent
|
|
||||||
of DigiPen Institute of Technology is prohibited.
|
|
||||||
*//*************************************************************************************/
|
|
||||||
#pragma once
|
|
||||||
|
|
||||||
// STL Includes
|
|
||||||
#include <vector>
|
|
||||||
// Project Includes
|
|
||||||
#include "Math/SHMath.h"
|
|
||||||
#include "Graphics/MiddleEnd/Interface/SHMeshLibrary.h"
|
|
||||||
|
|
||||||
namespace SHADE
|
|
||||||
{
|
|
||||||
/*************************************************************************************/
|
|
||||||
/*!
|
|
||||||
\brief
|
|
||||||
Static class that contains functions for generating 3D primitives.
|
|
||||||
*/
|
|
||||||
/*************************************************************************************/
|
|
||||||
struct SHMeshData
|
|
||||||
{
|
|
||||||
std::vector<SHMesh::VertexPosition> VertexPositions;
|
|
||||||
std::vector<SHMesh::VertexTexCoord> VertexTexCoords;
|
|
||||||
std::vector<SHMesh::VertexTangent> VertexTangents;
|
|
||||||
std::vector<SHMesh::VertexNormal> VertexNormals;
|
|
||||||
std::vector<SHMesh::Index> Indices;
|
|
||||||
};
|
|
||||||
}
|
|
|
@ -31,7 +31,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
SHMeshData mesh;
|
SHMeshData mesh;
|
||||||
|
|
||||||
mesh.VertexPositions =
|
mesh.VertexPositions =
|
||||||
{
|
{
|
||||||
// front
|
// front
|
||||||
SHVec3(-0.5f, -0.5f, 0.5f),
|
SHVec3(-0.5f, -0.5f, 0.5f),
|
||||||
|
@ -70,7 +70,7 @@ namespace SHADE
|
||||||
SHVec3(-0.5f, 0.5f, -0.5f)
|
SHVec3(-0.5f, 0.5f, -0.5f)
|
||||||
};
|
};
|
||||||
|
|
||||||
mesh.VertexTexCoords =
|
mesh.VertexTexCoords =
|
||||||
{
|
{
|
||||||
SHVec2(0.0f, 1.0f),
|
SHVec2(0.0f, 1.0f),
|
||||||
SHVec2(1.0f, 1.0f),
|
SHVec2(1.0f, 1.0f),
|
||||||
|
@ -108,7 +108,7 @@ namespace SHADE
|
||||||
SHVec2(0.0f, 0.0f)
|
SHVec2(0.0f, 0.0f)
|
||||||
};
|
};
|
||||||
|
|
||||||
mesh.VertexTangents =
|
mesh.VertexTangents =
|
||||||
{
|
{
|
||||||
// front
|
// front
|
||||||
SHVec3(1.0f, 0.0f, 0.0f),
|
SHVec3(1.0f, 0.0f, 0.0f),
|
||||||
|
@ -288,7 +288,7 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
return meshLibrary.AddMesh
|
return meshLibrary.AddMesh
|
||||||
(
|
(
|
||||||
static_cast<uint32_t>(meshData.VertexPositions.size()),
|
static_cast<uint32_t>(meshData.VertexPositions.size()),
|
||||||
meshData.VertexPositions.data(),
|
meshData.VertexPositions.data(),
|
||||||
meshData.VertexTexCoords.data(),
|
meshData.VertexTexCoords.data(),
|
||||||
meshData.VertexTangents.data(),
|
meshData.VertexTangents.data(),
|
||||||
|
@ -302,12 +302,12 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
return gfxSystem.AddMesh
|
return gfxSystem.AddMesh
|
||||||
(
|
(
|
||||||
static_cast<uint32_t>(meshData.VertexPositions.size()),
|
static_cast<uint32_t>(meshData.VertexPositions.size()),
|
||||||
meshData.VertexPositions.data(),
|
meshData.VertexPositions.data(),
|
||||||
meshData.VertexTexCoords.data(),
|
meshData.VertexTexCoords.data(),
|
||||||
meshData.VertexTangents.data(),
|
meshData.VertexTangents.data(),
|
||||||
meshData.VertexNormals.data(),
|
meshData.VertexNormals.data(),
|
||||||
static_cast<uint32_t>(meshData.Indices.size()),
|
static_cast<uint32_t>(meshData.Indices.size()),
|
||||||
meshData.Indices.data()
|
meshData.Indices.data()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
|
@ -13,7 +13,8 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
|
|
||||||
// Project Includes
|
// Project Includes
|
||||||
#include "Math/SHMath.h"
|
#include "Math/SHMath.h"
|
||||||
#include "SHMeshData.h"
|
#include "Assets/Asset Types/SHModelAsset.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHMeshLibrary.h"
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
|
|
@ -156,14 +156,15 @@ namespace SHADE
|
||||||
/* Build Descriptor Set with all the Textures only if there are textures */
|
/* Build Descriptor Set with all the Textures only if there are textures */
|
||||||
if (!texOrder.empty())
|
if (!texOrder.empty())
|
||||||
{
|
{
|
||||||
if (!texDescriptors)
|
if (texDescriptors)
|
||||||
{
|
{
|
||||||
texDescriptors = descPool->Allocate
|
texDescriptors.Free();
|
||||||
(
|
|
||||||
{ SHGraphicsGlobalData::GetDescSetLayouts()[SHGraphicsConstants::DescriptorSetIndex::STATIC_GLOBALS] },
|
|
||||||
{ static_cast<uint32_t>(texOrder.size()) }
|
|
||||||
);
|
|
||||||
}
|
}
|
||||||
|
texDescriptors = descPool->Allocate
|
||||||
|
(
|
||||||
|
{ SHGraphicsGlobalData::GetDescSetLayouts()[SHGraphicsConstants::DescriptorSetIndex::STATIC_GLOBALS] },
|
||||||
|
{ static_cast<uint32_t>(texOrder.size()) }
|
||||||
|
);
|
||||||
texDescriptors->ModifyWriteDescImage
|
texDescriptors->ModifyWriteDescImage
|
||||||
(
|
(
|
||||||
SHGraphicsConstants::DescriptorSetIndex::STATIC_GLOBALS,
|
SHGraphicsConstants::DescriptorSetIndex::STATIC_GLOBALS,
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
#include "Input/SHInputManager.h"
|
#include "Input/SHInputManager.h"
|
||||||
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
SHWindow::SHWindow()
|
SHWindow::SHWindow()
|
||||||
|
@ -151,11 +150,11 @@ namespace SHADE
|
||||||
SetWindowText(wndHWND, LPCWSTR(wndData.title.c_str()));
|
SetWindowText(wndHWND, LPCWSTR(wndData.title.c_str()));
|
||||||
}
|
}
|
||||||
|
|
||||||
SHWindow::SHVec2 SHWindow::GetPosition() const
|
SHWindow::WindowSize SHWindow::GetPosition() const
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
GetWindowRect(wndHWND, &rect);
|
GetWindowRect(wndHWND, &rect);
|
||||||
return SHVec2(static_cast<uint32_t>(rect.left), static_cast<uint32_t>(rect.top));
|
return WindowSize(static_cast<uint32_t>(rect.left), static_cast<uint32_t>(rect.top));
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHWindow::SetPosition(unsigned x, unsigned y)
|
void SHWindow::SetPosition(unsigned x, unsigned y)
|
||||||
|
@ -165,18 +164,18 @@ namespace SHADE
|
||||||
wndData.y = y;
|
wndData.y = y;
|
||||||
}
|
}
|
||||||
|
|
||||||
SHWindow::SHVec2 SHWindow::GetWindowSize() const
|
SHWindow::WindowSize SHWindow::GetWindowSize() const
|
||||||
{
|
{
|
||||||
RECT rect;
|
RECT rect;
|
||||||
GetClientRect(wndHWND, &rect);
|
GetClientRect(wndHWND, &rect);
|
||||||
return SHVec2(static_cast<uint32_t>(rect.right - rect.left), static_cast<uint32_t>(rect.bottom - rect.top));
|
return WindowSize(static_cast<uint32_t>(rect.right - rect.left), static_cast<uint32_t>(rect.bottom - rect.top));
|
||||||
}
|
}
|
||||||
|
|
||||||
SHWindow::SHVec2 SHWindow::GetCurrentDisplaySize() const
|
SHWindow::WindowSize SHWindow::GetCurrentDisplaySize() const
|
||||||
{
|
{
|
||||||
unsigned screenWidth = GetSystemMetrics(SM_CXSCREEN);
|
unsigned screenWidth = GetSystemMetrics(SM_CXSCREEN);
|
||||||
unsigned screenHeight = GetSystemMetrics(SM_CYSCREEN);
|
unsigned screenHeight = GetSystemMetrics(SM_CYSCREEN);
|
||||||
return SHVec2(screenWidth, screenHeight);
|
return WindowSize(screenWidth, screenHeight);
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHWindow::SetMouseVisible(bool show)
|
void SHWindow::SetMouseVisible(bool show)
|
||||||
|
@ -260,7 +259,7 @@ namespace SHADE
|
||||||
return wndHWND;
|
return wndHWND;
|
||||||
}
|
}
|
||||||
|
|
||||||
const WindowData SHWindow::GetWindowData() const
|
const WindowData SHWindow::GetWindowData() const noexcept
|
||||||
{
|
{
|
||||||
return wndData;
|
return wndData;
|
||||||
}
|
}
|
||||||
|
@ -287,6 +286,15 @@ namespace SHADE
|
||||||
windowCloseCallbacks.erase(callbackid);
|
windowCloseCallbacks.erase(callbackid);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHWindow::ToggleUnsavedChanges() noexcept
|
||||||
|
{
|
||||||
|
unsavedChanges = !unsavedChanges;
|
||||||
|
std::wstring title = wndData.title;
|
||||||
|
if(unsavedChanges)
|
||||||
|
title.append(L"*");
|
||||||
|
SetWindowText(wndHWND, title.data());
|
||||||
|
}
|
||||||
|
|
||||||
LRESULT SHWindow::WndProcStatic(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
LRESULT SHWindow::WndProcStatic(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam)
|
||||||
{
|
{
|
||||||
auto window = windowMap.GetWindow(hwnd);
|
auto window = windowMap.GetWindow(hwnd);
|
||||||
|
|
|
@ -74,7 +74,7 @@ namespace SHADE
|
||||||
class SH_API SHWindow
|
class SH_API SHWindow
|
||||||
{
|
{
|
||||||
public:
|
public:
|
||||||
using SHVec2 = std::pair<uint32_t, uint32_t>;
|
using WindowSize = std::pair<uint32_t, uint32_t>;
|
||||||
typedef std::function<void(uint32_t width, uint32_t height)> WindowResizeCallbackFn;
|
typedef std::function<void(uint32_t width, uint32_t height)> WindowResizeCallbackFn;
|
||||||
typedef std::function<void(void)> WindowCloseCallbackFn;
|
typedef std::function<void(void)> WindowCloseCallbackFn;
|
||||||
typedef uint16_t CALLBACKID;
|
typedef uint16_t CALLBACKID;
|
||||||
|
@ -92,15 +92,15 @@ namespace SHADE
|
||||||
|
|
||||||
void SetTitle(std::wstring title);
|
void SetTitle(std::wstring title);
|
||||||
|
|
||||||
SHVec2 GetPosition() const;
|
WindowSize GetPosition() const;
|
||||||
|
|
||||||
void SetPosition(unsigned x, unsigned y);
|
void SetPosition(unsigned x, unsigned y);
|
||||||
//void SetPosition(SHMathVec2U);
|
//void SetPosition(SHMathVec2U);
|
||||||
|
|
||||||
SHVec2 GetWindowSize() const;
|
WindowSize GetWindowSize() const;
|
||||||
|
|
||||||
//Get size of display the window is in (whichever window contains the window origin)
|
//Get size of display the window is in (whichever window contains the window origin)
|
||||||
SHVec2 GetCurrentDisplaySize() const;
|
WindowSize GetCurrentDisplaySize() const;
|
||||||
|
|
||||||
void SetMouseVisible(bool show);
|
void SetMouseVisible(bool show);
|
||||||
|
|
||||||
|
@ -123,7 +123,7 @@ namespace SHADE
|
||||||
|
|
||||||
HWND GetHWND();
|
HWND GetHWND();
|
||||||
|
|
||||||
const WindowData GetWindowData() const;
|
const WindowData GetWindowData() const noexcept;
|
||||||
|
|
||||||
CALLBACKID RegisterWindowSizeCallback(WindowResizeCallbackFn);
|
CALLBACKID RegisterWindowSizeCallback(WindowResizeCallbackFn);
|
||||||
void UnregisterWindowSizeCallback(CALLBACKID const& callbackid);
|
void UnregisterWindowSizeCallback(CALLBACKID const& callbackid);
|
||||||
|
@ -131,6 +131,8 @@ namespace SHADE
|
||||||
void UnregisterWindowCloseCallback(CALLBACKID const& callbackid);
|
void UnregisterWindowCloseCallback(CALLBACKID const& callbackid);
|
||||||
bool IsMinimized() const { return wndData.isMinimised; }
|
bool IsMinimized() const { return wndData.isMinimised; }
|
||||||
|
|
||||||
|
void ToggleUnsavedChanges() noexcept;
|
||||||
|
bool IsUnsavedChanges() const noexcept{return unsavedChanges;}
|
||||||
protected:
|
protected:
|
||||||
static LRESULT CALLBACK WndProcStatic(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
static LRESULT CALLBACK WndProcStatic(HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam);
|
||||||
|
|
||||||
|
@ -164,7 +166,8 @@ namespace SHADE
|
||||||
std::unordered_map<CALLBACKID, WindowCloseCallbackFn> windowCloseCallbacks;
|
std::unordered_map<CALLBACKID, WindowCloseCallbackFn> windowCloseCallbacks;
|
||||||
CALLBACKID windowResizeCallbackCount{};
|
CALLBACKID windowResizeCallbackCount{};
|
||||||
CALLBACKID windowCloseCallbackCount{};
|
CALLBACKID windowCloseCallbackCount{};
|
||||||
//TODO: Shift to events abstraction
|
|
||||||
|
bool unsavedChanges = false;
|
||||||
|
|
||||||
void OnCreate(HWND hwnd, LPCREATESTRUCT create_struct);
|
void OnCreate(HWND hwnd, LPCREATESTRUCT create_struct);
|
||||||
void OnClose();
|
void OnClose();
|
||||||
|
|
|
@ -19,7 +19,7 @@ namespace SHADE { class SHMaterial; }
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
#include "SHResourceLibrary.h"
|
#include "SHResourceLibrary.h"
|
||||||
#include "Assets/SHAssetMacros.h"
|
#include "Assets/SHAssetMacros.h"
|
||||||
#include "Assets/Asset Types/SHMeshAsset.h"
|
#include "Assets/Asset Types/SHModelAsset.h"
|
||||||
#include "Assets/Asset Types/SHTextureAsset.h"
|
#include "Assets/Asset Types/SHTextureAsset.h"
|
||||||
#include "Assets/Asset Types/SHShaderAsset.h"
|
#include "Assets/Asset Types/SHShaderAsset.h"
|
||||||
#include "Graphics/Shaders/SHVkShaderModule.h"
|
#include "Graphics/Shaders/SHVkShaderModule.h"
|
||||||
|
@ -36,7 +36,7 @@ namespace SHADE
|
||||||
/// </summary>
|
/// </summary>
|
||||||
template<typename T = void>
|
template<typename T = void>
|
||||||
struct SHResourceLoader { using AssetType = void; };
|
struct SHResourceLoader { using AssetType = void; };
|
||||||
template<> struct SHResourceLoader<SHMesh> { using AssetType = SHMeshAsset; };
|
template<> struct SHResourceLoader<SHMesh> { using AssetType = SHMeshData; };
|
||||||
template<> struct SHResourceLoader<SHTexture> { using AssetType = SHTextureAsset; };
|
template<> struct SHResourceLoader<SHTexture> { using AssetType = SHTextureAsset; };
|
||||||
template<> struct SHResourceLoader<SHVkShaderModule> { using AssetType = SHShaderAsset; };
|
template<> struct SHResourceLoader<SHVkShaderModule> { using AssetType = SHShaderAsset; };
|
||||||
template<> struct SHResourceLoader<SHMaterialSpec> { using AssetType = SHMaterialAsset; };
|
template<> struct SHResourceLoader<SHMaterialSpec> { using AssetType = SHMaterialAsset; };
|
||||||
|
|
|
@ -24,7 +24,7 @@ of DigiPen Institute of Technology is prohibited.
|
||||||
#include "Graphics/Shaders/SHVkShaderModule.h"
|
#include "Graphics/Shaders/SHVkShaderModule.h"
|
||||||
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
#include "Graphics/Devices/SHVkLogicalDevice.h"
|
||||||
#include "Graphics/MiddleEnd/Materials/SHMaterialSpec.h"
|
#include "Graphics/MiddleEnd/Materials/SHMaterialSpec.h"
|
||||||
#include "Serialization/SHSerializationHelper.hpp"
|
#include "Serialization/SHYAMLConverters.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -180,13 +180,13 @@ namespace SHADE
|
||||||
|
|
||||||
return gfxSystem->AddMesh
|
return gfxSystem->AddMesh
|
||||||
(
|
(
|
||||||
assetData.vertexPosition.size(),
|
assetData.VertexPositions.size(),
|
||||||
assetData.vertexPosition.data(),
|
assetData.VertexPositions.data(),
|
||||||
assetData.texCoords.data(),
|
assetData.VertexTexCoords.data(),
|
||||||
assetData.vertexTangent.data(),
|
assetData.VertexTangents.data(),
|
||||||
assetData.vertexNormal.data(),
|
assetData.VertexNormals.data(),
|
||||||
assetData.indices.size(),
|
assetData.Indices.size(),
|
||||||
assetData.indices.data()
|
assetData.Indices.data()
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
// Textures
|
// Textures
|
||||||
|
@ -282,6 +282,9 @@ namespace SHADE
|
||||||
case SHADE::SHShaderBlockInterface::Variable::Type::INT:
|
case SHADE::SHShaderBlockInterface::Variable::Type::INT:
|
||||||
{
|
{
|
||||||
Handle<SHTexture> texture = LoadOrGet<SHTexture>(PROP_NODE.as<int>());
|
Handle<SHTexture> texture = LoadOrGet<SHTexture>(PROP_NODE.as<int>());
|
||||||
|
// HACK: Need to split this out to a separate pass before loading the materials and subsequently, the scenes
|
||||||
|
gfxSystem->BuildTextures();
|
||||||
|
|
||||||
if (texture)
|
if (texture)
|
||||||
{
|
{
|
||||||
matHandle->SetProperty(VARIABLE->offset, texture->TextureArrayIndex);
|
matHandle->SetProperty(VARIABLE->offset, texture->TextureArrayIndex);
|
||||||
|
|
|
@ -13,6 +13,7 @@
|
||||||
|
|
||||||
#include <string>
|
#include <string>
|
||||||
#include "SHSceneGraph.h"
|
#include "SHSceneGraph.h"
|
||||||
|
#include "Assets/SHAssetMacros.h"
|
||||||
#include "ECS_Base/General/SHFamily.h"
|
#include "ECS_Base/General/SHFamily.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
|
@ -32,6 +33,7 @@ namespace SHADE
|
||||||
virtual ~SHScene() = default;
|
virtual ~SHScene() = default;
|
||||||
|
|
||||||
std::string sceneName;
|
std::string sceneName;
|
||||||
|
AssetID sceneAssetID;
|
||||||
|
|
||||||
SHSceneGraph& GetSceneGraph() noexcept { return sceneGraph; }
|
SHSceneGraph& GetSceneGraph() noexcept { return sceneGraph; }
|
||||||
|
|
||||||
|
|
|
@ -29,7 +29,7 @@ namespace SHADE
|
||||||
std::string SHSceneManager::newSceneName{};
|
std::string SHSceneManager::newSceneName{};
|
||||||
uint32_t SHSceneManager::currentSceneID = UINT32_MAX;
|
uint32_t SHSceneManager::currentSceneID = UINT32_MAX;
|
||||||
uint32_t SHSceneManager::nextSceneID = UINT32_MAX;
|
uint32_t SHSceneManager::nextSceneID = UINT32_MAX;
|
||||||
|
AssetID SHSceneManager::currentSceneAssetID{};
|
||||||
|
|
||||||
SHScene* SHSceneManager::currentScene = nullptr;
|
SHScene* SHSceneManager::currentScene = nullptr;
|
||||||
//SHScene* SHSceneManager::nextScene = nullptr;
|
//SHScene* SHSceneManager::nextScene = nullptr;
|
||||||
|
@ -107,16 +107,18 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHSceneManager::RestartScene(std::string const& sceneName) noexcept
|
void SHSceneManager::RestartScene(AssetID const& assetID ) noexcept
|
||||||
{
|
{
|
||||||
if (currentScene->sceneName != sceneName)
|
if (currentScene->sceneAssetID != assetID)
|
||||||
{
|
{
|
||||||
cleanReload = true;
|
//cleanReload = true;
|
||||||
newSceneName = sceneName;
|
cleanReload = false;
|
||||||
|
//newSceneName = sceneName;
|
||||||
}
|
}
|
||||||
else
|
else
|
||||||
cleanReload = false;
|
cleanReload = false;
|
||||||
|
|
||||||
|
currentScene->sceneAssetID = assetID;
|
||||||
nextSceneID = currentSceneID;
|
nextSceneID = currentSceneID;
|
||||||
sceneChanged = true;
|
sceneChanged = true;
|
||||||
}
|
}
|
||||||
|
@ -151,4 +153,20 @@ namespace SHADE
|
||||||
{
|
{
|
||||||
return currentScene->sceneName;
|
return currentScene->sceneName;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHSceneManager::SetCurrentSceneName(std::string const& sceneName) noexcept
|
||||||
|
{
|
||||||
|
currentScene->sceneName = sceneName;
|
||||||
|
}
|
||||||
|
|
||||||
|
AssetID SHSceneManager::GetCurrentSceneAssetID() noexcept
|
||||||
|
{
|
||||||
|
return currentScene->sceneAssetID;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHSceneManager::SetCurrentSceneAssetID(AssetID const& newAssetID)
|
||||||
|
{
|
||||||
|
currentScene->sceneAssetID = newAssetID;
|
||||||
|
currentSceneAssetID = newAssetID;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -20,6 +20,7 @@
|
||||||
//Project Headers
|
//Project Headers
|
||||||
#include "SH_API.h"
|
#include "SH_API.h"
|
||||||
#include "ECS_Base/General/SHFamily.h"
|
#include "ECS_Base/General/SHFamily.h"
|
||||||
|
#include "Assets/SHAssetMacros.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
@ -47,6 +48,9 @@ namespace SHADE
|
||||||
//pointer to the current scene
|
//pointer to the current scene
|
||||||
static SHScene* currentScene;
|
static SHScene* currentScene;
|
||||||
|
|
||||||
|
//Scene AssetID of the current scene
|
||||||
|
static AssetID currentSceneAssetID;
|
||||||
|
|
||||||
//Used in reloading scene.
|
//Used in reloading scene.
|
||||||
static std::string newSceneName;
|
static std::string newSceneName;
|
||||||
|
|
||||||
|
@ -80,10 +84,10 @@ namespace SHADE
|
||||||
* None.
|
* None.
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static std::enable_if_t<std::is_base_of_v<SHScene, T>, void> InitSceneManager(std::string const& sceneName) noexcept
|
static std::enable_if_t<std::is_base_of_v<SHScene, T>, void> InitSceneManager(AssetID const& sceneAssetID) noexcept
|
||||||
{
|
{
|
||||||
//prevSceneCreate = newScene;
|
//prevSceneCreate = newScene;
|
||||||
newScene = [sceneName]() { currentScene = new T(); currentScene->sceneName = sceneName; };
|
newScene = [sceneAssetID]() { currentScene = new T(); currentScene->sceneAssetID = sceneAssetID; };
|
||||||
//nextSceneID = SHFamilyID<SHScene>::GetID<T>();
|
//nextSceneID = SHFamilyID<SHScene>::GetID<T>();
|
||||||
nextSceneID = 0;
|
nextSceneID = 0;
|
||||||
|
|
||||||
|
@ -99,7 +103,7 @@ namespace SHADE
|
||||||
* None.
|
* None.
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
template<typename T>
|
template<typename T>
|
||||||
static std::enable_if_t<std::is_base_of_v<SHScene, T>, void> ChangeScene(std::string const& sceneName) noexcept
|
static std::enable_if_t<std::is_base_of_v<SHScene, T>, void> ChangeScene(AssetID const& sceneAssetID) noexcept
|
||||||
{
|
{
|
||||||
//check if this new Scene is current Scene (Use RestartScene instead)
|
//check if this new Scene is current Scene (Use RestartScene instead)
|
||||||
if (currentSceneID == SHFamilyID<SHScene>::GetID<T>())
|
if (currentSceneID == SHFamilyID<SHScene>::GetID<T>())
|
||||||
|
@ -107,7 +111,7 @@ namespace SHADE
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
//prevSceneCreate = newScene;
|
//prevSceneCreate = newScene;
|
||||||
newScene = [sceneName]() { currentScene = new T(); currentScene->sceneName; };
|
newScene = [sceneAssetID]() { currentScene = new T(); currentScene->sceneAssetID = sceneAssetID; };
|
||||||
nextSceneID = SHFamilyID<SHScene>::GetID<T>();
|
nextSceneID = SHFamilyID<SHScene>::GetID<T>();
|
||||||
sceneChanged = true;
|
sceneChanged = true;
|
||||||
}
|
}
|
||||||
|
@ -137,11 +141,11 @@ namespace SHADE
|
||||||
* Restarts current scene. Only Scene::Init() and Scene::Free()
|
* Restarts current scene. Only Scene::Init() and Scene::Free()
|
||||||
* Scene::Load() and Scene::Unload() will not be called.
|
* Scene::Load() and Scene::Unload() will not be called.
|
||||||
* Edit: allows for RestartScene to restart the scene with a different
|
* Edit: allows for RestartScene to restart the scene with a different
|
||||||
* scene name.
|
* scene asset ID.
|
||||||
* If a sceneName is different from the current one, Load and Unload will
|
* If a scene asset id is different from the current one, Load and Unload will
|
||||||
* run.
|
* run.
|
||||||
***************************************************************************/
|
***************************************************************************/
|
||||||
static void RestartScene(std::string const& sceneName ) noexcept;
|
static void RestartScene(AssetID const& assetID ) noexcept;
|
||||||
|
|
||||||
/*!*************************************************************************
|
/*!*************************************************************************
|
||||||
* \brief
|
* \brief
|
||||||
|
@ -164,7 +168,10 @@ namespace SHADE
|
||||||
static void Exit() noexcept;
|
static void Exit() noexcept;
|
||||||
|
|
||||||
static std::string GetSceneName() noexcept;
|
static std::string GetSceneName() noexcept;
|
||||||
|
static void SetCurrentSceneName(std::string const& sceneName) noexcept;
|
||||||
|
static AssetID GetCurrentSceneAssetID() noexcept;
|
||||||
|
//Only if scene doesn't exist, and scene asset id needs to be updated to the new one
|
||||||
|
static void SetCurrentSceneAssetID(AssetID const& newAssetID);
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,89 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHConfigurationManager.h"
|
||||||
|
#include "Tools/FileIO/SHFileIO.h"
|
||||||
|
#include "Serialization/SHSerializationHelper.hpp"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
SHApplicationConfig SHConfigurationManager::applicationConfig;
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
SHEditorConfig SHConfigurationManager::editorConfig;
|
||||||
|
#endif
|
||||||
|
|
||||||
|
void SHConfigurationManager::SaveApplicationConfig()
|
||||||
|
{
|
||||||
|
YAML::Emitter out;
|
||||||
|
out << SHSerializationHelper::RTTRToNode(applicationConfig);
|
||||||
|
SHFileIO::WriteStringToFile(applicationConfigPath, out.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
SHApplicationConfig& SHConfigurationManager::LoadApplicationConfig(WindowData* wndData)
|
||||||
|
{
|
||||||
|
if(!std::filesystem::exists(applicationConfigPath))
|
||||||
|
{
|
||||||
|
SaveApplicationConfig();
|
||||||
|
return applicationConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
auto const node = YAML::Load(SHFileIO::GetStringFromFile(applicationConfigPath));
|
||||||
|
auto properties = rttr::type::get<SHApplicationConfig>().get_properties();
|
||||||
|
for(auto const& property : properties)
|
||||||
|
{
|
||||||
|
if(node[property.get_name().data()].IsDefined())
|
||||||
|
SHSerializationHelper::InitializeProperty(&applicationConfig, property, node[property.get_name().data()]);
|
||||||
|
}
|
||||||
|
|
||||||
|
if(wndData != nullptr)
|
||||||
|
{
|
||||||
|
wndData->isFullscreen = applicationConfig.startInFullScreen;
|
||||||
|
wndData->title = std::wstring(applicationConfig.windowTitle.begin(), applicationConfig.windowTitle.end());
|
||||||
|
wndData->width = static_cast<uint32_t>(applicationConfig.windowSize.x);
|
||||||
|
wndData->height = static_cast<uint32_t>(applicationConfig.windowSize.y);
|
||||||
|
}
|
||||||
|
|
||||||
|
return applicationConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
void SHConfigurationManager::SaveEditorConfig()
|
||||||
|
{
|
||||||
|
YAML::Emitter out;
|
||||||
|
out << SHSerializationHelper::RTTRToNode(editorConfig);
|
||||||
|
SHFileIO::WriteStringToFile(editorConfigPath, out.c_str());
|
||||||
|
}
|
||||||
|
|
||||||
|
SHEditorConfig& SHConfigurationManager::LoadEditorConfig()
|
||||||
|
{
|
||||||
|
auto const node = YAML::Load(SHFileIO::GetStringFromFile(editorConfigPath));
|
||||||
|
auto properties = rttr::type::get<SHApplicationConfig>().get_properties();
|
||||||
|
for(auto const& property : properties)
|
||||||
|
{
|
||||||
|
if(node[property.get_name().data()].IsDefined())
|
||||||
|
SHSerializationHelper::InitializeProperty(&editorConfig, property, node[property.get_name().data()]);
|
||||||
|
}
|
||||||
|
return editorConfig;
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHConfigurationManager::FetchEditorCameraData()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
void SHConfigurationManager::SetEditorCameraData()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
RTTR_REGISTRATION
|
||||||
|
{
|
||||||
|
using namespace rttr;
|
||||||
|
using namespace SHADE;
|
||||||
|
|
||||||
|
registration::class_<SHApplicationConfig>("Application Config")
|
||||||
|
.property("Start in Fullscreen", &SHApplicationConfig::startInFullScreen)
|
||||||
|
.property("Starting Scene ID", &SHApplicationConfig::startingSceneID)
|
||||||
|
.property("Window Size", &SHApplicationConfig::windowSize)
|
||||||
|
.property("Window Title", &SHApplicationConfig::windowTitle);
|
||||||
|
}
|
|
@ -0,0 +1,44 @@
|
||||||
|
#pragma once
|
||||||
|
#include <rttr/registration>
|
||||||
|
#include "Assets/SHAssetMacros.h"
|
||||||
|
#include "Graphics/Windowing/SHWindow.h"
|
||||||
|
#include "SH_API.h"
|
||||||
|
#include "Math/Vector/SHVec2.h"
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
|
||||||
|
struct SHApplicationConfig
|
||||||
|
{
|
||||||
|
bool startInFullScreen{ false };
|
||||||
|
AssetID startingSceneID{};
|
||||||
|
SHVec2 windowSize {1920, 1080};
|
||||||
|
std::string windowTitle {"SHADE Engine"};
|
||||||
|
RTTR_ENABLE()
|
||||||
|
};
|
||||||
|
|
||||||
|
struct SHEditorConfig
|
||||||
|
{
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
class SH_API SHConfigurationManager
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
static constexpr std::string_view applicationConfigPath{"../../Assets/Application.SHConfig"};
|
||||||
|
static constexpr std::string_view editorConfigPath{"../../Assets/Editor/Editor.SHConfig"};
|
||||||
|
|
||||||
|
static void SaveApplicationConfig();
|
||||||
|
static SHApplicationConfig& LoadApplicationConfig(WindowData* wndData = nullptr);
|
||||||
|
static SHApplicationConfig applicationConfig;
|
||||||
|
#ifdef SHEDITOR
|
||||||
|
static void SaveEditorConfig();
|
||||||
|
static SHEditorConfig& LoadEditorConfig();
|
||||||
|
static SHEditorConfig editorConfig;
|
||||||
|
private:
|
||||||
|
static void FetchEditorCameraData();
|
||||||
|
static void SetEditorCameraData();
|
||||||
|
#endif
|
||||||
|
|
||||||
|
};
|
||||||
|
}
|
|
@ -1,8 +1,8 @@
|
||||||
#include "SHpch.h"
|
#include "SHpch.h"
|
||||||
|
|
||||||
#include <yaml-cpp/yaml.h>
|
#include <yaml-cpp/yaml.h>
|
||||||
#include "SHSerializationHelper.hpp"
|
|
||||||
#include "SHSerialization.h"
|
#include "SHSerialization.h"
|
||||||
|
#include "SHSerializationHelper.hpp"
|
||||||
|
|
||||||
#include "ECS_Base/Managers/SHEntityManager.h"
|
#include "ECS_Base/Managers/SHEntityManager.h"
|
||||||
#include "Scene/SHSceneManager.h"
|
#include "Scene/SHSceneManager.h"
|
||||||
|
@ -10,6 +10,7 @@
|
||||||
#include "Assets/SHAssetManager.h"
|
#include "Assets/SHAssetManager.h"
|
||||||
#include <fstream>
|
#include <fstream>
|
||||||
|
|
||||||
|
#include "Assets/Asset Types/SHSceneAsset.h"
|
||||||
#include "Camera/SHCameraComponent.h"
|
#include "Camera/SHCameraComponent.h"
|
||||||
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
||||||
#include "Math/Transform/SHTransformComponent.h"
|
#include "Math/Transform/SHTransformComponent.h"
|
||||||
|
@ -17,19 +18,23 @@
|
||||||
#include "ECS_Base/Managers/SHSystemManager.h"
|
#include "ECS_Base/Managers/SHSystemManager.h"
|
||||||
#include "Graphics/MiddleEnd/Lights/SHLightComponent.h"
|
#include "Graphics/MiddleEnd/Lights/SHLightComponent.h"
|
||||||
#include "Scripting/SHScriptEngine.h"
|
#include "Scripting/SHScriptEngine.h"
|
||||||
|
#include "Tools/FileIO/SHFileIO.h"
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
void SHSerialization::SerializeSceneToFile(std::filesystem::path const& path)
|
bool SHSerialization::SerializeSceneToFile(AssetID const& sceneAssetID)
|
||||||
{
|
{
|
||||||
|
auto assetData = SHAssetManager::GetData<SHSceneAsset>(sceneAssetID);
|
||||||
|
if(!assetData)
|
||||||
|
{
|
||||||
|
SHLOG_ERROR("Asset does not exist: {}", sceneAssetID);
|
||||||
|
return false;
|
||||||
|
}
|
||||||
YAML::Emitter out;
|
YAML::Emitter out;
|
||||||
SerializeSceneToEmitter(out);
|
SerializeSceneToEmitter(out);
|
||||||
std::ofstream file(path.c_str());
|
assetData->data = out.c_str();
|
||||||
if (file.good())
|
|
||||||
{
|
return SHAssetManager::SaveAsset(sceneAssetID);
|
||||||
file << out.c_str();
|
|
||||||
file.close();
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
std::string SHSerialization::SerializeSceneToString()
|
std::string SHSerialization::SerializeSceneToString()
|
||||||
|
@ -91,31 +96,16 @@ namespace SHADE
|
||||||
return eid;
|
return eid;
|
||||||
}
|
}
|
||||||
|
|
||||||
void SHSerialization::DeserializeSceneFromFile(std::filesystem::path const& path)
|
std::string SHSerialization::DeserializeSceneFromFile(AssetID const& sceneAssetID) noexcept
|
||||||
{
|
{
|
||||||
//TODO:Shift to using XQ's FileIO
|
auto assetData = SHAssetManager::GetData<SHSceneAsset>(sceneAssetID);
|
||||||
std::ifstream iFile;
|
if(!assetData)
|
||||||
iFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
|
||||||
std::string fileContent = "";
|
|
||||||
|
|
||||||
try
|
|
||||||
{
|
{
|
||||||
// Open file
|
SHLOG_ERROR("Attempted to load scene that doesn't exist {}", sceneAssetID)
|
||||||
// Read file's buffer contents into streams
|
SHSceneManager::SetCurrentSceneAssetID(0);
|
||||||
iFile.open(path);
|
return NewSceneName.data();
|
||||||
std::stringstream fileStream;
|
|
||||||
fileStream << iFile.rdbuf();
|
|
||||||
|
|
||||||
fileContent = fileStream.str();
|
|
||||||
|
|
||||||
// Close file handler
|
|
||||||
iFile.close();
|
|
||||||
}
|
}
|
||||||
catch (std::ifstream::failure e)
|
YAML::Node entities = YAML::Load(assetData->data);
|
||||||
{
|
|
||||||
SHLOG_ERROR("Could not read file");
|
|
||||||
}
|
|
||||||
YAML::Node entities = YAML::Load(fileContent);
|
|
||||||
std::vector<EntityID> createdEntities{};
|
std::vector<EntityID> createdEntities{};
|
||||||
|
|
||||||
//Create Entities
|
//Create Entities
|
||||||
|
@ -126,15 +116,24 @@ namespace SHADE
|
||||||
if (createdEntities.empty())
|
if (createdEntities.empty())
|
||||||
{
|
{
|
||||||
SHLOG_ERROR("Failed to create entities from deserializaiton")
|
SHLOG_ERROR("Failed to create entities from deserializaiton")
|
||||||
return;
|
return NewSceneName.data();
|
||||||
}
|
}
|
||||||
//Initialize Entity
|
|
||||||
auto entityVecIt = createdEntities.begin();
|
auto entityVecIt = createdEntities.begin();
|
||||||
|
AssetQueue assetQueue;
|
||||||
|
for (auto it = entities.begin(); it != entities.end(); ++it)
|
||||||
|
{
|
||||||
|
SHSerializationHelper::FetchAssetsFromComponent<SHRenderable>((*it)[ComponentsNode], *entityVecIt, assetQueue);
|
||||||
|
}
|
||||||
|
LoadAssetsFromAssetQueue(assetQueue);
|
||||||
|
//Initialize Entity
|
||||||
|
entityVecIt = createdEntities.begin();
|
||||||
for (auto it = entities.begin(); it != entities.end(); ++it)
|
for (auto it = entities.begin(); it != entities.end(); ++it)
|
||||||
{
|
{
|
||||||
InitializeEntity(*it, *entityVecIt++);
|
InitializeEntity(*it, *entityVecIt++);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
|
return assetData->name;
|
||||||
|
}
|
||||||
|
|
||||||
void SHSerialization::EmitEntity(SHSceneNode* entityNode, YAML::Emitter& out)
|
void SHSerialization::EmitEntity(SHSceneNode* entityNode, YAML::Emitter& out)
|
||||||
{
|
{
|
||||||
|
@ -264,6 +263,33 @@ namespace SHADE
|
||||||
return componentIDList;
|
return componentIDList;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SHSerialization::LoadAssetsFromAssetQueue(AssetQueue& assetQueue)
|
||||||
|
{
|
||||||
|
for (auto& [assetId, assetType] : assetQueue)
|
||||||
|
{
|
||||||
|
switch(assetType)
|
||||||
|
{
|
||||||
|
case AssetType::INVALID: break;
|
||||||
|
case AssetType::SHADER: break;
|
||||||
|
case AssetType::SHADER_BUILT_IN: break;
|
||||||
|
case AssetType::TEXTURE:
|
||||||
|
SHResourceManager::LoadOrGet<SHTexture>(assetId);
|
||||||
|
break;
|
||||||
|
case AssetType::MESH:
|
||||||
|
SHResourceManager::LoadOrGet<SHMesh>(assetId);
|
||||||
|
break;
|
||||||
|
case AssetType::SCENE: break;
|
||||||
|
case AssetType::PREFAB: break;
|
||||||
|
case AssetType::MATERIAL:
|
||||||
|
SHResourceManager::LoadOrGet<SHMaterial>(assetId);
|
||||||
|
break;
|
||||||
|
case AssetType::MAX_COUNT: break;
|
||||||
|
default: ;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
SHResourceManager::FinaliseChanges();
|
||||||
|
}
|
||||||
|
|
||||||
void SHSerialization::InitializeEntity(YAML::Node const& entityNode, EntityID const& eid)
|
void SHSerialization::InitializeEntity(YAML::Node const& entityNode, EntityID const& eid)
|
||||||
{
|
{
|
||||||
auto const componentsNode = entityNode[ComponentsNode];
|
auto const componentsNode = entityNode[ComponentsNode];
|
||||||
|
|
|
@ -4,7 +4,10 @@
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
|
|
||||||
#include <ECS_Base/Components/SHComponent.h>
|
|
||||||
|
#include "ECS_Base/SHECSMacros.h"
|
||||||
|
#include <Assets/SHAssetMacros.h>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
namespace YAML
|
namespace YAML
|
||||||
{
|
{
|
||||||
|
@ -25,12 +28,11 @@ namespace SHADE
|
||||||
|
|
||||||
struct SH_API SHSerialization
|
struct SH_API SHSerialization
|
||||||
{
|
{
|
||||||
//TODO: change paths to resource ID
|
static bool SerializeSceneToFile(AssetID const& sceneAssetID);
|
||||||
static void SerializeSceneToFile(std::filesystem::path const& path);
|
|
||||||
static std::string SerializeSceneToString();
|
static std::string SerializeSceneToString();
|
||||||
static void SerializeSceneToEmitter(YAML::Emitter& out);
|
static void SerializeSceneToEmitter(YAML::Emitter& out);
|
||||||
|
|
||||||
static void DeserializeSceneFromFile(std::filesystem::path const& path);
|
static std::string DeserializeSceneFromFile(AssetID const& sceneAssetID) noexcept;
|
||||||
|
|
||||||
|
|
||||||
static void EmitEntity(SHSceneNode* entityNode, YAML::Emitter& out);
|
static void EmitEntity(SHSceneNode* entityNode, YAML::Emitter& out);
|
||||||
|
@ -42,7 +44,11 @@ namespace SHADE
|
||||||
static EntityID DeserializeEntitiesFromString(std::string const& data, EntityID const& parentEID = MAX_EID) noexcept;
|
static EntityID DeserializeEntitiesFromString(std::string const& data, EntityID const& parentEID = MAX_EID) noexcept;
|
||||||
|
|
||||||
static std::vector<ComponentTypeID> GetComponentIDList(YAML::Node const& componentsNode);
|
static std::vector<ComponentTypeID> GetComponentIDList(YAML::Node const& componentsNode);
|
||||||
|
|
||||||
|
static void LoadAssetsFromAssetQueue(std::unordered_map<AssetID, AssetType>& assetQueue);
|
||||||
private:
|
private:
|
||||||
static void InitializeEntity(YAML::Node const& entityNode, EntityID const& eid);
|
static void InitializeEntity(YAML::Node const& entityNode, EntityID const& eid);
|
||||||
|
|
||||||
|
static constexpr std::string_view NewSceneName = "New Scene";
|
||||||
};
|
};
|
||||||
}
|
}
|
|
@ -1,329 +1,20 @@
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include "SHYAMLConverters.h"
|
||||||
#include <yaml-cpp/yaml.h>
|
#include <yaml-cpp/yaml.h>
|
||||||
#include "ECS_Base/Components/SHComponent.h"
|
#include "ECS_Base/Components/SHComponent.h"
|
||||||
|
|
||||||
#include <rttr/registration>
|
#include <rttr/registration>
|
||||||
|
#include <unordered_map>
|
||||||
|
|
||||||
#include "ECS_Base/Managers/SHComponentManager.h"
|
#include "ECS_Base/Managers/SHComponentManager.h"
|
||||||
#include "Math/Vector/SHVec2.h"
|
|
||||||
#include "Math/Vector/SHVec3.h"
|
|
||||||
#include "Math/Vector/SHVec4.h"
|
|
||||||
#include "Resource/SHResourceManager.h"
|
|
||||||
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
|
||||||
#include "Graphics/MiddleEnd/Interface/SHMaterial.h"
|
|
||||||
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
|
||||||
#include "SHSerializationTools.h"
|
|
||||||
#include "Physics/Components/SHColliderComponent.h"
|
|
||||||
#include "Graphics/MiddleEnd/Materials/SHMaterialSpec.h"
|
#include "Graphics/MiddleEnd/Materials/SHMaterialSpec.h"
|
||||||
#include "Tools/SHLog.h"
|
#include "Tools/SHLog.h"
|
||||||
|
|
||||||
namespace YAML
|
|
||||||
{
|
|
||||||
using namespace SHADE;
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct convert<SHVec4>
|
|
||||||
{
|
|
||||||
static constexpr const char* x = "x";
|
|
||||||
static constexpr const char* y = "y";
|
|
||||||
static constexpr const char* z = "z";
|
|
||||||
static constexpr const char* w = "w";
|
|
||||||
|
|
||||||
static Node encode(SHVec4 const& rhs)
|
|
||||||
{
|
|
||||||
Node node;
|
|
||||||
node.SetStyle(EmitterStyle::Flow);
|
|
||||||
node[x] = rhs.x;
|
|
||||||
node[y] = rhs.y;
|
|
||||||
node[z] = rhs.z;
|
|
||||||
node[w] = rhs.w;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
static bool decode(Node const& node, SHVec4& rhs)
|
|
||||||
{
|
|
||||||
if (node[x].IsDefined())
|
|
||||||
rhs.x = node[x].as<float>();
|
|
||||||
if (node[y].IsDefined())
|
|
||||||
rhs.y = node[y].as<float>();
|
|
||||||
if (node[z].IsDefined())
|
|
||||||
rhs.z = node[z].as<float>();
|
|
||||||
if (node[w].IsDefined())
|
|
||||||
rhs.w = node[w].as<float>();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct convert<SHVec3>
|
|
||||||
{
|
|
||||||
static constexpr const char* x = "x";
|
|
||||||
static constexpr const char* y = "y";
|
|
||||||
static constexpr const char* z = "z";
|
|
||||||
|
|
||||||
static Node encode(SHVec3 const& rhs)
|
|
||||||
{
|
|
||||||
Node node;
|
|
||||||
node.SetStyle(EmitterStyle::Flow);
|
|
||||||
node[x] = rhs.x;
|
|
||||||
node[y] = rhs.y;
|
|
||||||
node[z] = rhs.z;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
static bool decode(Node const& node, SHVec3& rhs)
|
|
||||||
{
|
|
||||||
if (node[x].IsDefined())
|
|
||||||
rhs.x = node[x].as<float>();
|
|
||||||
if (node[y].IsDefined())
|
|
||||||
rhs.y = node[y].as<float>();
|
|
||||||
if (node[z].IsDefined())
|
|
||||||
rhs.z = node[z].as<float>();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct convert<SHVec2>
|
|
||||||
{
|
|
||||||
static constexpr const char* x = "x";
|
|
||||||
static constexpr const char* y = "y";
|
|
||||||
|
|
||||||
static Node encode(SHVec2 const& rhs)
|
|
||||||
{
|
|
||||||
Node node;
|
|
||||||
node.SetStyle(EmitterStyle::Flow);
|
|
||||||
node[x] = rhs.x;
|
|
||||||
node[y] = rhs.y;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
static bool decode(Node const& node, SHVec2& rhs)
|
|
||||||
{
|
|
||||||
if (node[x].IsDefined())
|
|
||||||
rhs.x = node[x].as<float>();
|
|
||||||
if (node[y].IsDefined())
|
|
||||||
rhs.y = node[y].as<float>();
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct convert<SHCollider>
|
|
||||||
{
|
|
||||||
static constexpr const char* IsTrigger = "Is Trigger";
|
|
||||||
|
|
||||||
static constexpr const char* Type = "Type";
|
|
||||||
static constexpr const char* HalfExtents = "Half Extents";
|
|
||||||
static constexpr const char* Radius = "Radius";
|
|
||||||
|
|
||||||
static constexpr const char* Friction = "Friction";
|
|
||||||
static constexpr const char* Bounciness = "Bounciness";
|
|
||||||
static constexpr const char* Density = "Density";
|
|
||||||
static constexpr const char* PositionOffset = "Position Offset";
|
|
||||||
|
|
||||||
static Node encode(SHCollider& rhs)
|
|
||||||
{
|
|
||||||
Node node;
|
|
||||||
|
|
||||||
node[IsTrigger] = rhs.IsTrigger();
|
|
||||||
|
|
||||||
rttr::type const shapeRttrType = rttr::type::get<SHCollider::Type>();
|
|
||||||
rttr::enumeration const enumAlign = shapeRttrType.get_enumeration();
|
|
||||||
SHCollider::Type colliderType = rhs.GetType();
|
|
||||||
|
|
||||||
node[Type] = enumAlign.value_to_name(colliderType).data();
|
|
||||||
|
|
||||||
switch (colliderType)
|
|
||||||
{
|
|
||||||
case SHCollider::Type::BOX:
|
|
||||||
{
|
|
||||||
auto const bb = reinterpret_cast<SHBoundingBox*>(rhs.GetShape());
|
|
||||||
node[HalfExtents] = bb->GetHalfExtents();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SHCollider::Type::SPHERE:
|
|
||||||
{
|
|
||||||
auto const bs = reinterpret_cast<SHBoundingSphere*>(rhs.GetShape());
|
|
||||||
node[Radius] = bs->GetRadius();
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SHCollider::Type::CAPSULE: break;
|
|
||||||
default:;
|
|
||||||
}
|
|
||||||
|
|
||||||
node[Friction] = rhs.GetFriction();
|
|
||||||
node[Bounciness] = rhs.GetBounciness();
|
|
||||||
node[Density] = rhs.GetDensity();
|
|
||||||
node[PositionOffset] = rhs.GetPositionOffset();
|
|
||||||
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
static bool decode(Node const& node, SHCollider& rhs)
|
|
||||||
{
|
|
||||||
if (node[IsTrigger].IsDefined())
|
|
||||||
rhs.SetIsTrigger(node[IsTrigger].as<bool>());
|
|
||||||
if (!node[Type].IsDefined())
|
|
||||||
return false;
|
|
||||||
rttr::type const shapeRttrType = rttr::type::get<SHCollider::Type>();
|
|
||||||
rttr::enumeration const enumAlign = shapeRttrType.get_enumeration();
|
|
||||||
bool ok;
|
|
||||||
const SHCollider::Type colliderType = enumAlign.name_to_value(node[Type].as<std::string>()).convert<SHCollider::Type>(&ok);
|
|
||||||
if (!ok)
|
|
||||||
return false;
|
|
||||||
switch (colliderType)
|
|
||||||
{
|
|
||||||
case SHCollider::Type::BOX:
|
|
||||||
{
|
|
||||||
if (node[HalfExtents].IsDefined())
|
|
||||||
rhs.SetBoundingBox(node[HalfExtents].as<SHVec3>());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SHCollider::Type::SPHERE:
|
|
||||||
{
|
|
||||||
if (node[Radius].IsDefined())
|
|
||||||
rhs.SetBoundingSphere(node[Radius].as<float>());
|
|
||||||
}
|
|
||||||
break;
|
|
||||||
case SHCollider::Type::CAPSULE: break;
|
|
||||||
default:;
|
|
||||||
}
|
|
||||||
if (node[Friction].IsDefined())
|
|
||||||
rhs.SetFriction(node[Friction].as<float>());
|
|
||||||
if (node[Bounciness].IsDefined())
|
|
||||||
rhs.SetBounciness(rhs.GetBounciness());
|
|
||||||
if (node[Density].IsDefined())
|
|
||||||
rhs.SetDensity(node[Density].as<float>());
|
|
||||||
if (node[PositionOffset].IsDefined())
|
|
||||||
rhs.SetPositionOffset(node[PositionOffset].as<SHVec3>());
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct convert<SHColliderComponent>
|
|
||||||
{
|
|
||||||
static constexpr const char* Colliders = "Colliders";
|
|
||||||
static Node encode(SHColliderComponent& rhs)
|
|
||||||
{
|
|
||||||
Node node, collidersNode;
|
|
||||||
auto const& colliders = rhs.GetColliders();
|
|
||||||
int const numColliders = static_cast<int>(colliders.size());
|
|
||||||
for (int i = 0; i < numColliders; ++i)
|
|
||||||
{
|
|
||||||
auto& collider = rhs.GetCollider(i);
|
|
||||||
Node colliderNode = convert<SHCollider>::encode(collider);
|
|
||||||
if (colliderNode.IsDefined())
|
|
||||||
collidersNode[i] = colliderNode;
|
|
||||||
}
|
|
||||||
node[Colliders] = collidersNode;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
static bool decode(Node const& node, SHColliderComponent& rhs)
|
|
||||||
{
|
|
||||||
if (node[Colliders].IsDefined())
|
|
||||||
{
|
|
||||||
int numColliders{};
|
|
||||||
for (auto const& colliderNode : node[Colliders])
|
|
||||||
{
|
|
||||||
rttr::type const shapeRttrType = rttr::type::get<SHCollider::Type>();
|
|
||||||
rttr::enumeration const enumAlign = shapeRttrType.get_enumeration();
|
|
||||||
bool ok = false;
|
|
||||||
const SHCollider::Type colliderType = enumAlign.name_to_value(colliderNode[convert<SHCollider>::Type].as<std::string>()).convert<SHCollider::Type>(&ok);
|
|
||||||
if (!ok)
|
|
||||||
return false;
|
|
||||||
|
|
||||||
switch (colliderType)
|
|
||||||
{
|
|
||||||
case SHCollider::Type::BOX: rhs.AddBoundingBox(); break;
|
|
||||||
case SHCollider::Type::SPHERE: rhs.AddBoundingSphere(); break;
|
|
||||||
case SHCollider::Type::CAPSULE: break;
|
|
||||||
default:;
|
|
||||||
}
|
|
||||||
YAML::convert<SHCollider>::decode(colliderNode, rhs.GetCollider(numColliders++));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct convert<SHMaterialSpec>
|
|
||||||
{
|
|
||||||
static constexpr std::string_view VERT_SHADER_YAML_TAG = "VertexShader";
|
|
||||||
static constexpr std::string_view FRAG_SHADER_YAML_TAG = "FragmentShader";
|
|
||||||
static constexpr std::string_view SUBPASS_YAML_TAG = "SubPass";
|
|
||||||
static constexpr std::string_view PROPS_YAML_TAG = "Properties";
|
|
||||||
|
|
||||||
static YAML::Node encode(SHMaterialSpec const& rhs)
|
|
||||||
{
|
|
||||||
YAML::Node node;
|
|
||||||
node[VERT_SHADER_YAML_TAG.data()] = rhs.vertexShader;
|
|
||||||
node[FRAG_SHADER_YAML_TAG.data()] = rhs.fragShader;
|
|
||||||
node[SUBPASS_YAML_TAG.data()] = rhs.subpassName;
|
|
||||||
node[PROPS_YAML_TAG.data()] = rhs.properties;
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
|
|
||||||
static bool decode(YAML::Node const& node, SHMaterialSpec& rhs)
|
|
||||||
{
|
|
||||||
// Retrieve Shader Asset IDs
|
|
||||||
if (node[VERT_SHADER_YAML_TAG.data()].IsDefined())
|
|
||||||
rhs.vertexShader = node[VERT_SHADER_YAML_TAG.data()].as<AssetID>();
|
|
||||||
if (node[FRAG_SHADER_YAML_TAG.data()].IsDefined())
|
|
||||||
rhs.fragShader = node[FRAG_SHADER_YAML_TAG.data()].as<AssetID>();
|
|
||||||
|
|
||||||
// Retrieve Subpass
|
|
||||||
if (node[SUBPASS_YAML_TAG.data()].IsDefined())
|
|
||||||
rhs.subpassName = node[SUBPASS_YAML_TAG.data()].as<std::string>();
|
|
||||||
|
|
||||||
// Retrieve
|
|
||||||
if (node[PROPS_YAML_TAG.data()].IsDefined())
|
|
||||||
rhs.properties = node[PROPS_YAML_TAG.data()];
|
|
||||||
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
template<>
|
|
||||||
struct convert<SHRenderable>
|
|
||||||
{
|
|
||||||
static constexpr std::string_view MESH_YAML_TAG = "Mesh";
|
|
||||||
static constexpr std::string_view MAT_YAML_TAG = "Material";
|
|
||||||
|
|
||||||
static YAML::Node encode(SHRenderable const& rhs)
|
|
||||||
{
|
|
||||||
YAML::Node node;
|
|
||||||
node[MESH_YAML_TAG.data()] = SHResourceManager::GetAssetID<SHMesh>(rhs.GetMesh()).value_or(0);
|
|
||||||
node[MAT_YAML_TAG.data()] = SHResourceManager::GetAssetID<SHMaterial>(rhs.GetMaterial()->GetBaseMaterial()).value_or(0);
|
|
||||||
return node;
|
|
||||||
}
|
|
||||||
static bool decode(YAML::Node const& node, SHRenderable& rhs)
|
|
||||||
{
|
|
||||||
if (node[MESH_YAML_TAG.data()].IsDefined())
|
|
||||||
{
|
|
||||||
rhs.SetMesh(SHResourceManager::LoadOrGet<SHMesh>(node[MESH_YAML_TAG.data()].as<AssetID>()));
|
|
||||||
}
|
|
||||||
if (node[MAT_YAML_TAG.data()].IsDefined())
|
|
||||||
{
|
|
||||||
// Temporarily, use default material
|
|
||||||
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
|
||||||
if (!gfxSystem)
|
|
||||||
return false;
|
|
||||||
Handle<SHMaterial> baseMat = SHResourceManager::LoadOrGet<SHMaterial>(node[MAT_YAML_TAG.data()].as<AssetID>());
|
|
||||||
if (!baseMat)
|
|
||||||
{
|
|
||||||
baseMat = gfxSystem->GetDefaultMaterial();
|
|
||||||
SHLog::Warning("[SHSerializationHelper] Unable to load specified material. Falling back to default material.");
|
|
||||||
}
|
|
||||||
rhs.SetMaterial(gfxSystem->AddOrGetBaseMaterialInstance(baseMat));
|
|
||||||
}
|
|
||||||
return true;
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
namespace SHADE
|
namespace SHADE
|
||||||
{
|
{
|
||||||
|
using AssetQueue = std::unordered_map<AssetID, AssetType>;
|
||||||
struct SHSerializationHelper
|
struct SHSerializationHelper
|
||||||
{
|
{
|
||||||
|
|
||||||
|
@ -397,6 +88,8 @@ namespace SHADE
|
||||||
node = YAML::Null;
|
node = YAML::Null;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
else if (varType == rttr::type::get<std::string>())
|
||||||
|
node = var.to_string();
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto properties = var.get_type().get_properties();
|
auto properties = var.get_type().get_properties();
|
||||||
|
@ -432,63 +125,65 @@ namespace SHADE
|
||||||
return node;
|
return node;
|
||||||
}
|
}
|
||||||
|
|
||||||
template <typename ComponentType, std::enable_if_t<std::is_base_of_v<SHComponent, ComponentType>, bool> = true>
|
template <typename Type>
|
||||||
static void InitializeProperty(ComponentType* component, rttr::property const& prop, YAML::Node const& propertyNode)
|
static void InitializeProperty(Type* object, rttr::property const& prop, YAML::Node const& propertyNode)
|
||||||
{
|
{
|
||||||
auto propType = prop.get_type();
|
auto propType = prop.get_type();
|
||||||
if (propType == rttr::type::get<SHVec4>())
|
if (propType == rttr::type::get<SHVec4>())
|
||||||
{
|
{
|
||||||
SHVec4 vec = propertyNode.as<SHVec4>();
|
SHVec4 vec = propertyNode.as<SHVec4>();
|
||||||
prop.set_value(component, vec);
|
prop.set_value(object, vec);
|
||||||
}
|
}
|
||||||
else if (propType == rttr::type::get<SHVec3>())
|
else if (propType == rttr::type::get<SHVec3>())
|
||||||
{
|
{
|
||||||
SHVec3 vec = propertyNode.as<SHVec3>();
|
SHVec3 vec = propertyNode.as<SHVec3>();
|
||||||
prop.set_value(component, vec);
|
prop.set_value(object, vec);
|
||||||
}
|
}
|
||||||
else if (propType == rttr::type::get<SHVec2>())
|
else if (propType == rttr::type::get<SHVec2>())
|
||||||
{
|
{
|
||||||
SHVec2 vec = propertyNode.as<SHVec2>();
|
SHVec2 vec = propertyNode.as<SHVec2>();
|
||||||
prop.set_value(component, vec);
|
prop.set_value(object, vec);
|
||||||
}
|
}
|
||||||
else if (propType.is_arithmetic())
|
else if (propType.is_arithmetic())
|
||||||
{
|
{
|
||||||
bool ok = false;
|
bool ok = false;
|
||||||
if (propType == rttr::type::get<bool>())
|
if (propType == rttr::type::get<bool>())
|
||||||
prop.set_value(component, propertyNode.as<bool>());
|
prop.set_value(object, propertyNode.as<bool>());
|
||||||
else if (propType == rttr::type::get<int8_t>())
|
else if (propType == rttr::type::get<int8_t>())
|
||||||
prop.set_value(component, propertyNode.as<int8_t>());
|
prop.set_value(object, propertyNode.as<int8_t>());
|
||||||
else if (propType == rttr::type::get<int16_t>())
|
else if (propType == rttr::type::get<int16_t>())
|
||||||
prop.set_value(component, propertyNode.as<int16_t>());
|
prop.set_value(object, propertyNode.as<int16_t>());
|
||||||
else if (propType == rttr::type::get<int32_t>())
|
else if (propType == rttr::type::get<int32_t>())
|
||||||
prop.set_value(component, propertyNode.as<int32_t>());
|
prop.set_value(object, propertyNode.as<int32_t>());
|
||||||
else if (propType == rttr::type::get<int64_t>())
|
else if (propType == rttr::type::get<int64_t>())
|
||||||
prop.set_value(component, propertyNode.as<int64_t>());
|
prop.set_value(object, propertyNode.as<int64_t>());
|
||||||
else if (propType == rttr::type::get<uint8_t>())
|
else if (propType == rttr::type::get<uint8_t>())
|
||||||
prop.set_value(component, propertyNode.as<uint8_t>());
|
prop.set_value(object, propertyNode.as<uint8_t>());
|
||||||
else if (propType == rttr::type::get<uint16_t>())
|
else if (propType == rttr::type::get<uint16_t>())
|
||||||
prop.set_value(component, propertyNode.as<uint16_t>());
|
prop.set_value(object, propertyNode.as<uint16_t>());
|
||||||
else if (propType == rttr::type::get<uint32_t>())
|
else if (propType == rttr::type::get<uint32_t>())
|
||||||
prop.set_value(component, propertyNode.as<uint32_t>());
|
prop.set_value(object, propertyNode.as<uint32_t>());
|
||||||
else if (propType == rttr::type::get<uint64_t>())
|
else if (propType == rttr::type::get<uint64_t>())
|
||||||
prop.set_value(component, propertyNode.as<uint64_t>());
|
prop.set_value(object, propertyNode.as<uint64_t>());
|
||||||
else if (propType == rttr::type::get<float>())
|
else if (propType == rttr::type::get<float>())
|
||||||
prop.set_value(component, propertyNode.as<float>());
|
prop.set_value(object, propertyNode.as<float>());
|
||||||
else if (propType == rttr::type::get<double>())
|
else if (propType == rttr::type::get<double>())
|
||||||
prop.set_value(component, propertyNode.as<double>());
|
prop.set_value(object, propertyNode.as<double>());
|
||||||
}
|
}
|
||||||
else if (propType.is_enumeration())
|
else if (propType.is_enumeration())
|
||||||
{
|
{
|
||||||
auto enumAlign = prop.get_enumeration();
|
auto enumAlign = prop.get_enumeration();
|
||||||
prop.set_value(component, enumAlign.name_to_value(propertyNode.as<std::string>()));
|
prop.set_value(object, enumAlign.name_to_value(propertyNode.as<std::string>()));
|
||||||
}
|
}
|
||||||
|
else if (propType == rttr::type::get<std::string>())
|
||||||
|
prop.set_value(object, propertyNode.as<std::string>());
|
||||||
else
|
else
|
||||||
{
|
{
|
||||||
auto properties = propType.get_properties();
|
auto properties = propType.get_properties();
|
||||||
for (auto const& property : properties)
|
for (auto const& property : properties)
|
||||||
{
|
{
|
||||||
if (propertyNode[property.get_name().data()].IsDefined())
|
if(propertyNode[property.get_name().data()].IsDefined())
|
||||||
InitializeProperty(component, property, propertyNode[property.get_name().data()]);
|
InitializeProperty(object, property, propertyNode[property.get_name().data()]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -513,18 +208,73 @@ namespace SHADE
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename ComponentType, std::enable_if_t<std::is_base_of_v<SHComponent, ComponentType>, bool> = true>
|
||||||
|
static YAML::Node GetComponentNode(YAML::Node const& componentsNode, EntityID const& eid)
|
||||||
|
{
|
||||||
|
auto component = SHComponentManager::GetComponent_s<ComponentType>(eid);
|
||||||
|
if (componentsNode.IsNull() && !component)
|
||||||
|
return {};
|
||||||
|
auto rttrType = rttr::type::get<ComponentType>();
|
||||||
|
auto componentNode = componentsNode[rttrType.get_name().data()];
|
||||||
|
if (!componentNode.IsDefined())
|
||||||
|
return {};
|
||||||
|
return componentNode;
|
||||||
|
}
|
||||||
|
|
||||||
template <typename ComponentType, std::enable_if_t<std::is_base_of_v<SHComponent, ComponentType>, bool> = true>
|
template <typename ComponentType, std::enable_if_t<std::is_base_of_v<SHComponent, ComponentType>, bool> = true>
|
||||||
static void ConvertNodeToComponent(YAML::Node const& componentsNode, EntityID const& eid)
|
static void ConvertNodeToComponent(YAML::Node const& componentsNode, EntityID const& eid)
|
||||||
{
|
{
|
||||||
auto component = SHComponentManager::GetComponent_s<ComponentType>(eid);
|
auto component = SHComponentManager::GetComponent_s<ComponentType>(eid);
|
||||||
if (componentsNode.IsNull() && !component)
|
if (componentsNode.IsNull() && !component)
|
||||||
return;
|
return;
|
||||||
auto rttrType = rttr::type::get<ComponentType>();
|
|
||||||
auto componentNode = componentsNode[rttrType.get_name().data()];
|
YAML::convert<ComponentType>::decode(GetComponentNode<ComponentType>(componentsNode, eid), *component);
|
||||||
if (!componentNode.IsDefined())
|
|
||||||
return;
|
|
||||||
YAML::convert<ComponentType>::decode(componentNode, *component);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename ComponentType, std::enable_if_t<std::is_base_of_v<SHComponent, ComponentType>, bool> = true>
|
||||||
|
static void FetchAssetsFromComponent(YAML::Node const& componentsNode, EntityID const& eid, AssetQueue& assetQueue)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
template<>
|
||||||
|
static void FetchAssetsFromComponent<SHRenderable>(YAML::Node const& componentsNode, EntityID const& eid, AssetQueue& assetQueue)
|
||||||
|
{
|
||||||
|
auto node = GetComponentNode<SHRenderable>(componentsNode, eid);
|
||||||
|
if(!node.IsDefined())
|
||||||
|
return;
|
||||||
|
if (auto const& meshNode = node[YAML::convert<SHRenderable>::MESH_YAML_TAG.data()]; meshNode.IsDefined())
|
||||||
|
{
|
||||||
|
assetQueue.insert({meshNode.as<AssetID>(), AssetType::MESH});
|
||||||
|
//SHResourceManager::LoadOrGet<SHMesh>(node[YAML::convert<SHRenderable>::MESH_YAML_TAG.data()].as<AssetID>());
|
||||||
|
}
|
||||||
|
if (auto const& matNode = node[YAML::convert<SHRenderable>::MAT_YAML_TAG.data()]; matNode.IsDefined())
|
||||||
|
{
|
||||||
|
auto const matAsset = SHAssetManager::GetData<SHMaterialAsset>(matNode.as<AssetID>());
|
||||||
|
if(matAsset)
|
||||||
|
{
|
||||||
|
SHMaterialSpec spec;
|
||||||
|
YAML::convert<SHMaterialSpec>::decode(*YAML::Load(matAsset->data).begin(), spec);
|
||||||
|
if(spec.properties.IsDefined())
|
||||||
|
{
|
||||||
|
auto fragShader = SHResourceManager::LoadOrGet<SHVkShaderModule>(spec.fragShader);
|
||||||
|
auto interface = fragShader->GetReflectedData().GetDescriptorBindingInfo().GetShaderBlockInterface(SHGraphicsConstants::DescriptorSetIndex::PER_INSTANCE, SHGraphicsConstants::DescriptorSetBindings::BATCHED_PER_INST_DATA);
|
||||||
|
int const varCount = static_cast<int>(interface->GetVariableCount());
|
||||||
|
|
||||||
|
for (int i = 0; i < varCount; ++i)
|
||||||
|
{
|
||||||
|
auto variable = interface->GetVariable(i);
|
||||||
|
if(variable->type != SHShaderBlockInterface::Variable::Type::INT)
|
||||||
|
continue;
|
||||||
|
const std::string& VAR_NAME = interface->GetVariableName(i);
|
||||||
|
if(VAR_NAME.empty())
|
||||||
|
continue;
|
||||||
|
assetQueue.insert({spec.properties[VAR_NAME.data()].as<AssetID>(), AssetType::TEXTURE});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//assetQueue.insert({matNode.as<AssetID>(), AssetType::MATERIAL});
|
||||||
|
//SHResourceManager::LoadOrGet<SHMaterial>(node[YAML::convert<SHRenderable>::MAT_YAML_TAG.data()].as<AssetID>());
|
||||||
|
}
|
||||||
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,317 @@
|
||||||
|
#pragma once
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHRenderable.h"
|
||||||
|
#include "Graphics/MiddleEnd/Materials/SHMaterialSpec.h"
|
||||||
|
#include "Math/Geometry/SHBoundingBox.h"
|
||||||
|
#include "Math/Geometry/SHBoundingSphere.h"
|
||||||
|
#include "Physics/SHCollider.h"
|
||||||
|
#include "Resource/SHResourceManager.h"
|
||||||
|
#include "Math/Vector/SHVec2.h"
|
||||||
|
#include "Math/Vector/SHVec3.h"
|
||||||
|
#include "Math/Vector/SHVec4.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHMaterial.h"
|
||||||
|
#include "Graphics/MiddleEnd/Interface/SHMaterialInstance.h"
|
||||||
|
#include "SHSerializationTools.h"
|
||||||
|
#include "Physics/Components/SHColliderComponent.h"
|
||||||
|
namespace YAML
|
||||||
|
{
|
||||||
|
using namespace SHADE;
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct convert<SHVec4>
|
||||||
|
{
|
||||||
|
static constexpr const char* x = "x";
|
||||||
|
static constexpr const char* y = "y";
|
||||||
|
static constexpr const char* z = "z";
|
||||||
|
static constexpr const char* w = "w";
|
||||||
|
|
||||||
|
static Node encode(SHVec4 const& rhs)
|
||||||
|
{
|
||||||
|
Node node;
|
||||||
|
node.SetStyle(EmitterStyle::Flow);
|
||||||
|
node[x] = rhs.x;
|
||||||
|
node[y] = rhs.y;
|
||||||
|
node[z] = rhs.z;
|
||||||
|
node[w] = rhs.w;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
static bool decode(Node const& node, SHVec4& rhs)
|
||||||
|
{
|
||||||
|
if (node[x].IsDefined())
|
||||||
|
rhs.x = node[x].as<float>();
|
||||||
|
if (node[y].IsDefined())
|
||||||
|
rhs.y = node[y].as<float>();
|
||||||
|
if (node[z].IsDefined())
|
||||||
|
rhs.z = node[z].as<float>();
|
||||||
|
if (node[w].IsDefined())
|
||||||
|
rhs.w = node[w].as<float>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct convert<SHVec3>
|
||||||
|
{
|
||||||
|
static constexpr const char* x = "x";
|
||||||
|
static constexpr const char* y = "y";
|
||||||
|
static constexpr const char* z = "z";
|
||||||
|
|
||||||
|
static Node encode(SHVec3 const& rhs)
|
||||||
|
{
|
||||||
|
Node node;
|
||||||
|
node.SetStyle(EmitterStyle::Flow);
|
||||||
|
node[x] = rhs.x;
|
||||||
|
node[y] = rhs.y;
|
||||||
|
node[z] = rhs.z;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
static bool decode(Node const& node, SHVec3& rhs)
|
||||||
|
{
|
||||||
|
if (node[x].IsDefined())
|
||||||
|
rhs.x = node[x].as<float>();
|
||||||
|
if (node[y].IsDefined())
|
||||||
|
rhs.y = node[y].as<float>();
|
||||||
|
if (node[z].IsDefined())
|
||||||
|
rhs.z = node[z].as<float>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct convert<SHVec2>
|
||||||
|
{
|
||||||
|
static constexpr const char* x = "x";
|
||||||
|
static constexpr const char* y = "y";
|
||||||
|
|
||||||
|
static Node encode(SHVec2 const& rhs)
|
||||||
|
{
|
||||||
|
Node node;
|
||||||
|
node.SetStyle(EmitterStyle::Flow);
|
||||||
|
node[x] = rhs.x;
|
||||||
|
node[y] = rhs.y;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
static bool decode(Node const& node, SHVec2& rhs)
|
||||||
|
{
|
||||||
|
if (node[x].IsDefined())
|
||||||
|
rhs.x = node[x].as<float>();
|
||||||
|
if (node[y].IsDefined())
|
||||||
|
rhs.y = node[y].as<float>();
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct convert<SHCollider>
|
||||||
|
{
|
||||||
|
static constexpr const char* IsTrigger = "Is Trigger";
|
||||||
|
|
||||||
|
static constexpr const char* Type = "Type";
|
||||||
|
static constexpr const char* HalfExtents = "Half Extents";
|
||||||
|
static constexpr const char* Radius = "Radius";
|
||||||
|
|
||||||
|
static constexpr const char* Friction = "Friction";
|
||||||
|
static constexpr const char* Bounciness = "Bounciness";
|
||||||
|
static constexpr const char* Density = "Density";
|
||||||
|
static constexpr const char* PositionOffset = "Position Offset";
|
||||||
|
|
||||||
|
static Node encode(SHCollider& rhs)
|
||||||
|
{
|
||||||
|
Node node;
|
||||||
|
|
||||||
|
node[IsTrigger] = rhs.IsTrigger();
|
||||||
|
|
||||||
|
rttr::type const shapeRttrType = rttr::type::get<SHCollider::Type>();
|
||||||
|
rttr::enumeration const enumAlign = shapeRttrType.get_enumeration();
|
||||||
|
SHCollider::Type colliderType = rhs.GetType();
|
||||||
|
|
||||||
|
node[Type] = enumAlign.value_to_name(colliderType).data();
|
||||||
|
|
||||||
|
switch (colliderType)
|
||||||
|
{
|
||||||
|
case SHCollider::Type::BOX:
|
||||||
|
{
|
||||||
|
auto const bb = reinterpret_cast<SHBoundingBox*>(rhs.GetShape());
|
||||||
|
node[HalfExtents] = bb->GetHalfExtents();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SHCollider::Type::SPHERE:
|
||||||
|
{
|
||||||
|
auto const bs = reinterpret_cast<SHBoundingSphere*>(rhs.GetShape());
|
||||||
|
node[Radius] = bs->GetRadius();
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SHCollider::Type::CAPSULE: break;
|
||||||
|
default:;
|
||||||
|
}
|
||||||
|
|
||||||
|
node[Friction] = rhs.GetFriction();
|
||||||
|
node[Bounciness] = rhs.GetBounciness();
|
||||||
|
node[Density] = rhs.GetDensity();
|
||||||
|
node[PositionOffset] = rhs.GetPositionOffset();
|
||||||
|
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
static bool decode(Node const& node, SHCollider& rhs)
|
||||||
|
{
|
||||||
|
if (node[IsTrigger].IsDefined())
|
||||||
|
rhs.SetIsTrigger(node[IsTrigger].as<bool>());
|
||||||
|
if (!node[Type].IsDefined())
|
||||||
|
return false;
|
||||||
|
rttr::type const shapeRttrType = rttr::type::get<SHCollider::Type>();
|
||||||
|
rttr::enumeration const enumAlign = shapeRttrType.get_enumeration();
|
||||||
|
bool ok;
|
||||||
|
const SHCollider::Type colliderType = enumAlign.name_to_value(node[Type].as<std::string>()).convert<SHCollider::Type>(&ok);
|
||||||
|
if (!ok)
|
||||||
|
return false;
|
||||||
|
switch (colliderType)
|
||||||
|
{
|
||||||
|
case SHCollider::Type::BOX:
|
||||||
|
{
|
||||||
|
if (node[HalfExtents].IsDefined())
|
||||||
|
rhs.SetBoundingBox(node[HalfExtents].as<SHVec3>() * 2.0f);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SHCollider::Type::SPHERE:
|
||||||
|
{
|
||||||
|
if (node[Radius].IsDefined())
|
||||||
|
rhs.SetBoundingSphere(node[Radius].as<float>());
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case SHCollider::Type::CAPSULE: break;
|
||||||
|
default:;
|
||||||
|
}
|
||||||
|
if (node[Friction].IsDefined())
|
||||||
|
rhs.SetFriction(node[Friction].as<float>());
|
||||||
|
if (node[Bounciness].IsDefined())
|
||||||
|
rhs.SetBounciness(rhs.GetBounciness());
|
||||||
|
if (node[Density].IsDefined())
|
||||||
|
rhs.SetDensity(node[Density].as<float>());
|
||||||
|
if (node[PositionOffset].IsDefined())
|
||||||
|
rhs.SetPositionOffset(node[PositionOffset].as<SHVec3>());
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct convert<SHColliderComponent>
|
||||||
|
{
|
||||||
|
static constexpr const char* Colliders = "Colliders";
|
||||||
|
static Node encode(SHColliderComponent& rhs)
|
||||||
|
{
|
||||||
|
Node node, collidersNode;
|
||||||
|
auto const& colliders = rhs.GetColliders();
|
||||||
|
int const numColliders = static_cast<int>(colliders.size());
|
||||||
|
for (int i = 0; i < numColliders; ++i)
|
||||||
|
{
|
||||||
|
auto& collider = rhs.GetCollider(i);
|
||||||
|
Node colliderNode = convert<SHCollider>::encode(collider);
|
||||||
|
if (colliderNode.IsDefined())
|
||||||
|
collidersNode[i] = colliderNode;
|
||||||
|
}
|
||||||
|
node[Colliders] = collidersNode;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
static bool decode(Node const& node, SHColliderComponent& rhs)
|
||||||
|
{
|
||||||
|
if (node[Colliders].IsDefined())
|
||||||
|
{
|
||||||
|
int numColliders{};
|
||||||
|
for (auto const& colliderNode : node[Colliders])
|
||||||
|
{
|
||||||
|
rttr::type const shapeRttrType = rttr::type::get<SHCollider::Type>();
|
||||||
|
rttr::enumeration const enumAlign = shapeRttrType.get_enumeration();
|
||||||
|
bool ok = false;
|
||||||
|
const SHCollider::Type colliderType = enumAlign.name_to_value(colliderNode[convert<SHCollider>::Type].as<std::string>()).convert<SHCollider::Type>(&ok);
|
||||||
|
if (!ok)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
switch (colliderType)
|
||||||
|
{
|
||||||
|
case SHCollider::Type::BOX: rhs.AddBoundingBox(); break;
|
||||||
|
case SHCollider::Type::SPHERE: rhs.AddBoundingSphere(); break;
|
||||||
|
case SHCollider::Type::CAPSULE: break;
|
||||||
|
default:;
|
||||||
|
}
|
||||||
|
YAML::convert<SHCollider>::decode(colliderNode, rhs.GetCollider(numColliders++));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct convert<SHMaterialSpec>
|
||||||
|
{
|
||||||
|
static constexpr std::string_view VERT_SHADER_YAML_TAG = "VertexShader";
|
||||||
|
static constexpr std::string_view FRAG_SHADER_YAML_TAG = "FragmentShader";
|
||||||
|
static constexpr std::string_view SUBPASS_YAML_TAG = "SubPass";
|
||||||
|
static constexpr std::string_view PROPS_YAML_TAG = "Properties";
|
||||||
|
|
||||||
|
static YAML::Node encode(SHMaterialSpec const& rhs)
|
||||||
|
{
|
||||||
|
YAML::Node node;
|
||||||
|
node[VERT_SHADER_YAML_TAG.data()] = rhs.vertexShader;
|
||||||
|
node[FRAG_SHADER_YAML_TAG.data()] = rhs.fragShader;
|
||||||
|
node[SUBPASS_YAML_TAG.data()] = rhs.subpassName;
|
||||||
|
node[PROPS_YAML_TAG.data()] = rhs.properties;
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
|
||||||
|
static bool decode(YAML::Node const& node, SHMaterialSpec& rhs)
|
||||||
|
{
|
||||||
|
// Retrieve Shader Asset IDs
|
||||||
|
if (node[VERT_SHADER_YAML_TAG.data()].IsDefined())
|
||||||
|
rhs.vertexShader = node[VERT_SHADER_YAML_TAG.data()].as<AssetID>();
|
||||||
|
if (node[FRAG_SHADER_YAML_TAG.data()].IsDefined())
|
||||||
|
rhs.fragShader = node[FRAG_SHADER_YAML_TAG.data()].as<AssetID>();
|
||||||
|
|
||||||
|
// Retrieve Subpass
|
||||||
|
if (node[SUBPASS_YAML_TAG.data()].IsDefined())
|
||||||
|
rhs.subpassName = node[SUBPASS_YAML_TAG.data()].as<std::string>();
|
||||||
|
|
||||||
|
// Retrieve
|
||||||
|
if (node[PROPS_YAML_TAG.data()].IsDefined())
|
||||||
|
rhs.properties = node[PROPS_YAML_TAG.data()];
|
||||||
|
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
template<>
|
||||||
|
struct convert<SHRenderable>
|
||||||
|
{
|
||||||
|
static constexpr std::string_view MESH_YAML_TAG = "Mesh";
|
||||||
|
static constexpr std::string_view MAT_YAML_TAG = "Material";
|
||||||
|
|
||||||
|
static YAML::Node encode(SHRenderable const& rhs)
|
||||||
|
{
|
||||||
|
YAML::Node node;
|
||||||
|
node[MESH_YAML_TAG.data()] = SHResourceManager::GetAssetID<SHMesh>(rhs.GetMesh()).value_or(0);
|
||||||
|
node[MAT_YAML_TAG.data()] = SHResourceManager::GetAssetID<SHMaterial>(rhs.GetMaterial()->GetBaseMaterial()).value_or(0);
|
||||||
|
return node;
|
||||||
|
}
|
||||||
|
static bool decode(YAML::Node const& node, SHRenderable& rhs)
|
||||||
|
{
|
||||||
|
if (node[MESH_YAML_TAG.data()].IsDefined())
|
||||||
|
{
|
||||||
|
rhs.SetMesh(SHResourceManager::LoadOrGet<SHMesh>(node[MESH_YAML_TAG.data()].as<AssetID>()));
|
||||||
|
}
|
||||||
|
if (node[MAT_YAML_TAG.data()].IsDefined())
|
||||||
|
{
|
||||||
|
// Temporarily, use default material
|
||||||
|
auto gfxSystem = SHSystemManager::GetSystem<SHGraphicsSystem>();
|
||||||
|
if (!gfxSystem)
|
||||||
|
return false;
|
||||||
|
Handle<SHMaterial> baseMat = SHResourceManager::LoadOrGet<SHMaterial>(node[MAT_YAML_TAG.data()].as<AssetID>());
|
||||||
|
if (!baseMat)
|
||||||
|
{
|
||||||
|
baseMat = gfxSystem->GetDefaultMaterial();
|
||||||
|
SHLog::Warning("[SHSerializationHelper] Unable to load specified material. Falling back to default material.");
|
||||||
|
}
|
||||||
|
rhs.SetMaterial(gfxSystem->AddOrGetBaseMaterialInstance(baseMat));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
}
|
|
@ -0,0 +1,31 @@
|
||||||
|
#include "SHpch.h"
|
||||||
|
#include "SHFileIO.h"
|
||||||
|
#include <fstream>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
int SHFileIO::WriteStringToFile(std::filesystem::path const& filePath, std::string_view const& strView)
|
||||||
|
{
|
||||||
|
std::ofstream file(filePath);
|
||||||
|
if(file.good())
|
||||||
|
{
|
||||||
|
file << strView;
|
||||||
|
file.close();
|
||||||
|
return 1;
|
||||||
|
}
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
std::string SHFileIO::GetStringFromFile(std::filesystem::path const& filePath)
|
||||||
|
{
|
||||||
|
std::ifstream iFile;
|
||||||
|
iFile.exceptions(std::ifstream::failbit | std::ifstream::badbit);
|
||||||
|
std::string fileData{};
|
||||||
|
iFile.open(filePath, std::iostream::binary);
|
||||||
|
std::stringstream ss;
|
||||||
|
ss << iFile.rdbuf();
|
||||||
|
fileData = ss.str();
|
||||||
|
iFile.close();
|
||||||
|
return fileData;
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
#pragma once
|
||||||
|
#include <filesystem>
|
||||||
|
#include <string>
|
||||||
|
#include <string_view>
|
||||||
|
#include <SH_API.h>
|
||||||
|
|
||||||
|
namespace SHADE
|
||||||
|
{
|
||||||
|
struct SH_API SHFileIO
|
||||||
|
{
|
||||||
|
static int WriteStringToFile(std::filesystem::path const& filePath, std::string_view const& strView);
|
||||||
|
static std::string GetStringFromFile(std::filesystem::path const& file);
|
||||||
|
};
|
||||||
|
}
|
|
@ -38,6 +38,7 @@ project "SHADE_Managed"
|
||||||
"%{IncludeDir.RTTR}/include",
|
"%{IncludeDir.RTTR}/include",
|
||||||
"%{IncludeDir.dotnet}\\include",
|
"%{IncludeDir.dotnet}\\include",
|
||||||
"%{IncludeDir.reactphysics3d}\\include",
|
"%{IncludeDir.reactphysics3d}\\include",
|
||||||
|
"%{IncludeDir.VULKAN}\\include",
|
||||||
"%{wks.location}/SHADE_Engine/src"
|
"%{wks.location}/SHADE_Engine/src"
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,18 @@
|
||||||
|
using SHADE;
|
||||||
|
using System;
|
||||||
|
public class Item : Script
|
||||||
|
{
|
||||||
|
public enum ItemCategory
|
||||||
|
{
|
||||||
|
LIGHT,
|
||||||
|
MEDIUM,
|
||||||
|
HEAVY
|
||||||
|
}
|
||||||
|
|
||||||
|
public ItemCategory currCategory;
|
||||||
|
public Item(GameObject gameObj) : base(gameObj) { }
|
||||||
|
|
||||||
|
protected override void awake()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
}
|
|
@ -4,9 +4,10 @@ using static PlayerController;
|
||||||
|
|
||||||
public class PickAndThrow : Script
|
public class PickAndThrow : Script
|
||||||
{
|
{
|
||||||
private PlayerController pc;
|
public Vector3 throwForce = new Vector3(100.0f, 200.0f, 100.0f);
|
||||||
public GameObject item;
|
public GameObject item;
|
||||||
public Vector3 throwForce = new Vector3(200.0f, 300.0f, 200.0f);
|
private PlayerController pc;
|
||||||
|
private Camera cam;
|
||||||
private Transform itemTransform;
|
private Transform itemTransform;
|
||||||
private RigidBody itemRidibody;
|
private RigidBody itemRidibody;
|
||||||
private Transform raccoonHoldLocation;
|
private Transform raccoonHoldLocation;
|
||||||
|
@ -23,40 +24,35 @@ public class PickAndThrow : Script
|
||||||
Debug.Log("CHILD EMPTY");
|
Debug.Log("CHILD EMPTY");
|
||||||
else
|
else
|
||||||
raccoonHoldLocation.LocalPosition = new Vector3(0.0f, 1.0f, 0.0f);
|
raccoonHoldLocation.LocalPosition = new Vector3(0.0f, 1.0f, 0.0f);
|
||||||
|
|
||||||
itemTransform = item.GetComponent<Transform>();
|
|
||||||
if (itemTransform == null)
|
|
||||||
Debug.Log("Item transform EMPTY");
|
|
||||||
|
|
||||||
itemRidibody = item.GetComponent<RigidBody>();
|
|
||||||
if (itemRidibody == null)
|
|
||||||
Debug.Log("Item rb EMPTY");
|
|
||||||
}
|
}
|
||||||
protected override void update()
|
protected override void update()
|
||||||
{
|
{
|
||||||
if (!pc.isMoveKeyPress)
|
if (cam == null)
|
||||||
|
cam = GetComponentInChildren<Camera>();
|
||||||
|
else if (cam != null)
|
||||||
{
|
{
|
||||||
if (pc.xAxisMove != 0)
|
Vector3 camerAixs = cam.GetForward();
|
||||||
{
|
camerAixs.y = 0;
|
||||||
lastXDir = pc.xAxisMove;
|
camerAixs.Normalise();
|
||||||
lastZDir = 0.0f;
|
lastXDir = camerAixs.x;
|
||||||
}
|
lastZDir = camerAixs.z;
|
||||||
if (pc.zAxisMove != 0)
|
|
||||||
{
|
|
||||||
lastXDir = 0.0f;
|
|
||||||
lastZDir = pc.zAxisMove;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
else
|
|
||||||
|
if (item.GetScript<Item>() != null && itemTransform == null && itemRidibody == null)
|
||||||
{
|
{
|
||||||
lastXDir = pc.xAxisMove;
|
itemTransform = item.GetComponent<Transform>();
|
||||||
lastZDir = pc.zAxisMove;
|
if (itemTransform == null)
|
||||||
|
Debug.Log("Item transform EMPTY");
|
||||||
|
|
||||||
|
itemRidibody = item.GetComponent<RigidBody>();
|
||||||
|
if (itemRidibody == null)
|
||||||
|
Debug.Log("Item rb EMPTY");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (pc != null && inRange && !pc.holdItem && Input.GetKey(Input.KeyCode.E))
|
if (pc != null && inRange && !pc.holdItem && Input.GetKey(Input.KeyCode.E))
|
||||||
pc.holdItem = true;
|
pc.holdItem = true;
|
||||||
|
|
||||||
if (pc != null && itemRidibody != null && itemTransform!= null && pc.holdItem)
|
if (pc != null && itemRidibody != null && itemTransform != null && pc.holdItem)
|
||||||
{
|
{
|
||||||
itemTransform.LocalPosition = raccoonHoldLocation.GlobalPosition;
|
itemTransform.LocalPosition = raccoonHoldLocation.GlobalPosition;
|
||||||
itemRidibody.IsGravityEnabled = false;
|
itemRidibody.IsGravityEnabled = false;
|
||||||
|
@ -66,13 +62,13 @@ public class PickAndThrow : Script
|
||||||
if (Input.GetMouseButtonDown(Input.MouseCode.LeftButton))
|
if (Input.GetMouseButtonDown(Input.MouseCode.LeftButton))
|
||||||
{
|
{
|
||||||
pc.holdItem = false;
|
pc.holdItem = false;
|
||||||
|
inRange = false;
|
||||||
itemRidibody.IsGravityEnabled = true;
|
itemRidibody.IsGravityEnabled = true;
|
||||||
itemRidibody.AddForce(new Vector3(throwForce.x * lastXDir, throwForce.y, throwForce.z * lastZDir));
|
itemRidibody.AddForce(new Vector3(throwForce.x * lastXDir, throwForce.y, throwForce.z * lastZDir));
|
||||||
itemRidibody.LinearVelocity += pc.rb.LinearVelocity;
|
itemRidibody.LinearVelocity += pc.rb.LinearVelocity;
|
||||||
Debug.Log($"x: {itemRidibody.LinearVelocity.x} z: {itemRidibody.LinearVelocity.z}");
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if(!pc.holdItem)
|
else if(!pc.holdItem && itemRidibody != null)
|
||||||
itemRidibody.IsGravityEnabled = true;
|
itemRidibody.IsGravityEnabled = true;
|
||||||
}
|
}
|
||||||
protected override void onCollisionEnter(CollisionInfo info)
|
protected override void onCollisionEnter(CollisionInfo info)
|
||||||
|
@ -80,20 +76,21 @@ public class PickAndThrow : Script
|
||||||
}
|
}
|
||||||
protected override void onTriggerEnter(CollisionInfo info)
|
protected override void onTriggerEnter(CollisionInfo info)
|
||||||
{
|
{
|
||||||
Debug.Log("ENTER");
|
//Debug.Log("ENTER");
|
||||||
if (info.GameObject == item && !pc.holdItem)
|
if (info.GameObject.GetScript<Item>() != null && !pc.holdItem)
|
||||||
{
|
{
|
||||||
|
item = info.GameObject;
|
||||||
inRange = true;
|
inRange = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
protected override void onTriggerStay(CollisionInfo info)
|
protected override void onTriggerStay(CollisionInfo info)
|
||||||
{
|
{
|
||||||
Debug.Log("STAY");
|
//Debug.Log("STAY");
|
||||||
}
|
}
|
||||||
protected override void onTriggerExit(CollisionInfo info)
|
protected override void onTriggerExit(CollisionInfo info)
|
||||||
{
|
{
|
||||||
Debug.Log("EXIT");
|
//Debug.Log("EXIT");
|
||||||
if (info.GameObject == item && !pc.holdItem)
|
if (info.GameObject.GetScript<Item>() != null && !pc.holdItem)
|
||||||
{
|
{
|
||||||
inRange = false;
|
inRange = false;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
using SHADE;
|
using SHADE;
|
||||||
using System;
|
using System;
|
||||||
|
using static Item;
|
||||||
//in air controls?
|
|
||||||
|
|
||||||
public class PlayerController : Script
|
public class PlayerController : Script
|
||||||
{
|
{
|
||||||
|
@ -16,9 +15,10 @@ public class PlayerController : Script
|
||||||
TOTAL
|
TOTAL
|
||||||
}
|
}
|
||||||
|
|
||||||
public RigidBody rb;
|
public RigidBody rb { get; set; }
|
||||||
private Transform tranform;
|
private Transform tranform;
|
||||||
private Camera cam;
|
private Camera cam;
|
||||||
|
private PickAndThrow pat;
|
||||||
|
|
||||||
//to be remove
|
//to be remove
|
||||||
public float drag = 2.0f;
|
public float drag = 2.0f;
|
||||||
|
@ -68,13 +68,24 @@ public class PlayerController : Script
|
||||||
private float gravity = -9.8f;
|
private float gravity = -9.8f;
|
||||||
private float groundGravity = -0.5f;
|
private float groundGravity = -0.5f;
|
||||||
|
|
||||||
|
//ItemMultipler==================================================================
|
||||||
|
public float lightMultiper = 0.75f;
|
||||||
|
public float mediumMultiper = 0.5f;
|
||||||
|
public float heavyMultiper = 0.25f;
|
||||||
|
|
||||||
public PlayerController(GameObject gameObj) : base(gameObj) { }
|
public PlayerController(GameObject gameObj) : base(gameObj) { }
|
||||||
|
|
||||||
protected override void awake()
|
protected override void awake()
|
||||||
{
|
{
|
||||||
|
//default setup
|
||||||
isMoveKeyPress = false;
|
isMoveKeyPress = false;
|
||||||
holdItem = false;
|
holdItem = false;
|
||||||
|
|
||||||
|
//Jump setup
|
||||||
|
float timeToApex = maxJumpTime / 2;
|
||||||
|
gravity = (-2 * maxJumpHeight) / MathF.Pow(timeToApex, 2);
|
||||||
|
initialJumpVel = (2 * maxJumpHeight) / timeToApex;
|
||||||
|
|
||||||
//rigidbody check
|
//rigidbody check
|
||||||
rb = GetComponent<RigidBody>();
|
rb = GetComponent<RigidBody>();
|
||||||
if (rb == null)
|
if (rb == null)
|
||||||
|
@ -94,10 +105,10 @@ public class PlayerController : Script
|
||||||
if(tranform == null)
|
if(tranform == null)
|
||||||
Debug.LogError("tranform is NULL!");
|
Debug.LogError("tranform is NULL!");
|
||||||
|
|
||||||
//Jump setup
|
//PickAndThrow checl
|
||||||
float timeToApex = maxJumpTime / 2;
|
pat = GetScript<PickAndThrow>();
|
||||||
gravity = (-2 * maxJumpHeight) / MathF.Pow(timeToApex, 2);
|
if (pat == null)
|
||||||
initialJumpVel = (2 * maxJumpHeight) / timeToApex;
|
Debug.LogError("PickAndThrow is NULL!");
|
||||||
|
|
||||||
//toRemove
|
//toRemove
|
||||||
tranform.LocalPosition = new Vector3(-3.0f, -2.0f, -5.0f);
|
tranform.LocalPosition = new Vector3(-3.0f, -2.0f, -5.0f);
|
||||||
|
@ -116,9 +127,11 @@ public class PlayerController : Script
|
||||||
tranform.LocalPosition = new Vector3(-3.0f, -2.0f, -5.0f);
|
tranform.LocalPosition = new Vector3(-3.0f, -2.0f, -5.0f);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GotCaught();
|
||||||
MoveKey();
|
MoveKey();
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
//Debug.Log(currentState.ToString() + " x:" + rb.LinearVelocity.x.ToString() + " y:" + rb.LinearVelocity.y.ToString() + " z:" + rb.LinearVelocity.z.ToString());
|
//Debug.Log(currentState.ToString() + " x:" + rb.LinearVelocity.x.ToString() + " y:" + rb.LinearVelocity.y.ToString() + " z:" + rb.LinearVelocity.z.ToString());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -202,7 +215,7 @@ public class PlayerController : Script
|
||||||
{
|
{
|
||||||
if (rb != null)
|
if (rb != null)
|
||||||
{
|
{
|
||||||
rb.AddForce(new Vector3(moveForce * axisMove.x, 0.0f, moveForce * axisMove.y));
|
rb.AddForce(new Vector3(axisMove.x, 0.0f,axisMove.y) * moveForce);
|
||||||
|
|
||||||
if (isMoveKeyPress)
|
if (isMoveKeyPress)
|
||||||
{
|
{
|
||||||
|
@ -259,6 +272,16 @@ public class PlayerController : Script
|
||||||
currentState = RaccoonStates.JUMP;
|
currentState = RaccoonStates.JUMP;
|
||||||
Vector3 v = rb.LinearVelocity;
|
Vector3 v = rb.LinearVelocity;
|
||||||
v.y = initialJumpVel * 0.5f;
|
v.y = initialJumpVel * 0.5f;
|
||||||
|
if (pat != null && pat.item.GetScript<Item>() != null && holdItem)
|
||||||
|
{
|
||||||
|
Item item = pat.item.GetScript<Item>();
|
||||||
|
if (item.currCategory == ItemCategory.LIGHT)
|
||||||
|
v.y *= lightMultiper;
|
||||||
|
if (item.currCategory == ItemCategory.MEDIUM)
|
||||||
|
v.y *= mediumMultiper;
|
||||||
|
if (item.currCategory == ItemCategory.HEAVY)
|
||||||
|
v.y *= heavyMultiper;
|
||||||
|
}
|
||||||
rb.LinearVelocity = v;
|
rb.LinearVelocity = v;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -319,6 +342,15 @@ public class PlayerController : Script
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void GotCaught()
|
||||||
|
{
|
||||||
|
if (currentState == RaccoonStates.CAUGHT && tranform != null)
|
||||||
|
{
|
||||||
|
currentState = RaccoonStates.IDILE;
|
||||||
|
tranform.LocalPosition = new Vector3(-3.0f, -2.0f, -5.0f);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
protected override void onCollisionEnter(CollisionInfo info)
|
protected override void onCollisionEnter(CollisionInfo info)
|
||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
|
@ -30,4 +30,5 @@ workspace "SHADE"
|
||||||
--include "Dependencies/tracy"
|
--include "Dependencies/tracy"
|
||||||
include "Dependencies/yamlcpp"
|
include "Dependencies/yamlcpp"
|
||||||
include "Dependencies/reactphysics3d"
|
include "Dependencies/reactphysics3d"
|
||||||
|
include "Dependencies/ModelCompiler"
|
||||||
group ""
|
group ""
|
||||||
|
|
Loading…
Reference in New Issue