#pragma once #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include #include namespace sophia { class Application { public: struct Config { int width; int height; std::string name; }; Application(const Application&) = delete; Application& operator=(const Application&) = delete; explicit Application(const Config& config); virtual ~Application(); void run(); static void setCommandLineArgs(int argc, const char* const* argv); protected: virtual void onCreate() {} virtual void onUpdate(const FrameInfo& frameInfo) { (void)frameInfo; } virtual void onRender() {} virtual void onDestroy() {} ResourceRegistryRef resources(); PanelRegistry& panels() { return this->panelRegistry; } SceneRegistry& scenes() { return this->sceneRegistry; } SceneViewRegistry& sceneViews() { return this->sceneViewRegistry; } UI& ui() { return this->_ui; } DebugUI& debugUI() { return this->_debugUI; } Canvas canvas; Camera2D camera; std::vector args; ConsoleCommandRegistry consoleCommandRegistry; void drawMesh(MeshHandle handle, const glm::mat4& transform); private: friend class Canvas; void pushMesh(std::vector vertices, std::vector indices); void clearMeshes(); class Impl; std::unique_ptr impl; PanelRegistry panelRegistry; SceneRegistry sceneRegistry; SceneViewRegistry sceneViewRegistry; UI _ui; DebugUI _debugUI; }; } // namespace sophia #define SOPHIA_MAIN(AppType) \ int main(int argc, const char** argv) { \ std::cout << __FILE__ << "::" << __LINE__ << '\n'; \ \ sophia::Application::setCommandLineArgs(argc, argv); \ AppType app; \ app.run(); \ \ return EXIT_SUCCESS; \ }