diff --git a/LearnOpenGL/OpenGLWrapper.cpp b/LearnOpenGL/OpenGLWrapper.cpp index 6f282f145b8c1dbad6c55981ac45ed69302a64f1..a55ac047ab20bf0436b141d02e62e32ab3a4d4e0 100644 --- a/LearnOpenGL/OpenGLWrapper.cpp +++ b/LearnOpenGL/OpenGLWrapper.cpp @@ -61,14 +61,8 @@ GLuint Material::get_specularMap() RenderObject::RenderObject(Mesh * _mesh) { - translate = glm::vec3(0.0f, 0.0f, 0.0f); - rotate = glm::vec3(0.0f, 0.0f, 0.0f); - scale = glm::vec3(1.0f, 1.0f, 1.0f); - + transform = Transform(); mesh = _mesh; - - update_model_matrix(); - update_directional_vector(); } Material *RenderObject::get_material() @@ -81,12 +75,22 @@ GLuint RenderObject::get_vertex_count() return mesh->get_vertex_count(); } -glm::mat4 RenderObject::get_model_matrix() +Transform::Transform() +{ + translate = glm::vec3(0.0f, 0.0f, 0.0f); + rotate = glm::vec3(0.0f, 0.0f, 0.0f); + scale = glm::vec3(1.0f, 1.0f, 1.0f); + + update_model_matrix(); + update_directional_vector(); +} + +glm::mat4 Transform::get_model_matrix() { return model; } -void RenderObject::update_model_matrix() +void Transform::update_model_matrix() { model = glm::mat4(1.0f); model = glm::translate(model, translate); @@ -98,7 +102,7 @@ void RenderObject::update_model_matrix() model = glm::scale(model, scale); } -void RenderObject::update_directional_vector() +void Transform::update_directional_vector() { glm::vec3 front; glm::vec3 up; @@ -115,7 +119,12 @@ void RenderObject::update_directional_vector() up = glm::normalize(glm::cross(right, front)); } -void RenderObject::set_translate(glm::vec3 _translate) +Transform *RenderObject::get_transform() +{ + return &transform; +} + +void Transform::set_translate(glm::vec3 _translate) { translate = _translate; @@ -123,7 +132,7 @@ void RenderObject::set_translate(glm::vec3 _translate) update_directional_vector(); } -void RenderObject::set_rotate(glm::vec3 _rotate) +void Transform::set_rotate(glm::vec3 _rotate) { rotate = _rotate; @@ -131,14 +140,14 @@ void RenderObject::set_rotate(glm::vec3 _rotate) update_directional_vector(); } -void RenderObject::set_scale(glm::vec3 _scale) +void Transform::set_scale(glm::vec3 _scale) { scale = _scale; update_model_matrix(); } -void RenderObject::move(glm::vec3 _delta) +void Transform::move(glm::vec3 _delta) { translate += _delta; @@ -146,7 +155,7 @@ void RenderObject::move(glm::vec3 _delta) update_directional_vector(); } -void RenderObject::move(glm::vec3 _direction, glm::vec1 _velocity) +void Transform::move(glm::vec3 _direction, glm::vec1 _velocity) { translate += glm::vec3(_velocity *_direction.x, _velocity *_direction.y, _velocity *_direction.z); @@ -177,6 +186,8 @@ void RenderObject::render(Camera &camera) glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)_SCR_WIDTH / (float)_SCR_HEIGHT, 0.1f, 500.0f); glm::mat4 view = camera.GetViewMatrix(); + glm::mat4 model = transform.get_model_matrix(); + set_uniform_value(prog, "projection", projection); set_uniform_value(prog, "view", view); set_uniform_value(prog, "model", model); @@ -223,6 +234,7 @@ void RenderObject::projective_render(Camera &camera) glm::mat4 projection = glm::perspective(glm::radians(camera.Zoom), (float)_SCR_WIDTH / (float)_SCR_HEIGHT, 0.1f, 500.0f); glm::mat4 view = camera.GetViewMatrix(); + glm::mat4 model = transform.get_model_matrix(); set_uniform_value(prog, "projectorBias", bias); set_uniform_value(prog, "projectorProjection", projector_projection); @@ -260,7 +272,7 @@ RenderObject *make_render_object(Mesh *mesh) RenderObject *ro = new RenderObject(mesh); return ro; -}; +} GLuint build_program(const std::string name) { diff --git a/LearnOpenGL/OpenGLWrapper.h b/LearnOpenGL/OpenGLWrapper.h index 2c42d76936309e109a244e71ef8116c8e90025df..df4d0ae80cb85793a4625034c00e47666bdc29c6 100644 --- a/LearnOpenGL/OpenGLWrapper.h +++ b/LearnOpenGL/OpenGLWrapper.h @@ -50,14 +50,9 @@ public: GLuint get_specularMap(); }; -class RenderObject +class Transform { private: - GLuint id; - - Mesh *mesh; - Material *material; - glm::mat4 model; glm::vec3 translate; @@ -72,10 +67,7 @@ private: void update_directional_vector(); public: - RenderObject(Mesh * _mesh); - - Material *get_material(); - GLuint get_vertex_count(); + Transform(); glm::mat4 get_model_matrix(); glm::vec3 get_front(); @@ -85,6 +77,23 @@ public: void move(glm::vec3 _delta); void move(glm::vec3 _direction, glm::vec1 _velocity); +}; + +class RenderObject +{ +private: + GLuint id; + + Transform transform; + Mesh *mesh; + Material *material; + +public: + RenderObject(Mesh * _mesh); + + Transform *get_transform(); + Material *get_material(); + GLuint get_vertex_count(); void set_material(Material *_material); diff --git a/LearnOpenGL/Source.cpp b/LearnOpenGL/Source.cpp index ea9995701be0ff4959270297096eb53ed439b7fb..b95a20bc80d38758d724ae53dfc0a2599e01fffb 100644 --- a/LearnOpenGL/Source.cpp +++ b/LearnOpenGL/Source.cpp @@ -77,18 +77,11 @@ int main() auto planeMaterial = new Material(lightmap, magenta, transparent); auto projectorMaterial = new Material(projector_shader, wall_tex, wall); - auto projector = make_render_object(cube); - { - projector->set_translate(glm::vec3(0.0f, 10.0f, 0.0f)); - } - { - projector->set_material(projectorMaterial); - } - auto teapot = make_render_object(make_mesh("teapot.obj")); { - teapot->set_translate(glm::vec3(0.0f, -10.0f, -40.0f)); - teapot->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f)); + auto transform = teapot->get_transform(); + transform->set_translate(glm::vec3(0.0f, -10.0f, -40.0f)); + transform->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f)); } { teapot->set_material(projectorMaterial); @@ -96,9 +89,10 @@ int main() auto cube1 = make_render_object(cube); { - cube1->set_translate(glm::vec3(0, -15, -40)); - cube1->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f)); - cube1->set_scale(glm::vec3(10, 10, 4)); + auto transform = cube1->get_transform(); + transform->set_translate(glm::vec3(0, -15, -40)); + transform->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f)); + transform->set_scale(glm::vec3(10, 10, 4)); } { cube1->set_material(cubeMaterial); @@ -106,9 +100,10 @@ int main() auto cube2 = make_render_object(cube); { - cube2->set_translate(glm::vec3(0, -10, -40)); - cube1->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f)); - cube2->set_scale(glm::vec3(12, 12, 1)); + auto transform = cube2->get_transform(); + transform->set_translate(glm::vec3(0, -10, -40)); + transform->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f)); + transform->set_scale(glm::vec3(12, 12, 1)); } { cube2->set_material(cubeMaterial); @@ -116,7 +111,8 @@ int main() auto plane = make_render_object(make_mesh("plane.obj")); { - plane->set_scale(glm::vec3(10, 10, 1)); + auto transform = plane->get_transform(); + transform->set_scale(glm::vec3(10, 10, 1)); } { plane->set_material(planeMaterial); @@ -124,9 +120,10 @@ int main() auto cube3 = make_render_object(cube); { - cube3->set_translate(glm::vec3(0.0f, -20.0f, -40.0f)); - cube3->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f)); - cube3->set_scale(glm::vec3(50, 50, 0.5)); + auto transform = cube3->get_transform(); + transform->set_translate(glm::vec3(0.0f, -20.0f, -40.0f)); + transform->set_rotate(glm::vec3(-90.0f, 0.0f, 0.0f)); + transform->set_scale(glm::vec3(50, 50, 0.5)); } { cube3->set_material(cubeMaterial); @@ -134,7 +131,8 @@ int main() auto cube4 = make_render_object(cube); { - cube4->set_translate(glm::vec3(0.0f, 10.0f, 0.0f)); + auto transform = cube4->get_transform(); + transform->set_translate(glm::vec3(0.0f, 10.0f, 0.0f)); } { cube4->set_material(cubeMaterial); @@ -153,11 +151,11 @@ int main() { teapot->projective_render(camera); - cube1->render(camera); - cube2->render(camera); - cube3->render(camera); - plane->render(camera); - cube4->render(camera); + cube1->projective_render(camera); + cube2->projective_render(camera); + cube3->projective_render(camera); + plane->projective_render(camera); + cube4->projective_render(camera); } glfwSwapBuffers(window);