diff --git a/engine/src/engine/app.cpp b/engine/src/engine/app.cpp index 256e9aa..0dc07db 100644 --- a/engine/src/engine/app.cpp +++ b/engine/src/engine/app.cpp @@ -9,8 +9,8 @@ namespace engineapi { App::App(const string& path) { const char* name = "zengine"; - RenderAPI::MakeInstance(); - Window::MakeInstance(3, 640, 720, name); + _RenderAPI = RenderAPI::MakeInstance(); + _Window = Window::MakeInstance(3, 640, 720, name); auto scene_manager = new SceneManager(); scene_manager->LoadScene(path); new AssetManager(); @@ -29,6 +29,11 @@ namespace engineapi { auto actor = ActorMesh::New(property); } } + App::~App() + { + delete _Window; + delete _RenderAPI; + } void App::Launch() { while (true) { @@ -38,13 +43,13 @@ namespace engineapi { } void App::Update() { - SceneManager::GetSingletonPtr()->GetCurScene()->Update(); + SceneManager::GetSingletonPtr()->Update(); } void App::Render() { RenderAPI::GetSingletonPtr()->BeginFrame(); - SceneManager::GetSingletonPtr()->GetCurScene()->Render(); + SceneManager::GetSingletonPtr()->Render(); RenderAPI::GetSingletonPtr()->EndFrame(); } diff --git a/engine/src/engine/app.h b/engine/src/engine/app.h index b2d218f..397a083 100644 --- a/engine/src/engine/app.h +++ b/engine/src/engine/app.h @@ -3,11 +3,15 @@ using std::string; namespace engineapi { + class RenderAPI; + class Window; class App { - protected: - + public: + RenderAPI* _RenderAPI{nullptr}; + Window* _Window{ nullptr }; public: App(const string& path); + ~App(); void Launch(); public: void Update(); diff --git a/engine/src/engine/object/camera/camera.cpp b/engine/src/engine/object/camera/camera.cpp new file mode 100644 index 0000000..2c1bf3d --- /dev/null +++ b/engine/src/engine/object/camera/camera.cpp @@ -0,0 +1,10 @@ +#include "camera.h" + +namespace engineapi { + Camera::Camera() + { + } + Camera::~Camera() + { + } +} diff --git a/engine/src/engine/object/camera/camera.h b/engine/src/engine/object/camera/camera.h new file mode 100644 index 0000000..9412a8b --- /dev/null +++ b/engine/src/engine/object/camera/camera.h @@ -0,0 +1,9 @@ +#pragma once +namespace engineapi { + class Camera { + protected: + public: + Camera(); + ~Camera(); + }; +}; \ No newline at end of file diff --git a/engine/src/engine/object/component/mesh_render.cpp b/engine/src/engine/object/component/mesh_render.cpp new file mode 100644 index 0000000..e69de29 diff --git a/engine/src/engine/object/component/mesh_render.h b/engine/src/engine/object/component/mesh_render.h new file mode 100644 index 0000000..17983d9 --- /dev/null +++ b/engine/src/engine/object/component/mesh_render.h @@ -0,0 +1,8 @@ +#pragma once +#include "../component.h" + +namespace engineapi { + class MeshRenderer : public Component { + + }; +}; \ No newline at end of file diff --git a/engine/src/engine/object/scene/scene_manager.cpp b/engine/src/engine/object/scene/scene_manager.cpp index 536c14b..3344954 100644 --- a/engine/src/engine/object/scene/scene_manager.cpp +++ b/engine/src/engine/object/scene/scene_manager.cpp @@ -58,6 +58,16 @@ namespace engineapi { } + void SceneManager::Render() + { + curScene->scene->Render(); + } + + void SceneManager::Update() + { + curScene->scene->Update(); + } + Scene* SceneManager::GetCurScene() { return curScene->scene; diff --git a/engine/src/engine/object/scene/scene_manager.h b/engine/src/engine/object/scene/scene_manager.h index 060cb61..8114360 100644 --- a/engine/src/engine/object/scene/scene_manager.h +++ b/engine/src/engine/object/scene/scene_manager.h @@ -19,6 +19,8 @@ namespace engineapi { void DeleteScene(const string& name); void DeleteAllScene(); void ReloadScene(); + void Render(); + void Update(); Scene* GetCurScene(); SceneInfo* GetSceneInfo(const string& name); }; diff --git a/engine/src/engine/render/asset/material.h b/engine/src/engine/render/asset/material.h index e84c9a4..fbad252 100644 --- a/engine/src/engine/render/asset/material.h +++ b/engine/src/engine/render/asset/material.h @@ -1,3 +1,4 @@ +#pragma once #include "asset_render.h" namespace engineapi { diff --git a/engine/src/engine/render/asset/texture.h b/engine/src/engine/render/asset/texture.h index f8c7b39..1b28cc7 100644 --- a/engine/src/engine/render/asset/texture.h +++ b/engine/src/engine/render/asset/texture.h @@ -1,3 +1,4 @@ +#pragma once #include "asset_render.h" namespace engineapi { diff --git a/engine/src/engine/render/pass/renderpass.h b/engine/src/engine/render/pass/renderpass.h new file mode 100644 index 0000000..7a51192 --- /dev/null +++ b/engine/src/engine/render/pass/renderpass.h @@ -0,0 +1,37 @@ +#pragma once +#include "../asset/material.h" +#include "../asset/mesh.h" +#include "../asset/texture.h" +namespace engineapi { + enum RenderPassType + { + ZX_RENDER_PASS_SHADOW_GENERATION, + ZX_RENDER_PASS_FORWARD_RENDERING, + ZX_RENDER_PASS_RAY_TRACING, + ZX_RENDER_PASS_AFTER_EFFECT_RENDERING, + ZX_RENDER_PASS_UI_RENDERING, + ZX_RENDER_PASS_COUNT + }; + class Camera; + class RenderPass + { + public: + RenderPass() {}; + ~RenderPass() {}; + + virtual void Render(Camera* camera) = 0; + }; + class RenderStateSetting + { + public: + bool depthTest = true; + bool depthWrite = true; + BlendFactor srcFactor = BlendFactor::SRC_ALPHA; + BlendFactor dstFactor = BlendFactor::ONE_MINUS_SRC_ALPHA; + Vector4 clearColor = Vector4(); + float clearDepth = 1.0f; + uint32_t clearStencil = 0; + bool faceCull = true; + FaceCullOption faceCullOption = FaceCullOption::Back; + }; +}; \ No newline at end of file diff --git a/engine/src/engine/render/pass/renderpass_forward.cpp b/engine/src/engine/render/pass/renderpass_forward.cpp new file mode 100644 index 0000000..e222cbe --- /dev/null +++ b/engine/src/engine/render/pass/renderpass_forward.cpp @@ -0,0 +1,33 @@ +#include "renderpass_forward.h" +#include "../renderapi.h" +namespace engineapi { + RenderPassForwardRendering::RenderPassForwardRendering() + { + skyBox = nullptr; + skyBoxMaterial = nullptr; + + skyBoxRenderState = new RenderStateSetting(); + skyBoxRenderState->depthTest = false; + skyBoxRenderState->depthWrite = false; + + opaqueRenderState = new RenderStateSetting(); + + transparentRenderState = new RenderStateSetting(); + transparentRenderState->depthWrite = false; + + //drawCommandID = RenderAPI::GetSingletonPtr()->AllocateDrawCommand(CommandType::ForwardRendering); + } + RenderPassForwardRendering::~RenderPassForwardRendering() + { + } + void RenderPassForwardRendering::Render(Camera* camera) + { + } + void RenderPassForwardRendering::RenderSkyBox(Camera* camera) + { + } + void RenderPassForwardRendering::RenderBatches(const map>& batchs) + { + + } +} diff --git a/engine/src/engine/render/pass/renderpass_forward.h b/engine/src/engine/render/pass/renderpass_forward.h new file mode 100644 index 0000000..d37dff2 --- /dev/null +++ b/engine/src/engine/render/pass/renderpass_forward.h @@ -0,0 +1,24 @@ +#pragma once +#include "renderpass.h" +#include "object/component/mesh_render.h" +namespace engineapi { + class RenderPassForwardRendering : public RenderPass + { + public: + RenderPassForwardRendering(); + ~RenderPassForwardRendering(); + + virtual void Render(Camera* camera); + + private: + uint32_t drawCommandID = 0; + Mesh* skyBox; + Material* skyBoxMaterial; + RenderStateSetting* skyBoxRenderState; + RenderStateSetting* opaqueRenderState; + RenderStateSetting* transparentRenderState; + + void RenderSkyBox(Camera* camera); + void RenderBatches(const map>& batchs); + }; +} \ No newline at end of file diff --git a/engine/src/engine/render/renderapi.cpp b/engine/src/engine/render/renderapi.cpp index 7c964e2..6bd252c 100644 --- a/engine/src/engine/render/renderapi.cpp +++ b/engine/src/engine/render/renderapi.cpp @@ -1,13 +1,34 @@ #include "renderapi.h" +#include "pass/renderpass.h" +#include "pass/renderpass_forward.h" #ifdef VULKAN_API #include "vulkanapi/vulkanapi.h" #endif // VULKAN_API namespace engineapi { + RenderAPI::RenderAPI() + { + mAllPasses.resize(ZX_RENDER_PASS_COUNT); - void RenderAPI::MakeInstance() + //mAllPasses[ZX_RENDER_PASS_SHADOW_GENERATION] = new RenderPassShadowGeneration(); + mAllPasses[ZX_RENDER_PASS_FORWARD_RENDERING] = new RenderPassForwardRendering(); + //mAllPasses[ZX_RENDER_PASS_RAY_TRACING] = new RenderPassRayTracing(); + //mAllPasses[ZX_RENDER_PASS_AFTER_EFFECT_RENDERING] = new RenderPassAfterEffectRendering(); + //mAllPasses[ZX_RENDER_PASS_UI_RENDERING] = new RenderPassUIRendering(); + + SetUpRenderPasses(); + } + void RenderAPI::SetUpRenderPasses() + { + mCurPasses.clear(); + //mCurPasses.push_back(mAllPasses[ZX_RENDER_PASS_SHADOW_GENERATION]); + mCurPasses.push_back(mAllPasses[ZX_RENDER_PASS_FORWARD_RENDERING]); + //mCurPasses.push_back(mAllPasses[ZX_RENDER_PASS_AFTER_EFFECT_RENDERING]); + //mCurPasses.push_back(mAllPasses[ZX_RENDER_PASS_UI_RENDERING]); + } + RenderAPI* RenderAPI::MakeInstance() { #ifdef VULKAN_API - new RenderVulkanAPI(); + return new RenderVulkanAPI(); #endif } } \ No newline at end of file diff --git a/engine/src/engine/render/renderapi.h b/engine/src/engine/render/renderapi.h index 1a1257a..25054ac 100644 --- a/engine/src/engine/render/renderapi.h +++ b/engine/src/engine/render/renderapi.h @@ -4,14 +4,23 @@ namespace engineapi { class Mesh; + class Camera; + class RenderPass; class RenderAPI : public Singleton { + protected: + vector mCurPasses; + vector mAllPasses; + public: + RenderAPI(); + virtual void SetUpRenderPasses(); public: virtual void BeginFrame() = 0; + virtual void Render(Camera& camera) = 0; virtual void EndFrame() = 0; virtual void SetStaticMesh(Mesh* mesh) = 0; public: - static void MakeInstance(); + static RenderAPI* MakeInstance(); }; } template<> diff --git a/engine/src/engine/render/window.cpp b/engine/src/engine/render/window.cpp index e0707c1..83ded77 100644 --- a/engine/src/engine/render/window.cpp +++ b/engine/src/engine/render/window.cpp @@ -4,10 +4,10 @@ #endif // VULKAN_API namespace engineapi { Window::WindowClass Window::WindowClass::wndClass; - void Window::MakeInstance(int frames, uint32_t width, uint32_t height, const char* title) + Window* Window::MakeInstance(int frames, uint32_t width, uint32_t height, const char* title) { #ifdef VULKAN_API - new vulkanapi::Window(frames, width, height, title); + return new vulkanapi::Window(frames, width, height, title); #endif } Window::WindowClass::WindowClass() noexcept diff --git a/engine/src/engine/render/window.h b/engine/src/engine/render/window.h index 58e8b7e..3880b32 100644 --- a/engine/src/engine/render/window.h +++ b/engine/src/engine/render/window.h @@ -35,7 +35,7 @@ namespace engineapi { return mPtr; } static bool ProcessMessages(int& code); - static void MakeInstance(int frames, uint32_t width, uint32_t height, const char* title); + static Window* MakeInstance(int frames, uint32_t width, uint32_t height, const char* title); }; }; template<> diff --git a/engine/src/engine/vulkanapi/pass/forwardpass.h b/engine/src/engine/vulkanapi/pass/forwardpass.h index ec901a1..fe48ce1 100644 --- a/engine/src/engine/vulkanapi/pass/forwardpass.h +++ b/engine/src/engine/vulkanapi/pass/forwardpass.h @@ -1,9 +1,7 @@ #pragma once -#include "../vulkan.h" #include "gbuffer.h" namespace vulkanapi { class RenderPass; - class Device; //class MaterialCache; class ForwardPass { protected: diff --git a/engine/src/engine/vulkanapi/vulkanapi.cpp b/engine/src/engine/vulkanapi/vulkanapi.cpp index 7a24464..a3c6fa5 100644 --- a/engine/src/engine/vulkanapi/vulkanapi.cpp +++ b/engine/src/engine/vulkanapi/vulkanapi.cpp @@ -4,6 +4,7 @@ #include "wrapper/commandbuffer.h" #include "thread/worker.h" #include "render/asset/mesh.h" +#include "object/camera/camera.h" namespace engineapi { RenderVulkanAPI::RenderVulkanAPI() :backend("vulkan") @@ -13,6 +14,10 @@ namespace engineapi { void RenderVulkanAPI::BeginFrame() { + } + void RenderVulkanAPI::Render(Camera& camera) + { + } void RenderVulkanAPI::EndFrame() { diff --git a/engine/src/engine/vulkanapi/vulkanapi.h b/engine/src/engine/vulkanapi/vulkanapi.h index 821b2b5..012f7bf 100644 --- a/engine/src/engine/vulkanapi/vulkanapi.h +++ b/engine/src/engine/vulkanapi/vulkanapi.h @@ -14,6 +14,7 @@ namespace engineapi RenderVulkanAPI(); virtual void BeginFrame()override; + virtual void Render(Camera& camera)override; virtual void EndFrame()override; virtual void SetStaticMesh(Mesh* mesh)override; public: