File: positionattitudetransform.cpp

package info (click to toggle)
openmw 0.49.0-1
  • links: PTS, VCS
  • area: main
  • in suites: forky, sid
  • size: 33,992 kB
  • sloc: cpp: 372,479; xml: 2,149; sh: 1,403; python: 797; makefile: 26
file content (48 lines) | stat: -rw-r--r-- 1,446 bytes parent folder | download
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
#include "positionattitudetransform.hpp"

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;
    }

}