diff --git a/BeefSpace.toml b/BeefSpace.toml index fb2c48a..9225ad3 100644 --- a/BeefSpace.toml +++ b/BeefSpace.toml @@ -2,4 +2,4 @@ FileVersion = 1 Projects = {Sandbox = {Path = "Sandbox"}, GlitchyEngine = {Path = "GlitchyEngine"}, GlitchLog = {Path = "GlitchLog"}, DirectX = {Path = "GlitchyEngine/vendor/directx/DirectX"}, DirectXTK = {Path = "GlitchyEngine/vendor/DirectXTK/DirectXTK-beef"}, LodePng = {Path = "vendor/lodepng-beef/lodepng-beef"}, FreeType = {Path = "GlitchyEngine/vendor/freetype"}, cgltf-beef = {Path = "GlitchyEngine/vendor/gltf/cgltf-beef"}, GlitchyEditor = {Path = "GlitchyEditor"}, msdfgen-beef = {Path = "GlitchyEngine/vendor/msdfgen/msdfgen-beef"}, ImGui = {Path = "GlitchyEngine/vendor/imgui/ImGui"}, ImGuiImplDX11 = {Path = "GlitchyEngine/vendor/imgui/ImGuiImplDX11"}, ImGuiImplWin32 = {Path = "GlitchyEngine/vendor/imgui/ImGuiImplWin32"}, ImGuizmo = {Path = "GlitchyEngine/vendor/imgui/ImGuizmo"}} [Workspace] -StartupProject = "Sandbox" +StartupProject = "GlitchyEditor" diff --git a/GlitchyEditor/content/Shaders/circlebatch.hlsl b/GlitchyEditor/content/Shaders/circlebatch.hlsl new file mode 100644 index 0000000..d05cae5 --- /dev/null +++ b/GlitchyEditor/content/Shaders/circlebatch.hlsl @@ -0,0 +1,62 @@ +Texture2D Texture : register(t0); +SamplerState Sampler : register(s0); + +cbuffer Constants : register(b0) +{ + float4x4 ViewProjection; +}; + +struct VS_Input +{ + float2 Position : POSITION; + float2 Texcoord : TEXCOORD0; + float4x4 Transform : TRANSFORM; + float4 Color : COLOR; + float4 UVTransform : TEXCOORD1; + float InnerRadius : TEXCOORD2; +}; + +struct PS_Input +{ + float4 Position : SV_Position; + float2 RawPos : TEXCOORD0; + float2 Texcoord : TEXCOORD1; + float4 Color : COLOR; + float InnerRadius : TEXCOORD2; +}; + +PS_Input VS(VS_Input input) +{ + PS_Input output; + + output.Position = mul(ViewProjection, mul(input.Transform, float4(input.Position, 0.0f, 1.0f))); + output.Texcoord = input.UVTransform.xy + input.UVTransform.zw * input.Texcoord; + output.RawPos = input.Position; + output.Color = input.Color; + output.InnerRadius = input.InnerRadius; + + return output; +} + +float4 PS(PS_Input input) : SV_Target0 +{ + float2 uv = input.RawPos * 2; + + float distance = 1.0f - length(uv); + + // Smoothing edges based on derivative (not sure if RawPos is the best value for this) + float f = fwidth(input.RawPos.x) + fwidth(input.RawPos.y); + + float amount = smoothstep(0.0f, f, distance); + amount *= smoothstep(input.InnerRadius + f, input.InnerRadius, distance); + + // Discard invisible pixels + clip(amount - 0.5f); + + float4 color = Texture.Sample(Sampler, input.Texcoord) * input.Color; + color.a *= amount; + + return color; +} + +#effect[VS=VS, PS=PS] \ No newline at end of file diff --git a/GlitchyEditor/content/Shaders/msdfShader.hlsl b/GlitchyEditor/content/Shaders/msdfShader.hlsl new file mode 100644 index 0000000..015213e --- /dev/null +++ b/GlitchyEditor/content/Shaders/msdfShader.hlsl @@ -0,0 +1,93 @@ +Texture2D Texture : register(t0); +SamplerState Sampler : register(s0); + +cbuffer Constants +{ + float4x4 ViewProjection; + float2 UnitRange; + float screenPixelRange = 2; +} + +struct VS_Input +{ + float2 Position : POSITION; + float2 Texcoord : TEXCOORD0; + float4x4 Tranform : TRANSFORM; + float4 Color : COLOR; + float4 UVTransform : TEXCOORD1; +}; + +struct PS_Input +{ + float4 Position : SV_Position; + float2 TexCoord : TEXCOORD0; + float4 Color : COLOR; +}; + +PS_Input VS(VS_Input input) +{ + PS_Input output; + + output.Position = mul(ViewProjection, mul(input.Tranform, float4(input.Position, 0.0f, 1.0f))); + output.TexCoord = input.UVTransform.xy + input.UVTransform.zw * input.Texcoord; + output.Color = input.Color; + + return output; +} + +/* +in vec2 texCoord; +out vec4 color; +uniform sampler2D msdf; +uniform vec4 bgColor; +uniform vec4 fgColor; + +float median(float r, float g, float b) { + return max(min(r, g), min(max(r, g), b)); +} + +void main() { + vec3 msd = texture(msdf, texCoord).rgb; + float sd = median(msd.r, msd.g, msd.b); + float screenPxDistance = screenPxRange()*(sd - 0.5); + float opacity = clamp(screenPxDistance + 0.5, 0.0, 1.0); + color = mix(bgColor, fgColor, opacity); +} +*/ + + +float median(float r, float g, float b) +{ + return max(min(r, g), min(max(r, g), b)); +} + +float ScreenPxRange(float2 texcoord) +{ + float2 screenTexSize = 1.0f / fwidth(texcoord); + return max(0.5f * dot(UnitRange, screenTexSize), 1.0f); +} + +float4 PS(PS_Input input) : SV_Target0 +{ + float3 msd = Texture.Sample(Sampler, input.TexCoord); + float sd = median(msd.r, msd.g, msd.b); + float screenPxDistance = ScreenPxRange(input.TexCoord) * (sd - 0.5); + float opacity = clamp(screenPxDistance + 0.5, 0.0, 1.0); + + return float4(input.Color.rgb, opacity * input.Color.a); +} + +/* +// 2D +float4 PS(PS_Input input) : SV_Target0 +{ + float3 msd = Texture.Sample(Sampler, input.TexCoord).rgb; + float sd = median(msd.r, msd.g, msd.b); + float screenPxDistance = screenPixelRange*(sd - 0.5); + float opacity = clamp(screenPxDistance + 0.5, 0.0, 1.0); + + return float4(input.Color.rgb, opacity * input.Color.a); +} +*/ + +#effect[VS=VS, PS=PS] \ No newline at end of file diff --git a/GlitchyEditor/content/Shaders/render2dShaderInst.hlsl b/GlitchyEditor/content/Shaders/render2dShaderInst.hlsl deleted file mode 100644 index 31b234b..0000000 --- a/GlitchyEditor/content/Shaders/render2dShaderInst.hlsl +++ /dev/null @@ -1,37 +0,0 @@ -Texture2D Texture : register(t0); -SamplerState Sampler : register(s0); - -struct VS_Input -{ - float2 Position : POSITION; - float4x4 Tranform : TRANSFORM; - float4 Color : COLOR; - float4 UVTransform : TEXCOORD; -}; - -struct PS_Input -{ - float4 Position : SV_Position; - float2 TexCoord : TEXCOORD0; - float4 Color : COLOR; -}; - -PS_Input VS(VS_Input input) -{ - PS_Input output; - - output.Position = mul(float4(input.Position, 0.0f, 1.0f), input.Tranform); - output.TexCoord = input.UVTransform.xy + input.UVTransform.zw * input.Position; - output.Color = input.Color; - - return output; -} - -float4 PS(PS_Input input) : SV_Target0 -{ - float4 color = input.Color * Texture.Sample(Sampler, input.TexCoord); - - return color; -} - -#effect[VS=VS, PS=PS] \ No newline at end of file diff --git a/GlitchyEditor/content/Shaders/spritebatch.hlsl b/GlitchyEditor/content/Shaders/spritebatch.hlsl new file mode 100644 index 0000000..be544ec --- /dev/null +++ b/GlitchyEditor/content/Shaders/spritebatch.hlsl @@ -0,0 +1,41 @@ +Texture2D Texture : register(t0); +SamplerState Sampler : register(s0); + +cbuffer Constants : register(b0) +{ + float4x4 ViewProjection; +}; + +struct VS_Input +{ + float2 Position : POSITION; + float2 Texcoord : TEXCOORD0; + float4x4 Transform : TRANSFORM; + float4 Color : COLOR; + float4 UVTransform : TEXCOORD1; +}; + +struct PS_Input +{ + float4 Position : SV_Position; + float2 Texcoord : TEXCOORD; + float4 Color : COLOR; +}; + +PS_Input VS(VS_Input input) +{ + PS_Input output; + + output.Position = mul(ViewProjection, mul(input.Transform, float4(input.Position, 0.0f, 1.0f))); + output.Texcoord = input.UVTransform.xy + input.UVTransform.zw * input.Texcoord; + output.Color = input.Color; + + return output; +} + +float4 PS(PS_Input input) : SV_Target0 +{ + return Texture.Sample(Sampler, input.Texcoord) * input.Color; +} + +#effect[VS=VS, PS=PS] \ No newline at end of file diff --git a/GlitchyEditor/content/Shaders/testShader.hlsl b/GlitchyEditor/content/Shaders/testShader.hlsl deleted file mode 100644 index cf953ea..0000000 --- a/GlitchyEditor/content/Shaders/testShader.hlsl +++ /dev/null @@ -1,84 +0,0 @@ -cbuffer SceneConstants -{ - float4x4 ViewProjection = float4x4(1, 0, 0, 0, - 0, 1, 0, 0, - 0, 0, 1, 0, - 0, 0, 0, 1); -} - -cbuffer ObjectConstants -{ - float4x4 Transform; -} - -cbuffer Constants -{ - float4 BaseColor; - float3 LightDir; -} - -cbuffer SkinningMatrices -{ - matrix SkinningMatrices[255]; - float3x3 InvTransSkinningMatrices[255]; -} - -struct VS_IN -{ - float3 Position : POSITION; - float3 Normal : NORMAL; - uint4 JointIndices : JOINTS_0; - float4 JointWeights : WEIGHTS_0; -}; - -struct PS_IN -{ - float4 Position : SV_POSITION; - float3 Normal : NORMAL; -}; - -PS_IN VS(VS_IN input) -{ - PS_IN output; - - // Unanimated position in modelspace - float4 positionRaw = float4(input.Position, 1); - - // Calculate animated position in modelspace - - float4 position = - mul(SkinningMatrices[input.JointIndices.x], positionRaw) * input.JointWeights.x + - mul(SkinningMatrices[input.JointIndices.y], positionRaw) * input.JointWeights.y + - mul(SkinningMatrices[input.JointIndices.z], positionRaw) * input.JointWeights.z + - mul(SkinningMatrices[input.JointIndices.w], positionRaw) * input.JointWeights.w; - - float3 normal = - mul(InvTransSkinningMatrices[input.JointIndices.x], input.Normal) * input.JointWeights.x + - mul(InvTransSkinningMatrices[input.JointIndices.y], input.Normal) * input.JointWeights.y + - mul(InvTransSkinningMatrices[input.JointIndices.z], input.Normal) * input.JointWeights.z + - mul(InvTransSkinningMatrices[input.JointIndices.w], input.Normal) * input.JointWeights.w; - - //position = saturate(position - 1000) + positionRaw; - - //float4 position = mul(SkinningMatrices[input.JointIndices.x], positionRaw); - - float4 worldPosition = mul(Transform, position); - - output.Position = mul(ViewProjection, worldPosition); - output.Normal = mul((float3x3)Transform, normal); - - return output; -} - -float4 PS(PS_IN input) : SV_TARGET -{ - input.Normal = normalize(input.Normal); - - float shading = dot(LightDir, input.Normal); - //float shading = dot(LightDir, LightDir) + 1; - shading = clamp(shading, 0.0f, 1.0f); - - return BaseColor * shading; -} - -#effect[VS=VS,PS=PS] diff --git a/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf b/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf index 6caadb6..2aa092d 100644 --- a/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf +++ b/GlitchyEditor/src/EditWindows/SceneViewportWindow.bf @@ -83,45 +83,41 @@ namespace GlitchyEditor.EditWindows ImGui.Image(_renderTarget, viewportSize); } + ImGuizmo.SetDrawlist(); + + var topLeft = ImGui.GetWindowPos(); + var cntMin = ImGui.GetWindowContentRegionMin(); + + topLeft.x += cntMin.x; + topLeft.y += cntMin.y; + ImGuizmo.SetRect(topLeft.x, topLeft.y, viewportSize.x, viewportSize.y); + + var view = _camera.View; + var projection = _camera.Projection; + + Matrix mat = .Identity; + ImGuizmo.DrawGrid((.)&view, (.)&projection, (.)&mat, 10); + if(_editor.SelectedEntities.Count > 0) { - ImGuizmo.SetDrawlist(); - - var entity = _editor.SelectedEntities.Back; + var entity = _editor.SelectedEntities.Front; var transformCmp = _editor.World.GetComponent(entity); var transform = transformCmp.LocalTransform; - var view = _camera.View; - var projection = _camera.Projection; + ImGuizmo.SetRect(topLeft.x, topLeft.y, viewportSize.x, viewportSize.y); - var v = ImGui.GetWindowPos(); - var cntMin = ImGui.GetWindowContentRegionMin(); - - v.x += cntMin.x; - v.y += cntMin.y; - - ImGuizmo.SetRect(v.x, v.y, viewportSize.x, viewportSize.y); - - Color c = .(0,0,0,255); - - //ImGuizmo.DrawCubes((.)&view, (.)&projection, (.)&transform, 1); ImGuizmo.Manipulate((.)&view, (.)&projection, .TRANSLATE, .LOCAL, (.)&transform); - Matrix mat = .Identity; - - ImGuizmo.DrawGrid((.)&view, (.)&projection, (.)&mat, 10); - transformCmp.LocalTransform = transform; - //ImGuizmo.ViewManipulate((.)&view, , .TRANSLATE, .LOCAL, (.)&transform); } ImGui.End(); if(oldViewportSize != viewportSize) { - ViewportSizeChangedEvent.Invoke(this, *(Vector2*)&oldViewportSize); + ViewportSizeChangedEvent.Invoke(this, (Vector2)viewportSize); viewPortChanged = true; oldViewportSize = viewportSize; } diff --git a/GlitchyEditor/src/EditorLayer.bf b/GlitchyEditor/src/EditorLayer.bf index 6c83782..af29e0e 100644 --- a/GlitchyEditor/src/EditorLayer.bf +++ b/GlitchyEditor/src/EditorLayer.bf @@ -16,7 +16,6 @@ namespace GlitchyEditor RasterizerState _rasterizerStateClockWise ~ _?.ReleaseRef(); GraphicsContext _context ~ _?.ReleaseRef(); - DepthStencilTarget _swapchainDepthBuffer ~ _?.ReleaseRef(); BlendState _alphaBlendState ~ _?.ReleaseRef(); BlendState _opaqueBlendState ~ _?.ReleaseRef(); @@ -27,7 +26,7 @@ namespace GlitchyEditor PerspectiveCameraController _cameraController ~ delete _; - RenderTarget2D _renderTarget2D ~ _?.ReleaseRef(); + RenderTarget2D _viewportTarget ~ _?.ReleaseRef(); public this() : base("Example") { @@ -42,8 +41,6 @@ namespace GlitchyEditor { _context = Application.Get().Window.Context..AddRef(); - _swapchainDepthBuffer = new DepthStencilTarget(_context.SwapChain.Width, _context.SwapChain.Height); - RasterizerStateDescription rsDesc = .(.Solid, .Back, true); _rasterizerState = new RasterizerState(rsDesc); @@ -55,15 +52,8 @@ namespace GlitchyEditor _alphaBlendState = new BlendState(blendDesc); _opaqueBlendState = new BlendState(.Default); - _renderTarget2D = new RenderTarget2D(RenderTarget2DDescription(.R8G8B8A8_UNorm, 100, 100) {DepthStencilFormat = .D32_Float}); - - SamplerStateDescription desc = .(); - - SamplerState sampler = new SamplerState(desc); - - _renderTarget2D.SamplerState = sampler; - - sampler.ReleaseRef(); + _viewportTarget = new RenderTarget2D(RenderTarget2DDescription(.R8G8B8A8_UNorm, 100, 100) {DepthStencilFormat = .D32_Float}); + _viewportTarget.SamplerState = SamplerStateManager.LinearClamp; } private void InitEcs() @@ -83,8 +73,7 @@ namespace GlitchyEditor _editor = new Editor(_world); _editor.SceneViewportWindow.ViewportSizeChangedEvent.Add(new (s, e) => ViewportSizeChanged(s, e)); - _cameraController = new .(Application.Get().Window.Context.SwapChain.BackbufferViewport.Width / - Application.Get().Window.Context.SwapChain.BackbufferViewport.Height); + _cameraController = new .(_context.SwapChain.AspectRatio); _cameraController.CameraPosition = .(0, 0, -5); _cameraController.TranslationSpeed = 10; @@ -100,12 +89,12 @@ namespace GlitchyEditor TransformSystem.Update(_world); - RenderCommand.Clear(_renderTarget2D, .Color | .Depth, .(0.2f, 0.2f, 0.2f), 1.0f, 0); + RenderCommand.Clear(_viewportTarget, .Color | .Depth, .(0.2f, 0.2f, 0.2f), 1.0f, 0); - _context.SetRenderTarget(_renderTarget2D); - _context.BindRenderTargets(); + RenderCommand.SetRenderTarget(_viewportTarget); + RenderCommand.BindRenderTargets(); - RenderCommand.SetViewport(Viewport(0, 0, _renderTarget2D.Width, _renderTarget2D.Height)); + RenderCommand.SetViewport(Viewport(0, 0, _viewportTarget.Width, _viewportTarget.Height)); RenderCommand.SetBlendState(_opaqueBlendState); @@ -115,12 +104,10 @@ namespace GlitchyEditor Renderer.EndScene(); - RenderCommand.Clear(null, .(0.2f, 0.2f, 0.2f)); - RenderCommand.Clear(_swapchainDepthBuffer, .Depth, 1.0f, 0); + RenderCommand.Clear(null, .Color | .Depth, .(0.2f, 0.2f, 0.2f), 1.0f, 0); - _context.SetRenderTarget(null); - _context.SetDepthStencilTarget(_swapchainDepthBuffer); - _context.BindRenderTargets(); + RenderCommand.SetRenderTarget(null); + RenderCommand.BindRenderTargets(); RenderCommand.SetViewport(_context.SwapChain.BackbufferViewport); } @@ -144,7 +131,7 @@ namespace GlitchyEditor DrawMainMenuBar(); - _editor.SceneViewportWindow.RenderTarget = _renderTarget2D; + _editor.SceneViewportWindow.RenderTarget = _viewportTarget; _editor.Update(); @@ -186,9 +173,6 @@ namespace GlitchyEditor private bool OnWindowResize(WindowResizeEvent e) { - _swapchainDepthBuffer.ReleaseRef(); - _swapchainDepthBuffer = new DepthStencilTarget(_context.SwapChain.Width, _context.SwapChain.Height); - return false; } @@ -200,7 +184,7 @@ namespace GlitchyEditor if(sizeX == 0 || sizeY == 0) return; - _renderTarget2D.Resize(sizeX, sizeY); + _viewportTarget.Resize(sizeX, sizeY); _cameraController.AspectRatio = (float)sizeX / (float)sizeY; } diff --git a/GlitchyEngine/src/ImGui/ImGuiExtension.bf b/GlitchyEngine/src/ImGui/ImGuiExtension.bf index 97e484d..c08de43 100644 --- a/GlitchyEngine/src/ImGui/ImGuiExtension.bf +++ b/GlitchyEngine/src/ImGui/ImGuiExtension.bf @@ -23,5 +23,17 @@ namespace ImGui /// Releases references that accumulated calls like ImGui::Image protected internal static extern void CleanupFrame(); + + extension Vec2 + { + public static explicit operator Vector2(Vec2 v) => .(v.x, v.y); + public static explicit operator Vec2(Vector2 v) => .(v.X, v.Y); + } + + extension Vec4 + { + public static explicit operator Vector4(Vec4 v) => .(v.x, v.y, v.z, v.w); + public static explicit operator Vec4(Vector4 v) => .(v.X, v.Y, v.Z, v.W); + } } }