summaryrefslogtreecommitdiff
path: root/src/d/d_chain.cpp
blob: 126662930fd1ce9967279185a7bbf69e41a6d785 (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
102
103
104
105
106
107
108
109
110
111
//
// Generated by dtk
// Translation Unit: d_chain.cpp
//

#include "d/dolzel.h" // IWYU pragma: keep
#include "d/d_chain.h"
#include "d/d_a_obj.h"
#include "d/d_s_play.h"
#include "m_Do/m_Do_mtx.h"

#include "assets/l_chainS3TCTEX__d_chain.h"
const u16 l_chainS3TCTEX__width = 32;
const u16 l_chainS3TCTEX__height = 32;

static Vec l_pos[] = {
    { -2.0f, 1.522254f, -0.0f },
    { -2.0f, 1.522254f, 7.0f },
    { 2.0f, 1.522254f, -0.0f },
    { -3.5f, 0.0f, -1.5f },
    { -3.5f, 0.0f, 8.5f },
    { 3.5f, 0.0f, -1.5f },
    { -2.0f, -1.522254f, -0.0f },
    { -2.0f, -1.522254f, 7.0f },
    { 2.0f, -1.522254f, -0.0f },
    { 2.0f, 1.522254f, 7.0f },
    { 3.5f, 0.0f, 8.5f },
    { 2.0f, -1.522254f, 7.0f },

};
static cXy l_texCoord[] = {
    { 0.02736f, 0.041406f },
    { 0.97264f, 0.041406f },
    { 0.830848f, 0.40324f },
    { 0.169152f, 0.40324f },
    { 0.03125f, 0.0f },
    { 0.96875f, 0.0f },
    { 0.767857f, 0.494086f },
    { 0.232143f, 0.494086f },
    { 0.038462f, 0.48226f },
    { 0.038462f, 0.983522f },
    { 0.961538f, 0.48226f },
    { 0.961538f, 0.983522f },
};

#include "assets/l_chainDL__d_chain.h"

#include "assets/l_matDL__d_chain.h"
l_matDL__d_chain(l_chainS3TCTEX);

/* 800628B4-80062954       .text __ct__15dChain_packet_cFiP12dKy_tevstr_cf */
dChain_packet_c::dChain_packet_c(int num, dKy_tevstr_c* tevstr, f32 scale) {
    mNum = num;
    mScale.setall(scale);
    mpTevStr = tevstr;
    mPt = new cXyz[mNum];
}

/* 80062954-800629B0       .text __dt__15dChain_packet_cFv */
dChain_packet_c::~dChain_packet_c() {
}

/* 800629B0-80062CB0       .text draw__15dChain_packet_cFv */
void dChain_packet_c::draw() {
    GXClearVtxDesc();
    GXSetVtxDesc(GX_VA_POS, GX_INDEX8);
    GXSetVtxDesc(GX_VA_TEX0, GX_INDEX8);
    GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
    GXSetVtxAttrFmt(GX_VTXFMT0, GX_VA_TEX0, GX_TEX_ST, GX_F32, 0);
    GXSetArray(GX_VA_POS, l_pos, sizeof(*l_pos));
    GXSetArray(GX_VA_TEX0, l_texCoord, sizeof(*l_texCoord));
    dKy_GxFog_tevstr_set(mpTevStr);
    GXCallDisplayList(l_matDL, 0xa0);
    GXSetTevColorS10(GX_TEVREG0, mpTevStr->mColorC0);
    GXSetTevColor(GX_TEVREG1, mpTevStr->mColorK0);
    GXSetCurrentMtx(GX_PNMTX0);

    cXyz* points = mPt;
    f32 segmentLen = (REG10_F(11) + 6.75f) * mScale.z;
    s16 angle = 0;
    cXyz pos = *points;
    for (s32 i = 0; i < mNum - 1; i++) {
        cXyz dir = points[i+1] - pos;
        f32 len = dir.abs();
        if (!dir.normalizeRS())
            continue;

        Quaternion quat;
        daObj::quat_rotBaseZ(&quat, dir);
        while (len > 0.0f) {
            mDoMtx_stack_c::transS(pos);
            mDoMtx_stack_c::quatM(&quat);
            mDoMtx_stack_c::ZrotM(angle);
            mDoMtx_stack_c::scaleM(mScale);
            mDoMtx_stack_c::revConcat(j3dSys.getViewMtx());
            GXLoadPosMtxImm(mDoMtx_stack_c::get(), GX_PNMTX0);
            GXCallDisplayList(l_chainDL, 0x60);
            len -= segmentLen;
            pos += dir * segmentLen;
            angle += 0x4000;
        }
    }
}

/* 80062CB0-80062D30       .text dChain_packet_create__FiP12dKy_tevstr_cf */
dChain_packet_c* dChain_packet_create(int p0, dKy_tevstr_c* tevstr, f32 f0) {
    dChain_packet_c* chain = new dChain_packet_c(p0, tevstr, f0);
    if (chain != NULL && chain->mPt == NULL)
        chain = NULL;
    return chain;
}