summaryrefslogtreecommitdiff
path: root/src/engine/actors/Tree.cpp
blob: 20b65df099117484426ab26eb29280339a3bbc32 (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
#include "Tree.h"

#include <libultra/gbi.h>

extern "C" {
#include "common_structs.h"
#include "racing/math_util.h"
#include "main.h"
#include "racing/actors.h"
}

ATree::ATree(Vec3f pos, Gfx* displaylist, f32 drawDistance, f32 minDrawDistance, const char* tlut = nullptr) {
    Name = "Tree";
    ResourceName = "mk:tree";
    Pos[0] = pos[0];
    Pos[1] = pos[1];
    Pos[2] = pos[2];

    Displaylist = displaylist;
    Tlut = tlut;
    DrawDistance = drawDistance;
    MinDrawDistance = minDrawDistance;
}

void ATree::Tick() {
    if (((Flags & 0x800) == 0) && ((Flags & 0x400) != 0)) {
        Pos[1] = Pos[1] + 4.0f;
        if (Pos[1] > 800.0f) {
            Flags |= 0x800;
        }
    }
}

void ATree::Draw(Camera* camera) {
    f32 dist;

    if ((Flags & 0x800) != 0) {
        return;
    }

    dist = is_within_render_distance(camera->pos, Pos, camera->rot[1], 0, camera->fieldOfView,
                                        DrawDistance);

    if (CVarGetInteger("gNoCulling", 0) == 1) {
        dist = MAX(dist, 0.0f);
    }
 
    if (dist < 0.0f) {
        return;
    }

    if (((Flags & 0x400) == 0) && (dist < MinDrawDistance)) {
        func_8029794C(Pos, Rot, 3.0f);
    }
    sBillBoardMtx[3][0] = Pos[0];
    sBillBoardMtx[3][1] = Pos[1];
    sBillBoardMtx[3][2] = Pos[2];

    if (render_set_position(sBillBoardMtx, 0) != 0) {
        if (Tlut) {
            gDPLoadTLUT_pal256(gDisplayListHead++, Tlut);
        }
        gSPDisplayList(gDisplayListHead++, Displaylist);
    }
}

void ATree::Collision(Player* player, AActor*) { }
void ATree::Destroy() { }