Paper Mario DX
Paper Mario (N64) modding
Loading...
Searching...
No Matches
GetFirstTriangleNormal.inc.c
Go to the documentation of this file.
1
#include "common.h"
2
3
static
Vtx_t
* N(
TriNormVertexBuffer
)[32];
// unk length
4
5
enum
{
6
READ_STATE_CONTINUE
= 0,
7
READ_STATE_DONE
= 1,
8
READ_STATE_TRIANGLE
= 2,
9
};
10
11
void
N(
GetFirstTriangleNormal
)(
Gfx
*
inGfx
,
f32
*
outNx
,
f32
*
outNy
,
f32
*
outNz
) {
12
Gfx
* gfx =
inGfx
;
13
s32
readState
;
14
f32
v1x
,
v1y
,
v1z
;
15
f32
v2x
,
v2y
,
v2z
;
16
f32
v3x
,
v3y
,
v3z
;
17
f32
d12x
,
d12y
,
d12z
;
18
f32
d32x
,
d32y
,
d32z
;
19
f32
nx
,
ny
,
nz
;
20
f32
norm
;
21
22
Vtx_t
*
vtxArray
;
23
u32
vtxCount;
24
s32
vtxEnd
;
25
s32
i;
26
27
v1x
=
v1y
=
v1z
= 0.0f;
28
v2x
=
v2y
=
v2z
= 0.0f;
29
v3x
=
v3y
=
v3z
= 0.0f;
30
31
while
(
true
) {
32
u32
w0
= gfx->words.w0;
33
u32
w1
= gfx->words.w1;
34
s32
op
=
w0
>> 24;
35
readState
=
READ_STATE_CONTINUE
;
36
switch
(
op
) {
37
case
G_ENDDL
:
38
readState
=
READ_STATE_DONE
;
39
break
;
40
case
G_DL
:
41
N(
GetFirstTriangleNormal
)((
Gfx
* )
w1
,
outNx
,
outNy
,
outNz
);
42
break
;
43
case
G_VTX
:
44
vtxCount = (
w0
>> 0xC) & 0xFF;
45
vtxArray
= (
Vtx_t
*)
w1
;
46
for
(i = 0; i < vtxCount; i++) {
47
vtxEnd
= (
w0
>> 1) & 0x7F;
48
N(
TriNormVertexBuffer
)[(
vtxEnd
- vtxCount) + i] = &(
vtxArray
)[i];
49
}
50
break
;
51
case
G_TRI1
:
52
v1x
= N(
TriNormVertexBuffer
)[((
w1
>> 16) & 0xFF) / 2]->ob[0];
53
v1y
= N(
TriNormVertexBuffer
)[((
w1
>> 16) & 0xFF) / 2]->ob[1];
54
v1z
= N(
TriNormVertexBuffer
)[((
w1
>> 16) & 0xFF) / 2]->ob[2];
55
v2x
= N(
TriNormVertexBuffer
)[((
w1
>> 8) & 0xFF) / 2]->ob[0];
56
v2y
= N(
TriNormVertexBuffer
)[((
w1
>> 8) & 0xFF) / 2]->ob[1];
57
v2z
= N(
TriNormVertexBuffer
)[((
w1
>> 8) & 0xFF) / 2]->ob[2];
58
v3x
= N(
TriNormVertexBuffer
)[(
w1
& 0xFF) / 2]->ob[0];
59
v3y
= N(
TriNormVertexBuffer
)[(
w1
& 0xFF) / 2]->ob[1];
60
v3z
= N(
TriNormVertexBuffer
)[(
w1
& 0xFF) / 2]->ob[2];
61
readState
=
READ_STATE_TRIANGLE
;
62
break
;
63
case
G_TRI2
:
64
v1x
= N(
TriNormVertexBuffer
)[((
w0
>> 16) & 0xFF) / 2]->ob[0];
65
v1y
= N(
TriNormVertexBuffer
)[((
w0
>> 16) & 0xFF) / 2]->ob[1];
66
v1z
= N(
TriNormVertexBuffer
)[((
w0
>> 16) & 0xFF) / 2]->ob[2];
67
v2x
= N(
TriNormVertexBuffer
)[((
w0
>> 8) & 0xFF) / 2]->ob[0];
68
v2y
= N(
TriNormVertexBuffer
)[((
w0
>> 8) & 0xFF) / 2]->ob[1];
69
v2z
= N(
TriNormVertexBuffer
)[((
w0
>> 8) & 0xFF) / 2]->ob[2];
70
v3x
= N(
TriNormVertexBuffer
)[(
w0
& 0xFF) / 2]->ob[0];
71
v3y
= N(
TriNormVertexBuffer
)[(
w0
& 0xFF) / 2]->ob[1];
72
v3z
= N(
TriNormVertexBuffer
)[(
w0
& 0xFF) / 2]->ob[2];
73
readState
=
READ_STATE_TRIANGLE
;
74
break
;
75
}
76
77
if
(
readState
!=
READ_STATE_CONTINUE
) {
78
break
;
79
}
80
gfx++;
81
}
82
83
if
(
readState
==
READ_STATE_TRIANGLE
) {
84
// get two vectors from three points
85
d12x
=
v1x
-
v2x
;
86
d12y
=
v1y
-
v2y
;
87
d12z
=
v1z
-
v2z
;
88
d32x
=
v3x
-
v2x
;
89
d32y
=
v3y
-
v2y
;
90
d32z
=
v3z
-
v2z
;
91
// cross product to get normal vector
92
nx
= (
d12y
*
d32z
) - (
d12z
*
d32y
);
93
ny
= (
d12z
*
d32x
) - (
d12x
*
d32z
);
94
nz
= (
d12x
*
d32y
) - (
d12y
*
d32x
);
95
norm
=
sqrtf
(
SQ
(
nx
) +
SQ
(
ny
) +
SQ
(
nz
));
96
*
outNx
=
nx
/
norm
;
97
*
outNy
=
ny
/
norm
;
98
*
outNz
=
nz
/
norm
;
99
}
100
}
PopupMenu_SelectedIndex
BSS s32 PopupMenu_SelectedIndex
Definition
8a860_len_3f30.c:84
GetFirstTriangleNormal
void N GetFirstTriangleNormal(Gfx *inGfx, f32 *outNx, f32 *outNy, f32 *outNz)
Definition
GetFirstTriangleNormal.inc.c:11
READ_STATE_CONTINUE
@ READ_STATE_CONTINUE
Definition
GetFirstTriangleNormal.inc.c:6
READ_STATE_DONE
@ READ_STATE_DONE
Definition
GetFirstTriangleNormal.inc.c:7
READ_STATE_TRIANGLE
@ READ_STATE_TRIANGLE
Definition
GetFirstTriangleNormal.inc.c:8
sqrtf
#define sqrtf
Definition
effect_shims.h:60
SQ
#define SQ(x)
Definition
macros.h:177
src
world
common
util
GetFirstTriangleNormal.inc.c
Generated by
1.10.0