diff --git a/examples/model_loading/main.cpp b/examples/model_loading/main.cpp index 1db6552..e53cfe8 100644 --- a/examples/model_loading/main.cpp +++ b/examples/model_loading/main.cpp @@ -88,7 +88,7 @@ int main(int argc, char** argv) shader->Use(); shader->SetUniform("model", utah); - shader->SetUniformMatrix4fv("view", 1, GL_FALSE, camera.GetMatrix()); + shader->SetUniform("view", camera); shader->SetUniformMatrix4fv("projection", 1, GL_FALSE, camera.GetProjectionMatrix()); oglu::PolygonMode(GL_FRONT_AND_BACK, GL_LINE); diff --git a/include/camera.hpp b/include/camera.hpp index 78cd480..e5e51e1 100644 --- a/include/camera.hpp +++ b/include/camera.hpp @@ -78,6 +78,16 @@ namespace oglu */ void LookAt(const GLfloat* target); + /** + * @brief Have camera face at a certain position. + * + * This will adjust the camera's rotation in order to put the + * specified coordinate at the center of the screen. + * + * @param[in] target 3D vector with the target position + */ + void LookAt(const glm::vec3& target); + /** * @brief Have camera face at a certain position. * @@ -88,8 +98,6 @@ namespace oglu */ void LookAt(const Transformable& target); - // void Move(float x, float y, float z) override; - /** * @brief Gets the projection matrix of the camera. * diff --git a/include/transformable.hpp b/include/transformable.hpp index 17d389f..c2e1a59 100644 --- a/include/transformable.hpp +++ b/include/transformable.hpp @@ -307,28 +307,28 @@ namespace oglu * * @return An array of 16 floats representing the transformation matrix */ - const float* GetMatrix(); + virtual const glm::mat4& GetMatrix(); /** * @brief Get position as a 3D vector. * * @returns A pointer to an array of floats */ - const float* GetPosition() const; + virtual const glm::vec3& GetPosition() const; /** * @brief Get rotation as a matrix. * * @returns A pointer to a 4x4 matrix */ - const float* GetRotation() const; + virtual const glm::quat& GetRotation() const; /** * @brief Get scaling as a 3D vector. * * @returns A pointer to an array of floats */ - const float* GetScaling() const; + virtual const glm::vec3& GetScaling() const; protected: // TODO: Separate translation, rotation and scaling matrices. diff --git a/src/camera.cpp b/src/camera.cpp index 7017326..107d03a 100644 --- a/src/camera.cpp +++ b/src/camera.cpp @@ -57,13 +57,18 @@ namespace oglu void Camera::LookAt(GLfloat x, GLfloat y, GLfloat z) { - transformation = glm::lookAt(translation, glm::vec3(x, y, z), glm::vec3(0.0f, 1.0f, 0.0f)); - glm::decompose(transformation, scale, orientation, translation, skew, perspective); + LookAt(glm::vec3(x, y, z)); } void Camera::LookAt(const GLfloat* target) { - LookAt(target[0], target[1], target[2]); + LookAt(glm::make_vec3(target)); + } + + void Camera::LookAt(const glm::vec3& target) + { + transformation = glm::lookAt(translation, target, glm::vec3(0.0f, 1.0f, 0.0f)); + glm::decompose(transformation, scale, orientation, translation, skew, perspective); } void Camera::LookAt(const Transformable& target) diff --git a/src/shader.cpp b/src/shader.cpp index 5a19faa..03f88de 100644 --- a/src/shader.cpp +++ b/src/shader.cpp @@ -9,6 +9,8 @@ #include #include +#include + namespace oglu { AbstractShader::AbstractShader(const AbstractShader& other) : @@ -254,7 +256,7 @@ namespace oglu void AbstractShader::SetUniform(GLint location, Transformable& v0, GLboolean transpose) { - glUniformMatrix4fv(location, 1, transpose, v0.GetMatrix()); + glUniformMatrix4fv(location, 1, transpose, glm::value_ptr(v0.GetMatrix())); } void AbstractShader::SetUniform1fv(const GLchar* name, GLsizei count, const GLfloat* value) diff --git a/src/transformable.cpp b/src/transformable.cpp index f604543..18c9be1 100644 --- a/src/transformable.cpp +++ b/src/transformable.cpp @@ -161,23 +161,23 @@ namespace oglu glm::decompose(transformation, this->scale, orientation, translation, skew, perspective); } - const float* Transformable::GetMatrix() + const glm::mat4& Transformable::GetMatrix() { - return glm::value_ptr(transformation); + return transformation; } - const float* Transformable::GetPosition() const + const glm::vec3& Transformable::GetPosition() const { - return glm::value_ptr(translation); + return translation; } - const float* Transformable::GetRotation() const + const glm::quat& Transformable::GetRotation() const { - return glm::value_ptr(orientation); + return orientation; } - const float* Transformable::GetScaling() const + const glm::vec3& Transformable::GetScaling() const { - return glm::value_ptr(scale); + return scale; } }