diff --git a/Engine/res/Shaders/Quad/Quad_VS.hlsl b/Engine/res/Shaders/Quad/Quad_VS.hlsl index e84e339..6698c5c 100644 --- a/Engine/res/Shaders/Quad/Quad_VS.hlsl +++ b/Engine/res/Shaders/Quad/Quad_VS.hlsl @@ -4,10 +4,15 @@ struct VertexOut float4 Position : SV_Position; }; +cbuffer cv_ViewProjection : register(b0) +{ + row_major matrix viewProjection; +} + VertexOut main(float3 InPosition : POSITION, float4 InColor : COLOR) { VertexOut vso; - vso.Position = float4(InPosition.x, InPosition.y, InPosition.z, 1.0); + vso.Position = mul(float4(InPosition.x, InPosition.y, InPosition.z, 1.0), viewProjection); vso.Color = InColor; return vso; diff --git a/Engine/src/Engine/Scene/Components.h b/Engine/src/Engine/Scene/Components.h new file mode 100644 index 0000000..338a8eb --- /dev/null +++ b/Engine/src/Engine/Scene/Components.h @@ -0,0 +1,36 @@ +#pragma once + +#include "Base.h" + +#include + +namespace Light { + + class Texture; + + struct TransformComponent + { + glm::vec2 position, size; + + // glm::mat4 transform{ 1.0f }; + + TransformComponent() = default; + TransformComponent(const TransformComponent&) = default; + TransformComponent(const glm::vec2& _position, const glm::vec2& _size) : position(_position), size(_size) {} + + // operator glm::mat4&() { return transform; } + // operator const glm::mat4& () const { return transform; } + }; + + struct SpriteRendererComponent + { + std::shared_ptr texture; + + SpriteRendererComponent() = default; + SpriteRendererComponent(const SpriteRendererComponent&) = default; + SpriteRendererComponent(std::shared_ptr _texture) : texture(_texture) {} + + operator std::shared_ptr() { return texture; } + }; + +} \ No newline at end of file diff --git a/Engine/src/Engine/Scene/Entity.cpp b/Engine/src/Engine/Scene/Entity.cpp new file mode 100644 index 0000000..53dc365 --- /dev/null +++ b/Engine/src/Engine/Scene/Entity.cpp @@ -0,0 +1,17 @@ +#include "ltpch.h" +#include "Entity.h" + +#include "Scene.h" + +namespace Light { + + Entity::Entity(entt::entity handle, Scene* scene) + : m_Handle(handle), m_Scene(scene) + { + } + + Entity::~Entity() + { + } + +} \ No newline at end of file diff --git a/Engine/src/Engine/Scene/Entity.h b/Engine/src/Engine/Scene/Entity.h new file mode 100644 index 0000000..161d004 --- /dev/null +++ b/Engine/src/Engine/Scene/Entity.h @@ -0,0 +1,30 @@ +#pragma once + +#include "Base.h" + +#include + +namespace Light { + + class Scene; + + class Entity + { + private: + entt::entity m_Handle; + Scene* m_Scene; + + public: + Entity(){} + Entity(entt::entity handle, Scene* registry); + ~Entity(); + + template + T& AddComponent(Args&&... args) + { + return m_Scene->m_Registry.emplace(m_Handle, std::forward(args)...); + } + + }; + +} \ No newline at end of file diff --git a/Engine/src/Engine/Scene/Scene.cpp b/Engine/src/Engine/Scene/Scene.cpp new file mode 100644 index 0000000..2262775 --- /dev/null +++ b/Engine/src/Engine/Scene/Scene.cpp @@ -0,0 +1,40 @@ +#include "ltpch.h" +#include "Scene.h" + +#include "Entity.h" +#include "Components.h" + +#include "Graphics/Renderer.h" + +#include + +namespace Light { + + Scene::Scene() + { + } + + Scene::~Scene() + { + } + + void Scene::OnRender() + { + auto group = m_Registry.group(entt::get); + + group.each([](TransformComponent& transform, SpriteRendererComponent& sprite) { + Renderer::DrawQuad(glm::vec3(transform.position, 0.0f), transform.size, sprite.texture); + }); + + } + + Entity Scene::CreateEntity(const std::string& name, const glm::vec2& position, const glm::vec2& size) + { + Entity entity { m_Registry.create(), this } ; + entity.AddComponent(position, size); + + return entity; + + } + +} diff --git a/Engine/src/Engine/Scene/Scene.h b/Engine/src/Engine/Scene/Scene.h new file mode 100644 index 0000000..5fa0097 --- /dev/null +++ b/Engine/src/Engine/Scene/Scene.h @@ -0,0 +1,28 @@ +#pragma once + +#include "Base.h" + +#include + +#include + +namespace Light { + + class Entity; + + class Scene + { + private: + friend class Entity; + entt::registry m_Registry; + + public: + Scene(); + ~Scene(); + + void OnRender(); + + Entity CreateEntity(const std::string& name, const glm::vec2& position, const glm::vec2& size); + }; + +} \ No newline at end of file diff --git a/Engine/src/LightEngine.h b/Engine/src/LightEngine.h index 13939e6..1b23642 100644 --- a/Engine/src/LightEngine.h +++ b/Engine/src/LightEngine.h @@ -44,6 +44,11 @@ //** THIRD_PARTY **// #include +//** SCENE **// +#include "Scene/Scene.h" +#include "Scene/Entity.h" +#include "Scene/Components.h" + // entry point #ifdef LIGHT_ENTRY_POINT #include "EntryPoint.h" diff --git a/Mirror/build.lua b/Mirror/build.lua index 48de4d0..b1591e8 100644 --- a/Mirror/build.lua +++ b/Mirror/build.lua @@ -34,6 +34,7 @@ project "Mirror" (dependenciesdir .. "imgui/"), (dependenciesdir .. "imgui/backends"), (dependenciesdir .. "glm/"), + (dependenciesdir .. "entt/"), } links diff --git a/Mirror/src/MirrorApp.cpp b/Mirror/src/MirrorApp.cpp index 50aae79..17a55ad 100644 --- a/Mirror/src/MirrorApp.cpp +++ b/Mirror/src/MirrorApp.cpp @@ -4,32 +4,36 @@ #include "MirrorLayer.h" -class Mirror : public Light::Application -{ -public: - Mirror() +namespace Light { + + class Mirror : public Light::Application { - LT_CLIENT_TRACE("Mirror::Mirror"); + public: + Mirror() + { + LT_CLIENT_TRACE("Mirror::Mirror"); - // Set window properties - Light::WindowProperties properties; - properties.title = "Mirror"; - properties.size = glm::uvec2(800u, 600u); - properties.vsync = true; + // Set window properties + Light::WindowProperties properties; + properties.title = "Mirror"; + properties.size = glm::uvec2(800u, 600u); + properties.vsync = true; - m_Window->SetProperties(properties); + m_Window->SetProperties(properties); - // Attach the sandbox layer - Light::LayerStack::AttachLayer(new MirrorLayer("MirrorLayer")); - } - - ~Mirror() + // Attach the sandbox layer + LayerStack::AttachLayer(new MirrorLayer("MirrorLayer")); + } + + ~Mirror() + { + LT_CLIENT_TRACE("Mirror::~Mirror"); + } + }; + + ::Light::Application* ::Light::CreateApplication() { - LT_CLIENT_TRACE("Mirror::~Mirror"); + return new Mirror(); } -}; -Light::Application* Light::CreateApplication() -{ - return new Mirror(); } \ No newline at end of file diff --git a/Mirror/src/MirrorLayer.h b/Mirror/src/MirrorLayer.h index e66b098..3bf3e57 100644 --- a/Mirror/src/MirrorLayer.h +++ b/Mirror/src/MirrorLayer.h @@ -1,98 +1,107 @@ #include -class MirrorLayer : public Light::Layer -{ -private: - std::shared_ptr m_AwesomefaceTexture; +namespace Light { - std::vector positions; - std::vector sizes; - - glm::vec2 m_Direction; - float m_Speed = 1.2f; - - std::shared_ptr m_Camera; - - std::shared_ptr m_Framebuffer; - - bool m_GameSceneEvents = false; - -public: - MirrorLayer(const std::string& name) - : Light::Layer(name), m_Direction(glm::vec2(0.0f, 0.0f)) + class MirrorLayer : public Layer { - m_Camera = std::make_shared(glm::vec2(0.0f), 800.0f / 600.0f, 1.0f); + private: + std::shared_ptr m_AwesomefaceTexture; - Light::ResourceManager::LoadTexture("awesomeface", "res/Textures/awesomeface.png"); - m_AwesomefaceTexture = Light::ResourceManager::GetTexture("awesomeface"); - - m_Framebuffer = std::shared_ptr(Light::Framebuffer::Create({ 800u, 600u, 1, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f), false }, Light::GraphicsContext::GetSharedContext())); + std::vector positions; + std::vector sizes; - for (int i = 0; i < 100; i++) + glm::vec2 m_Direction; + float m_Speed = 1000.0f; + + std::shared_ptr m_Camera; + + std::shared_ptr m_Framebuffer; + + Scene m_Scene; + + Entity m_TestEntity; + + bool m_GameSceneEvents = false; + + public: + MirrorLayer(const std::string& name) + : Layer(name), m_Direction(glm::vec2(0.0f, 0.0f)) { - glm::vec3 position = glm::vec3(-1.0f + (-100.0f / 400.0f) + ((rand() % 1000) / 400.0f), -1.0f + (-100.0f / 300.0f) + ((rand() % 800) / 300.0f), 0.0f); - glm::vec2 size = glm::vec2(100 / 400.0f, 100 / 300.0f); + m_Camera = std::make_shared(glm::vec2(500.0f), NULL, 1000.0f); - positions.push_back(position); - sizes.push_back(size); - } - } + ResourceManager::LoadTexture("awesomeface", "res/Textures/awesomeface.png"); + m_AwesomefaceTexture = ResourceManager::GetTexture("awesomeface"); - void OnRender() override - { - m_Camera->CalculateProjection(); - m_Camera->CalculateView(); + m_Framebuffer = std::shared_ptr(Framebuffer::Create({ 800u, 600u, 1, glm::vec4(1.0f, 0.0f, 0.0f, 1.0f), false }, GraphicsContext::GetSharedContext())); - Light::Renderer::BeginScene(m_Camera, m_Framebuffer); - - for (int i = 0; i < 100; i++) - Light::Renderer::DrawQuad(positions[i], sizes[i], m_AwesomefaceTexture); - - Light::Renderer::EndScene(); - } - - void OnUserInterfaceUpdate() - { - if (ImGui::Begin("GameView")) - { - Light::Input::ReceiveGameEvents(ImGui::IsWindowFocused()); - - static ImVec2 regionAvailPrev = { 0, 0 }; - ImVec2 regionAvail = ImGui::GetContentRegionAvail(); - - if (regionAvail.x != regionAvailPrev.x || regionAvail.y != regionAvailPrev.y) + for (int i = 0; i < 250; i++) { - m_Framebuffer->Resize({ regionAvail.x, regionAvail.y }); - m_Camera->OnResize({ regionAvail.x, regionAvail.y }); - regionAvailPrev = regionAvail; + glm::vec3 position = glm::vec3(rand() % 3000 - 1400.0f, rand() % 3000 - 1400.0f, 0.0f); + glm::vec2 size = glm::vec2(250.0f, 250.0f); + + positions.push_back(position); + sizes.push_back(size); + + m_Scene.CreateEntity("quad", position, size).AddComponent(m_AwesomefaceTexture); + } + } + + void OnRender() override + { + m_Camera->CalculateProjection(); + m_Camera->CalculateView(); + + Renderer::BeginScene(m_Camera, m_Framebuffer); + + m_Scene.OnRender(); + + Renderer::EndScene(); + } + + void OnUserInterfaceUpdate() + { + if (ImGui::Begin("GameView")) + { + Input::ReceiveGameEvents(ImGui::IsWindowFocused()); + + static ImVec2 regionAvailPrev = { 0, 0 }; + ImVec2 regionAvail = ImGui::GetContentRegionAvail(); + + if (regionAvail.x != regionAvailPrev.x || regionAvail.y != regionAvailPrev.y) + { + m_Framebuffer->Resize({ regionAvail.x, regionAvail.y }); + m_Camera->OnResize({ regionAvail.x, regionAvail.y }); + regionAvailPrev = regionAvail; + } + + if (GraphicsContext::GetGraphicsAPI() == GraphicsAPI::DirectX) + ImGui::Image(m_Framebuffer->GetColorAttachment(), regionAvail); + else + ImGui::Image(m_Framebuffer->GetColorAttachment(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); } - if (Light::GraphicsContext::GetGraphicsAPI() == Light::GraphicsAPI::DirectX) - ImGui::Image(m_Framebuffer->GetColorAttachment(), regionAvail); - else - ImGui::Image(m_Framebuffer->GetColorAttachment(), regionAvail, ImVec2(0, 1), ImVec2(1, 0)); + ImGui::End(); } - ImGui::End(); - } + void OnUpdate(float deltaTime) override + { + if (Input::GetKeyboardKey(KEY_A)) + m_Direction.x = -1.0f; + else if (Input::GetKeyboardKey(KEY_D)) + m_Direction.x = 1.0f; + else + m_Direction.x = 0.0f; - void OnUpdate(float deltaTime) override - { - if (Light::Input::GetKeyboardKey(KEY_A)) - m_Direction.x = -1.0f; - else if (Light::Input::GetKeyboardKey(KEY_D)) - m_Direction.x = 1.0f; - else - m_Direction.x = 0.0f; + if (Input::GetKeyboardKey(KEY_W)) + m_Direction.y = 1.0f; + else if (Input::GetKeyboardKey(KEY_S)) + m_Direction.y = -1.0f; + else + m_Direction.y = 0.0f; - if (Light::Input::GetKeyboardKey(KEY_W)) - m_Direction.y = 1.0f; - else if (Light::Input::GetKeyboardKey(KEY_S)) - m_Direction.y = -1.0f; - else - m_Direction.y = 0.0f; + m_Camera->Move(m_Direction * m_Speed * deltaTime); + } - m_Camera->Move(m_Direction * m_Speed * deltaTime); - } + }; -}; +} \ No newline at end of file diff --git a/Sandbox/build.lua b/Sandbox/build.lua index fedbbea..d1390eb 100644 --- a/Sandbox/build.lua +++ b/Sandbox/build.lua @@ -34,6 +34,7 @@ project "Sandbox" (dependenciesdir .. "imgui/"), (dependenciesdir .. "imgui/backends"), (dependenciesdir .. "glm/"), + (dependenciesdir .. "entt/"), } links