Despite its excellent design it may be tricky to use sometimes, so I've decided to post my Transform class which is the engine's base class for all translation, rotation and scaling transformations and also computes a view matrix to be used in vertex shaders. Complex hierachies can be created by providing the view matrix of a superordinate Transform's view matrix to the update() routine. The m_timePassed variable may prove useful for physics simulation.
Transform.h
class Transform { public: Transform(); Transform( const quat &rotation ); Transform(constvec3 &translation ); Transform(constquat &rotation,constvec3 &translation ); public:constvec3 &getScaling()const;constquat &getRotation()const;constvec3 &getTranslation()const; void setScaling(constvec3 &scaling );voidsetRotation(constquat &rotation );voidsetTranslation(constvec3 &translation );voidscale(constvec3 &scaling );voidrotate(constquat &rotation );voidtranslate(constvec3 &translation, bool global = false );voidsetScaling(constfloat &scaling ) { setScaling( vec3(scaling) ); }voidscale(constfloat &scaling ) { scale( vec3(scaling) ); } public:constmat4 &getModelMatrix()const; virtual void update( double deltaTime,constmat4 &modelMatrix = mat4(), bool force = false ); private: vec3 m_scaling; quat m_rotation; vec3 m_translation; bool m_needUpdate; long m_timePassed; long m_lastUpdate; mat4 m_modelMatrix; };
Transform.cpp
#include "Transform.h" Transform::Transform() { setScaling( vec3(1.0f) ); } Transform::Transform(constquat &rotation ) { setScaling( vec3(1.0f) ); setRotation( rotation ); } Transform::Transform(constvec3 &translation ) { setScaling( vec3(1.0f) ); setTranslation( translation ); } Transform::Transform(constquat &rotation,constvec3 &translation ) { setScaling( vec3(1.0f) ); setRotation( rotation ); setTranslation( translation ); }constmat4 &Transform::getModelMatrix()const{ return m_modelMatrix; }constvec3 &Transform::getScaling()const{returnm_scaling; }constquat &Transform::getRotation()const{returnm_rotation; }constvec3 &Transform::getTranslation()const{returnm_translation; }voidTransform::setScaling(constvec3 &scaling ) { m_scaling = scaling; m_needUpdate = true; }voidTransform::setRotation(constquat &rotation ) { m_rotation = rotation; m_needUpdate =true; }voidTransform::setTranslation(constvec3 &translation ) { m_translation = translation; m_needUpdate =true; }voidTransform::scale(constvec3 &scaling ) { setScaling( m_scaling*scaling ); }voidTransform::rotate(constquat &rotation ) { setRotation( glm::cross(m_rotation, rotation) ); }voidTransform::translate(constvec3 &translation, bool global ) { if( global ) { setTranslation( m_translation+translation ); } else { setTranslation( m_translation+(m_rotation*translation) ); } }voidTransform::update( double deltaTime,constmat4 &modelMatrix, bool force ) { long thisUpdate = clock(); m_timePassed = thisUpdate-m_lastUpdate; const bool performUpdate = force || m_needUpdate; if( performUpdate ) { mat4 rotationMatrix = glm::mat4_cast( glm::normalize(m_rotation) ); mat4 translationMatrix = glm::translate( mat4(), m_translation ); m_modelMatrix = translationMatrix*rotationMatrix; m_modelMatrix = glm::scale( m_modelMatrix, m_scaling ); m_modelMatrix = modelMatrix*m_modelMatrix; m_needUpdate = false; } m_lastUpdate = clock(); }
Happy coding!
0 Comment(s):
Post a Comment