Compare commits
116
Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0b1e37119c | ||
|
|
a204dbbc18 | ||
|
|
5601cabc28 | ||
|
|
baa19a5109 | ||
|
|
76206fa13e | ||
|
|
7c3d68a742 | ||
|
|
1ff08de055 | ||
|
|
c1ba33e55b | ||
|
|
2343b9aee7 | ||
|
|
f6a1258805 | ||
|
|
0c9b663366 | ||
|
|
b04d999a7d | ||
|
|
a6c2558e85 | ||
|
|
3a42966e92 | ||
|
|
497186b587 | ||
|
|
17d2bd7382 | ||
|
|
1d940fe1db | ||
|
|
3d382fd460 | ||
|
|
ec14dd1093 | ||
|
|
17b585190a | ||
|
|
b92c0c74eb | ||
|
|
ad2d651d41 | ||
|
|
5419801113 | ||
|
|
824f9a2433 | ||
|
|
c0a099a05e | ||
|
|
022c7eb1f0 | ||
|
|
06a6930c58 | ||
|
|
982f787d44 | ||
|
|
b446a366fb | ||
|
|
0d6f10dff5 | ||
|
|
f1f8ac2d08 | ||
|
|
01570d8045 | ||
|
|
773e8e9a96 | ||
|
|
ce0a1f3da7 | ||
|
|
8dbe088a91 | ||
|
|
26d438e4d1 | ||
|
|
ca61dfc781 | ||
|
|
e51b56b156 | ||
|
|
344745d9cf | ||
|
|
24285b9714 | ||
|
|
3f172e1484 | ||
|
|
a6fa9514df | ||
|
|
001f28d198 | ||
|
|
fb70d10c47 | ||
|
|
f6fad79c2e | ||
|
|
a65f3391f7 | ||
|
|
3517d2b36a | ||
|
|
9b1bea3eec | ||
|
|
8c1191c131 | ||
|
|
692bb76164 | ||
|
|
bce2ccf889 | ||
|
|
63c6ec8a0c | ||
|
|
504b97b320 | ||
|
|
ae9386a811 | ||
|
|
645c4df494 | ||
|
|
04c6f52e64 | ||
|
|
8835646e32 | ||
|
|
ab7123b89a | ||
|
|
dbecbb594e | ||
|
|
38d3c6e5cb | ||
|
|
71761dd322 | ||
|
|
eaab85ac33 | ||
|
|
cca8680a98 | ||
|
|
4e9e534c02 | ||
|
|
770b54bdd5 | ||
|
|
a8996f63ef | ||
|
|
dd6ee77316 | ||
|
|
88252f4dc8 | ||
|
|
551d53a3dc | ||
|
|
27594d466b | ||
|
|
5e137faef5 | ||
|
|
15f71680a9 | ||
|
|
b092bd5f0a | ||
|
|
cadee7d8e9 | ||
|
|
1e55736615 | ||
|
|
625965ed1b | ||
|
|
509f64f04d | ||
|
|
ae93ed6b34 | ||
|
|
ef470bd4f1 | ||
|
|
69d88ab1c1 | ||
|
|
a4d5658a06 | ||
|
|
afd3e00ddb | ||
|
|
edbbfb136a | ||
|
|
bb68d98bfe | ||
|
|
4587559030 | ||
|
|
e70d2ef19d | ||
|
|
1ab5ae798e | ||
|
|
aa9c6a0fbb | ||
|
|
8c50792657 | ||
|
|
e4b5dc39c0 | ||
|
|
b80653b668 | ||
|
|
ca2959bf2d | ||
|
|
86383aace5 | ||
|
|
cfd2d00d08 | ||
|
|
81dec3b9f4 | ||
|
|
f5926fffcb | ||
|
|
2523e1abfa | ||
|
|
bc5703eb65 | ||
|
|
4c49895f6d | ||
|
|
921609de5d | ||
|
|
fe94b0f83d | ||
|
|
75c745427c | ||
|
|
c25efec103 | ||
|
|
6f546fdd8b | ||
|
|
e166c1f988 | ||
|
|
ab30c41bee | ||
|
|
1a149b8b7e | ||
|
|
cc7cb37840 | ||
|
|
ad35e14bfc | ||
|
|
2468d7fa7f | ||
|
|
f69e104a8d | ||
|
|
8d52703297 | ||
|
|
658b809ef2 | ||
|
|
40529f84b3 | ||
|
|
a68c6a57bf | ||
|
|
078a6ce66d |
@@ -2,6 +2,8 @@
|
||||
# Created by https://www.toptal.com/developers/gitignore/api/c++,visualstudio,visualstudiocode,opencv
|
||||
# Edit at https://www.toptal.com/developers/gitignore?templates=c++,visualstudio,visualstudiocode,opencv
|
||||
|
||||
res/**
|
||||
|
||||
### C++ ###
|
||||
# Prerequisites
|
||||
*.d
|
||||
|
||||
-4495
File diff suppressed because it is too large
Load Diff
Binary file not shown.
|
After Width: | Height: | Size: 294 KiB |
+21593
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <iostream>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include "../entities/entity.h"
|
||||
|
||||
@@ -15,6 +16,18 @@ namespace collision
|
||||
{
|
||||
glm::vec3 center_pos;
|
||||
glm::vec3 size;
|
||||
|
||||
void SetRotation(float angle)
|
||||
{
|
||||
double sinTheta = glm::sin(glm::radians(angle));
|
||||
double cosTheta = glm::cos(glm::radians(angle));
|
||||
|
||||
float x = size.x * cosTheta + size.z * sinTheta;
|
||||
float z = size.z * cosTheta - size.x * sinTheta;
|
||||
|
||||
size.x = x < 0 ? -x : x;
|
||||
size.z = z < 0 ? -z : z;
|
||||
}
|
||||
};
|
||||
|
||||
/*
|
||||
|
||||
@@ -1,9 +1,11 @@
|
||||
#include "collision_handler.h"
|
||||
#include <iostream>
|
||||
|
||||
namespace collision
|
||||
{
|
||||
void CheckCollisions(std::vector<entities::CollisionEntity*>& entities)
|
||||
void CheckCollisions(std::deque<std::shared_ptr<entities::CollisionEntity>>& entities)
|
||||
{
|
||||
if (entities.size() < 2) { return; }
|
||||
if (entities.size() == 2)
|
||||
{
|
||||
if (entities[0]->IsColliding(*entities[1]))
|
||||
@@ -16,11 +18,12 @@ namespace collision
|
||||
|
||||
for (int i = 0; i < entities.size() - 2; i++)
|
||||
{
|
||||
entities::CollisionEntity* entity = entities[i];
|
||||
std::shared_ptr<entities::CollisionEntity> entity = entities[i];
|
||||
|
||||
for (int j = i + 1; i < entities.size() - 1; j++)
|
||||
for (int j = i + 1; j < entities.size() - 1; j++)
|
||||
{
|
||||
entities::CollisionEntity* entity2 = entities[j];
|
||||
|
||||
std::shared_ptr<entities::CollisionEntity> entity2 = entities[j];
|
||||
|
||||
if (entity == entity2)
|
||||
{
|
||||
@@ -36,5 +39,6 @@ namespace collision
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,8 +1,10 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include <vector>
|
||||
#include "../entities/collision_entity.h"
|
||||
#include "collision.h"
|
||||
#include <deque>
|
||||
|
||||
namespace collision
|
||||
{
|
||||
@@ -12,5 +14,5 @@ namespace collision
|
||||
*
|
||||
* @param entities: A list with all the collision entities.
|
||||
*/
|
||||
void CheckCollisions(std::vector<entities::CollisionEntity*>& entities);
|
||||
void CheckCollisions(std::deque<std::shared_ptr<entities::CollisionEntity>>& entities);
|
||||
}
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
@@ -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);
|
||||
};
|
||||
}
|
||||
@@ -1,125 +0,0 @@
|
||||
|
||||
#include <opencv2/videoio.hpp>
|
||||
#include <opencv2/highgui.hpp>
|
||||
#include <opencv2/video.hpp>
|
||||
|
||||
#include "ObjectDetection.h"
|
||||
#include "BackgroundRemover.h"
|
||||
#include "SkinDetector.h"
|
||||
#include "FaceDetector.h"
|
||||
#include "FingerCount.h"
|
||||
|
||||
namespace computervision
|
||||
{
|
||||
cv::VideoCapture cap(0);
|
||||
|
||||
cv::Mat img, imgGray, img2, img2Gray, img3, img4;
|
||||
|
||||
int handMaskStartXPos, handMaskStartYPos, handMaskWidth, handMaskHeight;
|
||||
bool handMaskGenerated = false;
|
||||
|
||||
Mat frame, frameOut, handMask, foreground, fingerCountDebug;
|
||||
BackgroundRemover backgroundRemover;
|
||||
SkinDetector skinDetector;
|
||||
FaceDetector faceDetector;
|
||||
FingerCount fingerCount;
|
||||
|
||||
ObjectDetection::ObjectDetection()
|
||||
{
|
||||
}
|
||||
|
||||
cv::Mat ObjectDetection::readCamera() {
|
||||
cap.read(img);
|
||||
return img;
|
||||
}
|
||||
|
||||
bool ObjectDetection::detectHand(Mat cameraFrame)
|
||||
{
|
||||
Mat inputFrame = generateHandMaskSquare(cameraFrame);
|
||||
frameOut = inputFrame.clone();
|
||||
|
||||
// detect skin color
|
||||
skinDetector.drawSkinColorSampler(frameOut);
|
||||
|
||||
// remove background from image
|
||||
foreground = backgroundRemover.getForeground(inputFrame);
|
||||
|
||||
// detect the hand contours
|
||||
handMask = skinDetector.getSkinMask(foreground);
|
||||
|
||||
// count the amount of fingers and put the info on the matrix
|
||||
fingerCountDebug = fingerCount.findFingersCount(handMask, frameOut);
|
||||
|
||||
// get the amount of fingers
|
||||
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("foreground", foreground);
|
||||
//imshow("handMask", handMask);
|
||||
//imshow("handDetection", fingerCountDebug);
|
||||
|
||||
int key = waitKey(1);
|
||||
|
||||
if (key == 98) // b, calibrate the background
|
||||
backgroundRemover.calibrate(inputFrame);
|
||||
else if (key == 115) // s, calibrate the skin color
|
||||
skinDetector.calibrate(inputFrame);
|
||||
|
||||
return fingers_amount > 0;
|
||||
}
|
||||
|
||||
void ObjectDetection::calculateDifference()
|
||||
{
|
||||
cap.read(img);
|
||||
cap.read(img2);
|
||||
|
||||
cv::cvtColor(img, imgGray, cv::COLOR_RGBA2GRAY);
|
||||
cv::cvtColor(img2, img2Gray, cv::COLOR_RGBA2GRAY);
|
||||
|
||||
cv::absdiff(imgGray, img2Gray, img3);
|
||||
cv::threshold(img3, img4, 50, 170, cv::THRESH_BINARY);
|
||||
|
||||
imshow("threshold", img4);
|
||||
}
|
||||
|
||||
|
||||
cv::Mat ObjectDetection::generateHandMaskSquare(cv::Mat img)
|
||||
{
|
||||
handMaskStartXPos = 20;
|
||||
handMaskStartYPos = img.rows / 5;
|
||||
handMaskWidth = img.cols / 3;
|
||||
handMaskHeight = img.cols / 3;
|
||||
|
||||
|
||||
cv::Mat mask = cv::Mat::zeros(img.size(), img.type());
|
||||
cv::Mat dstImg = cv::Mat::zeros(img.size(), img.type());
|
||||
|
||||
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()
|
||||
{
|
||||
imshow("Webcam image", img);
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -0,0 +1,12 @@
|
||||
#pragma once
|
||||
#include <opencv2/videoio.hpp>
|
||||
|
||||
namespace static_camera
|
||||
{
|
||||
|
||||
static cv::VideoCapture getCap()
|
||||
{
|
||||
static cv::VideoCapture cap(0);
|
||||
return cap;
|
||||
}
|
||||
};
|
||||
+1
-1
@@ -1,4 +1,4 @@
|
||||
#include "BackgroundRemover.h"
|
||||
#include "background_remover.h"
|
||||
|
||||
/*
|
||||
Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti
|
||||
@@ -0,0 +1,91 @@
|
||||
|
||||
#include "HandCalibrator.h"
|
||||
#include <iostream>
|
||||
|
||||
#define MIN_MENU_HAND_SIZE 10000
|
||||
#define MIN_GAME_HAND_SIZE 3000 // todo change
|
||||
namespace computervision
|
||||
{
|
||||
namespace handcalibration
|
||||
{
|
||||
|
||||
HandCalibrator::HandCalibrator()
|
||||
{
|
||||
|
||||
}
|
||||
|
||||
void HandCalibrator::DrawHandCalibrationText(cv::Mat& output_frame)
|
||||
{
|
||||
cv::rectangle(output_frame, cv::Rect(0, 0, output_frame.cols, 40), cv::Scalar(0, 0, 0), -1);
|
||||
cv::putText(output_frame, "Hand calibration", cv::Point(output_frame.cols / 2 - 100, 25), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(18, 219, 65), 2);
|
||||
|
||||
cv::rectangle(output_frame, cv::Rect(0, output_frame.rows - 80, 450, output_frame.cols), cv::Scalar(0, 0, 0), -1);
|
||||
|
||||
cv::putText(output_frame, "hand in frame:", cv::Point(5, output_frame.rows - 50), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1);
|
||||
cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 67, 15, 15), hand_present ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1);
|
||||
|
||||
DrawBackgroundSkinCalibrated(output_frame);
|
||||
|
||||
if (hand_present)
|
||||
{
|
||||
std::string hand_text = fingers_amount > 0 ? "open" : "closed";
|
||||
cv::putText(output_frame, hand_text, cv::Point(10, 75), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 0, 255), 3);
|
||||
}
|
||||
}
|
||||
|
||||
void HandCalibrator::DrawBackgroundSkinCalibrated(cv::Mat& output_frame)
|
||||
{
|
||||
|
||||
cv::putText(output_frame, "background calibrated:", cv::Point(5, output_frame.rows - 30), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1);
|
||||
cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 47, 15, 15), background_calibrated ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1);
|
||||
|
||||
cv::putText(output_frame, "skin color calibrated:", cv::Point(5, output_frame.rows - 10), cv::FONT_HERSHEY_PLAIN, 2.0, cv::Scalar(255, 255, 0), 1);
|
||||
cv::rectangle(output_frame, cv::Rect(420, output_frame.rows - 27, 15, 15), skintone_calibrated ? cv::Scalar(0, 255, 0) : cv::Scalar(0, 0, 255), -1);
|
||||
}
|
||||
|
||||
void HandCalibrator::SetSkinCalibration(bool val)
|
||||
{
|
||||
skintone_calibrated = val;
|
||||
}
|
||||
|
||||
void HandCalibrator::SetBackGroundCalibrated(bool val)
|
||||
{
|
||||
background_calibrated = val;
|
||||
}
|
||||
|
||||
void HandCalibrator::SetHandPresent(bool val)
|
||||
{
|
||||
hand_present = val;
|
||||
}
|
||||
|
||||
void HandCalibrator::SetAmountOfFingers(int amount)
|
||||
{
|
||||
fingers_amount = amount;
|
||||
}
|
||||
|
||||
bool HandCalibrator::CheckIfHandPresent(cv::Mat input_image, HandDetectionType type)
|
||||
{
|
||||
std::vector<std::vector<cv::Point>> points;
|
||||
cv::findContours(input_image, points, cv::RetrievalModes::RETR_LIST, cv::ContourApproximationModes::CHAIN_APPROX_SIMPLE);
|
||||
|
||||
if (points.size() == 0) return false;
|
||||
|
||||
for (int p = 0; p < points.size(); p++)
|
||||
{
|
||||
int area = cv::contourArea(points[p]);
|
||||
|
||||
if (type == handcalibration::HandDetectionType::MENU)
|
||||
if (area > MIN_MENU_HAND_SIZE) return true;
|
||||
|
||||
if (type == handcalibration::HandDetectionType::GAME)
|
||||
if (area > MIN_GAME_HAND_SIZE) return true;
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,76 @@
|
||||
#pragma once
|
||||
#include <opencv2/core/base.hpp>
|
||||
#include <opencv2/imgcodecs.hpp>
|
||||
#include <opencv2/imgproc.hpp>
|
||||
|
||||
namespace computervision
|
||||
{
|
||||
namespace handcalibration
|
||||
{
|
||||
enum class HandDetectionType
|
||||
{
|
||||
MENU,
|
||||
GAME
|
||||
};
|
||||
|
||||
class HandCalibrator
|
||||
{
|
||||
public:
|
||||
HandCalibrator();
|
||||
|
||||
|
||||
|
||||
/**
|
||||
* @brief draws the text to show the status of the calibration on the image
|
||||
*
|
||||
* @param output_frame the frame to draw on.
|
||||
*/
|
||||
void DrawHandCalibrationText(cv::Mat& output_frame);
|
||||
|
||||
/**
|
||||
* @brief sets the skin calibration variable.
|
||||
*
|
||||
* @param val the value to set
|
||||
*/
|
||||
void SetSkinCalibration(bool val);
|
||||
|
||||
/**
|
||||
* @brief sets the background calibration variable.
|
||||
*
|
||||
* @param val the value to set
|
||||
*/
|
||||
void SetBackGroundCalibrated(bool val);
|
||||
|
||||
/**
|
||||
* @brief sets the value for if the hand is present.
|
||||
*
|
||||
* @param val the value to set.
|
||||
*/
|
||||
void SetHandPresent(bool val);
|
||||
|
||||
/**
|
||||
* @brief checks if the hand is present in the given image
|
||||
*
|
||||
* @param input_image the input image to check.
|
||||
*/
|
||||
bool CheckIfHandPresent(cv::Mat input_image, HandDetectionType type);
|
||||
|
||||
/**
|
||||
* @brief sets the amount of fingers that are currently detected.
|
||||
*
|
||||
* @param amount the amount of fingers.
|
||||
*/
|
||||
void SetAmountOfFingers(int amount);
|
||||
|
||||
void DrawBackgroundSkinCalibrated(cv::Mat& output_frame);
|
||||
|
||||
private:
|
||||
|
||||
bool background_calibrated;
|
||||
bool skintone_calibrated;
|
||||
bool hand_present;
|
||||
int fingers_amount;
|
||||
};
|
||||
|
||||
}
|
||||
}
|
||||
@@ -1,4 +1,4 @@
|
||||
#include "FingerCount.h"
|
||||
#include "finger_count.h"
|
||||
|
||||
#include "opencv2/imgproc.hpp"
|
||||
#include "opencv2/highgui.hpp"
|
||||
@@ -14,6 +14,7 @@
|
||||
|
||||
namespace computervision
|
||||
{
|
||||
|
||||
FingerCount::FingerCount(void) {
|
||||
color_blue = Scalar(255, 0, 0);
|
||||
color_green = Scalar(0, 255, 0);
|
||||
@@ -35,9 +36,6 @@ namespace computervision
|
||||
if (input_image.channels() != 1)
|
||||
return contours_image;
|
||||
|
||||
vector<vector<Point>> contours;
|
||||
vector<Vec4i> hierarchy;
|
||||
|
||||
findContours(input_image, contours, hierarchy, CV_RETR_EXTERNAL, CV_CHAIN_APPROX_NONE);
|
||||
|
||||
// we need at least one contour to work
|
||||
@@ -45,7 +43,7 @@ namespace computervision
|
||||
return contours_image;
|
||||
|
||||
// find the biggest contour (let's suppose it's our hand)
|
||||
int biggest_contour_index = -1;
|
||||
biggest_contour_index = -1;
|
||||
double biggest_area = 0.0;
|
||||
|
||||
for (int i = 0; i < contours.size(); i++) {
|
||||
@@ -156,6 +154,11 @@ namespace computervision
|
||||
return contours_image;
|
||||
}
|
||||
|
||||
void FingerCount::DrawHandContours(Mat& image)
|
||||
{
|
||||
drawContours(image, contours, biggest_contour_index, color_green, 2, 8, hierarchy);
|
||||
}
|
||||
|
||||
int FingerCount::getAmountOfFingers()
|
||||
{
|
||||
return amount_of_fingers;
|
||||
@@ -31,7 +31,15 @@ namespace computervision
|
||||
*/
|
||||
int getAmountOfFingers();
|
||||
|
||||
void DrawHandContours(Mat& image);
|
||||
|
||||
private:
|
||||
|
||||
int biggest_contour_index;
|
||||
vector<vector<Point>> contours;
|
||||
vector<Vec4i> hierarchy;
|
||||
|
||||
|
||||
// colors to use
|
||||
Scalar color_blue;
|
||||
Scalar color_green;
|
||||
@@ -115,5 +123,7 @@ namespace computervision
|
||||
* @param with_numbers if the numbers should be drawn with the points
|
||||
*/
|
||||
void drawVectorPoints(Mat image, vector<Point> points, Scalar color, bool with_numbers);
|
||||
|
||||
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,157 @@
|
||||
|
||||
#include "hand_detect_region.h"
|
||||
#define TIME_DURATION 1.0f
|
||||
namespace computervision
|
||||
{
|
||||
|
||||
HandDetectRegion::HandDetectRegion(std::string id,int x_pos, int y_pos, int width, int height)
|
||||
{
|
||||
region_id = id;
|
||||
start_x_pos = x_pos;
|
||||
start_y_pos = y_pos;
|
||||
region_width = width;
|
||||
region_height = height;
|
||||
hand_mask_generated = false;
|
||||
hand_present = false;
|
||||
}
|
||||
|
||||
void HandDetectRegion::DetectHand(cv::Mat& camera_frame)
|
||||
{
|
||||
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);
|
||||
|
||||
// remove background from image
|
||||
|
||||
foreground = background_remover.getForeground(input_frame);
|
||||
|
||||
// detect the hand contours
|
||||
handMask = skin_detector.getSkinMask(foreground);
|
||||
|
||||
// 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)
|
||||
{
|
||||
if (is_main_skin_detection_region)
|
||||
skin_timer_callback();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
// uncomment these lines to show debug hand information
|
||||
//imshow("output" + region_id, frame_out);
|
||||
//imshow("foreground" + region_id, foreground);
|
||||
//imshow("handMask" + region_id, handMask);
|
||||
//imshow("handDetection", fingerCountDebug);
|
||||
|
||||
hand_present = hand_calibrator.CheckIfHandPresent(handMask,handcalibration::HandDetectionType::GAME);
|
||||
//std::string text = (hand_present ? "hand" : "no");
|
||||
//cv::putText(camera_frame, text, cv::Point(start_x_pos, start_y_pos), cv::FONT_HERSHEY_COMPLEX, 2.0, cv::Scalar(0, 255, 255), 2);
|
||||
hand_calibrator.SetHandPresent(hand_present);
|
||||
|
||||
//draw black rectangle behind calibration information text
|
||||
cv::rectangle(camera_frame, cv::Rect(0, camera_frame.rows - 55, 450, camera_frame.cols), cv::Scalar(0, 0, 0), -1);
|
||||
|
||||
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::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);
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
cv::Mat HandDetectRegion::GenerateHandMaskSquare(cv::Mat img)
|
||||
{
|
||||
cv::Mat mask = cv::Mat::zeros(img.size(), img.type());
|
||||
cv::Mat distance_img = cv::Mat::zeros(img.size(), img.type());
|
||||
|
||||
cv::rectangle(mask, cv::Rect(start_x_pos, start_y_pos, region_width, region_height), cv::Scalar(255, 255, 255), -1);
|
||||
|
||||
img.copyTo(distance_img, mask);
|
||||
|
||||
hand_mask_generated = true;
|
||||
return distance_img;
|
||||
}
|
||||
|
||||
bool HandDetectRegion::DrawHandMask(cv::Mat* input)
|
||||
{
|
||||
if (!hand_mask_generated) return false;
|
||||
rectangle(*input, Rect(start_x_pos, start_y_pos, region_width, region_height), (hand_present ? Scalar(0, 255, 0) : Scalar(0,0,255)),2);
|
||||
return true;
|
||||
}
|
||||
|
||||
bool HandDetectRegion::IsHandPresent()
|
||||
{
|
||||
return hand_present;
|
||||
}
|
||||
|
||||
void HandDetectRegion::CalibrateBackground()
|
||||
{
|
||||
std::cout << "calibrating background " << region_id << std::endl;
|
||||
background_remover.calibrate(frame_out);
|
||||
hand_calibrator.SetBackGroundCalibrated(true);
|
||||
}
|
||||
void HandDetectRegion::CalibrateSkin()
|
||||
{
|
||||
skin_detector.calibrate(frame_out);
|
||||
hand_calibrator.SetSkinCalibration(true);
|
||||
}
|
||||
|
||||
std::vector<int> HandDetectRegion::CalculateSkinTresholds()
|
||||
{
|
||||
std::cout << "calibrating skin " << region_id << std::endl;
|
||||
hand_calibrator.SetSkinCalibration(true);
|
||||
skin_calibrated = true;
|
||||
time = 0;
|
||||
return skin_detector.calibrateAndReturn(frame_out);
|
||||
}
|
||||
|
||||
void HandDetectRegion::setSkinTresholds(std::vector<int>& tresholds)
|
||||
{
|
||||
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)
|
||||
{
|
||||
time += delta_time;
|
||||
}
|
||||
|
||||
}
|
||||
@@ -0,0 +1,73 @@
|
||||
#pragma once
|
||||
|
||||
#include <opencv2/core.hpp>
|
||||
#include <opencv2/imgproc.hpp>
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
#include "async/StaticCameraInstance.h"
|
||||
#include "calibration/HandCalibrator.h"
|
||||
#include "background_remover.h"
|
||||
#include "skin_detector.h"
|
||||
#include "finger_count.h"
|
||||
namespace computervision
|
||||
{
|
||||
class HandDetectRegion
|
||||
{
|
||||
public:
|
||||
HandDetectRegion(std::string id,int x_pos, int y_pos, int width, int height);
|
||||
|
||||
void SetXPos(int x) { start_x_pos = x; }
|
||||
void SetYPos(int y) { start_y_pos = y; }
|
||||
int GetXPos() { return start_x_pos; }
|
||||
int GetYPos() { return start_y_pos; }
|
||||
|
||||
void SetWidth(int width) { region_width = width; }
|
||||
void SetHeigth(int height) { region_height = height; }
|
||||
int GetWidth() { return region_width; }
|
||||
int GetHeight() { return region_height; }
|
||||
|
||||
cv::Mat GenerateHandMaskSquare(cv::Mat img);
|
||||
|
||||
void DetectHand(cv::Mat& camera_frame);
|
||||
|
||||
bool IsHandPresent();
|
||||
|
||||
void CalibrateBackground();
|
||||
void CalibrateSkin();
|
||||
|
||||
std::vector<int> CalculateSkinTresholds();
|
||||
|
||||
void setSkinTresholds(std::vector<int>& tresholds);
|
||||
void UpdateTime(float delta_time);
|
||||
void SetMainSkinDetecRegion(bool val) { is_main_skin_detection_region = val; };
|
||||
void SetSkinTimerCallback(std::function<void()> fun) { skin_timer_callback = fun; };
|
||||
|
||||
private:
|
||||
|
||||
int start_x_pos;
|
||||
int start_y_pos;
|
||||
int region_height;
|
||||
int region_width;
|
||||
bool hand_mask_generated;
|
||||
bool hand_present;
|
||||
cv::Mat frame, frame_out, handMask, foreground, fingerCountDebug;
|
||||
BackgroundRemover background_remover;
|
||||
SkinDetector skin_detector;
|
||||
handcalibration::HandCalibrator hand_calibrator;
|
||||
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;
|
||||
bool is_main_skin_detection_region = false;
|
||||
std::function<void()> skin_timer_callback;
|
||||
|
||||
|
||||
|
||||
};
|
||||
|
||||
}
|
||||
@@ -0,0 +1,203 @@
|
||||
|
||||
#include "object_detection.h"
|
||||
|
||||
#define TIME_DURATION 1.0f
|
||||
|
||||
namespace computervision
|
||||
{
|
||||
|
||||
cv::Mat img, img_gray, img2, img2_gray, img3, img4;
|
||||
|
||||
int hand_mask_start_x_pos, hand_mask_start_y_pos, hand_mask_width, hand_mask_height;
|
||||
bool hand_mask_generated = false;
|
||||
|
||||
Mat frame, frame_out, handMask, foreground, fingerCountDebug;
|
||||
BackgroundRemover background_remover;
|
||||
SkinDetector skin_detector;
|
||||
FingerCount finger_count;
|
||||
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;
|
||||
bool hand_open = false;
|
||||
|
||||
ObjectDetection::ObjectDetection()
|
||||
{
|
||||
}
|
||||
|
||||
cv::Mat ObjectDetection::ReadCamera() {
|
||||
cap.read(img);
|
||||
return img;
|
||||
}
|
||||
|
||||
cv::VideoCapture ObjectDetection::GetCap()
|
||||
{
|
||||
return cap;
|
||||
}
|
||||
|
||||
bool ObjectDetection::DetectHand(Mat camera_frame, bool& hand_present)
|
||||
{
|
||||
//calculate deltatime
|
||||
if (!background_calibrated || !skin_calibrated)
|
||||
{
|
||||
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();
|
||||
|
||||
// detect skin color
|
||||
skin_detector.drawSkinColorSampler(camera_frame);
|
||||
|
||||
// remove background from image
|
||||
foreground = background_remover.getForeground(input_frame);
|
||||
|
||||
// detect the hand contours
|
||||
handMask = skin_detector.getSkinMask(foreground);
|
||||
|
||||
// count the amount of fingers and put the info on the matrix
|
||||
fingerCountDebug = finger_count.findFingersCount(handMask, frame_out);
|
||||
|
||||
// get the amount of fingers
|
||||
int fingers_amount = finger_count.getAmountOfFingers();
|
||||
|
||||
// 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;
|
||||
calibration_callback();
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
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::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);
|
||||
|
||||
// uncomment these lines to show debug hand information
|
||||
/*imshow("output", frame_out);
|
||||
imshow("foreground", foreground);
|
||||
imshow("handMask", handMask);
|
||||
imshow("handDetection", fingerCountDebug);*/
|
||||
|
||||
hand_present = hand_calibrator.CheckIfHandPresent(handMask, handcalibration::HandDetectionType::MENU);
|
||||
hand_calibrator.SetHandPresent(hand_present);
|
||||
|
||||
hand_open = fingers_amount > 0;
|
||||
return hand_open;
|
||||
}
|
||||
|
||||
void ObjectDetection::CalculateDifference()
|
||||
{
|
||||
cap.read(img);
|
||||
cap.read(img2);
|
||||
|
||||
cv::cvtColor(img, img_gray, cv::COLOR_RGBA2GRAY);
|
||||
cv::cvtColor(img2, img2_gray, cv::COLOR_RGBA2GRAY);
|
||||
|
||||
cv::absdiff(img_gray, img2_gray, img3);
|
||||
cv::threshold(img3, img4, 50, 170, cv::THRESH_BINARY);
|
||||
|
||||
imshow("threshold", img4);
|
||||
}
|
||||
|
||||
|
||||
cv::Mat ObjectDetection::GenerateHandMaskSquare(cv::Mat img)
|
||||
{
|
||||
hand_mask_start_x_pos = 20;
|
||||
hand_mask_start_y_pos = img.rows / 5;
|
||||
hand_mask_width = img.cols / 3;
|
||||
hand_mask_height = img.cols / 3;
|
||||
|
||||
|
||||
cv::Mat mask = cv::Mat::zeros(img.size(), img.type());
|
||||
cv::Mat distance_img = cv::Mat::zeros(img.size(), img.type());
|
||||
|
||||
cv::rectangle(mask, Rect(hand_mask_start_x_pos, hand_mask_start_y_pos, hand_mask_width, hand_mask_height), Scalar(255, 255, 255), -1);
|
||||
|
||||
img.copyTo(distance_img, mask);
|
||||
|
||||
hand_mask_generated = true;
|
||||
return distance_img;
|
||||
|
||||
}
|
||||
|
||||
bool ObjectDetection::DrawHandMask(cv::Mat* input)
|
||||
{
|
||||
if (!hand_mask_generated) return false;
|
||||
rectangle(*input, Rect(hand_mask_start_x_pos, hand_mask_start_y_pos, hand_mask_width, hand_mask_height), Scalar(255, 255, 255));
|
||||
return true;
|
||||
}
|
||||
|
||||
void ObjectDetection::ShowWebcam()
|
||||
{
|
||||
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;
|
||||
}
|
||||
|
||||
bool ObjectDetection::IsHandOpen()
|
||||
{
|
||||
return hand_open;
|
||||
}
|
||||
|
||||
bool ObjectDetection::IsCalibrated()
|
||||
{
|
||||
return background_calibrated && skin_calibrated;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
@@ -8,6 +8,15 @@
|
||||
#include <opencv2/core.hpp>
|
||||
#include <opencv2/imgproc/imgproc.hpp>
|
||||
#include <opencv2/highgui/highgui.hpp>
|
||||
#include <opencv2/video.hpp>
|
||||
#include <GLFW/glfw3.h>
|
||||
|
||||
#include <functional>
|
||||
#include "background_remover.h"
|
||||
#include "skin_detector.h"
|
||||
#include "finger_count.h"
|
||||
#include "async/StaticCameraInstance.h"
|
||||
#include "calibration/HandCalibrator.h"
|
||||
|
||||
|
||||
namespace computervision
|
||||
@@ -27,13 +36,13 @@ namespace computervision
|
||||
* @brief Displays an image of the current webcam-footage
|
||||
*
|
||||
*/
|
||||
void showWebcam();
|
||||
void ShowWebcam();
|
||||
/**
|
||||
* @brief Calculates the difference between two images
|
||||
* and outputs an image that only shows the difference
|
||||
*
|
||||
*/
|
||||
void calculateDifference();
|
||||
void CalculateDifference();
|
||||
|
||||
/**
|
||||
* @brief generates the square that will hold the mask in which the hand will be detected.
|
||||
@@ -41,29 +50,57 @@ namespace computervision
|
||||
* @param img the current camear frame
|
||||
* @return a matrix containing the mask
|
||||
*/
|
||||
cv::Mat generateHandMaskSquare(cv::Mat img);
|
||||
cv::Mat GenerateHandMaskSquare(cv::Mat img);
|
||||
|
||||
/**
|
||||
* @brief reads the camera and returns it in a matrix.
|
||||
*
|
||||
* @return the camera frame in a matrix
|
||||
*/
|
||||
cv::Mat readCamera();
|
||||
cv::Mat ReadCamera();
|
||||
|
||||
/**
|
||||
* @brief detects a hand based on the given hand mask input frame.
|
||||
*
|
||||
* @param inputFrame the input frame from the camera
|
||||
* @param hand_present boolean that will hold true if the hand is detected, false if not.
|
||||
* @return true if hand is open, false if hand is closed
|
||||
*/
|
||||
bool detectHand(cv::Mat cameraFrame);
|
||||
bool DetectHand(cv::Mat camera_frame, bool& hand_present);
|
||||
|
||||
/**
|
||||
* @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);
|
||||
bool DrawHandMask(cv::Mat *input);
|
||||
|
||||
/**
|
||||
* @brief checks if the hand of the user is open.
|
||||
*
|
||||
* @return true if the hand is open, false if not.
|
||||
*/
|
||||
bool IsHandOpen();
|
||||
|
||||
bool IsCalibrated();
|
||||
|
||||
|
||||
/**
|
||||
* @brief checks whether the hand is held within the detection square.
|
||||
*
|
||||
* @return true if the hand is in the detection square, false if not.
|
||||
*/
|
||||
bool IsHandPresent();
|
||||
|
||||
cv::VideoCapture GetCap();
|
||||
|
||||
void SetCalibrationCallback(std::function<void()> fun) { calibration_callback = fun; };
|
||||
|
||||
private:
|
||||
bool is_hand_open;
|
||||
bool is_hand_present;
|
||||
void UpdateTime();
|
||||
std::function<void()> calibration_callback;
|
||||
|
||||
};
|
||||
|
||||
@@ -1,4 +1,5 @@
|
||||
#include "SkinDetector.h"
|
||||
#include "skin_detector.h"
|
||||
#include <iostream>
|
||||
|
||||
/*
|
||||
Author: Pierfrancesco Soffritti https://github.com/PierfrancescoSoffritti
|
||||
@@ -23,7 +24,7 @@ namespace computervision
|
||||
int frameWidth = input.size().width, frameHeight = input.size().height;
|
||||
|
||||
int rectangleSize = 25;
|
||||
Scalar rectangleColor = Scalar(255, 0, 255);
|
||||
Scalar rectangleColor = Scalar(0, 255, 255);
|
||||
|
||||
skinColorSamplerRectangle1 = Rect(frameWidth / 5, frameHeight / 2, rectangleSize, rectangleSize);
|
||||
skinColorSamplerRectangle2 = Rect(frameWidth / 5, frameHeight / 3, rectangleSize, rectangleSize);
|
||||
@@ -41,6 +42,29 @@ namespace computervision
|
||||
);
|
||||
}
|
||||
|
||||
void SkinDetector::drawSkinColorSampler(Mat input,int x, int y,int width, int height) {
|
||||
int frameWidth = width, frameHeight = height;
|
||||
|
||||
int rectangleSize = 25;
|
||||
Scalar rectangleColor = Scalar(0, 255, 255);
|
||||
|
||||
skinColorSamplerRectangle1 = Rect(frameWidth / 5 + x, frameHeight / 2 + y, rectangleSize, rectangleSize);
|
||||
skinColorSamplerRectangle2 = Rect(frameWidth / 5 + x, frameHeight / 3 + y, rectangleSize, rectangleSize);
|
||||
|
||||
rectangle(
|
||||
input,
|
||||
skinColorSamplerRectangle1,
|
||||
rectangleColor
|
||||
);
|
||||
|
||||
rectangle(
|
||||
input,
|
||||
skinColorSamplerRectangle2,
|
||||
rectangleColor
|
||||
);
|
||||
}
|
||||
|
||||
|
||||
void SkinDetector::calibrate(Mat input) {
|
||||
|
||||
Mat hsvInput;
|
||||
@@ -54,6 +78,19 @@ namespace computervision
|
||||
calibrated = true;
|
||||
}
|
||||
|
||||
std::vector<int> SkinDetector::calibrateAndReturn(Mat input)
|
||||
{
|
||||
Mat hsvInput;
|
||||
cvtColor(input, hsvInput, CV_BGR2HSV);
|
||||
|
||||
Mat sample1 = Mat(hsvInput, skinColorSamplerRectangle1);
|
||||
Mat sample2 = Mat(hsvInput, skinColorSamplerRectangle2);
|
||||
|
||||
calibrated = true;
|
||||
return calculateAndReturnTresholds(sample1, sample2);
|
||||
|
||||
}
|
||||
|
||||
void SkinDetector::calculateThresholds(Mat sample1, Mat sample2) {
|
||||
int offsetLowThreshold = 80;
|
||||
int offsetHighThreshold = 30;
|
||||
@@ -75,6 +112,39 @@ namespace computervision
|
||||
//vHighThreshold = 255;
|
||||
}
|
||||
|
||||
std::vector<int> SkinDetector::calculateAndReturnTresholds(Mat sample1, Mat sample2)
|
||||
{
|
||||
|
||||
calculateThresholds(sample1, sample2);
|
||||
std::vector<int> res;
|
||||
res.push_back(hLowThreshold);
|
||||
res.push_back(hHighThreshold);
|
||||
res.push_back(sLowThreshold);
|
||||
res.push_back(sHighThreshold);
|
||||
res.push_back(vLowThreshold);
|
||||
res.push_back(vHighThreshold);
|
||||
return res;
|
||||
}
|
||||
|
||||
void SkinDetector::setTresholds(std::vector<int>& tresholds)
|
||||
{
|
||||
if (tresholds.size() != 6)
|
||||
{
|
||||
std::cout << "tresholds array not the right size!" << std::endl;
|
||||
return;
|
||||
}
|
||||
|
||||
hLowThreshold = tresholds[0];
|
||||
hHighThreshold = tresholds[1];
|
||||
sLowThreshold = tresholds[2];
|
||||
sHighThreshold = tresholds[3];
|
||||
vLowThreshold = tresholds[4];
|
||||
vHighThreshold = tresholds[5];
|
||||
|
||||
calibrated = true;
|
||||
|
||||
}
|
||||
|
||||
Mat SkinDetector::getSkinMask(Mat input) {
|
||||
Mat skinMask;
|
||||
|
||||
@@ -24,6 +24,9 @@ namespace computervision
|
||||
*/
|
||||
void drawSkinColorSampler(Mat input);
|
||||
|
||||
void drawSkinColorSampler(Mat input, int x, int y, int width, int heigth);
|
||||
|
||||
|
||||
/*
|
||||
* @brief calibrates the skin color detector with the given input frame
|
||||
*
|
||||
@@ -31,6 +34,10 @@ namespace computervision
|
||||
*/
|
||||
void calibrate(Mat input);
|
||||
|
||||
std::vector<int> calibrateAndReturn(Mat input);
|
||||
|
||||
void setTresholds(std::vector<int>& tresholds);
|
||||
|
||||
/*
|
||||
* @brief gets the mask for the hand
|
||||
*
|
||||
@@ -63,6 +70,8 @@ namespace computervision
|
||||
*/
|
||||
void calculateThresholds(Mat sample1, Mat sample2);
|
||||
|
||||
std::vector<int> calculateAndReturnTresholds(Mat sample1, Mat sample2);
|
||||
|
||||
/**
|
||||
* @brief the opening. it generates the structuring element and performs the morphological transformations required to detect the hand.
|
||||
* This needs to be done to get the skin mask.
|
||||
+20
-10
@@ -1,4 +1,6 @@
|
||||
#include "camera.h"
|
||||
#include <iostream>
|
||||
#include "../toolbox/toolbox.h"
|
||||
|
||||
namespace entities
|
||||
{
|
||||
@@ -7,9 +9,20 @@ namespace entities
|
||||
rotation(rotation)
|
||||
{}
|
||||
|
||||
void Camera::Follow(glm::vec3 follow_position) {
|
||||
//set position to follow in front of the camera
|
||||
follow_position.z += 100;
|
||||
//set position to follow a bit lower
|
||||
follow_position.y += 50;
|
||||
//move position from original position to given position with smoothing
|
||||
position = toolbox::Lerp(position, follow_position, 0.1);
|
||||
}
|
||||
|
||||
void Camera::Move(GLFWwindow* window)
|
||||
{
|
||||
float movement_speed = 0;
|
||||
float up_down_speed = 0;
|
||||
float side_speed = 0;
|
||||
|
||||
if (glfwGetKey(window, GLFW_KEY_W) == GLFW_PRESS)
|
||||
{
|
||||
@@ -23,28 +36,25 @@ namespace entities
|
||||
|
||||
if (glfwGetKey(window, GLFW_KEY_D) == GLFW_PRESS)
|
||||
{
|
||||
rotation.y += ROT_SPEED;
|
||||
side_speed += SPEED;
|
||||
}
|
||||
|
||||
if (glfwGetKey(window, GLFW_KEY_A) == GLFW_PRESS)
|
||||
{
|
||||
rotation.y -= ROT_SPEED;
|
||||
side_speed -= SPEED;
|
||||
}
|
||||
|
||||
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
|
||||
{
|
||||
rotation.x -= ROT_SPEED;
|
||||
up_down_speed += UP_SPEED;
|
||||
}
|
||||
|
||||
if (glfwGetKey(window, GLFW_KEY_LEFT_SHIFT) == GLFW_PRESS)
|
||||
{
|
||||
rotation.x += ROT_SPEED;
|
||||
up_down_speed -= UP_SPEED;
|
||||
}
|
||||
|
||||
float dx = glm::cos(glm::radians(rotation.y + 90)) * movement_speed;
|
||||
float dz = glm::sin(glm::radians(rotation.y + 90)) * movement_speed;
|
||||
|
||||
position.x += dx;
|
||||
position.z += dz;
|
||||
position.x += side_speed;
|
||||
position.z += movement_speed;
|
||||
position.y += up_down_speed;
|
||||
}
|
||||
}
|
||||
|
||||
+10
-2
@@ -13,13 +13,14 @@ namespace entities
|
||||
{
|
||||
private:
|
||||
// The movement speed of the camera
|
||||
const float SPEED = 0.52f;
|
||||
const float ROT_SPEED = 1.0f;
|
||||
const float SPEED = 0.5f;
|
||||
const float UP_SPEED = 1.0f;
|
||||
|
||||
glm::vec3 position;
|
||||
glm::vec3 rotation;
|
||||
|
||||
public:
|
||||
|
||||
Camera(const ::glm::vec3& position, const ::glm::vec3& rotation);
|
||||
|
||||
/*
|
||||
@@ -29,6 +30,13 @@ namespace entities
|
||||
*/
|
||||
void Move(GLFWwindow* window);
|
||||
|
||||
/*
|
||||
* @brief follows the given position with smoothing
|
||||
*
|
||||
* @param follow_position the position of the object the camera has to follow
|
||||
*/
|
||||
void Follow(glm::vec3 follow_position);
|
||||
|
||||
inline glm::vec3 GetPosition() const{ return position; }
|
||||
inline glm::vec3 GetRotation() const{ return rotation; }
|
||||
};
|
||||
|
||||
@@ -23,5 +23,7 @@ namespace entities
|
||||
this->rotation.y += rotation.y;
|
||||
this->rotation.z += rotation.z;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -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; }
|
||||
};
|
||||
|
||||
@@ -14,7 +14,9 @@ namespace entities
|
||||
{
|
||||
if (on_collide != nullptr)
|
||||
{
|
||||
|
||||
on_collide(collision);
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -38,7 +40,10 @@ namespace entities
|
||||
|
||||
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);
|
||||
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 };
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,8 @@
|
||||
|
||||
#include "entity.h"
|
||||
#include "../collision/collision.h"
|
||||
#include <memory>
|
||||
#include <functional>
|
||||
|
||||
namespace entities
|
||||
{
|
||||
@@ -16,7 +18,8 @@ namespace entities
|
||||
glm::vec3 min_xyz;
|
||||
glm::vec3 max_xyz;
|
||||
|
||||
void (*on_collide)(const collision::Collision& collision);
|
||||
//void (*on_collide)(const collision::Collision& collision);
|
||||
std::function<void(const collision::Collision&)> on_collide;
|
||||
|
||||
public:
|
||||
CollisionEntity(const models::TexturedModel& model, const glm::vec3& position, const glm::vec3& rotation,
|
||||
@@ -52,10 +55,10 @@ namespace entities
|
||||
*
|
||||
* @param function: A function pointer to a function with the collision behaviour
|
||||
*/
|
||||
void SetCollisionBehaviour(void (*function)(const collision::Collision& collision))
|
||||
void SetCollisionBehaviour(std::function<void(const collision::Collision&)> function)
|
||||
{ if (function != nullptr) { on_collide = function; } }
|
||||
|
||||
protected:
|
||||
public:
|
||||
|
||||
/*
|
||||
* @brief: This method moves the collision to the center of the entity
|
||||
|
||||
@@ -0,0 +1,131 @@
|
||||
#include "house_generator.h"
|
||||
|
||||
#include <functional>
|
||||
#include <iostream>
|
||||
|
||||
#include "../renderEngine/obj_loader.h"
|
||||
#include "../renderEngine/Loader.h"
|
||||
#include "../toolbox/toolbox.h"
|
||||
#include "collision_entity.h"
|
||||
|
||||
namespace entities
|
||||
{
|
||||
HouseGenerator::HouseGenerator()
|
||||
{
|
||||
}
|
||||
|
||||
void HouseGenerator::GetRandomFurniturePiece(singleton::FurniturePiece* furniture_piece)
|
||||
{
|
||||
singleton::FurnitureType random_type = singleton::FurnitureType::CEILING_OBJECTS;
|
||||
std::deque<singleton::FurnitureModel> furniture_models = singleton::Model_Storage::get_instance()->get_all_furniture_models();
|
||||
|
||||
while (random_type == singleton::FurnitureType::CEILING_OBJECTS ) {
|
||||
random_type = singleton::FurnitureType(toolbox::Random(0, furniture_models.size() - 1));
|
||||
}
|
||||
|
||||
for (auto it = furniture_models.begin(); it != furniture_models.end(); ++it)
|
||||
{
|
||||
if (it->furniture.type == random_type)
|
||||
{
|
||||
furniture_piece->type = it->furniture.type;
|
||||
furniture_piece->size = it->furniture.size;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
void HouseGenerator::GetFurniturePiece(singleton::FurnitureType type, singleton::FurniturePiece* furniture_piece)
|
||||
{
|
||||
std::deque<singleton::FurnitureModel> furniture_models = singleton::Model_Storage::get_instance()->get_all_furniture_models();
|
||||
for (auto it = furniture_models.begin(); it != furniture_models.end(); ++it)
|
||||
{
|
||||
if (it->furniture.type == type)
|
||||
{
|
||||
furniture_piece->type = it->furniture.type;
|
||||
furniture_piece->size = it->furniture.size;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
void HouseGenerator::GenerateHouse(std::deque<std::shared_ptr<CollisionEntity>>* furniture_list , const glm::vec3& position, float y_rotation)
|
||||
{
|
||||
std::deque<std::shared_ptr<Entity>> furniture;
|
||||
|
||||
// Add house
|
||||
collision::Box bounding_box = { glm::vec3(0, 0, 0), glm::vec3(0, 0, 0) };
|
||||
furniture_list->push_front(std::make_shared<CollisionEntity>(singleton::Model_Storage::get_instance()->get_house_model(), position, glm::vec3(0, y_rotation, 0), HOUSE_SIZE, bounding_box));
|
||||
int house_size_x = singleton::Model_Storage::get_instance()->get_house_model().raw_model.model_size.x * HOUSE_SIZE;
|
||||
int house_size_y = singleton::Model_Storage::get_instance()->get_house_model().raw_model.model_size.x * HOUSE_SIZE;
|
||||
int house_size_z = singleton::Model_Storage::get_instance()->get_house_model().raw_model.model_size.x * HOUSE_SIZE;
|
||||
|
||||
int offset_x = singleton::Model_Storage::get_instance()->get_house_model().raw_model.model_size.z * (HOUSE_SIZE / 2);
|
||||
int offset_z = singleton::Model_Storage::get_instance()->get_house_model().raw_model.model_size.x * (HOUSE_SIZE / 2);
|
||||
double multiplier_x = house_size_x / 4;
|
||||
double multiplier_z = house_size_z / 3;
|
||||
|
||||
for (int z = 1; z < 4; z++) {
|
||||
for (int x = 1; x < 4; x++)
|
||||
{
|
||||
//if (toolbox::Random(0, 100) < 90) {
|
||||
singleton::FurniturePiece furniture_piece;
|
||||
GetRandomFurniturePiece(&furniture_piece);
|
||||
if (furniture_piece.type != singleton::FurnitureType::CEILING_OBJECTS) {
|
||||
std::cout << "Furniture Piece: " << int(furniture_piece.type) << std::endl;
|
||||
models::TexturedModel model = GetFurnitureModel(&furniture_piece);
|
||||
//if (!(furniture_piece->size > 1 && x > 1)) {
|
||||
glm::vec3 model_pos = glm::vec3(position.x + (x * multiplier_x) - (multiplier_x / 2) - offset_x, position.y, position.z + (z * multiplier_z) - (multiplier_z / 2) + offset_z);
|
||||
|
||||
collision::Box model_box = { model_pos, model.raw_model.model_size * HOUSE_SIZE };
|
||||
model_box.SetRotation(90);
|
||||
furniture_list->push_back(std::make_shared<CollisionEntity>(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE, model_box));
|
||||
}
|
||||
//}
|
||||
//}
|
||||
}
|
||||
}
|
||||
|
||||
singleton::FurniturePiece furniture_piece;
|
||||
GetFurniturePiece(singleton::FurnitureType::CEILING_OBJECTS, &furniture_piece);
|
||||
models::TexturedModel model = GetFurnitureModel(&furniture_piece);
|
||||
glm::vec3 model_pos = glm::vec3(position.x, position.y + (house_size_y / 5 * 3), position.z);
|
||||
collision::Box model_box = { model_pos, model.raw_model.model_size };
|
||||
model_box.SetRotation(-90);
|
||||
furniture_list->push_back(std::make_shared<CollisionEntity>(model, model_pos, glm::vec3(0, -90, 0), HOUSE_SIZE, model_box));
|
||||
|
||||
}
|
||||
|
||||
models::TexturedModel HouseGenerator::GetFurnitureModel(const singleton::FurniturePiece* furniture)
|
||||
{
|
||||
std::deque<models::TexturedModel> furniture_list;
|
||||
std::deque<singleton::FurnitureModel> furniture_models = singleton::Model_Storage::get_instance()->get_all_furniture_models();
|
||||
|
||||
std::cout << "type of furniture_piece: " << int(furniture->type) << std::endl;
|
||||
|
||||
for (auto it = furniture_models.begin(); it != furniture_models.end(); ++it)
|
||||
{
|
||||
if (it->furniture.type == furniture->type)
|
||||
{
|
||||
std::deque<models::TexturedModel> textures = it->texture;
|
||||
for (int i = 0; i< textures.size(); i++)
|
||||
{
|
||||
furniture_list.push_back(textures.at(i));
|
||||
}
|
||||
std::cout << "Size of textures: " << textures.size() << std::endl;
|
||||
std::cout << "Size of furniture_list: " << furniture_list.size() << std::endl;
|
||||
break;
|
||||
}
|
||||
}
|
||||
std::cout << "Size of furniture_list after for loop: " << furniture_list.size() << std::endl;
|
||||
if (furniture_list.empty())
|
||||
{
|
||||
std::cerr << "OH NEEEEEEEEEEEEEEE";
|
||||
}
|
||||
|
||||
const int modelNumber = toolbox::Random(0, furniture_list.size() - 1);
|
||||
|
||||
return furniture_list.at(modelNumber);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,50 @@
|
||||
#pragma once
|
||||
|
||||
#include <deque>
|
||||
#include <memory>
|
||||
#include <map>
|
||||
|
||||
#include "collision_entity.h"
|
||||
#include "../models/Model.h"
|
||||
#include "../collision/collision.h"
|
||||
#include "../model_Storage.h"
|
||||
#include "collision_entity.h"
|
||||
|
||||
namespace entities
|
||||
{
|
||||
class HouseGenerator
|
||||
{
|
||||
private:
|
||||
const float HOUSE_SIZE = 30;
|
||||
public:
|
||||
HouseGenerator();
|
||||
|
||||
/*
|
||||
* @brief: This function generates a house with furniture at the given position and rotation
|
||||
*
|
||||
* @param position: The position of the house to render
|
||||
* @param y_rotation: The y rotation the house needs to be rendered with
|
||||
*
|
||||
* @return: A list with all the entities of the generated house (the furniture)
|
||||
*/
|
||||
void GenerateHouse(std::deque<std::shared_ptr<CollisionEntity>>* furniture_list, const glm::vec3& position, float y_rotation);
|
||||
|
||||
/*
|
||||
* @brief: Returns the depth of the house (chunk)
|
||||
*/
|
||||
float GetHouseDepth() const { return singleton::Model_Storage::get_instance()->get_house_model().raw_model.model_size.x * HOUSE_SIZE; }
|
||||
|
||||
private:
|
||||
void GetRandomFurniturePiece(singleton::FurniturePiece* furniture_piece);
|
||||
void GetFurniturePiece(singleton::FurnitureType type, singleton::FurniturePiece* furniture_piece);
|
||||
|
||||
/*
|
||||
* @brief: This funtion chooses and returns a random furniture of the given furniture type
|
||||
*
|
||||
* @param furniture: The furniture you want to get
|
||||
*
|
||||
* @return: The model of the random furniture of the chosen furniture type
|
||||
*/
|
||||
models::TexturedModel GetFurnitureModel(const singleton::FurniturePiece* furniture);
|
||||
};
|
||||
}
|
||||
@@ -0,0 +1,108 @@
|
||||
#include "main_character.h"
|
||||
#include "../models/Model.h"
|
||||
#include <iostream>
|
||||
#include "entity.h"
|
||||
#include"../renderEngine/Renderer.h"
|
||||
#include"../renderEngine/obj_loader.h"
|
||||
#include"../renderEngine/loader.h"
|
||||
namespace entities
|
||||
{
|
||||
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)
|
||||
{
|
||||
is_playing = true;
|
||||
}
|
||||
|
||||
void MainCharacter::Move(std::vector<computervision::HandDetectRegion*> regions)
|
||||
{
|
||||
computervision::HandDetectRegion* reg_left = regions.at(0);
|
||||
computervision::HandDetectRegion* reg_up = regions.at(1);
|
||||
computervision::HandDetectRegion* reg_right = regions.at(2);
|
||||
|
||||
double delta_time = UpdateDelta();
|
||||
|
||||
if (is_playing) {
|
||||
movement_speed = -50; //Forward speed adjustment, bee is moving at a standard speedrate
|
||||
down_speed = -40; //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
|
||||
//S: Go backwards
|
||||
//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/2;
|
||||
SetRotation(glm::vec3(10, 90, 0));
|
||||
}
|
||||
//right
|
||||
if (reg_left->IsHandPresent())
|
||||
{
|
||||
side_speed += SIDE_SPEED;
|
||||
}
|
||||
//top left
|
||||
if (reg_up->IsHandPresent() && reg_right->IsHandPresent())
|
||||
{
|
||||
down_speed += UP_SPEED/2;
|
||||
side_speed -= SIDE_SPEED;
|
||||
SetRotation(glm::vec3(10, 90, 0));
|
||||
}
|
||||
//left
|
||||
if (reg_right->IsHandPresent())
|
||||
{
|
||||
side_speed -= SIDE_SPEED;
|
||||
}
|
||||
|
||||
if (reg_up->IsHandPresent())
|
||||
{
|
||||
down_speed += UP_SPEED;
|
||||
SetRotation(glm::vec3(10, 90, 0));
|
||||
}
|
||||
}
|
||||
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!
|
||||
if (position.x > 190) position.x = 190;
|
||||
else if (position.x < -190) position.x = -190;
|
||||
if (position.y > 150) position.y = 150;
|
||||
else if (position.y < -60) position.y = -60;
|
||||
//Move player bounding box according to the position on screen
|
||||
MoveCollisionBox();
|
||||
if (reg_right->IsHandPresent() && reg_left->IsHandPresent())
|
||||
{
|
||||
is_playing = true;
|
||||
}
|
||||
}
|
||||
|
||||
void MainCharacter::OnCollide(const collision::Collision& collision) {
|
||||
down_speed = -2.0f;
|
||||
movement_speed = 0.0f;
|
||||
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;
|
||||
}
|
||||
|
||||
bool MainCharacter::GetOnCollide()
|
||||
{
|
||||
return is_playing;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,43 @@
|
||||
#pragma once
|
||||
|
||||
#include "collision_entity.h"
|
||||
#include "../shaders/entity_shader.h"
|
||||
#include "../computervision/hand_detect_region.h"
|
||||
|
||||
namespace entities
|
||||
{
|
||||
/*
|
||||
* This class contains the information about the player model
|
||||
*/
|
||||
class MainCharacter : public CollisionEntity {
|
||||
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
|
||||
*
|
||||
* @param model: Model to load in as the player model
|
||||
* @param position: Position of the model inside the game window
|
||||
* @param rotation: Rotation of the model inside the game window
|
||||
* @param scale: Size of the model
|
||||
* @param bounding_box: Collision box around the player model
|
||||
*/
|
||||
MainCharacter(const models::TexturedModel& model, const glm::vec3& position,
|
||||
const glm::vec3& rotation, float scale, const collision::Box& bounding_box);
|
||||
|
||||
/*
|
||||
* @brief: A function to move the character inside the window
|
||||
*
|
||||
* @param window: The game window
|
||||
*
|
||||
* @return: Vector with the adjusted side_speed, down_speed, and movement_speed
|
||||
*/
|
||||
void Move(std::vector<computervision::HandDetectRegion*> regions);
|
||||
|
||||
void OnCollide(const collision::Collision& collision) override;
|
||||
|
||||
bool GetOnCollide();
|
||||
|
||||
double UpdateDelta();
|
||||
};
|
||||
}
|
||||
@@ -19,14 +19,14 @@ namespace gui
|
||||
*/
|
||||
struct GuiTexture
|
||||
{
|
||||
int texture;
|
||||
GLuint texture;
|
||||
glm::vec2 position;
|
||||
glm::vec2 scale;
|
||||
|
||||
virtual GuiType GetType() {
|
||||
return GuiType::LABEL;
|
||||
}
|
||||
GuiTexture(int texture, glm::vec2 position, glm::vec2 scale): texture(texture), position(position), scale(scale)
|
||||
GuiTexture(GLuint texture, glm::vec2 position, glm::vec2 scale): texture(texture), position(position), scale(scale)
|
||||
{
|
||||
scale.x /= (WINDOW_WIDTH / WINDOW_HEIGHT);
|
||||
}
|
||||
|
||||
@@ -4,6 +4,7 @@
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include "../toolbox/toolbox.h"
|
||||
#include "gui_element.h"
|
||||
#include <functional>
|
||||
|
||||
namespace gui
|
||||
{
|
||||
@@ -88,9 +89,10 @@ namespace gui
|
||||
class Button : public InteractableGui
|
||||
{
|
||||
private:
|
||||
void (*on_click_action)();
|
||||
void (*on_enter_action)();
|
||||
void (*on_exit_action)();
|
||||
|
||||
std::function<void()> on_click_action;
|
||||
std::function<void()> on_enter_action;
|
||||
std::function<void()> on_exit_action;
|
||||
|
||||
public:
|
||||
Button(int default_texture, glm::vec2 position, glm::vec2 scale) : InteractableGui(default_texture, position, scale) {}
|
||||
@@ -100,21 +102,21 @@ namespace gui
|
||||
*
|
||||
* @param fun: A function pointer to a function (or lambda)
|
||||
*/
|
||||
void SetOnClickAction(void (*fun)()) { on_click_action = fun; }
|
||||
void SetOnClickAction(std::function<void()> fun) { on_click_action = fun; }
|
||||
|
||||
/*
|
||||
* @brief: This function sets an action (function pointer) to the OnEnter function
|
||||
*
|
||||
* @param fun: A function pointer to a function (or lambda)
|
||||
*/
|
||||
void SetOnEnterAction(void (*fun)()) { on_enter_action = fun; }
|
||||
void SetOnEnterAction(std::function<void()> fun) { on_enter_action = fun; }
|
||||
|
||||
/*
|
||||
* @brief: This function sets an action (function pointer) to the OnExit function
|
||||
*
|
||||
* @param fun: A function pointer to a function (or lambda)
|
||||
*/
|
||||
void SetOnExitAction(void (*fun)()) { on_exit_action = fun; }
|
||||
void SetOnExitAction(std::function<void()> fun) { on_exit_action = fun; }
|
||||
|
||||
GuiType GetType() override {
|
||||
return GuiType::BUTTON;
|
||||
|
||||
+27
-5
@@ -1,6 +1,8 @@
|
||||
#include <GL/glew.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <functional>
|
||||
#include <vector>
|
||||
#define STB_IMAGE_IMPLEMENTATION
|
||||
#include <iostream>
|
||||
#include <map>
|
||||
@@ -14,6 +16,7 @@
|
||||
#include <opencv2/videoio.hpp>
|
||||
#include <opencv2/video.hpp>
|
||||
|
||||
#include "collision/collision.h"
|
||||
#include "gui/gui_interactable.h"
|
||||
#include "models/model.h"
|
||||
#include "renderEngine/loader.h"
|
||||
@@ -24,17 +27,28 @@
|
||||
#include "scenes/scene.h"
|
||||
#include "scenes/in_Game_Scene.h"
|
||||
#include "scenes/startup_Scene.h"
|
||||
#include "scenes/loading_Scene.h"
|
||||
#include "model_Storage.h"
|
||||
|
||||
#include "computervision/object_detection.h"
|
||||
#include "scenes/game_Over_Scene.h"
|
||||
#include "entities/collision_entity.h"
|
||||
#include "computervision/object_detection.h"
|
||||
|
||||
#pragma comment(lib, "glfw3.lib")
|
||||
#pragma comment(lib, "glew32s.lib")
|
||||
#pragma comment(lib, "opengl32.lib")
|
||||
|
||||
int score;
|
||||
static double UpdateDelta();
|
||||
|
||||
static GLFWwindow* window;
|
||||
|
||||
scene::Scene* current_scene;
|
||||
|
||||
bool points_img_available = false;
|
||||
cv::Mat points_img;
|
||||
|
||||
int main(void)
|
||||
{
|
||||
#pragma region OPENGL_SETTINGS
|
||||
@@ -50,10 +64,11 @@ int main(void)
|
||||
glewInit();
|
||||
glGetError();
|
||||
#pragma endregion
|
||||
//current_scene = new scene::Startup_Scene();
|
||||
current_scene = new scene::Loading_Scene();
|
||||
score = 0;
|
||||
|
||||
|
||||
current_scene = new scene::Startup_Scene();
|
||||
|
||||
glfwSetKeyCallback(window, [](GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||
{
|
||||
if (key == GLFW_KEY_ESCAPE)
|
||||
@@ -66,8 +81,6 @@ int main(void)
|
||||
|
||||
bool window_open = true;
|
||||
|
||||
|
||||
|
||||
// Main game loop
|
||||
while (!glfwWindowShouldClose(window) && window_open)
|
||||
{
|
||||
@@ -82,13 +95,21 @@ int main(void)
|
||||
window_open = false;
|
||||
break;
|
||||
|
||||
case scene::Scenes::LOADING:
|
||||
current_scene = new scene::Loading_Scene();
|
||||
break;
|
||||
|
||||
case scene::Scenes::STARTUP:
|
||||
current_scene = new scene::Startup_Scene();
|
||||
break;
|
||||
|
||||
|
||||
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(score);
|
||||
break;
|
||||
|
||||
default:
|
||||
@@ -105,6 +126,7 @@ int main(void)
|
||||
|
||||
// Clean up -> preventing memory leaks!!!
|
||||
std::cout << "ending..." << std::endl;
|
||||
render_engine::loader::CleanUp();
|
||||
glfwTerminate();
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -0,0 +1,205 @@
|
||||
#include "model_Storage.h"
|
||||
|
||||
|
||||
singleton::Model_Storage* singleton::Model_Storage::instance{nullptr};
|
||||
std::mutex singleton::Model_Storage::mutex;
|
||||
|
||||
singleton::Model_Storage::~Model_Storage()
|
||||
{
|
||||
std::cout << "DELETING...." << std::endl;
|
||||
delete instance;
|
||||
}
|
||||
|
||||
singleton::Model_Storage* singleton::Model_Storage::get_instance()
|
||||
{
|
||||
std::lock_guard<std::mutex> lock(mutex);
|
||||
if (instance == nullptr)
|
||||
instance = new Model_Storage();
|
||||
|
||||
return instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* add methods
|
||||
*/
|
||||
|
||||
void singleton::Model_Storage::add_couch(models::TexturedModel couch)
|
||||
{
|
||||
couches.push_back(couch);
|
||||
}
|
||||
|
||||
void singleton::Model_Storage::add_table(models::TexturedModel table)
|
||||
{
|
||||
tables.push_back(table);
|
||||
}
|
||||
|
||||
void singleton::Model_Storage::add_chair(models::TexturedModel chair)
|
||||
{
|
||||
chairs.push_back(chair);
|
||||
}
|
||||
|
||||
void singleton::Model_Storage::add_plant(models::TexturedModel plant)
|
||||
{
|
||||
plants.push_back(plant);
|
||||
}
|
||||
|
||||
void singleton::Model_Storage::add_guitar(models::TexturedModel guitar)
|
||||
{
|
||||
guitars.push_back(guitar);
|
||||
}
|
||||
|
||||
void singleton::Model_Storage::add_bookshelf(models::TexturedModel bookshelf)
|
||||
{
|
||||
bookshelves.push_back(bookshelf);
|
||||
}
|
||||
|
||||
void singleton::Model_Storage::add_lamp(models::TexturedModel lamp)
|
||||
{
|
||||
lamps.push_back(lamp);
|
||||
}
|
||||
|
||||
void singleton::Model_Storage::add_ceiling_object(models::TexturedModel co)
|
||||
{
|
||||
ceiling_objects.push_back(co);
|
||||
}
|
||||
|
||||
void singleton::Model_Storage::add_misc(models::TexturedModel misc)
|
||||
{
|
||||
miscs.push_back(misc);
|
||||
}
|
||||
|
||||
void singleton::Model_Storage::add_furniture_model(FurnitureModel model)
|
||||
{
|
||||
furniture_models.push_back(model);
|
||||
}
|
||||
|
||||
/**
|
||||
* getters
|
||||
*/
|
||||
|
||||
std::deque<models::TexturedModel> singleton::Model_Storage::get_all_couches()
|
||||
{
|
||||
return couches;
|
||||
}
|
||||
|
||||
std::deque<models::TexturedModel> singleton::Model_Storage::get_all_tables()
|
||||
{
|
||||
return tables;
|
||||
}
|
||||
|
||||
std::deque<models::TexturedModel> singleton::Model_Storage::get_all_chairs()
|
||||
{
|
||||
return chairs;
|
||||
}
|
||||
|
||||
std::deque<models::TexturedModel> singleton::Model_Storage::get_all_plants()
|
||||
{
|
||||
return plants;
|
||||
}
|
||||
|
||||
std::deque<models::TexturedModel> singleton::Model_Storage::get_all_guitars()
|
||||
{
|
||||
return guitars;
|
||||
}
|
||||
|
||||
std::deque<models::TexturedModel> singleton::Model_Storage::get_all_bookshelves()
|
||||
{
|
||||
return bookshelves;
|
||||
}
|
||||
|
||||
std::deque<models::TexturedModel> singleton::Model_Storage::get_all_lamps()
|
||||
{
|
||||
return lamps;
|
||||
}
|
||||
|
||||
std::deque<models::TexturedModel> singleton::Model_Storage::get_all_ceiling_objects()
|
||||
{
|
||||
return ceiling_objects;
|
||||
}
|
||||
|
||||
std::deque<models::TexturedModel> singleton::Model_Storage::get_all_miscs()
|
||||
{
|
||||
return miscs;
|
||||
}
|
||||
|
||||
std::deque<singleton::FurnitureModel> singleton::Model_Storage::get_all_furniture_models()
|
||||
{
|
||||
return furniture_models;
|
||||
}
|
||||
|
||||
models::TexturedModel singleton::Model_Storage::get_couch(int index)
|
||||
{
|
||||
return couches[index];
|
||||
}
|
||||
|
||||
models::TexturedModel singleton::Model_Storage::get_table(int index)
|
||||
{
|
||||
return tables[index];
|
||||
}
|
||||
|
||||
models::TexturedModel singleton::Model_Storage::get_chair(int index)
|
||||
{
|
||||
return chairs[index];
|
||||
}
|
||||
|
||||
models::TexturedModel singleton::Model_Storage::get_plant(int index)
|
||||
{
|
||||
return plants[index];
|
||||
}
|
||||
|
||||
models::TexturedModel singleton::Model_Storage::get_guitar(int index)
|
||||
{
|
||||
return guitars[index];
|
||||
}
|
||||
|
||||
models::TexturedModel singleton::Model_Storage::get_bookshelf(int index)
|
||||
{
|
||||
return bookshelves[index];
|
||||
}
|
||||
|
||||
models::TexturedModel singleton::Model_Storage::get_lamp(int index)
|
||||
{
|
||||
return lamps[index];
|
||||
}
|
||||
|
||||
models::TexturedModel singleton::Model_Storage::get_ceiling_object(int index)
|
||||
{
|
||||
return ceiling_objects[index];
|
||||
}
|
||||
|
||||
models::TexturedModel singleton::Model_Storage::get_misc(int index)
|
||||
{
|
||||
return miscs[index];
|
||||
}
|
||||
|
||||
singleton::FurnitureModel singleton::Model_Storage::get_furniture_model(int index)
|
||||
{
|
||||
return furniture_models[index];
|
||||
}
|
||||
|
||||
|
||||
//getters for default variables
|
||||
models::TexturedModel singleton::Model_Storage::get_house_model()
|
||||
{
|
||||
return house_model;
|
||||
}
|
||||
|
||||
models::ModelTexture singleton::Model_Storage::get_default_texture()
|
||||
{
|
||||
return default_texture;
|
||||
}
|
||||
|
||||
//setters for deafult variables
|
||||
void singleton::Model_Storage::set_house_model(models::TexturedModel house)
|
||||
{
|
||||
house_model = house;
|
||||
}
|
||||
|
||||
void singleton::Model_Storage::set_default_texture(models::ModelTexture texture)
|
||||
{
|
||||
default_texture = texture;
|
||||
}
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -0,0 +1,137 @@
|
||||
#pragma once
|
||||
#include <iostream>
|
||||
#include <deque>
|
||||
#include <mutex>
|
||||
#include "models/Model.h"
|
||||
#include "entities/Entity.h"
|
||||
|
||||
namespace singleton {
|
||||
enum class FurnitureType
|
||||
{
|
||||
COUCH,
|
||||
TABLE,
|
||||
CHAIR,
|
||||
PLANT,
|
||||
GUITAR,
|
||||
BOOKSHELF,
|
||||
LAMP,
|
||||
CEILING_OBJECTS,
|
||||
MISC
|
||||
};
|
||||
struct FurniturePiece
|
||||
{
|
||||
FurnitureType type;
|
||||
int size;
|
||||
};
|
||||
|
||||
struct FurnitureModel
|
||||
{
|
||||
FurniturePiece furniture;
|
||||
std::deque<models::TexturedModel> texture;
|
||||
|
||||
bool operator<(FurnitureModel a)
|
||||
{
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
class Model_Storage
|
||||
{
|
||||
private:
|
||||
static Model_Storage* instance;
|
||||
static std::mutex mutex;
|
||||
|
||||
//model of the house
|
||||
models::TexturedModel house_model;
|
||||
//default texture
|
||||
models::ModelTexture default_texture;
|
||||
|
||||
//list that sorts furniture_models on type
|
||||
std::deque<FurnitureModel> furniture_models;
|
||||
|
||||
//list of furniture:
|
||||
//couches
|
||||
std::deque<models::TexturedModel> couches;
|
||||
|
||||
//tables
|
||||
std::deque<models::TexturedModel> tables;
|
||||
|
||||
//chairs
|
||||
std::deque<models::TexturedModel> chairs;
|
||||
|
||||
//plants
|
||||
std::deque<models::TexturedModel> plants;
|
||||
|
||||
//guitars
|
||||
std::deque<models::TexturedModel> guitars;
|
||||
|
||||
//bookshelves
|
||||
std::deque<models::TexturedModel> bookshelves;
|
||||
|
||||
//lamps
|
||||
std::deque<models::TexturedModel>lamps;
|
||||
|
||||
//ceiling objects
|
||||
std::deque<models::TexturedModel>ceiling_objects;
|
||||
|
||||
//misc
|
||||
std::deque<models::TexturedModel> miscs;
|
||||
|
||||
protected:
|
||||
Model_Storage() { std::cout << "MAKING A NEW SINGLETON!!!" << std::endl; }
|
||||
~Model_Storage();
|
||||
|
||||
public:
|
||||
Model_Storage(Model_Storage& other) = delete;
|
||||
void operator=(const Model_Storage&) = delete;
|
||||
|
||||
static Model_Storage* get_instance();
|
||||
|
||||
//some methods to execute on its instance:
|
||||
void add_couch(models::TexturedModel couch);
|
||||
void add_table(models::TexturedModel table);
|
||||
void add_chair(models::TexturedModel chair);
|
||||
void add_plant(models::TexturedModel plant);
|
||||
void add_guitar(models::TexturedModel guitar);
|
||||
void add_bookshelf(models::TexturedModel bookshelf);
|
||||
void add_lamp(models::TexturedModel lamp);
|
||||
void add_ceiling_object(models::TexturedModel co);
|
||||
void add_misc(models::TexturedModel misc);
|
||||
void add_furniture_model(FurnitureModel model);
|
||||
|
||||
//getters for the whole list
|
||||
std::deque<models::TexturedModel> get_all_couches();
|
||||
std::deque<models::TexturedModel> get_all_tables();
|
||||
std::deque<models::TexturedModel> get_all_chairs();
|
||||
std::deque<models::TexturedModel> get_all_plants();
|
||||
std::deque<models::TexturedModel> get_all_guitars();
|
||||
std::deque<models::TexturedModel> get_all_bookshelves();
|
||||
std::deque<models::TexturedModel> get_all_lamps();
|
||||
std::deque<models::TexturedModel> get_all_ceiling_objects();
|
||||
std::deque<models::TexturedModel> get_all_miscs();
|
||||
std::deque<FurnitureModel> get_all_furniture_models();
|
||||
|
||||
//getters for one model
|
||||
models::TexturedModel get_couch(int index);
|
||||
models::TexturedModel get_table(int index);
|
||||
models::TexturedModel get_chair(int index);
|
||||
models::TexturedModel get_plant(int index);
|
||||
models::TexturedModel get_guitar(int index);
|
||||
models::TexturedModel get_bookshelf(int index);
|
||||
models::TexturedModel get_lamp(int index);
|
||||
models::TexturedModel get_ceiling_object(int index);
|
||||
models::TexturedModel get_misc(int index);
|
||||
FurnitureModel get_furniture_model(int index);
|
||||
|
||||
//getters for the standard variables
|
||||
models::TexturedModel get_house_model();
|
||||
models::ModelTexture get_default_texture();
|
||||
|
||||
//setters for the standard variables
|
||||
void set_house_model(models::TexturedModel house);
|
||||
void set_default_texture(models::ModelTexture texture);
|
||||
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -1,6 +1,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <GL/glew.h>
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
|
||||
namespace models
|
||||
{
|
||||
|
||||
@@ -4,7 +4,6 @@
|
||||
#include "loader.h"
|
||||
#include "../toolbox/toolbox.h"
|
||||
#include "renderer.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
namespace render_engine
|
||||
@@ -51,9 +50,9 @@ namespace render_engine
|
||||
/*
|
||||
This function will Render a Model on the screen.
|
||||
*/
|
||||
void Render(entities::Entity& entity, shaders::EntityShader& shader)
|
||||
void Render(std::shared_ptr<entities::Entity> entity, shaders::EntityShader& shader)
|
||||
{
|
||||
const models::TexturedModel model = entity.GetModel();
|
||||
const models::TexturedModel model = entity.get()->GetModel();
|
||||
const models::RawModel raw_model = model.raw_model;
|
||||
const models::ModelTexture texture = model.texture;
|
||||
|
||||
@@ -66,7 +65,7 @@ namespace render_engine
|
||||
glEnableVertexAttribArray(2);
|
||||
|
||||
// Load the transformation of the model into the shader
|
||||
const glm::mat4 modelMatrix = toolbox::CreateModelMatrix(entity.GetPosition(), entity.GetRotation(), entity.GetScale());
|
||||
const glm::mat4 modelMatrix = toolbox::CreateModelMatrix(entity.get()->GetPosition(), entity.get()->GetRotation(), entity.get()->GetScale());
|
||||
shader.LoadModelMatrix(modelMatrix);
|
||||
shader.LoadShineVariables(texture.shine_damper, texture.reflectivity);
|
||||
|
||||
@@ -110,6 +109,88 @@ namespace render_engine
|
||||
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();
|
||||
}
|
||||
|
||||
void Render(std::vector<std::shared_ptr<gui::GuiTexture>>& 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::GuiTexture> 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::GuiTexture>& 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);
|
||||
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#pragma once
|
||||
|
||||
#include <memory>
|
||||
#include "../gui/gui_element.h"
|
||||
#include "../entities/entity.h"
|
||||
#include "../shaders/entity_shader.h"
|
||||
@@ -30,7 +31,7 @@ namespace render_engine
|
||||
@param entity: The entity which needs to be rendered
|
||||
@param shader: The shader the entity needs to be rendered with
|
||||
*/
|
||||
void Render(entities::Entity& entity, shaders::EntityShader& shader);
|
||||
void Render(std::shared_ptr<entities::Entity> entity, shaders::EntityShader& shader);
|
||||
|
||||
/*
|
||||
@brief: Call this function to render gui_textures on the screen
|
||||
@@ -39,5 +40,22 @@ namespace render_engine
|
||||
@param shade: The shader the GUI textures need to be rendered with
|
||||
*/
|
||||
void Render(std::vector<gui::GuiTexture*>& 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<std::shared_ptr<gui::GuiTexture>>& 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::GuiTexture>& gui, shaders::GuiShader& shader);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,185 @@
|
||||
#include <iostream>
|
||||
#include <GL/glew.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <map>
|
||||
#include "game_Over_Scene.h"
|
||||
#include <iostream>
|
||||
#include <opencv2/core/mat.hpp>
|
||||
|
||||
#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/object_detection.h"
|
||||
#include "../computervision/hand_detect_region.h"
|
||||
#include <opencv2/highgui.hpp>
|
||||
#include "../computervision/object_detection.h"
|
||||
|
||||
namespace scene
|
||||
{
|
||||
shaders::GuiShader* gui_shader_gameOver;
|
||||
std::vector<gui::GuiTexture*> guis_gameOver;
|
||||
std::vector<std::shared_ptr<gui::GuiTexture>> score_textures_gameOver;
|
||||
double delta_time = 0;
|
||||
double time = 0;
|
||||
bool game_over = false;
|
||||
|
||||
Game_Over_Scene::Game_Over_Scene(int score)
|
||||
{
|
||||
shaders::EntityShader shader;
|
||||
shader.Init();
|
||||
render_engine::renderer::Init(shader);
|
||||
shader.CleanUp();
|
||||
|
||||
gui_shader_gameOver = new shaders::GuiShader();
|
||||
gui_shader_gameOver->Init();
|
||||
|
||||
for (int i = 0; i <= 9; i++)
|
||||
{
|
||||
std::shared_ptr<gui::GuiTexture> score_pointer;
|
||||
|
||||
std::string texture_path = "res/";
|
||||
texture_path += std::to_string(i);
|
||||
texture_path += ".png";
|
||||
|
||||
score_pointer = std::make_unique<gui::GuiTexture>(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<gui::GuiTexture>(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;
|
||||
return button;
|
||||
}
|
||||
else {
|
||||
button = nullptr;
|
||||
return button;
|
||||
}
|
||||
}
|
||||
else {
|
||||
button = nullptr;
|
||||
return button;
|
||||
}
|
||||
}
|
||||
|
||||
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.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([this]()
|
||||
{
|
||||
std::cout << "Back to stop screen!!" << std::endl;
|
||||
return_value = Scenes::STOP;
|
||||
|
||||
});
|
||||
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 (game_over) button_start_scene.ForceClick(GLFW_MOUSE_BUTTON_LEFT);
|
||||
glfwSwapBuffers(window);
|
||||
glfwPollEvents();
|
||||
}
|
||||
|
||||
gui_shader_gameOver->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);
|
||||
|
||||
render_engine::renderer::Render(game_over_texture, *gui_shader_gameOver);
|
||||
DrawScore(end_score);
|
||||
}
|
||||
|
||||
/**
|
||||
* 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);
|
||||
}
|
||||
|
||||
UpdateDeltaTime();
|
||||
time += delta_time;
|
||||
|
||||
if (time >= 5.0)
|
||||
{
|
||||
game_over = true;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* 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::STARTUP;
|
||||
cv::destroyWindow("camera");
|
||||
}
|
||||
}
|
||||
|
||||
void Game_Over_Scene::DrawScore(int score)
|
||||
{
|
||||
std::vector<int> 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);
|
||||
}
|
||||
}
|
||||
|
||||
void Game_Over_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;
|
||||
|
||||
}
|
||||
|
||||
Game_Over_Scene::~Game_Over_Scene()
|
||||
{
|
||||
std::cout << "game over destructor" << std::endl;
|
||||
delete gui_shader_gameOver;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,37 @@
|
||||
#pragma once
|
||||
#include "scene.h"
|
||||
#include "../gui/gui_element.h"
|
||||
|
||||
namespace scene
|
||||
{
|
||||
extern GLFWwindow* window;
|
||||
|
||||
class Game_Over_Scene : public scene::Scene
|
||||
{
|
||||
private:
|
||||
|
||||
int end_score;
|
||||
scene::Scenes return_value = scene::Scenes::GAMEOVER;
|
||||
std::vector<std::shared_ptr<gui::GuiTexture>> score_guis_gameOver;
|
||||
std::shared_ptr<gui::GuiTexture> game_over_texture;
|
||||
void UpdateDeltaTime();
|
||||
|
||||
|
||||
public:
|
||||
Game_Over_Scene(int score);
|
||||
~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;
|
||||
/**
|
||||
* @brief: This method renders the score points onto the game window
|
||||
* @param score: Score to show
|
||||
*/
|
||||
void DrawScore(int score);
|
||||
};
|
||||
}
|
||||
+326
-34
@@ -1,60 +1,166 @@
|
||||
#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"
|
||||
|
||||
#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::vector<entities::Entity> entities;
|
||||
std::vector<entities::Light> lights;
|
||||
models::RawModel raw_model;
|
||||
std::shared_ptr<entities::MainCharacter>main_character;
|
||||
std::deque<std::shared_ptr<entities::CollisionEntity>> collision_entities;
|
||||
|
||||
//std::deque<std::shared_ptr<entities::CollisionEntity>> furniture_collision;
|
||||
|
||||
entities::HouseGenerator* house_generator;
|
||||
std::deque<std::shared_ptr<entities::Entity>> house_models;
|
||||
|
||||
models::RawModel raw_model, raw_model_char;
|
||||
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;
|
||||
std::vector<std::shared_ptr<gui::GuiTexture>> score_textures;
|
||||
|
||||
int furniture_count_old;
|
||||
int score;
|
||||
int* ptr;
|
||||
bool calibrated = false;
|
||||
|
||||
In_Game_Scene::In_Game_Scene()
|
||||
float delta_time = 0;
|
||||
|
||||
std::vector<computervision::HandDetectRegion*> regions;
|
||||
computervision::HandDetectRegion reg_left("left", 0, 0, 150, 150), reg_right("right", 0, 0, 150, 150), reg_up("up", 0, 0, 150, 150);
|
||||
|
||||
/**
|
||||
* sets up the first things when the objects has been made
|
||||
*/
|
||||
In_Game_Scene::In_Game_Scene(int *score_ptr)
|
||||
{
|
||||
ptr = score_ptr;
|
||||
camera = std::make_unique<entities::Camera>(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0));
|
||||
|
||||
shader = new shaders::EntityShader;
|
||||
shader->Init();
|
||||
render_engine::renderer::Init(*shader);
|
||||
|
||||
gui_shader = new shaders::GuiShader();
|
||||
gui_shader->Init();
|
||||
score = 0;
|
||||
|
||||
for (int i = 0; i <= 9; i++)
|
||||
{
|
||||
std::shared_ptr<gui::GuiTexture> score_pointer;
|
||||
|
||||
std::string texture_path = "res/";
|
||||
texture_path += std::to_string(i);
|
||||
texture_path += ".png";
|
||||
|
||||
score_pointer = std::make_unique<gui::GuiTexture>(render_engine::loader::LoadTexture(texture_path), glm::vec2(-0.9f, 0.8f), glm::vec2(0.07, 0.15));
|
||||
score_textures.push_back(score_pointer);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* temporary?
|
||||
* just to make some bounding boxes
|
||||
*/
|
||||
collision::Box create_bounding_box(glm::vec3 size, glm::vec3 pos, int scale) {
|
||||
collision::Box box = collision::Box();
|
||||
box.size.x = size.z * scale;
|
||||
box.size.y = size.y * scale;
|
||||
box.size.z = size.x * scale;
|
||||
box.center_pos = pos;
|
||||
return box;
|
||||
}
|
||||
/**
|
||||
* deletes certain veriables when the object will be deleted, prevents memory leaks
|
||||
*/
|
||||
In_Game_Scene::~In_Game_Scene()
|
||||
{
|
||||
delete shader;
|
||||
delete gui_shader;
|
||||
delete house_generator;
|
||||
}
|
||||
|
||||
|
||||
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<void()> 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);
|
||||
}
|
||||
|
||||
|
||||
void In_Game_Scene::LoadChunk(int model_pos)
|
||||
{
|
||||
static unsigned int furniture_count = 0;
|
||||
std::cout << "loading model chunk" << std::endl;
|
||||
|
||||
if (house_models.size() >= MAX_MODEL_DEQUE_SIZE * furniture_count)
|
||||
{
|
||||
for (int i = 0; i < furniture_count; i++)
|
||||
{
|
||||
house_models.pop_front();
|
||||
collision_entities.pop_front();
|
||||
}
|
||||
}
|
||||
int z_offset = model_pos * (house_generator->GetHouseDepth()); // how much "in the distance" we should load the model
|
||||
std::deque<std::shared_ptr<entities::CollisionEntity>> furniture;
|
||||
house_generator->GenerateHouse(&furniture, 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;
|
||||
|
||||
}
|
||||
|
||||
/**
|
||||
* starts the game scene, calls the render and update methods in a while loop
|
||||
*/
|
||||
scene::Scenes scene::In_Game_Scene::start(GLFWwindow* window)
|
||||
{
|
||||
raw_model = render_engine::LoadObjModel("res/House.obj");
|
||||
texture = { render_engine::loader::LoadTexture("res/Texture.png") };
|
||||
texture.shine_damper = 10;
|
||||
texture.reflectivity = 0;
|
||||
models::TexturedModel model = { raw_model, texture };
|
||||
|
||||
int z = 0;
|
||||
for (int i = 0; i < 5; ++i)
|
||||
|
||||
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);
|
||||
main_character = std::make_shared<entities::MainCharacter>(model_char, glm::vec3(0, 150, -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++)
|
||||
{
|
||||
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);
|
||||
LoadChunk(i);
|
||||
}
|
||||
|
||||
lights.push_back(entities::Light(glm::vec3(0, 1000, -7000), glm::vec3(5, 5, 5)));
|
||||
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));
|
||||
gui::Button button(render_engine::loader::LoadTexture("res/Mayo.png"), glm::vec2(0.5f, 0.0f), glm::vec2(1, 1));
|
||||
button.SetHoverTexture(render_engine::loader::LoadTexture("res/Texture.png"));
|
||||
button.SetClickedTexture(render_engine::loader::LoadTexture("res/Mayo.png"));
|
||||
button.SetOnClickAction([]()
|
||||
@@ -64,55 +170,241 @@ namespace scene
|
||||
guis.push_back(&button);
|
||||
|
||||
|
||||
//guis for the pause menu
|
||||
gui::GuiTexture background(render_engine::loader::LoadTexture("res/background_grey.png"), glm::vec2(0, 0), glm::vec2(1, 1));
|
||||
pause_guis.push_back(&background);
|
||||
|
||||
gui::Button pause_button_resume(render_engine::loader::LoadTexture("res/menu_item_resume1.png"), glm::vec2(0.0f, 0.3f), glm::vec2(0.25f, 0.25f));
|
||||
pause_button_resume.SetHoverTexture(render_engine::loader::LoadTexture("res/menu_item_resume1_hover.png"));
|
||||
pause_button_resume.SetClickedTexture(render_engine::loader::LoadTexture("res/menu_item_resume1_click.png"));
|
||||
std::function<void()> resume_fun = [this]()
|
||||
{
|
||||
std::cout << "I got clicked on the resume button!" << std::endl;
|
||||
game_state = scene::Game_State::RUNNING;
|
||||
};
|
||||
pause_button_resume.SetOnClickAction(resume_fun);
|
||||
pause_guis.push_back(&pause_button_resume);
|
||||
|
||||
gui::Button pause_button_quit(render_engine::loader::LoadTexture("res/menu_item_quit1.png"), glm::vec2(0.0f, -0.3f), glm::vec2(0.25f, 0.25f));
|
||||
pause_button_quit.SetHoverTexture(render_engine::loader::LoadTexture("res/menu_item_quit1_hover.png"));
|
||||
pause_button_quit.SetClickedTexture(render_engine::loader::LoadTexture("res/menu_item_quit1_click.png"));
|
||||
std::function<void()> stop_function = [this]()
|
||||
{
|
||||
std::cout << "I got clicked on the quit button!" << std::endl;
|
||||
return_value = scene::Scenes::STOP;
|
||||
};
|
||||
pause_button_quit.SetOnClickAction(stop_function);
|
||||
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)
|
||||
{
|
||||
//checks the current game state, so it can render the correct models for each state
|
||||
switch (game_state)
|
||||
{
|
||||
/*case scene::Game_State::IDLE:
|
||||
break;*/
|
||||
|
||||
case scene::Game_State::PAUSED:
|
||||
render();
|
||||
update_buttons(window);
|
||||
render_pause_menu();
|
||||
|
||||
break;
|
||||
|
||||
case scene::Game_State::RUNNING:
|
||||
update(window);
|
||||
button.Update(window);
|
||||
render();
|
||||
break;
|
||||
|
||||
default:
|
||||
std::cout << "Game state unknown" << std::endl;
|
||||
break;
|
||||
}
|
||||
|
||||
|
||||
glfwSwapBuffers(window);
|
||||
glfwPollEvents();
|
||||
}
|
||||
shader->CleanUp();
|
||||
gui_shader->CleanUp();
|
||||
render_engine::loader::CleanUp();
|
||||
//render_engine::loader::CleanUp();
|
||||
return return_value;
|
||||
}
|
||||
|
||||
gui::Button* In_Game_Scene::ConvertGuiTextureToButton(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;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* renders the game models
|
||||
*/
|
||||
void scene::In_Game_Scene::render()
|
||||
{
|
||||
// Render
|
||||
render_engine::renderer::Prepare();
|
||||
|
||||
//starts the shader and begins to render
|
||||
shader->Start();
|
||||
shader->LoadSkyColor(render_engine::renderer::SKY_COLOR);
|
||||
shader->LoadLights(lights);
|
||||
shader->LoadViewMatrix(camera);
|
||||
shader->LoadLightsDeque(lights);
|
||||
shader->LoadViewMatrix(*camera);
|
||||
|
||||
// Renders each entity in the entities list
|
||||
for (entities::Entity& entity : entities)
|
||||
for (std::shared_ptr<entities::Entity> model_entity : house_models)
|
||||
{
|
||||
render_engine::renderer::Render(entity, *shader);
|
||||
render_engine::renderer::Render(model_entity, *shader);
|
||||
}
|
||||
|
||||
render_engine::renderer::Render(main_character, *shader);
|
||||
|
||||
// Render GUI items
|
||||
render_engine::renderer::Render(guis, *gui_shader);
|
||||
//render_engine::renderer::Render(guis, *gui_shader);
|
||||
|
||||
// Stop rendering the entities
|
||||
shader->Stop();
|
||||
|
||||
DrawScore(score);
|
||||
}
|
||||
|
||||
void scene::In_Game_Scene::update_buttons(GLFWwindow* window)
|
||||
{
|
||||
for (gui::GuiTexture* button : pause_guis) {
|
||||
gui::Button* new_button = ConvertGuiTextureToButton(button);
|
||||
if (new_button != NULL)
|
||||
new_button->Update(window);
|
||||
}
|
||||
}
|
||||
|
||||
//updates certain variables
|
||||
void scene::In_Game_Scene::update(GLFWwindow* window)
|
||||
{
|
||||
camera.Move(window);
|
||||
UpdateDeltaTime();
|
||||
//camera.Move(window);
|
||||
update_hand_detection();
|
||||
if (!calibrated) return;
|
||||
main_character->Move(regions);
|
||||
if (!main_character.get()->GetOnCollide())
|
||||
{
|
||||
*ptr = score;
|
||||
std::cout << "Score: " << score << std::endl;
|
||||
return_value = scene::Scenes::GAMEOVER;
|
||||
cv::destroyWindow("camera");
|
||||
}
|
||||
|
||||
camera->Follow(main_character->GetPosition());
|
||||
|
||||
// calculate where the next house model should be loaded
|
||||
static int last_model_pos = 0;
|
||||
int model_pos = -round(camera->GetPosition().z / (house_generator->GetHouseDepth())); // 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)
|
||||
{
|
||||
std::cout << "updating score" << std::endl;
|
||||
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;
|
||||
|
||||
}
|
||||
// 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();
|
||||
}
|
||||
|
||||
//manages the key input in the game scene
|
||||
void scene::In_Game_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||
{
|
||||
if (glfwGetKey(window, GLFW_KEY_SPACE) == GLFW_PRESS)
|
||||
if (glfwGetKey(window, GLFW_KEY_ESCAPE) == GLFW_PRESS)
|
||||
{
|
||||
cv::destroyWindow("camera");
|
||||
return_value = scene::Scenes::STOP;
|
||||
}
|
||||
if (glfwGetKey(window, GLFW_KEY_P) == GLFW_PRESS)
|
||||
{
|
||||
game_state = scene::Game_State::PAUSED;
|
||||
}
|
||||
if (glfwGetKey(window, GLFW_KEY_O) == GLFW_PRESS)
|
||||
{
|
||||
game_state = scene::Game_State::RUNNING;
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
reg_right.DetectHand(camera_frame);
|
||||
reg_up.DetectHand(camera_frame);
|
||||
|
||||
cv::imshow("camera", camera_frame);
|
||||
}
|
||||
|
||||
void scene::In_Game_Scene::OnSkinCalibrationCallback()
|
||||
{
|
||||
calibrated = true;
|
||||
std::cout << "on skin calibration callback" << std::endl;
|
||||
std::vector<int> 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)
|
||||
{
|
||||
std::vector<int> digits;
|
||||
score_guis.clear();
|
||||
|
||||
toolbox::GetDigitsFromNumber(score, digits);
|
||||
|
||||
|
||||
for (int i = digits.size() - 1; i >= 0; i--)
|
||||
{
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
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;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
+139
-1
@@ -1,20 +1,158 @@
|
||||
#pragma once
|
||||
#include <iostream>
|
||||
#include <ostream>
|
||||
#include <vector>
|
||||
#include <memory>
|
||||
#include <string>
|
||||
#include <opencv2/core/base.hpp>
|
||||
#include <opencv2/imgcodecs.hpp>
|
||||
#include <opencv2/imgproc.hpp>
|
||||
#include <GL/glew.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <deque>
|
||||
#include <functional>
|
||||
#include <queue>
|
||||
#include <opencv2/core/base.hpp>
|
||||
|
||||
#include "startup_Scene.h"
|
||||
#include "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 "../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
|
||||
{
|
||||
/**
|
||||
* This enum is for managing the game scene state.
|
||||
* for example: when pressed on a specific button, the game will be in a paused state and nothing about the player or the speed of the game will be updated
|
||||
* and the pause screen will show up.
|
||||
**/
|
||||
enum class Game_State
|
||||
{
|
||||
//IDLE,
|
||||
RUNNING,
|
||||
PAUSED
|
||||
};
|
||||
|
||||
class In_Game_Scene : public scene::Scene
|
||||
{
|
||||
private:
|
||||
//return_value is an enum that is necessary for the scene switching. Whenever this changes, the scene will change to a different scene.
|
||||
scene::Scenes return_value = scene::Scenes::INGAME;
|
||||
//game_state is an enum that keeps track of the current game state. For example: is the game running(thus the user is playing the game) of is the game paused.
|
||||
scene::Game_State game_state = scene::Game_State::RUNNING;
|
||||
|
||||
//entities_to_render is a list of entities, those entities will be rendered in the 3D environment.
|
||||
std::vector<entities::Entity> entities_to_render;
|
||||
//lights is a lost of light points in the game, for example the sun or it can be used to attach light effects to lamps.
|
||||
std::deque<entities::Light> lights;
|
||||
|
||||
models::RawModel raw_model;
|
||||
models::ModelTexture texture;
|
||||
//the shader that is used for rendering the models.
|
||||
shaders::EntityShader* shader;
|
||||
//the gui_shader is used of rendering the gui models (for example the pause buttons).
|
||||
shaders::GuiShader* gui_shader;
|
||||
//camera is the camera view of the game scene, this camera will be behind the main character.
|
||||
std::unique_ptr<entities::Camera> camera;
|
||||
//guis is a list of all the gui components that needs to be load in the scene.
|
||||
std::vector<gui::GuiTexture*> guis;
|
||||
//pause_guis is a list of components that will be rendered when the game is paused.
|
||||
std::vector<gui::GuiTexture*> pause_guis;
|
||||
// list of gui texture that holds the textures for the score
|
||||
std::vector<std::shared_ptr<gui::GuiTexture>> score_guis;
|
||||
|
||||
void UpdateDeltaTime();
|
||||
|
||||
/**
|
||||
* @brief renders the objects/gui models
|
||||
* @param
|
||||
* @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);
|
||||
|
||||
void update_buttons(GLFWwindow* window);
|
||||
|
||||
gui::Button* ConvertGuiTextureToButton(gui::GuiTexture* texture);
|
||||
|
||||
public:
|
||||
In_Game_Scene();
|
||||
In_Game_Scene(int *score_ptr);
|
||||
~In_Game_Scene();
|
||||
|
||||
/**
|
||||
* @brief the method start is the start of the scene where a while loop runs, this runs the scene.
|
||||
* @param window the main window of the application
|
||||
* @return Scene value that indicates in which scene the application is
|
||||
*/
|
||||
Scenes start(GLFWwindow* window) override;
|
||||
|
||||
/**
|
||||
* @brief this method renders the models for the game scene
|
||||
* @param
|
||||
* @return void
|
||||
*/
|
||||
void render() override;
|
||||
|
||||
/**
|
||||
* @brief this method updates the models/variables for the game scene
|
||||
* @param window the main window of the application
|
||||
* @return void
|
||||
*/
|
||||
void update(GLFWwindow* window) override;
|
||||
|
||||
/**
|
||||
* @brief this method updates the models/variables for the game scene
|
||||
* @param window the main window of the application
|
||||
* @param key this is the keycode on which key has been pressed
|
||||
* @param scancode -
|
||||
* @param action-
|
||||
* @param mods -
|
||||
* @return void
|
||||
*/
|
||||
void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,146 @@
|
||||
#include "loading_Scene.h"
|
||||
|
||||
#include <iostream>
|
||||
|
||||
#include "../renderEngine/Renderer.h"
|
||||
#include "../renderEngine/Loader.h"
|
||||
#include "../renderEngine/obj_loader.h"
|
||||
#include "../gui/gui_element.h"
|
||||
#include "../entities/collision_entity.h"
|
||||
|
||||
namespace scene
|
||||
{
|
||||
std::unique_ptr<entities::Camera> camera_test;
|
||||
shaders::EntityShader* shader_test;
|
||||
std::deque<std::shared_ptr<entities::Entity>> test;
|
||||
|
||||
Loading_Scene::Loading_Scene()
|
||||
{
|
||||
shader_test = new shaders::EntityShader;
|
||||
shader_test->Init();
|
||||
render_engine::renderer::Init(*shader_test);
|
||||
delete shader_test;
|
||||
|
||||
gui_shader = new shaders::GuiShader();
|
||||
gui_shader->Init();
|
||||
|
||||
camera_test = std::make_unique<entities::Camera>(glm::vec3(0, 0, 0), glm::vec3(0, 0, 0));
|
||||
|
||||
}
|
||||
|
||||
Loading_Scene::~Loading_Scene()
|
||||
{
|
||||
delete gui_shader;
|
||||
}
|
||||
|
||||
Scenes Loading_Scene::start(GLFWwindow* window)
|
||||
{
|
||||
render();
|
||||
|
||||
glfwSwapBuffers(window);
|
||||
glfwPollEvents();
|
||||
|
||||
load_default_variables();
|
||||
load_all_models();
|
||||
|
||||
return scene::Scenes::STARTUP;
|
||||
}
|
||||
|
||||
void Loading_Scene::render()
|
||||
{
|
||||
render_engine::renderer::Prepare();
|
||||
//starts the shader and begins to render
|
||||
//shader_test->Start();
|
||||
//shader_test->LoadSkyColor(render_engine::renderer::SKY_COLOR);
|
||||
//shader_test->LoadViewMatrix(*camera_test);
|
||||
|
||||
gui::GuiTexture loading_image = { render_engine::loader::LoadTexture("res/loading_screen.png"),
|
||||
glm::vec2(0,0),glm::vec2(1,1) };
|
||||
|
||||
std::vector<gui::GuiTexture*> image_list;
|
||||
image_list.push_back(&loading_image);
|
||||
|
||||
render_engine::renderer::Render(image_list, *gui_shader);
|
||||
//shader_test->Stop();
|
||||
|
||||
gui_shader->CleanUp();
|
||||
}
|
||||
|
||||
void Loading_Scene::update(GLFWwindow* window)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Loading_Scene::onKey(GLFWwindow* window, int key, int scancode, int action, int mods)
|
||||
{
|
||||
}
|
||||
|
||||
|
||||
void Loading_Scene::load_default_variables()
|
||||
{
|
||||
models::RawModel raw_model = render_engine::LoadObjModel("res/HouseNew.obj");
|
||||
models::ModelTexture default_texture = { render_engine::loader::LoadTexture("res/Texture.png") };
|
||||
default_texture.shine_damper = 10;
|
||||
models::TexturedModel house = { raw_model, default_texture };
|
||||
|
||||
singleton::Model_Storage::get_instance()->set_house_model(house);
|
||||
singleton::Model_Storage::get_instance()->set_default_texture(default_texture);
|
||||
}
|
||||
|
||||
void Loading_Scene::load_all_models()
|
||||
{
|
||||
// Couches
|
||||
singleton::Model_Storage::get_instance()->add_couch({ render_engine::LoadObjModel("res/couchThree.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_couch({ render_engine::LoadObjModel("res/Coach.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_couch({ render_engine::LoadObjModel("res/lawnBenchOne.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_furniture_model({ {singleton::FurnitureType::COUCH, 2}, singleton::Model_Storage::get_instance()->get_all_couches() });
|
||||
|
||||
// Tables
|
||||
singleton::Model_Storage::get_instance()->add_table({ render_engine::LoadObjModel("res/tableOne.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_table({ render_engine::LoadObjModel("res/tableTwo.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_table({ render_engine::LoadObjModel("res/bureauOne.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_furniture_model({ {singleton::FurnitureType::TABLE, 2}, singleton::Model_Storage::get_instance()->get_all_tables() });
|
||||
|
||||
// Chairs
|
||||
singleton::Model_Storage::get_instance()->add_chair({ render_engine::LoadObjModel("res/launchchair.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_chair({ render_engine::LoadObjModel("res/lawnChairOne.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_chair({ render_engine::LoadObjModel("res/ugly_chair.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_furniture_model({ {singleton::FurnitureType::CHAIR, 1}, singleton::Model_Storage::get_instance()->get_all_chairs() });
|
||||
|
||||
// Plants
|
||||
singleton::Model_Storage::get_instance()->add_plant({ render_engine::LoadObjModel("res/plantOne.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_plant({ render_engine::LoadObjModel("res/plantTwo.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_plant({ render_engine::LoadObjModel("res/plantThree.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_furniture_model({ {singleton::FurnitureType::PLANT, 1}, singleton::Model_Storage::get_instance()->get_all_plants() });
|
||||
|
||||
// Guitars
|
||||
singleton::Model_Storage::get_instance()->add_guitar({ render_engine::LoadObjModel("res/guitarOne.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_guitar({ render_engine::LoadObjModel("res/guitarTwo.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_furniture_model({ {singleton::FurnitureType::GUITAR, 1}, singleton::Model_Storage::get_instance()->get_all_guitars() });
|
||||
|
||||
// Bookshelves
|
||||
singleton::Model_Storage::get_instance()->add_bookshelf({ render_engine::LoadObjModel("res/bookShelfOne.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_bookshelf({ render_engine::LoadObjModel("res/bookShelfTwo.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_bookshelf({ render_engine::LoadObjModel("res/bookShelfThree.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_furniture_model({ {singleton::FurnitureType::BOOKSHELF, 1}, singleton::Model_Storage::get_instance()->get_all_bookshelves() });
|
||||
|
||||
// Lamps
|
||||
singleton::Model_Storage::get_instance()->add_lamp({ render_engine::LoadObjModel("res/lampOne.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_lamp({ render_engine::LoadObjModel("res/lampTwo.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_furniture_model({ {singleton::FurnitureType::LAMP, 1}, singleton::Model_Storage::get_instance()->get_all_lamps() });
|
||||
|
||||
// Ceiling objects
|
||||
singleton::Model_Storage::get_instance()->add_ceiling_object({ render_engine::LoadObjModel("res/ceilingFan.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_ceiling_object({ render_engine::LoadObjModel("res/ceilingFanTwo.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_ceiling_object({ render_engine::LoadObjModel("res/ceilingLampOne.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_ceiling_object({ render_engine::LoadObjModel("res/ceilingLampTwo.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_furniture_model({ {singleton::FurnitureType::CEILING_OBJECTS, 1}, singleton::Model_Storage::get_instance()->get_all_ceiling_objects() });
|
||||
|
||||
// Miscs
|
||||
singleton::Model_Storage::get_instance()->add_misc({ render_engine::LoadObjModel("res/tv.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_misc({ render_engine::LoadObjModel("res/radio.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_misc({ render_engine::LoadObjModel("res/Flowerpot.obj"), singleton::Model_Storage::get_instance()->get_default_texture() });
|
||||
singleton::Model_Storage::get_instance()->add_furniture_model({ {singleton::FurnitureType::MISC, 1}, singleton::Model_Storage::get_instance()->get_all_miscs() });
|
||||
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,67 @@
|
||||
#pragma once
|
||||
#include "scene.h"
|
||||
#include "../gui/gui_element.h"
|
||||
#include "../shaders/gui_shader.h"
|
||||
#include "../model_Storage.h"
|
||||
|
||||
namespace scene
|
||||
{
|
||||
extern GLFWwindow* window;
|
||||
|
||||
|
||||
class Loading_Scene : public scene::Scene
|
||||
{
|
||||
private:
|
||||
//return_value is an enum that is necessary for the scene switching. Whenever this changes, the scene will change to a different scene.
|
||||
scene::Scenes return_value = scene::Scenes::LOADING;
|
||||
shaders::GuiShader* gui_shader;
|
||||
|
||||
|
||||
private:
|
||||
void load_default_variables();
|
||||
void load_all_models();
|
||||
|
||||
public:
|
||||
/**
|
||||
* @brief Constructor of the class Loading_Scene
|
||||
*
|
||||
*/
|
||||
Loading_Scene();
|
||||
|
||||
~Loading_Scene();
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
* @param window
|
||||
* @return
|
||||
*/
|
||||
Scenes start(GLFWwindow* window) override;
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
*/
|
||||
void render() override;
|
||||
|
||||
/**
|
||||
* @brief This method updates all the components on the window
|
||||
*
|
||||
* @param window Window it updates
|
||||
*/
|
||||
void update(GLFWwindow* window) override;
|
||||
|
||||
/**
|
||||
* @brief Listener for key events
|
||||
*
|
||||
* @param window Window it listens to for key events
|
||||
* @param key Key of event that is activated
|
||||
* @param scancode Code of Key
|
||||
* @param action
|
||||
* @param mods
|
||||
*/
|
||||
void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) override;
|
||||
};
|
||||
}
|
||||
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
#include <iostream>
|
||||
#include "scene.h"
|
||||
|
||||
scene::Scene::~Scene()
|
||||
{
|
||||
std::cout << "Main scene class gone!" << std::endl;
|
||||
}
|
||||
+33
-4
@@ -6,8 +6,12 @@
|
||||
|
||||
namespace scene {
|
||||
|
||||
/**
|
||||
* this enum represents the scenes in the game, those wil help to keep track in which scene the game is.
|
||||
*/
|
||||
enum class Scenes
|
||||
{
|
||||
LOADING,
|
||||
STARTUP,
|
||||
INGAME,
|
||||
GAMEOVER,
|
||||
@@ -18,14 +22,39 @@ namespace scene {
|
||||
class Scene
|
||||
{
|
||||
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
|
||||
* @return Scene value that indicates in which scene the application is
|
||||
*/
|
||||
virtual Scenes start(GLFWwindow* window) = 0;
|
||||
|
||||
/**
|
||||
* @brief this method renders the models for a scene
|
||||
* @param
|
||||
* @return void
|
||||
*/
|
||||
virtual void render() = 0;
|
||||
|
||||
/**
|
||||
* @brief this method updates the models/variables for a scene
|
||||
* @param window the main window of the application
|
||||
* @return void
|
||||
*/
|
||||
virtual void update(GLFWwindow* window) = 0;
|
||||
|
||||
/**
|
||||
* @brief this method updates the models/variables for a scene
|
||||
* @param window the main window of the application
|
||||
* @param key this is the keycode on which key has been pressed
|
||||
* @param scancode -
|
||||
* @param action-
|
||||
* @param mods -
|
||||
* @return void
|
||||
*/
|
||||
virtual void onKey(GLFWwindow* window, int key, int scancode, int action, int mods) {};
|
||||
|
||||
};
|
||||
|
||||
|
||||
}
|
||||
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
#include <iostream>
|
||||
#include <GL/glew.h>
|
||||
#include <GLFW/glfw3.h>
|
||||
#include <map>
|
||||
@@ -13,7 +14,8 @@
|
||||
#include "../gui/gui_interactable.h"
|
||||
#include "../toolbox/toolbox.h"
|
||||
#include "../computervision/MenuTest.h"
|
||||
#include "../computervision/ObjectDetection.h"
|
||||
#include "../computervision/object_detection.h"
|
||||
#include "../computervision/hand_detect_region.h"
|
||||
|
||||
|
||||
|
||||
@@ -22,6 +24,7 @@ namespace scene
|
||||
{
|
||||
shaders::GuiShader* gui_shader1;
|
||||
std::vector<gui::GuiTexture*> guis1;
|
||||
computervision::ObjectDetection objDetect;
|
||||
|
||||
float item_number = 0;
|
||||
|
||||
@@ -37,17 +40,33 @@ namespace scene
|
||||
gui_shader1->Init();
|
||||
}
|
||||
|
||||
void Startup_Scene::EnableHandMode()
|
||||
{
|
||||
hand_mode = true;
|
||||
}
|
||||
|
||||
gui::Button* ConvertGuiTextureToButton(gui::GuiTexture* texture) {
|
||||
gui::Button* button;
|
||||
if (texture != NULL)
|
||||
{
|
||||
|
||||
if (texture->GetType() == gui::GuiType::BUTTON) {
|
||||
|
||||
gui::Button* button = (gui::Button*)texture;
|
||||
button = (gui::Button*)texture;
|
||||
return button;
|
||||
}
|
||||
else {
|
||||
return NULL;
|
||||
button = nullptr;
|
||||
return button;
|
||||
}
|
||||
}
|
||||
else {
|
||||
button = nullptr;
|
||||
return button;
|
||||
}
|
||||
|
||||
|
||||
}
|
||||
|
||||
/*gui::InteractableGui* ConvertGuiTextureToInteractableGui(gui::GuiTexture* texture) {
|
||||
if (texture != NULL)
|
||||
@@ -62,7 +81,7 @@ namespace scene
|
||||
|
||||
gui::GuiTexture* GetMenuItem(bool hand_state) {
|
||||
if(hand_state)
|
||||
item_number += 0.20f;
|
||||
item_number += 0.10f;
|
||||
|
||||
int temp_item_number = item_number;
|
||||
|
||||
@@ -78,50 +97,48 @@ namespace scene
|
||||
scene::Scenes scene::Startup_Scene::start(GLFWwindow *window)
|
||||
{
|
||||
// GUI stuff
|
||||
gui::Button button_start(render_engine::loader::LoadTexture("res/menu_item_start1.png"), glm::vec2(0.0f, 0.6f), glm::vec2(0.25f, 0.25f));
|
||||
gui::Button button_start(render_engine::loader::LoadTexture("res/menu_item_start1.png"), glm::vec2(0.0f, 0.3f), glm::vec2(0.25f, 0.25f));
|
||||
button_start.SetHoverTexture(render_engine::loader::LoadTexture("res/menu_item_start1_hover.png"));
|
||||
button_start.SetClickedTexture(render_engine::loader::LoadTexture("res/menu_item_start1_click.png"));
|
||||
button_start.SetOnClickAction([]()
|
||||
std::function<void()> start_fun = [this]()
|
||||
{
|
||||
std::cout << "Clicked on button: Start!" << std::endl;
|
||||
return_value = scene::Scenes::INGAME;
|
||||
cv::destroyWindow("camera");
|
||||
|
||||
};
|
||||
button_start.SetOnClickAction(start_fun);
|
||||
|
||||
});
|
||||
guis1.push_back(&button_start);
|
||||
|
||||
gui::Button button_calibrate(render_engine::loader::LoadTexture("res/menu_item_calibrate1.png"), glm::vec2(0.0f, 0.0f), glm::vec2(0.25f, 0.25f));
|
||||
button_calibrate.SetHoverTexture(render_engine::loader::LoadTexture("res/menu_item_calibrate1_hover.png"));
|
||||
button_calibrate.SetClickedTexture(render_engine::loader::LoadTexture("res/menu_item_calibrate1_click.png"));
|
||||
button_calibrate.SetOnClickAction([]()
|
||||
{
|
||||
std::cout << "Clicked on button: Calibrate!" << std::endl;
|
||||
|
||||
});
|
||||
guis1.push_back(&button_calibrate);
|
||||
|
||||
gui::Button button_quit(render_engine::loader::LoadTexture("res/menu_item_quit1.png"), glm::vec2(0.0f, -0.6f), glm::vec2(0.25f, 0.25f));
|
||||
gui::Button button_quit(render_engine::loader::LoadTexture("res/menu_item_quit1.png"), glm::vec2(0.0f, -0.3f), glm::vec2(0.25f, 0.25f));
|
||||
button_quit.SetHoverTexture(render_engine::loader::LoadTexture("res/menu_item_quit1_hover.png"));
|
||||
button_quit.SetClickedTexture(render_engine::loader::LoadTexture("res/menu_item_quit1_click.png"));
|
||||
button_quit.SetOnClickAction([]()
|
||||
std::function<void()> quit_fun = [this]()
|
||||
{
|
||||
std::cout << "Clicked on button: Quit!" << std::endl;
|
||||
});
|
||||
return_value = scene::Scenes::STOP;
|
||||
cv::destroyWindow("camera");
|
||||
};
|
||||
button_quit.SetOnClickAction(quit_fun);
|
||||
guis1.push_back(&button_quit);
|
||||
|
||||
computervision::ObjectDetection objDetect;
|
||||
cv::Mat cameraFrame;
|
||||
gui::GuiTexture* chosen_item = NULL; //This is the selected menu_item
|
||||
bool hand_closed = false; //Flag to prevent multiple button presses
|
||||
|
||||
std::function<void()> calibration_func = [this]() {EnableHandMode(); };
|
||||
objDetect.SetCalibrationCallback(calibration_func);
|
||||
while (return_value == scene::Scenes::STARTUP)
|
||||
{
|
||||
render();
|
||||
update(window);
|
||||
|
||||
if (hand_mode) {
|
||||
cameraFrame = objDetect.readCamera();
|
||||
cameraFrame = objDetect.ReadCamera();
|
||||
|
||||
//Get hand state from camera
|
||||
bool hand_detection = objDetect.detectHand(cameraFrame);
|
||||
bool detect = false;
|
||||
bool hand_detection = objDetect.DetectHand(cameraFrame,detect);
|
||||
|
||||
if (hand_detection)
|
||||
{
|
||||
@@ -160,10 +177,13 @@ namespace scene
|
||||
glfwPollEvents();
|
||||
}
|
||||
gui_shader1->CleanUp();
|
||||
render_engine::loader::CleanUp();
|
||||
//render_engine::loader::CleanUp();
|
||||
return return_value;
|
||||
}
|
||||
|
||||
/**
|
||||
* renders the models in the start-up scene
|
||||
*/
|
||||
void scene::Startup_Scene::render()
|
||||
{
|
||||
render_engine::renderer::Prepare();
|
||||
@@ -172,6 +192,9 @@ namespace scene
|
||||
render_engine::renderer::Render(guis1, *gui_shader1);
|
||||
}
|
||||
|
||||
/**
|
||||
* updates the variables for the start-up scene
|
||||
*/
|
||||
void scene::Startup_Scene::update(GLFWwindow* window)
|
||||
{
|
||||
for (gui::GuiTexture* button : guis1) {
|
||||
@@ -179,16 +202,29 @@ namespace scene
|
||||
if (new_button != NULL)
|
||||
new_button->Update(window);
|
||||
}
|
||||
bool hand_present;
|
||||
objDetect.DetectHand(objDetect.ReadCamera(),hand_present);
|
||||
}
|
||||
|
||||
/**
|
||||
* manages the key input in the start-up scene
|
||||
*/
|
||||
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;
|
||||
cv::destroyWindow("camera");
|
||||
}
|
||||
else if (glfwGetKey(window, GLFW_KEY_BACKSPACE) == GLFW_PRESS) {
|
||||
hand_mode = !hand_mode;
|
||||
}
|
||||
}
|
||||
|
||||
Startup_Scene::~Startup_Scene()
|
||||
{
|
||||
std::cout << "startup scene destructor" << std::endl;
|
||||
delete gui_shader1;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,7 +9,9 @@ namespace scene
|
||||
class Startup_Scene : public scene::Scene
|
||||
{
|
||||
private:
|
||||
//return_value is an enum that is necessary for the scene switching. Whenever this changes, the scene will change to a different scene.
|
||||
scene::Scenes return_value = scene::Scenes::STARTUP;
|
||||
void EnableHandMode();
|
||||
|
||||
public:
|
||||
/**
|
||||
@@ -18,6 +20,8 @@ namespace scene
|
||||
*/
|
||||
Startup_Scene();
|
||||
|
||||
~Startup_Scene();
|
||||
|
||||
/**
|
||||
* @brief
|
||||
*
|
||||
|
||||
@@ -1,5 +1,6 @@
|
||||
#include "entity_shader.h"
|
||||
#include "../toolbox/toolbox.h"
|
||||
#include <deque>
|
||||
|
||||
namespace shaders
|
||||
{
|
||||
@@ -28,7 +29,7 @@ namespace shaders
|
||||
uniform vec3 light_position[4];
|
||||
|
||||
const float density = 0.0017;
|
||||
const float gradient = 4;
|
||||
const float gradient = 3;
|
||||
|
||||
void main(void)
|
||||
{
|
||||
@@ -160,6 +161,25 @@ 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
|
||||
{
|
||||
LoadFloat(location_shine_damper, shine_damper);
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <vector>
|
||||
#include <deque>
|
||||
#include "shader_program.h"
|
||||
#include "../entities/camera.h"
|
||||
#include "../entities/light.h"
|
||||
@@ -58,6 +59,13 @@ namespace shaders
|
||||
*/
|
||||
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
|
||||
*
|
||||
|
||||
@@ -42,5 +42,7 @@ namespace toolbox
|
||||
* @return: True if the timer has finished
|
||||
*/
|
||||
bool HasFinished() const { return has_finished; }
|
||||
|
||||
void Reset() { current_time = 0; }
|
||||
};
|
||||
}
|
||||
+34
-1
@@ -1,5 +1,6 @@
|
||||
#include <ctime>
|
||||
#include "toolbox.h"
|
||||
|
||||
#include <iostream>
|
||||
namespace toolbox
|
||||
{
|
||||
glm::mat4 CreateModelMatrix(glm::vec2 translation, glm::vec2 scale)
|
||||
@@ -31,4 +32,36 @@ namespace toolbox
|
||||
matrix = glm::translate(matrix, negative_cam_pos);
|
||||
return matrix;
|
||||
}
|
||||
float Lerp(float from, float to, float amount)
|
||||
{
|
||||
return from + amount * (to - from);
|
||||
}
|
||||
|
||||
glm::vec3 Lerp(glm::vec3 from, glm::vec3 to, float amount)
|
||||
{
|
||||
glm::vec3 final;
|
||||
final.x = Lerp(from.x, to.x, amount);
|
||||
final.y = Lerp(from.y, to.y, amount);
|
||||
final.z = Lerp(from.z, to.z, amount);
|
||||
return final;
|
||||
}
|
||||
|
||||
int Random(const int min, const int max)
|
||||
{
|
||||
static bool first = true;
|
||||
if (first)
|
||||
{
|
||||
srand(time(0));
|
||||
first = false;
|
||||
}
|
||||
return min + rand() % ((max + 1) - min);
|
||||
}
|
||||
|
||||
void GetDigitsFromNumber(int number, std::vector<int>& result_vector)
|
||||
{
|
||||
if (number >= 10)
|
||||
GetDigitsFromNumber(number / 10, result_vector);
|
||||
|
||||
result_vector.push_back(number % 10);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
|
||||
#include "../entities/camera.h"
|
||||
#include <glm/gtc/matrix_transform.hpp>
|
||||
#include <vector>
|
||||
|
||||
namespace toolbox
|
||||
{
|
||||
@@ -46,4 +47,45 @@ namespace toolbox
|
||||
* @return: The view matrix
|
||||
*/
|
||||
glm::mat4 CreateViewMatrix(entities::Camera& camera);
|
||||
|
||||
/*
|
||||
* @biref go to one coordinate to another with smooting
|
||||
*
|
||||
* @param from one coordinate of the start
|
||||
* @param to one coordinate of where to go
|
||||
* @param amount the amount of smoothing (lower is smoother)
|
||||
*
|
||||
* @return coordinate of where to go
|
||||
*/
|
||||
float Lerp(float from, float to, float amount);
|
||||
|
||||
/*
|
||||
* @biref go from one position to another with smoothing
|
||||
*
|
||||
* @param from position of the start
|
||||
* @param to position of where to go
|
||||
* @param amount the amount of smoothing (lower is smoother)
|
||||
*
|
||||
* @return position of where to go
|
||||
*/
|
||||
glm::vec3 Lerp(glm::vec3 from, glm::vec3 to, float amount);
|
||||
|
||||
/*
|
||||
* @brief: This function will return a value between min and max
|
||||
*
|
||||
* @param min: The min value
|
||||
* @param max: The max value
|
||||
*
|
||||
* @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<int>& result_vector);
|
||||
}
|
||||
|
||||
+34
-10
@@ -19,14 +19,19 @@
|
||||
</ProjectConfiguration>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\model_Storage.cpp" />
|
||||
<ClCompile Include="src\collision\collision_handler.cpp" />
|
||||
<ClCompile Include="src\entities\main_character.cpp" />
|
||||
<ClCompile Include="src\entities\house_generator.cpp" />
|
||||
<ClCompile Include="src\computervision\calibration\HandCalibrator.cpp" />
|
||||
<ClCompile Include="src\scenes\game_Over_Scene.cpp" />
|
||||
<ClCompile Include="src\computervision\hand_detect_region.cpp" />
|
||||
<ClCompile Include="src\scenes\in_Game_Scene.cpp" />
|
||||
<ClCompile Include="src\computervision\FaceDetector.cpp" />
|
||||
<ClCompile Include="src\computervision\MenuTest.cpp" />
|
||||
<ClCompile Include="src\computervision\ObjectDetection.cpp" />
|
||||
<ClCompile Include="src\computervision\SkinDetector.cpp" />
|
||||
<ClCompile Include="src\computervision\FingerCount.cpp" />
|
||||
<ClCompile Include="src\computervision\BackgroundRemover.cpp" />
|
||||
<ClCompile Include="src\computervision\object_detection.cpp" />
|
||||
<ClCompile Include="src\computervision\skin_detector.cpp" />
|
||||
<ClCompile Include="src\computervision\finger_count.cpp" />
|
||||
<ClCompile Include="src\computervision\background_remover.cpp" />
|
||||
<ClCompile Include="src\entities\camera.cpp" />
|
||||
<ClCompile Include="src\entities\collision_entity.cpp" />
|
||||
<ClCompile Include="src\entities\entity.cpp" />
|
||||
@@ -35,6 +40,8 @@
|
||||
<ClCompile Include="src\renderEngine\loader.cpp" />
|
||||
<ClCompile Include="src\renderEngine\obj_loader.cpp" />
|
||||
<ClCompile Include="src\renderEngine\renderer.cpp" />
|
||||
<ClCompile Include="src\scenes\loading_Scene.cpp" />
|
||||
<ClCompile Include="src\scenes\scene.cpp" />
|
||||
<ClCompile Include="src\shaders\gui_shader.cpp" />
|
||||
<ClCompile Include="src\shaders\shader_program.cpp" />
|
||||
<ClCompile Include="src\shaders\entity_shader.cpp" />
|
||||
@@ -42,16 +49,24 @@
|
||||
<ClCompile Include="src\scenes\startup_Scene.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="src\model_Storage.h" />
|
||||
<ClInclude Include="src\collision\collision.h" />
|
||||
<ClInclude Include="src\collision\collision_handler.h" />
|
||||
<ClInclude Include="src\entities\main_character.h" />
|
||||
<ClInclude Include="src\entities\house_generator.h" />
|
||||
<ClInclude Include="src\computervision\calibration\HandCalibrator.h" />
|
||||
<ClInclude Include="src\computervision\calibration\StaticSkinTreshold.h" />
|
||||
<ClInclude Include="src\scenes\game_Over_Scene.h" />
|
||||
<ClInclude Include="src\computervision\hand_detect_region.h" />
|
||||
<ClInclude Include="src\scenes\in_Game_Scene.h" />
|
||||
<ClInclude Include="src\scenes\loading_Scene.h" />
|
||||
<ClInclude Include="src\scenes\scene.h" />
|
||||
<ClInclude Include="src\computervision\FaceDetector.h" />
|
||||
<ClInclude Include="src\computervision\FingerCount.h" />
|
||||
<ClInclude Include="src\computervision\BackgroundRemover.h" />
|
||||
<ClInclude Include="src\computervision\async\StaticCameraInstance.h" />
|
||||
<ClInclude Include="src\computervision\finger_count.h" />
|
||||
<ClInclude Include="src\computervision\background_remover.h" />
|
||||
<ClInclude Include="src\computervision\MenuTest.h" />
|
||||
<ClInclude Include="src\computervision\SkinDetector.h" />
|
||||
<ClInclude Include="src\computervision\ObjectDetection.h" />
|
||||
<ClInclude Include="src\computervision\skin_detector.h" />
|
||||
<ClInclude Include="src\computervision\object_detection.h" />
|
||||
<ClInclude Include="src\entities\camera.h" />
|
||||
<ClInclude Include="src\entities\collision_entity.h" />
|
||||
<ClInclude Include="src\entities\entity.h" />
|
||||
@@ -73,6 +88,12 @@
|
||||
<ItemGroup>
|
||||
<Xml Include="res\haarcascade_frontalface_alt.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\Avans Hogeschool\Kim Veldhoen - Proftaak 2.4\pose_iter_160000.caffemodel" />
|
||||
<None Include="res\pose\coco\pose_deploy_linevec.prototxt" />
|
||||
<None Include="res\pose\mpi\pose_deploy_linevec_faster_4_stages.prototxt" />
|
||||
<None Include="res\pose\mpi\pose_iter_160000.caffemodel" />
|
||||
</ItemGroup>
|
||||
<PropertyGroup Label="Globals">
|
||||
<VCProjectVersion>16.0</VCProjectVersion>
|
||||
<ProjectGuid>{A7ECF1BE-DB22-4BF7-BFF6-E3BF72691EE6}</ProjectGuid>
|
||||
@@ -141,6 +162,8 @@
|
||||
<LinkIncremental>false</LinkIncremental>
|
||||
<IncludePath>$(VC_IncludePath);$(WindowsSDK_IncludePath);;C:\opencv\opencv\build\include;C:\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>
|
||||
<IncludePath>C:\opencv\build\include\;$(VC_IncludePath);$(WindowsSDK_IncludePath);C:\opencv\opencv\build\include</IncludePath>
|
||||
<LibraryPath>C:\opencv\build\x64\vc15\lib;$(VC_LibraryPath_x64);$(WindowsSDK_LibraryPath_x64);C:\opencv\opencv\build\x64\vc15\lib</LibraryPath>
|
||||
</PropertyGroup>
|
||||
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||
<ClCompile>
|
||||
@@ -214,6 +237,7 @@
|
||||
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||
<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>opencv_world452.lib;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)</AdditionalDependencies>
|
||||
</Link>
|
||||
</ItemDefinitionGroup>
|
||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||
|
||||
+96
-99
@@ -1,18 +1,36 @@
|
||||
<?xml version="1.0" encoding="utf-8"?>
|
||||
<Project ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||
<ItemGroup>
|
||||
<Filter Include="Source Files">
|
||||
<UniqueIdentifier>{4FC737F1-C7A5-4376-A066-2A32D752A2FF}</UniqueIdentifier>
|
||||
<Extensions>cpp;c;cc;cxx;c++;def;odl;idl;hpj;bat;asm;asmx</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Header Files">
|
||||
<UniqueIdentifier>{93995380-89BD-4b04-88EB-625FBE52EBFB}</UniqueIdentifier>
|
||||
<Extensions>h;hh;hpp;hxx;h++;hm;inl;inc;ipp;xsd</Extensions>
|
||||
</Filter>
|
||||
<Filter Include="Resource Files">
|
||||
<UniqueIdentifier>{67DA6AB6-F800-4c08-8B7A-83BB121AAD01}</UniqueIdentifier>
|
||||
<Extensions>rc;ico;cur;bmp;dlg;rc2;rct;bin;rgs;gif;jpg;jpeg;jpe;resx;tiff;tif;png;wav;mfcribbon-ms</Extensions>
|
||||
</Filter>
|
||||
<ClCompile Include="src\collision\collision_handler.cpp" />
|
||||
<ClCompile Include="src\scenes\in_Game_Scene.cpp" />
|
||||
<ClCompile Include="src\computervision\async\async_arm_detection.cpp" />
|
||||
<ClCompile Include="src\computervision\object_detection.cpp" />
|
||||
<ClCompile Include="src\computervision\OpenPoseVideo.cpp" />
|
||||
<ClCompile Include="src\computervision\skin_detector.cpp" />
|
||||
<ClCompile Include="src\computervision\finger_count.cpp" />
|
||||
<ClCompile Include="src\computervision\background_remover.cpp" />
|
||||
<ClCompile Include="src\entities\camera.cpp" />
|
||||
<ClCompile Include="src\entities\collision_entity.cpp" />
|
||||
<ClCompile Include="src\entities\entity.cpp" />
|
||||
<ClCompile Include="src\gui\gui_interactable.cpp" />
|
||||
<ClCompile Include="src\main.cpp" />
|
||||
<ClCompile Include="src\renderEngine\loader.cpp" />
|
||||
<ClCompile Include="src\renderEngine\obj_loader.cpp" />
|
||||
<ClCompile Include="src\renderEngine\renderer.cpp" />
|
||||
<ClCompile Include="src\shaders\gui_shader.cpp" />
|
||||
<ClCompile Include="src\shaders\shader_program.cpp" />
|
||||
<ClCompile Include="src\shaders\entity_shader.cpp" />
|
||||
<ClCompile Include="src\toolbox\toolbox.cpp" />
|
||||
<ClCompile Include="src\scenes\startup_Scene.cpp" />
|
||||
<ClCompile Include="src\computervision\calibration\HandCalibrator.cpp" />
|
||||
<ClCompile Include="src\computervision\hand_detect_region.cpp" />
|
||||
<ClCompile Include="src\entities\main_character.cpp" />
|
||||
<ClCompile Include="src\entities\house_generator.cpp" />
|
||||
<ClCompile Include="src\computervision\MenuTest.cpp" />
|
||||
<ClCompile Include="src\scenes\scene.cpp" />
|
||||
<ClCompile Include="src\scenes\loading_Scene.cpp" />
|
||||
<ClCompile Include="src\model_Storage.cpp" />
|
||||
<ClCompile Include="src\scenes\game_Over_Scene.cpp" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClCompile Include="src\entities\Camera.cpp">
|
||||
@@ -69,100 +87,79 @@
|
||||
<ClCompile Include="src\computervision\FingerCount.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\computervision\FaceDetector.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\computervision\BackgroundRemover.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
<ClCompile Include="src\computervision\MenuTest.cpp">
|
||||
<Filter>Source Files</Filter>
|
||||
</ClCompile>
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<ClInclude Include="src\entities\Camera.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\entities\Entity.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\models\Model.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\renderEngine\Loader.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\renderEngine\Renderer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\stb_image.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\shaders\shader_program.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\renderEngine\obj_loader.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\toolbox\toolbox.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\entities\light.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\shaders\entity_shader.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\shaders\gui_shader.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\gui\gui_element.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\gui\gui_interactable.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</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">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\computervision\SkinDetector.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\computervision\FingerCount.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\computervision\FaceDetector.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\computervision\BackgroundRemover.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\toolbox\Timer.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\computervision\MenuTest.h">
|
||||
<Filter>Header Files</Filter>
|
||||
</ClInclude>
|
||||
<ClInclude Include="src\collision\collision.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\computervision\async\StaticCameraInstance.h" />
|
||||
<ClInclude Include="src\computervision\FingerCount.h" />
|
||||
<ClInclude Include="src\computervision\BackgroundRemover.h" />
|
||||
<ClInclude Include="src\computervision\SkinDetector.h" />
|
||||
<ClInclude Include="src\computervision\ObjectDetection.h" />
|
||||
<ClInclude Include="src\entities\camera.h" />
|
||||
<ClInclude Include="src\entities\collision_entity.h" />
|
||||
<ClInclude Include="src\entities\entity.h" />
|
||||
<ClInclude Include="src\entities\light.h" />
|
||||
<ClInclude Include="src\gui\gui_element.h" />
|
||||
<ClInclude Include="src\gui\gui_interactable.h" />
|
||||
<ClInclude Include="src\models\model.h" />
|
||||
<ClInclude Include="src\renderEngine\loader.h" />
|
||||
<ClInclude Include="src\renderEngine\obj_loader.h" />
|
||||
<ClInclude Include="src\renderEngine\renderer.h" />
|
||||
<ClInclude Include="src\shaders\gui_shader.h" />
|
||||
<ClInclude Include="src\shaders\shader_program.h" />
|
||||
<ClInclude Include="src\shaders\entity_shader.h" />
|
||||
<ClInclude Include="src\stb_image.h" />
|
||||
<ClInclude Include="src\toolbox\Timer.h" />
|
||||
<ClInclude Include="src\toolbox\toolbox.h" />
|
||||
<ClInclude Include="src\scenes\startup_Scene.h" />
|
||||
<ClInclude Include="src\computervision\calibration\HandCalibrator.h" />
|
||||
<ClInclude Include="src\computervision\hand_detect_region.h" />
|
||||
<ClInclude Include="src\computervision\calibration\StaticSkinTreshold.h" />
|
||||
<ClInclude Include="src\collision\collision.h" />
|
||||
<ClInclude Include="src\collision\collision_handler.h" />
|
||||
<ClInclude Include="src\entities\main_character.h" />
|
||||
<ClInclude Include="src\entities\house_generator.h" />
|
||||
<ClInclude Include="src\scenes\in_Game_Scene.h" />
|
||||
<ClInclude Include="src\scenes\scene.h" />
|
||||
<ClInclude Include="src\computervision\finger_count.h" />
|
||||
<ClInclude Include="src\computervision\background_remover.h" />
|
||||
<ClInclude Include="src\computervision\MenuTest.h" />
|
||||
<ClInclude Include="src\computervision\skin_detector.h" />
|
||||
<ClInclude Include="src\computervision\object_detection.h" />
|
||||
<ClInclude Include="src\entities\camera.h" />
|
||||
<ClInclude Include="src\entities\collision_entity.h" />
|
||||
<ClInclude Include="src\entities\entity.h" />
|
||||
<ClInclude Include="src\entities\light.h" />
|
||||
<ClInclude Include="src\gui\gui_element.h" />
|
||||
<ClInclude Include="src\gui\gui_interactable.h" />
|
||||
<ClInclude Include="src\models\model.h" />
|
||||
<ClInclude Include="src\renderEngine\loader.h" />
|
||||
<ClInclude Include="src\renderEngine\obj_loader.h" />
|
||||
<ClInclude Include="src\renderEngine\renderer.h" />
|
||||
<ClInclude Include="src\shaders\gui_shader.h" />
|
||||
<ClInclude Include="src\shaders\shader_program.h" />
|
||||
<ClInclude Include="src\shaders\entity_shader.h" />
|
||||
<ClInclude Include="src\stb_image.h" />
|
||||
<ClInclude Include="src\toolbox\Timer.h" />
|
||||
<ClInclude Include="src\toolbox\toolbox.h" />
|
||||
<ClInclude Include="src\scenes\startup_Scene.h" />
|
||||
<ClInclude Include="src\scenes\loading_Scene.h" />
|
||||
<ClInclude Include="src\model_Storage.h" />
|
||||
<ClInclude Include="src\scenes\game_Over_Scene.h" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<Xml Include="res\haarcascade_frontalface_alt.xml" />
|
||||
</ItemGroup>
|
||||
<ItemGroup>
|
||||
<None Include="..\..\Avans Hogeschool\Kim Veldhoen - Proftaak 2.4\pose_iter_160000.caffemodel" />
|
||||
<None Include="res\pose\coco\pose_deploy_linevec.prototxt" />
|
||||
<None Include="res\pose\mpi\pose_deploy_linevec_faster_4_stages.prototxt" />
|
||||
<None Include="res\pose\mpi\pose_iter_160000.caffemodel" />
|
||||
</ItemGroup>
|
||||
</Project>
|
||||
Reference in New Issue
Block a user