summaryrefslogtreecommitdiff
path: root/include/d/d_cc.h
blob: c5349190a3439f05cada5bb97ce579278518679d (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
93
94
95
96
97
98
99
100
101
#ifndef D_CC_H
#define D_CC_H

#include "c/c_list.h"
#include "d/col/c/c_cc_d.h"
#include "d/col/cc/d_cc_d.h"

class LinkedColliderNode : public cListNd_c {
public:
    LinkedColliderNode(cCcD_Obj *obj) : mpList(nullptr), mpCcDObj(obj) {}
    void remove() {
        if (mpList != nullptr) {
            mpList->remove(this);
            mpList = nullptr;
        }
    }
    /* 0x08 */ cCcD_Obj *mpCcDObj;
    /* 0x0C */ cListMg_c *mpList;
};

class dCcD_Linked_Unk : public dCcD_Unk {
public:
    dCcD_Linked_Unk() : mNode(this) {}
    virtual ~dCcD_Linked_Unk() {
        mNode.remove();
    }
    /* 0x210 */ LinkedColliderNode mNode;
};

class dCcD_Linked_Cyl : public dCcD_Cyl {
public:
    dCcD_Linked_Cyl() : mNode(this) {}
    virtual ~dCcD_Linked_Cyl() {
        mNode.remove();
    }
    /* 0x150 */ LinkedColliderNode mNode;
};

class dCcD_Linked_Sph : public dCcD_Sph {
public:
    dCcD_Linked_Sph() : mNode(this) {}
    virtual ~dCcD_Linked_Sph() {
        mNode.remove();
    }
    /* 0x150 */ LinkedColliderNode mNode;
};

class dCcD_Linked_Cps : public dCcD_Cps {
public:
    dCcD_Linked_Cps() : mNode(this) {}
    virtual ~dCcD_Linked_Cps() {
        mNode.remove();
    }
    /* 0x170 */ LinkedColliderNode mNode;
};

class dColliderLinkedList {
private:
    cListMg_c mList;
    static void Set(cCcD_Obj *obj, void *cbArg);
    static void SetStts(cCcD_Obj *obj, void *cbArg);
    static void AtSet(cCcD_Obj *obj, void *cbArg);
    static void ClrAt(cCcD_Obj *obj, void *cbArg);
    static void TgSet(cCcD_Obj *obj, void *cbArg);
    static void ClrTg(cCcD_Obj *obj, void *cbArg);
    static void CoSet(cCcD_Obj *obj, void *cbArg);
    static void ClrCo(cCcD_Obj *obj, void *cbArg);

public:
    virtual ~dColliderLinkedList();

    void postInit(cCcD_Obj &ccD);
    void addCc(dCcD_Linked_Cyl &ccD, const dCcD_SrcCyl &src);
    void addCc(dCcD_Linked_Sph &ccD, const dCcD_SrcSph &src);
    void addCc(dCcD_Linked_Cps &ccD, const dCcD_SrcCps &src);
    void addCc(dCcD_Linked_Unk &ccD, const dCcD_SrcUnk &src);
    void SetStts(cCcD_Stts &stts);
    void registerColliders();

    typedef void (*ccCbFunc)(cCcD_Obj *obj, void *cbArg);
    void foreachCc(ccCbFunc f, void *cbArg) const;
    void foreachCc2(ccCbFunc f, void *cbArg) const;

    // This find function is used by a lot of other
    // TUs, all of which own the function passed as
    // a ptmf. It's not immediately clear how this works,
    // does every actor subclass the LinkedCollider___,
    // or are the functions all added here for the other
    // files to implement?
    typedef bool (cCcD_Obj::*ccPtmf)();
    cCcD_Obj *find(ccPtmf f) const;

    void AtSet();
    void ClrAt();
    void TgSet();
    void ClrTg();
    void CoSet();
    void ClrCo();
};

#endif