summaryrefslogtreecommitdiff
path: root/components/misc/convert.hpp
blob: 81879cbf89bc38eb929a25410c520943d6614f9e (plain)
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
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#ifndef OPENMW_COMPONENTS_MISC_CONVERT_H
#define OPENMW_COMPONENTS_MISC_CONVERT_H

#include <components/esm/defs.hpp>
#include <components/esm3/loadpgrd.hpp>

#include <LinearMath/btTransform.h>
#include <LinearMath/btVector3.h>
#include <LinearMath/btQuaternion.h>
#include <osg/Vec3f>
#include <osg/Quat>

namespace Misc
{
namespace Convert
{
    inline osg::Vec3f makeOsgVec3f(const float* values)
    {
        return osg::Vec3f(values[0], values[1], values[2]);
    }

    inline osg::Vec3f makeOsgVec3f(const ESM::Pathgrid::Point& value)
    {
        return osg::Vec3f(value.mX, value.mY, value.mZ);
    }

    inline btVector3 toBullet(const osg::Vec3f& vec)
    {
        return btVector3(vec.x(), vec.y(), vec.z());
    }

    inline btQuaternion toBullet(const osg::Quat& quat)
    {
        return btQuaternion(quat.x(), quat.y(), quat.z(), quat.w());
    }

    inline osg::Vec3f toOsg(const btVector3& vec)
    {
        return osg::Vec3f(vec.x(), vec.y(), vec.z());
    }

    inline osg::Quat toOsg(const btQuaternion& quat)
    {
        return osg::Quat(quat.x(), quat.y(), quat.z(), quat.w());
    }

    inline osg::Quat makeOsgQuat(const float (&rotation)[3])
    {
        return osg::Quat(rotation[2], osg::Vec3f(0, 0, -1))
            * osg::Quat(rotation[1], osg::Vec3f(0, -1, 0))
            * osg::Quat(rotation[0], osg::Vec3f(-1, 0, 0));
    }

    inline osg::Quat makeOsgQuat(const ESM::Position& position)
    {
        return makeOsgQuat(position.rot);
    }

    inline btQuaternion makeBulletQuaternion(const float (&rotation)[3])
    {
        return btQuaternion(btVector3(0, 0, -1), rotation[2])
            * btQuaternion(btVector3(0, -1, 0), rotation[1])
            * btQuaternion(btVector3(-1, 0, 0), rotation[0]);
    }

    inline btQuaternion makeBulletQuaternion(const ESM::Position& position)
    {
        return makeBulletQuaternion(position.rot);
    }

    inline btTransform makeBulletTransform(const ESM::Position& position)
    {
        return btTransform(makeBulletQuaternion(position), toBullet(position.asVec3()));
    }
}
}

#endif