Improved architecute
further abstracting away the runtime
This commit is contained in:
		
							
								
								
									
										9
									
								
								Editor/src/EditorContext.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										9
									
								
								Editor/src/EditorContext.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,9 @@ | ||||
| #pragma once | ||||
| struct EditorContext { | ||||
|     std::shared_ptr<Project> CurrentProject; | ||||
|     Scene MainScene; | ||||
|  | ||||
|     EditorContext() = default; | ||||
|     EditorContext(EditorContext& other) = default; | ||||
|     ~EditorContext() = default; | ||||
| }; | ||||
							
								
								
									
										70
									
								
								Editor/src/SceneRuntime.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										70
									
								
								Editor/src/SceneRuntime.h
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,70 @@ | ||||
| #pragma once | ||||
| #include "../../YoggieEngine/src/BarinkEngine.h" | ||||
| #include "../../YoggieEngine/src/AssetManager/ModelImporter.h" | ||||
| #include "../../YoggieEngine/src/Graphics/Memory/Framebuffer.h" | ||||
| #include "../../YoggieEngine/src/PerfCounter.cpp" | ||||
| #include "../../YoggieEngine/src/Scene/Entity.h" | ||||
| #include "Project.h" | ||||
|  | ||||
| class SceneRuntime : public  ApplicationRuntime { | ||||
|  | ||||
| public: | ||||
|     SceneRuntime() = default; | ||||
| 	void Start() override   | ||||
| 	{ | ||||
|         CurrentProject = std::make_shared<Project>("Random"); | ||||
|  | ||||
|         framebuffer = new Framebuffer(); | ||||
|         | ||||
|         // Create a level and load it as the current level | ||||
|         auto importer = ModelImporter(); | ||||
|  | ||||
|         // Create a cube  | ||||
|         Model = importer.Import("build/Debug/Models/Cube.obj"); | ||||
|         cube = MainScene.AddEntity("cube"); | ||||
|  | ||||
|         auto& render3DComponent = cube.AddComponent<Render3DComponent>(); | ||||
|         render3DComponent.mesh = *(Model->renderable->mesh); | ||||
|  | ||||
|         cube.GetComponent<TransformComponent>().Position = glm::vec3(1.0f, 0.0f, 5.0f); | ||||
|  | ||||
|         auto cube2 = MainScene.AddEntity("Cube1"); | ||||
|         auto& rendercube2 = cube2.AddComponent<Render3DComponent>(); | ||||
|         rendercube2.mesh = *(Model->renderable->mesh); | ||||
|  | ||||
|  | ||||
|         // create an ambient light source | ||||
|         auto AmbientLight = MainScene.AddEntity("AmbientLight"); | ||||
|         auto light = AmbientLight.AddComponent<LightComponent>(); | ||||
|         light.Color = glm::vec3(1.0f); | ||||
|         light.Strength = 1.0f; | ||||
|  | ||||
|         Selected = (entt::entity)-1; | ||||
|  | ||||
| 	} | ||||
| 	 | ||||
| 	void Update() override   | ||||
| 	{ | ||||
| 	} | ||||
|  | ||||
| 	void FixedUpdate() override  | ||||
| 	{ | ||||
| 	} | ||||
| 	 | ||||
| 	void Stop() override  | ||||
| 	{ | ||||
| 	} | ||||
|  | ||||
|  | ||||
| private: | ||||
|     std::shared_ptr<Project> CurrentProject = nullptr; | ||||
|     Scene MainScene; | ||||
|  | ||||
|     Framebuffer* framebuffer; | ||||
|     SceneObject* Model; | ||||
|     Entity cube; | ||||
|  | ||||
|  | ||||
|     entt::entity  Selected; | ||||
|     friend class Editor; | ||||
| }; | ||||
| @ -108,7 +108,7 @@ void SceneExplorer(entt::entity& selected, Scene& scene ) | ||||
|     ImGui::End(); | ||||
| } | ||||
|  | ||||
| void Viewport(Framebuffer& framebuffer, Scene& scene) { | ||||
| void Viewport(Framebuffer& framebuffer) { | ||||
|  | ||||
|     unsigned int viewportWindowFlags = ImGuiWindowFlags_NoTitleBar | ||||
|         | ImGuiWindowFlags_NoDecoration | ||||
|  | ||||
| @ -17,7 +17,7 @@ void Inspector(entt::entity entity, Scene& scene); | ||||
|  | ||||
| void SceneExplorer(entt::entity& selected, Scene& scene); | ||||
|  | ||||
| void Viewport(Framebuffer& framebuffer, Scene& scene); | ||||
| void Viewport(Framebuffer& framebuffer); | ||||
|  | ||||
| void Settings(); | ||||
|  | ||||
|  | ||||
							
								
								
									
										270
									
								
								Editor/src/app.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										270
									
								
								Editor/src/app.cpp
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,270 @@ | ||||
| #include <glm/gtc/type_ptr.hpp> | ||||
| #include <glm/gtc/matrix_transform.hpp> | ||||
| #include <imgui.h> | ||||
| #include <backends/imgui_impl_opengl3.h> | ||||
| #include <backends/imgui_impl_glfw.h> | ||||
| #include <imgui_internal.h> | ||||
| #include <nfd.h> | ||||
|  | ||||
| #include "../../libs/guizmo/ImGuizmo.h" | ||||
|  | ||||
| #include "UI/Widgets.h" | ||||
| #include "Project.h" | ||||
| #include "SceneSerializer.h" | ||||
| #include "EditorContext.h" | ||||
| #include "SceneRuntime.h" | ||||
| #include "../../YoggieEngine/src/BarinkEngine.h" | ||||
|  | ||||
| const unsigned int MS_PER_UPDATE = 2; | ||||
|  | ||||
|  | ||||
| class Editor : public Application { | ||||
| public: | ||||
|     Editor() : Application("Editor") {} | ||||
|     void Run() override | ||||
|     { | ||||
|         BarinkWindow mainWindow = BarinkWindow(1200, 700); | ||||
|          | ||||
|         InputSystem = new InputManager(); | ||||
|         renderer = new Renderer(); | ||||
|  | ||||
|         InputSystem->attach(&mainWindow); | ||||
|  | ||||
|         InitImGui(mainWindow); | ||||
|  | ||||
|         activeRuntime.Start(); | ||||
|  | ||||
|         double previous = glfwGetTime(); | ||||
|         double lag = 0.0; | ||||
|  | ||||
|         renderer->Prepare(activeRuntime.MainScene); | ||||
|  | ||||
|         while (!mainWindow.WindowShouldClose()) | ||||
|         { | ||||
|  | ||||
|             double current = glfwGetTime(); | ||||
|             double elapsed = current - previous; | ||||
|             previous = current; | ||||
|             lag += elapsed; | ||||
|  | ||||
|             InputSystem->PollEvents(); | ||||
|  | ||||
|             while (lag >= MS_PER_UPDATE)  | ||||
|             { | ||||
|                 activeRuntime.Update(); | ||||
|                 lag -= MS_PER_UPDATE; | ||||
|             } | ||||
|  | ||||
|             renderer->Render(activeRuntime.framebuffer, activeRuntime.MainScene); | ||||
|              | ||||
|             ImGuiBegin(); | ||||
|             RenderGUI(); | ||||
|             ImGuiEnd(); | ||||
|  | ||||
|             mainWindow.SwapBuffers(); | ||||
|             glClear(GL_COLOR_BUFFER_BIT| GL_DEPTH_BUFFER_BIT); | ||||
|  | ||||
|  | ||||
|         } | ||||
|  | ||||
|         activeRuntime.Stop(); | ||||
|  | ||||
|         delete InputSystem; | ||||
|         delete renderer; | ||||
|  | ||||
|         ImGui_ImplOpenGL3_Shutdown(); | ||||
|         ImGui_ImplGlfw_Shutdown(); | ||||
|         ImGui::DestroyContext(); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     void InitImGui(BarinkWindow& window )  | ||||
|     { | ||||
|         IMGUI_CHECKVERSION(); | ||||
|         ImGui::CreateContext(); | ||||
|         ImGuiIO& io = ImGui::GetIO(); | ||||
|         io.ConfigFlags |= ImGuiConfigFlags_::ImGuiConfigFlags_ViewportsEnable; | ||||
|         io.ConfigFlags |= ImGuiConfigFlags_::ImGuiConfigFlags_DockingEnable; | ||||
|         io.Fonts->AddFontFromFileTTF("build/Debug/Fonts/Roboto-Regular.ttf", 18); | ||||
|  | ||||
|  | ||||
|         ImGui::StyleColorsDark(); | ||||
|  | ||||
|         ImGui_ImplGlfw_InitForOpenGL(window.windowptr(), true); | ||||
|         ImGui_ImplOpenGL3_Init("#version 440"); | ||||
|  | ||||
|  | ||||
|     } | ||||
|  | ||||
|     void ImGuiBegin() { | ||||
|         ImGui_ImplGlfw_NewFrame(); | ||||
|         ImGui_ImplOpenGL3_NewFrame(); | ||||
|  | ||||
|         ImGui::NewFrame(); | ||||
|  | ||||
|         ImGuizmo::SetOrthographic(true); | ||||
|         ImGuizmo::BeginFrame(); | ||||
|  | ||||
|     } | ||||
|  | ||||
|     void ImGuiEnd() { | ||||
|         ImGui::EndFrame(); | ||||
|  | ||||
|  | ||||
|         ImGui::Render(); | ||||
|         ImGui_ImplOpenGL3_RenderDrawData(ImGui::GetDrawData()); | ||||
|  | ||||
|         if (ImGui::GetIO().ConfigFlags & ImGuiConfigFlags_ViewportsEnable) | ||||
|         { | ||||
|             GLFWwindow* last_context = glfwGetCurrentContext(); | ||||
|             ImGui::UpdatePlatformWindows(); | ||||
|             ImGui::RenderPlatformWindowsDefault(); | ||||
|             glfwMakeContextCurrent(last_context); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|  | ||||
|     void RenderGUI() { | ||||
|         ImGui::DockSpaceOverViewport(ImGui::GetMainViewport()); | ||||
|  | ||||
|         // Show a menu bar | ||||
|  | ||||
|         ImGui::BeginMainMenuBar(); | ||||
|  | ||||
|         if (ImGui::BeginMenu("Application")) { | ||||
|  | ||||
|             if (ImGui::MenuItem("Load Project")) | ||||
|             { | ||||
|                 nfdresult_t result = NFD_OpenDialog({ "yproj" }, NULL, &path); | ||||
|                 switch (result) { | ||||
|                 case(NFD_OKAY): | ||||
|                     Project::LoadProject(path, activeRuntime.CurrentProject); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (ImGui::MenuItem("Save project as...")) { | ||||
|                 nfdresult_t result = NFD_SaveDialog({ "yproj" }, NULL, &savePath); | ||||
|                 switch (result) { | ||||
|                 case(NFD_OKAY): | ||||
|                     std::cout << "Save as: " << savePath << std::endl; | ||||
|                     Project::SaveProject(savePath, *activeRuntime.CurrentProject.get()); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|                 } | ||||
|             } | ||||
|  | ||||
|  | ||||
|  | ||||
|             if (ImGui::MenuItem("Preferences")) | ||||
|             { | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (ImGui::MenuItem("Exit")) | ||||
|             { | ||||
|                 // TODO: Exit application | ||||
|             } | ||||
|  | ||||
|             ImGui::EndMenu(); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         if (ImGui::BeginMenu("Scene")) { | ||||
|  | ||||
|             if (ImGui::MenuItem("Save scene")) | ||||
|             { | ||||
|                 nfdresult_t result = NFD_SaveDialog({ "yscene" }, NULL, &scenePath); | ||||
|                 switch (result) { | ||||
|                 case(NFD_OKAY): | ||||
|                     SaveScene(scenePath,  activeRuntime.MainScene); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (ImGui::MenuItem("Load scene")) | ||||
|             { | ||||
|                 auto result = NFD_OpenDialog({ "yscene" }, NULL, &openScenePath); | ||||
|                 switch (result) { | ||||
|                 case (NFD_OKAY): | ||||
|                    LoadScene(openScenePath, activeRuntime.MainScene); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|                 } | ||||
|  | ||||
|             } | ||||
|  | ||||
|             if (ImGui::MenuItem("Add Entity")) { | ||||
|                 activeRuntime.MainScene.AddEntity("New Entity"); | ||||
|             } | ||||
|  | ||||
|             ImGui::EndMenu(); | ||||
|         } | ||||
|  | ||||
|  | ||||
|         ImGui::EndMainMenuBar(); | ||||
|  | ||||
|         ImGui::Begin("ProjectInfo"); | ||||
|         ImGui::Text("Project: %s", activeRuntime.CurrentProject.get()->GetName().c_str()); | ||||
|         ImGui::Text("Directory: %s", activeRuntime.CurrentProject.get()->GetProjectDirectory().u8string().c_str()); | ||||
|         ImGui::End(); | ||||
|  | ||||
|  | ||||
|         //ShowStats(); | ||||
|         Viewport(*activeRuntime.framebuffer); | ||||
|         SceneExplorer(activeRuntime.Selected, activeRuntime.MainScene); | ||||
|         Inspector(activeRuntime.Selected, activeRuntime.MainScene); | ||||
|  | ||||
|         Settings(); | ||||
|         AssetsFinder(); | ||||
|         Console(); | ||||
|  | ||||
|         ImGui::ShowDemoWindow(); | ||||
|         ImGui::ShowMetricsWindow(); | ||||
|  | ||||
|     } | ||||
|  | ||||
|  | ||||
| private: | ||||
|     EditorContext context; | ||||
|     SceneRuntime activeRuntime ; | ||||
|     char* path = nullptr; | ||||
|     char* savePath = nullptr; | ||||
|     char* scenePath = nullptr; | ||||
|     char* openScenePath = nullptr; | ||||
|  | ||||
|  | ||||
| }; | ||||
|  | ||||
| int main (int argc , char* argv[]) { | ||||
|  | ||||
|     Editor().Run(); | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
|  | ||||
| @ -1,242 +0,0 @@ | ||||
| #include <glm/gtc/type_ptr.hpp> | ||||
| #include <glm/gtc/matrix_transform.hpp> | ||||
| #include <imgui.h> | ||||
| #include <imgui_internal.h> | ||||
| #include <nfd.h> | ||||
|  | ||||
| #include "../../libs/guizmo/ImGuizmo.h" | ||||
| #include "../../YoggieEngine/src/BarinkEngine.h" | ||||
| #include "../../YoggieEngine/src/AssetManager/ModelImporter.h" | ||||
| #include "../../YoggieEngine/src/Graphics/Memory/Framebuffer.h" | ||||
| #include "../../YoggieEngine/src/PerfCounter.cpp" | ||||
| #include "../../YoggieEngine/src/Scene/Entity.h" | ||||
| #include "UI/Widgets.h" | ||||
| #include "Project.h" | ||||
| #include "SceneSerializer.h" | ||||
|  | ||||
|  | ||||
|  | ||||
| using namespace YoggieEngine; | ||||
| /* | ||||
| * Define globals | ||||
| */ | ||||
|  | ||||
| struct EditorContext  { | ||||
|     Project CurrentProject; | ||||
|     Scene MainScene; | ||||
|  | ||||
|     EditorContext() = default; | ||||
|     EditorContext(EditorContext& other) = default; | ||||
|     ~EditorContext() = default; | ||||
| }; | ||||
|  | ||||
| std::shared_ptr<Project> CurrentProject; | ||||
| Scene MainScene; | ||||
|  | ||||
| Framebuffer* framebuffer; | ||||
| SceneObject* Model; | ||||
| Entity cube; | ||||
|  | ||||
|  | ||||
| entt::entity  Selected; | ||||
|  | ||||
| /* | ||||
| * Runs once at startup | ||||
| * - USe to initialize the game/sandbox/demo | ||||
| */ | ||||
| void Start() { | ||||
|  | ||||
|     CurrentProject = std::make_shared<Project>("Random"); | ||||
|     auto io = ImGui::GetIO(); | ||||
|     io.Fonts->AddFontFromFileTTF("build/Debug/Fonts/Roboto-Regular.ttf", 18); | ||||
|   | ||||
|     framebuffer = new Framebuffer(); | ||||
|  | ||||
|  | ||||
|     // Create a level and load it as the current level | ||||
|     auto importer = ModelImporter(); | ||||
|      | ||||
|     // Create a cube  | ||||
|     Model = importer.Import("build/Debug/Models/Cube.obj"); | ||||
|     cube = MainScene.AddEntity("cube"); | ||||
|      | ||||
|     auto& render3DComponent = cube.AddComponent<Render3DComponent>(); | ||||
|     render3DComponent.mesh = *(Model->renderable->mesh); | ||||
|  | ||||
|     cube.GetComponent<TransformComponent>().Position = glm::vec3(1.0f, 0.0f, 5.0f); | ||||
|      | ||||
|     auto cube2 = MainScene.AddEntity("Cube1"); | ||||
|     auto& rendercube2 = cube2.AddComponent<Render3DComponent>(); | ||||
|     rendercube2.mesh = *(Model->renderable->mesh); | ||||
|  | ||||
|  | ||||
|     // create an ambient light source | ||||
|     auto AmbientLight = MainScene.AddEntity("AmbientLight"); | ||||
|     auto light = AmbientLight.AddComponent<LightComponent>(); | ||||
|     light.Color = glm::vec3(1.0f); | ||||
|     light.Strength = 1.0f; | ||||
|  | ||||
|     Selected = (entt::entity) -1; | ||||
|  | ||||
|     renderer.Prepare(MainScene); | ||||
| } | ||||
|  | ||||
|  | ||||
| char* path = nullptr; | ||||
| char* savePath = nullptr; | ||||
| char* scenePath = nullptr; | ||||
| char* openScenePath = nullptr; | ||||
| /* | ||||
| * Runs every frame | ||||
| * - Use to draw Immediate mode graphics (Not meant for HUD's ) | ||||
| */ | ||||
| void ImmediateGraphicsDraw() | ||||
| {   ImGui::DockSpaceOverViewport(ImGui::GetMainViewport()); | ||||
|       | ||||
|     // Show a menu bar | ||||
|  | ||||
|     ImGui::BeginMainMenuBar(); | ||||
|  | ||||
|     if (ImGui::BeginMenu("Application")) { | ||||
|  | ||||
|         if (ImGui::MenuItem("Load Project"))  | ||||
|         { | ||||
|             nfdresult_t result = NFD_OpenDialog({ "yproj" }, NULL, &path); | ||||
|                 switch (result) { | ||||
|                 case(NFD_OKAY): | ||||
|                     Project::LoadProject( path, CurrentProject); | ||||
|                     break; | ||||
|                 case(NFD_CANCEL): | ||||
|                     break; | ||||
|                 case(NFD_ERROR): | ||||
|                     std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                     break; | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|         if (ImGui::MenuItem("Save project as...")) { | ||||
|             nfdresult_t result = NFD_SaveDialog({ "yproj" }, NULL, &savePath); | ||||
|             switch (result) { | ||||
|             case(NFD_OKAY): | ||||
|                 std::cout << "Save as: " << savePath << std::endl; | ||||
|                 Project::SaveProject(savePath, *CurrentProject.get()); | ||||
|                 break; | ||||
|             case(NFD_CANCEL): | ||||
|                 break; | ||||
|             case(NFD_ERROR): | ||||
|                 std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                 break; | ||||
|             } | ||||
|         } | ||||
|  | ||||
|  | ||||
|  | ||||
|         if (ImGui::MenuItem("Preferences")) | ||||
|         { | ||||
|  | ||||
|         } | ||||
|  | ||||
|         if (ImGui::MenuItem("Exit")) | ||||
|         { | ||||
|             // TODO: Exit application | ||||
|         } | ||||
|  | ||||
|         ImGui::EndMenu(); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     if (ImGui::BeginMenu("Scene")) { | ||||
|  | ||||
|         if (ImGui::MenuItem("Save scene")) | ||||
|         { | ||||
|             nfdresult_t result= NFD_SaveDialog({"yscene"},NULL, &scenePath); | ||||
|             switch (result) { | ||||
|             case(NFD_OKAY): | ||||
|                 SaveScene(scenePath, MainScene); | ||||
|                 break; | ||||
|             case(NFD_CANCEL): | ||||
|                 break; | ||||
|             case(NFD_ERROR): | ||||
|                 std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                 break; | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|         if (ImGui::MenuItem("Load scene")) | ||||
|         { | ||||
|             auto result = NFD_OpenDialog({ "yscene" }, NULL, &openScenePath); | ||||
|             switch (result) { | ||||
|             case (NFD_OKAY): | ||||
|                 LoadScene(openScenePath, MainScene); | ||||
|                 break; | ||||
|             case(NFD_CANCEL): | ||||
|                 break; | ||||
|             case(NFD_ERROR): | ||||
|                 std::cout << "NFD_Error: " << NFD_GetError() << std::endl; | ||||
|                 break; | ||||
|             } | ||||
|  | ||||
|         } | ||||
|  | ||||
|         if (ImGui::MenuItem("Add Entity")) { | ||||
|             MainScene.AddEntity("New entity"); | ||||
|         } | ||||
|  | ||||
|         ImGui::EndMenu(); | ||||
|     } | ||||
|  | ||||
|  | ||||
|     ImGui::EndMainMenuBar(); | ||||
|  | ||||
|     ImGui::Begin("ProjectInfo"); | ||||
|     ImGui::Text("Project: %s", CurrentProject.get()->GetName().c_str()); | ||||
|     ImGui::Text("Directory: %s", CurrentProject.get()->GetProjectDirectory().u8string().c_str()); | ||||
|     ImGui::End(); | ||||
|  | ||||
|  | ||||
|     //ShowStats(); | ||||
|     Viewport(*framebuffer, MainScene); | ||||
|     SceneExplorer(Selected, MainScene); | ||||
|     Inspector(Selected, MainScene ); | ||||
|  | ||||
|     Settings(); | ||||
|     AssetsFinder(); | ||||
|     Console(); | ||||
|  | ||||
|     ImGui::ShowDemoWindow(); | ||||
|     ImGui::ShowMetricsWindow(); | ||||
|     | ||||
|  | ||||
| } | ||||
|  | ||||
| void Render()  | ||||
| { | ||||
|     renderer.Render( *framebuffer, MainScene); | ||||
| } | ||||
|  | ||||
| /* | ||||
| * Runs every frame | ||||
| * - Meant for game logic ( non-physics related) | ||||
| */ | ||||
| void Update() | ||||
| { | ||||
| } | ||||
|  | ||||
| /* | ||||
| * Runs every physics update | ||||
| */ | ||||
| void fixed_update()  | ||||
| { | ||||
|      | ||||
| } | ||||
|  | ||||
| /* | ||||
| * Runs at the end of the program | ||||
| * - Meant for cleanup | ||||
| */ | ||||
| void Stop() | ||||
| { | ||||
|     delete framebuffer; | ||||
| } | ||||
		Reference in New Issue
	
	Block a user