diff --git a/Assets/compiled/Debug.vert.dxil b/Assets/compiled/Debug.vert.dxil index aab61ce..cb15711 100644 Binary files a/Assets/compiled/Debug.vert.dxil and b/Assets/compiled/Debug.vert.dxil differ diff --git a/Assets/compiled/ImGui.frag.dxil b/Assets/compiled/ImGui.frag.dxil index 54a535c..3f92c62 100644 Binary files a/Assets/compiled/ImGui.frag.dxil and b/Assets/compiled/ImGui.frag.dxil differ diff --git a/Assets/compiled/ImGui.vert.dxil b/Assets/compiled/ImGui.vert.dxil index fc0ecc4..91ab909 100644 Binary files a/Assets/compiled/ImGui.vert.dxil and b/Assets/compiled/ImGui.vert.dxil differ diff --git a/Assets/compiled/Skybox.vert.dxil b/Assets/compiled/Skybox.vert.dxil index 545cc88..71eb37e 100644 Binary files a/Assets/compiled/Skybox.vert.dxil and b/Assets/compiled/Skybox.vert.dxil differ diff --git a/Assets/compiled/SolidColor.frag.dxil b/Assets/compiled/SolidColor.frag.dxil index a31cc50..72ba1d9 100644 Binary files a/Assets/compiled/SolidColor.frag.dxil and b/Assets/compiled/SolidColor.frag.dxil differ diff --git a/Assets/compiled/Triangle.vert.dxil b/Assets/compiled/Triangle.vert.dxil index 98e2f65..5c62082 100644 Binary files a/Assets/compiled/Triangle.vert.dxil and b/Assets/compiled/Triangle.vert.dxil differ diff --git a/Assets/source/RootConstants.hlsl b/Assets/source/RootConstants.hlsl index d23194d..ccaccd5 100644 --- a/Assets/source/RootConstants.hlsl +++ b/Assets/source/RootConstants.hlsl @@ -21,19 +21,21 @@ cbuffer RootConstants : register(b0, space0) uint TransformsBufferIndex; uint BufferIndex; uint TextureIndex; - uint VertexOffset; // Base vertex for indexed drawing with bindless buffers - uint _Padding; // Padding for alignment - float2 Scale; // 2D scale factor - float2 Translate; // 2D translation - float2 _Padding2; // Explicit padding to align LightDirection to 16 bytes - - float3 GlobalLightDirection; // Normalized, world-space - float GlobalLightPad; - float3 GlobalLightColor; - float GlobalAmbientIntensity; - + uint VertexOffset; // Base vertex for indexed drawing with bindless buffers uint LightBufferIndex; uint ActiveLightCount; + float GlobalAmbientIntensity; + + float3 GlobalLightDirection; // Normalized, world-space + uint _Pad1; + + float3 GlobalLightColor; + uint _Pad2; + + float2 Scale; // 2D scale factor + float2 Translate; // 2D translation + + float4 MeshAlbedo; }; diff --git a/Assets/source/Triangle.vert.hlsl b/Assets/source/Triangle.vert.hlsl index 3984130..8864288 100644 --- a/Assets/source/Triangle.vert.hlsl +++ b/Assets/source/Triangle.vert.hlsl @@ -27,7 +27,7 @@ Output main(uint vertexIndex : SV_VertexID) float4 worldPos = mul(Model, float4(pos, 1.0f)); output.Position = mul(ViewProjection, worldPos); - output.Color = col; + output.Color = col * MeshAlbedo; output.WorldPosition = worldPos.xyz; float3 worldNormal = mul((float3x3)Model, normal); diff --git a/Game/game.cpp b/Game/game.cpp index 24abd02..146d784 100644 --- a/Game/game.cpp +++ b/Game/game.cpp @@ -99,6 +99,12 @@ extern "C" JULIET_API void __cdecl GameUpdate(Juliet::GameData* params, [[maybe_ printf("Door is %s\n", door->IsOpened ? "Opened" : "Closed"); printf("Rock has %d health points\n", rock->Health); + + // Summer at 2pm lighting + Vector3 sunDirection = { -0.2f, -0.9f, -0.3f }; + Vector3 sunColor = { 1.0f, 0.95f, 0.85f }; + float ambientIntensity = 0.4f; + SetGlobalLight(sunDirection, sunColor, ambientIntensity); } GameMode previousFrameMode = gGameState->Mode; diff --git a/Juliet/include/Graphics/MeshRenderer.h b/Juliet/include/Graphics/MeshRenderer.h index fb845c6..d949182 100644 --- a/Juliet/include/Graphics/MeshRenderer.h +++ b/Juliet/include/Graphics/MeshRenderer.h @@ -41,6 +41,7 @@ namespace Juliet JULIET_API void SetPointLightRadius(LightID id, float radius); JULIET_API void SetPointLightIntensity(LightID id, float intensity); JULIET_API void ClearPointLights(); + JULIET_API void SetGlobalLight(const Vector3& direction, const Vector3& color, float ambientIntensity); // Assets & Instances [[nodiscard]] JULIET_API MeshAssetID GetOrCreateMeshAsset(String name); diff --git a/Juliet/include/Graphics/PushConstants.h b/Juliet/include/Graphics/PushConstants.h index 620c0e7..1739fe8 100644 --- a/Juliet/include/Graphics/PushConstants.h +++ b/Juliet/include/Graphics/PushConstants.h @@ -14,17 +14,19 @@ namespace Juliet uint32 BufferIndex; uint32 TextureIndex; uint32 VertexOffset; - uint32 Padding; + uint32 LightBufferIndex; + uint32 ActiveLightCount; + float GlobalAmbientIntensity; + + Vector3 GlobalLightDirection; + uint32 Pad1; + + Vector3 GlobalLightColor; + uint32 Pad2; + float Scale[2]; float Translate[2]; - float Padding2[2]; - Vector3 GlobalLightDirection; - float GlobalLightPad; - Vector3 GlobalLightColor; - float GlobalAmbientIntensity; - - uint32 LightBufferIndex; - uint32 ActiveLightCount; + Vector4 MeshAlbedo; }; } // namespace Juliet diff --git a/Juliet/src/Graphics/DebugDisplayRenderer.cpp b/Juliet/src/Graphics/DebugDisplayRenderer.cpp index 865ad1d..147bce2 100644 --- a/Juliet/src/Graphics/DebugDisplayRenderer.cpp +++ b/Juliet/src/Graphics/DebugDisplayRenderer.cpp @@ -310,13 +310,11 @@ namespace Juliet pushData.BufferIndex = bufferIndex; pushData.TextureIndex = 0; pushData.VertexOffset = 0; // Depth-tested vertices start at 0 - pushData.Padding = 0; pushData.Scale[0] = 1.0f; pushData.Scale[1] = 1.0f; pushData.Translate[0] = 0.0f; pushData.Translate[1] = 0.0f; // Dummy light data as we don't light debug primitives pushData.GlobalLightDirection = {0,0,-1}; - pushData.GlobalLightPad = 0; pushData.GlobalLightColor = {1,1,1}; pushData.GlobalAmbientIntensity = 1.0f; @@ -338,13 +336,11 @@ namespace Juliet pushData.BufferIndex = bufferIndex; pushData.TextureIndex = 0; pushData.VertexOffset = kMaxDebugVertices / 2; // Overlay vertices start at half - pushData.Padding = 0; pushData.Scale[0] = 1.0f; pushData.Scale[1] = 1.0f; pushData.Translate[0] = 0.0f; pushData.Translate[1] = 0.0f; // Dummy light data as we don't light debug primitives pushData.GlobalLightDirection = {0,0,-1}; - pushData.GlobalLightPad = 0; pushData.GlobalLightColor = {1,1,1}; pushData.GlobalAmbientIntensity = 1.0f; diff --git a/Juliet/src/Graphics/MeshRenderer.cpp b/Juliet/src/Graphics/MeshRenderer.cpp index 8863ec7..c0ca3dc 100644 --- a/Juliet/src/Graphics/MeshRenderer.cpp +++ b/Juliet/src/Graphics/MeshRenderer.cpp @@ -33,6 +33,10 @@ namespace Juliet PointLight* MappedLights = nullptr; Matrix* MappedTransforms = nullptr; + + Vector3 GlobalLightDirection = { 0.0f, -1.0f, 0.0f }; + Vector3 GlobalLightColor = { 0.0f, 0.0f, 0.0f }; + float GlobalAmbientIntensity = 0.0f; }; MeshRendererState g_MeshRenderer; @@ -59,6 +63,10 @@ namespace Juliet CubePrimitiveMeshAssetID = CreateCubePrimitive(); QuadPrimitiveMeshAssetID = CreateQuadPrimitive(); // SpherePrimitiveMeshAssetID = CreateSpherePrimitive(); // Will implement later + + // Create default material asset (ID = 0) + MaterialAsset defaultMaterial = {}; + g_MeshRenderer.MaterialAssets.PushBack(defaultMaterial); } bool InitializeMeshRendererGraphics(NonNullPtr device, NonNullPtr window) @@ -282,9 +290,9 @@ namespace Juliet pushData.LightBufferIndex = lightDescriptorIndex; pushData.TransformsBufferIndex = transformsDescriptorIndex; pushData.ActiveLightCount = static_cast(g_MeshRenderer.PointLights.Count); - pushData.GlobalLightDirection = { 0.0f, -1.0f, 0.0f }; - pushData.GlobalLightColor = { 0.0f, 0.0f, 0.0f }; - pushData.GlobalAmbientIntensity = 0.0f; + pushData.GlobalLightDirection = g_MeshRenderer.GlobalLightDirection; + pushData.GlobalLightColor = g_MeshRenderer.GlobalLightColor; + pushData.GlobalAmbientIntensity = g_MeshRenderer.GlobalAmbientIntensity; SetIndexBuffer(cmdList, g_MeshRenderer.IndexBuffer, IndexFormat::UInt16, g_MeshRenderer.Indices.Count, 0); @@ -297,18 +305,16 @@ namespace Juliet } MeshAsset& meshAsset = g_MeshRenderer.MeshAssets.Data[instance.MeshAsset]; - // If we used MaterialAsset, we would pass properties here. - // For now, the shader doesn't read material color, or maybe we can pass it if PushData supports it. - // pushData has GlobalLightColor, but no individual mesh color yet. We can just keep it simple. + MaterialAsset& materialAsset = g_MeshRenderer.MaterialAssets.Data[instance.MaterialAsset]; pushData.MeshIndex = meshIndex; pushData.TextureIndex = 0; // Would be instance.MaterialAsset.BaseColorTexture later pushData.VertexOffset = static_cast(meshAsset.VertexOffset); - pushData.Padding = 0; pushData.Scale[0] = 1.0f; pushData.Scale[1] = 1.0f; pushData.Translate[0] = 0.0f; pushData.Translate[1] = 0.0f; + pushData.MeshAlbedo = materialAsset.AlbedoColor; SetPushConstants(cmdList, ShaderStage::Vertex, 0, sizeof(pushData) / 4, &pushData); DrawIndexedPrimitives(pass, static_cast(meshAsset.IndexCount), 1, static_cast(meshAsset.IndexOffset), static_cast(meshAsset.VertexOffset), 0); @@ -373,6 +379,13 @@ namespace Juliet g_MeshRenderer.PointLights.Clear(); } + void SetGlobalLight(const Vector3& direction, const Vector3& color, float ambientIntensity) + { + g_MeshRenderer.GlobalLightDirection = direction; + g_MeshRenderer.GlobalLightColor = color; + g_MeshRenderer.GlobalAmbientIntensity = ambientIntensity; + } + MeshAssetID GetCubePrimitiveMeshAssetID() { Assert(CubePrimitiveMeshAssetID != static_cast(-1)); diff --git a/misc/build.bat b/misc/build.bat index 0a61764..b206acc 100644 --- a/misc/build.bat +++ b/misc/build.bat @@ -175,7 +175,7 @@ if /i "!CFG!"=="Debug" ( set IMGUI_UNITY_SRCS= ) -set COMMON_LIBS=kernel32.lib user32.lib gdi32.lib dxguid.lib Ws2_32.lib dxgi.lib imm32.lib dwmapi.lib d3dcompiler.lib shell32.lib winhttp.lib delayimp.lib +set COMMON_LIBS=kernel32.lib user32.lib gdi32.lib dxguid.lib Ws2_32.lib dxgi.lib imm32.lib dwmapi.lib d3dcompiler.lib dxcompiler.lib shell32.lib winhttp.lib delayimp.lib if defined IMGUI_UNITY_SRCS ( echo STEP Compiling ImGui Shared Objs [!CFG!]>>"!PLAN_FILE!" diff --git a/misc/recompile_shaders.bat b/misc/recompile_shaders.bat index 123e49d..dbb96c1 100644 --- a/misc/recompile_shaders.bat +++ b/misc/recompile_shaders.bat @@ -1,7 +1,13 @@ @echo off setlocal enabledelayedexpansion -set TARGET=x64-Release +set TARGET=x64-Debug +if not exist "bin\%TARGET%\JulietShaderCompiler.exe" ( + set TARGET=x64-Release +) +if not exist "bin\%TARGET%\JulietShaderCompiler.exe" ( + set TARGET=x64-Profile +) REM Chemin relatif vers JulietShaderCompiler.exe set COMPILER_PATH=bin\%TARGET%\JulietShaderCompiler.exe