Paper Mario DX
Paper Mario (N64) modding
 
Loading...
Searching...
No Matches
GetFirstTriangleNormal.inc.c File Reference

Go to the source code of this file.

Enumerations

enum  { READ_STATE_CONTINUE = 0 , READ_STATE_DONE = 1 , READ_STATE_TRIANGLE = 2 }
 

Functions

voidGetFirstTriangleNormal (Gfx *inGfx, f32 *outNx, f32 *outNy, f32 *outNz)
 

Enumeration Type Documentation

◆ anonymous enum

Enumerator
READ_STATE_CONTINUE 
READ_STATE_DONE 
READ_STATE_TRIANGLE 

Definition at line 5 of file GetFirstTriangleNormal.inc.c.

Function Documentation

◆ GetFirstTriangleNormal()

void N GetFirstTriangleNormal ( Gfx * inGfx,
f32 * outNx,
f32 * outNy,
f32 * outNz )

Definition at line 11 of file GetFirstTriangleNormal.inc.c.

11 {
12 Gfx* gfx = inGfx;
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
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;
36 switch (op) {
37 case G_ENDDL:
39 break;
40 case G_DL:
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];
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];
74 break;
75 }
76
78 break;
79 }
80 gfx++;
81 }
82
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}
BSS s32 PopupMenu_SelectedIndex
void N GetFirstTriangleNormal(Gfx *inGfx, f32 *outNx, f32 *outNy, f32 *outNz)
#define sqrtf
#define SQ(x)
Definition macros.h:177

Referenced by GetFirstTriangleNormal().