diff --git a/src/main.cpp b/src/main.cpp index 47b84d6..69298a3 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -23,15 +23,17 @@ #include "components/light.h" #include "components/camera.h" #include "components/mesh.h" +#include "components/rotate.h" +#include "components/batch.h" class Game : public IApplication { public: - Game() { + Game() : m_renderer(m_registry) { Object* lightObj = Object::LoadFile("./assets/sphere.obj"); const auto lght = m_registry.create(); m_registry.emplace(lght, glm::vec3(5.f, 5.f, 5.f), glm::vec3(0.f)); m_registry.emplace(lght, light::LightType::DIRECTIONAL, glm::vec3(1.f, 1.f, 1.f), 1.5f); - m_registry.emplace(lght, std::unique_ptr(lightObj)); + m_registry.emplace(lght, std::shared_ptr(lightObj)); const auto cameraEntity = m_registry.create(); m_registry.emplace(cameraEntity, glm::vec3(0.f, 2.f, 2.f)); @@ -40,17 +42,36 @@ public: Object* targetObj = Object::LoadFile("./assets/wizard/wizard.obj"); const auto targetEntity = m_registry.create(); m_registry.emplace(targetEntity, glm::vec3(0.f, 0.0f, 0.f)); - m_registry.emplace(targetEntity, std::unique_ptr(targetObj)); + m_registry.emplace(targetEntity, std::shared_ptr(targetObj)); - Object* cubeObj = Object::LoadFile("./assets/grass_block/grass_block.obj"); + Object* grass = Object::LoadFile("./assets/grass_block/grass_block.obj"); const auto cubeEntity = m_registry.create(); m_registry.emplace(cubeEntity, glm::vec3(-1.5f, 0.4f, 0.f)); - m_registry.emplace(cubeEntity, std::unique_ptr(cubeObj)); + m_registry.emplace(cubeEntity, std::shared_ptr(grass)); + + // Cube template (use shared object to avoid reloading 1000 times) + std::shared_ptr cubeObj = std::shared_ptr(Object::LoadFile("./assets/grass_block/grass_block.obj")); + const auto batchEntt = m_registry.create(); + m_registry.emplace(batchEntt); + m_registry.emplace(batchEntt, cubeObj); + auto cubeBatch = m_registry.get(batchEntt); + // Generate 1000 random cubes + for (int i = 0; i < 1000; ++i) { + const auto cubeEntity = m_registry.create(); + + float x = static_cast(rand()) / RAND_MAX * 200.f - 100.f; // range [-100, 100] + float y = static_cast(rand()) / RAND_MAX * 10.f; // range [0, 10] + float z = static_cast(rand()) / RAND_MAX * 200.f - 100.f; // range [-100, 100] + + m_registry.emplace(cubeEntity, glm::vec3(x, y, z)); + m_registry.emplace(cubeEntity); + m_registry.emplace(cubeEntity, cubeBatch.id()); + } Object* floorObj = Object::LoadFile("./assets/plane.obj"); const auto floorEntt = m_registry.create(); m_registry.emplace(floorEntt, glm::vec3(0.f)); - m_registry.emplace(floorEntt, std::unique_ptr(floorObj)); + m_registry.emplace(floorEntt, std::shared_ptr(floorObj)); } ~Game() override {} @@ -69,7 +90,8 @@ public: m_startTicks = SDL_GetTicks(); m_frameCount = 0; - m_renderer.GenerateShadowMaps(m_registry); + m_renderer.Init(); + m_renderer.GenerateShadowMaps(); } void OnWindowResized(const WindowResized& event) override { @@ -165,17 +187,17 @@ public: } } - // auto rotateEntts = m_registry.view(); - // for (auto [entity, transform, mesh] : rotateEntts.each()) { - // // auto targetTransform = rotateEntts.get(entity); - // if (!m_registry.all_of(entity)) { - // transform.rotation.y = m_angle; - // } - // } + auto rotateEntts = m_registry.view(); + for (auto [entity, t] : rotateEntts.each()) { + // auto targetTransform = rotateEntts.get(entity); + if (!m_registry.all_of(entity)) { + t.rotation.y = m_angle; + } + } } void OnRender() override { - m_renderer.Render(m_registry); + m_renderer.Render(); m_frameCount++; m_currentTicks = SDL_GetTicks();