145 lines
3.9 KiB
C++
145 lines
3.9 KiB
C++
/*##############################################################################
|
|
## Author: Shaun Reed ##
|
|
## Legal: All Content (c) 2021 Shaun Reed, all rights reserved ##
|
|
## About: Transform3D class to represent object position in 3D space ##
|
|
## From following tutorials at trentreed.net ##
|
|
## ##
|
|
## Contact: shaunrd0@gmail.com | URL: www.shaunreed.com | GitHub: shaunrd0 ##
|
|
##############################################################################*/
|
|
|
|
#include <transform3D.h>
|
|
|
|
|
|
const QVector3D Transform3D::LocalForward(0.0f, 0.0f, 1.0f);
|
|
const QVector3D Transform3D::LocalUp(0.0f, 1.0f, 0.0f);
|
|
const QVector3D Transform3D::LocalRight(1.0f, 0.0f, 0.0f);
|
|
|
|
/*******************************************************************************
|
|
* Transformations
|
|
******************************************************************************/
|
|
|
|
void Transform3D::translate(const QVector3D & dt)
|
|
{
|
|
m_dirty = true;
|
|
mTranslation += dt;
|
|
}
|
|
|
|
void Transform3D::scale(const QVector3D & ds)
|
|
{
|
|
m_dirty = true;
|
|
mScale *= ds;
|
|
}
|
|
|
|
void Transform3D::rotate(const QQuaternion & dr)
|
|
{
|
|
m_dirty = true;
|
|
mRotation = dr * mRotation;
|
|
}
|
|
|
|
void Transform3D::grow(const QVector3D & ds)
|
|
{
|
|
m_dirty = true;
|
|
mScale += ds;
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
* Setters
|
|
******************************************************************************/
|
|
|
|
void Transform3D::setTranslation(const QVector3D & t)
|
|
{
|
|
m_dirty = true;
|
|
mTranslation = t;
|
|
}
|
|
|
|
void Transform3D::setScale(const QVector3D & s)
|
|
{
|
|
m_dirty = true;
|
|
mScale = s;
|
|
}
|
|
|
|
void Transform3D::setRotation(const QQuaternion & r)
|
|
{
|
|
m_dirty = true;
|
|
mRotation = r;
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
* Accessors
|
|
******************************************************************************/
|
|
|
|
// Produces modelToWorld matrix using current set of transformations
|
|
// Transformation * rotation * scale = modelToWorld
|
|
const QMatrix4x4 & Transform3D::toMatrix()
|
|
{
|
|
if (m_dirty)
|
|
{
|
|
m_dirty = false;
|
|
mWorld.setToIdentity();
|
|
mWorld.translate(mTranslation);
|
|
mWorld.rotate(mRotation);
|
|
mWorld.scale(mScale);
|
|
}
|
|
return mWorld;
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
* Queries
|
|
******************************************************************************/
|
|
|
|
QVector3D Transform3D::forward() const
|
|
{
|
|
return mRotation.rotatedVector(LocalForward);
|
|
}
|
|
|
|
QVector3D Transform3D::up() const
|
|
{
|
|
return mRotation.rotatedVector(LocalUp);
|
|
}
|
|
|
|
QVector3D Transform3D::right() const
|
|
{
|
|
return mRotation.rotatedVector(LocalRight);
|
|
}
|
|
|
|
|
|
/*******************************************************************************
|
|
* QT Streams
|
|
******************************************************************************/
|
|
|
|
QDebug operator<<(QDebug dbg, const Transform3D & transform)
|
|
{
|
|
dbg << "Transform3D\n{\n";
|
|
dbg << "Position: <" << transform.translation().x() << ", "
|
|
<< transform.translation().y() << ", "
|
|
<< transform.translation().z() << ">\n";
|
|
dbg << "Scale: <" << transform.scale().x() << ", "
|
|
<< transform.scale().y() << ", "
|
|
<< transform.scale().z() << ">\n";
|
|
dbg << "Rotation: <" << transform.rotation().x() << ", "
|
|
<< transform.rotation().y() << ", "
|
|
<< transform.rotation().z() << " | " <<
|
|
transform.rotation().scalar() << ">\n}";
|
|
return dbg;
|
|
}
|
|
|
|
QDataStream & operator<<(QDataStream & out, const Transform3D & transform)
|
|
{
|
|
out << transform.mTranslation;
|
|
out << transform.mScale;
|
|
out << transform.mRotation;
|
|
return out;
|
|
}
|
|
|
|
QDataStream & operator>>(QDataStream & in, Transform3D & transform)
|
|
{
|
|
in >> transform.mTranslation;
|
|
in >> transform.mScale;
|
|
in >> transform.mRotation;
|
|
transform.m_dirty = true;
|
|
return in;
|
|
}
|