summaryrefslogtreecommitdiff
path: root/src/d/tg/d_t_view_clip.cpp
blob: c88f80b12564033a05bf40f80331bb9bd39dfed4 (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
85
86
87
88
89
90
91
92
#include "d/t/d_t_view_clip.h"

#include "common.h"
#include "d/d_camera.h"
#include "d/d_sc_game.h"
#include "f/f_base.h"
#include "toBeSorted/area_utils.h"

SPECIAL_ACTOR_PROFILE(VIEW_CLIP_TAG, dTgViewClip_c, fProfile::VIEW_CLIP_TAG, 0xB, 0, 0);

u8 dTgViewClip_c::sViewClips[dTgViewClip_c::sNumEntries] = {};

int dTgViewClip_c::create() {
    mIndex = getFromParams(0, 0x3F);
    mType = getFromParams(8, 0xF);
    if (mType == 0xF) {
        mType = TYPE_FORCE_OFF;
    }

    mAreaIndex = getFromParams(12, 0xFF);
    mArea.set(mPosition, mRotation.y, mScale, nullptr, 0.0f);

    return SUCCEEDED;
}

int dTgViewClip_c::doDelete() {
    return SUCCEEDED;
}

int dTgViewClip_c::actorExecute() {
    return SUCCEEDED;
}

int dTgViewClip_c::draw() {
    dCamera_c *pCamera = dScGame_c::getCamera();
    if (!mArea.checkAreaBox(pCamera->getPosition())) {
        if (mAreaIndex == 0xFF) {
            return SUCCEEDED;
        }
        if (!checkPosInArea(mAreaIndex, mRoomID, pCamera->getPosition(), nullptr)) {
            return SUCCEEDED;
        }
    }

    switch (mType) {
        case TYPE_FORCE_ON:  setViewClip(FLAG_FORCE_ON); break;
        case TYPE_FORCE_OFF: setViewClip(FLAG_FORCE_OFF); break;
    }

    return SUCCEEDED;
}

void dTgViewClip_c::setViewClip(u8 setBit) {
    setViewClipBit(mIndex, setBit);
}

void dTgViewClip_c::resetViewClip() {
    for (int i = 0; i < sNumEntries - 1; ++i) {
        setViewClip(i, 0);
    }
}

f32 dTgViewClip_c::getCull(s32 idx, f32 cullDistance) {
    if (idx > ARRAY_LENGTH(sViewClips) - 2) {
        return cullDistance;
    }

    if (getViewClipBit(idx, FLAG_FORCE_ON)) {
        return FLOAT_MAX;
    } else if (getViewClipBit(idx, FLAG_FORCE_OFF)) {
        return -1.0f;
    }

    return cullDistance;
}
bool dTgViewClip_c::checkForceOn(s32 idx) {
    if (idx <= ARRAY_LENGTH(sViewClips) - 2) {
        return getViewClipBit(idx, FLAG_FORCE_ON);
    }
    return false;
}

u8 dTgViewClip_c::getViewClipBit(s32 idx, u8 setBit) {
    return sViewClips[idx] & setBit;
}
void dTgViewClip_c::setViewClipBit(s32 idx, u8 setBit) {
    sViewClips[idx] |= setBit;
}

void dTgViewClip_c::setViewClip(s32 idx, u8 value) {
    sViewClips[idx] = value;
}