summaryrefslogtreecommitdiff
path: root/src/nw4r/g3d/res/g3d_resanmcamera.cpp
blob: 57c00a4cc7e17d06001d79528737baba8155c85c (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
79
80
81
82
83
84
#include "nw4r/g3d.h" // IWYU pragma: export

namespace nw4r {
namespace g3d {

void ResAnmCamera::GetAnmResult(CameraAnmResult *pResult, f32 frame) const {
    const ResAnmCameraData &r = ref();
    u32 flags = r.flags;

    bool constantPosX = (flags & ResAnmCameraData::FLAG_POS_X_CONST) != 0;
    bool constantPosY = (flags & ResAnmCameraData::FLAG_POS_Y_CONST) != 0;
    bool constantPosZ = (flags & ResAnmCameraData::FLAG_POS_Z_CONST) != 0;

    bool constantAspect = (flags & ResAnmCameraData::FLAG_ASPECT_CONST) != 0;
    bool constantNear = (flags & ResAnmCameraData::FLAG_NEAR_CONST) != 0;
    bool constantFar = (flags & ResAnmCameraData::FLAG_FAR_CONST) != 0;

    CameraType type = static_cast<CameraType>(flags & ResAnmCameraData::FLAG_CAMERA_TYPE_MASK);

    pResult->flags = flags & (CameraAnmResult::FLAG_CAMERA_TYPE_MASK | CameraAnmResult::FLAG_ANM_EXISTS);

    pResult->projType = r.projType;

    pResult->pos.x = detail::GetResAnmResult(&r.posX, frame, constantPosX);
    pResult->pos.y = detail::GetResAnmResult(&r.posY, frame, constantPosY);
    pResult->pos.z = detail::GetResAnmResult(&r.posZ, frame, constantPosZ);

    pResult->aspect = detail::GetResAnmResult(&r.aspect, frame, constantAspect);
    pResult->near = detail::GetResAnmResult(&r.near, frame, constantNear);
    pResult->far = detail::GetResAnmResult(&r.far, frame, constantFar);

    switch (type) {
        case CAMERATYPE_ROTATE: {
            bool constantRotX = (flags & ResAnmCameraData::FLAG_ROT_X_CONST) != 0;
            bool constantRotY = (flags & ResAnmCameraData::FLAG_ROT_Y_CONST) != 0;
            bool constantRotZ = (flags & ResAnmCameraData::FLAG_ROT_Z_CONST) != 0;

            pResult->rotate.rot.x = detail::GetResAnmResult(&r.rotX, frame, constantRotX);
            pResult->rotate.rot.y = detail::GetResAnmResult(&r.rotY, frame, constantRotY);
            pResult->rotate.rot.z = detail::GetResAnmResult(&r.rotZ, frame, constantRotZ);
            break;
        }

        case CAMERATYPE_AIM: {
            bool constantAimX = (flags & ResAnmCameraData::FLAG_AIM_X_CONST) != 0;
            bool constantAimY = (flags & ResAnmCameraData::FLAG_AIM_Y_CONST) != 0;
            bool constantAimZ = (flags & ResAnmCameraData::FLAG_AIM_Z_CONST) != 0;
            bool constantTwist = (flags & ResAnmCameraData::FLAG_TWIST_CONST) != 0;

            pResult->aim.aim.x = detail::GetResAnmResult(&r.aimX, frame, constantAimX);
            pResult->aim.aim.y = detail::GetResAnmResult(&r.aimY, frame, constantAimY);
            pResult->aim.aim.z = detail::GetResAnmResult(&r.aimZ, frame, constantAimZ);
            pResult->aim.twist = detail::GetResAnmResult(&r.twist, frame, constantTwist);
            break;
        }

        default: {
            break;
        }
    }

    switch (r.projType) {
        case GX_PERSPECTIVE: {
            bool constantFovy = (flags & ResAnmCameraData::FLAG_PERSP_FOVY_CONST) != 0;

            pResult->perspFovy = detail::GetResAnmResult(&r.perspFovy, frame, constantFovy);
            break;
        }

        case GX_ORTHOGRAPHIC: {
            bool constantHeight = (flags & ResAnmCameraData::FLAG_ORTHO_HEIGHT_CONST) != 0;

            pResult->orthoHeight = detail::GetResAnmResult(&r.orthoHeight, frame, constantHeight);
            break;
        }

        default: {
            break;
        }
    }
}

} // namespace g3d
} // namespace nw4r