diff --git a/Editor/src/Misc/GizmoDrawer.cpp b/Editor/src/Misc/GizmoDrawer.cpp index 70ce70a2..b0ee3d13 100644 --- a/Editor/src/Misc/GizmoDrawer.cpp +++ b/Editor/src/Misc/GizmoDrawer.cpp @@ -178,8 +178,7 @@ void GizmoDrawer::DrawAxis(Ref scene, bool occluded) void GizmoDrawer::DrawNavMesh(Ref scene, bool occluded) { - auto cam = Engine::GetCurrentScene()->m_EditorCamera; - + auto& cam = Engine::GetCurrentScene()->m_EditorCamera; auto navVolumesView = scene->m_Registry.view(); for (auto e : navVolumesView) { diff --git a/Nuake/src/Rendering/Renderer.cpp b/Nuake/src/Rendering/Renderer.cpp index 3e942290..6b8b20a0 100644 --- a/Nuake/src/Rendering/Renderer.cpp +++ b/Nuake/src/Rendering/Renderer.cpp @@ -351,8 +351,9 @@ namespace Nuake RenderCommand::DrawLines(0, 2); } - void Renderer::DrawDebugLine(Vector3 start, Vector3 end, Vector3 color) + void Renderer::DrawLine(Vector3 start, Vector3 end, Vector3 color) { + //m_DebugShader->Bind(); //m_DebugShader->SetUniform4f("u_Color", color.r, color.g, color.b, color.a); } diff --git a/Nuake/src/Rendering/Renderer.h b/Nuake/src/Rendering/Renderer.h index dcaffe6a..4e46be72 100644 --- a/Nuake/src/Rendering/Renderer.h +++ b/Nuake/src/Rendering/Renderer.h @@ -75,7 +75,7 @@ namespace Nuake // Debug static void DrawLine(Vector3 start, Vector3 end, Color color, Matrix4 transform = Matrix4()); - static void DrawDebugLine(Vector3 start, Vector3 end, Vector3 color); + static void DrawLine(Vector3 start, Vector3 end, Vector3 color); static void DrawCube(TransformComponent transform, glm::vec4 color); static void DrawSphere(TransformComponent transform, glm::vec4 color); static void DrawQuad(Matrix4 transform = Matrix4()); diff --git a/Nuake/src/Rendering/SceneRenderer.cpp b/Nuake/src/Rendering/SceneRenderer.cpp index 1c002af6..3cd4481d 100644 --- a/Nuake/src/Rendering/SceneRenderer.cpp +++ b/Nuake/src/Rendering/SceneRenderer.cpp @@ -43,12 +43,35 @@ namespace Nuake mOutlineBuffer = CreateScope(false, defaultResolution); mOutlineBuffer->SetTexture(CreateRef(defaultResolution, GL_RGB), GL_COLOR_ATTACHMENT0); + + // Generate debug meshes + std::vector lineVertices + { + { Vector3(0, 0, 0), Vector2(0, 0), Vector3(0, 0, 0) }, + { Vector3(1, 1, 1), Vector2(0, 0), Vector3(0, 0, 0) } + }; + + std::vector lineIndices + { + 0, 1 + }; + + mLineMesh = CreateRef(); + mLineMesh->AddSurface(lineVertices, lineIndices); } void SceneRenderer::Cleanup() { } + void SceneRenderer::Update(const Timestep time) + { + for (auto& line : mDebugLines) + { + line.Life -= time; + } + } + void SceneRenderer::BeginRenderScene(const Matrix4& projection, const Matrix4& view, const Vector3& camPos) { mProjection = projection; @@ -84,6 +107,8 @@ namespace Nuake mShadingBuffer->QueueResize(framebuffer.GetSize()); ShadingPass(scene); + DebugRendererPass(scene); + Ref finalOutput = mShadingBuffer->GetTexture(); if (scene.GetEnvironment()->BloomEnabled) { @@ -342,6 +367,19 @@ namespace Nuake RenderCommand::Enable(RendererEnum::DEPTH_TEST); Renderer::EndDraw(); } + + void SceneRenderer::DrawDebugLine(const Vector3& start, const Vector3& end, const Color& color, float life) + { + DebugLine debugLine = { + .Start = start, + .End = end, + .LineColor = color, + .Life = life, + .Width = 2.0f + }; + + mDebugLines.push_back(debugLine); + } void SceneRenderer::ShadowPass(Scene& scene) { @@ -622,7 +660,7 @@ namespace Nuake } // Reset material on quadmesh - //Renderer::QuadMesh->SetMaterial(previousMaterial); + // Renderer::QuadMesh->SetMaterial(previousMaterial); // Skinned mesh at the end because we switch shader gBufferSkinnedMeshShader->Bind(); @@ -699,7 +737,6 @@ namespace Nuake LightComponent light; float distance; }; - std::vector lightDistances; auto view = scene.m_Registry.view(); @@ -758,6 +795,46 @@ namespace Nuake void SceneRenderer::PostProcessPass(const Scene& scene) { + + } + + void SceneRenderer::DebugRendererPass(Scene& scene) + { + mShadingBuffer->Bind(); + { + // Lines + mLineMesh->Bind(); + + Shader* shader = ShaderManager::GetShader("Resources/Shaders/debugLine.shader"); + shader->Bind(); + + shader->SetUniformMat4f("u_Projection", mProjection); + shader->SetUniformMat4f("u_View", mView); + + for (auto& l : mDebugLines) + { + shader->SetUniformVec4("u_Color", l.LineColor); + shader->SetUniformVec3("u_StartPos", l.Start); + shader->SetUniformVec3("u_EndPos", l.End); + + glLineWidth(l.Width); + RenderCommand::DrawLines(0, 2); + } + + std::erase_if(mDebugLines, [](const DebugLine& line) + { + return line.Life <= 0.0f; + }); + + shader->Unbind(); + + // Cubes + + // Spheres + + // Quads + } + mShadingBuffer->Unbind(); } void SceneRenderer::SetSkeletonBoneTransformRecursive(Scene& scene, SkeletonNode& skeletonNode, Shader* shader) diff --git a/Nuake/src/Rendering/SceneRenderer.h b/Nuake/src/Rendering/SceneRenderer.h index e7739e52..88586464 100644 --- a/Nuake/src/Rendering/SceneRenderer.h +++ b/Nuake/src/Rendering/SceneRenderer.h @@ -12,10 +12,37 @@ namespace Nuake { class SceneRenderer { + struct DebugSphere + { + Vector3 Position; + float Radius; + Color SphereColor; + float Life; + }; + + struct DebugQuad + { + Vector3 Position; + Vector3 Size; + Color SphereColor; + float Life; + }; + + struct DebugLine + { + Vector3 Start; + Vector3 End; + Color LineColor; + float Life; + float Width; + }; + public: void Init(); void Cleanup(); + void Update(const Timestep time); + void BeginRenderScene(const Matrix4& projection, const Matrix4& view, const Vector3& camPos); void RenderScene(Scene& scene, FrameBuffer& framebuffer); @@ -24,12 +51,13 @@ namespace Nuake return *mGBuffer; } + void DrawDebugLine(const Vector3& start, const Vector3& end, const Color& color = Color(1, 0, 0, 1), float life = 0.0f); + uint32_t mOutlineEntityID = 0; private: Matrix4 mProjection, mView; Vector3 mCamPos; - Scope mGBuffer; Scope mShadingBuffer; Scope mToneMapBuffer; @@ -38,10 +66,15 @@ namespace Nuake Scope mDOFBuffer; Scope mOutlineBuffer; + Ref mLineMesh; + + std::vector mDebugLines; + void ShadowPass(Scene& scene); void GBufferPass(Scene& scene); void ShadingPass(Scene& scene); void PostProcessPass(const Scene& scene); + void DebugRendererPass(Scene& scene); void SetSkeletonBoneTransformRecursive(Scene& scene, SkeletonNode& skeletonNode, Shader* shader); }; diff --git a/Nuake/src/Rendering/Shaders/ShaderManager.cpp b/Nuake/src/Rendering/Shaders/ShaderManager.cpp index 77b3570b..a24ad96f 100644 --- a/Nuake/src/Rendering/Shaders/ShaderManager.cpp +++ b/Nuake/src/Rendering/Shaders/ShaderManager.cpp @@ -41,6 +41,7 @@ namespace Nuake LoadEmbeddedShader(Resources_Shaders_ui_shader); LoadEmbeddedShader(Resources_Shaders_vignette_shader); LoadEmbeddedShader(Resources_Shaders_volumetric_shader); + LoadEmbeddedShader(Resources_Shaders_debugLine_shader); } Shader* ShaderManager::GetShader(const std::string& path) diff --git a/Nuake/src/Resource/StaticResources.cpp b/Nuake/src/Resource/StaticResources.cpp index 9e29a168..ca48f23c 100644 --- a/Nuake/src/Resource/StaticResources.cpp +++ b/Nuake/src/Resource/StaticResources.cpp @@ -268523,6 +268523,55 @@ const std::string Resources_Shaders_copy_shader_path = R"(Resources/Shaders/copy }; unsigned int Resources_Shaders_copy_shader_len = 403; +// Data for file: Resources_Shaders_debugLine_shader_path +const std::string Resources_Shaders_debugLine_shader_path = R"(Resources/Shaders/debugLine.shader)"; + unsigned char Resources_Shaders_debugLine_shader[] = { + 0x23, 0x73, 0x68, 0x61, 0x64, 0x65, 0x72, 0x20, 0x76, 0x65, 0x72, 0x74, + 0x65, 0x78, 0x0d, 0x0a, 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, + 0x20, 0x34, 0x34, 0x30, 0x20, 0x63, 0x6f, 0x72, 0x65, 0x0d, 0x0a, 0x0d, + 0x0a, 0x6c, 0x61, 0x79, 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x69, 0x6e, + 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, + 0x50, 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0d, 0x0a, 0x0d, + 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, 0x65, 0x63, + 0x33, 0x20, 0x75, 0x5f, 0x53, 0x74, 0x61, 0x72, 0x74, 0x50, 0x6f, 0x73, + 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x76, + 0x65, 0x63, 0x33, 0x20, 0x75, 0x5f, 0x45, 0x6e, 0x64, 0x50, 0x6f, 0x73, + 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x50, 0x72, 0x6f, 0x6a, + 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, + 0x66, 0x6f, 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, + 0x56, 0x69, 0x65, 0x77, 0x3b, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, + 0x72, 0x6d, 0x20, 0x6d, 0x61, 0x74, 0x34, 0x20, 0x75, 0x5f, 0x4d, 0x6f, + 0x64, 0x65, 0x6c, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, + 0x20, 0x6d, 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, + 0x20, 0x20, 0x20, 0x20, 0x76, 0x65, 0x63, 0x33, 0x20, 0x70, 0x6f, 0x73, + 0x20, 0x3d, 0x20, 0x6d, 0x69, 0x78, 0x28, 0x75, 0x5f, 0x53, 0x74, 0x61, + 0x72, 0x74, 0x50, 0x6f, 0x73, 0x2c, 0x20, 0x75, 0x5f, 0x45, 0x6e, 0x64, + 0x50, 0x6f, 0x73, 0x2c, 0x20, 0x56, 0x65, 0x72, 0x74, 0x65, 0x78, 0x50, + 0x6f, 0x73, 0x69, 0x74, 0x69, 0x6f, 0x6e, 0x2e, 0x78, 0x29, 0x3b, 0x0d, + 0x0a, 0x20, 0x20, 0x20, 0x20, 0x67, 0x6c, 0x5f, 0x50, 0x6f, 0x73, 0x69, + 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x3d, 0x20, 0x75, 0x5f, 0x50, 0x72, 0x6f, + 0x6a, 0x65, 0x63, 0x74, 0x69, 0x6f, 0x6e, 0x20, 0x2a, 0x20, 0x75, 0x5f, + 0x56, 0x69, 0x65, 0x77, 0x20, 0x2a, 0x20, 0x76, 0x65, 0x63, 0x34, 0x28, + 0x70, 0x6f, 0x73, 0x2c, 0x20, 0x31, 0x2e, 0x30, 0x66, 0x29, 0x3b, 0x0d, + 0x0a, 0x7d, 0x0d, 0x0a, 0x0d, 0x0a, 0x23, 0x73, 0x68, 0x61, 0x64, 0x65, + 0x72, 0x20, 0x66, 0x72, 0x61, 0x67, 0x6d, 0x65, 0x6e, 0x74, 0x0d, 0x0a, + 0x23, 0x76, 0x65, 0x72, 0x73, 0x69, 0x6f, 0x6e, 0x20, 0x34, 0x34, 0x30, + 0x20, 0x63, 0x6f, 0x72, 0x65, 0x0d, 0x0a, 0x0d, 0x0a, 0x6c, 0x61, 0x79, + 0x6f, 0x75, 0x74, 0x28, 0x6c, 0x6f, 0x63, 0x61, 0x74, 0x69, 0x6f, 0x6e, + 0x20, 0x3d, 0x20, 0x30, 0x29, 0x20, 0x6f, 0x75, 0x74, 0x20, 0x76, 0x65, + 0x63, 0x34, 0x20, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, + 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x75, 0x6e, 0x69, 0x66, 0x6f, 0x72, 0x6d, + 0x20, 0x76, 0x65, 0x63, 0x34, 0x20, 0x75, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, + 0x72, 0x3b, 0x0d, 0x0a, 0x0d, 0x0a, 0x76, 0x6f, 0x69, 0x64, 0x20, 0x6d, + 0x61, 0x69, 0x6e, 0x28, 0x29, 0x0d, 0x0a, 0x7b, 0x0d, 0x0a, 0x20, 0x20, + 0x20, 0x20, 0x46, 0x72, 0x61, 0x67, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x20, + 0x3d, 0x20, 0x75, 0x5f, 0x43, 0x6f, 0x6c, 0x6f, 0x72, 0x3b, 0x0d, 0x0a, + 0x7d + }; + unsigned int Resources_Shaders_debugLine_shader_len = 505; + // Data for file: Resources_Shaders_deferred_shader_path const std::string Resources_Shaders_deferred_shader_path = R"(Resources/Shaders/deferred.shader)"; unsigned char Resources_Shaders_deferred_shader[] = { diff --git a/Nuake/src/Resource/StaticResources.h b/Nuake/src/Resource/StaticResources.h index bbaff743..8a5faf81 100644 --- a/Nuake/src/Resource/StaticResources.h +++ b/Nuake/src/Resource/StaticResources.h @@ -150,6 +150,9 @@ extern unsigned char Resources_Shaders_combine_shader[]; extern const std::string Resources_Shaders_copy_shader_path; extern unsigned int Resources_Shaders_copy_shader_len; extern unsigned char Resources_Shaders_copy_shader[]; +extern const std::string Resources_Shaders_debugLine_shader_path; +extern unsigned int Resources_Shaders_debugLine_shader_len; +extern unsigned char Resources_Shaders_debugLine_shader[]; extern const std::string Resources_Shaders_deferred_shader_path; extern unsigned int Resources_Shaders_deferred_shader_len; extern unsigned char Resources_Shaders_deferred_shader[]; diff --git a/Nuake/src/Scene/Scene.cpp b/Nuake/src/Scene/Scene.cpp index 979d36d1..8eae289a 100644 --- a/Nuake/src/Scene/Scene.cpp +++ b/Nuake/src/Scene/Scene.cpp @@ -235,6 +235,8 @@ namespace Nuake { system->Update(ts); } + + m_SceneRenderer->Update(ts); } void Scene::FixedUpdate(Timestep ts) diff --git a/Nuake/src/Scripting/NetModules/EngineNetAPI.cpp b/Nuake/src/Scripting/NetModules/EngineNetAPI.cpp index e856124b..4c8e2fa1 100644 --- a/Nuake/src/Scripting/NetModules/EngineNetAPI.cpp +++ b/Nuake/src/Scripting/NetModules/EngineNetAPI.cpp @@ -1,5 +1,8 @@ #include "EngineNetAPI.h" #include +#include +#include +#include "src/Rendering/SceneRenderer.h" namespace Nuake { @@ -8,9 +11,19 @@ namespace Nuake { Logger::Log(string, ".net", VERBOSE); } + void DrawLine(float startX, float startY, float startZ, float endX, float endY, float endZ, float r, float g, float b, float a, float life) + { + const Vector3 start = { startX, startY, startZ }; + const Vector3 end = { endX, endY, endZ }; + const Vector4 color = { r, g, b, a }; + + Engine::GetCurrentScene()->m_SceneRenderer->DrawDebugLine(start, end, color, life); + } + void EngineNetAPI::RegisterMethods() { RegisterMethod("Engine.LoggerLogIcall", (void*)(&Log)); + RegisterMethod("Debug.DrawLineIcall", &DrawLine); } } diff --git a/NuakeNet/src/main.cs b/NuakeNet/src/main.cs index d1141f26..5497cb1a 100644 --- a/NuakeNet/src/main.cs +++ b/NuakeNet/src/main.cs @@ -29,5 +29,25 @@ namespace Nuake.Net } } + public class Debug + { + internal static unsafe delegate* DrawLineIcall; + + public Debug() { } + + public static void DrawLine(Vector3 start, Vector3 end, Vector4 color, float life = 0.0f) + { + unsafe + { + DrawLineIcall(start.X, start.Y, start.Z, end.X, end.Y, end.Z, color.X, color.Y, color.Z, color.W, life); + } + } + } + + } \ No newline at end of file diff --git a/Resources/Shaders/debugLine.shader b/Resources/Shaders/debugLine.shader new file mode 100644 index 00000000..4a591a35 --- /dev/null +++ b/Resources/Shaders/debugLine.shader @@ -0,0 +1,29 @@ +#shader vertex +#version 440 core + +layout(location = 0) in vec3 VertexPosition; + +uniform vec3 u_StartPos; +uniform vec3 u_EndPos; + +uniform mat4 u_Projection; +uniform mat4 u_View; +uniform mat4 u_Model; + +void main() +{ + vec3 pos = mix(u_StartPos, u_EndPos, VertexPosition.x); + gl_Position = u_Projection * u_View * vec4(pos, 1.0f); +} + +#shader fragment +#version 440 core + +layout(location = 0) out vec4 FragColor; + +uniform vec4 u_Color; + +void main() +{ + FragColor = u_Color; +} \ No newline at end of file