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