diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000..bb2faa2 --- /dev/null +++ b/.gitignore @@ -0,0 +1,3 @@ +/build +/.vs +/out diff --git a/.gitmodules b/.gitmodules new file mode 100644 index 0000000..34e5125 --- /dev/null +++ b/.gitmodules @@ -0,0 +1,12 @@ +[submodule "Dependencies/LFramework"] + path = Dependencies/LFramework + url = https://github.com/L-proger/LFramework.git +[submodule "Dependencies/NativeLINQ"] + path = Dependencies/NativeLINQ + url = https://github.com/L-proger/NativeLINQ.git +[submodule "Dependencies/LEngine"] + path = Dependencies/LEngine + url = https://github.com/L-proger/LEngine.git +[submodule "Dependencies/LMath"] + path = Dependencies/LMath + url = https://github.com/L-proger/LMath.git diff --git a/.vscode/launch.json b/.vscode/launch.json new file mode 100644 index 0000000..0784580 --- /dev/null +++ b/.vscode/launch.json @@ -0,0 +1,23 @@ +{ + "version": "0.2.0", + "configurations": [ + + { + "name": "Launch", + "type": "cppvsdbg", + "request": "launch", + + "program": "${command:cmake.launchTargetPath}", + "args": [], + "stopAtEntry": false, + "cwd": "${workspaceFolder}", + "environment": [ + { + "name": "PATH", + "value": "$PATH:${command:cmake.launchTargetDirectory}" + } + ], + "externalConsole": true + } + ] +} \ No newline at end of file diff --git a/Assets/Boxes.mtl b/Assets/Boxes.mtl new file mode 100644 index 0000000..7665742 --- /dev/null +++ b/Assets/Boxes.mtl @@ -0,0 +1,26 @@ +# 3ds Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 22.09.2015 22:34:25 + +newmtl RedCube + Ns 9.999999 + Ni 1.500000 + d 1.000000 + Tr 0.000000 + Tf 1.000000 1.000000 1.000000 + illum 2 + Ka 1.000000 0.000000 0.000000 + Kd 1.000000 0.000000 0.000000 + Ks 0.000000 0.000000 0.000000 + Ke 0.000000 0.000000 0.000000 + +newmtl BlueCube + Ns 9.999999 + Ni 1.500000 + d 1.000000 + Tr 0.000000 + Tf 1.000000 1.000000 1.000000 + illum 2 + Ka 0.047059 0.000000 1.000000 + Kd 0.047059 0.000000 1.000000 + Ks 0.000000 0.000000 0.000000 + Ke 0.000000 0.000000 0.000000 diff --git a/Assets/Boxes.obj b/Assets/Boxes.obj new file mode 100644 index 0000000..4b17746 --- /dev/null +++ b/Assets/Boxes.obj @@ -0,0 +1,105 @@ +# 3dA Max Wavefront OBJ Exporter v0.97b - (c)2007 guruware +# File Created: 22.09.2015 22:34:25 + +mtllib Boxes.mtl + +# +# object RedBox +# + +v -0.500000 0.000000 0.500000 +v -0.500000 0.000000 -0.500000 +v 0.500000 0.000000 -0.500000 +v 0.500000 0.000000 0.500000 +v -0.500000 1.000000 0.500000 +v 0.500000 1.000000 0.500000 +v 0.500000 1.000000 -0.500000 +v -0.500000 1.000000 -0.500000 +# 8 vertices + +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 -0.000000 +# 6 vertex normals + +vt 1.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.000000 0.000000 +# 4 texture coords + +g RedBox +usemtl RedCube +s 2 +f 1/1/1 2/2/1 3/3/1 +f 3/3/1 4/4/1 1/1/1 +s 4 +f 5/4/2 6/1/2 7/2/2 +f 7/2/2 8/3/2 5/4/2 +s 8 +f 1/4/3 4/1/3 6/2/3 +f 6/2/3 5/3/3 1/4/3 +s 16 +f 4/4/4 3/1/4 7/2/4 +f 7/2/4 6/3/4 4/4/4 +s 32 +f 3/4/5 2/1/5 8/2/5 +f 8/2/5 7/3/5 3/4/5 +s 64 +f 2/4/6 1/1/6 5/2/6 +f 5/2/6 8/3/6 2/4/6 +# 12 faces + +# +# object BlueBox +# + +v -0.500000 0.000000 1.978305 +v -0.500000 0.000000 0.978305 +v 0.500000 0.000000 0.978305 +v 0.500000 0.000000 1.978305 +v -0.500000 1.000000 1.978305 +v 0.500000 1.000000 1.978305 +v 0.500000 1.000000 0.978305 +v -0.500000 1.000000 0.978305 +# 8 vertices + +vn 0.000000 -1.000000 -0.000000 +vn 0.000000 1.000000 -0.000000 +vn 0.000000 0.000000 1.000000 +vn 1.000000 0.000000 -0.000000 +vn 0.000000 0.000000 -1.000000 +vn -1.000000 0.000000 -0.000000 +# 6 vertex normals + +vt 1.000000 0.000000 0.000000 +vt 1.000000 1.000000 0.000000 +vt 0.000000 1.000000 0.000000 +vt 0.000000 0.000000 0.000000 +# 4 texture coords + +g BlueBox +usemtl BlueCube +s 2 +f 9/5/7 10/6/7 11/7/7 +f 11/7/7 12/8/7 9/5/7 +s 4 +f 13/8/8 14/5/8 15/6/8 +f 15/6/8 16/7/8 13/8/8 +s 8 +f 9/8/9 12/5/9 14/6/9 +f 14/6/9 13/7/9 9/8/9 +s 16 +f 12/8/10 11/5/10 15/6/10 +f 15/6/10 14/7/10 12/8/10 +s 32 +f 11/8/11 10/5/11 16/6/11 +f 16/6/11 15/7/11 11/8/11 +s 64 +f 10/8/12 9/5/12 13/6/12 +f 13/6/12 16/7/12 10/8/12 +# 12 faces + diff --git a/Assets/Boxes.obj.meta b/Assets/Boxes.obj.meta new file mode 100644 index 0000000..845c679 --- /dev/null +++ b/Assets/Boxes.obj.meta @@ -0,0 +1,3 @@ +1.0 +{6799A53E-CBB1-451A-82C7-E5F10C33EBCA} +14435573237290376 diff --git a/Assets/Shaders/car_shader.fx b/Assets/Shaders/car_shader.fx new file mode 100644 index 0000000..98b6aa5 --- /dev/null +++ b/Assets/Shaders/car_shader.fx @@ -0,0 +1,57 @@ +struct VS_INPUT { + float4 vPosition : POSITION; + float3 normal : NORMAL; + float2 uv0 : UV0; + float2 uv1 : UV1; +}; + +struct VS_OUTPUT { + float4 vPosition : SV_POSITION; + float3 normal : TEXCOORD0; + float2 uv0 : TEXCOORD1; + float2 uv1 : TEXCOORD2; + float3 worldPos : TEXCOORD3; +}; + +cbuffer TestBuffer : register(b3) { + float4x4 mWorld; + float4x4 mView; + float4x4 mProjection; + float4 cameraWorldPos; +} + +Texture2D diffuse : register(t0); +Texture2D tex2 : register(t1); +SamplerState MeshTextureSampler; + + + +VS_OUTPUT main_vs(VS_INPUT v) { + VS_OUTPUT o; + + float4x4 wvp = mul(mul(mProjection, mView), mWorld); + + o.vPosition = mul(wvp, float4(v.vPosition.xyz, 1)); + + o.normal = mul((float3x3)mWorld, v.normal); + o.uv0 = v.uv0; + o.uv1 = v.uv1; + o.worldPos = mul((float3x3)mWorld, v.vPosition.xyz); + return o; +} + +#include "lighting/cook_torrance_term.inc" + +float4 main_ps(VS_OUTPUT input) : SV_Target +{ + float3 ambient = float3(0.3f, 0.3f, 0.4f); + + float4 diffuseColor = 1.0f;// diffuse.Sample(MeshTextureSampler, input.uv0); + float3 worldPos = input.worldPos; + float3 camPos = cameraWorldPos.xyz; + float3 viewDir = normalize(camPos - worldPos); + float3 sun = normalize(float3(-1, 1, -1)); + + float3 surfaceColor = cook_torrance(normalize(input.normal), viewDir, sun, 0.1f, 1.0f, float3(1,1,1), diffuseColor.rgb); + return float4(surfaceColor + ambient * diffuseColor, 1); +} \ No newline at end of file diff --git a/Assets/Shaders/default.fx b/Assets/Shaders/default.fx new file mode 100644 index 0000000..d9007ad --- /dev/null +++ b/Assets/Shaders/default.fx @@ -0,0 +1,64 @@ +struct VS_INPUT +{ + float4 vPosition : POSITION; + float3 normal : NORMAL; + float2 uv0 : UV0; + float2 uv1 : UV1; +}; + +struct VS_OUTPUT { + float4 vPosition : SV_POSITION; + float3 normal : TEXCOORD0; + float2 uv0 : TEXCOORD1; + float2 uv1 : TEXCOORD2; + float3 worldPos : TEXCOORD3; + float3 viewPos : TEXCOORD4; +}; + +cbuffer TestBuffer : register(b3) { + float4x4 mWorld; + float4x4 mView; + float4x4 mProjection; + float4 cameraWorldPos; + float4 _DiffuseColor; +} + +Texture2D diffuse : register(t0); +Texture2D tex2 : register(t1); +SamplerState MeshTextureSampler; + + + +VS_OUTPUT main_vs(VS_INPUT v){ + VS_OUTPUT o; + + + float4x4 wv = mul(mView, mWorld); + float4x4 wvp = mul(mul(mProjection, mView), mWorld); + + o.vPosition = mul(wvp, float4(v.vPosition.xyz,1)); + + o.normal = mul((float3x3)mWorld, v.normal); + o.uv0 = v.uv0; + o.uv1 = v.uv1; + o.worldPos = mul((float3x3)mWorld, v.vPosition.xyz); + o.viewPos = mul(wv, float4(v.vPosition.xyz, 1)); + return o; +} + +#include "lighting/cook_torrance_term.inc" + +float4 main_ps(VS_OUTPUT input) : SV_Target +{ + float3 ambient = float3(0.3f, 0.3f, 0.4f); + + float4 diffuseColor = _DiffuseColor * diffuse.Sample(MeshTextureSampler, input.uv0); + float3 worldPos = input.worldPos; + float3 camPos = cameraWorldPos.xyz; + float3 viewDir = normalize(camPos - worldPos); + float3 sun = normalize(float3(-1, 1, -1)); + + float3 surfaceColor = cook_torrance(normalize(input.normal), viewDir, sun, 0.7f, 0.1f, diffuseColor.rgb, diffuseColor.rgb); + + return float4(surfaceColor + ambient * diffuseColor, 1); +} \ No newline at end of file diff --git a/Assets/Shaders/gizmos.fx b/Assets/Shaders/gizmos.fx new file mode 100644 index 0000000..5c63d54 --- /dev/null +++ b/Assets/Shaders/gizmos.fx @@ -0,0 +1,32 @@ +struct VS_INPUT +{ + float4 position : POSITION; + float4 color : COLOR; +}; + +struct VS_OUTPUT { + float4 position : SV_POSITION; + float4 color : TEXCOORD0; +}; + +cbuffer TestBuffer : register(b3) { + float4x4 mWorld; + float4x4 mView; + float4x4 mProjection; + float alphaMul; +} + +VS_OUTPUT main_vs(VS_INPUT v) { + VS_OUTPUT o; + + float4x4 wvp = mul(mul(mProjection, mView), mWorld); + o.position = mul(wvp, float4(v.position.xyz, 1)); + o.color = v.color; + return o; +} + +float4 main_ps(VS_OUTPUT input) : SV_Target{ + float4 color = input.color; + color *= alphaMul; + return color; +} \ No newline at end of file diff --git a/Assets/Shaders/lighting/cook_torrance_term.inc b/Assets/Shaders/lighting/cook_torrance_term.inc new file mode 100644 index 0000000..460277d --- /dev/null +++ b/Assets/Shaders/lighting/cook_torrance_term.inc @@ -0,0 +1,70 @@ +#ifndef COOK_TORRANCE_TERM +#define COOK_TORRANCE_TERM + +float4 cook_torrance( + in float3 normal, + in float3 viewer, + in float3 light, float roughness_value, float ref_at_norm_incidence, float3 cSpecular, float3 cDiffuse) +{ + // Compute any aliases and intermediary values + // ------------------------------------------- + float3 half_vector = normalize( light + viewer ); + float NdotL = saturate( dot( normal, light ) ); + float NdotH = max( dot( normal, half_vector ) , 1.0e-7); + float NdotV = saturate( dot( normal, viewer ) ); + float VdotH = saturate( dot( viewer, half_vector ) ); + float r_sq = roughness_value * roughness_value; + + + + // Evaluate the geometric term + // -------------------------------- + float geo_numerator = 2.0f * NdotH; + float geo_denominator = VdotH; + + float geo_b = (geo_numerator * NdotV ) / geo_denominator; + float geo_c = (geo_numerator * NdotL ) / geo_denominator; + float geo = min( 1.0f, min( geo_b, geo_c ) ); + + + + // Now evaluate the roughness term + // ------------------------------- + float roughness; + float roughness_a = 1.0f / ( 4.0f * r_sq * pow( NdotH, 4 ) ); + float roughness_b = NdotH * NdotH - 1.0f; + float roughness_c = r_sq * NdotH * NdotH; + roughness = roughness_a * exp( roughness_b / roughness_c ); + + + // Next evaluate the Fresnel value + // ------------------------------- + float fresnel = pow( 1.0f - VdotH, 5.0f ); + fresnel *= ( 1.0f - ref_at_norm_incidence ); + fresnel += ref_at_norm_incidence; + + + + // Put all the terms together to compute + // the specular term in the equation + // ------------------------------------- + float3 Rs_numerator = ( fresnel * geo * roughness ); + float Rs_denominator = max(1.0e-7, NdotV * NdotL); + float3 Rs = Rs_numerator/ Rs_denominator; + + + + // Put all the parts together to generate + // the final colour + // -------------------------------------- + + + Rs = max(0, Rs); + float3 final = max(0.0f, NdotL) *cDiffuse + (1 * Rs ); + + // Return the result + // ----------------- + return float4( final, 1.0f ); +} + +#endif \ No newline at end of file diff --git a/Assets/Shaders/red_shader.fx b/Assets/Shaders/red_shader.fx new file mode 100644 index 0000000..d2ab3fb --- /dev/null +++ b/Assets/Shaders/red_shader.fx @@ -0,0 +1,47 @@ +struct VS_INPUT +{ + float4 vPosition : POSITION; + float3 normal : NORMAL; + float2 uv0 : UV0; + float2 uv1 : UV1; +}; + +struct VS_OUTPUT { + float4 vPosition : SV_POSITION; + float3 normal : TEXCOORD0; + float2 uv0 : TEXCOORD1; + float2 uv1 : TEXCOORD2; +}; + +cbuffer TestBuffer : register(b3) { + float4x4 mWorld; + float4x4 mView; + float4x4 mProjection; +} + +Texture2D tex : register(t0); +Texture2D tex2 : register(t1); +SamplerState MeshTextureSampler; + +VS_OUTPUT main_vs(VS_INPUT v) { + VS_OUTPUT o; + + float4x4 wvp = mul(mul(mProjection, mView), mWorld); + + o.vPosition = mul(wvp, float4(v.vPosition.xyz, 1)); + + o.normal = mul((float3x3)mWorld, v.normal); + o.uv0 = v.uv0; + o.uv1 = v.uv1; + return o; +} + + +float4 main_ps(VS_OUTPUT input) : SV_Target +{ + float3 sun = normalize(float3(-1,1,-1)); + float lit = dot(sun, input.normal); + float3 diffuse = float3(1, 0, 0); + + return float4(diffuse * lit, 1); +} \ No newline at end of file diff --git a/Assets/Shaders/shader.fx b/Assets/Shaders/shader.fx new file mode 100644 index 0000000..99c0eb7 --- /dev/null +++ b/Assets/Shaders/shader.fx @@ -0,0 +1,60 @@ +struct VS_INPUT +{ + float4 vPosition : POSITION; + float3 normal : NORMAL; + float2 uv0 : UV0; + float2 uv1 : UV1; +}; + +struct VS_OUTPUT { + float4 vPosition : SV_POSITION; + float3 normal : TEXCOORD0; + float2 uv0 : TEXCOORD1; + float2 uv1 : TEXCOORD2; + float3 worldPos : TEXCOORD3; + float3 viewPos : TEXCOORD4; +}; + +cbuffer TestBuffer : register(b3) { + float4x4 mWorld; + float4x4 mView; + float4x4 mProjection; + float4 cameraWorldPos; +} + +Texture2D diffuse : register(t0); +SamplerState MeshTextureSampler : register(s0); + + + +VS_OUTPUT main_vs(VS_INPUT v){ + VS_OUTPUT o; + float4x4 wv = mul(mView, mWorld); + float4x4 wvp = mul(mul(mProjection, mView), mWorld); + + o.vPosition = mul(wvp, float4(v.vPosition.xyz,1)); + o.normal = mul((float3x3)mWorld, v.normal); + o.uv0 = v.uv0; + o.uv1 = v.uv1; + o.worldPos = mul((float3x3)mWorld, v.vPosition.xyz); + o.viewPos = mul(wv, float4(v.vPosition.xyz, 1)); + return o; +} + +#include "lighting/cook_torrance_term.inc" + +float4 main_ps(VS_OUTPUT input) : SV_Target +{ + float3 ambient = float3(0.3f, 0.3f, 0.4f); + + float4 diffuseColor = diffuse.Sample(MeshTextureSampler, input.uv0); + return diffuseColor; + float3 worldPos = input.worldPos; + float3 camPos = cameraWorldPos.xyz; + float3 viewDir = normalize(camPos - worldPos); + float3 sun = normalize(float3(-1, 1, -1)); + + float3 surfaceColor = cook_torrance(normalize(input.normal), viewDir, sun, 0.7f, 0.1f, diffuseColor.rgb, diffuseColor.rgb); + + return float4(surfaceColor + ambient * diffuseColor, 1); +} \ No newline at end of file diff --git a/Assets/Shaders/test0.hlsl b/Assets/Shaders/test0.hlsl new file mode 100644 index 0000000..e69de29 diff --git a/Assets/Shaders/vk.fx.hlsl b/Assets/Shaders/vk.fx.hlsl new file mode 100644 index 0000000..2100e30 --- /dev/null +++ b/Assets/Shaders/vk.fx.hlsl @@ -0,0 +1,50 @@ +#pragma shader_language HLSL + +#include + +struct VS_INPUT +{ + float4 inPosition : POSITION; + float3 inColor : NORMAL; + float2 uv0 : UV0; + float2 uv1 : UV1; +}; + +struct VS_OUTPUT { + float4 vPosition : SV_POSITION; + float3 color; +}; + + +#ifdef SHADER_STAGE_VERTEX +cbuffer CameraData : register(b0, space0) { + float4x4 view; + float4x4 proj; + float4x4 viewproj; +} + + +struct Test { + float3 getColor() { + return float3(1,0,0); + } +}; + +VS_OUTPUT main(VS_INPUT v, uint VertexIndex : SV_VertexID) { + VS_OUTPUT o; + Test t; + float4x4 vp = mul(view, proj); + o.vPosition = mul(float4(v.inPosition.xyz, 1), vp); + o.color = v.inColor; + return o; +} +#endif + + +#ifdef SHADER_STAGE_FRAGMENT +float4 main(VS_OUTPUT input) : SV_Target +{ + return float4(input.color, 1.0f); +} + +#endif \ No newline at end of file diff --git a/Assets/Textures/1_store.dds b/Assets/Textures/1_store.dds new file mode 100644 index 0000000..93d630a Binary files /dev/null and b/Assets/Textures/1_store.dds differ diff --git a/CMakeLists.txt b/CMakeLists.txt new file mode 100644 index 0000000..fdd5307 --- /dev/null +++ b/CMakeLists.txt @@ -0,0 +1,86 @@ +cmake_minimum_required(VERSION 3.21) + +project(LEngine.Editor LANGUAGES C CXX) +set(CMAKE_CXX_STANDARD 17) +set(CMAKE_C_STANDARD 11) + +set(VulkanSdkDir "${CMAKE_CURRENT_LIST_DIR}/../../VulkanSDK/1.3.231.1") + +#C:/VulkanSDK/1.3.231.1 + +add_executable(LEngine.Editor) + +add_subdirectory(Dependencies/LFramework) +add_subdirectory(Dependencies/LEngine) +add_subdirectory(Dependencies/LMath) +add_subdirectory(Dependencies/NativeLINQ) + + + +target_include_directories(${PROJECT_NAME} +PRIVATE + Src +) +add_subdirectory(Src) + + + +target_compile_definitions(LEngine.Editor +PRIVATE + _SILENCE_CXX17_CODECVT_HEADER_DEPRECATION_WARNING + LF_INPUT + LF_TERMINAL_STREAM_COUT + + ENABLE_HLSL +) + +target_link_libraries(LEngine.Editor +PUBLIC + LEngine + LMath + NativeLINQ + LFramework + + glslangd + shadercd + HLSLd + SPIRVd + MachineIndependentd + OGLCompilerd + OSDependentd + GenericCodeGend + shadercd + shaderc_utild + shaderc_combinedd +) + + +target_link_directories(LEngine.Editor +PUBLIC + "${VulkanSdkDir}/Lib" +) + +target_include_directories(LEngine.Editor +PUBLIC + Src + "${VulkanSdkDir}/Source/SPIRV-Reflect" + "${VulkanSdkDir}/Include" +) + +target_include_directories(LEngine +INTERFACE + Src + "${VulkanSdkDir}/Source/SPIRV-Reflect" + "${VulkanSdkDir}/Include" +) + +target_sources(LEngine.Editor +PUBLIC + "${VulkanSdkDir}/Include/vulkan/vulkan.h" + "${VulkanSdkDir}/Include/vulkan/vk_platform.h" + "${VulkanSdkDir}/Include/vulkan/vulkan_core.h" + "${VulkanSdkDir}/Source/SPIRV-Reflect/spirv_reflect.h" + "${VulkanSdkDir}/Source/SPIRV-Reflect/spirv_reflect.c" +) + + diff --git a/LICENSE b/LICENSE new file mode 100644 index 0000000..1ee5451 --- /dev/null +++ b/LICENSE @@ -0,0 +1,21 @@ +MIT License + +Copyright (c) 2022 Sergey Serb + +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. diff --git a/Src/BoundsView.h b/Src/BoundsView.h new file mode 100644 index 0000000..9c5c3bf --- /dev/null +++ b/Src/BoundsView.h @@ -0,0 +1,11 @@ +#pragma once + +#include + +LOBJECT(BoundsView, Component) +public: + void tick(float deltaTime) override { + LEngine::Instance()->GetActiveScene()->GetGizmos().SetMatrix(transform()->GetGlobalTransform()); + LEngine::Instance()->GetActiveScene()->GetGizmos().DrawBounds(gameObject->GetComponent()->GetMesh()->GetBounds()); + } +}; diff --git a/Src/CMakeLists.txt b/Src/CMakeLists.txt new file mode 100644 index 0000000..f4978bd --- /dev/null +++ b/Src/CMakeLists.txt @@ -0,0 +1,9 @@ +target_sources(${PROJECT_NAME} +PRIVATE + BoundsView.h + CMakeLists.txt + FreeCameraController.h + GameEditor.cpp + GameEditor.h + LFrameworkConfig.h +) \ No newline at end of file diff --git a/Src/FreeCameraController.h b/Src/FreeCameraController.h new file mode 100644 index 0000000..dfa7e67 --- /dev/null +++ b/Src/FreeCameraController.h @@ -0,0 +1,69 @@ +#pragma once + +#include +#include +#include +#include +#include + +LOBJECT(FreeCameraController, Component) +public: + float mouse_speed; + float move_speed = 3.0f; + static constexpr float pi = 3.14159265358979f; + + FreeCameraController() : mouse_speed(0.01f){ + _angle_x = _angle_y = 0.0f; + } + + virtual void tick(float deltaTime) override { + auto mice = Input::Instance()->mice(); + auto mouse = mice[0]; + _angle_x += mouse_speed * mouse->GetDx(); + _angle_y += mouse_speed * mouse->GetDy(); + + _angle_y = lm::clamp(_angle_y, -pi / 2.0f, pi / 2.0f); + + auto rv = lm::Quaternion_f::angleAxis(_angle_y, lm::float3(1.0f, 0.0f, 0.0f)); + auto rh = lm::Quaternion_f::angleAxis(_angle_x, lm::float3(0.0f, 1.0f, 0.0f)); + + /* if (mouse->GetDx() != 0) { + std::cout << "Mouse DX: " << mouse->GetDx() << std::endl; + } + if (mouse->GetDy() != 0) { + std::cout << "Mouse DY: " << mouse->GetDy() << std::endl; + }*/ + + gameObject->transform->SetLocalRotation(lm::mul(rh, rv)); + + + + auto keyboards = Input::Instance()->keyboards(); + auto keyboard = keyboards[2]; + + + + auto forward = gameObject->transform->forward(); + //std::cout << "Forward X=" << forward.x() << " Y=" << forward.y() << " Z=" << forward.z() << std::endl; + + if(keyboard->GetKeyState(0x57)){ + + gameObject->transform->SetLocalPosition(gameObject->transform->GetLocalPosition() + gameObject->transform->forward() * (deltaTime * move_speed)); + } + + if (keyboard->GetKeyState(0x53)) { + gameObject->transform->SetLocalPosition(gameObject->transform->GetLocalPosition() - gameObject->transform->forward() * (deltaTime * move_speed)); + } + + if (keyboard->GetKeyState(0x41)) { + gameObject->transform->SetLocalPosition(gameObject->transform->GetLocalPosition() - gameObject->transform->right() * (deltaTime * move_speed)); + } + + if (keyboard->GetKeyState(0x44)) { + gameObject->transform->SetLocalPosition(gameObject->transform->GetLocalPosition() + gameObject->transform->right() * (deltaTime * move_speed)); + } + } +private: + float _angle_x; + float _angle_y; +}; diff --git a/Src/GameEditor.cpp b/Src/GameEditor.cpp new file mode 100644 index 0000000..63cb184 Binary files /dev/null and b/Src/GameEditor.cpp differ diff --git a/Src/GameEditor.h b/Src/GameEditor.h new file mode 100644 index 0000000..6f70f09 --- /dev/null +++ b/Src/GameEditor.h @@ -0,0 +1 @@ +#pragma once diff --git a/Src/LFrameworkConfig.h b/Src/LFrameworkConfig.h new file mode 100644 index 0000000..7ae1960 --- /dev/null +++ b/Src/LFrameworkConfig.h @@ -0,0 +1,5 @@ +#pragma once + +#ifndef LF_INPUT +#define LF_INPUT +#endif \ No newline at end of file