1 #include "gles2N64.h"
2 #include "Debug.h"
3 #include "F3D.h"
4 #include "N64.h"
5 #include "RSP.h"
6 #include "RDP.h"
7 #include "gSP.h"
8 #include "gDP.h"
9 #include "GBI.h"
10 #include "OpenGL.h"
11 #include "DepthBuffer.h"
12
13 #include "Config.h"
14
15 #include "../../Graphics/RDP/gDP_state.h"
16 #include "../../Graphics/RSP/gSP_funcs_C.h"
17
F3D_SPNoOp(uint32_t w0,uint32_t w1)18 void F3D_SPNoOp( uint32_t w0, uint32_t w1 )
19 {
20 gln64gSPNoOp();
21 }
22
F3D_Mtx(uint32_t w0,uint32_t w1)23 void F3D_Mtx( uint32_t w0, uint32_t w1 )
24 {
25 if (_SHIFTR( w0, 0, 16 ) != 64)
26 return;
27
28 gln64gSPMatrix( w1, _SHIFTR( w0, 16, 8 ) );
29 }
30
F3D_Vtx(uint32_t w0,uint32_t w1)31 void F3D_Vtx( uint32_t w0, uint32_t w1 )
32 {
33 gln64gSPVertex( w1, _SHIFTR( w0, 20, 4 ) + 1, _SHIFTR( w0, 16, 4 ) );
34 }
35
F3D_DList(uint32_t w0,uint32_t w1)36 void F3D_DList( uint32_t w0, uint32_t w1 )
37 {
38 switch (_SHIFTR( w0, 16, 8 ))
39 {
40 case G_DL_PUSH:
41 gln64gSPDisplayList( w1 );
42 break;
43 case G_DL_NOPUSH:
44 gln64gSPBranchList( w1 );
45 break;
46 }
47 }
48
F3D_Sprite2D_Base(uint32_t w0,uint32_t w1)49 void F3D_Sprite2D_Base( uint32_t w0, uint32_t w1 )
50 {
51 gln64gSPSprite2DBase( w1 );
52 }
53
54
F3D_Tri1(uint32_t w0,uint32_t w1)55 void F3D_Tri1( uint32_t w0, uint32_t w1 )
56 {
57 gln64gSP1Triangle( _SHIFTR( w1, 16, 8 ) / 10,
58 _SHIFTR( w1, 8, 8 ) / 10,
59 _SHIFTR( w1, 0, 8 ) / 10, 0);
60 }
61
F3D_CullDL(uint32_t w0,uint32_t w1)62 void F3D_CullDL( uint32_t w0, uint32_t w1 )
63 {
64 gln64gSPCullDisplayList( _SHIFTR( w0, 0, 24 ) / 40, (w1 / 40) - 1 );
65 }
66
F3D_PopMtx(uint32_t w0,uint32_t w1)67 void F3D_PopMtx( uint32_t w0, uint32_t w1 )
68 {
69 gln64gSPPopMatrix( w1 );
70 }
71
F3D_MoveWord(uint32_t w0,uint32_t w1)72 void F3D_MoveWord( uint32_t w0, uint32_t w1 )
73 {
74 switch (_SHIFTR( w0, 0, 8 ))
75 {
76 case G_MW_MATRIX:
77 gln64gSPInsertMatrix( _SHIFTR( w0, 8, 16 ), w1 );
78 break;
79
80 case G_MW_NUMLIGHT:
81 gln64gSPNumLights( ((w1 - 0x80000000) >> 5) - 1 );
82 break;
83
84 case G_MW_CLIP:
85 gln64gSPClipRatio( w1 );
86 break;
87
88 case G_MW_SEGMENT:
89 gln64gSPSegment( _SHIFTR( w0, 10, 4 ), w1 & 0x00FFFFFF );
90 break;
91
92 case G_MW_FOG:
93 gln64gSPFogFactor( (int16_t)_SHIFTR( w1, 16, 16 ), (int16_t)_SHIFTR( w1, 0, 16 ) );
94 break;
95
96 case G_MW_LIGHTCOL:
97 switch (_SHIFTR( w0, 8, 16 ))
98 {
99 case F3D_MWO_aLIGHT_1:
100 gln64gSPLightColor( LIGHT_1, w1 );
101 break;
102 case F3D_MWO_aLIGHT_2:
103 gln64gSPLightColor( LIGHT_2, w1 );
104 break;
105 case F3D_MWO_aLIGHT_3:
106 gln64gSPLightColor( LIGHT_3, w1 );
107 break;
108 case F3D_MWO_aLIGHT_4:
109 gln64gSPLightColor( LIGHT_4, w1 );
110 break;
111 case F3D_MWO_aLIGHT_5:
112 gln64gSPLightColor( LIGHT_5, w1 );
113 break;
114 case F3D_MWO_aLIGHT_6:
115 gln64gSPLightColor( LIGHT_6, w1 );
116 break;
117 case F3D_MWO_aLIGHT_7:
118 gln64gSPLightColor( LIGHT_7, w1 );
119 break;
120 case F3D_MWO_aLIGHT_8:
121 gln64gSPLightColor( LIGHT_8, w1 );
122 break;
123 }
124 break;
125 case G_MW_POINTS:
126 {
127 const uint32_t val = _SHIFTR(w0, 8, 16);
128 gln64gSPModifyVertex(val / 40, val % 40, w1);
129 }
130 break;
131 case G_MW_PERSPNORM:
132 gln64gSPPerspNormalize( w1 );
133 break;
134 }
135 }
136
F3D_Texture(uint32_t w0,uint32_t w1)137 void F3D_Texture( uint32_t w0, uint32_t w1 )
138 {
139 gln64gSPTexture( _FIXED2FLOAT( _SHIFTR( w1, 16, 16 ), 16 ),
140 _FIXED2FLOAT( _SHIFTR( w1, 0, 16 ), 16 ),
141 _SHIFTR( w0, 11, 3 ),
142 _SHIFTR( w0, 8, 3 ),
143 _SHIFTR( w0, 0, 8 ) );
144 }
145
F3D_SetOtherMode_H(uint32_t w0,uint32_t w1)146 void F3D_SetOtherMode_H( uint32_t w0, uint32_t w1 )
147 {
148 const uint32_t length = _SHIFTR(w0, 0, 8);
149 const uint32_t shift = _SHIFTR(w0, 8, 8);
150 gln64gSPSetOtherMode_H(length, shift, w1);
151 }
152
F3D_SetOtherMode_L(uint32_t w0,uint32_t w1)153 void F3D_SetOtherMode_L( uint32_t w0, uint32_t w1 )
154 {
155 const uint32_t length = _SHIFTR(w0, 0, 8);
156 const uint32_t shift = _SHIFTR(w0, 8, 8);
157 gln64gSPSetOtherMode_L(length, shift, w1);
158 }
159
F3D_SetGeometryMode(uint32_t w0,uint32_t w1)160 void F3D_SetGeometryMode( uint32_t w0, uint32_t w1 )
161 {
162 gln64gSPSetGeometryMode( w1 );
163 }
164
F3D_ClearGeometryMode(uint32_t w0,uint32_t w1)165 void F3D_ClearGeometryMode( uint32_t w0, uint32_t w1 )
166 {
167 gln64gSPClearGeometryMode( w1 );
168 }
169
F3D_Quad(uint32_t w0,uint32_t w1)170 void F3D_Quad( uint32_t w0, uint32_t w1 )
171 {
172 gln64gSP1Quadrangle( _SHIFTR( w1, 24, 8 ) / 10, _SHIFTR( w1, 16, 8 ) / 10, _SHIFTR( w1, 8, 8 ) / 10, _SHIFTR( w1, 0, 8 ) / 10 );
173 }
174
F3D_RDPHalf_1(uint32_t w0,uint32_t w1)175 void F3D_RDPHalf_1( uint32_t w0, uint32_t w1 )
176 {
177 gDP.half_1 = w1;
178 RDP_Half_1(w1);
179 }
180
F3D_RDPHalf_2(uint32_t w0,uint32_t w1)181 void F3D_RDPHalf_2( uint32_t w0, uint32_t w1 )
182 {
183 gDP.half_2 = w1;
184 }
185
F3D_RDPHalf_Cont(uint32_t w0,uint32_t w1)186 void F3D_RDPHalf_Cont( uint32_t w0, uint32_t w1 )
187 {
188 }
189
F3D_Tri4(uint32_t w0,uint32_t w1)190 void F3D_Tri4( uint32_t w0, uint32_t w1 )
191 {
192 gln64gSP4Triangles( _SHIFTR( w1, 28, 4 ), _SHIFTR( w0, 12, 4 ), _SHIFTR( w1, 24, 4 ),
193 _SHIFTR( w1, 20, 4 ), _SHIFTR( w0, 8, 4 ), _SHIFTR( w1, 16, 4 ),
194 _SHIFTR( w1, 12, 4 ), _SHIFTR( w0, 4, 4 ), _SHIFTR( w1, 8, 4 ),
195 _SHIFTR( w1, 4, 4 ), _SHIFTR( w0, 0, 4 ), _SHIFTR( w1, 0, 4 ) );
196 }
197
F3D_Init(void)198 void F3D_Init(void)
199 {
200 gSPSetupFunctions();
201 // Set GeometryMode flags
202 GBI_InitFlags( F3D );
203
204 GBI.PCStackSize = 10;
205
206 // GBI Command Command Value Command Function
207 GBI_SetGBI( G_SPNOOP, F3D_SPNOOP, F3D_SPNoOp );
208 GBI_SetGBI( G_MTX, F3D_MTX, F3D_Mtx );
209 GBI_SetGBI( G_RESERVED0, F3D_RESERVED0, F3D_Reserved0 );
210 GBI_SetGBI( G_MOVEMEM, F3D_MOVEMEM, F3D_MoveMem );
211 GBI_SetGBI( G_VTX, F3D_VTX, F3D_Vtx );
212 GBI_SetGBI( G_RESERVED1, F3D_RESERVED1, F3D_Reserved1 );
213 GBI_SetGBI( G_DL, F3D_DL, F3D_DList );
214 GBI_SetGBI( G_RESERVED2, F3D_RESERVED2, F3D_Reserved2 );
215 GBI_SetGBI( G_RESERVED3, F3D_RESERVED3, F3D_Reserved3 );
216 GBI_SetGBI( G_SPRITE2D_BASE, F3D_SPRITE2D_BASE, F3D_Sprite2D_Base );
217
218 GBI_SetGBI( G_TRI1, F3D_TRI1, F3D_Tri1 );
219 GBI_SetGBI( G_CULLDL, F3D_CULLDL, F3D_CullDL );
220 GBI_SetGBI( G_POPMTX, F3D_POPMTX, F3D_PopMtx );
221 GBI_SetGBI( G_MOVEWORD, F3D_MOVEWORD, F3D_MoveWord );
222 GBI_SetGBI( G_TEXTURE, F3D_TEXTURE, F3D_Texture );
223 GBI_SetGBI( G_SETOTHERMODE_H, F3D_SETOTHERMODE_H, F3D_SetOtherMode_H );
224 GBI_SetGBI( G_SETOTHERMODE_L, F3D_SETOTHERMODE_L, F3D_SetOtherMode_L );
225 GBI_SetGBI( G_ENDDL, F3D_ENDDL, F3D_EndDL );
226 GBI_SetGBI( G_SETGEOMETRYMODE, F3D_SETGEOMETRYMODE, F3D_SetGeometryMode );
227 GBI_SetGBI( G_CLEARGEOMETRYMODE, F3D_CLEARGEOMETRYMODE, F3D_ClearGeometryMode );
228 GBI_SetGBI( G_QUAD, F3D_QUAD, F3D_Quad );
229 GBI_SetGBI( G_RDPHALF_1, F3D_RDPHALF_1, F3D_RDPHalf_1 );
230 GBI_SetGBI( G_RDPHALF_2, F3D_RDPHALF_2, F3D_RDPHalf_2 );
231 GBI_SetGBI( G_RDPHALF_CONT, F3D_RDPHALF_CONT, F3D_RDPHalf_Cont );
232 GBI_SetGBI( G_TRI4, F3D_TRI4, F3D_Tri4 );
233
234 }
235