Added way to set global light from game.
+ Some clean up in the mesh renderer
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
@@ -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;
|
||||
};
|
||||
|
||||
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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;
|
||||
|
||||
@@ -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);
|
||||
|
||||
@@ -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
|
||||
|
||||
@@ -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;
|
||||
|
||||
|
||||
@@ -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<GraphicsDevice> device, NonNullPtr<Window> window)
|
||||
@@ -282,9 +290,9 @@ namespace Juliet
|
||||
pushData.LightBufferIndex = lightDescriptorIndex;
|
||||
pushData.TransformsBufferIndex = transformsDescriptorIndex;
|
||||
pushData.ActiveLightCount = static_cast<uint32>(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<uint32>(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<uint32>(meshAsset.IndexCount), 1,
|
||||
static_cast<uint32>(meshAsset.IndexOffset), static_cast<uint32>(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<MeshAssetID>(-1));
|
||||
|
||||
+1
-1
@@ -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!"
|
||||
|
||||
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user