diff --git a/CMakeLists.txt b/CMakeLists.txt index 3ac207c..0fd0d10 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -9,6 +9,6 @@ find_package( glm REQUIRED ) find_package( FreeGLUT REQUIRED ) include_directories( ${OpenCV_INCLUDE_DIRS} ) include_directories( ${PROJECT_SOURCE_DIR}/src ) -add_executable( fc2d src/main.cpp src/graphics.cpp ) +add_executable( fc2d src/main.cpp src/graphics.cpp src/modelpart.cpp ) target_link_libraries( fc2d ${OpenCV_LIBS} -lOpenGL -lglut -lGLEW ) set( CMAKE_BUILD_TYPE Debug ) diff --git a/src/graphics.cpp b/src/graphics.cpp index 473459d..6c59c4f 100644 --- a/src/graphics.cpp +++ b/src/graphics.cpp @@ -10,33 +10,20 @@ #include #include - -//VAOs for different parts -//TODO: make this more modular -GLuint head; //head object -GLuint face; //face object +#include GLuint shader; //standard shader program used for all elements GLuint transUniform; //location of the "transMatrix" transformation matrix uniform in the shader -GLuint texHead; //head texture -GLuint texFace; //face texture - -glm::mat4 matHead(1.0f); //transformation matrix for head object -glm::mat4 matFace(1.0f); //transformation matrix for face object +//parts of the model (see modelpart.hpp) +ModelPart parts[2]; void display () { glClear(GL_COLOR_BUFFER_BIT); - glBindVertexArray(head); - glBindTexture(GL_TEXTURE_2D, texHead); - glUniformMatrix4fv(transUniform, 1, GL_FALSE, glm::value_ptr(matHead)); - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); - - glBindVertexArray(face); - glBindTexture(GL_TEXTURE_2D, texFace); - glUniformMatrix4fv(transUniform, 1, GL_FALSE, glm::value_ptr(matFace)); - glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); + for (int i = 0; i < sizeof(parts)/sizeof(ModelPart); i++) { + parts[i].bindAndDraw(); + } glutSwapBuffers(); } @@ -77,8 +64,6 @@ void initBuffers (GLuint* vaoNum) { GLuint uvAttr = glGetAttribLocation(shader, "texcoord"); glVertexAttribPointer(uvAttr, 2, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (void*)(2*sizeof(GLfloat))); glEnableVertexAttribArray(uvAttr); - - } void initGraphics () { @@ -88,24 +73,24 @@ void initGraphics () { glutInit(&argc, argv); glutCreateWindow("FaceCam2D"); glutInitWindowSize(512, 512); - glutDisplayFunc(display); - glewInit(); initShader(); - initBuffers(&head); - initBuffers(&face); + parts[0] = ModelPart("head-base.png", transUniform); + parts[1] = ModelPart("head-face.png", transUniform); - initTexture(&texHead, "head-base.png"); - initTexture(&texFace, "head-face.png"); - //enable blending for alpha textures glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); //set background color glClearColor(0.5f, 0.5f, 0.5f, 1.0f); + + glutDisplayFunc(display); + + + std::cout << "graphics init complete" << std::endl; } void initTexture (GLuint* texNum, const char* path) { @@ -190,8 +175,8 @@ void initModel () { void updateModel(glm::vec2 headPos, glm::vec2 facePos) { //calculate transforms - matHead = glm::translate(glm::mat4(1.0f), glm::vec3(headPos.x, -headPos.y, 0.0f)); - matFace = glm::translate(glm::mat4(1.0f), glm::vec3(facePos.x, -facePos.y, 0.0f)); + parts[0].setPosition(headPos); + parts[1].setPosition(facePos); //tell FreeGLUT to schedule a screen update glutPostRedisplay(); diff --git a/src/graphics.hpp b/src/graphics.hpp index 5df815b..8e7faa3 100644 --- a/src/graphics.hpp +++ b/src/graphics.hpp @@ -8,6 +8,8 @@ void initGraphics (); void graphicsFrame (); +void initBuffers (GLuint* vaoNum); + void initTexture (GLuint* texNum, const char* path); void initShader(); diff --git a/src/modelpart.cpp b/src/modelpart.cpp new file mode 100644 index 0000000..7ce88e9 --- /dev/null +++ b/src/modelpart.cpp @@ -0,0 +1,31 @@ +#include +#include +#include + +#include +#include + +#include + +ModelPart::ModelPart() { +} + +ModelPart::ModelPart(const char* texPath, GLuint transUniformNum) { + //create vbo, ebo, vao + initBuffers(&vao); + //create texture + initTexture(&tex, texPath); + + transUniform = transUniformNum; +} + +void ModelPart::bindAndDraw() { + glBindVertexArray(vao); + glBindTexture(GL_TEXTURE_2D, tex); + glUniformMatrix4fv(transUniform, 1, GL_FALSE, glm::value_ptr(transMatrix)); + glDrawElements(GL_TRIANGLES, 6, GL_UNSIGNED_INT, 0); +} + +void ModelPart::setPosition(glm::vec2 position) { + transMatrix = glm::translate(glm::mat4(1.0f), glm::vec3(position.x, position.y, 0.0f)); +} diff --git a/src/modelpart.hpp b/src/modelpart.hpp new file mode 100644 index 0000000..68798a9 --- /dev/null +++ b/src/modelpart.hpp @@ -0,0 +1,20 @@ +#ifndef MODELPART_HPP +#define MODELPART_HPP + +#include + +class ModelPart { + GLuint vao, tex, transUniform; + glm::mat4 transMatrix = glm::mat4(1.0f); + + public: + ModelPart(); + + ModelPart(const char* texPath, GLuint transUniformNum); + + void bindAndDraw(); + + void setPosition(glm::vec2 position); +}; + +#endif