diff --git a/src/entities/Camera.h b/src/entities/Camera.h index 6f6fe0a..a47af65 100644 --- a/src/entities/Camera.h +++ b/src/entities/Camera.h @@ -1,5 +1,5 @@ #pragma once - +#include #include #include diff --git a/src/gui/gui_interactable.cpp b/src/gui/gui_interactable.cpp index d96250c..4681554 100644 --- a/src/gui/gui_interactable.cpp +++ b/src/gui/gui_interactable.cpp @@ -1,3 +1,4 @@ +#include #include #include "gui_interactable.h" diff --git a/src/main.cpp b/src/main.cpp index 86ccdc0..a2b49ce 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -3,6 +3,7 @@ #include #define STB_IMAGE_IMPLEMENTATION #include +#include #include "stb_image.h" #include @@ -16,9 +17,9 @@ #include "renderEngine/renderer.h" #include "shaders/entity_shader.h" #include "toolbox/toolbox.h" -#include "entities/collision_entity.h" -#include "entities/player.h" -#include "collision/collision_handler.h" +#include "scenes/scene.h" +#include "scenes/in_Game_Scene.h" +#include "scenes/startup_Scene.h" #pragma comment(lib, "glfw3.lib") #pragma comment(lib, "glew32s.lib") @@ -27,7 +28,7 @@ static double UpdateDelta(); static GLFWwindow* window; - +scene::Scene* current_scene; int main(void) { @@ -45,96 +46,51 @@ int main(void) glGetError(); #pragma endregion - glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int scancode, int action, int mods) - { - if (key == GLFW_KEY_ESCAPE) - glfwSetWindowShouldClose(window, true); - }); - - - models::RawModel raw_model = render_engine::LoadObjModel("res/House.obj"); - models::ModelTexture texture = { render_engine::loader::LoadTexture("res/Texture.png") }; - texture.shine_damper = 10; - texture.reflectivity = 0; - models::TexturedModel model = { raw_model, texture }; - - // load and add some models (in this case some level sections) to the entities list. - std::vector entities; - std::vector collision_entities; - - // int z = 0; - // for (int i = 0; i < 5; ++i) - // { - // entities.push_back(entities::Entity(model, glm::vec3(0, -50, -50 - z), glm::vec3(0, 90, 0), 20)); - // z += (raw_model.model_size.x * 20); - // } - - std::vector lights; - lights.push_back(entities::Light(glm::vec3(0, 1000, -7000), glm::vec3(5, 5, 5))); - lights.push_back(entities::Light(glm::vec3(0, 0, -30), glm::vec3(2, 0, 2), glm::vec3(0.0001f, 0.0001f, 0.0001f))); - lights.push_back(entities::Light(glm::vec3(0, 0, -200), glm::vec3(0, 2, 0), glm::vec3(0.0001f, 0.0001f, 0.0001f))); - - - // Collision testing - entities::Player player(model, glm::vec3(0, 0, 0), glm::vec3(0, 0, 0), 1, { {0, 0, 0}, raw_model.model_size }); - entities.push_back(&player); - collision_entities.push_back(&player); - - entities::Player2 player2(model, glm::vec3(50, 0, 0), glm::vec3(0, 0, 0), 1, { {50, 0, 0}, raw_model.model_size }); - entities.push_back(&player2); - collision_entities.push_back(&player2); - - - shaders::EntityShader shader; - shader.Init(); - render_engine::renderer::Init(shader); - - entities::Camera camera(glm::vec3(40, 10, 80), glm::vec3(0, 0, 0)); + current_scene = new scene::Startup_Scene(); - + + glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int scancode, int action, int mods) + { + current_scene->onKey(window, key, scancode, action, mods); + if (key == GLFW_KEY_ESCAPE) + glfwSetWindowShouldClose(window, true); + }); + + bool window_open = true; // Main game loop - while (!glfwWindowShouldClose(window)) + while (!glfwWindowShouldClose(window) && window_open) { - // Update + //Update const double delta = UpdateDelta(); - camera.Move(window); + scene::Scenes return_value = current_scene->start(window); + delete current_scene; - player.Update(); - player2.Update(); + switch (return_value) { + case scene::Scenes::STOP: + window_open = false; + break; - collision::CheckCollisions(collision_entities); - + case scene::Scenes::STARTUP: + current_scene = new scene::Startup_Scene(); + break; - // Render - render_engine::renderer::Prepare(); - - // Start rendering the entities - shader.Start(); - shader.LoadSkyColor(render_engine::renderer::SKY_COLOR); - shader.LoadLights(lights); - shader.LoadViewMatrix(camera); - - // Renders each entity in the entities list - for (entities::Entity* entity : entities) - { - render_engine::renderer::Render(*entity, shader); - } + case scene::Scenes::INGAME: + current_scene = new scene::In_Game_Scene(); + break; - // Stop rendering the entities - shader.Stop(); - - // Finish up - glfwSwapBuffers(window); - glfwPollEvents(); + default: + std::cout << "Wrong return value!!! ->" << std::endl; + break; + } } - // Clean up - shader.CleanUp(); - render_engine::loader::CleanUp(); + // Clean up -> preventing memory leaks!!! + std::cout << "ending..." << std::endl; + delete current_scene; glfwTerminate(); return 0; } @@ -146,4 +102,4 @@ static double UpdateDelta() double delt_time = current_time - last_frame_time; last_frame_time = current_time; return delt_time; -} \ No newline at end of file +} diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp new file mode 100644 index 0000000..0e7c268 --- /dev/null +++ b/src/scenes/in_Game_Scene.cpp @@ -0,0 +1,118 @@ +#include +#include +#include +#include "in_Game_Scene.h" +#include "startup_Scene.h" +#include "../gui/gui_interactable.h" +#include "../models/model.h" +#include "../renderEngine/loader.h" +#include "../renderEngine/obj_loader.h" +#include "../renderEngine/renderer.h" +#include "../shaders/entity_shader.h" +#include "../toolbox/toolbox.h" + + +namespace scene +{ + std::vector entities; + std::vector lights; + models::RawModel raw_model; + models::ModelTexture texture; + shaders::EntityShader *shader; + shaders::GuiShader *gui_shader; + entities::Camera camera(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0)); + std::vector guis; + + + In_Game_Scene::In_Game_Scene() + { + shader = new shaders::EntityShader; + shader->Init(); + render_engine::renderer::Init(*shader); + + gui_shader = new shaders::GuiShader(); + gui_shader->Init(); + } + + scene::Scenes scene::In_Game_Scene::start(GLFWwindow* window) + { + raw_model = render_engine::LoadObjModel("res/House.obj"); + texture = { render_engine::loader::LoadTexture("res/Texture.png") }; + texture.shine_damper = 10; + texture.reflectivity = 0; + models::TexturedModel model = { raw_model, texture }; + + int z = 0; + for (int i = 0; i < 5; ++i) + { + entities.push_back(entities::Entity(model, glm::vec3(0, -50, -50 - z), glm::vec3(0, 90, 0), 20)); + z += (raw_model.model_size.x * 20); + } + + lights.push_back(entities::Light(glm::vec3(0, 1000, -7000), glm::vec3(5, 5, 5))); + lights.push_back(entities::Light(glm::vec3(0, 0, -30), glm::vec3(2, 0, 2), glm::vec3(0.0001f, 0.0001f, 0.0001f))); + lights.push_back(entities::Light(glm::vec3(0, 0, -200), glm::vec3(0, 2, 0), glm::vec3(0.0001f, 0.0001f, 0.0001f))); + + // GUI stuff + gui::Button button(render_engine::loader::LoadTexture("res/Mayo.png"), glm::vec2(0.5f, 0.0f), glm::vec2(0.25f, 0.25f)); + button.SetHoverTexture(render_engine::loader::LoadTexture("res/Texture.png")); + button.SetClickedTexture(render_engine::loader::LoadTexture("res/Mayo.png")); + button.SetOnClickAction([]() + { + std::cout << "I got clicked on!" << std::endl; + }); + guis.push_back(&button); + + + while (return_value == scene::Scenes::INGAME) + { + update(window); + button.Update(window); + render(); + + glfwSwapBuffers(window); + glfwPollEvents(); + } + shader->CleanUp(); + gui_shader->CleanUp(); + render_engine::loader::CleanUp(); + return return_value; + } + + void scene::In_Game_Scene::render() + { + // Render + render_engine::renderer::Prepare(); + + shader->Start(); + shader->LoadSkyColor(render_engine::renderer::SKY_COLOR); + shader->LoadLights(lights); + shader->LoadViewMatrix(camera); + + // Renders each entity in the entities list + for (entities::Entity& entity : entities) + { + render_engine::renderer::Render(entity, *shader); + } + + // Render GUI items + render_engine::renderer::Render(guis, *gui_shader); + + // Stop rendering the entities + shader->Stop(); + } + + void scene::In_Game_Scene::update(GLFWwindow* window) + { + camera.Move(window); + } + + void scene::In_Game_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods) + { + if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) + { + return_value = scene::Scenes::STOP; + } + } + +} diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h new file mode 100644 index 0000000..4581855 --- /dev/null +++ b/src/scenes/in_Game_Scene.h @@ -0,0 +1,22 @@ +#pragma once +#include "scene.h" + +namespace scene +{ + + class In_Game_Scene : public scene::Scene + { + private: + scene::Scenes return_value = scene::Scenes::INGAME; + + public: + In_Game_Scene(); + + Scenes start(GLFWwindow* window) override; + void render() override; + void update(GLFWwindow* window) override; + void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override; + }; +} + + diff --git a/src/scenes/scene.cpp b/src/scenes/scene.cpp new file mode 100644 index 0000000..7183938 --- /dev/null +++ b/src/scenes/scene.cpp @@ -0,0 +1,7 @@ +#include "scene.h" + +namespace scene +{ + +} + diff --git a/src/scenes/scene.h b/src/scenes/scene.h new file mode 100644 index 0000000..a4d07bd --- /dev/null +++ b/src/scenes/scene.h @@ -0,0 +1,31 @@ +#pragma once +#include +#include +#include + + +namespace scene { + + enum class Scenes + { + STARTUP, + INGAME, + GAMEOVER, + CALIBRATION, + STOP + }; + + class Scene + { + public: + virtual Scenes start(GLFWwindow* window) = 0; + virtual void render() = 0; + virtual void update(GLFWwindow* window) = 0; + virtual void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) {}; + + }; + + +} + + diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp new file mode 100644 index 0000000..fe67b0f --- /dev/null +++ b/src/scenes/startup_Scene.cpp @@ -0,0 +1,40 @@ +#include +#include +#include +#include "startup_Scene.h" + +namespace scene +{ + + scene::Scenes scene::Startup_Scene::start(GLFWwindow *window) + { + while (return_value == scene::Scenes::STARTUP) + { + render(); + update(window); + + glfwSwapBuffers(window); + glfwPollEvents(); + } + + return return_value; + } + + void scene::Startup_Scene::render() + { + + } + + void scene::Startup_Scene::update(GLFWwindow* window) + { + + } + + void scene::Startup_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods) + { + if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) + { + return_value = scene::Scenes::INGAME; + } + } +} diff --git a/src/scenes/startup_Scene.h b/src/scenes/startup_Scene.h new file mode 100644 index 0000000..277a750 --- /dev/null +++ b/src/scenes/startup_Scene.h @@ -0,0 +1,22 @@ +#pragma once +#include "scene.h" +#include + +namespace scene +{ + extern GLFWwindow* window; + + class Startup_Scene : public scene::Scene + { + private: + scene::Scenes return_value = scene::Scenes::STARTUP; + + public: + Scenes start(GLFWwindow* window) override; + void render() override; + void update(GLFWwindow* window) override; + void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override; + }; +} + + diff --git a/src/shaders/shader_program.cpp b/src/shaders/shader_program.cpp index c02c73b..6feb2d9 100644 --- a/src/shaders/shader_program.cpp +++ b/src/shaders/shader_program.cpp @@ -1,4 +1,5 @@ #include +#include #include #include #include diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index 012e9bb..9b55093 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -20,6 +20,8 @@ + + @@ -32,10 +34,13 @@ + + + @@ -52,6 +57,7 @@ + 16.0 diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 5d59244..695a96e 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -48,6 +48,15 @@ Source Files + + Source Files + + + Source Files + + + Source Files + Source Files @@ -98,6 +107,15 @@ Header Files + + Header Files + + + Header Files + + + Header Files + Header Files