forked from teamnwah/openmw-tes3coop
Use a single-precision PositionAttitudeTransform in speed critical places
parent
34350ddeb1
commit
62169a7039
@ -0,0 +1,51 @@
|
|||||||
|
#include "positionattitudetransform.hpp"
|
||||||
|
|
||||||
|
#include <iostream>
|
||||||
|
|
||||||
|
namespace SceneUtil
|
||||||
|
{
|
||||||
|
|
||||||
|
PositionAttitudeTransform::PositionAttitudeTransform():
|
||||||
|
_scale(1.0,1.0,1.0)
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
bool PositionAttitudeTransform::computeLocalToWorldMatrix(osg::Matrix& matrix, osg::NodeVisitor*) const
|
||||||
|
{
|
||||||
|
if (_referenceFrame==RELATIVE_RF)
|
||||||
|
{
|
||||||
|
matrix.preMultTranslate(_position);
|
||||||
|
matrix.preMultRotate(_attitude);
|
||||||
|
matrix.preMultScale(_scale);
|
||||||
|
}
|
||||||
|
else // absolute
|
||||||
|
{
|
||||||
|
matrix.makeRotate(_attitude);
|
||||||
|
matrix.postMultTranslate(_position);
|
||||||
|
matrix.preMultScale(_scale);
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
bool PositionAttitudeTransform::computeWorldToLocalMatrix(osg::Matrix& matrix, osg::NodeVisitor*) const
|
||||||
|
{
|
||||||
|
if (_scale.x() == 0.0 || _scale.y() == 0.0 || _scale.z() == 0.0)
|
||||||
|
return false;
|
||||||
|
|
||||||
|
if (_referenceFrame==RELATIVE_RF)
|
||||||
|
{
|
||||||
|
matrix.postMultTranslate(-_position);
|
||||||
|
matrix.postMultRotate(_attitude.inverse());
|
||||||
|
matrix.postMultScale(osg::Vec3f(1.0/_scale.x(), 1.0/_scale.y(), 1.0/_scale.z()));
|
||||||
|
}
|
||||||
|
else // absolute
|
||||||
|
{
|
||||||
|
matrix.makeRotate(_attitude.inverse());
|
||||||
|
matrix.preMultTranslate(-_position);
|
||||||
|
matrix.postMultScale(osg::Vec3f(1.0/_scale.x(), 1.0/_scale.y(), 1.0/_scale.z()));
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
@ -0,0 +1,53 @@
|
|||||||
|
#ifndef OPENMW_COMPONENTS_POSITIONATTITUDE_TRANSFORM_H
|
||||||
|
#define OPENMW_COMPONENTS_POSITIONATTITUDE_TRANSFORM_H
|
||||||
|
|
||||||
|
#include <osg/Transform>
|
||||||
|
|
||||||
|
namespace SceneUtil
|
||||||
|
{
|
||||||
|
|
||||||
|
/// @brief A customized version of osg::PositionAttitudeTransform optimized for speed.
|
||||||
|
/// Uses single precision values. Also removed _pivotPoint which we don't need.
|
||||||
|
class PositionAttitudeTransform : public osg::Transform
|
||||||
|
{
|
||||||
|
public :
|
||||||
|
PositionAttitudeTransform();
|
||||||
|
|
||||||
|
PositionAttitudeTransform(const PositionAttitudeTransform& pat,const osg::CopyOp& copyop=osg::CopyOp::SHALLOW_COPY):
|
||||||
|
Transform(pat,copyop),
|
||||||
|
_position(pat._position),
|
||||||
|
_attitude(pat._attitude),
|
||||||
|
_scale(pat._scale){}
|
||||||
|
|
||||||
|
|
||||||
|
META_Node(SceneUtil, PositionAttitudeTransform)
|
||||||
|
|
||||||
|
inline void setPosition(const osg::Vec3f& pos) { _position = pos; dirtyBound(); }
|
||||||
|
inline const osg::Vec3f& getPosition() const { return _position; }
|
||||||
|
|
||||||
|
|
||||||
|
inline void setAttitude(const osg::Quat& quat) { _attitude = quat; dirtyBound(); }
|
||||||
|
inline const osg::Quat& getAttitude() const { return _attitude; }
|
||||||
|
|
||||||
|
|
||||||
|
inline void setScale(const osg::Vec3f& scale) { _scale = scale; dirtyBound(); }
|
||||||
|
inline const osg::Vec3f& getScale() const { return _scale; }
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
virtual bool computeLocalToWorldMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const;
|
||||||
|
virtual bool computeWorldToLocalMatrix(osg::Matrix& matrix,osg::NodeVisitor* nv) const;
|
||||||
|
|
||||||
|
|
||||||
|
protected :
|
||||||
|
|
||||||
|
virtual ~PositionAttitudeTransform() {}
|
||||||
|
|
||||||
|
osg::Vec3f _position;
|
||||||
|
osg::Quat _attitude;
|
||||||
|
osg::Vec3f _scale;
|
||||||
|
};
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
#endif
|
Loading…
Reference in New Issue