Compare commits

5 Commits

Author SHA1 Message Date
Sem van der Hoeven
c5939f7702 [EDIT] removed uses of face detector 2021-06-01 12:19:37 +02:00
Sem van der Hoeven
2cec8e9a62 [REMOVE] removed unused face detector 2021-06-01 12:18:19 +02:00
Menno
820c5a2eb0 [FIXED] merge errors 2021-05-28 10:10:58 +02:00
Menno
942ddf24d8 Merge remote-tracking branch 'origin/feature/scenes' into feature/rendering-engine-expansion 2021-05-28 10:06:36 +02:00
Lars
1f2258bc01 [ADD] skeleton code for different scenes 2021-05-25 15:52:41 +02:00
35 changed files with 283 additions and 856 deletions

2
.gitignore vendored
View File

@@ -428,6 +428,4 @@ FodyWeavers.xsd
**/docs/* **/docs/*
**/doc/* **/doc/*
**/pose_iter_160000.caffemodel
# End of https://www.toptal.com/developers/gitignore/api/c++,visualstudio,visualstudiocode,opencv # End of https://www.toptal.com/developers/gitignore/api/c++,visualstudio,visualstudiocode,opencv

0
gameoverScene.cpp Normal file
View File

0
gameoverScene.h Normal file
View File

View File

@@ -1,31 +0,0 @@
#pragma once
#include <glm/gtc/matrix_transform.hpp>
#include "../entities/entity.h"
namespace collision
{
/*
* This structure represents a collision box inside the world.
*
* center_pos: The center position of the collision box
* size: The size in each axis of the collision box
*/
struct Box
{
glm::vec3 center_pos;
glm::vec3 size;
};
/*
* This structure represents a collision between 2 entities
*
* entity1: The first entity
* entity2: The second entity
*/
struct Collision
{
entities::Entity& entity1;
entities::Entity& entity2;
};
}

View File

@@ -1,40 +0,0 @@
#include "collision_handler.h"
namespace collision
{
void CheckCollisions(std::vector<entities::CollisionEntity*>& entities)
{
if (entities.size() == 2)
{
if (entities[0]->IsColliding(*entities[1]))
{
collision::Collision c = { *entities[0], *entities[1] };
entities[0]->OnCollide(c);
entities[1]->OnCollide(c);
}
}
for (int i = 0; i < entities.size() - 2; i++)
{
entities::CollisionEntity* entity = entities[i];
for (int j = i + 1; i < entities.size() - 1; j++)
{
entities::CollisionEntity* entity2 = entities[j];
if (entity == entity2)
{
continue;
}
if (entity->IsColliding(*entity2))
{
collision::Collision c = { *entity, *entity2 };
entity->OnCollide(c);
entity2->OnCollide(c);
break;
}
}
}
}
}

View File

@@ -1,16 +0,0 @@
#pragma once
#include <vector>
#include "../entities/collision_entity.h"
#include "collision.h"
namespace collision
{
/*
* @brief: This function will check all the collision entities for
* collisions and call the OnCollide function when a entity collides.
*
* @param entities: A list with all the collision entities.
*/
void CheckCollisions(std::vector<entities::CollisionEntity*>& entities);
}

View File

@@ -1,53 +0,0 @@
#include "FaceDetector.h"
/*
Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti
*/
namespace computervision
{
Rect getFaceRect(Mat input);
String faceClassifierFileName = "res/haarcascade_frontalface_alt.xml";
CascadeClassifier faceCascadeClassifier;
FaceDetector::FaceDetector(void) {
if (!faceCascadeClassifier.load(faceClassifierFileName))
throw runtime_error("can't load file " + faceClassifierFileName);
}
void FaceDetector::removeFaces(Mat input, Mat output) {
vector<Rect> faces;
Mat frameGray;
cvtColor(input, frameGray, CV_BGR2GRAY);
equalizeHist(frameGray, frameGray);
faceCascadeClassifier.detectMultiScale(frameGray, faces, 1.1, 2, 0 | 2, Size(120, 120)); // HAAR_SCALE_IMAGE is 2
for (size_t i = 0; i < faces.size(); i++) {
rectangle(
output,
Point(faces[i].x, faces[i].y),
Point(faces[i].x + faces[i].width, faces[i].y + faces[i].height),
Scalar(0, 0, 0),
-1
);
}
}
Rect getFaceRect(Mat input) {
vector<Rect> faceRectangles;
Mat inputGray;
cvtColor(input, inputGray, CV_BGR2GRAY);
equalizeHist(inputGray, inputGray);
faceCascadeClassifier.detectMultiScale(inputGray, faceRectangles, 1.1, 2, 0 | 2, Size(120, 120)); // HAAR_SCALE_IMAGE is 2
if (faceRectangles.size() > 0)
return faceRectangles[0];
else
return Rect(0, 0, 1, 1);
}
}

View File

@@ -1,31 +0,0 @@
#pragma once
#include <opencv2/opencv.hpp>
#include <opencv2/imgproc/types_c.h>
#include <opencv2/objdetect.hpp>
#include <opencv2/core.hpp>
#include <opencv2/objdetect/objdetect.hpp>
/*
Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti
*/
using namespace cv;
using namespace std;
namespace computervision
{
class FaceDetector {
public:
/**
* @brief Constructor for the class FaceDetector, loads training data from a file
*
*/
FaceDetector(void);
/**
* @brief Detects faces on an image and blocks them with a black rectangle
*
* @param input Input image
* @param output Output image
*/
void removeFaces(Mat input, Mat output);
};
}

View File

@@ -151,16 +151,9 @@ namespace computervision
drawVectorPoints(frame, filtered_finger_points, color_yellow, false); drawVectorPoints(frame, filtered_finger_points, color_yellow, false);
putText(frame, to_string(filtered_finger_points.size()), center_bounding_rect, FONT_HERSHEY_PLAIN, 3, color_purple); putText(frame, to_string(filtered_finger_points.size()), center_bounding_rect, FONT_HERSHEY_PLAIN, 3, color_purple);
amount_of_fingers = filtered_finger_points.size();
return contours_image; return contours_image;
} }
int FingerCount::getAmountOfFingers()
{
return amount_of_fingers;
}
double FingerCount::findPointsDistance(Point a, Point b) { double FingerCount::findPointsDistance(Point a, Point b) {
Point difference = a - b; Point difference = a - b;
return sqrt(difference.ddot(difference)); return sqrt(difference.ddot(difference));

View File

@@ -24,13 +24,6 @@ namespace computervision
*/ */
Mat findFingersCount(Mat input_image, Mat frame); Mat findFingersCount(Mat input_image, Mat frame);
/**
* @brief gets the currently held-up finger count.
*
* @return the currently held-up finger count
*/
int getAmountOfFingers();
private: private:
// colors to use // colors to use
Scalar color_blue; Scalar color_blue;
@@ -41,8 +34,6 @@ namespace computervision
Scalar color_yellow; Scalar color_yellow;
Scalar color_purple; Scalar color_purple;
int amount_of_fingers;
/** /**
* @brief finds the distance between 2 points. * @brief finds the distance between 2 points.
* *

View File

@@ -1,12 +1,7 @@
#include <opencv2/videoio.hpp>
#include <opencv2/highgui.hpp>
#include <opencv2/video.hpp>
#include "ObjectDetection.h" #include "ObjectDetection.h"
#include "BackgroundRemover.h" #include "BackgroundRemover.h"
#include "SkinDetector.h" #include "SkinDetector.h"
#include "FaceDetector.h"
#include "FingerCount.h" #include "FingerCount.h"
namespace computervision namespace computervision
@@ -15,63 +10,48 @@ namespace computervision
cv::Mat img, imgGray, img2, img2Gray, img3, img4; cv::Mat img, imgGray, img2, img2Gray, img3, img4;
int handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight;
bool handMaskGenerated = false;
Mat frame, frameOut, handMask, foreground, fingerCountDebug; Mat frame, frameOut, handMask, foreground, fingerCountDebug;
BackgroundRemover backgroundRemover; BackgroundRemover backgroundRemover;
SkinDetector skinDetector; SkinDetector skinDetector;
FaceDetector faceDetector;
FingerCount fingerCount; FingerCount fingerCount;
ObjectDetection::ObjectDetection() ObjectDetection::ObjectDetection()
{ {
} }
cv::Mat ObjectDetection::readCamera() { bool ObjectDetection::setup()
cap.read(img); {
return img; if (!cap.isOpened()) {
cout << "Can't find camera!" << endl;
return false;
} }
bool ObjectDetection::detectHand(Mat cameraFrame) cap.read(frame);
{ frameOut = frame.clone();
Mat inputFrame = generateHandMaskSquare(cameraFrame);
frameOut = inputFrame.clone();
// detect skin color
skinDetector.drawSkinColorSampler(frameOut); skinDetector.drawSkinColorSampler(frameOut);
// remove background from image foreground = backgroundRemover.getForeground(frame);
foreground = backgroundRemover.getForeground(inputFrame);
// detect the hand contours
handMask = skinDetector.getSkinMask(foreground); handMask = skinDetector.getSkinMask(foreground);
// count the amount of fingers and put the info on the matrix
fingerCountDebug = fingerCount.findFingersCount(handMask, frameOut); fingerCountDebug = fingerCount.findFingersCount(handMask, frameOut);
// get the amount of fingers //backgroundRemover.calibrate(frame);
int fingers_amount = fingerCount.getAmountOfFingers();
// draw the hand rectangle on the camera input, and draw text showing if the hand is open or closed.
drawHandMaskRect(&cameraFrame);
string hand_text = fingers_amount > 0 ? "open" : "closed";
putText(cameraFrame,hand_text, Point(10, 75), FONT_HERSHEY_PLAIN, 2.0, Scalar(255, 0, 255),3);
imshow("camera", cameraFrame);
/* imshow("output", frameOut); imshow("output", frameOut);
imshow("foreground", foreground); imshow("foreground", foreground);
imshow("handMask", handMask); imshow("handMask", handMask);
imshow("handDetection", fingerCountDebug);*/ imshow("handDetection", fingerCountDebug);
int key = waitKey(1); int key = waitKey(1);
if (key == 98) // b, calibrate the background if (key == 98) // b
backgroundRemover.calibrate(inputFrame); backgroundRemover.calibrate(frame);
else if (key == 115) // s, calibrate the skin color else if (key == 115) // s
skinDetector.calibrate(inputFrame); skinDetector.calibrate(frame);
return fingers_amount > 0; return true;
} }
void ObjectDetection::calculateDifference() void ObjectDetection::calculateDifference()
@@ -88,32 +68,14 @@ namespace computervision
imshow("threshold", img4); imshow("threshold", img4);
} }
void ObjectDetection::detect()
cv::Mat ObjectDetection::generateHandMaskSquare(cv::Mat img)
{ {
handMaskStartXPos = 20; int key = waitKey(1);
handMaskStartYPos = img.rows / 5;
handMaskWidth = img.cols / 3;
handMaskHeight = img.cols / 3;
if (key == 98) // b
cv::Mat mask = cv::Mat::zeros(img.size(), img.type()); backgroundRemover.calibrate(frame);
cv::Mat dstImg = cv::Mat::zeros(img.size(), img.type()); else if (key == 115) // s
skinDetector.calibrate(frame);
cv::rectangle(mask, Rect(handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight), Scalar(255, 255, 255), -1);
img.copyTo(dstImg, mask);
handMaskGenerated = true;
return dstImg;
}
bool ObjectDetection::drawHandMaskRect(cv::Mat* input)
{
if (!handMaskGenerated) return false;
rectangle(*input, Rect(handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight), Scalar(255, 255, 255));
return true;
} }
void ObjectDetection::showWebcam() void ObjectDetection::showWebcam()

View File

@@ -22,7 +22,13 @@ namespace computervision
* *
*/ */
ObjectDetection(); ObjectDetection();
/**
* @brief Initializes the object detection, captures a frame and modifies it
* so it is ready to use for object detection
*
* @return return true if webcam is connected, returns false if it isn't
*/
bool setup();
/** /**
* @brief Displays an image of the current webcam-footage * @brief Displays an image of the current webcam-footage
* *
@@ -34,36 +40,11 @@ namespace computervision
* *
*/ */
void calculateDifference(); void calculateDifference();
/** /**
* @brief generates the square that will hold the mask in which the hand will be detected. * @brief Listens for keypresses and handles them
* *
* @param img the current camear frame
* @return a matrix containing the mask
*/ */
cv::Mat generateHandMaskSquare(cv::Mat img); void detect();
/**
* @brief reads the camera and returns it in a matrix.
*
* @return the camera frame in a matrix
*/
cv::Mat readCamera();
/**
* @brief detects a hand based on the given hand mask input frame.
*
* @param inputFrame the input frame from the camera
* @return true if hand is open, false if hand is closed
*/
bool detectHand(cv::Mat cameraFrame);
/**
* @brief draws the hand mask rectangle on the given input matrix.
*
* @param input the input matrix to draw the rectangle on
*/
bool drawHandMaskRect(cv::Mat *input);
}; };

View File

@@ -22,7 +22,7 @@ namespace computervision
void SkinDetector::drawSkinColorSampler(Mat input) { void SkinDetector::drawSkinColorSampler(Mat input) {
int frameWidth = input.size().width, frameHeight = input.size().height; int frameWidth = input.size().width, frameHeight = input.size().height;
int rectangleSize = 25; int rectangleSize = 20;
Scalar rectangleColor = Scalar(255, 0, 255); Scalar rectangleColor = Scalar(255, 0, 255);
skinColorSamplerRectangle1 = Rect(frameWidth / 5, frameHeight / 2, rectangleSize, rectangleSize); skinColorSamplerRectangle1 = Rect(frameWidth / 5, frameHeight / 2, rectangleSize, rectangleSize);

View File

@@ -1,5 +1,5 @@
#pragma once #pragma once
#include <GL/glew.h>
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/matrix_transform.hpp>

View File

@@ -11,9 +11,8 @@ namespace entities
class Entity class Entity
{ {
protected: private:
models::TexturedModel model; models::TexturedModel model;
glm::vec3 position; glm::vec3 position;
glm::vec3 rotation; glm::vec3 rotation;
float scale; float scale;

View File

@@ -1,44 +0,0 @@
#include "collision_entity.h"
namespace entities
{
CollisionEntity::CollisionEntity(const models::TexturedModel& model, const glm::vec3& position,
const glm::vec3& rotation, float scale, const collision::Box& bounding_box)
: Entity(model, position, rotation, scale),
bounding_box(bounding_box)
{
MoveCollisionBox();
}
void CollisionEntity::OnCollide(const collision::Collision& collision)
{
if (on_collide != nullptr)
{
on_collide(collision);
}
}
bool CollisionEntity::IsColliding(const glm::vec3& point) const
{
return (point.x >= min_xyz.x && point.x <= max_xyz.x) &&
(point.y >= min_xyz.y && point.y <= max_xyz.y) &&
(point.z >= min_xyz.z && point.z <= max_xyz.z);
}
bool CollisionEntity::IsColliding(const CollisionEntity& e) const
{
return (min_xyz.x <= e.max_xyz.x && max_xyz.x >= e.min_xyz.x) &&
(min_xyz.y <= e.max_xyz.y && max_xyz.y >= e.min_xyz.y) &&
(min_xyz.z <= e.max_xyz.z && max_xyz.z >= e.min_xyz.z);
}
void CollisionEntity::MoveCollisionBox()
{
bounding_box.center_pos = position;
const glm::vec3 size = bounding_box.size;
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);
}
}

View File

@@ -1,65 +0,0 @@
#pragma once
#include "entity.h"
#include "../collision/collision.h"
namespace entities
{
/*
* This class is an entity with a collision box
*/
class CollisionEntity : public Entity
{
public:
collision::Box bounding_box;
glm::vec3 min_xyz;
glm::vec3 max_xyz;
void (*on_collide)(const collision::Collision& collision);
public:
CollisionEntity(const models::TexturedModel& model, const glm::vec3& position, const glm::vec3& rotation,
float scale, const collision::Box& bounding_box);
/*
* @brief: A function to do some sort of behaviour when the entity collides
*
* @param collision: The collision
*/
virtual void OnCollide(const collision::Collision& collision);
/*
* @brief: A function to check if the entity is colliding with a point in 3D space
*
* @param point: The point to check if its colliding with the entity
*
* @return: True is the entity is colliding, false if not
*/
bool IsColliding(const glm::vec3& point) const;
/*
* @brief: A function to check if the entity is colliding with another entity
*
* @param e: The other entity to check if its colliding with this
*
* @return: True is the entity is colliding, false if not
*/
bool IsColliding(const CollisionEntity& e) const;
/*
* @brief: A function to set the collision behaviour of the entity
*
* @param function: A function pointer to a function with the collision behaviour
*/
void SetCollisionBehaviour(void (*function)(const collision::Collision& collision))
{ if (function != nullptr) { on_collide = function; } }
protected:
/*
* @brief: This method moves the collision to the center of the entity
*/
void MoveCollisionBox();
};
}

View File

@@ -1,4 +1,3 @@
#include <GL/glew.h>
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include "gui_interactable.h" #include "gui_interactable.h"

View File

@@ -3,10 +3,10 @@
#include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/matrix_transform.hpp>
#define STB_IMAGE_IMPLEMENTATION #define STB_IMAGE_IMPLEMENTATION
#include <iostream> #include <iostream>
#include <map>
#include "stb_image.h" #include "stb_image.h"
#include <ostream> #include <ostream>
#include <map>
#include <opencv2/core.hpp> #include <opencv2/core.hpp>
#include <opencv2/videoio.hpp> #include <opencv2/videoio.hpp>
@@ -19,9 +19,10 @@
#include "renderEngine/renderer.h" #include "renderEngine/renderer.h"
#include "shaders/entity_shader.h" #include "shaders/entity_shader.h"
#include "toolbox/toolbox.h" #include "toolbox/toolbox.h"
#include "scenes/scene.h" #include "scenes/scene.h"
#include "scenes/in_Game_Scene.h" #include "scenes/startupScene.h"
#include "scenes/startup_Scene.h" #include "scenes/inGameScene.h"
#include "computervision/ObjectDetection.h" #include "computervision/ObjectDetection.h"
@@ -32,7 +33,11 @@
static double UpdateDelta(); static double UpdateDelta();
static GLFWwindow* window; static GLFWwindow* window;
scene::Scene* current_scene;
//Scene management variables
std::map<Scenes, Scene*> scenes;
Scene* current_scene = nullptr;
int main(void) int main(void)
{ {
@@ -50,50 +55,99 @@ int main(void)
glGetError(); glGetError();
#pragma endregion #pragma endregion
current_scene = new scene::Startup_Scene();
glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int scancode, int action, int mods) glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int scancode, int action, int mods)
{ {
current_scene->onKey(key, scancode, action, mods);
if (key == GLFW_KEY_ESCAPE) if (key == GLFW_KEY_ESCAPE)
{
glfwSetWindowShouldClose(window, true); glfwSetWindowShouldClose(window, true);
}
current_scene->onKey(window, key, scancode, action, mods);
}); });
bool window_open = true; scenes[Scenes::STARTUP] = new StartupScene();
scenes[Scenes::INGAME] = new InGameScene();
models::RawModel raw_model = render_engine::LoadObjModel("res/House.obj");
models::ModelTexture texture = { render_engine::loader::LoadTexture("res/Texture.png") };
texture.shine_damper = 10;
texture.reflectivity = 0;
models::TexturedModel model = { raw_model, texture };
/**
* load and add some models (in this case some level sections) to the entities list.
* */
std::vector<entities::Entity> entities;
int z = 0;
for (int i = 0; i < 5; ++i)
{
entities.push_back(entities::Entity(model, glm::vec3(0, -50, -50 - z), glm::vec3(0, 90, 0), 20));
z += (raw_model.model_size.x * 20);
}
std::vector<entities::Light> lights;
lights.push_back(entities::Light(glm::vec3(0, 1000, -7000), glm::vec3(5, 5, 5)));
lights.push_back(entities::Light(glm::vec3(0, 0, -30), glm::vec3(2, 0, 2), glm::vec3(0.0001f, 0.0001f, 0.0001f)));
lights.push_back(entities::Light(glm::vec3(0, 0, -200), glm::vec3(0, 2, 0), glm::vec3(0.0001f, 0.0001f, 0.0001f)));
shaders::EntityShader shader;
shader.Init();
render_engine::renderer::Init(shader);
entities::Camera camera(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0));
// GUI stuff
shaders::GuiShader gui_shader;
gui_shader.Init();
std::vector<gui::GuiTexture*> guis;
gui::Button button(render_engine::loader::LoadTexture("res/Mayo.png"), glm::vec2(0.5f, 0.0f), glm::vec2(0.25f, 0.25f));
button.SetHoverTexture(render_engine::loader::LoadTexture("res/Texture.png"));
button.SetClickedTexture(render_engine::loader::LoadTexture("res/Mayo.png"));
button.SetOnClickAction([]()
{
std::cout << "I got clicked on!" << std::endl;
});
guis.push_back(&button);
// Main game loop // Main game loop
while (!glfwWindowShouldClose(window) && window_open) while (!glfwWindowShouldClose(window))
{ {
// Update // Update
const double delta = UpdateDelta(); const double delta = UpdateDelta();
camera.Move(window);
button.Update(window);
scene::Scenes return_value = current_scene->start(window); // Render
delete current_scene; render_engine::renderer::Prepare();
switch (return_value) { // Start rendering the entities
case scene::Scenes::STOP: shader.Start();
window_open = false; shader.LoadSkyColor(render_engine::renderer::SKY_COLOR);
break; shader.LoadLights(lights);
shader.LoadViewMatrix(camera);
case scene::Scenes::STARTUP: // Renders each entity in the entities list
current_scene = new scene::Startup_Scene(); for (entities::Entity& entity : entities)
break; {
render_engine::renderer::Render(entity, shader);
case scene::Scenes::INGAME:
current_scene = new scene::In_Game_Scene();
break;
default:
std::cout << "Wrong return value!!! ->" << std::endl;
break;
}
} }
// Clean up -> preventing memory leaks!!! // Stop rendering the entities
std::cout << "ending..." << std::endl; shader.Stop();
// Render GUI items
render_engine::renderer::Render(guis, gui_shader);
// Finish up
glfwSwapBuffers(window);
glfwPollEvents();
}
// Clean up
shader.CleanUp();
gui_shader.CleanUp();
render_engine::loader::CleanUp();
current_scene->stop();
glfwTerminate(); glfwTerminate();
return 0; return 0;
} }

View File

@@ -0,0 +1,29 @@
#include "inGameScene.h"
#include <GLFW/glfw3.h>
void InGameScene::start()
{
}
void InGameScene::stop()
{
}
void InGameScene::render()
{
}
void InGameScene::update(GLFWwindow* window)
{
}
void InGameScene::onKey(int key, int scancode, int action, int mods)
{
/**
* misschien iets van als niet in settings dan hoeft alleen escape een knop zijn als reserve optie. Als wel in settings, dan heb je hetzelfde hoe je in het in het begin scherm hebt.
**/
}

17
src/scenes/inGameScene.h Normal file
View File

@@ -0,0 +1,17 @@
#pragma once
#include "scene.h"
class InGameScene : public Scene
{
private:
public:
void start() override;
void stop() override;
void render() override;
void update(GLFWwindow* window) override;
void onKey(int key, int scancode, int action, int mods) override;
};

View File

@@ -1,168 +0,0 @@
#include <iostream>
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include "in_Game_Scene.h"
#include "startup_Scene.h"
#include "../gui/gui_interactable.h"
#include "../models/model.h"
#include "../renderEngine/loader.h"
#include "../renderEngine/obj_loader.h"
#include "../renderEngine/renderer.h"
#include "../shaders/entity_shader.h"
#include "../toolbox/toolbox.h"
#include <deque>
#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
namespace scene
{
std::deque<entities::Entity> house_models;
std::deque<entities::Light> lights;
std::deque<entities::Entity> trees;
models::RawModel raw_model;
models::ModelTexture texture;
shaders::EntityShader* shader;
shaders::GuiShader* gui_shader;
entities::Camera camera(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0));
std::vector<gui::GuiTexture*> guis;
models::TexturedModel model;
models::TexturedModel tree;
In_Game_Scene::In_Game_Scene()
{
shader = new shaders::EntityShader;
shader->Init();
render_engine::renderer::Init(*shader);
gui_shader = new shaders::GuiShader();
gui_shader->Init();
}
/**
* @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)
{
std::cout << "loading model chunk" << std::endl;
if (house_models.size() >= MAX_MODEL_DEQUE_SIZE)
{
house_models.pop_back();
trees.pop_back();
}
int z_offset = model_pos * (model.raw_model.model_size.x * 20); // how much "in the distance" we should load the model
house_models.push_front(entities::Entity(model, glm::vec3(0, -50, -50 - z_offset), glm::vec3(0, 90, 0), 20));
trees.push_front(entities::Entity(tree, glm::vec3(0, 0, -50 - z_offset), glm::vec3(0, 90, 0), 3));
}
scene::Scenes scene::In_Game_Scene::start(GLFWwindow* window)
{
raw_model = render_engine::LoadObjModel("res/House.obj");
texture = { render_engine::loader::LoadTexture("res/Texture.png") };
texture.shine_damper = 10;
texture.reflectivity = 0;
model = { raw_model, texture };
models::RawModel raw_tree_model = render_engine::LoadObjModel("res/Tree.obj");
models::ModelTexture tree_texture = { render_engine::loader::LoadTexture("res/TreeTexture.png") };
tree = { raw_tree_model, tree_texture };
// load the first few house models
for (int i = 0; i <= UPCOMING_MODEL_AMOUNT; i++)
{
load_chunk(i);
}
lights.push_back(entities::Light(glm::vec3(0, 1000, -7000), glm::vec3(5, 5, 5))); // sun
lights.push_back(entities::Light(glm::vec3(0, 0, -30), glm::vec3(2, 0, 2), glm::vec3(0.0001f, 0.0001f, 0.0001f)));
lights.push_back(entities::Light(glm::vec3(0, 0, -200), glm::vec3(0, 2, 0), glm::vec3(0.0001f, 0.0001f, 0.0001f)));
// GUI stuff
gui::Button button(render_engine::loader::LoadTexture("res/Mayo.png"), glm::vec2(0.5f, 0.0f), glm::vec2(0.25f, 0.25f));
button.SetHoverTexture(render_engine::loader::LoadTexture("res/Texture.png"));
button.SetClickedTexture(render_engine::loader::LoadTexture("res/Mayo.png"));
button.SetOnClickAction([]()
{
std::cout << "I got clicked on!" << std::endl;
});
guis.push_back(&button);
while (return_value == scene::Scenes::INGAME)
{
update(window);
button.Update(window);
render();
glfwSwapBuffers(window);
glfwPollEvents();
}
shader->CleanUp();
gui_shader->CleanUp();
render_engine::loader::CleanUp();
return return_value;
}
void scene::In_Game_Scene::render()
{
// Render
render_engine::renderer::Prepare();
shader->Start();
shader->LoadSkyColor(render_engine::renderer::SKY_COLOR);
shader->LoadLightsDeque(lights);
shader->LoadViewMatrix(camera);
for (entities::Entity& model_entity : house_models)
{
render_engine::renderer::Render(model_entity, *shader);
}
for (entities::Entity& tree_entity : trees)
{
render_engine::renderer::Render(tree_entity, *shader);
}
// Render GUI items
render_engine::renderer::Render(guis, *gui_shader);
// Stop rendering the entities
shader->Stop();
}
void scene::In_Game_Scene::update(GLFWwindow* window)
{
camera.Move(window);
// calculate where the next house model should be loaded
static int last_model_pos = 0;
int model_pos = -round(camera.GetPosition().z / (model.raw_model.model_size.x * 20)); // how much models we have passed, minus because we are moving in the negative z axis
// 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);
}
// remember the position at which the new model was added
last_model_pos = model_pos;
}
void scene::In_Game_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
{
return_value = scene::Scenes::STOP;
}
}
}

View File

@@ -1,22 +0,0 @@
#pragma once
#include "scene.h"
namespace scene
{
class In_Game_Scene : public scene::Scene
{
private:
scene::Scenes return_value = scene::Scenes::INGAME;
public:
In_Game_Scene();
Scenes start(GLFWwindow* window) override;
void render() override;
void update(GLFWwindow* window) override;
void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override;
};
}

1
src/scenes/scene.cpp Normal file
View File

@@ -0,0 +1 @@
#include "scene.h"

View File

@@ -1,31 +1,23 @@
#pragma once #pragma once
#include <GL/glew.h>
#include <GLFW/glfw3.h> #include <GLFW/glfw3.h>
#include <map>
class Scene
{
public:
virtual void start() = 0;
virtual void stop() = 0;
virtual void render() = 0;
virtual void update(GLFWwindow* window) = 0;
virtual void onKey(int key, int scancode, int action, int mods) {};
};
namespace scene {
enum class Scenes enum class Scenes
{ {
STARTUP, STARTUP,
INGAME, INGAME,
GAMEOVER, GAMEOVER,
CALIBRATION, SETTINGS,
STOP CALIBRATION
}; };
class Scene
{
public:
virtual Scenes start(GLFWwindow* window) = 0;
virtual void render() = 0;
virtual void update(GLFWwindow* window) = 0;
virtual void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) {};
};
}

View File

@@ -0,0 +1,31 @@
#include "startupScene.h"
#include <GLFW/glfw3.h>
void StartupScene::start()
{
}
void StartupScene::stop()
{
}
void StartupScene::render()
{
}
void StartupScene::update(GLFWwindow* window)
{
}
void StartupScene::onKey(int key, int scancode, int action, int mods)
{
if (key == GLFW_KEY_DOWN && action == GLFW_RELEASE)
{
//ideetje voor het scrollen door het menu heen
//menuIndex = (menuIndex + 1) % 4;
}
}

15
src/scenes/startupScene.h Normal file
View File

@@ -0,0 +1,15 @@
#pragma once
#include "scene.h"
class StartupScene : public Scene
{
private:
int menuIndex;
public:
void start() override;
void stop() override;
void render() override;
void update(GLFWwindow* window) override;
void onKey(int key, int scancode, int action, int mods) override;
};

View File

@@ -1,40 +0,0 @@
#include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <map>
#include "startup_Scene.h"
namespace scene
{
scene::Scenes scene::Startup_Scene::start(GLFWwindow *window)
{
while (return_value == scene::Scenes::STARTUP)
{
render();
update(window);
glfwSwapBuffers(window);
glfwPollEvents();
}
return return_value;
}
void scene::Startup_Scene::render()
{
}
void scene::Startup_Scene::update(GLFWwindow* window)
{
}
void scene::Startup_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods)
{
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
{
return_value = scene::Scenes::INGAME;
}
}
}

View File

@@ -1,22 +0,0 @@
#pragma once
#include "scene.h"
#include <map>
namespace scene
{
extern GLFWwindow* window;
class Startup_Scene : public scene::Scene
{
private:
scene::Scenes return_value = scene::Scenes::STARTUP;
public:
Scenes start(GLFWwindow* window) override;
void render() override;
void update(GLFWwindow* window) override;
void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override;
};
}

View File

@@ -1,6 +1,5 @@
#include "entity_shader.h" #include "entity_shader.h"
#include "../toolbox/toolbox.h" #include "../toolbox/toolbox.h"
#include <deque>
namespace shaders namespace shaders
{ {
@@ -161,25 +160,6 @@ namespace shaders
} }
} }
void EntityShader::LoadLightsDeque(std::deque<entities::Light>& lights) const
{
for (int i = 0; i < MAX_LIGHTS; ++i)
{
if (i < lights.size())
{
LoadVector(location_light_position[i], lights[i].GetPosition());
LoadVector(location_light_color[i], lights[i].GetColor());
LoadVector(location_light_attenuation[i], lights[i].GetAttenuation());
}
else
{
LoadVector(location_light_position[i], glm::vec3(0, 0, 0));
LoadVector(location_light_color[i], glm::vec3(0, 0, 0));
LoadVector(location_light_attenuation[i], glm::vec3(1, 0, 0));
}
}
}
void EntityShader::LoadShineVariables(float shine_damper, float reflectivity) const void EntityShader::LoadShineVariables(float shine_damper, float reflectivity) const
{ {
LoadFloat(location_shine_damper, shine_damper); LoadFloat(location_shine_damper, shine_damper);

View File

@@ -2,7 +2,6 @@
#include <glm/gtc/matrix_transform.hpp> #include <glm/gtc/matrix_transform.hpp>
#include <vector> #include <vector>
#include <deque>
#include "shader_program.h" #include "shader_program.h"
#include "../entities/camera.h" #include "../entities/camera.h"
#include "../entities/light.h" #include "../entities/light.h"
@@ -59,13 +58,6 @@ namespace shaders
*/ */
void LoadLights(std::vector<entities::Light>& lights) const; void LoadLights(std::vector<entities::Light>& lights) const;
/**
* @brief loads some lights contained in a deque.
*
* @param lights the deque containing the lights to load
*/
void LoadLightsDeque(std::deque<entities::Light>& lights) const;
/* /*
* @brief: A method to load the the shine variables from a model into the shader * @brief: A method to load the the shine variables from a model into the shader
* *

View File

@@ -1,5 +1,4 @@
#include <GL/glew.h> #include <GL/glew.h>
#include <GLFW/glfw3.h>
#include <iostream> #include <iostream>
#include <fstream> #include <fstream>
#include <vector> #include <vector>

View File

@@ -1,46 +0,0 @@
#pragma once
namespace toolbox
{
/*
* This class represents a timer which needs to be updated
* every frame to work correctly.
*/
class Timer
{
private:
float current_time;
float final_time;
bool has_finished;
public:
/*
* @brief: Constructor to make the timer
*
* @param final_time: The time which the timer needs to count to
*/
Timer(float final_time): current_time(0), final_time(final_time), has_finished(false) {}
/*
* @brief: Updates the timer. Call this method once every iteration in the game loop
*
* @param delta: The deltatime of the game
*/
void UpdateTimer(const double delta)
{
current_time += delta;
if (current_time >= final_time)
{
has_finished = true;
}
}
/*
* @brief: Returns if the timer has finished
*
* @return: True if the timer has finished
*/
bool HasFinished() const { return has_finished; }
};
}

View File

@@ -19,15 +19,13 @@
</ProjectConfiguration> </ProjectConfiguration>
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClCompile Include="src\collision\collision_handler.cpp" /> <ClCompile Include="src\scenes\inGameScene.cpp" />
<ClCompile Include="src\scenes\in_Game_Scene.cpp" /> <ClCompile Include="src\scenes\scene.cpp" />
<ClCompile Include="src\computervision\FaceDetector.cpp" />
<ClCompile Include="src\computervision\ObjectDetection.cpp" /> <ClCompile Include="src\computervision\ObjectDetection.cpp" />
<ClCompile Include="src\computervision\SkinDetector.cpp" /> <ClCompile Include="src\computervision\SkinDetector.cpp" />
<ClCompile Include="src\computervision\FingerCount.cpp" /> <ClCompile Include="src\computervision\FingerCount.cpp" />
<ClCompile Include="src\computervision\BackgroundRemover.cpp" /> <ClCompile Include="src\computervision\BackgroundRemover.cpp" />
<ClCompile Include="src\entities\camera.cpp" /> <ClCompile Include="src\entities\camera.cpp" />
<ClCompile Include="src\entities\collision_entity.cpp" />
<ClCompile Include="src\entities\entity.cpp" /> <ClCompile Include="src\entities\entity.cpp" />
<ClCompile Include="src\gui\gui_interactable.cpp" /> <ClCompile Include="src\gui\gui_interactable.cpp" />
<ClCompile Include="src\main.cpp" /> <ClCompile Include="src\main.cpp" />
@@ -38,20 +36,16 @@
<ClCompile Include="src\shaders\shader_program.cpp" /> <ClCompile Include="src\shaders\shader_program.cpp" />
<ClCompile Include="src\shaders\entity_shader.cpp" /> <ClCompile Include="src\shaders\entity_shader.cpp" />
<ClCompile Include="src\toolbox\toolbox.cpp" /> <ClCompile Include="src\toolbox\toolbox.cpp" />
<ClCompile Include="src\scenes\startup_Scene.cpp" /> <ClCompile Include="src\scenes\startupScene.cpp" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ClInclude Include="src\collision\collision.h" /> <ClInclude Include="src\scenes\inGameScene.h" />
<ClInclude Include="src\collision\collision_handler.h" />
<ClInclude Include="src\scenes\in_Game_Scene.h" />
<ClInclude Include="src\scenes\scene.h" /> <ClInclude Include="src\scenes\scene.h" />
<ClInclude Include="src\computervision\FaceDetector.h" />
<ClInclude Include="src\computervision\FingerCount.h" /> <ClInclude Include="src\computervision\FingerCount.h" />
<ClInclude Include="src\computervision\BackgroundRemover.h" /> <ClInclude Include="src\computervision\BackgroundRemover.h" />
<ClInclude Include="src\computervision\SkinDetector.h" /> <ClInclude Include="src\computervision\SkinDetector.h" />
<ClInclude Include="src\computervision\ObjectDetection.h" /> <ClInclude Include="src\computervision\ObjectDetection.h" />
<ClInclude Include="src\entities\camera.h" /> <ClInclude Include="src\entities\camera.h" />
<ClInclude Include="src\entities\collision_entity.h" />
<ClInclude Include="src\entities\entity.h" /> <ClInclude Include="src\entities\entity.h" />
<ClInclude Include="src\entities\light.h" /> <ClInclude Include="src\entities\light.h" />
<ClInclude Include="src\gui\gui_element.h" /> <ClInclude Include="src\gui\gui_element.h" />
@@ -64,9 +58,8 @@
<ClInclude Include="src\shaders\shader_program.h" /> <ClInclude Include="src\shaders\shader_program.h" />
<ClInclude Include="src\shaders\entity_shader.h" /> <ClInclude Include="src\shaders\entity_shader.h" />
<ClInclude Include="src\stb_image.h" /> <ClInclude Include="src\stb_image.h" />
<ClInclude Include="src\toolbox\Timer.h" />
<ClInclude Include="src\toolbox\toolbox.h" /> <ClInclude Include="src\toolbox\toolbox.h" />
<ClInclude Include="src\scenes\startup_Scene.h" /> <ClInclude Include="src\scenes\startupScene.h" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<Xml Include="res\haarcascade_frontalface_alt.xml" /> <Xml Include="res\haarcascade_frontalface_alt.xml" />
@@ -129,16 +122,16 @@
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
<LinkIncremental>true</LinkIncremental> <LinkIncremental>true</LinkIncremental>
<IncludePath>C:\opencv\build\include;$(IncludePath);C:\opencv\opencv\build\include;C:\opencv\build\include</IncludePath> <IncludePath>C:\opencv\build\include;$(IncludePath);C:\opencv\opencv\build\include</IncludePath>
<LibraryPath>C:\opencv\build\x64\vc15\lib;$(LibraryPath);C:\opencv\opencv\build\x64\vc15\lib;C:\opencv\build\x64\vc15\lib</LibraryPath> <LibraryPath>C:\opencv\build\x64\vc15\lib;$(LibraryPath);C:\opencv\opencv\build\x64\vc15\lib</LibraryPath>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
</PropertyGroup> </PropertyGroup>
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'"> <PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
<LinkIncremental>false</LinkIncremental> <LinkIncremental>false</LinkIncremental>
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);;C:\opencv\opencv\build\include;C:\opencv\build\include</IncludePath> <IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);;C:\opencv\opencv\build\include</IncludePath>
<LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);C:\opencv\opencv\build\x64\vc15\lib;C:\opencv\build\x64\vc15\lib</LibraryPath> <LibraryPath>$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);C:\opencv\opencv\build\x64\vc15\lib</LibraryPath>
</PropertyGroup> </PropertyGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
<ClCompile> <ClCompile>
@@ -170,7 +163,7 @@
<SubSystem>Console</SubSystem> <SubSystem>Console</SubSystem>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)lib\glfw-3.3.2\$(Platform);$(SolutionDir)lib\glew-2.1.0\lib\Release\$(Platform);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(SolutionDir)lib\glfw-3.3.2\$(Platform);$(SolutionDir)lib\glew-2.1.0\lib\Release\$(Platform);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>opencv_world452d.lib;%(AdditionalDependencies); opencv_world452.lib;opencv_world452d.lib</AdditionalDependencies> <AdditionalDependencies>opencv_world452d.lib;%(AdditionalDependencies); opencv_world452.lib</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'"> <ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
@@ -211,7 +204,7 @@
<OptimizeReferences>true</OptimizeReferences> <OptimizeReferences>true</OptimizeReferences>
<GenerateDebugInformation>true</GenerateDebugInformation> <GenerateDebugInformation>true</GenerateDebugInformation>
<AdditionalLibraryDirectories>$(SolutionDir)lib\glfw-3.3.2\$(Platform);$(SolutionDir)lib\glew-2.1.0\lib\Release\$(Platform);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories> <AdditionalLibraryDirectories>$(SolutionDir)lib\glfw-3.3.2\$(Platform);$(SolutionDir)lib\glew-2.1.0\lib\Release\$(Platform);%(AdditionalLibraryDirectories)</AdditionalLibraryDirectories>
<AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies); opencv_world452.lib;opencv_world452d.lib</AdditionalDependencies> <AdditionalDependencies>kernel32.lib;user32.lib;gdi32.lib;winspool.lib;comdlg32.lib;advapi32.lib;shell32.lib;ole32.lib;oleaut32.lib;uuid.lib;odbc32.lib;odbccp32.lib;%(AdditionalDependencies); opencv_world452.lib</AdditionalDependencies>
</Link> </Link>
</ItemDefinitionGroup> </ItemDefinitionGroup>
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" /> <Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />

View File

@@ -48,18 +48,6 @@
<ClCompile Include="src\gui\gui_interactable.cpp"> <ClCompile Include="src\gui\gui_interactable.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="src\scenes\in_Game_Scene.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\scenes\startup_Scene.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\entities\collision_entity.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\collision\collision_handler.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\computervision\ObjectDetection.cpp"> <ClCompile Include="src\computervision\ObjectDetection.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
@@ -69,10 +57,16 @@
<ClCompile Include="src\computervision\FingerCount.cpp"> <ClCompile Include="src\computervision\FingerCount.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="src\computervision\FaceDetector.cpp"> <ClCompile Include="src\computervision\BackgroundRemover.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
<ClCompile Include="src\computervision\BackgroundRemover.cpp"> <ClCompile Include="src\scenes\scene.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\scenes\startupScene.cpp">
<Filter>Source Files</Filter>
</ClCompile>
<ClCompile Include="src\scenes\inGameScene.cpp">
<Filter>Source Files</Filter> <Filter>Source Files</Filter>
</ClCompile> </ClCompile>
</ItemGroup> </ItemGroup>
@@ -119,24 +113,6 @@
<ClInclude Include="src\gui\gui_interactable.h"> <ClInclude Include="src\gui\gui_interactable.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="src\scenes\scene.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\scenes\in_Game_Scene.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\scenes\startup_Scene.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\entities\collision_entity.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\collision\collision.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\collision\collision_handler.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\computervision\ObjectDetection.h"> <ClInclude Include="src\computervision\ObjectDetection.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
@@ -146,13 +122,16 @@
<ClInclude Include="src\computervision\FingerCount.h"> <ClInclude Include="src\computervision\FingerCount.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="src\computervision\FaceDetector.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\computervision\BackgroundRemover.h"> <ClInclude Include="src\computervision\BackgroundRemover.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
<ClInclude Include="src\toolbox\Timer.h"> <ClInclude Include="src\scenes\scene.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\scenes\startupScene.h">
<Filter>Header Files</Filter>
</ClInclude>
<ClInclude Include="src\scenes\inGameScene.h">
<Filter>Header Files</Filter> <Filter>Header Files</Filter>
</ClInclude> </ClInclude>
</ItemGroup> </ItemGroup>