#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
