summaryrefslogtreecommitdiff
path: root/src/dolphin/gx/GXDraw.c
blob: a4bf2824e986445cba314b18b4f469db6241dfd1 (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
#include "dolphin/gx/GXDraw.h"
#include "dolphin/gx/GX.h"
#include "math.h"

static GXVtxDescList vcd[27];
static GXVtxAttrFmtList vat[27];

void GetVertState(void) {
    GXGetVtxDescv(vcd);
    GXGetVtxAttrFmtv(GX_VTXFMT3, vat);
    GXClearVtxDesc();
    GXSetVtxDesc(GX_VA_POS, GX_DIRECT);
    GXSetVtxDesc(GX_VA_NRM, GX_DIRECT);
    GXSetVtxAttrFmt(GX_VTXFMT3, GX_VA_POS, GX_POS_XYZ, GX_F32, 0);
    GXSetVtxAttrFmt(GX_VTXFMT3, GX_VA_NRM, GX_NRM_XYZ, GX_F32, 0);
}

void RestoreVertState(void) {
    GXSetVtxDescv(vcd);
    GXSetVtxAttrFmtv(GX_VTXFMT3, vat);
}

// doesn't fully match debug
void GXDrawCylinder(u8 numEdges) {
    f32 temp_f29;
    f32 temp_f30;
    f32 temp_f31;

    s32 i;

    f32 sp1A0[100];
    f32 sp10[100];

    temp_f31 = 1.0f;
    temp_f30 = -temp_f31;

    GetVertState();
    for (i = 0; i <= numEdges; i++) {
        temp_f29 = (i * 2.0f * 3.141593f) / numEdges;
        sp1A0[i] = cosf(temp_f29);
        sp10[i] = sinf(temp_f29);
    }

    GXBegin(GX_TRIANGLESTRIP, GX_VTXFMT3, (numEdges + 1) * 2);
    for (i = 0; i <= numEdges; i++) {
        GXPosition3f32(sp1A0[i], sp10[i], temp_f30);
        GXNormal3f32(sp1A0[i], sp10[i], 0.0f);
        GXPosition3f32(sp1A0[i], sp10[i], temp_f31);
        GXNormal3f32(sp1A0[i], sp10[i], 0.0f);
    }
    GXEnd();

    GXBegin(GX_TRIANGLEFAN, GX_VTXFMT3, numEdges + 2);
    GXPosition3f32(0.0f, 0.0f, temp_f31);
    GXNormal3f32(0.0f, 0.0f, 1.0f);
    for (i = 0; i <= numEdges; i++) {
        GXPosition3f32(sp1A0[i], -sp10[i], temp_f31);
        GXNormal3f32(0.0f, 0.0f, 1.0f);
    }
    GXEnd();

    GXBegin(GX_TRIANGLEFAN, GX_VTXFMT3, numEdges + 2);
    GXPosition3f32(0.0f, 0.0f, temp_f30);
    GXNormal3f32(0.0f, 0.0f, -1.0f);
    for (i = 0; i <= numEdges; i++) {
        GXPosition3f32(sp1A0[i], sp10[i], temp_f30);
        GXNormal3f32(0.0f, 0.0f, -1.0f);
    }
    GXEnd();

    RestoreVertState();
}