From 692bb76164d00469fa27478cc11f26dc552cb54d Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 11 Jun 2021 12:30:47 +0200 Subject: [PATCH 01/18] [ADD] convert number to digits --- src/scenes/in_Game_Scene.cpp | 9 +++++++++ src/scenes/in_Game_Scene.h | 2 ++ src/toolbox/toolbox.cpp | 8 ++++++++ src/toolbox/toolbox.h | 10 ++++++++++ 4 files changed, 29 insertions(+) diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 0ddaad9..7ae0a49 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -270,6 +270,15 @@ namespace scene collision::CheckCollisions(collision_entities); update_hand_detection(); + std::vector res; + toolbox::GetDigitsFromNumber(1234567890, res); + std::cout << "number 1234567890 in digits: " << std::endl; + for (int i : res) + { + std::cout << i << " , "; + } + + std::cout << std::endl; } //manages the key input in the game scene diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index dfffaec..a11e33a 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -54,6 +54,8 @@ namespace scene //pause_guis is a list of components that will be rendered when the game is paused. std::vector pause_guis; + std::vector score_guis; + /** * @brief renders the objects/gui models * @param diff --git a/src/toolbox/toolbox.cpp b/src/toolbox/toolbox.cpp index a12cdc5..ffb369c 100644 --- a/src/toolbox/toolbox.cpp +++ b/src/toolbox/toolbox.cpp @@ -56,4 +56,12 @@ namespace toolbox } return min + rand() % ((max + 1) - min); } + + void GetDigitsFromNumber(int number, std::vector& result_vector) + { + if (number >= 10) + GetDigitsFromNumber(number / 10, result_vector); + + result_vector.push_back(number % 10); + } } diff --git a/src/toolbox/toolbox.h b/src/toolbox/toolbox.h index cc5d5b9..143004c 100644 --- a/src/toolbox/toolbox.h +++ b/src/toolbox/toolbox.h @@ -2,6 +2,7 @@ #include "../entities/camera.h" #include +#include namespace toolbox { @@ -78,4 +79,13 @@ namespace toolbox * @return: The random number */ int Random(const int min, const int max); + + + /** + * @brief gets the separate digits from the number. + * + * @param number the number to get the digits from + * @param result_vector the vector to hold the individual digits. + */ + void GetDigitsFromNumber(int number, std::vector& result_vector); } From 8c1191c131fefff886136d64d32c56c24637676d Mon Sep 17 00:00:00 2001 From: "DESKTOP-EBR7IVA\\kimve" Date: Fri, 11 Jun 2021 12:31:33 +0200 Subject: [PATCH 02/18] [ADD] start of number display --- src/scenes/in_Game_Scene.cpp | 10 ++++++++++ src/scenes/in_Game_Scene.h | 5 +++++ 2 files changed, 15 insertions(+) diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 0ddaad9..a81a057 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -21,6 +21,7 @@ #include #include "../computervision/HandDetectRegion.h" #include "../computervision/ObjectDetection.h" +#include #define MAX_MODEL_DEQUE_SIZE 6 // max amount of models to load at the same time #define UPCOMING_MODEL_AMOUNT 4 // how much models should be loaded in front of us @@ -264,6 +265,7 @@ namespace scene score += furniture_count_old; std::cout << "Score: " << score << std::endl; std::cout << "Funriture_count_old in model (house excluded): " << furniture_count_old << std::endl; + DrawScore(); } // remember the position at which the new model was added last_model_pos = model_pos; @@ -320,4 +322,12 @@ namespace scene { render_engine::renderer::Render(pause_guis, *gui_shader); } + + void In_Game_Scene::DrawScore(cv::Mat& output_frame) + { + cv::rectangle(output_frame, cv::Rect(0, 0, 30, 40), cv::Scalar(0, 0, 0), -1); + cv::putText(output_frame, "Score: ", cv::Point(0, 0), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(18, 219, 65), 2); + cv::putText(output_frame, std::to_string(score), cv::Point(5, 15), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(18, 219, 65), 2); + + } } diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index dfffaec..4c504e4 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -11,6 +11,9 @@ #include "../renderEngine/renderer.h" #include "../shaders/entity_shader.h" #include "../toolbox/toolbox.h" +#include +#include +#include namespace scene @@ -97,6 +100,8 @@ namespace scene * @return void */ void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override; + + void DrawScore(cv::Mat& output_frame); }; } From 3517d2b36a2899c96deb4226287b70a52bda4c57 Mon Sep 17 00:00:00 2001 From: Nathalie Seen Date: Fri, 11 Jun 2021 14:46:24 +0200 Subject: [PATCH 03/18] [ADD] made movement based on hand position --- src/computervision/HandDetectRegion.cpp | 3 +- src/computervision/OpenPoseVideo.cpp | 108 --------------- src/computervision/OpenPoseVideo.h | 19 --- .../async/async_arm_detection.cpp | 46 ------- .../async/async_arm_detection.h | 23 ---- src/entities/main_character.cpp | 32 ++--- src/entities/main_character.h | 3 +- src/main.cpp | 13 -- src/scenes/in_Game_Scene.cpp | 10 +- wk2_fps.vcxproj | 4 - wk2_fps.vcxproj.filters | 126 +++++------------- 11 files changed, 53 insertions(+), 334 deletions(-) delete mode 100644 src/computervision/OpenPoseVideo.cpp delete mode 100644 src/computervision/OpenPoseVideo.h delete mode 100644 src/computervision/async/async_arm_detection.cpp delete mode 100644 src/computervision/async/async_arm_detection.h diff --git a/src/computervision/HandDetectRegion.cpp b/src/computervision/HandDetectRegion.cpp index 87f3538..9725fb5 100644 --- a/src/computervision/HandDetectRegion.cpp +++ b/src/computervision/HandDetectRegion.cpp @@ -24,6 +24,7 @@ namespace computervision skin_detector.drawSkinColorSampler(camera_frame,start_x_pos,start_y_pos,region_width,region_height); // remove background from image + foreground = background_remover.getForeground(input_frame); // detect the hand contours @@ -35,7 +36,7 @@ namespace computervision //imshow("output" + region_id, frame_out); //imshow("foreground" + region_id, foreground); //imshow("handMask" + region_id, handMask); - /*imshow("handDetection", fingerCountDebug);*/ + //imshow("handDetection", fingerCountDebug); hand_present = hand_calibrator.CheckIfHandPresent(handMask,handcalibration::HandDetectionType::GAME); //std::string text = (hand_present ? "hand" : "no"); diff --git a/src/computervision/OpenPoseVideo.cpp b/src/computervision/OpenPoseVideo.cpp deleted file mode 100644 index 33527a1..0000000 --- a/src/computervision/OpenPoseVideo.cpp +++ /dev/null @@ -1,108 +0,0 @@ -#include "OpenPoseVideo.h" - -using namespace std; -using namespace cv; -using namespace cv::dnn; - -namespace computervision -{ -#define MPI - -#ifdef MPI - const int POSE_PAIRS[7][2] = - { - {0,1}, {1,2}, {2,3}, - {3,4}, {1,5}, {5,6}, - {6,7} - }; - - string protoFile = "res/pose/mpi/pose_deploy_linevec_faster_4_stages.prototxt"; - string weightsFile = "res/pose/mpi/pose_iter_160000.caffemodel"; - - int nPoints = 8; -#endif - -#ifdef COCO - const int POSE_PAIRS[17][2] = - { - {1,2}, {1,5}, {2,3}, - {3,4}, {5,6}, {6,7}, - {1,8}, {8,9}, {9,10}, - {1,11}, {11,12}, {12,13}, - {1,0}, {0,14}, - {14,16}, {0,15}, {15,17} - }; - - string protoFile = "pose/coco/pose_deploy_linevec.prototxt"; - string weightsFile = "pose/coco/pose_iter_440000.caffemodel"; - - int nPoints = 18; -#endif - Net net; - - void OpenPoseVideo::setup() { - net = readNetFromCaffe(protoFile, weightsFile); - - net.setPreferableBackend(DNN_TARGET_CPU); - } - - void OpenPoseVideo::movementSkeleton(Mat& inputImage, std::function&, cv::Mat& poinst_on_image)> f) { - std::cout << "movement skeleton start" << std::endl; - - int inWidth = 368; - int inHeight = 368; - float thresh = 0.01; - - Mat frame; - int frameWidth = inputImage.size().width; - int frameHeight = inputImage.size().height; - - double t = (double)cv::getTickCount(); - std::cout << "reading input image and blob" << std::endl; - - frame = inputImage; - Mat inpBlob = blobFromImage(frame, 1.0 / 255, Size(inWidth, inHeight), Scalar(0, 0, 0), false, false); - - std::cout << "done reading image and blob" << std::endl; - - net.setInput(inpBlob); - - std::cout << "done setting input to net" << std::endl; - Mat output = net.forward(); - std::cout << "time took to set input and forward: " << t << std::endl; - - int H = output.size[2]; - int W = output.size[3]; - - std::cout << "about to find position of boxy parts" << std::endl; - // find the position of the body parts - vector points(nPoints); - for (int n = 0; n < nPoints; n++) - { - // Probability map of corresponding body's part. - Mat probMap(H, W, CV_32F, output.ptr(0, n)); - - Point2f p(-1, -1); - Point maxLoc; - double prob; - minMaxLoc(probMap, 0, &prob, 0, &maxLoc); - if (prob > thresh) - { - p = maxLoc; - p.x *= (float)frameWidth / W; - p.y *= (float)frameHeight / H; - - circle(frame, cv::Point((int)p.x, (int)p.y), 8, Scalar(0, 255, 255), -1); - cv::putText(frame, cv::format("%d", n), cv::Point((int)p.x, (int)p.y), cv::FONT_HERSHEY_COMPLEX, 1.1, cv::Scalar(0, 0, 255), 2); - } - points[n] = p; - } - - cv::putText(frame, cv::format("time taken = %.2f sec", t), cv::Point(50, 50), cv::FONT_HERSHEY_COMPLEX, .8, cv::Scalar(255, 50, 0), 2); - std::cout << "time taken: " << t << std::endl; - //imshow("Output-Keypoints", frame); - //imshow("Output-Skeleton", frame); - std::cout << "about to call points receiving method" << std::endl; - f(points,frame); - } -} \ No newline at end of file diff --git a/src/computervision/OpenPoseVideo.h b/src/computervision/OpenPoseVideo.h deleted file mode 100644 index e05737d..0000000 --- a/src/computervision/OpenPoseVideo.h +++ /dev/null @@ -1,19 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -using namespace cv; - -namespace computervision -{ - class OpenPoseVideo{ - private: - - public: - void movementSkeleton(Mat& inputImage, std::function&, cv::Mat& poinst_on_image)> f); - void setup(); - }; -} diff --git a/src/computervision/async/async_arm_detection.cpp b/src/computervision/async/async_arm_detection.cpp deleted file mode 100644 index a43b7dc..0000000 --- a/src/computervision/async/async_arm_detection.cpp +++ /dev/null @@ -1,46 +0,0 @@ -#include -#include "async_arm_detection.h" -#include "../OpenPoseVideo.h" -#include -#include "StaticCameraInstance.h" - - -namespace computervision -{ - AsyncArmDetection::AsyncArmDetection() - { - - } - - void AsyncArmDetection::run_arm_detection(std::function, cv::Mat poinst_on_image)> points_ready_func, OpenPoseVideo op) - { - VideoCapture cap = static_camera::getCap(); - - std::cout << "STARTING THREAD LAMBDA" << std::endl; - /*cv::VideoCapture cap = static_camera::GetCap();*/ - - if (!cap.isOpened()) - { - std::cout << "capture was closed, opening..." << std::endl; - cap.open(0); - } - - while (true) - { - Mat img; - cap.read(img); - op.movementSkeleton(img, points_ready_func); - } - } - - void AsyncArmDetection::start(std::function, cv::Mat poinst_on_image)> points_ready_func, OpenPoseVideo op) - { - - std::cout << "starting function" << std::endl; - - - std::thread async_arm_detect_thread(&AsyncArmDetection::run_arm_detection,this, points_ready_func, op); - - async_arm_detect_thread.detach(); // makes sure the thread is detached from the variable. - } -} diff --git a/src/computervision/async/async_arm_detection.h b/src/computervision/async/async_arm_detection.h deleted file mode 100644 index 98fd163..0000000 --- a/src/computervision/async/async_arm_detection.h +++ /dev/null @@ -1,23 +0,0 @@ -#pragma once -#include -#include -#include -#include -#include "../OpenPoseVideo.h" -#include "StaticCameraInstance.h" - - -namespace computervision -{ - class AsyncArmDetection - { - public: - AsyncArmDetection(void); - - - void start(std::function, cv::Mat poinst_on_image)>, computervision::OpenPoseVideo op); - private: - void run_arm_detection(std::function, cv::Mat poinst_on_image)> points_ready_func, OpenPoseVideo op); - }; - -} diff --git a/src/entities/main_character.cpp b/src/entities/main_character.cpp index cdf53c7..9c8f587 100644 --- a/src/entities/main_character.cpp +++ b/src/entities/main_character.cpp @@ -19,8 +19,12 @@ namespace entities is_playing = true; } - void MainCharacter::Move(GLFWwindow* window) + void MainCharacter::Move(std::vector regions) { + computervision::HandDetectRegion* reg_left = regions.at(0); + computervision::HandDetectRegion* reg_up = regions.at(1); + computervision::HandDetectRegion* reg_right = regions.at(2); + if (is_playing) { movement_speed = -0.5f; //Forward speed adjustment, bee is moving at a standard speedrate down_speed = -1.0f; //Down speed adjustment, downspeed is difference between down_speed and UP_SPEED @@ -32,48 +36,34 @@ namespace entities //S: Go backwards //D: Go right //TODO Implement CV actions - SetRotation(glm::vec3(0, 90, 0)); - if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS) - { - movement_speed -= SIDE_SPEED; - } - - if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) - { - movement_speed += SIDE_SPEED; - } //top right - if (glfwGetKey(window, GLFW_KEY_E) == GLFW_PRESS) + if (reg_up->IsHandPresent() && reg_left->IsHandPresent()) { side_speed += SIDE_SPEED; down_speed += UP_SPEED; } //right - if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS) + if (reg_left->IsHandPresent()) { side_speed += SIDE_SPEED; } //top left - if (glfwGetKey(window, GLFW_KEY_Q) == GLFW_PRESS) + if (reg_up->IsHandPresent() && reg_right->IsHandPresent()) { down_speed += UP_SPEED; side_speed -= SIDE_SPEED; } //left - if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS) + if (reg_right->IsHandPresent()) { side_speed -= SIDE_SPEED; } - if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) + if (reg_up->IsHandPresent()) { down_speed += UP_SPEED; SetRotation(glm::vec3(10, 90, 0)); } - if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS) - { - down_speed -= UP_SPEED; - } } IncreasePosition(glm::vec3(side_speed, down_speed, movement_speed)); @@ -85,7 +75,7 @@ namespace entities else if (position.y < -40) position.y = -40; //Move player bounding box according to the position on screen MoveCollisionBox(); - if (glfwGetKey(window, GLFW_KEY_Z) == GLFW_PRESS) + if (reg_right->IsHandPresent() && reg_left->IsHandPresent()) { is_playing = true; } diff --git a/src/entities/main_character.h b/src/entities/main_character.h index d1029a2..c068f8a 100644 --- a/src/entities/main_character.h +++ b/src/entities/main_character.h @@ -2,6 +2,7 @@ #include "collision_entity.h" #include "../shaders/entity_shader.h" +#include "../computervision/HandDetectRegion.h" namespace entities { @@ -31,7 +32,7 @@ namespace entities * * @return: Vector with the adjusted side_speed, down_speed, and movement_speed */ - void Move(GLFWwindow* window); + void Move(std::vector regions); void OnCollide(const collision::Collision& collision) override; }; diff --git a/src/main.cpp b/src/main.cpp index be9e1bc..42f0253 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -29,10 +29,6 @@ #include "scenes/startup_Scene.h" #include "computervision/ObjectDetection.h" -//#include "computervision/OpenPoseImage.h" -#include "computervision/OpenPoseVideo.h" - -#include "computervision/async/async_arm_detection.h" #pragma comment(lib, "glfw3.lib") #pragma comment(lib, "glew32s.lib") @@ -47,15 +43,6 @@ scene::Scene* current_scene; bool points_img_available = false; cv::Mat points_img; -void retrieve_points(std::vector arm_points, cv::Mat points_on_image) -{ - - std::cout << "got points!!" << std::endl; - std::cout << "points: " << arm_points << std::endl; - points_img = points_on_image; - points_img_available = true; -} - int main(void) { #pragma region OPENGL_SETTINGS diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 0ddaad9..5630bcb 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -43,7 +43,7 @@ namespace scene int furniture_count_old; int score; - std::vector regions; + std::vector regions; computervision::HandDetectRegion reg_left("left", 0, 0, 150, 150), reg_right("right", 0, 0, 150, 150), reg_up("up", 0, 0, 150, 150); /** @@ -180,6 +180,9 @@ namespace scene }); pause_guis.push_back(&pause_button_quit); + regions.push_back(®_left); + regions.push_back(®_up); + regions.push_back(®_right); //the scene loop, this while loop represent the scene while (return_value == scene::Scenes::INGAME) @@ -247,8 +250,8 @@ namespace scene void scene::In_Game_Scene::update(GLFWwindow* window) { //camera.Move(window); - - main_character->Move(window); + update_hand_detection(); + main_character->Move(regions); //std::cout << "x get: " << movement.x << "\ny get: " << movement.y << "\nz get: " << movement.z << "\n"; camera->Follow(main_character->GetPosition()); @@ -269,7 +272,6 @@ namespace scene last_model_pos = model_pos; collision::CheckCollisions(collision_entities); - update_hand_detection(); } //manages the key input in the game scene diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index f9065d6..bb6e7f3 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -26,9 +26,7 @@ - - @@ -57,12 +55,10 @@ - - diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index fad9c5f..dcf7ca9 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -3,9 +3,7 @@ - - @@ -24,6 +22,10 @@ + + + + @@ -83,107 +85,15 @@ Source Files - - Source Files - - - Source Files - - - Source Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - @@ -206,6 +116,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a65f3391f7a7d015c54390ff72ccc060130b7356 Mon Sep 17 00:00:00 2001 From: "DESKTOP-EBR7IVA\\kimve" Date: Fri, 11 Jun 2021 15:32:06 +0200 Subject: [PATCH 04/18] [Add] Pointsystem works --- src/renderEngine/Renderer.cpp | 82 +++++++++++++++++++++++ src/renderEngine/Renderer.h | 17 +++++ src/scenes/in_Game_Scene.cpp | 59 +++++++++++----- src/scenes/in_Game_Scene.h | 5 +- src/toolbox/toolbox.cpp | 2 +- wk2_fps.vcxproj.filters | 122 +++++++++------------------------- 6 files changed, 176 insertions(+), 111 deletions(-) diff --git a/src/renderEngine/Renderer.cpp b/src/renderEngine/Renderer.cpp index f135200..70f2259 100644 --- a/src/renderEngine/Renderer.cpp +++ b/src/renderEngine/Renderer.cpp @@ -121,5 +121,87 @@ namespace render_engine shader.Stop(); } + + void Render(std::vector>& guis, shaders::GuiShader& shader) + { + shader.Start(); + + // Enable the VAO and the positions VBO + glBindVertexArray(quad.vao_id); + glEnableVertexAttribArray(0); + + // Enable alpha blending (for transparency in the texture) + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + // Disable depth testing to textures with transparency can overlap + glDisable(GL_DEPTH_TEST); + + // Render each gui to the screen + for (std::shared_ptr gui : guis) + { + // Bind the texture of the gui to the shader + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, gui->texture); + + glm::mat4 matrix = toolbox::CreateModelMatrix(gui->position, gui->scale); + shader.LoadModelMatrix(matrix); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, quad.vertex_count); + + std::cout << "in render method, gui x value: " << gui.get()->scale.x << std::endl; + } + + // Enable depth test again + glEnable(GL_DEPTH_TEST); + + // Disable alpha blending + glDisable(GL_BLEND); + + // Disable the VBO and VAO + glDisableVertexAttribArray(0); + glBindVertexArray(0); + + shader.Stop(); + } + + void Render(std::shared_ptr& gui, shaders::GuiShader& shader) + { + shader.Start(); + + // Enable the VAO and the positions VBO + glBindVertexArray(quad.vao_id); + glEnableVertexAttribArray(0); + + // Enable alpha blending (for transparency in the texture) + glEnable(GL_BLEND); + glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + // Disable depth testing to textures with transparency can overlap + glDisable(GL_DEPTH_TEST); + + // Render each gui to the screen + // Bind the texture of the gui to the shader + glActiveTexture(GL_TEXTURE0); + glBindTexture(GL_TEXTURE_2D, gui->texture); + + glm::mat4 matrix = toolbox::CreateModelMatrix(gui->position, gui->scale); + shader.LoadModelMatrix(matrix); + + glDrawArrays(GL_TRIANGLE_STRIP, 0, quad.vertex_count); + + + // Enable depth test again + glEnable(GL_DEPTH_TEST); + + // Disable alpha blending + glDisable(GL_BLEND); + + // Disable the VBO and VAO + glDisableVertexAttribArray(0); + glBindVertexArray(0); + + shader.Stop(); + } } } diff --git a/src/renderEngine/Renderer.h b/src/renderEngine/Renderer.h index 8a7a473..2e90e3c 100644 --- a/src/renderEngine/Renderer.h +++ b/src/renderEngine/Renderer.h @@ -40,5 +40,22 @@ namespace render_engine @param shade: The shader the GUI textures need to be rendered with */ void Render(std::vector& guis, shaders::GuiShader& shader); + + /* + * @brief: renders guis elements from a shared pointer vector + * + * @param guis: List with GUI textures to render + * @param sahde: The shader to use + */ + void Render(std::vector>& guis, shaders::GuiShader& shader); + + + /* + * @brief renders 1 gui element. + * + * @param gui: the texture to render + * @param shader: the shader to use + */ + void Render(std::shared_ptr& gui, shaders::GuiShader& shader); } } \ No newline at end of file diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 8f28727..bee93b8 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -27,7 +27,6 @@ #define UPCOMING_MODEL_AMOUNT 4 // how much models should be loaded in front of us - namespace scene { std::shared_ptrmain_character; @@ -40,6 +39,7 @@ namespace scene shaders::EntityShader* shader; shaders::GuiShader* gui_shader; std::vector guis; + std::vector> score_textures; int furniture_count_old; int score; @@ -61,7 +61,26 @@ namespace scene gui_shader = new shaders::GuiShader(); gui_shader->Init(); score = 0; + + for (int i = 0; i <= 9; i++) + { + std::shared_ptr score_pointer; + + std::string texture_path = "res/"; + texture_path += std::to_string(i); + texture_path += ".png"; + + score_pointer = std::make_unique(render_engine::loader::LoadTexture(texture_path), glm::vec2(-0.9f, 0.8f), glm::vec2(0.07, 0.15)); + + score_textures.push_back(score_pointer); + + std::cout << "Add to score_pointer: " << texture_path << std::endl; + } + + std::cout << "Size textures: " << score_textures.size() << std::endl; + } + /** * temporary!!!! * just to make some bounding boxes @@ -242,13 +261,14 @@ namespace scene // Stop rendering the entities shader->Stop(); + + DrawScore(score); } //updates certain variables void scene::In_Game_Scene::update(GLFWwindow* window) { //camera.Move(window); - main_character->Move(window); //std::cout << "x get: " << movement.x << "\ny get: " << movement.y << "\nz get: " << movement.z << "\n"; @@ -264,23 +284,16 @@ namespace scene load_chunk(model_pos + UPCOMING_MODEL_AMOUNT); score += furniture_count_old; std::cout << "Score: " << score << std::endl; - std::cout << "Funriture_count_old in model (house excluded): " << furniture_count_old << std::endl; - DrawScore(); + std::cout << "Furniture_count_old in model (house excluded): " << furniture_count_old << std::endl; + } // remember the position at which the new model was added last_model_pos = model_pos; collision::CheckCollisions(collision_entities); update_hand_detection(); - std::vector res; - toolbox::GetDigitsFromNumber(1234567890, res); - std::cout << "number 1234567890 in digits: " << std::endl; - for (int i : res) - { - std::cout << i << " , "; - } + - std::cout << std::endl; } //manages the key input in the game scene @@ -332,11 +345,21 @@ namespace scene render_engine::renderer::Render(pause_guis, *gui_shader); } - void In_Game_Scene::DrawScore(cv::Mat& output_frame) - { - cv::rectangle(output_frame, cv::Rect(0, 0, 30, 40), cv::Scalar(0, 0, 0), -1); - cv::putText(output_frame, "Score: ", cv::Point(0, 0), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(18, 219, 65), 2); - cv::putText(output_frame, std::to_string(score), cv::Point(5, 15), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(18, 219, 65), 2); - + void In_Game_Scene::DrawScore(int score) + { + std::vector digits; + score_guis.clear(); + + toolbox::GetDigitsFromNumber(score, digits); + + std::cout << "Digits size: " << digits.size() << std::endl; + + for (int i = digits.size()-1; i >= 0; i--) + { + std::cout << "Digit in digits: " << i << std::endl; + score_textures[digits[i]].get()->position.x = 0.15 * i -0.9; + render_engine::renderer::Render(score_textures[digits[i]], *gui_shader); + + } } } diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index b251a2e..656f4b3 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -57,7 +57,7 @@ namespace scene //pause_guis is a list of components that will be rendered when the game is paused. std::vector pause_guis; - std::vector score_guis; + std::vector> score_guis; /** * @brief renders the objects/gui models @@ -103,7 +103,8 @@ namespace scene */ void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override; - void DrawScore(cv::Mat& output_frame); + void DrawScore(int score); + }; } diff --git a/src/toolbox/toolbox.cpp b/src/toolbox/toolbox.cpp index ffb369c..461405c 100644 --- a/src/toolbox/toolbox.cpp +++ b/src/toolbox/toolbox.cpp @@ -1,6 +1,6 @@ #include #include "toolbox.h" - +#include namespace toolbox { glm::mat4 CreateModelMatrix(glm::vec2 translation, glm::vec2 scale) diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index fad9c5f..0b8c679 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -24,6 +24,10 @@ + + + + @@ -83,98 +87,8 @@ Source Files - - Source Files - - - Source Files - - - Source Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - - - Header Files - @@ -206,6 +120,34 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + From a6fa9514df576d90a19d9cd4d137eb162efc1c74 Mon Sep 17 00:00:00 2001 From: Nathalie Seen Date: Fri, 11 Jun 2021 16:19:21 +0200 Subject: [PATCH 05/18] [ADD] maincharacter uses deltatime for movement --- src/entities/Entity.cpp | 2 ++ src/entities/Entity.h | 2 +- src/entities/main_character.cpp | 34 +++++++++++++++++++++++---------- src/entities/main_character.h | 6 ++++-- src/scenes/in_Game_Scene.cpp | 2 +- 5 files changed, 32 insertions(+), 14 deletions(-) diff --git a/src/entities/Entity.cpp b/src/entities/Entity.cpp index f74432d..585f463 100644 --- a/src/entities/Entity.cpp +++ b/src/entities/Entity.cpp @@ -23,5 +23,7 @@ namespace entities this->rotation.y += rotation.y; this->rotation.z += rotation.z; } + + } diff --git a/src/entities/Entity.h b/src/entities/Entity.h index 3fd3c2b..6a041bc 100644 --- a/src/entities/Entity.h +++ b/src/entities/Entity.h @@ -40,7 +40,7 @@ namespace entities inline glm::vec3 GetPosition() const { return position; } inline void SetPosition(const ::glm::vec3& position) { this->position = position; } inline glm::vec3 GetRotation() const { return rotation; } - inline void SetRotation(const ::glm::vec3& rotation) { this->rotation = rotation; } + void SetRotation(const ::glm::vec3& rotation) { this->rotation = rotation; } inline float GetScale() const { return scale; } inline void SetScale(const float scale) { this->scale = scale; } }; diff --git a/src/entities/main_character.cpp b/src/entities/main_character.cpp index 9c8f587..3f55076 100644 --- a/src/entities/main_character.cpp +++ b/src/entities/main_character.cpp @@ -7,11 +7,10 @@ #include"../renderEngine/loader.h" namespace entities { - float movement_speed; - float down_speed; - float side_speed; + int movement_speed, down_speed, side_speed; bool is_playing; + MainCharacter::MainCharacter(const models::TexturedModel& model, const glm::vec3& position, const glm::vec3& rotation, float scale, const collision::Box& bounding_box) : CollisionEntity(model, position, rotation, scale, bounding_box) @@ -25,11 +24,12 @@ namespace entities computervision::HandDetectRegion* reg_up = regions.at(1); computervision::HandDetectRegion* reg_right = regions.at(2); - if (is_playing) { - movement_speed = -0.5f; //Forward speed adjustment, bee is moving at a standard speedrate - down_speed = -1.0f; //Down speed adjustment, downspeed is difference between down_speed and UP_SPEED - side_speed = 0; //Side speed adjustment + double delta_time = UpdateDelta(); + if (is_playing) { + movement_speed = -15; //Forward speed adjustment, bee is moving at a standard speedrate + down_speed = -50; //Down speed adjustment, downspeed is difference between down_speed and UP_SPEED + side_speed = 0; //Side speed adjustment //For gameplay with use of keyboard keys: W, A, S, D //W: Go forward //A: Go left @@ -37,10 +37,12 @@ namespace entities //D: Go right //TODO Implement CV actions //top right + SetRotation(glm::vec3(0, 90, 0)); if (reg_up->IsHandPresent() && reg_left->IsHandPresent()) { side_speed += SIDE_SPEED; - down_speed += UP_SPEED; + down_speed += UP_SPEED/2; + SetRotation(glm::vec3(10, 90, 0)); } //right if (reg_left->IsHandPresent()) @@ -50,8 +52,9 @@ namespace entities //top left if (reg_up->IsHandPresent() && reg_right->IsHandPresent()) { - down_speed += UP_SPEED; + down_speed += UP_SPEED/2; side_speed -= SIDE_SPEED; + SetRotation(glm::vec3(10, 90, 0)); } //left if (reg_right->IsHandPresent()) @@ -65,7 +68,8 @@ namespace entities SetRotation(glm::vec3(10, 90, 0)); } } - IncreasePosition(glm::vec3(side_speed, down_speed, movement_speed)); + IncreasePosition(glm::vec3(side_speed*delta_time, down_speed*delta_time, movement_speed*delta_time)); + std::cout << "delta time char: "<< delta_time << std::endl; //Use only for binding bee to house, such that it doesn't go outside of the room. //TODO delete when boundingbox is implemented! @@ -87,4 +91,14 @@ namespace entities is_playing = false; std::cout << "collision" << std::endl; } + + double MainCharacter::UpdateDelta() + { + double current_time = glfwGetTime(); + static double last_frame_time = current_time; + 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/entities/main_character.h b/src/entities/main_character.h index c068f8a..589536a 100644 --- a/src/entities/main_character.h +++ b/src/entities/main_character.h @@ -10,8 +10,8 @@ namespace entities * This class contains the information about the player model */ class MainCharacter : public CollisionEntity { - const float SIDE_SPEED = 0.8f; //Standard movement speed for left/right movement - const float UP_SPEED = 2.0f; //Standard movement speed for up movement + const int SIDE_SPEED = 40; //Standard movement speed for left/right movement + const int UP_SPEED = 100; //Standard movement speed for up movement public: /* * @brief: Constructor for the main character model @@ -35,5 +35,7 @@ namespace entities void Move(std::vector regions); void OnCollide(const collision::Collision& collision) override; + + double UpdateDelta(); }; } diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 5630bcb..05c0bc9 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -62,7 +62,7 @@ namespace scene score = 0; } /** - * temporary!!!! + * temporary? * just to make some bounding boxes */ collision::Box create_bounding_box(glm::vec3 size, glm::vec3 pos, int scale) { From 3f172e14843cfb1f5366462825f71bff3d022e27 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 11 Jun 2021 16:19:41 +0200 Subject: [PATCH 06/18] [ADD] auto calibration in startup scene --- src/computervision/ObjectDetection.cpp | 61 +++++++++++++++++++++++++- src/toolbox/Timer.h | 2 + 2 files changed, 61 insertions(+), 2 deletions(-) diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index 155512e..2644a6d 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -2,6 +2,7 @@ #include #include #include +#include #include "ObjectDetection.h" #include "BackgroundRemover.h" @@ -10,6 +11,8 @@ #include "async/StaticCameraInstance.h" #include "calibration/HandCalibrator.h" +#define TIME_DURATION 1.0f + namespace computervision { @@ -25,6 +28,11 @@ namespace computervision handcalibration::HandCalibrator hand_calibrator; cv::VideoCapture cap = static_camera::getCap(); + float time = 0; + int seconds_left = 5; // calibration countdown + + bool background_calibrated = false; + bool skin_calibrated = false; ObjectDetection::ObjectDetection() { @@ -42,6 +50,27 @@ namespace computervision bool ObjectDetection::DetectHand(Mat camera_frame, bool& hand_present) { + //calculate deltatime + + double current_time = glfwGetTime(); + static double last_frame_time = current_time; + double delt_time = current_time - last_frame_time; + std::cout << "delta time : " << delt_time << std::endl; + last_frame_time = current_time; + + time += delt_time; + + if (time >= TIME_DURATION) + { + std::cout << "timer finised, seconds left: " << seconds_left << std::endl; + seconds_left--; + time = 0; + } + + + + + Mat input_frame = GenerateHandMaskSquare(camera_frame); frame_out = input_frame.clone(); @@ -62,11 +91,39 @@ namespace computervision // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. DrawHandMask(&camera_frame); - + + if (seconds_left <= 0) + { + if (!background_calibrated) + { + background_remover.calibrate(input_frame); + background_calibrated = true; + hand_calibrator.SetBackGroundCalibrated(background_calibrated); + seconds_left = 5; + time = 0; + } + else + { + + if (!skin_calibrated) + { + skin_detector.calibrate(input_frame); + skin_calibrated = true; + hand_calibrator.SetSkinCalibration(skin_calibrated); + time = 0; + } + } + + } hand_calibrator.SetAmountOfFingers(fingers_amount); finger_count.DrawHandContours(camera_frame); hand_calibrator.DrawHandCalibrationText(camera_frame); + std::string calibration_text = (!background_calibrated ? "calibrating background in " : (!skin_calibrated ? "calibrating skin in " : "")); + calibration_text += std::to_string(seconds_left); + if (!background_calibrated || !skin_calibrated) + cv:putText(camera_frame, calibration_text, cv::Point(5, 400), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255),2); + imshow("camera", camera_frame); /*imshow("output", frame_out); @@ -74,7 +131,7 @@ namespace computervision imshow("handMask", handMask); imshow("handDetection", fingerCountDebug);*/ - hand_present = hand_calibrator.CheckIfHandPresent(handMask,handcalibration::HandDetectionType::MENU); + hand_present = hand_calibrator.CheckIfHandPresent(handMask, handcalibration::HandDetectionType::MENU); hand_calibrator.SetHandPresent(hand_present); diff --git a/src/toolbox/Timer.h b/src/toolbox/Timer.h index 80fd164..46b2a67 100644 --- a/src/toolbox/Timer.h +++ b/src/toolbox/Timer.h @@ -42,5 +42,7 @@ namespace toolbox * @return: True if the timer has finished */ bool HasFinished() const { return has_finished; } + + void Reset() { current_time = 0; } }; } \ No newline at end of file From 344745d9cf5c7cd00b67fc2158fbe9c06f05dd9f Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 11 Jun 2021 16:46:00 +0200 Subject: [PATCH 07/18] [ADD] auto calibration in game scene --- src/computervision/HandDetectRegion.cpp | 45 +++++++++++++++++++++++-- src/computervision/HandDetectRegion.h | 13 +++++++ src/computervision/ObjectDetection.cpp | 38 +++++++++++---------- src/computervision/ObjectDetection.h | 1 + src/scenes/in_Game_Scene.cpp | 22 ++++++++---- src/scenes/in_Game_Scene.h | 2 ++ 6 files changed, 96 insertions(+), 25 deletions(-) diff --git a/src/computervision/HandDetectRegion.cpp b/src/computervision/HandDetectRegion.cpp index 87f3538..1d1221f 100644 --- a/src/computervision/HandDetectRegion.cpp +++ b/src/computervision/HandDetectRegion.cpp @@ -1,6 +1,6 @@ #include "HandDetectRegion.h" - +#define TIME_DURATION 1.0f namespace computervision { @@ -20,6 +20,15 @@ namespace computervision Mat input_frame = GenerateHandMaskSquare(camera_frame); frame_out = input_frame.clone(); + if (!background_calibrated || !skin_calibrated) + if (time >= TIME_DURATION) + { + std::cout << "timer finised, seconds left: " << seconds_left << std::endl; + seconds_left--; + time = 0; + } + + // detect skin color skin_detector.drawSkinColorSampler(camera_frame,start_x_pos,start_y_pos,region_width,region_height); @@ -32,6 +41,30 @@ namespace computervision // draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed. DrawHandMask(&camera_frame); + if (seconds_left <= 0) + { + if (!background_calibrated) + { + background_remover.calibrate(input_frame); + background_calibrated = true; + hand_calibrator.SetBackGroundCalibrated(background_calibrated); + seconds_left = 5; + time = 0; + } + else + { + + if (!skin_calibrated) + { + skin_detector.calibrate(input_frame); + skin_calibrated = true; + hand_calibrator.SetSkinCalibration(skin_calibrated); + time = 0; + } + } + + } + //imshow("output" + region_id, frame_out); //imshow("foreground" + region_id, foreground); //imshow("handMask" + region_id, handMask); @@ -47,7 +80,10 @@ namespace computervision hand_calibrator.DrawBackgroundSkinCalibrated(camera_frame); - + std::string calibration_text = (!background_calibrated ? "calibrating background in " : (!skin_calibrated ? "calibrating skin in " : "")); + calibration_text += std::to_string(seconds_left); + if (!background_calibrated || !skin_calibrated) + cv:putText(camera_frame, calibration_text, cv::Point(5, 400), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2); } @@ -102,4 +138,9 @@ namespace computervision hand_calibrator.SetSkinCalibration(true); } + void HandDetectRegion::UpdateTime(float delta_time) + { + time += delta_time; + } + } diff --git a/src/computervision/HandDetectRegion.h b/src/computervision/HandDetectRegion.h index 7cc1a9a..da7cc1b 100644 --- a/src/computervision/HandDetectRegion.h +++ b/src/computervision/HandDetectRegion.h @@ -2,6 +2,8 @@ #include #include +#include + #include "async/StaticCameraInstance.h" #include "calibration/HandCalibrator.h" #include "BackgroundRemover.h" @@ -36,8 +38,10 @@ namespace computervision std::vector CalculateSkinTresholds(); void setSkinTresholds(std::vector& tresholds); + void UpdateTime(float delta_time); private: + int start_x_pos; int start_y_pos; int region_height; @@ -51,6 +55,15 @@ namespace computervision std::string region_id; bool DrawHandMask(cv::Mat* input); + + float time = 0; + int seconds_left = 5; // calibration countdown + + bool background_calibrated = false; + bool skin_calibrated = false; + + + }; } diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/ObjectDetection.cpp index 2644a6d..6824eb5 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/ObjectDetection.cpp @@ -51,26 +51,19 @@ namespace computervision bool ObjectDetection::DetectHand(Mat camera_frame, bool& hand_present) { //calculate deltatime - - double current_time = glfwGetTime(); - static double last_frame_time = current_time; - double delt_time = current_time - last_frame_time; - std::cout << "delta time : " << delt_time << std::endl; - last_frame_time = current_time; - - time += delt_time; - - if (time >= TIME_DURATION) + if (!background_calibrated || !skin_calibrated) { - std::cout << "timer finised, seconds left: " << seconds_left << std::endl; - seconds_left--; - time = 0; + UpdateTime(); + + if (time >= TIME_DURATION) + { + std::cout << "timer finised, seconds left: " << seconds_left << std::endl; + seconds_left--; + time = 0; + } } - - - Mat input_frame = GenerateHandMaskSquare(camera_frame); frame_out = input_frame.clone(); @@ -119,10 +112,11 @@ namespace computervision hand_calibrator.SetAmountOfFingers(fingers_amount); finger_count.DrawHandContours(camera_frame); hand_calibrator.DrawHandCalibrationText(camera_frame); + std::string calibration_text = (!background_calibrated ? "calibrating background in " : (!skin_calibrated ? "calibrating skin in " : "")); calibration_text += std::to_string(seconds_left); if (!background_calibrated || !skin_calibrated) - cv:putText(camera_frame, calibration_text, cv::Point(5, 400), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255),2); + cv:putText(camera_frame, calibration_text, cv::Point(5, 400), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2); imshow("camera", camera_frame); @@ -201,5 +195,15 @@ namespace computervision imshow("Webcam image", img); } + void ObjectDetection::UpdateTime() + { + double current_time = glfwGetTime(); + static double last_frame_time = current_time; + double delt_time = current_time - last_frame_time; + last_frame_time = current_time; + + time += delt_time; + } + } \ No newline at end of file diff --git a/src/computervision/ObjectDetection.h b/src/computervision/ObjectDetection.h index 92fc335..8c26660 100644 --- a/src/computervision/ObjectDetection.h +++ b/src/computervision/ObjectDetection.h @@ -86,6 +86,7 @@ namespace computervision private: bool is_hand_open; bool is_hand_present; + void UpdateTime(); }; diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index bee93b8..227e573 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -44,6 +44,8 @@ namespace scene int furniture_count_old; int score; + float delta_time = 0; + std::vector regions; computervision::HandDetectRegion reg_left("left", 0, 0, 150, 150), reg_right("right", 0, 0, 150, 150), reg_up("up", 0, 0, 150, 150); @@ -73,11 +75,8 @@ namespace scene score_pointer = std::make_unique(render_engine::loader::LoadTexture(texture_path), glm::vec2(-0.9f, 0.8f), glm::vec2(0.07, 0.15)); score_textures.push_back(score_pointer); - - std::cout << "Add to score_pointer: " << texture_path << std::endl; } - std::cout << "Size textures: " << score_textures.size() << std::endl; } @@ -268,6 +267,7 @@ namespace scene //updates certain variables void scene::In_Game_Scene::update(GLFWwindow* window) { + UpdateDeltaTime(); //camera.Move(window); main_character->Move(window); @@ -330,6 +330,10 @@ namespace scene void scene::In_Game_Scene::update_hand_detection() { + reg_left.UpdateTime(delta_time); + reg_right.UpdateTime(delta_time); + reg_up.UpdateTime(delta_time); + cv::Mat camera_frame; static_camera::getCap().read(camera_frame); reg_left.DetectHand(camera_frame); @@ -352,14 +356,20 @@ namespace scene toolbox::GetDigitsFromNumber(score, digits); - std::cout << "Digits size: " << digits.size() << std::endl; - for (int i = digits.size()-1; i >= 0; i--) { - std::cout << "Digit in digits: " << i << std::endl; score_textures[digits[i]].get()->position.x = 0.15 * i -0.9; render_engine::renderer::Render(score_textures[digits[i]], *gui_shader); } } + + void In_Game_Scene::UpdateDeltaTime() + { + double current_time = glfwGetTime(); + static double last_frame_time = current_time; + delta_time = current_time - last_frame_time; + last_frame_time = current_time; + + } } diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index 656f4b3..7f4631b 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -59,6 +59,8 @@ namespace scene std::vector> score_guis; + void UpdateDeltaTime(); + /** * @brief renders the objects/gui models * @param From e51b56b1560ea4dbb08344281904a3202689ccc8 Mon Sep 17 00:00:00 2001 From: "DESKTOP-EBR7IVA\\kimve" Date: Fri, 11 Jun 2021 16:49:09 +0200 Subject: [PATCH 08/18] [WIP] Collision detectie moet nog worden egimplementeerd om naar game over screen te gaan --- src/entities/house_generator.cpp | 9 ++ src/entities/house_generator.h | 9 +- src/entities/main_character.cpp | 4 + src/entities/main_character.h | 2 + src/scenes/game_Over_Scene.cpp | 184 +++++++++++++++++++++++++++++++ src/scenes/game_Over_Scene.h | 26 +++++ src/scenes/in_Game_Scene.cpp | 14 ++- src/scenes/in_Game_Scene.h | 4 + wk2_fps.vcxproj | 2 + wk2_fps.vcxproj.filters | 2 + 10 files changed, 251 insertions(+), 5 deletions(-) create mode 100644 src/scenes/game_Over_Scene.cpp create mode 100644 src/scenes/game_Over_Scene.h diff --git a/src/entities/house_generator.cpp b/src/entities/house_generator.cpp index 6573701..6224dde 100644 --- a/src/entities/house_generator.cpp +++ b/src/entities/house_generator.cpp @@ -35,7 +35,11 @@ namespace entities collision::Box model_box = { model_pos, model.raw_model.model_size }; model_box.SetRotation(-90); furniture.push_back(std::make_shared(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, model_box)); + //furniture_collision.push_back(std::make_shared(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, model_box)); + } + + //furniture_collision.pop_front(); /* // Add furniture @@ -255,4 +259,9 @@ namespace entities furniture_models.insert(std::pair>(FurnitureType::MISC, miscs)); } + + /*std::deque> HouseGenerator::GetFurnitureCollisions() + { + return furniture_collision; + }*/ } diff --git a/src/entities/house_generator.h b/src/entities/house_generator.h index 12fbfa0..ab5e4f1 100644 --- a/src/entities/house_generator.h +++ b/src/entities/house_generator.h @@ -30,6 +30,8 @@ namespace entities models::ModelTexture default_texture; std::map> furniture_models; + //std::deque> furniture_collision; + public: HouseGenerator(); @@ -47,7 +49,12 @@ namespace entities /* * @brief: Returns the depth of the house (chunk) */ - float GetHouseDepth() const { return house_model.raw_model.model_size.x * HOUSE_SIZE; } + float GetHouseDepth() const { return house_model.raw_model.model_size.x * HOUSE_SIZE; + + } + + //std::deque> GetFurnitureCollisions(); + private: /* diff --git a/src/entities/main_character.cpp b/src/entities/main_character.cpp index cdf53c7..b366b89 100644 --- a/src/entities/main_character.cpp +++ b/src/entities/main_character.cpp @@ -97,4 +97,8 @@ namespace entities is_playing = false; std::cout << "collision" << std::endl; } + + bool MainCharacter::GetOnCollide() { + return is_playing; + } } \ No newline at end of file diff --git a/src/entities/main_character.h b/src/entities/main_character.h index d1029a2..79ae656 100644 --- a/src/entities/main_character.h +++ b/src/entities/main_character.h @@ -34,5 +34,7 @@ namespace entities void Move(GLFWwindow* window); void OnCollide(const collision::Collision& collision) override; + + bool GetOnCollide(); }; } diff --git a/src/scenes/game_Over_Scene.cpp b/src/scenes/game_Over_Scene.cpp new file mode 100644 index 0000000..00bd49c --- /dev/null +++ b/src/scenes/game_Over_Scene.cpp @@ -0,0 +1,184 @@ +#include +#include +#include +#include +#include "game_Over_Scene.h" +#include +#include + +#include "../models/model.h" +#include "../renderEngine/loader.h" +#include "../renderEngine/obj_loader.h" +#include "../renderEngine/renderer.h" +#include "../shaders/entity_shader.h" +#include "../gui/gui_interactable.h" +#include "../toolbox/toolbox.h" +#include "../computervision/MenuTest.h" +#include "../computervision/ObjectDetection.h" +#include "../computervision/HandDetectRegion.h" + +namespace scene +{ + shaders::GuiShader* gui_shader_gameOver; + std::vector guis_gameOver; + computervision::ObjectDetection objDetect_gameOver; + + float item_number_gameOver = 0; + + bool hand_mode_gameOver = false; + + Game_Over_Scene::Game_Over_Scene() { + shaders::EntityShader shader; + shader.Init(); + render_engine::renderer::Init(shader); + shader.CleanUp(); + + gui_shader_gameOver = new shaders::GuiShader(); + gui_shader_gameOver->Init(); + } + + gui::Button* ConvertGuiTextureToButtonGameOver(gui::GuiTexture* texture) { + gui::Button* button; + if (texture != NULL) + { + + if (texture->GetType() == gui::GuiType::BUTTON) { + + button = (gui::Button*)texture; + return button; + } + else { + button = nullptr; + return button; + } + } + else { + button = nullptr; + return button; + } + } + + gui::GuiTexture* GetMenuItemGameOver(bool hand_state) { + if (hand_state) + item_number_gameOver += 0.20f; + + int temp_item_number = item_number_gameOver; + + //If temp_item_number is equal to the size of the array, set item_number bac to zero to loop through the array again + if (temp_item_number == guis_gameOver.size()) { + item_number_gameOver = 0; + temp_item_number = 0; + } + std::cout << guis_gameOver[temp_item_number]->texture << std::endl; + return guis_gameOver[temp_item_number]; + } + + scene::Scenes scene::Game_Over_Scene::start(GLFWwindow* window) { + gui::Button button_start_scene(render_engine::loader::LoadTexture("res/Birb1.jpg"), glm::vec2(0.0f, 0.6f), glm::vec2(0.25f, 0.25f)); + button_start_scene.SetHoverTexture(render_engine::loader::LoadTexture("res/Birb2.jpg")); + button_start_scene.SetClickedTexture(render_engine::loader::LoadTexture("res/Birb3.jpg")); + button_start_scene.SetOnClickAction([]() + { + std::cout << "Back to start screen!!" << std::endl; + }); + guis_gameOver.push_back(&button_start_scene); + + computervision::ObjectDetection objDetect; + cv::Mat cameraFrame; + gui::GuiTexture* chosen_item_gameOver = NULL; //This is the selected menu_item + bool hand_closed = false; //Flag to prevent multiple button presses + + while (return_value == scene::Scenes:: GAMEOVER) + { + render(); + update(window); + + if (hand_mode_gameOver) + { + cameraFrame = objDetect_gameOver.ReadCamera(); + + bool detect = false; + bool hand_detection = objDetect_gameOver.DetectHand(cameraFrame, detect); + + if (hand_detection) + { + hand_closed = false; + std::cout << "hand is opened" << std::endl; + + //Loop through menu items + chosen_item_gameOver = GetMenuItemGameOver(true); + + gui::Button* new_button = ConvertGuiTextureToButtonGameOver(chosen_item_gameOver); + if (new_button != NULL) { + const float x_pos = (chosen_item_gameOver->position.x + 1.0) * WINDOW_WIDTH / 2; + const float y_pos = (1.0 - chosen_item_gameOver->position.y) * WINDOW_HEIGHT / 2; + + //Set cursor to location of selected menu_item + glfwSetCursorPos(window, x_pos, y_pos); + } + } + else if (!hand_detection) + { + std::cout << "hand is closed" << std::endl; + + //Gets selected menu_item + chosen_item_gameOver = GetMenuItemGameOver(false); + gui::Button* new_button = ConvertGuiTextureToButtonGameOver(chosen_item_gameOver); + + if (new_button != NULL && !hand_closed) { + //Run function click + new_button->ForceClick(GLFW_MOUSE_BUTTON_LEFT); + hand_closed = true; + } + } + } + glfwSwapBuffers(window); + glfwPollEvents(); + } + + gui_shader_gameOver->CleanUp(); + render_engine::loader::CleanUp(); + return return_value; + } + + /** + * renders the models in the start-up scene + */ + void scene::Game_Over_Scene::render() + { + render_engine::renderer::Prepare(); + + // Render GUI items + render_engine::renderer::Render(guis_gameOver, *gui_shader_gameOver); + } + + /** + * updates the variables for the start-up scene + */ + void scene::Game_Over_Scene::update(GLFWwindow* window) + { + for (gui::GuiTexture* button : guis_gameOver) { + gui::Button* new_button = ConvertGuiTextureToButtonGameOver(button); + if (new_button != NULL) + new_button->Update(window); + } + bool hand_present; + objDetect_gameOver.DetectHand(objDetect_gameOver.ReadCamera(), hand_present); + } + + /** + * manages the key input in the start-up scene + */ + void scene::Game_Over_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; + cv::destroyWindow("camera"); + } + else if (glfwGetKey(window, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { + hand_mode_gameOver = !hand_mode_gameOver; + } + } + +} \ No newline at end of file diff --git a/src/scenes/game_Over_Scene.h b/src/scenes/game_Over_Scene.h new file mode 100644 index 0000000..e94e758 --- /dev/null +++ b/src/scenes/game_Over_Scene.h @@ -0,0 +1,26 @@ +#pragma once +#include "scene.h" +#include "../gui/gui_element.h" + +namespace scene +{ + extern GLFWwindow* window; + + class Game_Over_Scene : public scene::Scene + { + private: + scene::Scenes return_value = scene::Scenes::GAMEOVER; + + public: + Game_Over_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; + + }; +} \ No newline at end of file diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index bee93b8..0252fe5 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -31,6 +31,9 @@ namespace scene { std::shared_ptrmain_character; std::vector> collision_entities; + + //std::deque> furniture_collision; + entities::HouseGenerator* house_generator; std::deque> house_models; @@ -135,10 +138,11 @@ namespace scene std::deque> furniture = house_generator->GenerateHouse(glm::vec3(0, -75, -50 - z_offset), 90); furniture_count = furniture.size(); - + house_models.insert(house_models.end(), furniture.begin(), furniture.end()); std::cout << "funriture_count in load chunk (house included): " << furniture_count << std::endl; furniture_count_old = furniture_count - 1; + } /** @@ -270,6 +274,10 @@ namespace scene { //camera.Move(window); main_character->Move(window); + if (!main_character.get()->GetOnCollide()) + { + return_value = scene::Scenes::GAMEOVER; + } //std::cout << "x get: " << movement.x << "\ny get: " << movement.y << "\nz get: " << movement.z << "\n"; camera->Follow(main_character->GetPosition()); @@ -291,6 +299,7 @@ namespace scene last_model_pos = model_pos; collision::CheckCollisions(collision_entities); + update_hand_detection(); @@ -352,11 +361,8 @@ namespace scene toolbox::GetDigitsFromNumber(score, digits); - std::cout << "Digits size: " << digits.size() << std::endl; - for (int i = digits.size()-1; i >= 0; i--) { - std::cout << "Digit in digits: " << i << std::endl; score_textures[digits[i]].get()->position.x = 0.15 * i -0.9; render_engine::renderer::Render(score_textures[digits[i]], *gui_shader); diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index 656f4b3..241927f 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -103,6 +103,10 @@ namespace scene */ void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override; + /** + * @brief: This method renders the score points onto the game window + * @param score: Score to show + */ void DrawScore(int score); }; diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index f9065d6..5122172 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -24,6 +24,7 @@ + @@ -55,6 +56,7 @@ + diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 0b8c679..9822aa3 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -28,6 +28,7 @@ + @@ -148,6 +149,7 @@ + From ca61dfc78150b3e42d66c3af84ba8bf08910852a Mon Sep 17 00:00:00 2001 From: "DESKTOP-EBR7IVA\\kimve" Date: Fri, 11 Jun 2021 16:58:01 +0200 Subject: [PATCH 09/18] [WIP] from start menu, if you press space, you get to gameover screen. Just to check. This works --- src/main.cpp | 5 +++++ src/scenes/game_Over_Scene.cpp | 3 ++- src/scenes/startup_Scene.cpp | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index be9e1bc..472c320 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -27,6 +27,7 @@ #include "scenes/scene.h" #include "scenes/in_Game_Scene.h" #include "scenes/startup_Scene.h" +#include "scenes/game_Over_Scene.h" #include "computervision/ObjectDetection.h" //#include "computervision/OpenPoseImage.h" @@ -112,6 +113,10 @@ int main(void) current_scene = new scene::In_Game_Scene(); break; + case scene::Scenes::GAMEOVER: + current_scene = new scene::Game_Over_Scene(); + break; + default: std::cout << "Wrong return value!!! ->" << std::endl; break; diff --git a/src/scenes/game_Over_Scene.cpp b/src/scenes/game_Over_Scene.cpp index 00bd49c..5fb9135 100644 --- a/src/scenes/game_Over_Scene.cpp +++ b/src/scenes/game_Over_Scene.cpp @@ -27,7 +27,8 @@ namespace scene bool hand_mode_gameOver = false; - Game_Over_Scene::Game_Over_Scene() { + Game_Over_Scene::Game_Over_Scene() + { shaders::EntityShader shader; shader.Init(); render_engine::renderer::Init(shader); diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp index b734214..05698ce 100644 --- a/src/scenes/startup_Scene.cpp +++ b/src/scenes/startup_Scene.cpp @@ -211,7 +211,7 @@ namespace scene { if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { - return_value = scene::Scenes::INGAME; + return_value = scene::Scenes::GAMEOVER; cv::destroyWindow("camera"); } else if (glfwGetKey(window, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { From ce0a1f3da7e6d843b2624dbf36d3bd760678c98b Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 18 Jun 2021 10:31:00 +0200 Subject: [PATCH 10/18] [EDIT] files accordingly to style guide --- ...oundRemover.cpp => background_remover.cpp} | 2 +- ...ckgroundRemover.h => background_remover.h} | 0 .../{FingerCount.cpp => finger_count.cpp} | 2 +- .../{FingerCount.h => finger_count.h} | 0 ...etectRegion.cpp => hand_detect_region.cpp} | 9 ++++++++- ...andDetectRegion.h => hand_detect_region.h} | 6 +++--- ...jectDetection.cpp => object_detection.cpp} | 17 +++++++++++----- .../{ObjectDetection.h => object_detection.h} | 0 .../{SkinDetector.cpp => skin_detector.cpp} | 2 +- .../{SkinDetector.h => skin_detector.h} | 0 src/main.cpp | 2 +- src/scenes/in_Game_Scene.cpp | 4 ++-- src/scenes/startup_Scene.cpp | 4 ++-- wk2_fps.vcxproj | 20 +++++++++---------- wk2_fps.vcxproj.filters | 20 +++++++++---------- 15 files changed, 51 insertions(+), 37 deletions(-) rename src/computervision/{BackgroundRemover.cpp => background_remover.cpp} (97%) rename src/computervision/{BackgroundRemover.h => background_remover.h} (100%) rename src/computervision/{FingerCount.cpp => finger_count.cpp} (99%) rename src/computervision/{FingerCount.h => finger_count.h} (100%) rename src/computervision/{HandDetectRegion.cpp => hand_detect_region.cpp} (92%) rename src/computervision/{HandDetectRegion.h => hand_detect_region.h} (94%) rename src/computervision/{ObjectDetection.cpp => object_detection.cpp} (89%) rename src/computervision/{ObjectDetection.h => object_detection.h} (100%) rename src/computervision/{SkinDetector.cpp => skin_detector.cpp} (99%) rename src/computervision/{SkinDetector.h => skin_detector.h} (100%) diff --git a/src/computervision/BackgroundRemover.cpp b/src/computervision/background_remover.cpp similarity index 97% rename from src/computervision/BackgroundRemover.cpp rename to src/computervision/background_remover.cpp index ebae572..e9a19e1 100644 --- a/src/computervision/BackgroundRemover.cpp +++ b/src/computervision/background_remover.cpp @@ -1,4 +1,4 @@ -#include "BackgroundRemover.h" +#include "background_remover.h" /* Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti diff --git a/src/computervision/BackgroundRemover.h b/src/computervision/background_remover.h similarity index 100% rename from src/computervision/BackgroundRemover.h rename to src/computervision/background_remover.h diff --git a/src/computervision/FingerCount.cpp b/src/computervision/finger_count.cpp similarity index 99% rename from src/computervision/FingerCount.cpp rename to src/computervision/finger_count.cpp index bdd1938..0bc4409 100644 --- a/src/computervision/FingerCount.cpp +++ b/src/computervision/finger_count.cpp @@ -1,4 +1,4 @@ -#include "FingerCount.h" +#include "finger_count.h" #include "opencv2/imgproc.hpp" #include "opencv2/highgui.hpp" diff --git a/src/computervision/FingerCount.h b/src/computervision/finger_count.h similarity index 100% rename from src/computervision/FingerCount.h rename to src/computervision/finger_count.h diff --git a/src/computervision/HandDetectRegion.cpp b/src/computervision/hand_detect_region.cpp similarity index 92% rename from src/computervision/HandDetectRegion.cpp rename to src/computervision/hand_detect_region.cpp index 1d1221f..b2c61f2 100644 --- a/src/computervision/HandDetectRegion.cpp +++ b/src/computervision/hand_detect_region.cpp @@ -1,5 +1,5 @@ -#include "HandDetectRegion.h" +#include "hand_detect_region.h" #define TIME_DURATION 1.0f namespace computervision { @@ -83,7 +83,14 @@ namespace computervision std::string calibration_text = (!background_calibrated ? "calibrating background in " : (!skin_calibrated ? "calibrating skin in " : "")); calibration_text += std::to_string(seconds_left); if (!background_calibrated || !skin_calibrated) + { + cv::rectangle(camera_frame, cv::Rect(0, camera_frame.rows - 130, 600, 60), cv::Scalar(0, 0, 0), -1); cv:putText(camera_frame, calibration_text, cv::Point(5, 400), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2); + } + if (background_calibrated && !skin_calibrated) + { + cv::putText(camera_frame, "put your hand in the left square", cv::Point(5, camera_frame.rows - 105), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2); + } } diff --git a/src/computervision/HandDetectRegion.h b/src/computervision/hand_detect_region.h similarity index 94% rename from src/computervision/HandDetectRegion.h rename to src/computervision/hand_detect_region.h index da7cc1b..3281ce9 100644 --- a/src/computervision/HandDetectRegion.h +++ b/src/computervision/hand_detect_region.h @@ -6,9 +6,9 @@ #include "async/StaticCameraInstance.h" #include "calibration/HandCalibrator.h" -#include "BackgroundRemover.h" -#include "SkinDetector.h" -#include "FingerCount.h" +#include "background_remover.h" +#include "skin_detector.h" +#include "finger_count.h" namespace computervision { class HandDetectRegion diff --git a/src/computervision/ObjectDetection.cpp b/src/computervision/object_detection.cpp similarity index 89% rename from src/computervision/ObjectDetection.cpp rename to src/computervision/object_detection.cpp index 6824eb5..f52fc43 100644 --- a/src/computervision/ObjectDetection.cpp +++ b/src/computervision/object_detection.cpp @@ -4,10 +4,10 @@ #include #include -#include "ObjectDetection.h" -#include "BackgroundRemover.h" -#include "SkinDetector.h" -#include "FingerCount.h" +#include "object_detection.h" +#include "background_remover.h" +#include "skin_detector.h" +#include "finger_count.h" #include "async/StaticCameraInstance.h" #include "calibration/HandCalibrator.h" @@ -116,8 +116,15 @@ namespace computervision std::string calibration_text = (!background_calibrated ? "calibrating background in " : (!skin_calibrated ? "calibrating skin in " : "")); calibration_text += std::to_string(seconds_left); if (!background_calibrated || !skin_calibrated) - cv:putText(camera_frame, calibration_text, cv::Point(5, 400), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2); + { + cv::rectangle(camera_frame, cv::Rect(0, camera_frame.rows - 120, 500, 50), cv::Scalar(0, 0, 0), -1); + cv::putText(camera_frame, calibration_text, cv::Point(5, camera_frame.rows-80), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2); + } + if (background_calibrated && !skin_calibrated) + { + cv::putText(camera_frame, "put your hand in the square", cv::Point(5, camera_frame.rows - 100), cv::FONT_HERSHEY_COMPLEX, 1.0, cv::Scalar(255, 0, 255), 2); + } imshow("camera", camera_frame); /*imshow("output", frame_out); diff --git a/src/computervision/ObjectDetection.h b/src/computervision/object_detection.h similarity index 100% rename from src/computervision/ObjectDetection.h rename to src/computervision/object_detection.h diff --git a/src/computervision/SkinDetector.cpp b/src/computervision/skin_detector.cpp similarity index 99% rename from src/computervision/SkinDetector.cpp rename to src/computervision/skin_detector.cpp index 100f25f..64c21bc 100644 --- a/src/computervision/SkinDetector.cpp +++ b/src/computervision/skin_detector.cpp @@ -1,4 +1,4 @@ -#include "SkinDetector.h" +#include "skin_detector.h" #include /* diff --git a/src/computervision/SkinDetector.h b/src/computervision/skin_detector.h similarity index 100% rename from src/computervision/SkinDetector.h rename to src/computervision/skin_detector.h diff --git a/src/main.cpp b/src/main.cpp index be9e1bc..887ec1d 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,7 +28,7 @@ #include "scenes/in_Game_Scene.h" #include "scenes/startup_Scene.h" -#include "computervision/ObjectDetection.h" +#include "computervision/object_detection.h" //#include "computervision/OpenPoseImage.h" #include "computervision/OpenPoseVideo.h" diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 227e573..e290061 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -19,8 +19,8 @@ #include #include #include -#include "../computervision/HandDetectRegion.h" -#include "../computervision/ObjectDetection.h" +#include "../computervision/hand_detect_region.h" +#include "../computervision/object_detection.h" #include #define MAX_MODEL_DEQUE_SIZE 6 // max amount of models to load at the same time diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp index b734214..4d69e21 100644 --- a/src/scenes/startup_Scene.cpp +++ b/src/scenes/startup_Scene.cpp @@ -14,8 +14,8 @@ #include "../gui/gui_interactable.h" #include "../toolbox/toolbox.h" #include "../computervision/MenuTest.h" -#include "../computervision/ObjectDetection.h" -#include "../computervision/HandDetectRegion.h" +#include "../computervision/object_detection.h" +#include "../computervision/hand_detect_region.h" diff --git a/wk2_fps.vcxproj b/wk2_fps.vcxproj index f9065d6..1d9710c 100644 --- a/wk2_fps.vcxproj +++ b/wk2_fps.vcxproj @@ -23,15 +23,15 @@ - + - + - - - + + + @@ -54,17 +54,17 @@ - + - - + + - - + + diff --git a/wk2_fps.vcxproj.filters b/wk2_fps.vcxproj.filters index 0b8c679..3d92163 100644 --- a/wk2_fps.vcxproj.filters +++ b/wk2_fps.vcxproj.filters @@ -4,11 +4,11 @@ - + - - - + + + @@ -23,7 +23,7 @@ - + @@ -118,7 +118,7 @@ - + @@ -126,11 +126,11 @@ - - + + - - + + From 01570d80458c01f3a5686eab860f6e1a301641af Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 18 Jun 2021 10:49:59 +0200 Subject: [PATCH 11/18] [FIX] auto skin calibration in game scene --- src/computervision/hand_detect_region.cpp | 10 ++-- src/computervision/hand_detect_region.h | 4 ++ src/scenes/in_Game_Scene.cpp | 64 ++++++++++++++++------- src/scenes/in_Game_Scene.h | 3 ++ 4 files changed, 57 insertions(+), 24 deletions(-) diff --git a/src/computervision/hand_detect_region.cpp b/src/computervision/hand_detect_region.cpp index b2c61f2..206525c 100644 --- a/src/computervision/hand_detect_region.cpp +++ b/src/computervision/hand_detect_region.cpp @@ -56,10 +56,8 @@ namespace computervision if (!skin_calibrated) { - skin_detector.calibrate(input_frame); - skin_calibrated = true; - hand_calibrator.SetSkinCalibration(skin_calibrated); - time = 0; + if (is_main_skin_detection_region) + skin_timer_callback(); } } @@ -135,6 +133,8 @@ namespace computervision { std::cout << "calibrating skin " << region_id << std::endl; hand_calibrator.SetSkinCalibration(true); + skin_calibrated = true; + time = 0; return skin_detector.calibrateAndReturn(frame_out); } @@ -143,6 +143,8 @@ namespace computervision std::cout << "setting skin " << region_id << std::endl; skin_detector.setTresholds(tresholds); hand_calibrator.SetSkinCalibration(true); + skin_calibrated = true; + time = 0; } void HandDetectRegion::UpdateTime(float delta_time) diff --git a/src/computervision/hand_detect_region.h b/src/computervision/hand_detect_region.h index 3281ce9..17ec562 100644 --- a/src/computervision/hand_detect_region.h +++ b/src/computervision/hand_detect_region.h @@ -39,6 +39,8 @@ namespace computervision void setSkinTresholds(std::vector& tresholds); void UpdateTime(float delta_time); + void SetMainSkinDetecRegion(bool val) { is_main_skin_detection_region = val; }; + void SetSkinTimerCallback(std::function fun) { skin_timer_callback = fun; }; private: @@ -61,6 +63,8 @@ namespace computervision bool background_calibrated = false; bool skin_calibrated = false; + bool is_main_skin_detection_region = false; + std::function skin_timer_callback; diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index e290061..da15efa 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -64,20 +64,20 @@ namespace scene gui_shader->Init(); score = 0; - for (int i = 0; i <= 9; i++) + for (int i = 0; i <= 9; i++) { std::shared_ptr score_pointer; std::string texture_path = "res/"; texture_path += std::to_string(i); texture_path += ".png"; - + score_pointer = std::make_unique(render_engine::loader::LoadTexture(texture_path), glm::vec2(-0.9f, 0.8f), glm::vec2(0.07, 0.15)); - + score_textures.push_back(score_pointer); } - + } /** @@ -102,6 +102,29 @@ namespace scene delete house_generator; } + /** + * @brief sets up the hand detection regions and sets the callbacks for the skin calibration. + * + */ + void In_Game_Scene::SetupHandDetection() + { + // set up squares according to size of camera input + cv::Mat camera_frame; + static_camera::getCap().read(camera_frame); // get camera frame to know the width and heigth + + reg_left.SetMainSkinDetecRegion(true); + reg_right.SetMainSkinDetecRegion(false); + reg_right.SetMainSkinDetecRegion(false); + std::function callback = [this]() {OnSkinCalibrationCallback(); }; + reg_left.SetSkinTimerCallback(callback); + + reg_left.SetXPos(10); + reg_left.SetYPos(camera_frame.rows / 2 - reg_left.GetHeight() / 2); + reg_right.SetXPos(camera_frame.cols - 10 - reg_right.GetWidth()); + reg_right.SetYPos(camera_frame.rows / 2 - reg_right.GetHeight() / 2); + reg_up.SetXPos(camera_frame.cols / 2 - reg_up.GetWidth() / 2); + reg_up.SetYPos(10); + } /** * @brief loads a new chunk in front of the camera, and deletes the chunk behind the camera. @@ -112,16 +135,6 @@ namespace scene void load_chunk(int model_pos) { static unsigned int furniture_count = 0; - - // set up squares according to size of camera input - cv::Mat camera_frame; - static_camera::getCap().read(camera_frame); // get camera frame to know the width and heigth - reg_left.SetXPos(10); - reg_left.SetYPos(camera_frame.rows / 2 - reg_left.GetHeight() / 2); - reg_right.SetXPos(camera_frame.cols - 10 - reg_right.GetWidth()); - reg_right.SetYPos(camera_frame.rows / 2 - reg_right.GetHeight() / 2); - reg_up.SetXPos(camera_frame.cols / 2 - reg_up.GetWidth() / 2); - reg_up.SetYPos(10); std::cout << "loading model chunk" << std::endl; if (house_models.size() >= MAX_MODEL_DEQUE_SIZE * furniture_count) { @@ -156,6 +169,9 @@ namespace scene main_character = std::make_shared(model_char, glm::vec3(0, -50, -100), glm::vec3(0, 90, 0), 5, char_box); collision_entities.push_back(main_character); house_generator = new entities::HouseGenerator(); + + SetupHandDetection(); + // load the first few house models for (int i = 0; i <= UPCOMING_MODEL_AMOUNT; i++) { @@ -285,14 +301,14 @@ namespace scene score += furniture_count_old; std::cout << "Score: " << score << std::endl; std::cout << "Furniture_count_old in model (house excluded): " << furniture_count_old << std::endl; - + } // remember the position at which the new model was added last_model_pos = model_pos; collision::CheckCollisions(collision_entities); update_hand_detection(); - + } @@ -343,22 +359,30 @@ namespace scene cv::imshow("camera", camera_frame); } + void scene::In_Game_Scene::OnSkinCalibrationCallback() + { + std::cout << "on skin calibration callback" << std::endl; + std::vector tresholds = reg_left.CalculateSkinTresholds(); + reg_right.setSkinTresholds(tresholds); + reg_up.setSkinTresholds(tresholds); + } + //renders the models for the pause menu void In_Game_Scene::render_pause_menu() { render_engine::renderer::Render(pause_guis, *gui_shader); } - void In_Game_Scene::DrawScore(int score) - { + void In_Game_Scene::DrawScore(int score) + { std::vector digits; score_guis.clear(); toolbox::GetDigitsFromNumber(score, digits); - for (int i = digits.size()-1; i >= 0; i--) + for (int i = digits.size() - 1; i >= 0; i--) { - score_textures[digits[i]].get()->position.x = 0.15 * i -0.9; + score_textures[digits[i]].get()->position.x = 0.15 * i - 0.9; render_engine::renderer::Render(score_textures[digits[i]], *gui_shader); } diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index 7f4631b..237e640 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -68,6 +68,9 @@ namespace scene */ void render_pause_menu(); void update_hand_detection(); + + void SetupHandDetection(); + void OnSkinCalibrationCallback(); public: In_Game_Scene(); From 0d6f10dff54d4866b7611f86a50d39f8ef67d171 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 18 Jun 2021 11:06:25 +0200 Subject: [PATCH 12/18] [ADD] comments and cleanup includes --- src/computervision/hand_detect_region.cpp | 2 +- src/scenes/in_Game_Scene.cpp | 14 ++---- src/scenes/in_Game_Scene.h | 54 ++++++++++++++++++++--- 3 files changed, 53 insertions(+), 17 deletions(-) diff --git a/src/computervision/hand_detect_region.cpp b/src/computervision/hand_detect_region.cpp index 206525c..d17ddb5 100644 --- a/src/computervision/hand_detect_region.cpp +++ b/src/computervision/hand_detect_region.cpp @@ -23,7 +23,7 @@ namespace computervision if (!background_calibrated || !skin_calibrated) if (time >= TIME_DURATION) { - std::cout << "timer finised, seconds left: " << seconds_left << std::endl; + //std::cout << "timer finised, seconds left: " << seconds_left << std::endl; seconds_left--; time = 0; } diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index da15efa..9535c72 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -102,10 +102,7 @@ namespace scene delete house_generator; } - /** - * @brief sets up the hand detection regions and sets the callbacks for the skin calibration. - * - */ + void In_Game_Scene::SetupHandDetection() { // set up squares according to size of camera input @@ -126,13 +123,8 @@ namespace scene reg_up.SetYPos(10); } - /** - * @brief loads a new chunk in front of the camera, and deletes the chunk behind the camera. - * - * @param model_pos the amount of models the camera has passed already. This is the rounded result of (z position of camera) / (size of model) - * - */ - void load_chunk(int model_pos) + + void In_Game_Scene::LoadChunk(int model_pos) { static unsigned int furniture_count = 0; std::cout << "loading model chunk" << std::endl; diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index 237e640..125d091 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -3,6 +3,18 @@ #include #include #include +#include +#include +#include +#include +#include +#include +#include +#include +#include +#include + +#include "startup_Scene.h" #include "scene.h" #include "../gui/gui_interactable.h" #include "../models/model.h" @@ -11,9 +23,12 @@ #include "../renderEngine/renderer.h" #include "../shaders/entity_shader.h" #include "../toolbox/toolbox.h" -#include -#include -#include +#include "../entities/main_character.h" +#include "../collision/collision_handler.h" +#include "../entities/house_generator.h" +#include "../computervision/hand_detect_region.h" +#include "../computervision/object_detection.h" + namespace scene @@ -56,7 +71,7 @@ namespace scene std::vector guis; //pause_guis is a list of components that will be rendered when the game is paused. std::vector pause_guis; - + // list of gui texture that holds the textures for the score std::vector> score_guis; void UpdateDeltaTime(); @@ -67,10 +82,39 @@ namespace scene * @return void */ void render_pause_menu(); + + /** + * @brief updates the hand detection with the deltatime and checks the hand detection for each region. als updates the camera display + * + */ void update_hand_detection(); + /** + * @brief sets up the hand detection regions and sets the callbacks for the skin calibration. + * + */ void SetupHandDetection(); + + /** + * @brief callback that gets called when the left skin detect region timout has been reached. sets the other regions with the skin data from the first region + * + */ void OnSkinCalibrationCallback(); + + /** + * @brief draws the score on the screen with the digit resources. + * + * @param score the score to display. + */ + void DrawScore(int score); + + /** + * @brief loads a new chunk in front of the camera, and deletes the chunk behind the camera. + * + * @param model_pos the amount of models the camera has passed already. This is the rounded result of (z position of camera) / (size of model) + * + */ + void LoadChunk(int model_pos); public: In_Game_Scene(); @@ -108,7 +152,7 @@ namespace scene */ void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override; - void DrawScore(int score); + }; } From b446a366fb67eff1ac54635bcc0689b36e75330d Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 18 Jun 2021 11:06:59 +0200 Subject: [PATCH 13/18] [ADD] comments and cleanup includes --- src/scenes/in_Game_Scene.cpp | 23 ----------------------- 1 file changed, 23 deletions(-) diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 9535c72..4542720 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -1,27 +1,4 @@ -#include -#include -#include -#include #include "in_Game_Scene.h" -#include "startup_Scene.h" -#include "../entities/main_character.h" -#include "../collision/collision_handler.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" -#include "../entities/house_generator.h" -#include -#include -#include -#include -#include -#include "../computervision/hand_detect_region.h" -#include "../computervision/object_detection.h" -#include #define MAX_MODEL_DEQUE_SIZE 6 // max amount of models to load at the same time #define UPCOMING_MODEL_AMOUNT 4 // how much models should be loaded in front of us From 982f787d446f320d1a8412522c1696413b53d2d5 Mon Sep 17 00:00:00 2001 From: Sem van der Hoeven Date: Fri, 18 Jun 2021 11:11:56 +0200 Subject: [PATCH 14/18] [ADD] comments --- src/computervision/hand_detect_region.cpp | 1 + src/computervision/object_detection.cpp | 27 +---------------------- src/computervision/object_detection.h | 8 +++++++ src/scenes/in_Game_Scene.cpp | 20 +++-------------- 4 files changed, 13 insertions(+), 43 deletions(-) diff --git a/src/computervision/hand_detect_region.cpp b/src/computervision/hand_detect_region.cpp index d17ddb5..5022d99 100644 --- a/src/computervision/hand_detect_region.cpp +++ b/src/computervision/hand_detect_region.cpp @@ -63,6 +63,7 @@ namespace computervision } + // uncomment these lines to show debug hand information //imshow("output" + region_id, frame_out); //imshow("foreground" + region_id, foreground); //imshow("handMask" + region_id, handMask); diff --git a/src/computervision/object_detection.cpp b/src/computervision/object_detection.cpp index f52fc43..ea3c13f 100644 --- a/src/computervision/object_detection.cpp +++ b/src/computervision/object_detection.cpp @@ -1,15 +1,5 @@ -#include -#include -#include -#include - #include "object_detection.h" -#include "background_remover.h" -#include "skin_detector.h" -#include "finger_count.h" -#include "async/StaticCameraInstance.h" -#include "calibration/HandCalibrator.h" #define TIME_DURATION 1.0f @@ -127,6 +117,7 @@ namespace computervision } imshow("camera", camera_frame); + // uncomment these lines to show debug hand information /*imshow("output", frame_out); imshow("foreground", foreground); imshow("handMask", handMask); @@ -136,22 +127,6 @@ namespace computervision hand_calibrator.SetHandPresent(hand_present); - - int key = waitKey(1); - - if (key == 98) // b, calibrate the background - { - background_remover.calibrate(input_frame); - hand_calibrator.SetBackGroundCalibrated(true); - } - else if (key == 115) // s, calibrate the skin color - { - skin_detector.calibrate(input_frame); - hand_calibrator.SetSkinCalibration(true); - - } - - return fingers_amount > 0; } diff --git a/src/computervision/object_detection.h b/src/computervision/object_detection.h index 8c26660..4cf76d6 100644 --- a/src/computervision/object_detection.h +++ b/src/computervision/object_detection.h @@ -8,6 +8,14 @@ #include #include #include +#include +#include + +#include "background_remover.h" +#include "skin_detector.h" +#include "finger_count.h" +#include "async/StaticCameraInstance.h" +#include "calibration/HandCalibrator.h" namespace computervision diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 4542720..1b43566 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -144,7 +144,7 @@ namespace scene // load the first few house models for (int i = 0; i <= UPCOMING_MODEL_AMOUNT; i++) { - load_chunk(i); + LoadChunk(i); } lights.push_back(entities::Light(glm::vec3(0, 1000, 7000), glm::vec3(5, 5, 5))); // sun @@ -266,7 +266,7 @@ namespace scene // if we have passed a model, load a new one and delete the one behind us if (last_model_pos != model_pos) { - load_chunk(model_pos + UPCOMING_MODEL_AMOUNT); + LoadChunk(model_pos + UPCOMING_MODEL_AMOUNT); score += furniture_count_old; std::cout << "Score: " << score << std::endl; std::cout << "Furniture_count_old in model (house excluded): " << furniture_count_old << std::endl; @@ -297,20 +297,6 @@ namespace scene { game_state = scene::Game_State::RUNNING; } - - if (glfwGetKey(window, GLFW_KEY_B) == GLFW_PRESS) - { - reg_left.CalibrateBackground(); - reg_right.CalibrateBackground(); - reg_up.CalibrateBackground(); - } - - if (glfwGetKey(window, GLFW_KEY_S) == GLFW_PRESS) - { - std::vector tresholds = reg_left.CalculateSkinTresholds(); - reg_right.setSkinTresholds(tresholds); - reg_up.setSkinTresholds(tresholds); - } } void scene::In_Game_Scene::update_hand_detection() @@ -351,7 +337,7 @@ namespace scene for (int i = digits.size() - 1; i >= 0; i--) { - score_textures[digits[i]].get()->position.x = 0.15 * i - 0.9; + score_textures[digits[i]].get()->position.x = 0.15 * i - 0.9; // place the number at the top left. the numbers are just fine tuned to get the position just right render_engine::renderer::Render(score_textures[digits[i]], *gui_shader); } From 022c7eb1f0886dc66bbbd458e1a15685409c96ec Mon Sep 17 00:00:00 2001 From: "DESKTOP-EBR7IVA\\kimve" Date: Fri, 18 Jun 2021 11:20:24 +0200 Subject: [PATCH 15/18] [WIP] collision fixing --- src/entities/collision_entity.cpp | 5 ++++- src/entities/collision_entity.h | 2 +- src/entities/house_generator.cpp | 11 ++++++----- src/entities/house_generator.h | 3 ++- src/entities/main_character.cpp | 2 +- src/main.cpp | 17 +++++++++++++++++ src/scenes/game_Over_Scene.cpp | 1 - src/scenes/in_Game_Scene.cpp | 14 ++++++-------- src/scenes/startup_Scene.cpp | 2 +- 9 files changed, 38 insertions(+), 19 deletions(-) diff --git a/src/entities/collision_entity.cpp b/src/entities/collision_entity.cpp index 304ffb7..3418d3d 100644 --- a/src/entities/collision_entity.cpp +++ b/src/entities/collision_entity.cpp @@ -40,7 +40,10 @@ namespace entities const glm::vec3 size = bounding_box.size; + /*min_xyz = { bounding_box.center_pos.x - (0.5 * size.x), bounding_box.center_pos.y, bounding_box.center_pos.z + (0.5 * size.z) }; + max_xyz = { bounding_box.center_pos.x + (0.5 * size.x), bounding_box.center_pos.y + size.y, bounding_box.center_pos.z - (0.5 * size.z) };*/ + min_xyz = bounding_box.center_pos; - max_xyz = glm::vec3(min_xyz.x + size.x, min_xyz.y + size.y, min_xyz.z + size.z); + max_xyz = { bounding_box.center_pos.x + size.x, bounding_box.center_pos.y + size.y, bounding_box.center_pos.z - size.z }; } } diff --git a/src/entities/collision_entity.h b/src/entities/collision_entity.h index a1269d1..1eb8ee4 100644 --- a/src/entities/collision_entity.h +++ b/src/entities/collision_entity.h @@ -58,7 +58,7 @@ namespace entities void SetCollisionBehaviour(std::function function) { if (function != nullptr) { on_collide = function; } } - protected: + public: /* * @brief: This method moves the collision to the center of the entity diff --git a/src/entities/house_generator.cpp b/src/entities/house_generator.cpp index 6224dde..6d5ef96 100644 --- a/src/entities/house_generator.cpp +++ b/src/entities/house_generator.cpp @@ -20,12 +20,13 @@ namespace entities GenerateFurnitureModels(); } - std::deque> HouseGenerator::GenerateHouse(const glm::vec3& position, float y_rotation) + std::deque> HouseGenerator::GenerateHouse(const glm::vec3& position, float y_rotation) { - std::deque> furniture; + std::deque> furniture; // Add house - furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE)); + collision::Box house_box = { position, glm::vec3(0,0,0) }; + furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE, house_box)); for(int i = 0; i(misc, misc_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, misc_box)); - */ + return furniture; } diff --git a/src/entities/house_generator.h b/src/entities/house_generator.h index ab5e4f1..fcd734d 100644 --- a/src/entities/house_generator.h +++ b/src/entities/house_generator.h @@ -5,6 +5,7 @@ #include #include "../models/Model.h" #include "../collision/collision.h" +#include "collision_entity.h" namespace entities { @@ -44,7 +45,7 @@ namespace entities * * @return: A list with all the entities of the generated house (the furniture) */ - std::deque> GenerateHouse(const glm::vec3& position, float y_rotation); + std::deque> GenerateHouse(const glm::vec3& position, float y_rotation); /* * @brief: Returns the depth of the house (chunk) diff --git a/src/entities/main_character.cpp b/src/entities/main_character.cpp index b366b89..c37e00c 100644 --- a/src/entities/main_character.cpp +++ b/src/entities/main_character.cpp @@ -22,7 +22,7 @@ namespace entities void MainCharacter::Move(GLFWwindow* window) { if (is_playing) { - movement_speed = -0.5f; //Forward speed adjustment, bee is moving at a standard speedrate + movement_speed = -2.0f; //Forward speed adjustment, bee is moving at a standard speedrate down_speed = -1.0f; //Down speed adjustment, downspeed is difference between down_speed and UP_SPEED side_speed = 0; //Side speed adjustment diff --git a/src/main.cpp b/src/main.cpp index 472c320..a799195 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,7 @@ #include "scenes/in_Game_Scene.h" #include "scenes/startup_Scene.h" #include "scenes/game_Over_Scene.h" +#include "entities/collision_entity.h" #include "computervision/ObjectDetection.h" //#include "computervision/OpenPoseImage.h" @@ -59,6 +60,22 @@ void retrieve_points(std::vector arm_points, cv::Mat points_on_image) int main(void) { + collision::Box house_box_1 = { glm::vec3(-50, 0,0), glm::vec3(5,5,5) }; + collision::Box house_box_2 = { glm::vec3(50, 0,0), glm::vec3(5,5,5) }; + entities::CollisionEntity ent1({ {0,0}, {0} }, glm::vec3(-50, 0, 0), glm::vec3(0, 0, 0), 1, house_box_1); + entities::CollisionEntity ent2({ {0,0}, {0} }, glm::vec3(50, 0, 0), glm::vec3(0, 0, 0), 1, house_box_2); + while (true){ + house_box_1.center_pos += 1; + ent1.IncreasePosition(glm::vec3(1, 0, 0)); + ent1.MoveCollisionBox(); + ent2.IncreasePosition(glm::vec3(-1, 0, 0)); + ent2.MoveCollisionBox(); + + if (ent1.IsColliding(ent2)) { + std::cout << "entities are colliding!! " << ent1.GetPosition().x << " : " << ent2.GetPosition().x << std::endl; + } + } + return 0; #pragma region OPENGL_SETTINGS if (!glfwInit()) throw "Could not inditialize glwf"; diff --git a/src/scenes/game_Over_Scene.cpp b/src/scenes/game_Over_Scene.cpp index 5fb9135..3832cb9 100644 --- a/src/scenes/game_Over_Scene.cpp +++ b/src/scenes/game_Over_Scene.cpp @@ -181,5 +181,4 @@ namespace scene hand_mode_gameOver = !hand_mode_gameOver; } } - } \ No newline at end of file diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 0252fe5..71506a3 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -32,8 +32,6 @@ namespace scene std::shared_ptrmain_character; std::vector> collision_entities; - //std::deque> furniture_collision; - entities::HouseGenerator* house_generator; std::deque> house_models; @@ -132,14 +130,16 @@ namespace scene for (int i = 0; i < furniture_count; i++) { house_models.pop_front(); + collision_entities.pop_back(); } } int z_offset = model_pos * (house_generator->GetHouseDepth()); // how much "in the distance" we should load the model - std::deque> furniture = house_generator->GenerateHouse(glm::vec3(0, -75, -50 - z_offset), 90); + std::deque> furniture = house_generator->GenerateHouse(glm::vec3(0, -75, -50 - z_offset), 90); furniture_count = furniture.size(); house_models.insert(house_models.end(), furniture.begin(), furniture.end()); + collision_entities.insert(collision_entities.end(), furniture.begin(), furniture.end()); std::cout << "funriture_count in load chunk (house included): " << furniture_count << std::endl; furniture_count_old = furniture_count - 1; @@ -154,7 +154,6 @@ namespace scene texture.shine_damper = 10; texture.reflectivity = 0; - raw_model_char = render_engine::LoadObjModel("res/beeTwo.obj"); models::TexturedModel model_char = { raw_model_char, texture }; collision::Box char_box = create_bounding_box(raw_model_char.model_size, glm::vec3(0, 0, 0), 1); @@ -230,7 +229,6 @@ namespace scene break; } - glfwSwapBuffers(window); glfwPollEvents(); } @@ -279,6 +277,8 @@ namespace scene return_value = scene::Scenes::GAMEOVER; } + std::cout << "Pos of main char: " << main_character.get()->GetPosition().z << std::endl; + std::cout << "Pos z of collision entity: "<< collision_entities.at(0).get()->GetPosition().z << std::endl; //std::cout << "x get: " << movement.x << "\ny get: " << movement.y << "\nz get: " << movement.z << "\n"; camera->Follow(main_character->GetPosition()); @@ -293,16 +293,14 @@ namespace scene score += furniture_count_old; std::cout << "Score: " << score << std::endl; std::cout << "Furniture_count_old in model (house excluded): " << furniture_count_old << std::endl; - } // remember the position at which the new model was added last_model_pos = model_pos; + std::cout << "amount of collision entities: " << collision_entities.size() << std::endl; collision::CheckCollisions(collision_entities); update_hand_detection(); - - } //manages the key input in the game scene diff --git a/src/scenes/startup_Scene.cpp b/src/scenes/startup_Scene.cpp index 05698ce..b734214 100644 --- a/src/scenes/startup_Scene.cpp +++ b/src/scenes/startup_Scene.cpp @@ -211,7 +211,7 @@ namespace scene { if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { - return_value = scene::Scenes::GAMEOVER; + return_value = scene::Scenes::INGAME; cv::destroyWindow("camera"); } else if (glfwGetKey(window, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { From c0a099a05e1946c83ca126abb6a8ac05bb6d165a Mon Sep 17 00:00:00 2001 From: Menno Date: Fri, 18 Jun 2021 12:32:45 +0200 Subject: [PATCH 16/18] [FIXED] collisions --- src/collision/collision_handler.cpp | 4 +- src/collision/collision_handler.h | 2 +- .../async/StaticCameraInstance.h | 2 +- src/entities/collision_entity.cpp | 8 +- src/entities/house_generator.cpp | 106 +++++++++--------- src/main.cpp | 18 +-- src/scenes/in_Game_Scene.cpp | 4 +- 7 files changed, 63 insertions(+), 81 deletions(-) diff --git a/src/collision/collision_handler.cpp b/src/collision/collision_handler.cpp index 4a82a7f..6859cab 100644 --- a/src/collision/collision_handler.cpp +++ b/src/collision/collision_handler.cpp @@ -3,7 +3,7 @@ namespace collision { - void CheckCollisions(std::vector> entities) + void CheckCollisions(std::vector>& entities) { if (entities.size() < 2) { return; } if (entities.size() == 2) @@ -15,7 +15,7 @@ namespace collision entities[1]->OnCollide(c); } } - + for (int i = 0; i < entities.size() - 2; i++) { std::shared_ptr entity = entities[i]; diff --git a/src/collision/collision_handler.h b/src/collision/collision_handler.h index ea1a67d..8b6d556 100644 --- a/src/collision/collision_handler.h +++ b/src/collision/collision_handler.h @@ -13,5 +13,5 @@ namespace collision * * @param entities: A list with all the collision entities. */ - void CheckCollisions(std::vector> entities); + void CheckCollisions(std::vector>& entities); } \ No newline at end of file diff --git a/src/computervision/async/StaticCameraInstance.h b/src/computervision/async/StaticCameraInstance.h index 625d478..93e4725 100644 --- a/src/computervision/async/StaticCameraInstance.h +++ b/src/computervision/async/StaticCameraInstance.h @@ -6,7 +6,7 @@ namespace static_camera static cv::VideoCapture getCap() { - static cv::VideoCapture cap(0); + static cv::VideoCapture cap(1); return cap; } }; diff --git a/src/entities/collision_entity.cpp b/src/entities/collision_entity.cpp index 3418d3d..ef22775 100644 --- a/src/entities/collision_entity.cpp +++ b/src/entities/collision_entity.cpp @@ -40,10 +40,10 @@ namespace entities const glm::vec3 size = bounding_box.size; - /*min_xyz = { bounding_box.center_pos.x - (0.5 * size.x), bounding_box.center_pos.y, bounding_box.center_pos.z + (0.5 * size.z) }; - max_xyz = { bounding_box.center_pos.x + (0.5 * size.x), bounding_box.center_pos.y + size.y, bounding_box.center_pos.z - (0.5 * size.z) };*/ + min_xyz = { bounding_box.center_pos.x - (0.5 * size.x), bounding_box.center_pos.y, bounding_box.center_pos.z - (0.5 * size.z) }; + max_xyz = { bounding_box.center_pos.x + (0.5 * size.x), bounding_box.center_pos.y + size.y, bounding_box.center_pos.z + (0.5 * size.z) }; - min_xyz = bounding_box.center_pos; - max_xyz = { bounding_box.center_pos.x + size.x, bounding_box.center_pos.y + size.y, bounding_box.center_pos.z - size.z }; + // min_xyz = bounding_box.center_pos; + // max_xyz = { bounding_box.center_pos.x + size.x, bounding_box.center_pos.y + size.y, bounding_box.center_pos.z + size.z }; } } diff --git a/src/entities/house_generator.cpp b/src/entities/house_generator.cpp index 6d5ef96..568b792 100644 --- a/src/entities/house_generator.cpp +++ b/src/entities/house_generator.cpp @@ -28,66 +28,66 @@ namespace entities collision::Box house_box = { position, glm::vec3(0,0,0) }; furniture.push_front(std::make_shared(house_model, position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE, house_box)); - for(int i = 0; i(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, model_box)); - //furniture_collision.push_back(std::make_shared(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, model_box)); - - } + // for(int i = 0; i(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, model_box)); + // //furniture_collision.push_back(std::make_shared(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, model_box)); + // + // } //furniture_collision.pop_front(); // Add furniture - models::TexturedModel couch = GetFurnitureModel(FurnitureType::COUCH); - glm::vec3 couch_pos = glm::vec3(position.x + 200, position.y, position.z + 10); - collision::Box couch_box = { couch_pos, couch.raw_model.model_size }; - couch_box.SetRotation(-90); - furniture.push_back(std::make_shared(couch, couch_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, couch_box)); - - models::TexturedModel table = GetFurnitureModel(FurnitureType::TABLE); - glm::vec3 table_pos = glm::vec3(position.x - 30, position.y, position.z); - collision::Box table_box = { table_pos, table.raw_model.model_size }; - furniture.push_back(std::make_shared(table, table_pos, glm::vec3(0, 0, 0), HOUSE_SIZE * 1.3, table_box)); - - models::TexturedModel chair = GetFurnitureModel(FurnitureType::CHAIR); - glm::vec3 chair_pos = glm::vec3(position.x - 50, position.y, position.z + 220); - collision::Box chair_box = { chair_pos, chair.raw_model.model_size }; - furniture.push_back(std::make_shared(chair, chair_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, chair_box)); - - models::TexturedModel plant = GetFurnitureModel(FurnitureType::PLANT); - glm::vec3 plant_pos = glm::vec3(position.x - 50, position.y, position.z + 220); - collision::Box plant_box = { plant_pos, plant.raw_model.model_size }; - furniture.push_back(std::make_shared(plant, plant_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, plant_box)); - - models::TexturedModel guitar = GetFurnitureModel(FurnitureType::GUITAR); - glm::vec3 guitar_pos = glm::vec3(position.x - 50, position.y, position.z + 220); - collision::Box guitar_box = { guitar_pos, guitar.raw_model.model_size }; - furniture.push_back(std::make_shared(guitar, guitar_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, guitar_box)); - - models::TexturedModel bookshelf = GetFurnitureModel(FurnitureType::BOOKSHELF); - glm::vec3 bookshelf_pos = glm::vec3(position.x - 50, position.y, position.z + 220); - collision::Box bookshelf_box = { bookshelf_pos, bookshelf.raw_model.model_size }; - furniture.push_back(std::make_shared(bookshelf, bookshelf_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, bookshelf_box)); - - models::TexturedModel lamp = GetFurnitureModel(FurnitureType::LAMP); - glm::vec3 lamp_pos = glm::vec3(position.x - 50, position.y, position.z + 220); - collision::Box lamp_box = { lamp_pos, lamp.raw_model.model_size }; - furniture.push_back(std::make_shared(lamp, lamp_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, lamp_box)); - - models::TexturedModel ceiling_object = GetFurnitureModel(FurnitureType::CEILING_OBJECTS); - glm::vec3 ceiling_object_pos = glm::vec3(position.x - 50, position.y, position.z + 220); - collision::Box ceiling_object_box = { ceiling_object_pos, ceiling_object.raw_model.model_size }; - furniture.push_back(std::make_shared(ceiling_object, ceiling_object_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, ceiling_object_box)); + // models::TexturedModel couch = GetFurnitureModel(FurnitureType::COUCH); + // glm::vec3 couch_pos = glm::vec3(position.x + 200, position.y, position.z + 10); + // collision::Box couch_box = { couch_pos, couch.raw_model.model_size * (HOUSE_SIZE) }; + // couch_box.SetRotation(-90); + // furniture.push_back(std::make_shared(couch, couch_pos, glm::vec3(0, -90, 0), HOUSE_SIZE * 2, couch_box)); + // + // models::TexturedModel table = GetFurnitureModel(FurnitureType::TABLE); + // glm::vec3 table_pos = glm::vec3(position.x - 30, position.y, position.z); + // collision::Box table_box = { table_pos, table.raw_model.model_size * ((HOUSE_SIZE) * 1.3f) }; + // furniture.push_back(std::make_shared(table, table_pos, glm::vec3(0, 0, 0), HOUSE_SIZE * 1.3, table_box)); + // + // models::TexturedModel chair = GetFurnitureModel(FurnitureType::CHAIR); + // glm::vec3 chair_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + // collision::Box chair_box = { chair_pos, chair.raw_model.model_size * (HOUSE_SIZE) }; + // furniture.push_back(std::make_shared(chair, chair_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, chair_box)); + // + // models::TexturedModel plant = GetFurnitureModel(FurnitureType::PLANT); + // glm::vec3 plant_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + // collision::Box plant_box = { plant_pos, plant.raw_model.model_size * (HOUSE_SIZE) }; + // furniture.push_back(std::make_shared(plant, plant_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, plant_box)); + // + // models::TexturedModel guitar = GetFurnitureModel(FurnitureType::GUITAR); + // glm::vec3 guitar_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + // collision::Box guitar_box = { guitar_pos, guitar.raw_model.model_size * (HOUSE_SIZE) }; + // furniture.push_back(std::make_shared(guitar, guitar_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, guitar_box)); + // + // models::TexturedModel bookshelf = GetFurnitureModel(FurnitureType::BOOKSHELF); + // glm::vec3 bookshelf_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + // collision::Box bookshelf_box = { bookshelf_pos, bookshelf.raw_model.model_size * (HOUSE_SIZE) }; + // furniture.push_back(std::make_shared(bookshelf, bookshelf_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, bookshelf_box)); + // + // models::TexturedModel lamp = GetFurnitureModel(FurnitureType::LAMP); + // glm::vec3 lamp_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + // collision::Box lamp_box = { lamp_pos, lamp.raw_model.model_size * (HOUSE_SIZE) }; + // furniture.push_back(std::make_shared(lamp, lamp_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, lamp_box)); + // + // models::TexturedModel ceiling_object = GetFurnitureModel(FurnitureType::CEILING_OBJECTS); + // glm::vec3 ceiling_object_pos = glm::vec3(position.x - 50, position.y, position.z + 220); + // collision::Box ceiling_object_box = { ceiling_object_pos, ceiling_object.raw_model.model_size * (HOUSE_SIZE / 2) }; + // furniture.push_back(std::make_shared(ceiling_object, ceiling_object_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, ceiling_object_box)); models::TexturedModel misc = GetFurnitureModel(FurnitureType::MISC); - glm::vec3 misc_pos = glm::vec3(position.x - 50, position.y, position.z + 220); - collision::Box misc_box = { misc_pos, misc.raw_model.model_size }; + glm::vec3 misc_pos = glm::vec3(position.x - 50, position.y - 10, position.z + 220); + collision::Box misc_box = { misc_pos, misc.raw_model.model_size * (HOUSE_SIZE) }; furniture.push_back(std::make_shared(misc, misc_pos, glm::vec3(0, 0, 0), HOUSE_SIZE, misc_box)); return furniture; diff --git a/src/main.cpp b/src/main.cpp index a799195..6b94b69 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -60,22 +60,6 @@ void retrieve_points(std::vector arm_points, cv::Mat points_on_image) int main(void) { - collision::Box house_box_1 = { glm::vec3(-50, 0,0), glm::vec3(5,5,5) }; - collision::Box house_box_2 = { glm::vec3(50, 0,0), glm::vec3(5,5,5) }; - entities::CollisionEntity ent1({ {0,0}, {0} }, glm::vec3(-50, 0, 0), glm::vec3(0, 0, 0), 1, house_box_1); - entities::CollisionEntity ent2({ {0,0}, {0} }, glm::vec3(50, 0, 0), glm::vec3(0, 0, 0), 1, house_box_2); - while (true){ - house_box_1.center_pos += 1; - ent1.IncreasePosition(glm::vec3(1, 0, 0)); - ent1.MoveCollisionBox(); - ent2.IncreasePosition(glm::vec3(-1, 0, 0)); - ent2.MoveCollisionBox(); - - if (ent1.IsColliding(ent2)) { - std::cout << "entities are colliding!! " << ent1.GetPosition().x << " : " << ent2.GetPosition().x << std::endl; - } - } - return 0; #pragma region OPENGL_SETTINGS if (!glfwInit()) throw "Could not inditialize glwf"; @@ -159,4 +143,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 index 71506a3..6627d20 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -274,11 +274,9 @@ namespace scene main_character->Move(window); if (!main_character.get()->GetOnCollide()) { - return_value = scene::Scenes::GAMEOVER; + //return_value = scene::Scenes::GAMEOVER; } - std::cout << "Pos of main char: " << main_character.get()->GetPosition().z << std::endl; - std::cout << "Pos z of collision entity: "<< collision_entities.at(0).get()->GetPosition().z << std::endl; //std::cout << "x get: " << movement.x << "\ny get: " << movement.y << "\nz get: " << movement.z << "\n"; camera->Follow(main_character->GetPosition()); From 824f9a2433ec5004d6dc08f7855ebd2ac12ffa74 Mon Sep 17 00:00:00 2001 From: "DESKTOP-EBR7IVA\\kimve" Date: Fri, 18 Jun 2021 13:35:19 +0200 Subject: [PATCH 17/18] [ADD] gameover scene shows the points --- src/main.cpp | 11 ++++---- src/scenes/game_Over_Scene.cpp | 47 +++++++++++++++++++++++++++++----- src/scenes/game_Over_Scene.h | 13 ++++++++-- src/scenes/in_Game_Scene.cpp | 16 +++++------- src/scenes/in_Game_Scene.h | 3 +-- src/scenes/scene.h | 15 ++++++++--- 6 files changed, 75 insertions(+), 30 deletions(-) diff --git a/src/main.cpp b/src/main.cpp index 472c320..ea09479 100644 --- a/src/main.cpp +++ b/src/main.cpp @@ -28,6 +28,7 @@ #include "scenes/in_Game_Scene.h" #include "scenes/startup_Scene.h" #include "scenes/game_Over_Scene.h" +#include "entities/collision_entity.h" #include "computervision/ObjectDetection.h" //#include "computervision/OpenPoseImage.h" @@ -39,6 +40,7 @@ #pragma comment(lib, "glew32s.lib") #pragma comment(lib, "opengl32.lib") +int score; static double UpdateDelta(); static GLFWwindow* window; @@ -73,7 +75,8 @@ int main(void) glGetError(); #pragma endregion - + //TODO change back to 0, only to show how score is visible on end screen + score = 30; current_scene = new scene::Startup_Scene(); glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int scancode, int action, int mods) @@ -88,8 +91,6 @@ int main(void) bool window_open = true; - - // Main game loop while (!glfwWindowShouldClose(window) && window_open) { @@ -110,11 +111,11 @@ int main(void) case scene::Scenes::INGAME: - current_scene = new scene::In_Game_Scene(); + current_scene = new scene::In_Game_Scene(&score); break; case scene::Scenes::GAMEOVER: - current_scene = new scene::Game_Over_Scene(); + current_scene = new scene::Game_Over_Scene(score); break; default: diff --git a/src/scenes/game_Over_Scene.cpp b/src/scenes/game_Over_Scene.cpp index 5fb9135..0291d57 100644 --- a/src/scenes/game_Over_Scene.cpp +++ b/src/scenes/game_Over_Scene.cpp @@ -22,12 +22,12 @@ namespace scene shaders::GuiShader* gui_shader_gameOver; std::vector guis_gameOver; computervision::ObjectDetection objDetect_gameOver; + std::vector> score_textures_gameOver; float item_number_gameOver = 0; - bool hand_mode_gameOver = false; - Game_Over_Scene::Game_Over_Scene() + Game_Over_Scene::Game_Over_Scene(int score) { shaders::EntityShader shader; shader.Init(); @@ -36,13 +36,28 @@ namespace scene gui_shader_gameOver = new shaders::GuiShader(); gui_shader_gameOver->Init(); + + for (int i = 0; i <= 9; i++) + { + std::shared_ptr score_pointer; + + std::string texture_path = "res/"; + texture_path += std::to_string(i); + texture_path += ".png"; + + score_pointer = std::make_unique(render_engine::loader::LoadTexture(texture_path), glm::vec2(0.0f, 0.2f), glm::vec2(0.07, 0.15)); + + score_textures_gameOver.push_back(score_pointer); + } + + game_over_texture = std::make_unique(render_engine::loader::LoadTexture("res/game_over.png"), glm::vec2(0.0f, 0.6f), glm::vec2(0.50f, 0.50f)); + end_score = score; } gui::Button* ConvertGuiTextureToButtonGameOver(gui::GuiTexture* texture) { gui::Button* button; if (texture != NULL) { - if (texture->GetType() == gui::GuiType::BUTTON) { button = (gui::Button*)texture; @@ -75,12 +90,13 @@ namespace scene } scene::Scenes scene::Game_Over_Scene::start(GLFWwindow* window) { - gui::Button button_start_scene(render_engine::loader::LoadTexture("res/Birb1.jpg"), glm::vec2(0.0f, 0.6f), glm::vec2(0.25f, 0.25f)); + gui::Button button_start_scene(render_engine::loader::LoadTexture("res/Birb1.jpg"), glm::vec2(0.0f, -0.5f), glm::vec2(0.25f, 0.25f)); button_start_scene.SetHoverTexture(render_engine::loader::LoadTexture("res/Birb2.jpg")); button_start_scene.SetClickedTexture(render_engine::loader::LoadTexture("res/Birb3.jpg")); button_start_scene.SetOnClickAction([]() { std::cout << "Back to start screen!!" << std::endl; + }); guis_gameOver.push_back(&button_start_scene); @@ -134,7 +150,7 @@ namespace scene } } glfwSwapBuffers(window); - glfwPollEvents(); + glfwPollEvents(); } gui_shader_gameOver->CleanUp(); @@ -165,7 +181,10 @@ namespace scene } bool hand_present; objDetect_gameOver.DetectHand(objDetect_gameOver.ReadCamera(), hand_present); - } + + render_engine::renderer::Render(game_over_texture, *gui_shader_gameOver); + DrawScore(end_score); + } /** * manages the key input in the start-up scene @@ -174,12 +193,26 @@ namespace scene { if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS) { - return_value = scene::Scenes::INGAME; + return_value = scene::Scenes::STARTUP; cv::destroyWindow("camera"); } else if (glfwGetKey(window, GLFW_KEY_BACKSPACE) == GLFW_PRESS) { hand_mode_gameOver = !hand_mode_gameOver; } } + + void Game_Over_Scene::DrawScore(int score) + { + std::vector digits; + score_guis_gameOver.clear(); + + toolbox::GetDigitsFromNumber(score, digits); + + for (int i = digits.size() - 1; i >= 0; i--) + { + score_textures_gameOver[digits[i]].get()->position.x = (0.15 * i - 0.05); + render_engine::renderer::Render(score_textures_gameOver[digits[i]], *gui_shader_gameOver); + } + } } \ No newline at end of file diff --git a/src/scenes/game_Over_Scene.h b/src/scenes/game_Over_Scene.h index e94e758..5fd7203 100644 --- a/src/scenes/game_Over_Scene.h +++ b/src/scenes/game_Over_Scene.h @@ -9,10 +9,15 @@ namespace scene class Game_Over_Scene : public scene::Scene { private: + + int end_score; scene::Scenes return_value = scene::Scenes::GAMEOVER; + std::vector> score_guis_gameOver; + std::shared_ptr game_over_texture; + public: - Game_Over_Scene(); + Game_Over_Scene(int score); Scenes start(GLFWwindow* window) override; @@ -21,6 +26,10 @@ namespace scene void update(GLFWwindow* window) override; void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override; - + /** + * @brief: This method renders the score points onto the game window + * @param score: Score to show + */ + void DrawScore(int score); }; } \ No newline at end of file diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index 0252fe5..6a2cf8f 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -46,6 +46,7 @@ namespace scene int furniture_count_old; int score; + int* ptr; std::vector regions; computervision::HandDetectRegion reg_left("left", 0, 0, 150, 150), reg_right("right", 0, 0, 150, 150), reg_up("up", 0, 0, 150, 150); @@ -53,8 +54,9 @@ namespace scene /** * sets up the first things when the objects has been made */ - In_Game_Scene::In_Game_Scene() + In_Game_Scene::In_Game_Scene(int *score_ptr) { + ptr = score_ptr; camera = std::make_unique(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0)); shader = new shaders::EntityShader; @@ -76,12 +78,7 @@ namespace scene score_pointer = std::make_unique(render_engine::loader::LoadTexture(texture_path), glm::vec2(-0.9f, 0.8f), glm::vec2(0.07, 0.15)); score_textures.push_back(score_pointer); - - std::cout << "Add to score_pointer: " << texture_path << std::endl; } - - std::cout << "Size textures: " << score_textures.size() << std::endl; - } /** @@ -275,11 +272,12 @@ namespace scene //camera.Move(window); main_character->Move(window); if (!main_character.get()->GetOnCollide()) - { + { + *ptr = score; + std::cout << "Score: " << score << std::endl; return_value = scene::Scenes::GAMEOVER; } - //std::cout << "x get: " << movement.x << "\ny get: " << movement.y << "\nz get: " << movement.z << "\n"; camera->Follow(main_character->GetPosition()); // calculate where the next house model should be loaded @@ -301,8 +299,6 @@ namespace scene collision::CheckCollisions(collision_entities); update_hand_detection(); - - } //manages the key input in the game scene diff --git a/src/scenes/in_Game_Scene.h b/src/scenes/in_Game_Scene.h index 241927f..60f1ca1 100644 --- a/src/scenes/in_Game_Scene.h +++ b/src/scenes/in_Game_Scene.h @@ -30,7 +30,6 @@ namespace scene PAUSED }; - class In_Game_Scene : public scene::Scene { private: @@ -68,7 +67,7 @@ namespace scene void update_hand_detection(); public: - In_Game_Scene(); + In_Game_Scene(int *score_ptr); ~In_Game_Scene(); /** diff --git a/src/scenes/scene.h b/src/scenes/scene.h index 4db2fe5..a1af4eb 100644 --- a/src/scenes/scene.h +++ b/src/scenes/scene.h @@ -19,10 +19,11 @@ namespace scene { }; class Scene - { + { + static int END_SCORE; public: virtual ~Scene() = 0; - + /** * @brief the method start is the start of a scene where a while loop runs, this runs the scene. * @param window the main window of the application @@ -54,7 +55,13 @@ namespace scene { * @return void */ virtual void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) {}; + + static void SetEndScore(int score) { + END_SCORE = score; + } + + static int GetEndScore() { + return END_SCORE; + } }; } - - From b92c0c74eb02a5b74e5d72218a636233aaac5e94 Mon Sep 17 00:00:00 2001 From: "DESKTOP-EBR7IVA\\kimve" Date: Fri, 18 Jun 2021 15:08:08 +0200 Subject: [PATCH 18/18] no message --- src/collision/collision_handler.cpp | 2 +- src/collision/collision_handler.h | 3 ++- src/entities/collision_entity.cpp | 4 ++-- src/scenes/game_Over_Scene.cpp | 1 - src/scenes/in_Game_Scene.cpp | 10 +++++++--- 5 files changed, 12 insertions(+), 8 deletions(-) diff --git a/src/collision/collision_handler.cpp b/src/collision/collision_handler.cpp index 6859cab..61d7c0e 100644 --- a/src/collision/collision_handler.cpp +++ b/src/collision/collision_handler.cpp @@ -3,7 +3,7 @@ namespace collision { - void CheckCollisions(std::vector>& entities) + void CheckCollisions(std::deque>& entities) { if (entities.size() < 2) { return; } if (entities.size() == 2) diff --git a/src/collision/collision_handler.h b/src/collision/collision_handler.h index 8b6d556..8887dd8 100644 --- a/src/collision/collision_handler.h +++ b/src/collision/collision_handler.h @@ -4,6 +4,7 @@ #include #include "../entities/collision_entity.h" #include "collision.h" +#include namespace collision { @@ -13,5 +14,5 @@ namespace collision * * @param entities: A list with all the collision entities. */ - void CheckCollisions(std::vector>& entities); + void CheckCollisions(std::deque>& entities); } \ No newline at end of file diff --git a/src/entities/collision_entity.cpp b/src/entities/collision_entity.cpp index ef22775..57e7b9e 100644 --- a/src/entities/collision_entity.cpp +++ b/src/entities/collision_entity.cpp @@ -40,8 +40,8 @@ namespace entities const glm::vec3 size = bounding_box.size; - min_xyz = { bounding_box.center_pos.x - (0.5 * size.x), bounding_box.center_pos.y, bounding_box.center_pos.z - (0.5 * size.z) }; - max_xyz = { bounding_box.center_pos.x + (0.5 * size.x), bounding_box.center_pos.y + size.y, bounding_box.center_pos.z + (0.5 * size.z) }; + min_xyz = { bounding_box.center_pos.x - (0.5 * size.x), bounding_box.center_pos.y, bounding_box.center_pos.z + (0.5 * size.z) }; + max_xyz = { bounding_box.center_pos.x + (0.5 * size.x), bounding_box.center_pos.y + size.y, bounding_box.center_pos.z - (0.5 * size.z) }; // min_xyz = bounding_box.center_pos; // max_xyz = { bounding_box.center_pos.x + size.x, bounding_box.center_pos.y + size.y, bounding_box.center_pos.z + size.z }; diff --git a/src/scenes/game_Over_Scene.cpp b/src/scenes/game_Over_Scene.cpp index 8b1e50b..a04ac48 100644 --- a/src/scenes/game_Over_Scene.cpp +++ b/src/scenes/game_Over_Scene.cpp @@ -214,5 +214,4 @@ namespace scene render_engine::renderer::Render(score_textures_gameOver[digits[i]], *gui_shader_gameOver); } } - } \ No newline at end of file diff --git a/src/scenes/in_Game_Scene.cpp b/src/scenes/in_Game_Scene.cpp index ba84036..f741403 100644 --- a/src/scenes/in_Game_Scene.cpp +++ b/src/scenes/in_Game_Scene.cpp @@ -30,7 +30,7 @@ namespace scene { std::shared_ptrmain_character; - std::vector> collision_entities; + std::deque> collision_entities; //std::deque> furniture_collision; @@ -129,7 +129,7 @@ namespace scene for (int i = 0; i < furniture_count; i++) { house_models.pop_front(); - collision_entities.pop_back(); + collision_entities.erase(collision_entities.begin() + 1); } } int z_offset = model_pos * (house_generator->GetHouseDepth()); // how much "in the distance" we should load the model @@ -158,8 +158,10 @@ namespace scene models::TexturedModel model_char = { raw_model_char, texture }; collision::Box char_box = create_bounding_box(raw_model_char.model_size, glm::vec3(0, 0, 0), 1); main_character = std::make_shared(model_char, glm::vec3(0, 50, -100), glm::vec3(0, 90, 0), 5, char_box); - collision_entities.push_back(main_character); + + //collision_entities.push_back(main_character); house_generator = new entities::HouseGenerator(); + // load the first few house models for (int i = 0; i <= UPCOMING_MODEL_AMOUNT; i++) { @@ -297,8 +299,10 @@ namespace scene } // remember the position at which the new model was added last_model_pos = model_pos; + collision_entities.push_front(main_character); collision::CheckCollisions(collision_entities); + collision_entities.pop_front(); update_hand_detection(); }