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
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
|
#include "transition_triforce.h"
#include "gfx.h"
#include "printf.h"
#include "z_math.h"
#include "transition_instances.h"
Gfx sTransTriforceDL[6] = {
#include "assets/code/fbdemo_triforce/sTransTriforceDL.inc.c"
};
Vtx sTransTriforceVtx[10] = {
#include "assets/code/fbdemo_triforce/sTransTriforceVtx.inc.c"
};
void TransitionTriforce_Start(void* thisx) {
TransitionTriforce* this = (TransitionTriforce*)thisx;
switch (this->state) {
case 1:
case 2:
this->transPos = 1.0f;
return;
default:
this->transPos = 0.03f;
return;
}
}
void* TransitionTriforce_Init(void* thisx) {
TransitionTriforce* this = (TransitionTriforce*)thisx;
bzero(this, sizeof(TransitionTriforce));
guOrtho(&this->projection, -160.0f, 160.0f, -120.0f, 120.0f, -1000.0f, 1000.0f, 1.0f);
this->transPos = 1.0f;
this->state = 2;
this->step = 0.015f;
this->type = TRANS_INSTANCE_TYPE_FILL_OUT;
return this;
}
void TransitionTriforce_Destroy(void* thisx) {
}
void TransitionTriforce_Update(void* thisx, s32 updateRate) {
TransitionTriforce* this = (TransitionTriforce*)thisx;
s32 i;
for (i = updateRate; i > 0; i--) {
if (this->state == 1) {
this->transPos = CLAMP_MIN(this->transPos * (1.0f - this->step), 0.03f);
} else if (this->state == 2) {
this->transPos = CLAMP_MIN(this->transPos - this->step, 0.03f);
} else if (this->state == 3) {
this->transPos = CLAMP_MAX(this->transPos / (1.0f - this->step), 1.0f);
} else if (this->state == 4) {
this->transPos = CLAMP_MAX(this->transPos + this->step, 1.0f);
}
}
}
void TransitionTriforce_SetColor(void* thisx, u32 color) {
TransitionTriforce* this = (TransitionTriforce*)thisx;
this->color.rgba = color;
}
void TransitionTriforce_SetType(void* thisx, s32 type) {
TransitionTriforce* this = (TransitionTriforce*)thisx;
this->type = type;
}
// unused
void TransitionTriforce_SetState(void* thisx, s32 state) {
TransitionTriforce* this = (TransitionTriforce*)thisx;
this->state = state;
}
void TransitionTriforce_Draw(void* thisx, Gfx** gfxP) {
Gfx* gfx = *gfxP;
Mtx* modelView;
f32 scale;
TransitionTriforce* this = (TransitionTriforce*)thisx;
s32 pad;
f32 rotation = this->transPos * 360.0f;
modelView = this->modelView[this->frame];
scale = this->transPos * 0.625f;
this->frame ^= 1;
PRINTF("rate=%f tx=%f ty=%f rotate=%f\n", this->transPos, 0.0f, 0.0f, rotation);
guScale(&modelView[0], scale, scale, 1.0f);
guRotate(&modelView[1], rotation, 0.0f, 0.0f, 1.0f);
guTranslate(&modelView[2], 0.0f, 0.0f, 0.0f);
gDPPipeSync(gfx++);
gSPDisplayList(gfx++, sTransTriforceDL);
gDPSetColor(gfx++, G_SETPRIMCOLOR, this->color.rgba);
gDPSetCombineMode(gfx++, G_CC_PRIMITIVE, G_CC_PRIMITIVE);
gSPMatrix(gfx++, &this->projection, G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_PROJECTION);
gSPMatrix(gfx++, &modelView[0], G_MTX_NOPUSH | G_MTX_LOAD | G_MTX_MODELVIEW);
gSPMatrix(gfx++, &modelView[1], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPMatrix(gfx++, &modelView[2], G_MTX_NOPUSH | G_MTX_MUL | G_MTX_MODELVIEW);
gSPVertex(gfx++, sTransTriforceVtx, 10, 0);
if (!TransitionTriforce_IsDone(this)) {
switch (this->type) {
case TRANS_INSTANCE_TYPE_FILL_OUT:
gSP2Triangles(gfx++, 0, 4, 5, 0, 4, 1, 3, 0);
gSP1Triangle(gfx++, 5, 3, 2, 0);
break;
case TRANS_INSTANCE_TYPE_FILL_IN:
gSP2Triangles(gfx++, 3, 4, 5, 0, 0, 2, 6, 0);
gSP2Triangles(gfx++, 0, 6, 7, 0, 1, 0, 7, 0);
gSP2Triangles(gfx++, 1, 7, 8, 0, 1, 8, 9, 0);
gSP2Triangles(gfx++, 1, 9, 2, 0, 2, 9, 6, 0);
break;
}
} else {
switch (this->type) {
case TRANS_INSTANCE_TYPE_FILL_OUT:
break;
case TRANS_INSTANCE_TYPE_FILL_IN:
gSP1Quadrangle(gfx++, 6, 7, 8, 9, 0);
break;
}
}
gDPPipeSync(gfx++);
*gfxP = gfx;
}
s32 TransitionTriforce_IsDone(void* thisx) {
TransitionTriforce* this = (TransitionTriforce*)thisx;
if (this->state == 1 || this->state == 2) {
return this->transPos <= 0.03f;
} else if (this->state == 3 || this->state == 4) {
return this->transPos >= 1.0f;
} else {
return false;
}
}
|