#include "core/engine.h" #include #include #include #include "input/input.h" #include "component_manager.h" #include "components/transform.h" #include "components/mesh_filter.h" #include "graphics/renderer.h" #include "scene/3d/node_3d.h" #include "utils/file.h" #include "scene/3d/mesh_instance_3d.h" ///////////////////////////////////////////////////////// // Main function ///////////////////////////////////////////////////////// int main(void) { // Initialize engine PtrUnq &engine = Engine::GetInstance(); if (!engine) exit(1); // Main loop engine->run(); return 0; } ///////////////////////////////////////////////////////// PtrUnq Engine::Instance; Engine::~Engine() { irqSet(IRQ_VBLANK, nullptr); } PtrUnq &Engine::GetInstance() { if (!Instance) Instance = PtrUnq(new Engine()); return Instance; } void Engine::run() { Renderer::GetInstance(); // TEST ------------------------ // Create a MeshInstance3D PtrShr meshInstance = NewNode("meshes/mococo/mococo.obj"); // PtrShr meshIPnstance = // NewNode("meshes/cube/cube-tex.obj"); // PtrShr meshInstance = // NewNode("meshes/quad/quad.obj"); // ----------------------------- while (pmMainLoop()) { processInput(); update(); render(); } } void Engine::processInput() { Input::Update(); } void Engine::update() { // Update if (Input::IsButtonDown(EButton::A)) { iprintf("A button pressed\n"); } } void Engine::render() { if (!ComponentManager::GetInstance()) return; PtrUnq &renderer = Renderer::GetInstance(); renderer->beginFrame(); auto view = ComponentManager::GetInstance()->view(); for (auto &[entity, transform, meshFilter] : view) { renderer->render(*transform, *meshFilter); } renderer->endFrame(); swiWaitForVBlank(); } Engine::Engine() { // Initialize nitroFS char nitroFSPath[] = {"assets"}; char *nitroFSPathptr = nitroFSPath; if (!nitroFSInit(&nitroFSPathptr)) exit(-1); }