diff --git a/.gitignore b/.gitignore
index fba41f1e..c7fefb6e 100644
--- a/.gitignore
+++ b/.gitignore
@@ -353,4 +353,9 @@ MigrationBackup/
# Ionide (cross platform F# VS Code tools) working folder
.ionide/
+# Generated Files
[Dd]ependencies/
+*.vcxproj
+*.vcxproj.filters
+*.sln
+*.csproj
diff --git a/Dependencies.bat b/Dependencies.bat
index bbce926b..0b1e1a54 100644
--- a/Dependencies.bat
+++ b/Dependencies.bat
@@ -8,34 +8,36 @@ echo "A - All"
echo "B - VMA"
echo "C - msdf"
echo "D - assimp"
-echo "E - ktx"
-echo "F - spdlog"
-echo "G - reactphysics3d"
-echo "H - imgui"
-echo "I - imguizmo"
-echo "J - imnodes"
-echo "K - tracy"
-echo "L - RTTR"
-echo "M - yamlcpp"
+echo "E - spdlog"
+echo "F - reactphysics3d"
+echo "G - imgui"
+echo "H - imguizmo"
+echo "I - imnodes"
+echo "J - tracy"
+echo "K - RTTR"
+echo "L - yamlcpp"
+echo "M - SDL"
+echo "N - dotnet"
echo ---------------------------------------------------
echo.
-choice /C ABCDEFGHIJKLM /T 10 /D A
+choice /C ABCDEFGHIJKLMN /T 10 /D A
set _e=%ERRORLEVEL%
if %_e%==1 goto VMA
if %_e%==2 goto VMA
if %_e%==3 goto MSDF
if %_e%==4 goto assimp
-if %_e%==5 goto ktx
-if %_e%==6 goto spdlog
-if %_e%==7 goto reactphysics3d
-if %_e%==8 goto imgui
-if %_e%==9 goto imguizmo
-if %_e%==10 goto imnodes
-if %_e%==11 goto tracy
-if %_e%==12 goto RTTR
-if %_e%==13 goto yamlcpp
+if %_e%==5 goto spdlog
+if %_e%==6 goto reactphysics3d
+if %_e%==7 goto imgui
+if %_e%==8 goto imguizmo
+if %_e%==9 goto imnodes
+if %_e%==10 goto tracy
+if %_e%==11 goto RTTR
+if %_e%==12 goto yamlcpp
+if %_e%==13 goto SDL
+if %_e%==14 goto dotnet
:VMA
echo -----------------------VMA----------------------------
@@ -53,60 +55,87 @@ if %_e%==3 (goto :done) else (goto :assimp)
echo -----------------------assimp----------------------------
rmdir "Dependencies/assimp" /S /Q
git clone https://github.com/SHADE-DP/assimp.git "Dependencies/assimp"
-if %_e%==4 (goto :done) else (goto :ktx)
+if %_e%==4 (goto :done) else (goto :spdlog)
-:ktx
-rmdir "Dependencies/ktx" /S /Q
-echo -----------------------ktx----------------------------
-git clone https://github.com/SHADE-DP/ktx.git "Dependencies/ktx"
-if %_e%==5 (goto :done) else (goto :spdlog)
+@REM :ktx
+@REM rmdir "Dependencies/ktx" /S /Q
+@REM echo -----------------------ktx----------------------------
+@REM git clone https://github.com/SHADE-DP/ktx.git "Dependencies/ktx"
+@REM if %_e%==5 (goto :done) else (goto :spdlog)
:spdlog
echo -----------------------spdlog----------------------------
rmdir "Dependencies/spdlog" /S /Q
git clone https://github.com/SHADE-DP/spdlog.git "Dependencies/spdlog"
-if %_e%==6 (goto :done) else (goto :reactphysics3d)
+if %_e%==5 (goto :done) else (goto :reactphysics3d)
:reactphysics3d
echo -----------------------reactphysics3d----------------------------
rmdir "Dependencies/reactphysics3d" /S /Q
git clone https://github.com/SHADE-DP/reactphysics3d.git "Dependencies/reactphysics3d"
-if %_e%==7 (goto :done) else (goto :imgui)
+if %_e%==6 (goto :done) else (goto :imgui)
:imgui
echo -----------------------imgui----------------------------
rmdir "Dependencies/imgui" /S /Q
git clone https://github.com/SHADE-DP/imgui.git "Dependencies/imgui"
-if %_e%==8 (goto :done) else (goto :imguizmo)
+if %_e%==7 (goto :done) else (goto :imguizmo)
:imguizmo
echo -----------------------imguizmo----------------------------
rmdir "Dependencies/imguizmo" /S /Q
git clone https://github.com/SHADE-DP/ImGuizmo.git "Dependencies/imguizmo"
-if %_e%==9 (goto :done) else (goto :imnodes)
+if %_e%==8 (goto :done) else (goto :imnodes)
:imnodes
echo -----------------------imnodes----------------------------
rmdir "Dependencies/imnodes" /S /Q
git clone https://github.com/SHADE-DP/imnodes.git "Dependencies/imnodes"
-if %_e%==10 (goto :done) else (goto :tracy)
+if %_e%==9 (goto :done) else (goto :tracy)
:tracy
echo -----------------------tracy----------------------------
rmdir "Dependencies/tracy" /S /Q
git clone https://github.com/SHADE-DP/tracy.git "Dependencies/tracy"
-if %_e%==11 (goto :done) else (goto :RTTR)
+if %_e%==10 (goto :done) else (goto :RTTR)
:RTTR
echo -----------------------RTTR----------------------------
rmdir "Dependencies/RTTR" /S /Q
git clone https://github.com/SHADE-DP/RTTR.git "Dependencies/RTTR"
-if %_e%==12 (goto :done) else (goto :yamlcpp)
+if %_e%==11 (goto :done) else (goto :yamlcpp)
:yamlcpp
echo -----------------------yamlcpp----------------------------
rmdir "Dependencies/yamlcpp" /S /Q
git clone https://github.com/SHADE-DP/yaml-cpp.git "Dependencies/yamlcpp"
+if %_e%==12 (goto :done) else (goto :SDL)
+
+:SDL
+echo -----------------------SDL----------------------------
+rmdir "Dependencies/SDL" /S /Q
+mkdir "Dependencies/SDL/include"
+mkdir "Dependencies/SDL/lib"
+powershell -Command "& {wget https://github.com/libsdl-org/SDL/releases/download/release-2.24.0/SDL2-devel-2.24.0-VC.zip -OutFile "Dependencies/SDL/SDL.zip"}"
+powershell -Command "& {Expand-Archive -LiteralPath Dependencies/SDL/SDL.zip -DestinationPath Dependencies/SDL/tmp}"
+robocopy "Dependencies/SDL/tmp/SDL2-2.24.0/lib/x64" "Dependencies/SDL/lib/" /ns /nfl /ndl /nc /njh
+robocopy "Dependencies/SDL/tmp/SDL2-2.24.0/include/" "Dependencies/SDL/include/" /ns /nfl /ndl /nc /njh
+rmdir "Dependencies/SDL/tmp/" /s /q
+powershell -Command "& {Remove-Item "Dependencies/SDL/SDL.zip"}"
+if %_e%==13 (goto :done) else (goto :dotnet)
+
+:dotnet
+echo -----------------------dotnet----------------------------
+rmdir "Dependencies/dotnet" /S /Q
+mkdir "Dependencies/dotnet/include"
+mkdir "Dependencies/dotnet/bin"
+powershell -Command "& {wget https://raw.githubusercontent.com/dotnet/runtime/main/src/coreclr/hosts/inc/coreclrhost.h -OutFile "Dependencies/dotnet/include/coreclrhost.h"}"
+powershell -Command "& {wget https://download.visualstudio.microsoft.com/download/pr/8686fa48-b378-424e-908b-afbd66d6e120/2d75d5c3574fb5d917c5a3cd3f624287/dotnet-sdk-6.0.400-win-x64.zip -OutFile "Dependencies/dotnet/dotnet.zip"}"
+powershell -Command "& {Expand-Archive -LiteralPath Dependencies/dotnet/dotnet.zip -DestinationPath Dependencies/dotnet/tmp}"
+robocopy "Dependencies/dotnet/tmp/shared/Microsoft.NETCore.App/6.0.8/" "Dependencies/dotnet/bin/" *.dll /ns /nfl /ndl /nc /njh
+rmdir "Dependencies/dotnet/tmp/" /s /q
+del "Dependencies/dotnet/dotnet.zip"
+powershell -Command "& {Remove-Item "Dependencies/dotnet/dotnet.zip"}"
:done
echo DONE!
diff --git a/Dependencies.lua b/Dependencies.lua
index 32382cf9..9877a70e 100644
--- a/Dependencies.lua
+++ b/Dependencies.lua
@@ -10,6 +10,7 @@ IncludeDir["tracy"] = "%{wks.location}/Dependencies/tracy"
IncludeDir["VMA"] = "%{wks.location}/Dependencies/VMA"
IncludeDir["yamlcpp"] = "%{wks.location}/Dependencies/yamlcpp/include"
IncludeDir["RTTR"] = "%{wks.location}/Dependencies/RTTR"
-IncludeDir["ktx"] = "%{wks.location}/Dependencies/ktx"
IncludeDir["reactphysics3d"] = "%{wks.location}/Dependencies/reactphysics3d"
+IncludeDir["SDL"] = "%{wks.location}/Dependencies/SDL"
IncludeDir["VULKAN"] = "$(VULKAN_SDK)"
+IncludeDir["dotnet"] = "%{wks.location}/Dependencies/dotnet"
diff --git a/Premake/premake5.exe b/Premake/premake5.exe
index f081fe1f..c25bb3fb 100644
Binary files a/Premake/premake5.exe and b/Premake/premake5.exe differ
diff --git a/SHADE.sln b/SHADE.sln
deleted file mode 100644
index ff6afa61..00000000
--- a/SHADE.sln
+++ /dev/null
@@ -1,87 +0,0 @@
-
-Microsoft Visual Studio Solution File, Format Version 12.00
-# Visual Studio Version 16
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SHADE_Application", "SHADE_Application\SHADE_Application.vcxproj", "{BDC70008-29DE-FE9D-7255-8ABFDEAACF25}"
-EndProject
-Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Dependencies", "Dependencies", "{53E47842-3FC8-3998-A828-34EB942B241A}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "ImGui", "Dependencies\imgui\ImGui.vcxproj", "{C0FF640D-2C14-8DBE-F595-301E616989EF}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "freetype", "Dependencies\msdf\msdfgen\freetype\freetype.vcxproj", "{89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msdf-atlas-gen", "Dependencies\msdf\msdf-atlas-gen.vcxproj", "{38BD587B-248B-4C81-0D1F-BDA7F98B28E6}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "msdfgen", "Dependencies\msdf\msdfgen\msdfgen.vcxproj", "{8900D8DD-F5DF-5679-FEF7-E14F6A56BDDA}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "reactphysics3d", "Dependencies\reactphysics3d\reactphysics3d.vcxproj", "{2ECAB41A-1A98-A820-032C-1947EF988485}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "spdlog", "Dependencies\spdlog\spdlog.vcxproj", "{8EAD431C-7A4F-6EF2-630A-82464F4BF542}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "yaml-cpp", "Dependencies\yamlcpp\yaml-cpp.vcxproj", "{88F1A057-74BE-FB62-9DD7-E90A890331F1}"
-EndProject
-Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "SHADE_Engine", "SHADE_Engine\SHADE_Engine.vcxproj", "{3F92E998-2BF5-783D-D47A-B1F3C0BC44C0}"
- ProjectSection(ProjectDependencies) = postProject
- {88F1A057-74BE-FB62-9DD7-E90A890331F1} = {88F1A057-74BE-FB62-9DD7-E90A890331F1}
- {8900D8DD-F5DF-5679-FEF7-E14F6A56BDDA} = {8900D8DD-F5DF-5679-FEF7-E14F6A56BDDA}
- {38BD587B-248B-4C81-0D1F-BDA7F98B28E6} = {38BD587B-248B-4C81-0D1F-BDA7F98B28E6}
- {2ECAB41A-1A98-A820-032C-1947EF988485} = {2ECAB41A-1A98-A820-032C-1947EF988485}
- {C0FF640D-2C14-8DBE-F595-301E616989EF} = {C0FF640D-2C14-8DBE-F595-301E616989EF}
- {8EAD431C-7A4F-6EF2-630A-82464F4BF542} = {8EAD431C-7A4F-6EF2-630A-82464F4BF542}
- EndProjectSection
-EndProject
-Global
- GlobalSection(SolutionConfigurationPlatforms) = preSolution
- Debug|x64 = Debug|x64
- Release|x64 = Release|x64
- EndGlobalSection
- GlobalSection(ProjectConfigurationPlatforms) = postSolution
- {BDC70008-29DE-FE9D-7255-8ABFDEAACF25}.Debug|x64.ActiveCfg = Debug|x64
- {BDC70008-29DE-FE9D-7255-8ABFDEAACF25}.Debug|x64.Build.0 = Debug|x64
- {BDC70008-29DE-FE9D-7255-8ABFDEAACF25}.Release|x64.ActiveCfg = Release|x64
- {BDC70008-29DE-FE9D-7255-8ABFDEAACF25}.Release|x64.Build.0 = Release|x64
- {C0FF640D-2C14-8DBE-F595-301E616989EF}.Debug|x64.ActiveCfg = Debug|x64
- {C0FF640D-2C14-8DBE-F595-301E616989EF}.Debug|x64.Build.0 = Debug|x64
- {C0FF640D-2C14-8DBE-F595-301E616989EF}.Release|x64.ActiveCfg = Release|x64
- {C0FF640D-2C14-8DBE-F595-301E616989EF}.Release|x64.Build.0 = Release|x64
- {89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.Debug|x64.ActiveCfg = Debug|x64
- {89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.Debug|x64.Build.0 = Debug|x64
- {89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.Release|x64.ActiveCfg = Release|x64
- {89895BD8-7556-B6E3-9E6F-A48B8A9BEB71}.Release|x64.Build.0 = Release|x64
- {38BD587B-248B-4C81-0D1F-BDA7F98B28E6}.Debug|x64.ActiveCfg = Debug|x64
- {38BD587B-248B-4C81-0D1F-BDA7F98B28E6}.Debug|x64.Build.0 = Debug|x64
- {38BD587B-248B-4C81-0D1F-BDA7F98B28E6}.Release|x64.ActiveCfg = Release|x64
- {38BD587B-248B-4C81-0D1F-BDA7F98B28E6}.Release|x64.Build.0 = Release|x64
- {8900D8DD-F5DF-5679-FEF7-E14F6A56BDDA}.Debug|x64.ActiveCfg = Debug|x64
- {8900D8DD-F5DF-5679-FEF7-E14F6A56BDDA}.Debug|x64.Build.0 = Debug|x64
- {8900D8DD-F5DF-5679-FEF7-E14F6A56BDDA}.Release|x64.ActiveCfg = Release|x64
- {8900D8DD-F5DF-5679-FEF7-E14F6A56BDDA}.Release|x64.Build.0 = Release|x64
- {2ECAB41A-1A98-A820-032C-1947EF988485}.Debug|x64.ActiveCfg = Debug|x64
- {2ECAB41A-1A98-A820-032C-1947EF988485}.Debug|x64.Build.0 = Debug|x64
- {2ECAB41A-1A98-A820-032C-1947EF988485}.Release|x64.ActiveCfg = Release|x64
- {2ECAB41A-1A98-A820-032C-1947EF988485}.Release|x64.Build.0 = Release|x64
- {8EAD431C-7A4F-6EF2-630A-82464F4BF542}.Debug|x64.ActiveCfg = Debug|x64
- {8EAD431C-7A4F-6EF2-630A-82464F4BF542}.Debug|x64.Build.0 = Debug|x64
- {8EAD431C-7A4F-6EF2-630A-82464F4BF542}.Release|x64.ActiveCfg = Release|x64
- {8EAD431C-7A4F-6EF2-630A-82464F4BF542}.Release|x64.Build.0 = Release|x64
- {88F1A057-74BE-FB62-9DD7-E90A890331F1}.Debug|x64.ActiveCfg = Debug|x64
- {88F1A057-74BE-FB62-9DD7-E90A890331F1}.Debug|x64.Build.0 = Debug|x64
- {88F1A057-74BE-FB62-9DD7-E90A890331F1}.Release|x64.ActiveCfg = Release|x64
- {88F1A057-74BE-FB62-9DD7-E90A890331F1}.Release|x64.Build.0 = Release|x64
- {3F92E998-2BF5-783D-D47A-B1F3C0BC44C0}.Debug|x64.ActiveCfg = Debug|x64
- {3F92E998-2BF5-783D-D47A-B1F3C0BC44C0}.Debug|x64.Build.0 = Debug|x64
- {3F92E998-2BF5-783D-D47A-B1F3C0BC44C0}.Release|x64.ActiveCfg = Release|x64
- {3F92E998-2BF5-783D-D47A-B1F3C0BC44C0}.Release|x64.Build.0 = Release|x64
- EndGlobalSection
- GlobalSection(SolutionProperties) = preSolution
- HideSolutionNode = FALSE
- EndGlobalSection
- GlobalSection(NestedProjects) = preSolution
- {C0FF640D-2C14-8DBE-F595-301E616989EF} = {53E47842-3FC8-3998-A828-34EB942B241A}
- {89895BD8-7556-B6E3-9E6F-A48B8A9BEB71} = {53E47842-3FC8-3998-A828-34EB942B241A}
- {38BD587B-248B-4C81-0D1F-BDA7F98B28E6} = {53E47842-3FC8-3998-A828-34EB942B241A}
- {8900D8DD-F5DF-5679-FEF7-E14F6A56BDDA} = {53E47842-3FC8-3998-A828-34EB942B241A}
- {2ECAB41A-1A98-A820-032C-1947EF988485} = {53E47842-3FC8-3998-A828-34EB942B241A}
- {8EAD431C-7A4F-6EF2-630A-82464F4BF542} = {53E47842-3FC8-3998-A828-34EB942B241A}
- {88F1A057-74BE-FB62-9DD7-E90A890331F1} = {53E47842-3FC8-3998-A828-34EB942B241A}
- EndGlobalSection
-EndGlobal
diff --git a/SHADE_Application/SHADE_Application.vcxproj b/SHADE_Application/SHADE_Application.vcxproj
deleted file mode 100644
index c1775b8d..00000000
--- a/SHADE_Application/SHADE_Application.vcxproj
+++ /dev/null
@@ -1,123 +0,0 @@
-
-
-
-
- Debug
- x64
-
-
- Release
- x64
-
-
-
- {BDC70008-29DE-FE9D-7255-8ABFDEAACF25}
- true
- Win32Proj
- SHADE_Application
- 10.0
-
-
-
- Application
- true
- Unicode
- v142
-
-
- Application
- false
- Unicode
- v142
-
-
-
-
-
-
-
-
-
-
-
-
- true
- bin\Debug_x86_64\SHADE_Application\
- bin-int\Debug_x86_64\SHADE_Application\
- SHADE_Application
- .exe
- ..\Dependencies\spdlog\include;$(VULKAN_SDK)\include;..\Dependencies\VMA\include;$(VULKAN_SDK)\Source\SPIRV-Reflect;$(IncludePath)
-
-
- false
- bin\Release_x86_64\SHADE_Application\
- bin-int\Release_x86_64\SHADE_Application\
- SHADE_Application
- .exe
- ..\Dependencies\spdlog\include;$(VULKAN_SDK)\include;..\Dependencies\VMA\include;$(VULKAN_SDK)\Source\SPIRV-Reflect;$(IncludePath)
-
-
-
- Use
- SBpch.h
- Level4
- NOMINMAX;_DEBUG;%(PreprocessorDefinitions)
- ..\SHADE_Engine\src;src;%(AdditionalIncludeDirectories)
- EditAndContinue
- Disabled
- false
- MultiThreadedDebug
- true
- stdcpplatest
-
-
- Windows
- true
- wWinMainCRTStartup
-
-
-
-
- Use
- SBpch.h
- Level4
- NOMINMAX;_RELEASE;%(PreprocessorDefinitions)
- ..\SHADE_Engine\src;src;%(AdditionalIncludeDirectories)
- Full
- true
- true
- false
- true
- MultiThreaded
- true
- stdcpplatest
-
-
- Windows
- true
- true
- wWinMainCRTStartup
-
-
-
-
-
-
-
-
-
-
- Create
-
-
-
-
-
-
- {3F92E998-2BF5-783D-D47A-B1F3C0BC44C0}
-
-
-
-
-
-
\ No newline at end of file
diff --git a/SHADE_Application/SHADE_Application.vcxproj.filters b/SHADE_Application/SHADE_Application.vcxproj.filters
deleted file mode 100644
index 1234632d..00000000
--- a/SHADE_Application/SHADE_Application.vcxproj.filters
+++ /dev/null
@@ -1,30 +0,0 @@
-
-
-
-
- {D9DE78AF-4594-F1A4-CE88-EB7B3A3DE8A8}
-
-
- {86EEB3D0-7290-DEA6-5B4B-F2FA478C65F7}
-
-
-
-
- Application
-
-
-
- Scenes
-
-
-
-
- Application
-
-
-
- Scenes
-
-
-
-
\ No newline at end of file
diff --git a/SHADE_Application/premake5.lua b/SHADE_Application/premake5.lua
index d6efc890..50bd41b2 100644
--- a/SHADE_Application/premake5.lua
+++ b/SHADE_Application/premake5.lua
@@ -1,13 +1,13 @@
project "SHADE_Application"
kind "WindowedApp"
language "C++"
- cppdialect "C++latest"
- targetdir ("bin/" .. outputdir .. "/%{prj.name}")
- objdir ("bin-int/" .. outputdir .. "/%{prj.name}")
+ cppdialect "C++20"
+ targetdir (outputdir)
+ objdir (interdir)
systemversion "latest"
pchheader "SBpch.h"
pchsource "%{prj.location}/src/SBpch.cpp"
- staticruntime "on"
+ staticruntime "off"
entrypoint "wWinMainCRTStartup"
system ("windows")
@@ -15,7 +15,7 @@ project "SHADE_Application"
{
"%{prj.location}/src/**.h",
"%{prj.location}/src/**.hpp",
- "%{prj.location}/src/**.c",
+ "%{prj.location}/src/**.c",
"%{prj.location}/src/**.cpp",
"%{prj.location}/src/**.glsl",
}
@@ -23,7 +23,9 @@ project "SHADE_Application"
includedirs
{
"../SHADE_Engine/src",
- "src"
+ "src",
+ "%{IncludeDir.dotnet}/include",
+ "%{IncludeDir.SDL}/include",
}
externalincludedirs
@@ -43,11 +45,16 @@ project "SHADE_Application"
links
{
- "SHADE_Engine"
+ "SHADE_Engine",
+ "SHADE_Managed",
+ "SDL2.lib",
+ "SDL2main.lib"
}
- postbuildcommands
+ libdirs
{
+ "%{IncludeDir.spdlog}/lib",
+ "%{IncludeDir.SDL}/lib",
}
defines
@@ -55,6 +62,11 @@ project "SHADE_Application"
"NOMINMAX"
}
+ disablewarnings
+ {
+ "4251"
+ }
+
warnings 'Extra'
filter "configurations:Debug"
@@ -63,4 +75,4 @@ project "SHADE_Application"
filter "configurations:Release"
optimize "On"
- defines{"_RELEASE"}
\ No newline at end of file
+ defines{"_RELEASE"}
diff --git a/SHADE_Application/src/Application/SBApplication.cpp b/SHADE_Application/src/Application/SBApplication.cpp
index c47b8016..61be1ae0 100644
--- a/SHADE_Application/src/Application/SBApplication.cpp
+++ b/SHADE_Application/src/Application/SBApplication.cpp
@@ -8,9 +8,15 @@
//#include "Scenes/SBEditorScene.h"
#endif // SHEDITOR
+#include "Tools/SHLogger.h"
+#include "Tools/SHFileUtilties.h"
+
#include
#include
#include
+#include
+
+#include "Scripting/SHScriptEngine.h"
namespace Sandbox
{
@@ -23,11 +29,15 @@ namespace Sandbox
_In_ INT nCmdShow
)
{
-
+ // Set working directory
+ SHADE::SHFileUtilities::SetWorkDirToExecDir();
+
+ SDL_Init(SDL_INIT_VIDEO);
window.Create(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
SHADE::SHSystemManager::CreateSystem("Graphics System");
SHADE::SHGraphicsSystem* graphicsSystem = static_cast(SHADE::SHSystemManager::GetSystem("Graphics System"));
graphicsSystem->SetWindow(&window);
+ SDL_CreateWindowFrom(window.GetHWND());
SHADE::SHSystemManager::Init();
#ifdef SHEDITOR
@@ -35,6 +45,8 @@ namespace Sandbox
#else
#endif
+ // Set up scripting
+ SHADE::SHScriptEngine::Init();
}
void SBApplication::Update(void)
@@ -61,9 +73,9 @@ namespace Sandbox
void SBApplication::Exit(void)
{
- //SHADE::SHEditor::Exit();
+ SHADE::SHScriptEngine::Exit();
SHADE::SHSystemManager::Exit();
-
+ SDL_DestroyWindow(sdlWindow);
#ifdef SHEDITOR
#else
#endif
diff --git a/SHADE_Application/src/Application/SBApplication.h b/SHADE_Application/src/Application/SBApplication.h
index 94e296b1..63626907 100644
--- a/SHADE_Application/src/Application/SBApplication.h
+++ b/SHADE_Application/src/Application/SBApplication.h
@@ -2,6 +2,7 @@
#define SB_APPLICATION_H
#include
#include "Graphics/MiddleEnd/Interface/SHGraphicsSystem.h"
+#include
//using namespace SHADE;
namespace Sandbox
@@ -10,6 +11,7 @@ namespace Sandbox
{
private:
SHADE::SHWindow window;
+ SDL_Window* sdlWindow;
//SHAppConfig config;
public:
SBApplication() = default;
diff --git a/SHADE_Application/src/WinMain.cpp b/SHADE_Application/src/WinMain.cpp
index ea1ac5fe..f672cead 100644
--- a/SHADE_Application/src/WinMain.cpp
+++ b/SHADE_Application/src/WinMain.cpp
@@ -26,15 +26,15 @@ INT WINAPI wWinMain
)
{
const SHADE::SHLogger::Config LOGGER_CONFIG{ .directoryPath = "./logs/" };
- SHADE::SHLogger::Initialise(LOGGER_CONFIG);
+ auto logger = SHADE::SHLogger::Initialise(LOGGER_CONFIG);
try
{
#ifndef SHEDITOR
//ShowWindow(::GetConsoleWindow(), SW_HIDE);
- #endif
+ #endif
- SHLOG_INFO("sup")
+ SHLOG_REGISTER(logger)
SHADE::SHEngine::Run(hInstance, hPrevInstance, lpCmdLine, nCmdShow);
_CrtSetDbgFlag(_CRTDBG_ALLOC_MEM_DF | _CRTDBG_LEAK_CHECK_DF);
diff --git a/SHADE_Engine/SHADE_Engine.vcxproj b/SHADE_Engine/SHADE_Engine.vcxproj
deleted file mode 100644
index 0925c31e..00000000
--- a/SHADE_Engine/SHADE_Engine.vcxproj
+++ /dev/null
@@ -1,280 +0,0 @@
-
-
-
-
- Debug
- x64
-
-
- Release
- x64
-
-
-
- {3F92E998-2BF5-783D-D47A-B1F3C0BC44C0}
- true
- Win32Proj
- SHADE_Engine
- 10.0
-
-
-
- StaticLibrary
- true
- Unicode
- v142
-
-
- StaticLibrary
- false
- Unicode
- v142
-
-
-
-
-
-
-
-
-
-
-
-
- bin\Debug_x86_64\SHADE_Engine\
- bin-int\Debug_x86_64\SHADE_Engine\
- SHADE_Engine
- .lib
- ..\Dependencies\assimp\include;..\Dependencies\imgui;..\Dependencies\imguizmo;..\Dependencies\imnodes;..\Dependencies\msdf;..\Dependencies\msdf\msdfgen;..\Dependencies\spdlog\include;..\Dependencies\tracy;..\Dependencies\VMA\include;..\Dependencies\yamlcpp\include;..\Dependencies\ktx\include;..\Dependencies\RTTR\include;..\Dependencies\reactphysics3d\include;$(VULKAN_SDK)\include;$(VULKAN_SDK)\Source\SPIRV-Reflect;$(IncludePath)
-
-
- bin\Release_x86_64\SHADE_Engine\
- bin-int\Release_x86_64\SHADE_Engine\
- SHADE_Engine
- .lib
- ..\Dependencies\assimp\include;..\Dependencies\imgui;..\Dependencies\imguizmo;..\Dependencies\imnodes;..\Dependencies\msdf;..\Dependencies\msdf\msdfgen;..\Dependencies\spdlog\include;..\Dependencies\tracy;..\Dependencies\VMA\include;..\Dependencies\yamlcpp\include;..\Dependencies\ktx\include;..\Dependencies\RTTR\include;..\Dependencies\reactphysics3d\include;$(VULKAN_SDK)\include;$(VULKAN_SDK)\Source\SPIRV-Reflect;$(IncludePath)
-
-
-
- Use
- SHpch.h
- Level4
- _LIB;_GLFW_INCLUDE_NONE;MSDFGEN_USE_CPP11;NOMINMAX;_DEBUG;%(PreprocessorDefinitions)
- src;%(AdditionalIncludeDirectories)
- EditAndContinue
- Disabled
- false
- MultiThreadedDebug
- true
- stdcpplatest
-
-
- Windows
- true
-
-
- vulkan-1.lib;assimp-vc142-mtd.lib;ktxd.lib;librttr_core_d.lib;%(AdditionalDependencies)
- libs;$(VULKAN_SDK)\Lib;..\Dependencies\assimp\lib\Debug;..\Dependencies\assimp\lib\Release;..\Dependencies\RTTR\lib;..\Dependencies\ktx\lib\Debug;..\Dependencies\ktx\lib\Release;%(AdditionalLibraryDirectories)
-
-
-
-
- Use
- SHpch.h
- Level4
- _LIB;_GLFW_INCLUDE_NONE;MSDFGEN_USE_CPP11;NOMINMAX;_RELEASE;%(PreprocessorDefinitions)
- src;%(AdditionalIncludeDirectories)
- Full
- true
- true
- false
- true
- MultiThreaded
- true
- stdcpplatest
-
-
- Windows
- true
- true
-
-
- vulkan-1.lib;assimp-vc142-mt.lib;ktx.lib;librttr_core.lib;%(AdditionalDependencies)
- libs;$(VULKAN_SDK)\Lib;..\Dependencies\assimp\lib\Debug;..\Dependencies\assimp\lib\Release;..\Dependencies\RTTR\lib;..\Dependencies\ktx\lib\Debug;..\Dependencies\ktx\lib\Release;%(AdditionalLibraryDirectories)
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- Create
-
-
-
-
-
-
-
-
- {88F1A057-74BE-FB62-9DD7-E90A890331F1}
-
-
- {8900D8DD-F5DF-5679-FEF7-E14F6A56BDDA}
-
-
- {38BD587B-248B-4C81-0D1F-BDA7F98B28E6}
-
-
- {2ECAB41A-1A98-A820-032C-1947EF988485}
-
-
- {C0FF640D-2C14-8DBE-F595-301E616989EF}
-
-
- {8EAD431C-7A4F-6EF2-630A-82464F4BF542}
-
-
-
-
-
-
\ No newline at end of file
diff --git a/SHADE_Engine/SHADE_Engine.vcxproj.filters b/SHADE_Engine/SHADE_Engine.vcxproj.filters
deleted file mode 100644
index 1810f10f..00000000
--- a/SHADE_Engine/SHADE_Engine.vcxproj.filters
+++ /dev/null
@@ -1,545 +0,0 @@
-
-
-
-
- {DBC7D3B0-C769-FE86-B024-12DB9C6585D7}
-
-
- {7FF59BF8-EB80-09BD-F491-8CB1609C65BD}
-
-
- {340D0110-201D-ADE0-89D6-11FF75059C79}
-
-
- {EBFC8BDC-D7F6-B42E-C063-4B3FACFC1A9B}
-
-
- {6CD692F2-D80D-DB89-E117-3FAD4DCE0183}
-
-
- {B3E3FAFD-9FDD-2350-884A-BA6074E389BC}
-
-
- {1653CE33-0220-293F-2B39-17E717655ECD}
-
-
- {92C817CE-7EC1-3620-A7F3-1BA5934B162C}
-
-
- {17C745C0-83DD-4356-CC54-CF7738AA14DE}
-
-
- {51443AC7-3D28-FB1C-A688-F56F928BE59E}
-
-
- {573A6CF2-43C9-F5BB-ECE7-09B7D8550662}
-
-
- {08DBDC43-F4D3-FB95-1D06-E11A095EDBA1}
-
-
- {4AD5CA42-3664-540C-DF82-6807CBF064B2}
-
-
- {FB5EE099-67EA-4D5E-70FB-D052DC05AA5E}
-
-
- {BA26540B-263D-52A1-6FB4-DDC2DB092329}
-
-
- {4B204703-3704-0859-A064-02AC8C67F2DA}
-
-
- {EBA1D3FF-D75C-C3AB-8014-3CF66CAE0D3C}
-
-
- {8CDBA7C9-F8E8-D5AF-81CF-D19AEDDBA166}
-
-
- {2460C057-1070-6C28-7929-D14665585BC1}
-
-
- {FBD334F8-67EA-328E-B061-BEAF1CB70316}
-
-
- {1DD51CAD-8960-8A71-9271-0D66FE7BE671}
-
-
- {57DAB30C-4369-3DD6-EC87-51D1D8F54D7C}
-
-
- {9C0DAFD9-086F-8CE7-91DC-D299FD3CC3A6}
-
-
- {EF2D07CC-DB26-261E-0459-0BA3F0B0052A}
-
-
- {3AEF06DD-A6D2-151D-AFD5-43591B38DC6D}
-
-
- {245F5AB0-1085-2417-F9CA-A9E2E58F49E3}
-
-
- {03DB39DE-EFBE-FA33-581F-F5864422E5B5}
-
-
- {576DF841-4392-47C2-6CDD-2C52586146E0}
-
-
- {75F29FE5-6102-4CB6-CABB-B0D4B6EA3A4F}
-
-
- {5BAB2A92-478F-EBE7-B0EF-E53A9CF2D569}
-
-
- {B3B14D12-9FC1-F9E2-087B-5E01F4A9E87B}
-
-
- {AC05897C-983C-8A0D-4129-70102D3F060F}
-
-
- {ED6CDF9B-D939-3AA7-0253-284FEE7E6F35}
-
-
- {B3F7140E-1F0C-3DBF-E88D-E01E546139F0}
-
-
- {16CF2D0E-82E3-55BF-4B65-F91EB73852F0}
-
-
-
-
- Engine\ECS_Base\Components
-
-
- Engine\ECS_Base\Components
-
-
- Engine\ECS_Base\Entity
-
-
- Engine\ECS_Base\General
-
-
- Engine\ECS_Base\General
-
-
- Engine\ECS_Base\General
-
-
- Engine\ECS_Base\General
-
-
- Engine\ECS_Base\General
-
-
- Engine\ECS_Base
-
-
- Engine\ECS_Base\System
-
-
- Engine\ECS_Base\System
-
-
- Engine\ECS_Base\System
-
-
- Engine\ECS_Base\System
-
-
- Engine
-
-
- Graphics\Buffers
-
-
- Graphics\Commands
-
-
- Graphics\Commands
-
-
- Graphics\Commands
-
-
- Graphics\Debugging
-
-
- Graphics\Debugging
-
-
- Graphics\Debugging
-
-
- Graphics\Descriptors
-
-
- Graphics\Descriptors
-
-
- Graphics\Descriptors
-
-
- Graphics\Descriptors
-
-
- Graphics\Descriptors
-
-
- Graphics\Descriptors
-
-
- Graphics\Devices
-
-
- Graphics\Devices
-
-
- Graphics\Devices
-
-
- Graphics\Framebuffer
-
-
- Graphics\Images
-
-
- Graphics\Images
-
-
- Graphics\Images
-
-
- Graphics\Images
-
-
- Graphics\Instance
-
-
- Graphics\MiddleEnd\Interface
-
-
- Graphics\MiddleEnd\Interface
-
-
- Graphics\MiddleEnd\PerFrame
-
-
- Graphics\MiddleEnd\PerFrame
-
-
- Graphics\MiddleEnd\Shaders
-
-
- Graphics\MiddleEnd\Shaders
-
-
- Graphics\MiddleEnd\Shaders
-
-
- Graphics\Pipeline
-
-
- Graphics\Pipeline
-
-
- Graphics\Pipeline
-
-
- Graphics\Pipeline
-
-
- Graphics\Pipeline
-
-
- Graphics\Pipeline
-
-
- Graphics\Queues
-
-
- Graphics\RenderGraph
-
-
- Graphics\Renderpass
-
-
- Graphics\Renderpass
-
-
- Graphics\Renderpass
-
-
- Graphics\Renderpass
-
-
- Graphics\Renderpass
-
-
- Graphics
-
-
- Graphics
-
-
- Graphics
-
-
- Graphics\Shaders\BlockInterface
-
-
- Graphics\Shaders
-
-
- Graphics\Shaders
-
-
- Graphics\Shaders\spirv-reflect
-
-
- Graphics\Swapchain
-
-
- Graphics\Swapchain
-
-
- Graphics\Synchronization
-
-
- Graphics\Synchronization
-
-
- Graphics\VertexDescriptors
-
-
- Graphics\Windowing
-
-
- Graphics\Windowing
-
-
- Graphics\Windowing\Surface
-
-
- Meta
-
-
- Resource
-
-
- Resource
-
-
- Resource
-
-
- Resource
-
-
- Resource
-
-
- Resource
-
-
-
- Scene
-
-
- Scene
-
-
- Tools
-
-
- Tools
-
-
- Tools
-
-
-
-
- Engine\ECS_Base\Components
-
-
- Engine\ECS_Base\Components
-
-
- Engine\ECS_Base\Entity
-
-
- Engine\ECS_Base\System
-
-
- Engine\ECS_Base\System
-
-
- Engine\ECS_Base\System
-
-
- Engine
-
-
- Graphics\Buffers
-
-
- Graphics\Commands
-
-
- Graphics\Commands
-
-
- Graphics\Debugging
-
-
- Graphics\Debugging
-
-
- Graphics\Debugging
-
-
- Graphics\Descriptors
-
-
- Graphics\Descriptors
-
-
- Graphics\Descriptors
-
-
- Graphics\Descriptors
-
-
- Graphics\Descriptors
-
-
- Graphics\Descriptors
-
-
- Graphics\Devices
-
-
- Graphics\Devices
-
-
- Graphics\Devices
-
-
- Graphics\Framebuffer
-
-
- Graphics\Images
-
-
- Graphics\Images
-
-
- Graphics\Images
-
-
- Graphics\Instance
-
-
- Graphics\MiddleEnd\Interface
-
-
- Graphics\MiddleEnd\Interface
-
-
- Graphics\MiddleEnd\PerFrame
-
-
- Graphics\MiddleEnd\PerFrame
-
-
- Graphics\MiddleEnd\Shaders
-
-
- Graphics\MiddleEnd\Shaders
-
-
- Graphics\Pipeline
-
-
- Graphics\Pipeline
-
-
- Graphics\Pipeline
-
-
- Graphics\Pipeline
-
-
- Graphics\Queues
-
-
- Graphics\RenderGraph
-
-
- Graphics\Renderpass
-
-
- Graphics\Renderpass
-
-
- Graphics\Renderpass
-
-
- Graphics
-
-
- Graphics
-
-
- Graphics\Shaders\BlockInterface
-
-
- Graphics\Shaders
-
-
- Graphics\Shaders
-
-
- Graphics\Shaders\spirv-reflect
-
-
- Graphics\Swapchain
-
-
- Graphics\Synchronization
-
-
- Graphics\Synchronization
-
-
- Graphics\VertexDescriptors
-
-
- Graphics\Windowing
-
-
- Graphics\Windowing
-
-
- Graphics\Windowing\Surface
-
-
- Resource
-
-
-
- Scene
-
-
- Tools
-
-
- Tools
-
-
- Tools
-
-
-
\ No newline at end of file
diff --git a/SHADE_Engine/premake5.lua b/SHADE_Engine/premake5.lua
index c51b1ca6..74f19f96 100644
--- a/SHADE_Engine/premake5.lua
+++ b/SHADE_Engine/premake5.lua
@@ -1,13 +1,13 @@
project "SHADE_Engine"
- kind "StaticLib"
+ kind "SharedLib"
language "C++"
- cppdialect "C++latest"
- targetdir ("bin/" .. outputdir .. "/%{prj.name}")
- objdir ("bin-int/" .. outputdir .. "/%{prj.name}")
+ cppdialect "C++20"
+ targetdir (outputdir)
+ objdir (interdir)
systemversion "latest"
pchheader "SHpch.h"
pchsource "%{prj.location}/src/SHpch.cpp"
- staticruntime "on"
+ staticruntime "off"
files
{
@@ -35,11 +35,12 @@ project "SHADE_Engine"
"%{IncludeDir.tracy}",
"%{IncludeDir.VMA}/include",
"%{IncludeDir.yamlcpp}",
- "%{IncludeDir.ktx}/include",
+ "%{IncludeDir.SDL}/include",
"%{IncludeDir.RTTR}/include",
"%{IncludeDir.reactphysics3d}/include",
"%{IncludeDir.VULKAN}/include",
- "%{IncludeDir.VULKAN}/Source/SPIRV-Reflect"
+ "%{IncludeDir.VULKAN}/Source/SPIRV-Reflect",
+ "%{IncludeDir.dotnet}/include",
}
externalwarnings "Off"
@@ -51,8 +52,8 @@ project "SHADE_Engine"
"%{IncludeDir.assimp}/lib/Debug",
"%{IncludeDir.assimp}/lib/Release",
"%{IncludeDir.RTTR}/lib",
- "%{IncludeDir.ktx}/lib/Debug",
- "%{IncludeDir.ktx}/lib/Release",
+ "%{IncludeDir.SDL}/lib",
+ "%{IncludeDir.spdlog}/lib"
}
links
@@ -62,8 +63,16 @@ project "SHADE_Engine"
"msdf-atlas-gen",
"reactphysics3d",
"imgui",
- "spdlog",
- "vulkan-1.lib"
+ "vulkan-1.lib",
+ "SDL2.lib",
+ "SDL2main.lib",
+ "shaderc_shared.lib",
+ "shlwapi.lib"
+ }
+
+ disablewarnings
+ {
+ "4251"
}
defines
@@ -71,7 +80,8 @@ project "SHADE_Engine"
"_LIB",
"_GLFW_INCLUDE_NONE",
"MSDFGEN_USE_CPP11",
- "NOMINMAX"
+ "NOMINMAX",
+ "SH_API_EXPORT"
}
flags
@@ -86,7 +96,13 @@ project "SHADE_Engine"
"msdf-atlas-gen",
"reactphysics3d",
"imgui",
- "spdlog",
+ }
+
+ postbuildcommands
+ {
+ "xcopy /s /r /y /q \"%{IncludeDir.spdlog}/bin\" \"$(OutDir)\"",
+ "xcopy /r /y /q \"%{IncludeDir.SDL}/lib/SDL2.dll\" \"$(OutDir)\"",
+ "xcopy /s /r /y /q \"%{IncludeDir.dotnet}/bin\" \"$(OutDir)\""
}
warnings 'Extra'
@@ -94,11 +110,11 @@ project "SHADE_Engine"
filter "configurations:Debug"
symbols "On"
defines {"_DEBUG"}
- links{"assimp-vc142-mtd.lib", "ktxd.lib", "librttr_core_d.lib"}
+ links{"assimp-vc142-mtd.lib", "librttr_core_d.lib", "spdlogd.lib"}
--links{"fmodstudioL_vc.lib", "fmodL_vc.lib"}
filter "configurations:Release"
optimize "On"
defines{"_RELEASE"}
- links{"assimp-vc142-mt.lib", "ktx.lib", "librttr_core.lib"}
+ links{"assimp-vc142-mt.lib", "librttr_core.lib", "spdlog.lib"}
--links{"fmodstudio_vc.lib", "fmod_vc.lib"}
\ No newline at end of file
diff --git a/SHADE_Engine/src/Common/SHCommonTypes.h b/SHADE_Engine/src/Common/SHCommonTypes.h
new file mode 100644
index 00000000..97ef7928
--- /dev/null
+++ b/SHADE_Engine/src/Common/SHCommonTypes.h
@@ -0,0 +1,28 @@
+/************************************************************************************//*!
+\file SHCommonTypes.h
+\author Tng Kah Wei, kahwei.tng, 390009620
+\par email: kahwei.tng\@digipen.edu
+\date Sep 8, 2022
+\brief Contains the definitions of type alias for commonly used units for
+ clarity and convenience.
+
+
+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
+
+namespace SHADE
+{
+ /*---------------------------------------------------------------------------------*/
+ /* Type Definitions */
+ /*---------------------------------------------------------------------------------*/
+ /***********************************************************************************/
+ /*!
+ \brief
+ Type used to mark a value that is supposed to represent a size in bytes.
+ */
+ /***********************************************************************************/
+ using Byte = size_t;
+}
diff --git a/SHADE_Engine/src/Engine/ECS_Base/Components/SHComponent.cpp b/SHADE_Engine/src/ECS_Base/Components/SHComponent.cpp
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/Components/SHComponent.cpp
rename to SHADE_Engine/src/ECS_Base/Components/SHComponent.cpp
diff --git a/SHADE_Engine/src/Engine/ECS_Base/Components/SHComponent.h b/SHADE_Engine/src/ECS_Base/Components/SHComponent.h
similarity index 98%
rename from SHADE_Engine/src/Engine/ECS_Base/Components/SHComponent.h
rename to SHADE_Engine/src/ECS_Base/Components/SHComponent.h
index c9c5e6f1..edd8436c 100644
--- a/SHADE_Engine/src/Engine/ECS_Base/Components/SHComponent.h
+++ b/SHADE_Engine/src/ECS_Base/Components/SHComponent.h
@@ -14,13 +14,14 @@
#include "SHpch.h"
#include "../SHECSMacros.h"
+#include "SH_API.h"
namespace SHADE
{
class SHComponentManager;
- class SHComponent
+ class SH_API SHComponent
{
friend SHComponentManager;
diff --git a/SHADE_Engine/src/Engine/ECS_Base/Components/SHComponentGroup.cpp b/SHADE_Engine/src/ECS_Base/Components/SHComponentGroup.cpp
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/Components/SHComponentGroup.cpp
rename to SHADE_Engine/src/ECS_Base/Components/SHComponentGroup.cpp
diff --git a/SHADE_Engine/src/Engine/ECS_Base/Components/SHComponentGroup.h b/SHADE_Engine/src/ECS_Base/Components/SHComponentGroup.h
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/Components/SHComponentGroup.h
rename to SHADE_Engine/src/ECS_Base/Components/SHComponentGroup.h
diff --git a/SHADE_Engine/src/Engine/ECS_Base/Entity/SHEntity.cpp b/SHADE_Engine/src/ECS_Base/Entity/SHEntity.cpp
similarity index 97%
rename from SHADE_Engine/src/Engine/ECS_Base/Entity/SHEntity.cpp
rename to SHADE_Engine/src/ECS_Base/Entity/SHEntity.cpp
index 6005fb01..edf29ec7 100644
--- a/SHADE_Engine/src/Engine/ECS_Base/Entity/SHEntity.cpp
+++ b/SHADE_Engine/src/ECS_Base/Entity/SHEntity.cpp
@@ -28,7 +28,7 @@ namespace SHADE
//SHEntityManager::RemoveEntity(this->entityID);
}
- EntityID SHEntity::GetEID() noexcept
+ EntityID SHEntity::GetEID() const noexcept
{
return this->entityID;
}
diff --git a/SHADE_Engine/src/Engine/ECS_Base/Entity/SHEntity.h b/SHADE_Engine/src/ECS_Base/Entity/SHEntity.h
similarity index 98%
rename from SHADE_Engine/src/Engine/ECS_Base/Entity/SHEntity.h
rename to SHADE_Engine/src/ECS_Base/Entity/SHEntity.h
index d499042c..9077b0b9 100644
--- a/SHADE_Engine/src/Engine/ECS_Base/Entity/SHEntity.h
+++ b/SHADE_Engine/src/ECS_Base/Entity/SHEntity.h
@@ -15,6 +15,7 @@
#include "../Components/SHComponent.h"
#include "../System/SHComponentManager.h"
//#include "../../Scene/SHSceneNode.h"
+#include "SH_API.h"
@@ -23,7 +24,7 @@ namespace SHADE
class SHComponentManager;
class SHEntityManager;
- class SHEntity
+ class SH_API SHEntity
{
public:
@@ -77,7 +78,7 @@ namespace SHADE
* \return uint32_t
* The entityID of this Entity object.
***************************************************************************/
- EntityID GetEID() noexcept;
+ EntityID GetEID() const noexcept;
/*!*************************************************************************
* \brief Set the Active object
diff --git a/SHADE_Engine/src/Engine/ECS_Base/General/SHFamily.h b/SHADE_Engine/src/ECS_Base/General/SHFamily.h
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/General/SHFamily.h
rename to SHADE_Engine/src/ECS_Base/General/SHFamily.h
diff --git a/SHADE_Engine/src/Engine/ECS_Base/General/SHHandleGenerator.h b/SHADE_Engine/src/ECS_Base/General/SHHandleGenerator.h
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/General/SHHandleGenerator.h
rename to SHADE_Engine/src/ECS_Base/General/SHHandleGenerator.h
diff --git a/SHADE_Engine/src/Engine/ECS_Base/General/SHSparseBase.h b/SHADE_Engine/src/ECS_Base/General/SHSparseBase.h
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/General/SHSparseBase.h
rename to SHADE_Engine/src/ECS_Base/General/SHSparseBase.h
diff --git a/SHADE_Engine/src/Engine/ECS_Base/General/SHSparseSet.h b/SHADE_Engine/src/ECS_Base/General/SHSparseSet.h
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/General/SHSparseSet.h
rename to SHADE_Engine/src/ECS_Base/General/SHSparseSet.h
diff --git a/SHADE_Engine/src/Engine/ECS_Base/General/SHSparseSetContainer.h b/SHADE_Engine/src/ECS_Base/General/SHSparseSetContainer.h
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/General/SHSparseSetContainer.h
rename to SHADE_Engine/src/ECS_Base/General/SHSparseSetContainer.h
diff --git a/SHADE_Engine/src/Engine/ECS_Base/SHECSMacros.h b/SHADE_Engine/src/ECS_Base/SHECSMacros.h
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/SHECSMacros.h
rename to SHADE_Engine/src/ECS_Base/SHECSMacros.h
diff --git a/SHADE_Engine/src/Engine/ECS_Base/System/SHComponentManager.cpp b/SHADE_Engine/src/ECS_Base/System/SHComponentManager.cpp
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/System/SHComponentManager.cpp
rename to SHADE_Engine/src/ECS_Base/System/SHComponentManager.cpp
diff --git a/SHADE_Engine/src/Engine/ECS_Base/System/SHComponentManager.h b/SHADE_Engine/src/ECS_Base/System/SHComponentManager.h
similarity index 99%
rename from SHADE_Engine/src/Engine/ECS_Base/System/SHComponentManager.h
rename to SHADE_Engine/src/ECS_Base/System/SHComponentManager.h
index 05a3d1ee..75db35d5 100644
--- a/SHADE_Engine/src/Engine/ECS_Base/System/SHComponentManager.h
+++ b/SHADE_Engine/src/ECS_Base/System/SHComponentManager.h
@@ -19,13 +19,14 @@
#include "../Components/SHComponent.h"
#include "../Components/SHComponentGroup.h"
//#include "Scene/SHSceneNode.h"
+#include "SH_API.h"
#include
namespace SHADE
{
- class SHComponentManager
+ class SH_API SHComponentManager
{
private:
@@ -34,7 +35,7 @@ namespace SHADE
//The Container of all Componentgroups
static std::vector componentGroups;
- friend class SHSceneNode;
+ friend struct SHSceneNode;
diff --git a/SHADE_Engine/src/Engine/ECS_Base/System/SHEntityManager.cpp b/SHADE_Engine/src/ECS_Base/System/SHEntityManager.cpp
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/System/SHEntityManager.cpp
rename to SHADE_Engine/src/ECS_Base/System/SHEntityManager.cpp
diff --git a/SHADE_Engine/src/Engine/ECS_Base/System/SHEntityManager.h b/SHADE_Engine/src/ECS_Base/System/SHEntityManager.h
similarity index 99%
rename from SHADE_Engine/src/Engine/ECS_Base/System/SHEntityManager.h
rename to SHADE_Engine/src/ECS_Base/System/SHEntityManager.h
index 11e896d5..802ef75d 100644
--- a/SHADE_Engine/src/Engine/ECS_Base/System/SHEntityManager.h
+++ b/SHADE_Engine/src/ECS_Base/System/SHEntityManager.h
@@ -22,11 +22,12 @@
#include "../Components/SHComponent.h"
#include "../General/SHHandleGenerator.h"
#include "../SHECSMacros.h"
+#include "SH_API.h"
namespace SHADE
{
- class SHEntityManager
+ class SH_API SHEntityManager
{
private:
static std::vector> entityVec;
diff --git a/SHADE_Engine/src/Engine/ECS_Base/System/SHSystem.h b/SHADE_Engine/src/ECS_Base/System/SHSystem.h
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/System/SHSystem.h
rename to SHADE_Engine/src/ECS_Base/System/SHSystem.h
diff --git a/SHADE_Engine/src/Engine/ECS_Base/System/SHSystemManager.cpp b/SHADE_Engine/src/ECS_Base/System/SHSystemManager.cpp
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/System/SHSystemManager.cpp
rename to SHADE_Engine/src/ECS_Base/System/SHSystemManager.cpp
diff --git a/SHADE_Engine/src/Engine/ECS_Base/System/SHSystemManager.h b/SHADE_Engine/src/ECS_Base/System/SHSystemManager.h
similarity index 100%
rename from SHADE_Engine/src/Engine/ECS_Base/System/SHSystemManager.h
rename to SHADE_Engine/src/ECS_Base/System/SHSystemManager.h
diff --git a/SHADE_Engine/src/Events/SHEvent.h b/SHADE_Engine/src/Events/SHEvent.h
new file mode 100644
index 00000000..2ca6648e
--- /dev/null
+++ b/SHADE_Engine/src/Events/SHEvent.h
@@ -0,0 +1,22 @@
+/******************************************************************************
+ * \file SHEvent.h
+ * \author Loh Xiao Qi
+ * \brief Event class declaration
+ *
+ * \copyright 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 "SHEventDefines.h"
+
+namespace SHADE
+{
+ struct SHEvent
+ {
+ SHEventIdentifier type;
+ SHEventDataPtr dataPtr;
+ SHEventHandle handle;
+ };
+}
diff --git a/SHADE_Engine/src/Events/SHEventDefines.h b/SHADE_Engine/src/Events/SHEventDefines.h
new file mode 100644
index 00000000..76b403bd
--- /dev/null
+++ b/SHADE_Engine/src/Events/SHEventDefines.h
@@ -0,0 +1,9 @@
+#pragma once
+#include "SHpch.h"
+
+typedef uint32_t SHEventIdentifier;
+typedef uint32_t SHEventHandle;
+typedef void* SHEventDataPtr;
+
+//Add your event identifiers here:
+constexpr SHEventIdentifier SH_EXAMPLE_EVENT{0};
\ No newline at end of file
diff --git a/SHADE_Engine/src/Events/SHEventManager.cpp b/SHADE_Engine/src/Events/SHEventManager.cpp
new file mode 100644
index 00000000..1cede2a0
--- /dev/null
+++ b/SHADE_Engine/src/Events/SHEventManager.cpp
@@ -0,0 +1,107 @@
+/******************************************************************************
+ * \file SHEventManager.cpp
+ * \author Loh Xiao Qi
+ * \brief Function Implmentations for SHEventManager
+ *
+ * \copyright Copyright (c) 2021 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 "SHEventManager.h"
+
+namespace SHADE
+{
+ std::unordered_map SHEventManager::packageReceiverRegistry;
+ std::unordered_map SHEventManager::dataEventMap;
+
+ SHEventHandle SHEventManager::handleCounter{ 0 };
+
+ /****************************************************************************
+ * \param ListenerConstPtr - Const pointer to listener that sent event.
+ * \param EventType - Templated type for every type of event
+
+ * \brief Receives event from the listeners.
+ ****************************************************************************/
+ void SHEventManager::CatchEvent(SHEvent event)
+ {
+
+ // Do something with the event
+
+ Broadcast(event);
+ }
+
+ /****************************************************************************
+ * \param ResponseFunction - function pointer from receiver to be passed
+ * into event manager to be called when events are broadcasted.
+ * \param SHEventIdentifier - package type that corresponding subscriber is
+ * subscribing to.
+
+ * \brief Links a function pointer from a subscriber to a particular
+ * package type
+ ****************************************************************************/
+ void SHEventManager::SubscribeTo(SHEventIdentifier pkgType, ReceiverPtr receiver)
+ {
+ RegisterReceiverToType(pkgType, receiver);
+ }
+
+ template
+ T* SHEventManager::BroadcastEvent(T data, SHEventIdentifier eventType)
+ {
+ SHEventDataPtr ptr = new std::byte[sizeof(data)];
+
+ std::memcpy(ptr, &data, sizeof(data));
+
+ CatchEvent(
+ {
+ eventType,
+ ptr,
+ handleCounter++
+ }
+ );
+
+ return reinterpret_cast(ptr);
+ }
+
+ /****************************************************************************
+ * \param ReceiverPtr - Pointer to receiver
+ * \param ListenerConstPtr - Const pointer to listener that receiver is
+ * subscribing to.
+
+ * \brief Registers receiver as a subscriber to listener in the registry.
+ ****************************************************************************/
+ void SHEventManager::RegisterReceiverToType(
+ SHEventIdentifier pkgType, ReceiverPtr receiver)
+ {
+ if (packageReceiverRegistry.contains(pkgType))
+ {
+ packageReceiverRegistry[pkgType].emplace_back(receiver);
+ }
+ else
+ {
+ packageReceiverRegistry.emplace(pkgType, std::vector{ receiver });
+ }
+ }
+
+ /****************************************************************************
+ * \param ListenerConstPtr - Const pointer to listener that sent event.
+ * \param EventType - Event data
+
+ * \brief Broadcast event to all receivers that are subscribed to this
+ * listener.
+ ****************************************************************************/
+ void SHEventManager::Broadcast(SHEvent const& event)
+ {
+ ResponseVec& receivers{ packageReceiverRegistry[event.type] };
+ for (auto& receiver : receivers)
+ {
+ receiver->Receive(event);
+ }
+
+ //auto& funcs{ ackageReceiverRegistry[event.GetType()] };
+ //for (auto func : funcs)
+ //{
+ // func(event.GetData());
+ //}
+ }
+}
diff --git a/SHADE_Engine/src/Events/SHEventManager.h b/SHADE_Engine/src/Events/SHEventManager.h
new file mode 100644
index 00000000..f2f19fef
--- /dev/null
+++ b/SHADE_Engine/src/Events/SHEventManager.h
@@ -0,0 +1,116 @@
+/******************************************************************************
+ * \file SHEventManager.h
+ * \author Loh Xiao Qi
+ * \brief Class declaration for event manager.
+ *
+ * \copyright 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 "SHEvent.h"
+#include "SHEventReceiver.h"
+#include
+#include
+
+/******************************************************************************
+ INSTRUCTIONS FOR USE:
+ On broadcaster side:
+ 1. Create a struct/class to contain the data that you would need to send
+ in the event.
+ 2. Create unique event identifier in SHEventDefines.h, follow the example
+ provided.
+ 3. When ready to send the event, call
+ SHEventManager::BroadcastEvent(exampleClass, EVENT_IDENTIFIER);
+
+ Headers required: SHEventManager.h
+
+ On Receiver side:
+ 1. Create a function with the signature:
+ SHEventHandle FunctionName(SHEvent);
+ 2. In the init function of the class, copy the below in and replace the
+ necessary:
+
+ std::shared_ptr> thisReceiver{
+ std::make_shared>(this, &ReceiverClass::ReceiveFunction)
+ };
+ ReceiverPtr receiver = std::dynamic_pointer_cast(thisReceiver);
+ SHEventManager::SubscribeTo(EVENT_IDENTIFIER, receiver);
+
+ ReceiverClass is the class that the receiver is in. E.g., SHPhysicsSystem
+
+ 3. Note: The EventIdentifier should match all that is defined in
+ SHEventDefines.h so check there. When the receiver catches the event, it
+ needs to know the struct that the broadcaster is using to cast the void*
+ properly.
+
+ Headers required: SHEventManager.h, SHEventReceiver.h
+
+ If you have any questions/suggestions for improvement lmk.
+******************************************************************************/
+
+namespace SHADE
+{
+ using ResponseFunction = std::function;
+ using ReceiverPtr = std::shared_ptr;
+ using ResponseVec = std::vector;
+ using StaticResponseVec = std::vector;
+
+ using EventManagerListener = std::function;
+
+ class SHEventManager
+ {
+ public:
+
+ /****************************************************************************
+ * \param ListenerConstPtr - Const pointer to listener that sent event.
+ * \param EventType - Templated type for every type of event
+
+ * \brief Receives event from the listeners.
+ ****************************************************************************/
+ static void CatchEvent(SHEvent);
+
+ /****************************************************************************
+ * \param ResponseFunction - function pointer from receiver to be passed
+ * into event manager to be called when events are broadcasted.
+ * \param SHPackageType - package type that corresponding subscriber is
+ * subscribing to.
+
+ * \brief Links a function pointer from a subscriber to a particular
+ * package type
+ ****************************************************************************/
+ static void SubscribeTo(SHEventIdentifier, ReceiverPtr);
+
+ template
+ static T* BroadcastEvent(T data, SHEventIdentifier eventType);
+
+ private:
+
+ // Registry for broadcasters and subscribers
+ static std::unordered_map packageReceiverRegistry;
+ static std::unordered_map dataEventMap;
+
+ static SHEventHandle handleCounter;
+
+ /****************************************************************************
+ * \param ListenerConstPtr - Const pointer to listener that sent event.
+ * \param EventType - Event data
+
+ * \brief Broadcast event to all receivers that are subscribed to this
+ * listener.
+ ****************************************************************************/
+ static void Broadcast(SHEvent const&);
+
+ /****************************************************************************
+ * \param ReceiverPtr - Pointer to receiver
+ * \param ListenerConstPtr - Const pointer to listener that receiver is
+ * subscribing to.
+
+ * \brief Registers receiver as a subscriber to listener in the registry.
+ ****************************************************************************/
+ static void RegisterReceiverToType(SHEventIdentifier, ReceiverPtr);
+
+ };
+
+}
diff --git a/SHADE_Engine/src/Events/SHEventReceiver.h b/SHADE_Engine/src/Events/SHEventReceiver.h
new file mode 100644
index 00000000..f968e579
--- /dev/null
+++ b/SHADE_Engine/src/Events/SHEventReceiver.h
@@ -0,0 +1,33 @@
+#pragma once
+
+#include "SHEvent.h"
+
+namespace SHADE
+{
+ class SHEventReceiver
+ {
+ private:
+ public:
+ virtual void Receive(SHEvent) = 0;
+ };
+
+ template
+ class SHEventReceiverSpec : public SHEventReceiver
+ {
+ private:
+ T* object;
+ SHEventHandle(T::*callback)(SHEvent);
+
+ public:
+ SHEventReceiverSpec(T* obj, void(T::* cb)(SHEventDataPtr))
+ :SHEventReceiver(), object{ obj }, callback{ cb }
+ {
+
+ }
+
+ void Receive(SHEvent evt) override
+ {
+ (object->*callback)(evt);
+ }
+ };
+}
diff --git a/SHADE_Engine/src/FRC/SHFramerateController.cpp b/SHADE_Engine/src/FRC/SHFramerateController.cpp
new file mode 100644
index 00000000..d64c6336
--- /dev/null
+++ b/SHADE_Engine/src/FRC/SHFramerateController.cpp
@@ -0,0 +1,134 @@
+/*********************************************************************
+ * \file SHFramerateController.cpp
+ * \author Ryan Wang Nian Jing
+ * \brief Definition for functions of the framerate controller
+ * Handles changing of scenes and manages loop (timestep, etc.)
+ *
+ * \copyright 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
+#include
+#include
+#include "SHFramerateController.h"
+#include "../Tools/SHLogger.h"
+
+namespace SHADE
+{
+ //Init statics
+ double SHFramerateController::fixedTimestep = 0.01;
+ SHScene* SHFramerateController::previousScene = nullptr;
+ SHScene* SHFramerateController::currentScene = nullptr;
+ SHScene* SHFramerateController::nextScene = nullptr;
+ bool SHFramerateController::toRestart = false;
+ bool SHFramerateController::toQuit = false;
+
+ //Scene manager loop
+ void SHFramerateController::Run(SHScene* firstScene)
+ {
+ if (firstScene == nullptr)
+ {
+ SHLOG_ERROR("Do not pass a nullptr as the firstScene");
+ return;
+ }
+
+ //Set quit and restart flags to false
+ toQuit = false;
+ toRestart = false;
+
+ //Set the first scene to run
+ previousScene = firstScene;
+ currentScene = firstScene;
+ nextScene = firstScene;
+
+ while (!toQuit)
+ {
+ if (toRestart)
+ {
+ //Restart current scene
+ currentScene = previousScene;
+ nextScene = previousScene;
+ toRestart = false;
+ }
+ else
+ {
+ //Move to a new scene
+ currentScene->Load();
+ }
+
+ //Call init function of current scene
+ currentScene->Init();
+
+ //Have an initial value
+ //This frame time will fluctuate
+ //SHOULD be larger than the fixed timestep
+ //TODO this might need to be changed
+ double variableLastFrameTime = fixedTimestep;
+
+ //Time accumulator for meshing between fixed and variable timesteps
+ double accumulator = 0.0;
+
+ //Start state loop
+ while (currentScene == nextScene && !toQuit && !toRestart)
+ {
+ //Use of new STL timing functions
+ //https://en.cppreference.com/w/cpp/chrono
+ std::chrono::duration deltaTime;
+
+ auto startTime = std::chrono::high_resolution_clock::now();
+
+ //Whittle down the accumulator by continuously simulating
+ for (; accumulator > fixedTimestep; accumulator -= fixedTimestep)
+ {
+ MSG msg;
+ if (PeekMessage(&msg, NULL, 0, 0, PM_REMOVE))
+ {
+ TranslateMessage(&msg);
+ DispatchMessage(&msg);
+ }
+
+ //TODO change to double
+ currentScene->Update((float)fixedTimestep);
+ }
+
+ //Interpolation
+ //Manage the alpha value well
+ //https://randomascii.wordpress.com/2012/02/13/dont-store-that-in-a-float/
+ //Key points:
+ //1) Any time you add or subtract floats of widely varying
+ // magnitudes, you need to watch for loss of precision
+ //2) Sometimes using double instead of float is the correct
+ // solution, but often a more stable algorithm is more important
+ //3) calcT() should probably use double (to give sufficient
+ // precision after many hours of gameplay)
+
+ //TODO awaiting approval to use this
+ //double alpha = accumulator / fixedTimestep;
+
+ //assert alpha does not go out of range
+
+ currentScene->Render();
+
+ auto endTime = std::chrono::high_resolution_clock::now();
+ deltaTime = endTime - startTime;
+ variableLastFrameTime = deltaTime.count();
+
+ //Increase accumulator
+ accumulator += variableLastFrameTime;
+ }
+
+ //Free once out of scene loop
+ currentScene->Free();
+
+ //Check if not to restart state
+ //If so, unload
+ if (!toRestart) currentScene->Unload();
+
+ //Shift forward scenes
+ previousScene = currentScene;
+ currentScene = nextScene;
+ }
+ }
+}
\ No newline at end of file
diff --git a/SHADE_Engine/src/FRC/SHFramerateController.h b/SHADE_Engine/src/FRC/SHFramerateController.h
new file mode 100644
index 00000000..26f276d8
--- /dev/null
+++ b/SHADE_Engine/src/FRC/SHFramerateController.h
@@ -0,0 +1,62 @@
+/*********************************************************************
+ * \file SHFramerateController.h
+ * \author Ryan Wang Nian Jing
+ * \brief Declaration for the framerate controller
+ * Handles changing of scenes and manages loop (timestep, etc.)
+ *
+ * \copyright 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.
+ *********************************************************************/
+
+#ifndef SH_FRAMERATECONTROLLER_H
+#define SH_FRAMERATECONTROLLER_H
+#pragma once
+
+#include "../Scene/SHScene.h"
+
+namespace SHADE
+{
+ class SHFramerateController
+ {
+ private:
+ //scene pointers
+ static SHScene* previousScene;
+ static SHScene* currentScene;
+ static SHScene* nextScene;
+
+ //Flags
+ //Whether the flag has been raised for the game to be quit
+ static bool toQuit;
+
+ //Whether the flag has been raised for the current scene to restart
+ static bool toRestart;
+
+ public:
+ //Fixed timestep value for physics. Default at 1/100th of a second.
+ //Should be lower than the variable refresh rate
+ static double fixedTimestep;
+
+ //Scene Manager Loop
+ //This loop is vital to the game because it runs for as long as the game
+ //runs. Before entering, initialise vital systems for game. After exiting,
+ //free these vital systems before finishing the main() function and
+ //terminating the game
+ //Parameter of firstScene is what scene the game should start with
+ static void Run(SHScene* firstScene);
+
+ //Set the flag to restart the current game scene
+ static inline void RestartScene() { toRestart = true; }
+
+ //Set the flag to halt running of the scene manager and quit the game
+ static inline void QuitGame() { toQuit = true; }
+
+ //Set the next scene to be excuted
+ //This will tell the scene manager to
+ //halt execution of the current scene and prepare
+ //execution of the next
+ static inline void SetNextScene(SHScene* const next) { nextScene = next; }
+ };
+}
+
+#endif
\ No newline at end of file
diff --git a/SHADE_Engine/src/Filesystem/SHFileSystem.cpp b/SHADE_Engine/src/Filesystem/SHFileSystem.cpp
new file mode 100644
index 00000000..5663dadd
--- /dev/null
+++ b/SHADE_Engine/src/Filesystem/SHFileSystem.cpp
@@ -0,0 +1,135 @@
+#include "SHpch.h"
+#include "SHFileSystem.h"
+#include "fileapi.h"
+#include
+#include
+#include
+
+namespace SHADE
+{
+ char const FOLDER_MAX_COUNT {15};
+
+ std::unordered_map> SHFileSystem::folders;
+ FolderPointer SHFileSystem::root {nullptr};
+
+ SHFolder::SHFolder(FolderHandle id, FolderName name)
+ :id{ id }, name{ name }, subFolders(0), folded{ false }, path{""}
+ {
+ }
+
+ FolderLocation SHFileSystem::CreateNewFolderHere(FolderName name, FolderLocation here) noexcept
+ {
+ if (here == 0)
+ {
+ if (!folders.contains(0))
+ {
+ folders[0] = std::make_unique(0, "root");
+ }
+
+ auto const count = static_cast(folders[here]->subFolders.size());
+
+ assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n");
+
+ auto const location = static_cast(count);
+
+ CreateFolder(folders[0]->path, here, location, name);
+
+ return location;
+ }
+
+ assert(folders.contains(here), "Folder creation location does not exist/invalid\n");
+
+ auto const count = static_cast(folders[here]->subFolders.size());
+
+ FolderHandle location = here;
+ location <<= FOLDER_BIT_ALLOCATE;
+ location |= count;
+
+ assert(count < FOLDER_MAX_COUNT, "Max subfolders reached\n");
+ CreateFolder(folders[0]->path, here, location, name);
+
+ return location;
+ }
+
+ bool SHFileSystem::DeleteFolder(FolderPointer location) noexcept
+ {
+ assert(folders.contains(location->id), "Delete target does not exist/invalid.\n");
+
+ for (auto const& subFolder : folders[location->id]->subFolders)
+ {
+ DeleteFolder(subFolder);
+ }
+
+ RemoveDirectoryA(folders[location->id]->path.c_str());
+ return true;
+ }
+
+ void SHFileSystem::StartupFillDirectories(FolderPath path) noexcept
+ {
+ std::queue folderQueue;
+
+ folderQueue.push(RegisterFolder(path, 0, 0, "Root"));
+
+ while (!folderQueue.empty())
+ {
+ auto folder = folderQueue.front();
+ folderQueue.pop();
+ FolderCounter count = 0;
+
+ for (auto const& dirEntry : std::filesystem::directory_iterator(folder->path))
+ {
+ if (!dirEntry.is_directory())
+ {
+ continue;
+ }
+
+ FolderLocation location = folder->id;
+ location <<= FOLDER_BIT_ALLOCATE;
+ location |= ++count;
+
+ std::string name = dirEntry.path().string();
+ name = name.substr(name.find_last_of('/') + 1, name.length() - name.find_last_of('/'));
+
+ FolderPointer newFolder{ RegisterFolder(
+ dirEntry.path().string(),
+ folder->id,
+ location,
+ name)
+ };
+
+ folderQueue.push(newFolder);
+ folder->subFolders.push_back(newFolder);
+ }
+ }
+ }
+
+ FolderPointer SHFileSystem::CreateFolder(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept
+ {
+ assert(
+ CreateDirectoryA(path.c_str(), nullptr),
+ "Failed to create folder\n"
+ );
+
+ folders[location] = std::make_unique(location, name);
+ folders[location]->path = path;
+ folders[parent]->subFolders.push_back(folders[location].get());
+
+ return FolderMakeHelper(path, parent, location, name);
+ }
+
+ FolderPointer SHFileSystem::RegisterFolder(FolderPath path, FolderLocation parent, FolderHandle location,
+ FolderName name) noexcept
+ {
+ return FolderMakeHelper(path, parent, location, name);
+ }
+
+ FolderPointer SHFileSystem::FolderMakeHelper(FolderPath path, FolderLocation parent, FolderHandle location,
+ FolderName name) noexcept
+ {
+ folders[location] = std::make_unique(location, name);
+ folders[location]->path = path;
+ folders[parent]->subFolders.push_back(folders[location].get());
+
+ return folders[location].get();
+ }
+}
diff --git a/SHADE_Engine/src/Filesystem/SHFileSystem.h b/SHADE_Engine/src/Filesystem/SHFileSystem.h
new file mode 100644
index 00000000..9b8b94a2
--- /dev/null
+++ b/SHADE_Engine/src/Filesystem/SHFileSystem.h
@@ -0,0 +1,57 @@
+#pragma once
+
+#include
+#include
+#include
+#include
+
+namespace SHADE
+{
+ class SHFolder;
+
+ typedef unsigned char FolderCounter;
+ typedef unsigned char FileCounter;
+ typedef uint64_t FolderLocation;
+ typedef uint64_t FolderHandle;
+ typedef std::string FolderName;
+ typedef std::string FolderPath;
+ typedef SHFolder* FolderPointer;
+
+ constexpr char FOLDER_BIT_ALLOCATE{ 4 };
+ constexpr char FOLDER_MAX_DEPTH{ 16 };
+
+ class SHFolder
+ {
+ public:
+ SHFolder(FolderHandle id, FolderName name);
+
+ FolderHandle id;
+ FolderName name;
+ std::vector subFolders;
+
+ bool folded;
+
+ private:
+ FolderPath path;
+ friend class SHFileSystem;
+ };
+
+ class SHFileSystem
+ {
+ public:
+ static FolderLocation CreateNewFolderHere(FolderName name, FolderLocation here = 0) noexcept;
+
+ static bool DeleteFolder(FolderPointer location) noexcept;
+
+ static void StartupFillDirectories(FolderPath path) noexcept;
+
+ private:
+ static FolderPointer root;
+
+ static std::unordered_map> folders;
+
+ static FolderPointer CreateFolder(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept;
+ static FolderPointer RegisterFolder(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept;
+ static FolderPointer FolderMakeHelper(FolderPath path, FolderLocation parent, FolderHandle location, FolderName name) noexcept;
+ };
+}
\ No newline at end of file
diff --git a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h
index 8c803e1d..eeaf6b12 100644
--- a/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h
+++ b/SHADE_Engine/src/Graphics/MiddleEnd/Interface/SHGraphicsSystem.h
@@ -21,7 +21,7 @@ of DigiPen Institute of Technology is prohibited.
#include "Graphics/SHVulkanIncludes.h"
#include "Graphics/MiddleEnd/PerFrame/SHRenderContext.h"
#include "Graphics/RenderGraph/SHRenderGraph.h"
-#include "Engine/ECS_Base/System/SHSystem.h"
+#include "ECS_Base/System/SHSystem.h"
#include "Graphics/Descriptors/SHVkDescriptorPool.h"
namespace SHADE
diff --git a/SHADE_Engine/src/Graphics/Windowing/SHWindow.h b/SHADE_Engine/src/Graphics/Windowing/SHWindow.h
index a70058a1..1e08dcb0 100644
--- a/SHADE_Engine/src/Graphics/Windowing/SHWindow.h
+++ b/SHADE_Engine/src/Graphics/Windowing/SHWindow.h
@@ -5,6 +5,7 @@
#include
#include
#include "SHWindowMap.h"
+#include "SH_API.h"
namespace SHADE
{
@@ -67,7 +68,7 @@ namespace SHADE
std::string icoPath = "";
};
- class SHWindow
+ class SH_API SHWindow
{
public:
using SHVec2 = std::pair;
diff --git a/SHADE_Engine/src/Math/SHMath.h b/SHADE_Engine/src/Math/SHMath.h
new file mode 100644
index 00000000..9763abe2
--- /dev/null
+++ b/SHADE_Engine/src/Math/SHMath.h
@@ -0,0 +1,9 @@
+#pragma once
+
+#include "SHMathHelpers.h"
+
+#include "Vector/SHVec2.h"
+#include "Vector/SHVec3.h"
+#include "Vector/SHVec4.h"
+
+#include "SHMatrix.h"
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/SHMathHelpers.cpp b/SHADE_Engine/src/Math/SHMathHelpers.cpp
new file mode 100644
index 00000000..f3608778
--- /dev/null
+++ b/SHADE_Engine/src/Math/SHMathHelpers.cpp
@@ -0,0 +1,34 @@
+/****************************************************************************************
+ * \file SHMathHelpers.cpp
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Implementation for various mathematical helper functions.
+ *
+ * \copyright 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
+#include
+
+// Primary Header
+#include "SHMathHelpers.h"
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Data Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ std::default_random_engine SHMath::rng;
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ void SHMath::Initialise()
+ {
+ const unsigned SEED = static_cast(std::chrono::system_clock::now().time_since_epoch().count());
+ rng.seed(SEED);
+ }
+}
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/SHMathHelpers.h b/SHADE_Engine/src/Math/SHMathHelpers.h
new file mode 100644
index 00000000..9135230e
--- /dev/null
+++ b/SHADE_Engine/src/Math/SHMathHelpers.h
@@ -0,0 +1,100 @@
+/****************************************************************************************
+ * \file SHMathHelpers.h
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Interface for various mathematical helper functions.
+ *
+ * \copyright 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
+#include
+#include
+#include
+
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Concepts */
+ /*-----------------------------------------------------------------------------------*/
+
+ template
+ concept IsArithmetic = std::is_arithmetic_v;
+
+ template
+ concept IsIntegral = std::is_integral_v;
+
+ template
+ concept IsFloatingPoint = std::is_floating_point_v;
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Type Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ class SHMath
+ {
+ public:
+ /*---------------------------------------------------------------------------------*/
+ /* Static Data Members */
+ /*---------------------------------------------------------------------------------*/
+
+ /** Standard Epsilon value for comparing Single-Precision Floating-Point values. */
+ static constexpr float EPSILON = 0.001f;
+
+ /** Single-Precision Floating-Point value of infinity */
+ static constexpr float INF = std::numeric_limits::infinity();
+
+ static constexpr float PI = std::numbers::pi_v;
+ static constexpr float HALF_PI = PI * 0.5f;
+ static constexpr float TWO_PI = 2.0f * PI;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Static Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ static void Initialise ();
+
+ template
+ [[nodiscard]] static constexpr T DegreesToRadians (T angleInDeg);
+
+ template
+ [[nodiscard]] static constexpr T RadiansToDegrees (T angleInRad);
+
+ template
+ [[nodiscard]] static T Lerp (T a, T b, T alpha);
+
+ template
+ [[nodiscard]] static T ClampedLerp (T a, T b, T alpha, T alphaMin, T alphaMax);
+
+ template
+ [[nodiscard]] static T Wrap (T value, T min, T max);
+
+ template
+ [[nodiscard]] static T GenerateRandomNumber (T lowerBound = 0, T upperBound = 1);
+
+ /**
+ * @brief Compares two floating-point values for equality within given tolerances.
+ * @tparam T A floating-point type
+ * @param lhs A floating-point value.
+ * @param rhs A floating-point value.
+ * @param absTolerance The absolute tolerance to compare the values for equality.
+ * @param relTolerance The relative tolerance for comparing large values for equality.
+ * @returns True if the values are equal within the specified tolerances.
+ */
+ template
+ [[nodiscard]] static bool CompareFloat (T lhs, T rhs, T absTolerance = EPSILON, T relTolerance = EPSILON);
+
+ private:
+ /*---------------------------------------------------------------------------------*/
+ /* Static Data Members */
+ /*---------------------------------------------------------------------------------*/
+ static std::default_random_engine rng;
+ };
+
+} // namespace SHADE
+
+#include "SHMathHelpers.hpp"
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/SHMathHelpers.hpp b/SHADE_Engine/src/Math/SHMathHelpers.hpp
new file mode 100644
index 00000000..f0a1de12
--- /dev/null
+++ b/SHADE_Engine/src/Math/SHMathHelpers.hpp
@@ -0,0 +1,90 @@
+/****************************************************************************************
+ * \file SHMathHelpers.hpp
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Implementation for various templated mathematical helper functions.
+ *
+ * \copyright 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
+
+// Primary Header
+#include "SHMathHelpers.h"
+
+#include
+#include
+
+// TODOs (Diren): Include pch?
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Function Members Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ template
+ constexpr T SHMath::DegreesToRadians(T angleInDeg)
+ {
+ return angleInDeg * static_cast(PI / 180.0f);
+ }
+
+ template
+ constexpr T SHMath::RadiansToDegrees(T angleInRad)
+ {
+ return angleInRad * static_cast(180.0f / PI);
+ }
+
+ template
+ T SHMath::Lerp(T a, T b, T alpha)
+ {
+ return a + alpha * (b - a);
+ }
+
+ template
+ T SHMath::ClampedLerp(T a, T b, T alpha, T alphaMin, T alphaMax)
+ {
+ const T T_ACTUAL = std::clamp(alpha, alphaMin, alphaMax);
+ return a + T_ACTUAL * (b - a);
+ }
+
+ template
+ T SHMath::Wrap(T value, T min, T max)
+ {
+ while (value < min)
+ {
+ value = max - (min - value);
+ }
+
+ while (value > max)
+ {
+ value = min + (value - max);
+ }
+
+ return value;
+ }
+
+ template
+ T SHMath::GenerateRandomNumber(T lowerBound, T upperBound)
+ {
+ if constexpr (IsIntegral)
+ {
+ std::uniform_int_distribution distribution(lowerBound, upperBound);
+ return distribution(rng);
+ }
+ if constexpr (IsFloatingPoint)
+ {
+ std::uniform_real_distribution distribution(lowerBound, upperBound);
+ return distribution(rng);
+ }
+ }
+
+
+ template
+ bool CompareFloat(T lhs, T rhs, T absTolerance, T relTolerance)
+ {
+ return std::fabs(lhs - rhs) <= std::max(absTolerance, relTolerance * std::max(abs(lhs), abs(rhs)));
+ }
+
+} // namespace SHADE
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/SHMatrix.cpp b/SHADE_Engine/src/Math/SHMatrix.cpp
new file mode 100644
index 00000000..8e8281d0
--- /dev/null
+++ b/SHADE_Engine/src/Math/SHMatrix.cpp
@@ -0,0 +1,601 @@
+/****************************************************************************************
+ * \file SHMatrix.hpp
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Implementation for a Matrix.
+ *
+ * \copyright 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
+
+// Primary Header
+#include "SHMatrix.h"
+
+#include "Vector/SHVec2.h"
+#include "Vector/SHVec3.h"
+#include "Vector/SHVec4.h"
+#include "SHQuaternion.h"
+
+using namespace DirectX;
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Data Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ const SHMatrix SHMatrix::Identity
+ {
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f
+ };
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Constructors & Destructor Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHMatrix::SHMatrix() noexcept
+ : XMFLOAT4X4
+ (
+ 1.0f, 0.0f, 0.0f, 0.0f,
+ 0.0f, 1.0f, 0.0f, 0.0f,
+ 0.0f, 0.0f, 1.0f, 0.0f,
+ 0.0f, 0.0f, 0.0f, 1.0f
+ )
+ {}
+
+ SHMatrix::SHMatrix
+ (
+ const SHVec4& r0, const SHVec4& r1,
+ const SHVec4& r2, const SHVec4& r3
+ ) noexcept
+ : XMFLOAT4X4
+ (
+ r0.x, r0.y, r0.z, r0.w,
+ r1.x, r1.y, r1.z, r1.w,
+ r2.x, r2.y, r2.z, r2.w,
+ r3.x, r3.y, r3.z, r3.w
+ )
+ {}
+
+ SHMatrix::SHMatrix
+ (
+ float m00, float m01, float m02, float m03,
+ float m10, float m11, float m12, float m13,
+ float m20, float m21, float m22, float m23,
+ float m30, float m31, float m32, float m33
+ ) noexcept
+ : XMFLOAT4X4
+ (
+ m00, m01, m02, m03,
+ m10, m11, m12, m13,
+ m20, m21, m22, m23,
+ m30, m31, m32, m33
+ )
+ {}
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Operator Overload Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHMatrix& SHMatrix::operator+=(const SHMatrix& rhs) noexcept
+ {
+ return *this = *this + rhs;
+ }
+
+ SHMatrix& SHMatrix::operator-=(const SHMatrix& rhs) noexcept
+ {
+ return *this = *this - rhs;
+ }
+
+ SHMatrix& SHMatrix::operator*=(const SHMatrix& rhs) noexcept
+ {
+ return *this = *this * rhs;
+ }
+
+ SHMatrix& SHMatrix::operator*=(float rhs) noexcept
+ {
+ return *this = *this * rhs;
+ }
+
+ SHMatrix& SHMatrix::operator/=(const SHMatrix& rhs) noexcept
+ {
+ return *this = *this / rhs;
+ }
+
+ SHMatrix& SHMatrix::operator/=(float rhs) noexcept
+ {
+ return *this = *this / rhs;
+ }
+
+ SHMatrix SHMatrix::operator+(const SHMatrix& rhs) const noexcept
+ {
+ SHMatrix result;
+
+ const XMVECTOR L1 = XMLoadFloat4(reinterpret_cast(&_11));
+ const XMVECTOR L2 = XMLoadFloat4(reinterpret_cast(&_21));
+ const XMVECTOR L3 = XMLoadFloat4(reinterpret_cast(&_31));
+ const XMVECTOR L4 = XMLoadFloat4(reinterpret_cast(&_41));
+
+ const XMVECTOR R1 = XMLoadFloat4(reinterpret_cast(&rhs._11));
+ const XMVECTOR R2 = XMLoadFloat4(reinterpret_cast(&rhs._21));
+ const XMVECTOR R3 = XMLoadFloat4(reinterpret_cast(&rhs._31));
+ const XMVECTOR R4 = XMLoadFloat4(reinterpret_cast(&rhs._41));
+
+ XMStoreFloat4(reinterpret_cast(&result._11), XMVectorAdd(L1, R1));
+ XMStoreFloat4(reinterpret_cast(&result._21), XMVectorAdd(L2, R2));
+ XMStoreFloat4(reinterpret_cast(&result._31), XMVectorAdd(L3, R3));
+ XMStoreFloat4(reinterpret_cast(&result._41), XMVectorAdd(L4, R4));
+
+ return result;
+ }
+
+ SHMatrix SHMatrix::operator-(const SHMatrix& rhs) const noexcept
+ {
+ SHMatrix result;
+
+ const XMVECTOR L1 = XMLoadFloat4(reinterpret_cast(&_11));
+ const XMVECTOR L2 = XMLoadFloat4(reinterpret_cast(&_21));
+ const XMVECTOR L3 = XMLoadFloat4(reinterpret_cast(&_31));
+ const XMVECTOR L4 = XMLoadFloat4(reinterpret_cast(&_41));
+
+ const XMVECTOR R1 = XMLoadFloat4(reinterpret_cast(&rhs._11));
+ const XMVECTOR R2 = XMLoadFloat4(reinterpret_cast(&rhs._21));
+ const XMVECTOR R3 = XMLoadFloat4(reinterpret_cast(&rhs._31));
+ const XMVECTOR R4 = XMLoadFloat4(reinterpret_cast(&rhs._41));
+
+ XMStoreFloat4(reinterpret_cast(&result._11), XMVectorSubtract(L1, R1));
+ XMStoreFloat4(reinterpret_cast(&result._21), XMVectorSubtract(L2, R2));
+ XMStoreFloat4(reinterpret_cast(&result._31), XMVectorSubtract(L3, R3));
+ XMStoreFloat4(reinterpret_cast(&result._41), XMVectorSubtract(L4, R4));
+
+ return result;
+ }
+
+ SHMatrix SHMatrix::operator-() const noexcept
+ {
+ SHMatrix result;
+
+ const XMVECTOR L1 = XMLoadFloat4(reinterpret_cast(&_11));
+ const XMVECTOR L2 = XMLoadFloat4(reinterpret_cast(&_21));
+ const XMVECTOR L3 = XMLoadFloat4(reinterpret_cast(&_31));
+ const XMVECTOR L4 = XMLoadFloat4(reinterpret_cast(&_41));
+
+ XMStoreFloat4(reinterpret_cast(&result._11), XMVectorNegate(L1));
+ XMStoreFloat4(reinterpret_cast(&result._21), XMVectorNegate(L2));
+ XMStoreFloat4(reinterpret_cast(&result._31), XMVectorNegate(L3));
+ XMStoreFloat4(reinterpret_cast(&result._41), XMVectorNegate(L4));
+
+ return result;
+ }
+
+ SHMatrix SHMatrix::operator*(const SHMatrix& rhs) const noexcept
+ {
+ SHMatrix result;
+
+ const XMMATRIX M1 = XMLoadFloat4x4(this);
+ const XMMATRIX M2 = XMLoadFloat4x4(&rhs);
+
+ XMStoreFloat4x4(&result, XMMatrixMultiply(M1, M2));
+ return result;
+ }
+
+ SHVec3 SHMatrix::operator*(const SHVec3& rhs) const noexcept
+ {
+ return SHVec3::Transform(rhs, *this);
+ }
+
+ SHVec4 SHMatrix::operator*(const SHVec4& rhs) const noexcept
+ {
+ return SHVec4::Transform3D(rhs, *this);
+ }
+
+ SHMatrix SHMatrix::operator*(float rhs) const noexcept
+ {
+ SHMatrix result;
+
+ const XMVECTOR L1 = XMLoadFloat4(reinterpret_cast(&_11));
+ const XMVECTOR L2 = XMLoadFloat4(reinterpret_cast(&_21));
+ const XMVECTOR L3 = XMLoadFloat4(reinterpret_cast(&_31));
+ const XMVECTOR L4 = XMLoadFloat4(reinterpret_cast(&_41));
+
+ XMStoreFloat4(reinterpret_cast(&result._11), XMVectorScale(L1, rhs));
+ XMStoreFloat4(reinterpret_cast(&result._21), XMVectorScale(L2, rhs));
+ XMStoreFloat4(reinterpret_cast(&result._31), XMVectorScale(L3, rhs));
+ XMStoreFloat4(reinterpret_cast(&result._41), XMVectorScale(L4, rhs));
+
+ return result;
+ }
+
+ SHMatrix SHMatrix::operator/(const SHMatrix& rhs) const noexcept
+ {
+ SHMatrix result;
+
+ const XMVECTOR L1 = XMLoadFloat4(reinterpret_cast(&_11));
+ const XMVECTOR L2 = XMLoadFloat4(reinterpret_cast(&_21));
+ const XMVECTOR L3 = XMLoadFloat4(reinterpret_cast(&_31));
+ const XMVECTOR L4 = XMLoadFloat4(reinterpret_cast(&_41));
+
+ const XMVECTOR R1 = XMLoadFloat4(reinterpret_cast(&rhs._11));
+ const XMVECTOR R2 = XMLoadFloat4(reinterpret_cast(&rhs._21));
+ const XMVECTOR R3 = XMLoadFloat4(reinterpret_cast(&rhs._31));
+ const XMVECTOR R4 = XMLoadFloat4(reinterpret_cast(&rhs._41));
+
+ XMStoreFloat4(reinterpret_cast(&result._11), XMVectorDivide(L1, R1));
+ XMStoreFloat4(reinterpret_cast(&result._21), XMVectorDivide(L2, R2));
+ XMStoreFloat4(reinterpret_cast(&result._31), XMVectorDivide(L3, R3));
+ XMStoreFloat4(reinterpret_cast(&result._41), XMVectorDivide(L4, R4));
+
+ return result;
+ }
+
+ SHMatrix SHMatrix::operator/(float rhs) const noexcept
+ {
+ SHMatrix result;
+
+ const XMVECTOR L1 = XMLoadFloat4(reinterpret_cast(&_11));
+ const XMVECTOR L2 = XMLoadFloat4(reinterpret_cast(&_21));
+ const XMVECTOR L3 = XMLoadFloat4(reinterpret_cast(&_31));
+ const XMVECTOR L4 = XMLoadFloat4(reinterpret_cast(&_41));
+
+ const float INV_RHS = 1.0f / rhs;
+
+ XMStoreFloat4(reinterpret_cast(&result._11), XMVectorScale(L1, INV_RHS));
+ XMStoreFloat4(reinterpret_cast(&result._21), XMVectorScale(L2, INV_RHS));
+ XMStoreFloat4(reinterpret_cast(&result._31), XMVectorScale(L3, INV_RHS));
+ XMStoreFloat4(reinterpret_cast(&result._41), XMVectorScale(L4, INV_RHS));
+
+ return result;
+ }
+
+ bool SHMatrix::operator==(const SHMatrix& rhs) const noexcept
+ {
+ const XMVECTOR L1 = XMLoadFloat4(reinterpret_cast(&_11));
+ const XMVECTOR L2 = XMLoadFloat4(reinterpret_cast(&_21));
+ const XMVECTOR L3 = XMLoadFloat4(reinterpret_cast(&_31));
+ const XMVECTOR L4 = XMLoadFloat4(reinterpret_cast(&_41));
+
+ const XMVECTOR R1 = XMLoadFloat4(reinterpret_cast(&rhs._11));
+ const XMVECTOR R2 = XMLoadFloat4(reinterpret_cast(&rhs._21));
+ const XMVECTOR R3 = XMLoadFloat4(reinterpret_cast(&rhs._31));
+ const XMVECTOR R4 = XMLoadFloat4(reinterpret_cast(&rhs._41));
+
+ return
+ (
+ XMVector4Equal(L1, R1)
+ && XMVector4Equal(L2, R2)
+ && XMVector4Equal(L3, R4)
+ && XMVector4Equal(L4, R4)
+ ) != 0;
+ }
+
+
+ bool SHMatrix::operator!=(const SHMatrix& rhs) const noexcept
+ {
+ const XMVECTOR L1 = XMLoadFloat4(reinterpret_cast(&_11));
+ const XMVECTOR L2 = XMLoadFloat4(reinterpret_cast(&_21));
+ const XMVECTOR L3 = XMLoadFloat4(reinterpret_cast(&_31));
+ const XMVECTOR L4 = XMLoadFloat4(reinterpret_cast(&_41));
+
+ const XMVECTOR R1 = XMLoadFloat4(reinterpret_cast(&rhs._11));
+ const XMVECTOR R2 = XMLoadFloat4(reinterpret_cast(&rhs._21));
+ const XMVECTOR R3 = XMLoadFloat4(reinterpret_cast(&rhs._31));
+ const XMVECTOR R4 = XMLoadFloat4(reinterpret_cast(&rhs._41));
+
+ return
+ (
+ XMVector4NotEqual(L1, R1)
+ || XMVector4NotEqual(L2, R2)
+ || XMVector4NotEqual(L3, R4)
+ || XMVector4NotEqual(L4, R4)
+ ) != 0;
+ }
+
+ SHMatrix operator*(float lhs, const SHMatrix& rhs) noexcept
+ {
+ return rhs * lhs;
+ }
+
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ void SHMatrix::Transpose() noexcept
+ {
+ const XMMATRIX M = XMLoadFloat4x4(this);
+ XMStoreFloat4x4(this, XMMatrixTranspose(M));
+ }
+
+ void SHMatrix::Invert() noexcept
+ {
+ const XMMATRIX M = XMLoadFloat4x4(this);
+ XMStoreFloat4x4(this, XMMatrixInverse(nullptr, M));
+ }
+
+ float SHMatrix::Determinant() const noexcept
+ {
+ const XMMATRIX M = XMLoadFloat4x4(this);
+ return XMVectorGetX(XMMatrixDeterminant(M));
+ }
+
+ std::string SHMatrix::ToString() const noexcept
+ {
+ std::stringstream ss;
+ ss << std::fixed << std::setprecision(3);
+ ss << "| " << _11 << ", " << _12 << ", " << _13 << ", " << _14 << " |\n";
+ ss << "| " << _21 << ", " << _22 << ", " << _23 << ", " << _24 << " |\n";
+ ss << "| " << _31 << ", " << _32 << ", " << _33 << ", " << _34 << " |\n";
+ ss << "| " << _41 << ", " << _42 << ", " << _43 << ", " << _44 << " |";
+ return ss.str();
+ }
+
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHMatrix SHMatrix::Transpose(const SHMatrix& matrix) noexcept
+ {
+ SHMatrix result;
+
+ const XMMATRIX M = XMLoadFloat4x4(&matrix);
+ XMStoreFloat4x4(&result, XMMatrixTranspose(M));
+ return result;
+ }
+
+ SHMatrix SHMatrix::Inverse(const SHMatrix& matrix) noexcept
+ {
+ SHMatrix result;
+
+ const XMMATRIX M = XMLoadFloat4x4(&matrix);
+ XMStoreFloat4x4(&result, XMMatrixInverse(nullptr, M));
+ return result;
+ }
+
+ SHMatrix SHMatrix::Translate(float x, float y, float z) noexcept
+ {
+ SHMatrix result;
+ XMStoreFloat4x4(&result, XMMatrixTranslation(x, y, z));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::Translate(const SHVec3& pos) noexcept
+ {
+ SHMatrix result;
+ XMStoreFloat4x4(&result, XMMatrixTranslation(pos.x, pos.y, pos.z));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::Rotate(const SHVec3& axis, float angleInRad) noexcept
+ {
+ SHMatrix result;
+
+ const XMVECTOR A = XMLoadFloat3(&axis);
+ XMStoreFloat4x4(&result, XMMatrixRotationAxis(A, angleInRad));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::Rotate(float yaw, float pitch, float roll) noexcept
+ {
+ SHMatrix result;
+ XMStoreFloat4x4(&result, XMMatrixRotationRollPitchYaw(pitch, yaw, roll));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::Rotate(const SHVec3& eulerAngles) noexcept
+ {
+ SHMatrix result;
+ XMStoreFloat4x4(&result, XMMatrixRotationRollPitchYaw(eulerAngles.x, eulerAngles.y, eulerAngles.z));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::Rotate(const SHQuaternion& q) noexcept
+ {
+ SHMatrix result;
+
+ const XMVECTOR Q = XMLoadFloat4(&q);
+ XMStoreFloat4x4(&result, XMMatrixRotationQuaternion(Q));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::RotateX(float angleInRad) noexcept
+ {
+ SHMatrix result;
+ XMStoreFloat4x4(&result, XMMatrixRotationX(angleInRad));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::RotateY(float angleInRad) noexcept
+ {
+ SHMatrix result;
+ XMStoreFloat4x4(&result, XMMatrixRotationY(angleInRad));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::RotateZ(float angleInRad) noexcept
+ {
+ SHMatrix result;
+ XMStoreFloat4x4(&result, XMMatrixRotationZ(angleInRad));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::Scale(float uniformScaleFactor) noexcept
+ {
+ SHMatrix result;
+ XMStoreFloat4x4(&result, XMMatrixScaling(uniformScaleFactor, uniformScaleFactor, uniformScaleFactor));
+
+ return result;
+ }
+
+ SHMatrix SHMatrix::Scale(float x, float y, float z) noexcept
+ {
+ SHMatrix result;
+ XMStoreFloat4x4(&result, XMMatrixScaling(x, y, z));
+
+ return result;
+ }
+
+ SHMatrix SHMatrix::Scale(const SHVec3& scale) noexcept
+ {
+ SHMatrix result;
+ XMStoreFloat4x4(&result, XMMatrixScaling(scale.x, scale.y, scale.z));
+
+ return result;
+ }
+
+ SHMatrix SHMatrix::LookAtRH(const SHVec3& eye, const SHVec3& target, const SHVec3& up) noexcept
+ {
+ SHMatrix result;
+
+ const XMVECTOR EYE = XMLoadFloat3(&eye);
+ const XMVECTOR TGT = XMLoadFloat3(&target);
+ const XMVECTOR UP = XMLoadFloat3(&up);
+
+ XMStoreFloat4x4(&result, XMMatrixLookAtRH(EYE, TGT, UP));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::LookAtLH(const SHVec3& eye, const SHVec3& target, const SHVec3& up) noexcept
+ {
+ SHMatrix result;
+
+ const XMVECTOR EYE = XMLoadFloat3(&eye);
+ const XMVECTOR TGT = XMLoadFloat3(&target);
+ const XMVECTOR UP = XMLoadFloat3(&up);
+
+ XMStoreFloat4x4(&result, XMMatrixLookAtLH(EYE, TGT, UP));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::CamToWorldRH(const SHVec3& pos, const SHVec3& forward, const SHVec3& up) noexcept
+ {
+ SHMatrix result;
+
+ const SHVec3 FWD_HAT = SHVec3::Normalise(-forward);
+
+ const XMVECTOR Z_HAT = XMVector3Normalize(XMLoadFloat3(&FWD_HAT));
+ const XMVECTOR X_HAT = XMVector3Normalize(XMVector3Cross(XMLoadFloat3(&up), Z_HAT));
+ const XMVECTOR Y_HAT = XMVector3Cross(Z_HAT, X_HAT);
+
+ XMStoreFloat3(reinterpret_cast(&result._11), X_HAT);
+ XMStoreFloat3(reinterpret_cast(&result._21), Y_HAT);
+ XMStoreFloat3(reinterpret_cast(&result._31), Z_HAT);
+
+ result._41 = pos.x;
+ result._42 = pos.y;
+ result._43 = pos.z;
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::CamToWorldLH(const SHVec3& pos, const SHVec3& forward, const SHVec3& up) noexcept
+ {
+ SHMatrix result;
+
+ const SHVec3 FWD_HAT = SHVec3::Normalise(forward);
+
+ const XMVECTOR Z_HAT = XMVector3Normalize(XMLoadFloat3(&FWD_HAT));
+ const XMVECTOR X_HAT = XMVector3Normalize(XMVector3Cross(XMLoadFloat3(&up), Z_HAT));
+ const XMVECTOR Y_HAT = XMVector3Cross(Z_HAT, X_HAT);
+
+ XMStoreFloat3(reinterpret_cast(&result._11), X_HAT);
+ XMStoreFloat3(reinterpret_cast(&result._21), Y_HAT);
+ XMStoreFloat3(reinterpret_cast(&result._31), Z_HAT);
+
+ result._41 = pos.x;
+ result._42 = pos.x;
+ result._43 = pos.x;
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::PerspectiveFovRH(float fov, float aspectRatio, float nearPlane, float farPlane) noexcept
+ {
+ SHMatrix result;
+
+ XMStoreFloat4x4(&result, XMMatrixPerspectiveFovRH(fov, aspectRatio, nearPlane, farPlane));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::PerspectiveFovLH(float fov, float aspectRatio, float nearPlane, float farPlane) noexcept
+ {
+ SHMatrix result;
+
+ XMStoreFloat4x4(&result, XMMatrixPerspectiveFovLH(fov, aspectRatio, nearPlane, farPlane));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::PerspectiveRH(float width, float height, float nearPlane, float farPlane) noexcept
+ {
+ SHMatrix result;
+
+ XMStoreFloat4x4(&result, XMMatrixPerspectiveRH(width, height, nearPlane, farPlane));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::PerspectiveLH(float width, float height, float nearPlane, float farPlane) noexcept
+ {
+ SHMatrix result;
+
+ XMStoreFloat4x4(&result, XMMatrixPerspectiveLH(width, height, nearPlane, farPlane));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::OrthographicRH(float width, float height, float nearPlane, float farPlane) noexcept
+ {
+ SHMatrix result;
+
+ XMStoreFloat4x4(&result, XMMatrixOrthographicRH(width, height, nearPlane, farPlane));
+
+ result.Transpose();
+ return result;
+ }
+
+ SHMatrix SHMatrix::OrthographicLH(float width, float height, float nearPlane, float farPlane) noexcept
+ {
+ SHMatrix result;
+
+ XMStoreFloat4x4(&result, XMMatrixOrthographicLH(width, height, nearPlane, farPlane));
+
+ result.Transpose();
+ return result;
+ }
+
+} // namespace SHADE
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/SHMatrix.h b/SHADE_Engine/src/Math/SHMatrix.h
new file mode 100644
index 00000000..2aab05ab
--- /dev/null
+++ b/SHADE_Engine/src/Math/SHMatrix.h
@@ -0,0 +1,144 @@
+/****************************************************************************************
+ * \file SHMatrix.h
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Interface for a Matrix.
+ *
+ * \copyright 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
+#include
+
+#include "Vector/SHVec4.h"
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Forward Declarations */
+ /*-----------------------------------------------------------------------------------*/
+ class SHVec2;
+ class SHVec3;
+ class SHVec4;
+ class SHQuaternion;
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Type Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ /**
+ * @brief Interface for a Column-Major Row Vector 4x4 Matrix.
+ */
+ class SHMatrix : public DirectX::XMFLOAT4X4
+ {
+ public:
+ /*---------------------------------------------------------------------------------*/
+ /* Static Data Members */
+ /*---------------------------------------------------------------------------------*/
+
+ static constexpr size_t SIZE = 16U;
+ static constexpr size_t NUM_ROWS = 4U;
+ static constexpr size_t NUM_COLS = 4U;
+
+ static const SHMatrix Identity;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Constructors & Destructor */
+ /*---------------------------------------------------------------------------------*/
+
+ SHMatrix (const SHMatrix& rhs) = default;
+ SHMatrix (SHMatrix&& rhs) = default;
+ ~SHMatrix () = default;
+
+ SHMatrix () noexcept;
+ SHMatrix ( const SHVec4& r0,
+ const SHVec4& r1,
+ const SHVec4& r2,
+ const SHVec4& r3 = SHVec4::UnitW
+ ) noexcept;
+ SHMatrix (
+ float m00, float m01, float m02, float m03,
+ float m10, float m11, float m12, float m13,
+ float m20, float m21, float m22, float m23,
+ float m30 = 0.0f, float m31 = 0.0f, float m32 = 0.0f, float m33 = 1.0f
+ ) noexcept;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Operator Overloads */
+ /*---------------------------------------------------------------------------------*/
+
+ SHMatrix& operator= (const SHMatrix& rhs) = default;
+ SHMatrix& operator= (SHMatrix&& rhs) = default;
+
+ SHMatrix& operator+= (const SHMatrix& rhs) noexcept;
+ SHMatrix& operator-= (const SHMatrix& rhs) noexcept;
+ SHMatrix& operator*= (const SHMatrix& rhs) noexcept;
+ SHMatrix& operator*= (float rhs) noexcept;
+ SHMatrix& operator/= (const SHMatrix& rhs) noexcept;
+ SHMatrix& operator/= (float rhs) noexcept;
+
+ SHMatrix operator+ (const SHMatrix& rhs) const noexcept;
+ SHMatrix operator- (const SHMatrix& rhs) const noexcept;
+ SHMatrix operator- () const noexcept;
+ SHMatrix operator* (const SHMatrix& rhs) const noexcept;
+ SHVec3 operator* (const SHVec3& rhs) const noexcept;
+ SHVec4 operator* (const SHVec4& rhs) const noexcept;
+ SHMatrix operator* (float rhs) const noexcept;
+ SHMatrix operator/ (const SHMatrix& rhs) const noexcept;
+ SHMatrix operator/ (float rhs) const noexcept;
+
+ bool operator== (const SHMatrix& rhs) const noexcept;
+ bool operator!= (const SHMatrix& rhs) const noexcept;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ void Transpose () noexcept;
+ void Invert () noexcept;
+
+ [[nodiscard]] float Determinant () const noexcept;
+ [[nodiscard]] std::string ToString () const noexcept;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Static Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] static SHMatrix Transpose (const SHMatrix& matrix) noexcept;
+ [[nodiscard]] static SHMatrix Inverse (const SHMatrix& matrix) noexcept;
+
+ [[nodiscard]] static SHMatrix Translate (float x, float y, float z) noexcept;
+ [[nodiscard]] static SHMatrix Translate (const SHVec3& pos) noexcept;
+
+ [[nodiscard]] static SHMatrix Rotate (const SHVec3& axis, float angleInRad) noexcept;
+ [[nodiscard]] static SHMatrix Rotate (float yaw, float pitch, float roll) noexcept;
+ [[nodiscard]] static SHMatrix Rotate (const SHVec3& eulerAngles) noexcept;
+ [[nodiscard]] static SHMatrix Rotate (const SHQuaternion& q) noexcept;
+ [[nodiscard]] static SHMatrix RotateX (float angleInRad) noexcept;
+ [[nodiscard]] static SHMatrix RotateY (float angleInRad) noexcept;
+ [[nodiscard]] static SHMatrix RotateZ (float angleInRad) noexcept;
+
+ [[nodiscard]] static SHMatrix Scale (float uniformScaleFactor) noexcept;
+ [[nodiscard]] static SHMatrix Scale (float x, float y, float z) noexcept;
+ [[nodiscard]] static SHMatrix Scale (const SHVec3& scale) noexcept;
+
+ [[nodiscard]] static SHMatrix LookAtRH (const SHVec3& eye, const SHVec3& target, const SHVec3& up) noexcept;
+ [[nodiscard]] static SHMatrix LookAtLH (const SHVec3& eye, const SHVec3& target, const SHVec3& up) noexcept;
+ [[nodiscard]] static SHMatrix CamToWorldRH (const SHVec3& pos, const SHVec3& forward, const SHVec3& up) noexcept;
+ [[nodiscard]] static SHMatrix CamToWorldLH (const SHVec3& pos, const SHVec3& forward, const SHVec3& up) noexcept;
+ [[nodiscard]] static SHMatrix PerspectiveFovRH (float fov, float aspectRatio, float nearPlane, float farPlane) noexcept;
+ [[nodiscard]] static SHMatrix PerspectiveFovLH (float fov, float aspectRatio, float nearPlane, float farPlane) noexcept;
+ [[nodiscard]] static SHMatrix PerspectiveRH (float width, float height, float nearPlane, float farPlane) noexcept;
+ [[nodiscard]] static SHMatrix PerspectiveLH (float width, float height, float nearPlane, float farPlane) noexcept;
+ [[nodiscard]] static SHMatrix OrthographicRH (float width, float height, float nearPlane, float farPlane) noexcept;
+ [[nodiscard]] static SHMatrix OrthographicLH (float width, float height, float nearPlane, float farPlane) noexcept;
+
+ // TODO(Diren): Billboard, Shadow, Projection & Reflection
+ };
+
+ SHMatrix operator*(float lhs, const SHMatrix& rhs) noexcept;
+
+} // namespace SHADE
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/SHQuaternion.cpp b/SHADE_Engine/src/Math/SHQuaternion.cpp
new file mode 100644
index 00000000..208f131d
--- /dev/null
+++ b/SHADE_Engine/src/Math/SHQuaternion.cpp
@@ -0,0 +1,308 @@
+/****************************************************************************************
+ * \file SHQuaternion.cpp
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Implementation for a Quaternion.
+ *
+ * \copyright 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
+
+// Primary Header
+#include "SHQuaternion.h"
+// Project Headers
+#include "Vector/SHVec3.h"
+#include "SHMatrix.h"
+#include "Tools/SHLogger.h"
+
+using namespace DirectX;
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Data Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ const SHQuaternion SHQuaternion::Identity{ 0.0f, 0.0f, 0.0f, 1.0f };
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Constructors & Destructor Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHQuaternion::SHQuaternion() noexcept
+ : XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f )
+ {}
+
+ SHQuaternion::SHQuaternion(float _x, float _y, float _z, float _w) noexcept
+ : XMFLOAT4( _x, _y, _z, _w )
+ {}
+
+ SHQuaternion::SHQuaternion(float yaw, float pitch, float roll) noexcept
+ : XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f )
+ {
+ XMStoreFloat4(this, XMQuaternionRotationRollPitchYaw(pitch, yaw, roll));
+ }
+
+ SHQuaternion::SHQuaternion(const SHVec3& eulerAngles) noexcept
+ : XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f )
+ {
+ const XMVECTOR V = XMLoadFloat3(&eulerAngles);
+ XMStoreFloat4(this, XMQuaternionRotationRollPitchYawFromVector(V));
+ }
+
+ SHQuaternion::SHQuaternion(const SHVec3& axis, float angleInRad) noexcept
+ : XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f )
+ {
+ const XMVECTOR AXIS = XMLoadFloat3(&axis);
+ XMStoreFloat4(this, XMQuaternionRotationAxis(AXIS, angleInRad));
+ }
+
+ SHQuaternion::SHQuaternion(const SHMatrix& rotationMatrix) noexcept
+ : XMFLOAT4( 0.0f, 0.0f, 0.0f, 1.0f )
+ {
+ const XMMATRIX M = XMLoadFloat4x4(&rotationMatrix);
+ XMStoreFloat4(this, XMQuaternionRotationMatrix(M));
+ }
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Operator Overload Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHQuaternion& SHQuaternion::operator+=(const SHQuaternion& rhs) noexcept
+ {
+ return *this = *this + rhs;
+ }
+
+ SHQuaternion& SHQuaternion::operator-=(const SHQuaternion& rhs) noexcept
+ {
+ return *this = *this - rhs;
+ }
+
+ SHQuaternion& SHQuaternion::operator*=(const SHQuaternion& rhs) noexcept
+ {
+ return *this = *this * rhs;
+ }
+
+ SHQuaternion& SHQuaternion::operator*=(float rhs) noexcept
+ {
+ return *this = *this * rhs;
+ }
+
+ SHQuaternion& SHQuaternion::operator/=(const SHQuaternion& rhs) noexcept
+ {
+ return *this = *this / rhs;
+ }
+
+ SHQuaternion SHQuaternion::operator+(const SHQuaternion& rhs) const noexcept
+ {
+ SHQuaternion result;
+
+ const XMVECTOR Q1 = XMLoadFloat4(this);
+ const XMVECTOR Q2 = XMLoadFloat4(&rhs);
+
+ XMStoreFloat4(&result, XMVectorAdd(Q1, Q2));
+ return result;
+ }
+
+ SHQuaternion SHQuaternion::operator-(const SHQuaternion& rhs) const noexcept
+ {
+ SHQuaternion result;
+
+ const XMVECTOR Q1 = XMLoadFloat4(this);
+ const XMVECTOR Q2 = XMLoadFloat4(&rhs);
+
+ XMStoreFloat4(&result, XMVectorSubtract(Q1, Q2));
+ return result;
+ }
+
+ SHQuaternion SHQuaternion::operator-() const noexcept
+ {
+ SHQuaternion result;
+
+ const XMVECTOR Q = XMLoadFloat4(this);
+
+ XMStoreFloat4(&result, XMVectorNegate(Q));
+ return result;
+ }
+
+ SHQuaternion SHQuaternion::operator*(const SHQuaternion& rhs) const noexcept
+ {
+ SHQuaternion result;
+
+ const XMVECTOR Q1 = XMLoadFloat4(this);
+ const XMVECTOR Q2 = XMLoadFloat4(&rhs);
+
+ XMStoreFloat4(&result, XMQuaternionMultiply(Q1, Q2));
+ return result;
+ }
+
+ SHQuaternion SHQuaternion::operator*(float rhs) const noexcept
+ {
+ SHQuaternion result;
+
+ const XMVECTOR Q = XMLoadFloat4(this);
+
+ XMStoreFloat4(&result, XMVectorScale(Q, rhs));
+ return result;
+ }
+
+ SHQuaternion SHQuaternion::operator/(const SHQuaternion& rhs) const noexcept
+ {
+ SHQuaternion result;
+
+ const XMVECTOR Q1 = XMLoadFloat4(this);
+ const XMVECTOR Q2 = XMQuaternionInverse(XMLoadFloat4(&rhs));
+
+ XMStoreFloat4(&result, XMQuaternionMultiply(Q1, Q2));
+ return result;
+ }
+
+ bool SHQuaternion::operator==(const SHQuaternion& rhs) const noexcept
+ {
+ const XMVECTOR Q1 = XMLoadFloat4(this);
+ const XMVECTOR Q2 = XMLoadFloat4(&rhs);
+
+ return XMQuaternionEqual(Q1, Q2);
+ }
+
+ bool SHQuaternion::operator!=(const SHQuaternion& rhs) const noexcept
+ {
+ const XMVECTOR Q1 = XMLoadFloat4(this);
+ const XMVECTOR Q2 = XMLoadFloat4(&rhs);
+
+ return XMQuaternionNotEqual(Q1, Q2);
+ }
+
+ SHQuaternion operator*(float lhs, const SHQuaternion& rhs) noexcept
+ {
+ return rhs * lhs;
+ }
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ void SHQuaternion::Invert() noexcept
+ {
+ const XMVECTOR Q = XMLoadFloat4(this);
+ XMStoreFloat4(this, XMQuaternionInverse(Q));
+ }
+
+ float SHQuaternion::Length() const noexcept
+ {
+ const XMVECTOR Q = XMLoadFloat4(this);
+ return XMVectorGetX(XMQuaternionLength(Q));
+ }
+
+ float SHQuaternion::LengthSquared() const noexcept
+ {
+ const XMVECTOR Q = XMLoadFloat4(this);
+ return XMVectorGetX(XMQuaternionLengthSq(Q));
+ }
+
+ float SHQuaternion::Dot(const SHQuaternion& rhs) const noexcept
+ {
+ const XMVECTOR Q1 = XMLoadFloat4(this);
+ const XMVECTOR Q2 = XMLoadFloat4(&rhs);
+
+ return XMVectorGetX(XMQuaternionDot(Q1, Q2));
+ }
+
+ SHQuaternion SHQuaternion::RotateTowards(const SHQuaternion&, float) const noexcept
+ {
+ SHQuaternion result;
+
+ // TODO (Diren)
+
+ return result;
+ }
+
+ SHVec3 SHQuaternion::ToEuler() const noexcept
+ {
+ // TODO (Diren)
+
+ return SHVec3::Zero;
+ }
+
+ std::string SHQuaternion::ToString() const noexcept
+ {
+ std::stringstream ss;
+ ss << std::fixed << std::setprecision(3);
+ ss << "<" << x << ", " << y << ", " << z << ", " << w <<">";
+ return ss.str();
+ }
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHQuaternion SHQuaternion::Normalise(const SHQuaternion& q) noexcept
+ {
+ SHQuaternion result;
+
+ const XMVECTOR Q = XMLoadFloat4(&q);
+
+ XMStoreFloat4(&result, XMQuaternionNormalize(Q));
+ return result;
+ }
+
+ SHQuaternion SHQuaternion::Conjugate(const SHQuaternion& q) noexcept
+ {
+ SHQuaternion result;
+
+ const XMVECTOR Q = XMLoadFloat4(&q);
+
+ XMStoreFloat4(&result, XMQuaternionConjugate(Q));
+ return result;
+ }
+
+ SHQuaternion SHQuaternion::Inverse(const SHQuaternion& q) noexcept
+ {
+ SHQuaternion result;
+
+ const XMVECTOR Q = XMLoadFloat4(&q);
+ XMStoreFloat4(&result, XMQuaternionInverse(Q));
+
+ return result;
+ }
+
+
+ float SHQuaternion::Angle(const SHQuaternion&, const SHQuaternion&) noexcept
+ {
+ // TODO (Diren)
+
+ return 0.0f;
+ }
+
+ SHQuaternion SHQuaternion::Lerp(const SHQuaternion&, const SHQuaternion&, float) noexcept
+ {
+ SHQuaternion result;
+
+ // TODO (Diren)
+
+ return result;
+ }
+
+ SHQuaternion SHQuaternion::Slerp(const SHQuaternion& q1, const SHQuaternion& q2, float t) noexcept
+ {
+ SHQuaternion result;
+
+ const XMVECTOR Q1 = XMLoadFloat4(&q1);
+ const XMVECTOR Q2 = XMLoadFloat4(&q2);
+
+ XMStoreFloat4(&result, XMQuaternionSlerp(Q1, Q2, t));
+ return result;
+ }
+
+ SHQuaternion SHQuaternion::Rotate(const SHVec3& , const SHVec3&) noexcept
+ {
+ SHQuaternion result;
+
+ // TODO (Diren)
+
+ return result;
+ }
+
+} // namespace SHADE
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/SHQuaternion.h b/SHADE_Engine/src/Math/SHQuaternion.h
new file mode 100644
index 00000000..27088284
--- /dev/null
+++ b/SHADE_Engine/src/Math/SHQuaternion.h
@@ -0,0 +1,106 @@
+/****************************************************************************************
+ * \file SHQuaternion.h
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Interface for a Quaternion.
+ *
+ * \copyright 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
+#include
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Forward Declarations */
+ /*-----------------------------------------------------------------------------------*/
+
+ class SHVec3;
+ class SHMatrix;
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Type Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ class SHQuaternion : public DirectX::XMFLOAT4
+ {
+ public:
+ /*---------------------------------------------------------------------------------*/
+ /* Static Data Members */
+ /*---------------------------------------------------------------------------------*/
+
+ static const SHQuaternion Identity;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Constructors & Destructor */
+ /*---------------------------------------------------------------------------------*/
+
+ SHQuaternion (const SHQuaternion& rhs) = default;
+ SHQuaternion (SHQuaternion&& rhs) = default;
+
+ SHQuaternion () noexcept;
+ SHQuaternion (float x, float y, float z, float w) noexcept;
+ SHQuaternion (float yaw, float pitch, float roll) noexcept;
+ SHQuaternion (const SHVec3& eulerAngles) noexcept;
+ SHQuaternion (const SHVec3& axis, float angleInRad) noexcept;
+ SHQuaternion (const SHMatrix& rotationMatrix) noexcept;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Operator Overloads */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] SHQuaternion& operator= (const SHQuaternion& rhs) = default;
+ [[nodiscard]] SHQuaternion& operator= (SHQuaternion&& rhs) = default;
+
+ [[nodiscard]] SHQuaternion& operator+= (const SHQuaternion& rhs) noexcept;
+ [[nodiscard]] SHQuaternion& operator-= (const SHQuaternion& rhs) noexcept;
+ [[nodiscard]] SHQuaternion& operator*= (const SHQuaternion& rhs) noexcept;
+ [[nodiscard]] SHQuaternion& operator*= (float rhs) noexcept;
+ [[nodiscard]] SHQuaternion& operator/= (const SHQuaternion& rhs) noexcept;
+
+ [[nodiscard]] SHQuaternion operator+ (const SHQuaternion& rhs) const noexcept;
+ [[nodiscard]] SHQuaternion operator- (const SHQuaternion& rhs) const noexcept;
+ [[nodiscard]] SHQuaternion operator- () const noexcept;
+ [[nodiscard]] SHQuaternion operator* (const SHQuaternion& rhs) const noexcept;
+ [[nodiscard]] SHQuaternion operator* (float rhs) const noexcept;
+ [[nodiscard]] SHQuaternion operator/ (const SHQuaternion& rhs) const noexcept;
+
+ [[nodiscard]] bool operator== (const SHQuaternion& rhs) const noexcept;
+ [[nodiscard]] bool operator!= (const SHQuaternion& rhs) const noexcept;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ void Invert () noexcept;
+
+ [[nodiscard]] float Length () const noexcept;
+ [[nodiscard]] float LengthSquared () const noexcept;
+ [[nodiscard]] float Dot (const SHQuaternion& rhs) const noexcept;
+ [[nodiscard]] SHQuaternion RotateTowards (const SHQuaternion& target, float maxAngleInRad) const noexcept;
+
+ [[nodiscard]] SHVec3 ToEuler () const noexcept;
+ [[nodiscard]] std::string ToString () const noexcept;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Static Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] static SHQuaternion Normalise (const SHQuaternion& q) noexcept;
+ [[nodiscard]] static SHQuaternion Conjugate (const SHQuaternion& q) noexcept;
+ [[nodiscard]] static SHQuaternion Inverse (const SHQuaternion& q) noexcept;
+ [[nodiscard]] static float Angle (const SHQuaternion& q1, const SHQuaternion& q2) noexcept;
+
+ [[nodiscard]] static SHQuaternion Lerp (const SHQuaternion& q1, const SHQuaternion& q2, float t) noexcept;
+ [[nodiscard]] static SHQuaternion Slerp (const SHQuaternion& q1, const SHQuaternion& q2, float t) noexcept;
+
+ [[nodiscard]] static SHQuaternion Rotate (const SHVec3& from, const SHVec3& to) noexcept;
+ };
+
+ SHQuaternion operator*(float lhs, const SHQuaternion& rhs) noexcept;
+
+} // namespace SHADE
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/Vector/SHVec2.cpp b/SHADE_Engine/src/Math/Vector/SHVec2.cpp
new file mode 100644
index 00000000..72c80a50
--- /dev/null
+++ b/SHADE_Engine/src/Math/Vector/SHVec2.cpp
@@ -0,0 +1,460 @@
+/****************************************************************************************
+ * \file SHVec2.cpp
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Implementation for 2D Vector.
+ *
+ * \copyright 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
+
+// Primary Header
+#include "SHVec2.h"
+// Project Headers
+#include "Math/SHMatrix.h"
+#include "Tools/SHLogger.h"
+
+using namespace DirectX;
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Data Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+ SHVec2 const SHVec2::Zero { 0.0f, 0.0f };
+ SHVec2 const SHVec2::One { 1.0f, 1.0f };
+ SHVec2 const SHVec2::Left { -1.0f, 0.0f };
+ SHVec2 const SHVec2::Right { 1.0f, 0.0f };
+ SHVec2 const SHVec2::Up { 0.0f, 1.0f };
+ SHVec2 const SHVec2::Down { 0.0f, -1.0f };
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Constructors & Destructor Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHVec2::SHVec2() noexcept
+ : XMFLOAT2( 0.0f, 0.0f )
+ {}
+
+ SHVec2::SHVec2(float _x, float _y) noexcept
+ : XMFLOAT2( _x, _y )
+ {}
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Operator Overload Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHVec2& SHVec2::operator+=(const SHVec2& rhs) noexcept
+ {
+ return *this = *this + rhs;
+ }
+
+ SHVec2& SHVec2::operator-=(const SHVec2& rhs) noexcept
+ {
+ return *this = *this - rhs;
+ }
+
+ SHVec2& SHVec2::operator*=(const SHVec2& rhs) noexcept
+ {
+ return *this = *this * rhs;
+ }
+
+ SHVec2& SHVec2::operator*=(float rhs) noexcept
+ {
+ return *this = *this * rhs;
+ }
+
+ SHVec2& SHVec2::operator/=(const SHVec2& rhs) noexcept
+ {
+ return *this = *this / rhs;
+ }
+
+ SHVec2& SHVec2::operator/=(float rhs) noexcept
+ {
+ return *this = *this / rhs;
+ }
+
+ SHVec2 SHVec2::operator+(const SHVec2& rhs) const noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V1 = XMLoadFloat2(this);
+ const XMVECTOR V2 = XMLoadFloat2(&rhs);
+
+ XMStoreFloat2(&result, XMVectorAdd(V1, V2));
+ return result;
+ }
+
+ SHVec2 SHVec2::operator-(const SHVec2& rhs) const noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V1 = XMLoadFloat2(this);
+ const XMVECTOR V2 = XMLoadFloat2(&rhs);
+
+ XMStoreFloat2(&result, XMVectorSubtract(V1, V2));
+ return result;
+ }
+
+ SHVec2 SHVec2::operator-() const noexcept
+ {
+ return SHVec2{ -x, -y };
+ }
+
+ SHVec2 SHVec2::operator*(const SHVec2& rhs) const noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V1 = XMLoadFloat2(this);
+ const XMVECTOR V2 = XMLoadFloat2(&rhs);
+
+ XMStoreFloat2(&result, XMVectorMultiply(V1, V2));
+ return result;
+ }
+
+ SHVec2 SHVec2::operator*(float rhs) const noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V = XMLoadFloat2(this);
+
+ XMStoreFloat2(&result, XMVectorScale(V, rhs));
+ return result;
+ }
+
+ SHVec2 SHVec2::operator/(const SHVec2& rhs) const noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V1 = XMLoadFloat2(this);
+ const XMVECTOR V2 = XMLoadFloat2(&rhs);
+
+ XMStoreFloat2(&result, XMVectorDivide(V1, V2));
+ return result;
+ }
+
+ SHVec2 SHVec2::operator/(float rhs) const noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V = XMLoadFloat2(this);
+
+ XMStoreFloat2(&result, XMVectorScale(V, 1.0f / rhs));
+ return result;
+ }
+
+ bool SHVec2::operator==(const SHVec2& rhs) const noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat2(this);
+ const XMVECTOR V2 = XMLoadFloat2(&rhs);
+
+ return XMVector2Equal(V1, V2);
+ }
+
+ bool SHVec2::operator!=(const SHVec2& rhs) const noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat2(this);
+ const XMVECTOR V2 = XMLoadFloat2(&rhs);
+
+ return XMVector2NotEqual(V1, V2);
+ }
+
+ float SHVec2::operator[](int index)
+ {
+ if (index >= SIZE || index < 0)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ default: return 0.0f;
+ }
+ }
+
+ float SHVec2::operator[](size_t index)
+ {
+ if (index >= SIZE)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ default: return 0.0f;
+ }
+ }
+
+ float SHVec2::operator[](int index) const
+ {
+ if (index >= SIZE || index < 0)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ default: return 0.0f;
+ }
+ }
+
+ float SHVec2::operator[](size_t index) const
+ {
+ if (index >= SIZE)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ default: return 0.0f;
+ }
+ }
+
+ SHVec2 operator* (float lhs, const SHVec2& rhs) noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V = XMLoadFloat2(&rhs);
+
+ XMStoreFloat2(&result, XMVectorScale(V, lhs));
+ return result;
+ }
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ float SHVec2::Length() const noexcept
+ {
+ const XMVECTOR V = XMLoadFloat2(this);
+
+ return XMVectorGetX(XMVector2Length(V));
+ }
+
+ float SHVec2::LengthSquared() const noexcept
+ {
+ const XMVECTOR V = XMLoadFloat2(this);
+
+ return XMVectorGetX(XMVector2LengthSq(V));
+ }
+
+ std::string SHVec2::ToString() const noexcept
+ {
+ std::stringstream ss;
+ ss << std::fixed << std::setprecision(3);
+ ss << "<" << x << ", " << y << ">";
+ return ss.str();
+ }
+
+ float SHVec2::Dot(const SHVec2& rhs) const noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat2(this);
+ const XMVECTOR V2 = XMLoadFloat2(&rhs);
+
+ return XMVectorGetX(XMVector2Dot(V1, V2));
+ }
+
+ SHVec2 SHVec2::Cross(const SHVec2& rhs) const noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V1 = XMLoadFloat2(this);
+ const XMVECTOR V2 = XMLoadFloat2(&rhs);
+
+ XMStoreFloat2(&result, XMVector2Cross(V1, V2));
+ return result;
+ }
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHVec2 SHVec2::Normalise(const SHVec2& vec2) noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V = XMLoadFloat2(&vec2);
+
+ XMStoreFloat2(&result, XMVector2Normalize(V));
+ return result;
+ }
+
+ SHVec2 SHVec2::Abs(const SHVec2& vec2) noexcept
+ {
+ return SHVec2{ std::fabs(vec2.x), std::fabs(vec2.y) };
+ }
+
+ SHVec2 SHVec2::Min(const std::initializer_list& vec2s) noexcept
+ {
+ if (vec2s.size() == 0)
+ {
+ SHLOG_WARNING("No arguments passed in! Min value is a default SHVec2.")
+ return SHVec2{};
+ }
+
+ SHVec2 result;
+
+ XMVECTOR min = XMLoadFloat2(&(*vec2s.begin()));
+ for (auto it = vec2s.begin() + 1; it != vec2s.end(); ++it)
+ {
+ const XMVECTOR tmp = XMLoadFloat2(&(*it));
+ min = XMVectorMin(min, tmp);
+ }
+
+ XMStoreFloat2(&result, min);
+ return result;
+ }
+
+ SHVec2 SHVec2::Max(const std::initializer_list& vec2s) noexcept
+ {
+ if (vec2s.size() == 0)
+ {
+ SHLOG_WARNING("No arguments passed in! Max value is a default SHVec2.")
+ return SHVec2{};
+ }
+
+ SHVec2 result;
+
+ XMVECTOR max = XMLoadFloat2(&(*vec2s.begin()));
+ for (auto it = vec2s.begin() + 1; it != vec2s.end(); ++it)
+ {
+ const XMVECTOR tmp = XMLoadFloat2(&(*it));
+ max = XMVectorMax(max, tmp);
+ }
+
+ XMStoreFloat2(&result, max);
+ return result;
+ }
+
+ SHVec2 SHVec2::Clamp(const SHVec2& v, const SHVec2& vMin, const SHVec2& vMax) noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V = XMLoadFloat2(&v);
+ const XMVECTOR MIN = XMLoadFloat2(&vMin);
+ const XMVECTOR MAX = XMLoadFloat2(&vMax);
+
+ XMStoreFloat2(&result, XMVectorClamp(V, MIN, MAX));
+ return result;
+ }
+
+ SHVec2 SHVec2::Lerp(const SHVec2& a, const SHVec2& b, float t) noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V1 = XMLoadFloat2(&a);
+ const XMVECTOR V2 = XMLoadFloat2(&b);
+
+ XMStoreFloat2(&result, XMVectorLerp(V1, V2, t));
+ return result;
+ }
+
+ SHVec2 SHVec2::ClampedLerp(const SHVec2& a, const SHVec2& b, float t, float tMin, float tMax) noexcept
+ {
+ return Lerp(a, b, std::clamp(t, tMin, tMax));
+ }
+
+ float SHVec2::Distance(const SHVec2& lhs, const SHVec2& rhs) noexcept
+ {
+ return (lhs - rhs).Length();
+ }
+
+ float SHVec2::DistanceSquared(const SHVec2& lhs, const SHVec2& rhs) noexcept
+ {
+ return (lhs - rhs).LengthSquared();
+ }
+
+ float SHVec2::Angle(const SHVec2& lhs, const SHVec2& rhs) noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat2(&lhs);
+ const XMVECTOR V2 = XMLoadFloat2(&rhs);
+
+ return XMVectorGetX(XMVector2AngleBetweenVectors(V1, V2));
+ }
+
+ float SHVec2::Dot(const SHVec2& lhs, const SHVec2& rhs) noexcept
+ {
+ return lhs.Dot(rhs);
+ }
+
+ SHVec2 SHVec2::Project(const SHVec2& v, const SHVec2& u) noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR U = XMLoadFloat2(&u);
+ const float V_DOT_U = Dot(v, u);
+ const float U_LENSQ = u.LengthSquared();
+
+ XMStoreFloat2(&result, XMVectorScale(U, V_DOT_U / U_LENSQ));
+ return result;
+ }
+
+ SHVec2 SHVec2::Reflect(const SHVec2& v, const SHVec2& normal) noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V = XMLoadFloat2(&v);
+ const XMVECTOR N = XMLoadFloat2(&normal);
+
+ XMStoreFloat2(&result, XMVector2Reflect(V, N));
+ return result;
+ }
+
+ SHVec2 SHVec2::Rotate(const SHVec2& v, float angleInRad) noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V = XMLoadFloat2(&v);
+ const XMMATRIX R = XMMatrixRotationZ(angleInRad);
+
+ XMStoreFloat2(&result, XMVector2Transform(V, R));
+ return result;
+ }
+
+ SHVec2 SHVec2::Transform(const SHVec2& v, const SHMatrix& transformMtx) noexcept
+ {
+ SHVec2 result;
+
+ const XMVECTOR V = XMLoadFloat2(&v);
+ const XMMATRIX TF = XMLoadFloat4x4(&transformMtx);
+
+ XMStoreFloat2(&result, XMVector2TransformCoord(V, TF));
+ return result;
+ }
+
+ SHVec2 SHVec2::Cross(float lhs, const SHVec2& rhs) noexcept
+ {
+ SHVec2 result;
+
+ const XMFLOAT3 LHS { 0.0f, 0.0f, lhs };
+ const XMFLOAT3 RHS { rhs.x, rhs.y, 0.0f };
+
+ const XMVECTOR V1 = XMLoadFloat3(&LHS);
+ const XMVECTOR V2 = XMLoadFloat3(&RHS);
+
+ XMStoreFloat2(&result, XMVector3Cross(V1, V2));
+ return result;
+ }
+
+ SHVec2 SHVec2::Cross(const SHVec2& lhs, float rhs) noexcept
+ {
+ SHVec2 result;
+
+ const XMFLOAT3 LHS { lhs.x, lhs.y, 0.0f };
+ const XMFLOAT3 RHS { 0.0f, 0.0f, rhs };
+
+ const XMVECTOR V1 = XMLoadFloat3(&LHS);
+ const XMVECTOR V2 = XMLoadFloat3(&RHS);
+
+ XMStoreFloat2(&result, XMVector3Cross(V1, V2));
+ return result;
+ }
+
+ float SHVec2::Cross(const SHVec2& lhs, const SHVec2& rhs) noexcept
+ {
+ return (lhs.x * rhs.y) - (lhs.y * rhs.x);
+ }
+}
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/Vector/SHVec2.h b/SHADE_Engine/src/Math/Vector/SHVec2.h
new file mode 100644
index 00000000..a64d4bb0
--- /dev/null
+++ b/SHADE_Engine/src/Math/Vector/SHVec2.h
@@ -0,0 +1,122 @@
+/****************************************************************************************
+ * \file SHVec2.h
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Interface for 2D Vector.
+ *
+ * \copyright 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
+#include
+#include
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Forward Declarations */
+ /*-----------------------------------------------------------------------------------*/
+ class SHMatrix;
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Type Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ class SHVec2 : public DirectX::XMFLOAT2
+ {
+ public:
+ /*---------------------------------------------------------------------------------*/
+ /* Static Data Members */
+ /*---------------------------------------------------------------------------------*/
+
+ static constexpr size_t SIZE = 2U;
+
+ static const SHVec2 Zero;
+ static const SHVec2 One;
+ static const SHVec2 Left;
+ static const SHVec2 Right;
+ static const SHVec2 Up;
+ static const SHVec2 Down;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Constructors & Destructor */
+ /*---------------------------------------------------------------------------------*/
+
+ SHVec2 (const SHVec2& rhs) = default;
+ SHVec2 (SHVec2&& rhs) = default;
+ ~SHVec2 () = default;
+
+ SHVec2 () noexcept;
+ SHVec2 (float x, float y) noexcept;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Operator Overloads */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] SHVec2& operator= (const SHVec2& rhs) = default;
+ [[nodiscard]] SHVec2& operator= (SHVec2&& rhs) = default;
+
+ [[nodiscard]] SHVec2& operator+= (const SHVec2& rhs) noexcept;
+ [[nodiscard]] SHVec2& operator-= (const SHVec2& rhs) noexcept;
+ [[nodiscard]] SHVec2& operator*= (const SHVec2& rhs) noexcept;
+ [[nodiscard]] SHVec2& operator*= (float rhs) noexcept;
+ [[nodiscard]] SHVec2& operator/= (const SHVec2& rhs) noexcept;
+ [[nodiscard]] SHVec2& operator/= (float rhs) noexcept;
+
+ [[nodiscard]] SHVec2 operator+ (const SHVec2& rhs) const noexcept;
+ [[nodiscard]] SHVec2 operator- (const SHVec2& rhs) const noexcept;
+ [[nodiscard]] SHVec2 operator- () const noexcept;
+ [[nodiscard]] SHVec2 operator* (const SHVec2& rhs) const noexcept;
+ [[nodiscard]] SHVec2 operator* (float rhs) const noexcept;
+ [[nodiscard]] SHVec2 operator/ (const SHVec2& rhs) const noexcept;
+ [[nodiscard]] SHVec2 operator/ (float rhs) const noexcept;
+
+ [[nodiscard]] bool operator== (const SHVec2& rhs) const noexcept;
+ [[nodiscard]] bool operator!= (const SHVec2& rhs) const noexcept;
+
+ [[nodiscard]] float operator[] (int index);
+ [[nodiscard]] float operator[] (size_t index);
+ [[nodiscard]] float operator[] (int index) const;
+ [[nodiscard]] float operator[] (size_t index) const;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] float Length () const noexcept;
+ [[nodiscard]] float LengthSquared () const noexcept;
+ [[nodiscard]] std::string ToString () const noexcept;
+
+ [[nodiscard]] float Dot (const SHVec2& rhs) const noexcept;
+ [[nodiscard]] SHVec2 Cross (const SHVec2& rhs) const noexcept;
+ /*---------------------------------------------------------------------------------*/
+ /* Static Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] static SHVec2 Normalise (const SHVec2& vec2) noexcept;
+ [[nodiscard]] static SHVec2 Abs (const SHVec2& vec2) noexcept;
+ [[nodiscard]] static SHVec2 Min (const std::initializer_list& vec2s) noexcept;
+ [[nodiscard]] static SHVec2 Max (const std::initializer_list& vec2s) noexcept;
+ [[nodiscard]] static SHVec2 Clamp (const SHVec2& v, const SHVec2& vMin, const SHVec2& vMax) noexcept;
+ [[nodiscard]] static SHVec2 Lerp (const SHVec2& a, const SHVec2& b, float t) noexcept;
+ [[nodiscard]] static SHVec2 ClampedLerp (const SHVec2& a, const SHVec2& b, float t, float tMin = 0.0f, float tMax = 1.0f) noexcept;
+
+ [[nodiscard]] static float Distance (const SHVec2& lhs, const SHVec2& rhs) noexcept;
+ [[nodiscard]] static float DistanceSquared (const SHVec2& lhs, const SHVec2& rhs) noexcept;
+ [[nodiscard]] static float Angle (const SHVec2& lhs, const SHVec2& rhs) noexcept;
+ [[nodiscard]] static float Dot (const SHVec2& lhs, const SHVec2& rhs) noexcept;
+ [[nodiscard]] static SHVec2 Project (const SHVec2& v, const SHVec2& u) noexcept;
+ [[nodiscard]] static SHVec2 Reflect (const SHVec2& v, const SHVec2& normal) noexcept;
+ [[nodiscard]] static SHVec2 Rotate (const SHVec2& v, float angleInRad) noexcept;
+ [[nodiscard]] static SHVec2 Transform (const SHVec2& v, const SHMatrix& transformMtx) noexcept;
+ [[nodiscard]] static SHVec2 Cross (float lhs, const SHVec2& rhs) noexcept;
+ [[nodiscard]] static SHVec2 Cross (const SHVec2& lhs, float rhs) noexcept;
+ [[nodiscard]] static float Cross (const SHVec2& lhs, const SHVec2& rhs) noexcept;
+ };
+
+ SHVec2 operator* (float lhs, const SHVec2& rhs) noexcept;
+
+} // namespace SHADE
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/Vector/SHVec3.cpp b/SHADE_Engine/src/Math/Vector/SHVec3.cpp
new file mode 100644
index 00000000..73030f9c
--- /dev/null
+++ b/SHADE_Engine/src/Math/Vector/SHVec3.cpp
@@ -0,0 +1,477 @@
+/****************************************************************************************
+ * \file SHVec3.cpp
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Implementation for 3D Vector.
+ *
+ * \copyright 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
+
+// Primary Header
+#include "SHVec3.h"
+// Project Headers
+#include "Math/SHMatrix.h"
+#include "Tools/SHLogger.h"
+
+using namespace DirectX;
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Data Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+ SHVec3 const SHVec3::Zero { 0.0f, 0.0f, 0.0f };
+ SHVec3 const SHVec3::One { 1.0f, 1.0f, 1.0f };
+ SHVec3 const SHVec3::Left { -1.0f, 0.0f, 0.0f };
+ SHVec3 const SHVec3::Right { 1.0f, 0.0f, 0.0f };
+ SHVec3 const SHVec3::Up { 0.0f, 1.0f, 0.0f };
+ SHVec3 const SHVec3::Down { 0.0f, -1.0f, 0.0f };
+ SHVec3 const SHVec3::Forward { 0.0f, 0.0f, 1.0f };
+ SHVec3 const SHVec3::Back { 0.0f, 0.0f, -1.0f };
+ SHVec3 const SHVec3::UnitX { 1.0f, 0.0f, 0.0f };
+ SHVec3 const SHVec3::UnitY { 0.0f, 1.0f, 0.0f };
+ SHVec3 const SHVec3::UnitZ { 0.0f, 0.0f, 1.0f };
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Constructors & Destructor Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHVec3::SHVec3() noexcept
+ : XMFLOAT3( 0.0f, 0.0f, 0.0f )
+ {}
+
+ SHVec3::SHVec3(float _x, float _y, float _z) noexcept
+ : XMFLOAT3( _x, _y, _z )
+ {}
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Operator Overload Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHVec3& SHVec3::operator+=(const SHVec3& rhs) noexcept
+ {
+ return *this = *this + rhs;
+ }
+
+ SHVec3& SHVec3::operator-=(const SHVec3& rhs) noexcept
+ {
+ return *this = *this - rhs;
+ }
+
+ SHVec3& SHVec3::operator*=(const SHVec3& rhs) noexcept
+ {
+ return *this = *this * rhs;
+ }
+
+ SHVec3& SHVec3::operator*=(float rhs) noexcept
+ {
+ return *this = *this * rhs;
+ }
+
+ SHVec3& SHVec3::operator/=(const SHVec3& rhs) noexcept
+ {
+ return *this = *this / rhs;
+ }
+
+ SHVec3& SHVec3::operator/=(float rhs) noexcept
+ {
+ return *this = *this / rhs;
+ }
+
+ SHVec3 SHVec3::operator+(const SHVec3& rhs) const noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V1 = XMLoadFloat3(this);
+ const XMVECTOR V2 = XMLoadFloat3(&rhs);
+
+ XMStoreFloat3(&result, XMVectorAdd(V1, V2));
+ return result;
+ }
+
+ SHVec3 SHVec3::operator-(const SHVec3& rhs) const noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V1 = XMLoadFloat3(this);
+ const XMVECTOR V2 = XMLoadFloat3(&rhs);
+
+ XMStoreFloat3(&result, XMVectorSubtract(V1, V2));
+ return result;
+ }
+
+ SHVec3 SHVec3::operator-() const noexcept
+ {
+ return SHVec3{ -x, -y, -z };
+ }
+
+
+ SHVec3 SHVec3::operator*(const SHVec3& rhs) const noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V1 = XMLoadFloat3(this);
+ const XMVECTOR V2 = XMLoadFloat3(&rhs);
+
+ XMStoreFloat3(&result, XMVectorMultiply(V1, V2));
+ return result;
+ }
+
+ SHVec3 SHVec3::operator*(float rhs) const noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(this);
+
+ XMStoreFloat3(&result, XMVectorScale(V, rhs));
+ return result;
+ }
+
+ SHVec3 SHVec3::operator/(const SHVec3& rhs) const noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V1 = XMLoadFloat3(this);
+ const XMVECTOR V2 = XMLoadFloat3(&rhs);
+
+ XMStoreFloat3(&result, XMVectorDivide(V1, V2));
+ return result;
+ }
+
+ SHVec3 SHVec3::operator/(float rhs) const noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(this);
+
+ XMStoreFloat3(&result, XMVectorScale(V, 1.0f / rhs));
+ return result;
+ }
+
+ bool SHVec3::operator==(const SHVec3& rhs) const noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat3(this);
+ const XMVECTOR V2 = XMLoadFloat3(&rhs);
+
+ return XMVector3Equal(V1, V2);
+ }
+
+ bool SHVec3::operator!=(const SHVec3& rhs) const noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat3(this);
+ const XMVECTOR V2 = XMLoadFloat3(&rhs);
+
+ return XMVector3NotEqual(V1, V2);
+ }
+
+ float SHVec3::operator[](int index)
+ {
+ if (index >= SIZE || index < 0)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ case 2: return z;
+ default: return 0.0f;
+ }
+ }
+
+ float SHVec3::operator[](size_t index)
+ {
+ if (index >= SIZE)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ case 2: return z;
+ default: return 0.0f;
+ }
+ }
+
+ float SHVec3::operator[](int index) const
+ {
+ if (index >= SIZE || index < 0)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ case 2: return z;
+ default: return 0.0f;
+ }
+ }
+
+ float SHVec3::operator[](size_t index) const
+ {
+ if (index >= SIZE)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ case 2: return z;
+ default: return 0.0f;
+ }
+ }
+
+ SHVec3 operator* (float lhs, const SHVec3& rhs) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(&rhs);
+
+ XMStoreFloat3(&result, XMVectorScale(V, lhs));
+ return result;
+ }
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ float SHVec3::Length() const noexcept
+ {
+ const XMVECTOR V = XMLoadFloat3(this);
+
+ return XMVectorGetX(XMVector3Length(V));
+ }
+
+ float SHVec3::LengthSquared() const noexcept
+ {
+ const XMVECTOR V = XMLoadFloat3(this);
+
+ return XMVectorGetX(XMVector3LengthSq(V));
+ }
+
+ std::string SHVec3::ToString() const noexcept
+ {
+ std::stringstream ss;
+ ss << std::fixed << std::setprecision(3);
+ ss << "<" << x << ", " << y << ", " << z << ">";
+ return ss.str();
+ }
+
+ float SHVec3::Dot(const SHVec3& rhs) const noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat3(this);
+ const XMVECTOR V2 = XMLoadFloat3(&rhs);
+
+ return XMVectorGetX(XMVector3Dot(V1, V2));
+ }
+
+ SHVec3 SHVec3::Cross(const SHVec3& rhs) const noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V1 = XMLoadFloat3(this);
+ const XMVECTOR V2 = XMLoadFloat3(&rhs);
+
+ XMStoreFloat3(&result, XMVector3Cross(V1, V2));
+ return result;
+ }
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHVec3 SHVec3::Normalise(const SHVec3& v) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(&v);
+
+ XMStoreFloat3(&result, XMVector3Normalize(V));
+ return result;
+ }
+
+ SHVec3 SHVec3::Abs(const SHVec3& v) noexcept
+ {
+ return SHVec3{ std::fabs(v.x), std::fabs(v.y), std::fabs(v.z) };
+ }
+
+ SHVec3 SHVec3::Min(const std::initializer_list& vs) noexcept
+ {
+ if (vs.size() == 0)
+ {
+ SHLOG_WARNING("No arguments passed in! Min value is a default SHVec3.")
+ return SHVec3{};
+ }
+
+ SHVec3 result;
+
+ XMVECTOR min = XMLoadFloat3(&(*vs.begin()));
+ for (auto it = vs.begin() + 1; it != vs.end(); ++it)
+ {
+ const XMVECTOR tmp = XMLoadFloat3(&(*it));
+ min = XMVectorMin(min, tmp);
+ }
+
+ XMStoreFloat3(&result, min);
+ return result;
+ }
+
+ SHVec3 SHVec3::Max(const std::initializer_list& vs) noexcept
+ {
+ if (vs.size() == 0)
+ {
+ SHLOG_WARNING("No arguments passed in! Max value is a default SHVec3.")
+ return SHVec3{};
+ }
+
+ SHVec3 result;
+
+ XMVECTOR max = XMLoadFloat3(&(*vs.begin()));
+ for (auto it = vs.begin() + 1; it != vs.end(); ++it)
+ {
+ const XMVECTOR tmp = XMLoadFloat3(&(*it));
+ max = XMVectorMax(max, tmp);
+ }
+
+ XMStoreFloat3(&result, max);
+ return result;
+ }
+
+ SHVec3 SHVec3::Clamp(const SHVec3& v, const SHVec3& vMin, const SHVec3& vMax) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(&v);
+ const XMVECTOR MIN = XMLoadFloat3(&vMin);
+ const XMVECTOR MAX = XMLoadFloat3(&vMax);
+
+ XMStoreFloat3(&result, XMVectorClamp(V, MIN, MAX));
+ return result;
+ }
+
+ SHVec3 SHVec3::Lerp(const SHVec3& a, const SHVec3& b, float t) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V1 = XMLoadFloat3(&a);
+ const XMVECTOR V2 = XMLoadFloat3(&b);
+
+ XMStoreFloat3(&result, XMVectorLerp(V1, V2, t));
+ return result;
+ }
+
+ SHVec3 SHVec3::ClampedLerp(const SHVec3& a, const SHVec3& b, float t, float tMin, float tMax) noexcept
+ {
+ return Lerp(a, b, std::clamp(t, tMin, tMax));
+ }
+
+ float SHVec3::Distance(const SHVec3& lhs, const SHVec3& rhs) noexcept
+ {
+ return (lhs - rhs).Length();
+ }
+
+ float SHVec3::DistanceSquared(const SHVec3& lhs, const SHVec3& rhs) noexcept
+ {
+ return (lhs - rhs).LengthSquared();
+ }
+
+ float SHVec3::Angle(const SHVec3& lhs, const SHVec3& rhs) noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat3(&lhs);
+ const XMVECTOR V2 = XMLoadFloat3(&rhs);
+
+ return XMVectorGetX(XMVector3AngleBetweenVectors(V1, V2));
+ }
+
+ float SHVec3::Dot(const SHVec3& lhs, const SHVec3& rhs) noexcept
+ {
+ return lhs.Dot(rhs);
+ }
+
+ SHVec3 SHVec3::Cross(const SHVec3& lhs, const SHVec3& rhs) noexcept
+ {
+ return lhs.Cross(rhs);
+ }
+
+ SHVec3 SHVec3::Project(const SHVec3& v, const SHVec3& u) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR U = XMLoadFloat3(&u);
+ const float V_DOT_U = Dot(v, u);
+ const float U_LENSQ = u.LengthSquared();
+
+ XMStoreFloat3(&result, XMVectorScale(U, V_DOT_U / U_LENSQ));
+ return result;
+ }
+
+ SHVec3 SHVec3::Reflect(const SHVec3& v, const SHVec3& normal) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(&v);
+ const XMVECTOR N = XMLoadFloat3(&normal);
+
+ XMStoreFloat3(&result, XMVector3Reflect(V, N));
+ return result;
+ }
+
+ SHVec3 SHVec3::Rotate(const SHVec3& v, const SHVec3& axis, float angleInRad) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(&v);
+
+ const XMVECTOR AXIS = XMLoadFloat3(&axis);
+ const XMVECTOR Q = XMQuaternionRotationAxis(AXIS, angleInRad);
+
+ XMStoreFloat3(&result, XMVector3Rotate(V, Q));
+ return result;
+ }
+
+ SHVec3 SHVec3::RotateX(const SHVec3& v, float angleInRad) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(&v);
+ const XMMATRIX R = XMMatrixRotationX(angleInRad);
+
+ XMStoreFloat3(&result, XMVector3TransformCoord(V, R));
+ return result;
+ }
+
+ SHVec3 SHVec3::RotateY(const SHVec3& v, float angleInRad) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(&v);
+ const XMMATRIX R = XMMatrixRotationY(angleInRad);
+
+ XMStoreFloat3(&result, XMVector3TransformCoord(V, R));
+ return result;
+ }
+
+ SHVec3 SHVec3::RotateZ(const SHVec3& v, float angleInRad) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(&v);
+ const XMMATRIX R = XMMatrixRotationZ(angleInRad);
+
+ XMStoreFloat3(&result, XMVector3TransformCoord(V, R));
+ return result;
+ }
+
+ SHVec3 SHVec3::Transform(const SHVec3& v, const SHMatrix& transformMtx) noexcept
+ {
+ SHVec3 result;
+
+ const XMVECTOR V = XMLoadFloat3(&v);
+ const XMMATRIX TF = XMLoadFloat4x4(&transformMtx);
+
+ XMStoreFloat3(&result, XMVector3TransformCoord(V, TF));
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/Vector/SHVec3.h b/SHADE_Engine/src/Math/Vector/SHVec3.h
new file mode 100644
index 00000000..e172e824
--- /dev/null
+++ b/SHADE_Engine/src/Math/Vector/SHVec3.h
@@ -0,0 +1,129 @@
+/****************************************************************************************
+ * \file SHVec3.h
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Interface for 3D Vector.
+ *
+ * \copyright 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
+#include
+#include
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Forward Declarations */
+ /*-----------------------------------------------------------------------------------*/
+ class SHMatrix;
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Type Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ class SHVec3 : public DirectX::XMFLOAT3
+ {
+ public:
+ /*---------------------------------------------------------------------------------*/
+ /* Static Data Members */
+ /*---------------------------------------------------------------------------------*/
+
+ static constexpr size_t SIZE = 3U;
+
+ static const SHVec3 Zero;
+ static const SHVec3 One;
+ static const SHVec3 Left;
+ static const SHVec3 Right;
+ static const SHVec3 Up;
+ static const SHVec3 Down;
+ static const SHVec3 Forward;
+ static const SHVec3 Back;
+ static const SHVec3 UnitX;
+ static const SHVec3 UnitY;
+ static const SHVec3 UnitZ;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Constructors & Destructor */
+ /*---------------------------------------------------------------------------------*/
+
+ SHVec3 (const SHVec3& rhs) = default;
+ SHVec3 (SHVec3&& rhs) = default;
+ ~SHVec3 () = default;
+
+ SHVec3 () noexcept;
+ SHVec3 (float x, float y, float z) noexcept;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Operator Overloads */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] SHVec3& operator= (const SHVec3& rhs) = default;
+ [[nodiscard]] SHVec3& operator= (SHVec3&& rhs) = default;
+
+ [[nodiscard]] SHVec3& operator+= (const SHVec3& rhs) noexcept;
+ [[nodiscard]] SHVec3& operator-= (const SHVec3& rhs) noexcept;
+ [[nodiscard]] SHVec3& operator*= (const SHVec3& rhs) noexcept;
+ [[nodiscard]] SHVec3& operator*= (float rhs) noexcept;
+ [[nodiscard]] SHVec3& operator/= (const SHVec3& rhs) noexcept;
+ [[nodiscard]] SHVec3& operator/= (float rhs) noexcept;
+
+ [[nodiscard]] SHVec3 operator+ (const SHVec3& rhs) const noexcept;
+ [[nodiscard]] SHVec3 operator- (const SHVec3& rhs) const noexcept;
+ [[nodiscard]] SHVec3 operator- () const noexcept;
+ [[nodiscard]] SHVec3 operator* (const SHVec3& rhs) const noexcept;
+ [[nodiscard]] SHVec3 operator* (float rhs) const noexcept;
+ [[nodiscard]] SHVec3 operator/ (const SHVec3& rhs) const noexcept;
+ [[nodiscard]] SHVec3 operator/ (float rhs) const noexcept;
+
+ [[nodiscard]] bool operator== (const SHVec3& rhs) const noexcept;
+ [[nodiscard]] bool operator!= (const SHVec3& rhs) const noexcept;
+
+ [[nodiscard]] float operator[] (int index);
+ [[nodiscard]] float operator[] (size_t index);
+ [[nodiscard]] float operator[] (int index) const;
+ [[nodiscard]] float operator[] (size_t index) const;
+
+
+ /*---------------------------------------------------------------------------------*/
+ /* Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] float Length () const noexcept;
+ [[nodiscard]] float LengthSquared () const noexcept;
+ [[nodiscard]] std::string ToString () const noexcept;
+
+ [[nodiscard]] float Dot (const SHVec3& rhs) const noexcept;
+ [[nodiscard]] SHVec3 Cross (const SHVec3& rhs) const noexcept;
+ /*---------------------------------------------------------------------------------*/
+ /* Static Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] static SHVec3 Normalise (const SHVec3& v) noexcept;
+ [[nodiscard]] static SHVec3 Abs (const SHVec3& v) noexcept;
+ [[nodiscard]] static SHVec3 Min (const std::initializer_list& vs) noexcept;
+ [[nodiscard]] static SHVec3 Max (const std::initializer_list& vs) noexcept;
+ [[nodiscard]] static SHVec3 Clamp (const SHVec3& v, const SHVec3& vMin, const SHVec3& vMax) noexcept;
+ [[nodiscard]] static SHVec3 Lerp (const SHVec3& a, const SHVec3& b, float t) noexcept;
+ [[nodiscard]] static SHVec3 ClampedLerp (const SHVec3& a, const SHVec3& b, float t, float tMin = 0.0f, float tMax = 1.0f) noexcept;
+
+ [[nodiscard]] static float Distance (const SHVec3& lhs, const SHVec3& rhs) noexcept;
+ [[nodiscard]] static float DistanceSquared (const SHVec3& lhs, const SHVec3& rhs) noexcept;
+ [[nodiscard]] static float Angle (const SHVec3& lhs, const SHVec3& rhs) noexcept;
+ [[nodiscard]] static float Dot (const SHVec3& lhs, const SHVec3& rhs) noexcept;
+ [[nodiscard]] static SHVec3 Cross (const SHVec3& lhs, const SHVec3& rhs) noexcept;
+ [[nodiscard]] static SHVec3 Project (const SHVec3& v, const SHVec3& u) noexcept;
+ [[nodiscard]] static SHVec3 Reflect (const SHVec3& v, const SHVec3& normal) noexcept;
+ [[nodiscard]] static SHVec3 Rotate (const SHVec3& v, const SHVec3& axis, float angleInRad) noexcept;
+ [[nodiscard]] static SHVec3 RotateX (const SHVec3& v, float angleInRad) noexcept;
+ [[nodiscard]] static SHVec3 RotateY (const SHVec3& v, float angleInRad) noexcept;
+ [[nodiscard]] static SHVec3 RotateZ (const SHVec3& v, float angleInRad) noexcept;
+ [[nodiscard]] static SHVec3 Transform (const SHVec3& v, const SHMatrix& transformMtx) noexcept;
+ };
+
+ SHVec3 operator* (float lhs, const SHVec3& rhs) noexcept;
+
+} // namespace SHADE
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/Vector/SHVec4.cpp b/SHADE_Engine/src/Math/Vector/SHVec4.cpp
new file mode 100644
index 00000000..5d75af33
--- /dev/null
+++ b/SHADE_Engine/src/Math/Vector/SHVec4.cpp
@@ -0,0 +1,529 @@
+/****************************************************************************************
+ * \file SHVec4.cpp
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Implementation for 4D Vector.
+ *
+ * \copyright 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
+
+// Primary Header
+#include "SHVec4.h"
+// Project Headers
+#include "Math/SHMatrix.h"
+#include "Tools/SHLogger.h"
+
+using namespace DirectX;
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Data Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+ SHVec4 const SHVec4::Zero { 0.0f, 0.0f, 0.0f, 0.0f };
+ SHVec4 const SHVec4::One { 1.0f, 1.0f, 1.0f, 1.0f };
+ SHVec4 const SHVec4::UnitX { 1.0f, 0.0f, 0.0f, 0.0f };
+ SHVec4 const SHVec4::UnitY { 0.0f, 1.0f, 0.0f, 0.0f };
+ SHVec4 const SHVec4::UnitZ { 0.0f, 0.0f, 1.0f, 0.0f };
+ SHVec4 const SHVec4::UnitW { 0.0f, 0.0f, 0.0f, 1.0f };
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Constructors & Destructor Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHVec4::SHVec4() noexcept
+ : XMFLOAT4( 0.0f, 0.0f, 0.0f, 0.0f )
+ {}
+
+ SHVec4::SHVec4(float _x, float _y, float _z, float _w) noexcept
+ : XMFLOAT4( _x, _y, _z, _w )
+ {}
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Operator Overload Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHVec4& SHVec4::operator+=(const SHVec4& rhs) noexcept
+ {
+ return *this = *this + rhs;
+ }
+
+ SHVec4& SHVec4::operator-=(const SHVec4& rhs) noexcept
+ {
+ return *this = *this - rhs;
+ }
+
+ SHVec4& SHVec4::operator*=(const SHVec4& rhs) noexcept
+ {
+ return *this = *this * rhs;
+ }
+
+ SHVec4& SHVec4::operator*=(float rhs) noexcept
+ {
+ return *this = *this * rhs;
+ }
+
+ SHVec4& SHVec4::operator/=(const SHVec4& rhs) noexcept
+ {
+ return *this = *this / rhs;
+ }
+
+ SHVec4& SHVec4::operator/=(float rhs) noexcept
+ {
+ return *this = *this / rhs;
+ }
+
+ SHVec4 SHVec4::operator+(const SHVec4& rhs) const noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V1 = XMLoadFloat4(this);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ XMStoreFloat4(&result, XMVectorAdd(V1, V2));
+ return result;
+ }
+
+ SHVec4 SHVec4::operator-(const SHVec4& rhs) const noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V1 = XMLoadFloat4(this);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ XMStoreFloat4(&result, XMVectorSubtract(V1, V2));
+ return result;
+ }
+
+ SHVec4 SHVec4::operator-() const noexcept
+ {
+ return SHVec4{ -x, -y, -z, -w };
+ }
+
+ SHVec4 SHVec4::operator*(const SHVec4& rhs) const noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V1 = XMLoadFloat4(this);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ XMStoreFloat4(&result, XMVectorMultiply(V1, V2));
+ return result;
+ }
+
+ SHVec4 SHVec4::operator*(float rhs) const noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V = XMLoadFloat4(this);
+
+ XMStoreFloat4(&result, XMVectorScale(V, rhs));
+ return result;
+ }
+
+ SHVec4 SHVec4::operator/(const SHVec4& rhs) const noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V1 = XMLoadFloat4(this);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ XMStoreFloat4(&result, XMVectorDivide(V1, V2));
+ return result;
+ }
+
+ SHVec4 SHVec4::operator/(float rhs) const noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V = XMLoadFloat4(this);
+
+ XMStoreFloat4(&result, XMVectorScale(V, 1.0f / rhs));
+ return result;
+ }
+
+ bool SHVec4::operator==(const SHVec4& rhs) const noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat4(this);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ return XMVector4Equal(V1, V2);
+ }
+
+ bool SHVec4::operator!=(const SHVec4& rhs) const noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat4(this);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ return XMVector4NotEqual(V1, V2);
+ }
+
+ float SHVec4::operator[](int index)
+ {
+ if (index >= SIZE || index < 0)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ case 2: return z;
+ case 3: return w;
+ default: return 0.0f;
+ }
+ }
+
+ float SHVec4::operator[](size_t index)
+ {
+ if (index >= SIZE)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ case 2: return z;
+ case 3: return w;
+ default: return 0.0f;
+ }
+ }
+
+ float SHVec4::operator[](int index) const
+ {
+ if (index >= SIZE || index < 0)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ case 2: return z;
+ case 3: return w;
+ default: return 0.0f;
+ }
+ }
+
+ float SHVec4::operator[](size_t index) const
+ {
+ if (index >= SIZE)
+ throw std::invalid_argument("Index out of range!");
+
+ switch (index)
+ {
+ case 0: return x;
+ case 1: return y;
+ case 2: return z;
+ case 3: return w;
+ default: return 0.0f;
+ }
+ }
+
+ SHVec4 operator* (float lhs, const SHVec4& rhs) noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V = XMLoadFloat4(&rhs);
+
+ XMStoreFloat4(&result, XMVectorScale(V, lhs));
+ return result;
+ }
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ float SHVec4::Length() const noexcept
+ {
+ const XMVECTOR V = XMLoadFloat4(this);
+
+ return XMVectorGetX(XMVector4Length(V));
+ }
+
+ float SHVec4::Length3D() const noexcept
+ {
+ const XMVECTOR V = XMLoadFloat4(this);
+
+ return XMVectorGetX(XMVector3Length(V));
+ }
+
+ float SHVec4::LengthSquared() const noexcept
+ {
+ const XMVECTOR V = XMLoadFloat4(this);
+
+ return XMVectorGetX(XMVector4LengthSq(V));
+ }
+
+ float SHVec4::LengthSquared3D() const noexcept
+ {
+ const XMVECTOR V = XMLoadFloat4(this);
+
+ return XMVectorGetX(XMVector3LengthSq(V));
+ }
+
+ std::string SHVec4::ToString() const noexcept
+ {
+ std::stringstream ss;
+ ss << std::fixed << std::setprecision(3);
+ ss << "<" << x << ", " << y << ", " << z << ", " << w <<">";
+ return ss.str();
+ }
+
+ float SHVec4::Dot(const SHVec4& rhs) const noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat4(this);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ return XMVectorGetX(XMVector4Dot(V1, V2));
+ }
+
+ float SHVec4::Dot3D(const SHVec4& rhs) const noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat4(this);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ return XMVectorGetX(XMVector3Dot(V1, V2));
+ }
+
+ SHVec4 SHVec4::Cross3D(const SHVec4& rhs) const noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V1 = XMLoadFloat4(this);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ XMStoreFloat4(&result, XMVector3Cross(V1, V2));
+ result.w = 1.0f;
+ return result;
+ }
+
+ SHVec4 SHVec4::Cross(const SHVec4& v1, const SHVec4& v2) const noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V3 = XMLoadFloat4(this);
+ const XMVECTOR V1 = XMLoadFloat4(&v1);
+ const XMVECTOR V2 = XMLoadFloat4(&v2);
+
+ XMStoreFloat4(&result, XMVector4Cross(V3, V1, V2));
+ return result;
+ }
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Static Function Member Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ SHVec4 SHVec4::Normalise(const SHVec4& v) noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V = XMLoadFloat4(&v);
+
+ XMStoreFloat4(&result, XMVector4Normalize(V));
+ return result;
+ }
+
+ SHVec4 SHVec4::Normalise3D(const SHVec4& v) noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V = XMLoadFloat4(&v);
+
+ XMStoreFloat4(&result, XMVector3Normalize(V));
+ result.w = 1.0f;
+ return result;
+ }
+
+ SHVec4 SHVec4::Abs(const SHVec4& v) noexcept
+ {
+ return SHVec4{ std::fabs(v.x), std::fabs(v.y), std::fabs(v.z), std::fabs(v.w) };
+ }
+
+ SHVec4 SHVec4::Min(const std::initializer_list& vs) noexcept
+ {
+ if (vs.size() == 0)
+ {
+ SHLOG_WARNING("No arguments passed in! Min value is a default SHVec4.")
+ return SHVec4{};
+ }
+
+ SHVec4 result;
+
+ XMVECTOR min = XMLoadFloat4(&(*vs.begin()));
+ for (auto it = vs.begin() + 1; it != vs.end(); ++it)
+ {
+ const XMVECTOR tmp = XMLoadFloat4(&(*it));
+ min = XMVectorMin(min, tmp);
+ }
+
+ XMStoreFloat4(&result, min);
+ return result;
+ }
+
+ SHVec4 SHVec4::Max(const std::initializer_list& vs) noexcept
+ {
+ if (vs.size() == 0)
+ {
+ SHLOG_WARNING("No arguments passed in! Max value is a default SHVec4.")
+ return SHVec4{};
+ }
+
+ SHVec4 result;
+
+ XMVECTOR max = XMLoadFloat4(&(*vs.begin()));
+ for (auto it = vs.begin() + 1; it != vs.end(); ++it)
+ {
+ const XMVECTOR tmp = XMLoadFloat4(&(*it));
+ max = XMVectorMax(max, tmp);
+ }
+
+ XMStoreFloat4(&result, max);
+ return result;
+ }
+
+ SHVec4 SHVec4::Clamp(const SHVec4& v, const SHVec4& vMin, const SHVec4& vMax) noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V = XMLoadFloat4(&v);
+ const XMVECTOR MIN = XMLoadFloat4(&vMin);
+ const XMVECTOR MAX = XMLoadFloat4(&vMax);
+
+ XMStoreFloat4(&result, XMVectorClamp(V, MIN, MAX));
+ return result;
+ }
+
+ SHVec4 SHVec4::Lerp(const SHVec4& a, const SHVec4& b, float t) noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V1 = XMLoadFloat4(&a);
+ const XMVECTOR V2 = XMLoadFloat4(&b);
+
+ XMStoreFloat4(&result, XMVectorLerp(V1, V2, t));
+ return result;
+ }
+
+ SHVec4 SHVec4::ClampedLerp(const SHVec4& a, const SHVec4& b, float t, float tMin, float tMax) noexcept
+ {
+ return Lerp(a, b, std::clamp(t, tMin, tMax));
+ }
+
+ float SHVec4::Distance(const SHVec4& lhs, const SHVec4& rhs) noexcept
+ {
+ return (lhs - rhs).Length();
+ }
+
+ float SHVec4::Distance3D(const SHVec4& lhs, const SHVec4& rhs) noexcept
+ {
+ return (lhs - rhs).Length3D();
+ }
+
+ float SHVec4::DistanceSquared(const SHVec4& lhs, const SHVec4& rhs) noexcept
+ {
+ return (lhs - rhs).LengthSquared();
+ }
+
+ float SHVec4::DistanceSquared3D(const SHVec4& lhs, const SHVec4& rhs) noexcept
+ {
+ return (lhs - rhs).LengthSquared3D();
+ }
+
+ float SHVec4::Angle(const SHVec4& lhs, const SHVec4& rhs) noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat4(&lhs);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ return XMVectorGetX(XMVector4AngleBetweenVectors(V1, V2));
+ }
+
+ float SHVec4::Angle3D(const SHVec4& lhs, const SHVec4& rhs) noexcept
+ {
+ const XMVECTOR V1 = XMLoadFloat4(&lhs);
+ const XMVECTOR V2 = XMLoadFloat4(&rhs);
+
+ return XMVectorGetX(XMVector3AngleBetweenVectors(V1, V2));
+ }
+
+ float SHVec4::Dot(const SHVec4& lhs, const SHVec4& rhs) noexcept
+ {
+ return lhs.Dot(rhs);
+ }
+
+ float SHVec4::Dot3D(const SHVec4& lhs, const SHVec4& rhs) noexcept
+ {
+ return lhs.Dot3D(rhs);
+ }
+
+ SHVec4 SHVec4::Cross3D(const SHVec4& lhs, const SHVec4& rhs) noexcept
+ {
+ return lhs.Cross3D(rhs);
+ }
+
+ SHVec4 SHVec4::Cross(const SHVec4& v1, const SHVec4& v2, const SHVec4& v3) noexcept
+ {
+ return v1.Cross(v2, v3);
+ }
+
+ SHVec4 SHVec4::Project(const SHVec4& v, const SHVec4& u) noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR U = XMLoadFloat4(&u);
+ const float V_DOT_U = Dot(v, u);
+ const float U_LENSQ = u.LengthSquared();
+
+ XMStoreFloat4(&result, XMVectorScale(U, V_DOT_U / U_LENSQ));
+ return result;
+ }
+
+ SHVec4 SHVec4::Project3D(const SHVec4& v, const SHVec4& u) noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR U = XMLoadFloat4(&u);
+ const float V_DOT_U = Dot3D(v, u);
+ const float U_LENSQ = u.LengthSquared3D();
+
+ XMStoreFloat4(&result, XMVectorScale(U, V_DOT_U / U_LENSQ));
+ result.w = 1.0f;
+ return result;
+ }
+
+ SHVec4 SHVec4::Reflect(const SHVec4& v, const SHVec4& normal) noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V = XMLoadFloat4(&v);
+ const XMVECTOR N = XMLoadFloat4(&normal);
+
+ XMStoreFloat4(&result, XMVector4Reflect(V, N));
+ result.w = 1.0f;
+ return result;
+ }
+
+ SHVec4 SHVec4::Reflect3D(const SHVec4& v, const SHVec4& normal) noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V = XMLoadFloat4(&v);
+ const XMVECTOR N = XMLoadFloat4(&normal);
+
+ XMStoreFloat4(&result, XMVector3Reflect(V, N));
+ result.w = 1.0f;
+ return result;
+ }
+
+ SHVec4 SHVec4::Transform3D(const SHVec4& v, const SHMatrix& transformMtx) noexcept
+ {
+ SHVec4 result;
+
+ const XMVECTOR V = XMLoadFloat4(&v);
+ const XMMATRIX TF = XMLoadFloat4x4(&transformMtx);
+
+ XMStoreFloat4(&result, XMVector3TransformCoord(V, TF));
+ return result;
+ }
+}
\ No newline at end of file
diff --git a/SHADE_Engine/src/Math/Vector/SHVec4.h b/SHADE_Engine/src/Math/Vector/SHVec4.h
new file mode 100644
index 00000000..c4caf2c8
--- /dev/null
+++ b/SHADE_Engine/src/Math/Vector/SHVec4.h
@@ -0,0 +1,133 @@
+/****************************************************************************************
+ * \file SHVec4.h
+ * \author Diren D Bharwani, diren.dbharwani, 390002520
+ * \brief Interface for 4D Vector.
+ *
+ * \copyright 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
+#include
+#include
+
+namespace SHADE
+{
+ /*-----------------------------------------------------------------------------------*/
+ /* Forward Declarations */
+ /*-----------------------------------------------------------------------------------*/
+ class SHMatrix;
+
+ /*-----------------------------------------------------------------------------------*/
+ /* Type Definitions */
+ /*-----------------------------------------------------------------------------------*/
+
+ class SHVec4 : public DirectX::XMFLOAT4
+ {
+ public:
+ /*---------------------------------------------------------------------------------*/
+ /* Static Data Members */
+ /*---------------------------------------------------------------------------------*/
+
+ static constexpr size_t SIZE = 4U;
+
+ static const SHVec4 Zero;
+ static const SHVec4 One;
+ static const SHVec4 UnitX;
+ static const SHVec4 UnitY;
+ static const SHVec4 UnitZ;
+ static const SHVec4 UnitW;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Constructors & Destructor */
+ /*---------------------------------------------------------------------------------*/
+
+ SHVec4 (const SHVec4& rhs) = default;
+ SHVec4 (SHVec4&& rhs) = default;
+ ~SHVec4 () = default;
+
+ SHVec4 () noexcept;
+ SHVec4 (float x, float y, float z, float w) noexcept;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Operator Overloads */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] SHVec4& operator= (const SHVec4& rhs) = default;
+ [[nodiscard]] SHVec4& operator= (SHVec4&& rhs) = default;
+
+ [[nodiscard]] SHVec4& operator+= (const SHVec4& rhs) noexcept;
+ [[nodiscard]] SHVec4& operator-= (const SHVec4& rhs) noexcept;
+ [[nodiscard]] SHVec4& operator*= (const SHVec4& rhs) noexcept;
+ [[nodiscard]] SHVec4& operator*= (float rhs) noexcept;
+ [[nodiscard]] SHVec4& operator/= (const SHVec4& rhs) noexcept;
+ [[nodiscard]] SHVec4& operator/= (float rhs) noexcept;
+
+ [[nodiscard]] SHVec4 operator+ (const SHVec4& rhs) const noexcept;
+ [[nodiscard]] SHVec4 operator- (const SHVec4& rhs) const noexcept;
+ [[nodiscard]] SHVec4 operator- () const noexcept;
+ [[nodiscard]] SHVec4 operator* (const SHVec4& rhs) const noexcept;
+ [[nodiscard]] SHVec4 operator* (float rhs) const noexcept;
+ [[nodiscard]] SHVec4 operator/ (const SHVec4& rhs) const noexcept;
+ [[nodiscard]] SHVec4 operator/ (float rhs) const noexcept;
+
+ [[nodiscard]] bool operator== (const SHVec4& rhs) const noexcept;
+ [[nodiscard]] bool operator!= (const SHVec4& rhs) const noexcept;
+
+ [[nodiscard]] float operator[] (int index);
+ [[nodiscard]] float operator[] (size_t index);
+ [[nodiscard]] float operator[] (int index) const;
+ [[nodiscard]] float operator[] (size_t index) const;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] float Length () const noexcept;
+ [[nodiscard]] float Length3D () const noexcept;
+ [[nodiscard]] float LengthSquared () const noexcept;
+ [[nodiscard]] float LengthSquared3D () const noexcept;
+ [[nodiscard]] std::string ToString () const noexcept;
+
+ [[nodiscard]] float Dot (const SHVec4& rhs) const noexcept;
+ [[nodiscard]] float Dot3D (const SHVec4& rhs) const noexcept;
+ [[nodiscard]] SHVec4 Cross3D (const SHVec4& rhs) const noexcept;
+ [[nodiscard]] SHVec4 Cross (const SHVec4& v1, const SHVec4& v2) const noexcept;
+
+ /*---------------------------------------------------------------------------------*/
+ /* Static Function Members */
+ /*---------------------------------------------------------------------------------*/
+
+ [[nodiscard]] static SHVec4 Normalise (const SHVec4& v) noexcept;
+ [[nodiscard]] static SHVec4 Normalise3D (const SHVec4& v) noexcept;
+ [[nodiscard]] static SHVec4 Abs (const SHVec4& v) noexcept;
+ [[nodiscard]] static SHVec4 Min (const std::initializer_list& vs) noexcept;
+ [[nodiscard]] static SHVec4 Max (const std::initializer_list& vs) noexcept;
+ [[nodiscard]] static SHVec4 Clamp (const SHVec4& v, const SHVec4& vMin, const SHVec4& vMax) noexcept;
+ [[nodiscard]] static SHVec4 Lerp (const SHVec4& a, const SHVec4& b, float t) noexcept;
+ [[nodiscard]] static SHVec4 ClampedLerp (const SHVec4& a, const SHVec4& b, float t, float tMin = 0.0f, float tMax = 1.0f) noexcept;
+
+ [[nodiscard]] static float Distance (const SHVec4& lhs, const SHVec4& rhs) noexcept;
+ [[nodiscard]] static float Distance3D (const SHVec4& lhs, const SHVec4& rhs) noexcept;
+ [[nodiscard]] static float DistanceSquared (const SHVec4& lhs, const SHVec4& rhs) noexcept;
+ [[nodiscard]] static float DistanceSquared3D (const SHVec4& lhs, const SHVec4& rhs) noexcept;
+ [[nodiscard]] static float Angle (const SHVec4& lhs, const SHVec4& rhs) noexcept;
+ [[nodiscard]] static float Angle3D (const SHVec4& lhs, const SHVec4& rhs) noexcept;
+ [[nodiscard]] static float Dot (const SHVec4& lhs, const SHVec4& rhs) noexcept;
+ [[nodiscard]] static float Dot3D (const SHVec4& lhs, const SHVec4& rhs) noexcept;
+ [[nodiscard]] static SHVec4 Cross3D (const SHVec4& lhs, const SHVec4& rhs) noexcept;
+ [[nodiscard]] static SHVec4 Cross (const SHVec4& v1, const SHVec4& v2, const SHVec4& v3) noexcept;
+ [[nodiscard]] static SHVec4 Project (const SHVec4& v, const SHVec4& u) noexcept;
+ [[nodiscard]] static SHVec4 Project3D (const SHVec4& v, const SHVec4& u) noexcept;
+ [[nodiscard]] static SHVec4 Reflect (const SHVec4& v, const SHVec4& normal) noexcept;
+ [[nodiscard]] static SHVec4 Reflect3D (const SHVec4& v, const SHVec4& normal) noexcept;
+ [[nodiscard]] static SHVec4 Transform3D (const SHVec4& v, const SHMatrix& transformMtx) noexcept;
+
+ };
+
+ SHVec4 operator* (float lhs, const SHVec4& rhs) noexcept;
+
+} // namespace SHADE
\ No newline at end of file
diff --git a/SHADE_Engine/src/SHCommonTypes.h b/SHADE_Engine/src/SHCommonTypes.h
new file mode 100644
index 00000000..97ef7928
--- /dev/null
+++ b/SHADE_Engine/src/SHCommonTypes.h
@@ -0,0 +1,28 @@
+/************************************************************************************//*!
+\file SHCommonTypes.h
+\author Tng Kah Wei, kahwei.tng, 390009620
+\par email: kahwei.tng\@digipen.edu
+\date Sep 8, 2022
+\brief Contains the definitions of type alias for commonly used units for
+ clarity and convenience.
+
+
+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
+
+namespace SHADE
+{
+ /*---------------------------------------------------------------------------------*/
+ /* Type Definitions */
+ /*---------------------------------------------------------------------------------*/
+ /***********************************************************************************/
+ /*!
+ \brief
+ Type used to mark a value that is supposed to represent a size in bytes.
+ */
+ /***********************************************************************************/
+ using Byte = size_t;
+}
diff --git a/SHADE_Engine/src/SH_API.h b/SHADE_Engine/src/SH_API.h
new file mode 100644
index 00000000..64d1eebe
--- /dev/null
+++ b/SHADE_Engine/src/SH_API.h
@@ -0,0 +1,36 @@
+/************************************************************************************//*!
+\file SH_API.h
+\author Tng Kah Wei, kahwei.tng, 390009620
+\par email: kahwei.tng\@digipen.edu
+\date Sep 13, 2022
+\brief Contains dllexport and dllimport macros for the SHADE Engine.
+
+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
+
+// Select the correct export system based on the compiler
+#if defined SH_LIB
+# define SH_API
+#else
+# if defined _WIN32 || defined __CYGWIN__ || defined _MSC_VER
+# define SH_EXPORT __declspec(dllexport)
+# define SH_IMPORT __declspec(dllimport)
+# elif defined __GNUC__ && __GNUC__ >= 4
+# define SH_EXPORT __attribute__((visibility("default")))
+# define SH_IMPORT __attribute__((visibility("default")))
+# else /* Unsupported compiler */
+# define SH_EXPORT
+# define SH_IMPORT
+# endif
+ // Define the correct
+# ifndef SH_API
+# if defined SH_API_EXPORT
+# define SH_API SH_EXPORT
+# else
+# define SH_API SH_IMPORT
+# endif
+# endif
+#endif
\ No newline at end of file
diff --git a/SHADE_Engine/src/SHpch.h b/SHADE_Engine/src/SHpch.h
index 281b3806..43a832f3 100644
--- a/SHADE_Engine/src/SHpch.h
+++ b/SHADE_Engine/src/SHpch.h
@@ -22,8 +22,14 @@
#include
#include
#include
+#include
#include
#include
#include