34cf4058 |
1 | #include "Common.h" |
2 | #include "gles2N64.h" |
3 | #include "Debug.h" |
4 | #include "F3D.h" |
5 | #include "F3DEX.h" |
6 | #include "F3DEX2.h" |
7 | #include "F3DCBFD.h" |
8 | #include "S2DEX.h" |
9 | #include "S2DEX2.h" |
10 | #include "N64.h" |
11 | #include "RSP.h" |
12 | #include "RDP.h" |
13 | #include "gSP.h" |
14 | #include "gDP.h" |
15 | #include "GBI.h" |
16 | #include "OpenGL.h" |
17 | #include "Config.h" |
18 | |
19 | //BASED ON GLIDE64 Implementation |
20 | |
21 | u32 normal_address = 0; |
22 | |
23 | void F3DCBFD_Vtx(u32 w0, u32 w1) |
24 | { |
25 | |
26 | s32 v0, n; |
27 | u32 address; |
28 | n = (w0 >> 12)&0xFF; |
29 | v0 = ((w0 >> 1)&0x7F) - n; |
30 | address = RSP_SegmentToPhysical(w1); |
31 | |
32 | if (v0 < 0) |
33 | { |
34 | return; |
35 | } |
36 | |
37 | gSPFlushTriangles(); |
38 | |
39 | Vertex* vertex = (Vertex*)&RDRAM[address]; |
40 | |
41 | for (s32 i=0; i < n; i++) |
42 | { |
43 | u32 v; |
44 | #ifdef __TRIBUFFER_OPT |
45 | v = __indexmap_getnew(i, 1); |
46 | #else |
47 | v = i; |
48 | #endif |
49 | |
50 | OGL.triangles.vertices[v].x = vertex->x; |
51 | OGL.triangles.vertices[v].y = vertex->y; |
52 | OGL.triangles.vertices[v].z = vertex->z; |
53 | OGL.triangles.vertices[v].w = 1.0f; |
54 | |
55 | OGL.triangles.vertices[v].s = _FIXED2FLOAT(vertex->s, 5); |
56 | OGL.triangles.vertices[v].t = _FIXED2FLOAT(vertex->t, 5); |
57 | |
58 | if (config.enableLighting && gSP.geometryMode & G_LIGHTING) |
59 | { |
60 | OGL.triangles.vertices[v].nx = ((s8*)RDRAM)[(normal_address + (i<<2) + (v0<<1) + 0)^3]; |
61 | OGL.triangles.vertices[v].ny = ((s8*)RDRAM)[(normal_address + (i<<2) + (v0<<1) + 1)^3]; |
62 | OGL.triangles.vertices[v].nz = (s8)(vertex->flag&0xff); |
63 | } |
64 | |
65 | gSPProcessVertex(v); |
66 | |
67 | if (config.enableLighting && gSP.geometryMode & G_LIGHTING) |
68 | { |
69 | OGL.triangles.vertices[v].r = OGL.triangles.vertices[v].r * vertex->color.r * 0.0039215689f; |
70 | OGL.triangles.vertices[v].g = OGL.triangles.vertices[v].g * vertex->color.g * 0.0039215689f; |
71 | OGL.triangles.vertices[v].b = OGL.triangles.vertices[v].b * vertex->color.b * 0.0039215689f; |
72 | OGL.triangles.vertices[v].a = OGL.triangles.vertices[v].a * vertex->color.a * 0.0039215689f; |
73 | } |
74 | else |
75 | { |
76 | OGL.triangles.vertices[v].r = vertex->color.r * 0.0039215689f; |
77 | OGL.triangles.vertices[v].g = vertex->color.g * 0.0039215689f; |
78 | OGL.triangles.vertices[v].b = vertex->color.b * 0.0039215689f; |
79 | OGL.triangles.vertices[v].a = vertex->color.a * 0.0039215689f; |
80 | } |
81 | vertex++; |
82 | } |
83 | } |
84 | |
85 | void F3DCBFD_MoveWord(u32 w0, u32 w1) |
86 | { |
87 | u8 index = (u8)((w0 >> 16) & 0xFF); |
88 | u16 offset = (u16)(w0 & 0xFFFF); |
89 | |
90 | switch (index) |
91 | { |
92 | case G_MW_NUMLIGHT: |
93 | gSPNumLights(w1 / 48); |
94 | break; |
95 | |
96 | case G_MW_CLIP: |
97 | if (offset == 0x04) |
98 | { |
99 | gSPClipRatio( w1 ); |
100 | } |
101 | break; |
102 | |
103 | case G_MW_SEGMENT: |
104 | gSPSegment(_SHIFTR(offset, 2, 4), w1); |
105 | break; |
106 | |
107 | case G_MW_FOG: |
108 | gSPFogFactor( (s16)_SHIFTR( w1, 16, 16 ), (s16)_SHIFTR( w1, 0, 16 ) ); |
109 | break; |
110 | |
111 | case G_MV_COORDMOD: // moveword coord mod |
112 | break; |
113 | |
114 | default: |
115 | break; |
116 | } |
117 | } |
118 | |
119 | #define F3DCBFD_MV_VIEWPORT 8 |
120 | #define F3DCBFD_MV_LIGHT 10 |
121 | #define F3DCBFD_MV_NORMAL 14 |
122 | |
123 | void F3DCBFD_MoveMem(u32 w0, u32 w1) |
124 | { |
125 | #ifdef __TRIBUFFER_OPT |
126 | gSPFlushTriangles(); |
127 | #endif |
128 | switch (_SHIFTR( w0, 0, 8 )) |
129 | { |
130 | case F3DCBFD_MV_VIEWPORT: |
131 | gSPViewport(w1); |
132 | break; |
133 | |
134 | case F3DCBFD_MV_LIGHT: |
135 | { |
136 | u32 offset = _SHIFTR( w0, 8, 8 ) << 3; |
137 | if (offset >= 48) |
138 | { |
139 | gSPLight( w1, (offset - 24) / 24); |
140 | } |
141 | break; |
142 | } |
143 | |
144 | case F3DCBFD_MV_NORMAL: |
145 | normal_address = RSP_SegmentToPhysical(w1); |
146 | break; |
147 | |
148 | } |
149 | } |
150 | |
151 | void F3DCBFD_Tri4(u32 w0, u32 w1) |
152 | { |
153 | gSP4Triangles( _SHIFTR(w0, 23, 5), _SHIFTR(w0, 18, 5), (_SHIFTR(w0, 15, 3 ) << 2) | _SHIFTR(w1, 30, 2), |
154 | _SHIFTR(w0, 10, 5), _SHIFTR(w0, 5, 5), _SHIFTR(w1, 0, 5), |
155 | _SHIFTR(w1, 25, 5), _SHIFTR(w1, 20, 5), _SHIFTR(w1, 15, 5), |
156 | _SHIFTR(w1, 10, 5), _SHIFTR(w1, 5, 5), _SHIFTR(w1, 0, 5)); |
157 | } |
158 | |
159 | |
160 | void F3DCBFD_Init() |
161 | { |
162 | LOG(LOG_VERBOSE, "USING CBFD ucode!\n"); |
163 | |
164 | // Set GeometryMode flags |
165 | GBI_InitFlags(F3DEX2); |
166 | |
167 | GBI.PCStackSize = 10; |
168 | |
169 | // GBI Command Command Value Command Function |
170 | GBI_SetGBI( G_RDPHALF_2, F3DEX2_RDPHALF_2, F3D_RDPHalf_2 ); |
171 | GBI_SetGBI( G_SETOTHERMODE_H, F3DEX2_SETOTHERMODE_H, F3DEX2_SetOtherMode_H ); |
172 | GBI_SetGBI( G_SETOTHERMODE_L, F3DEX2_SETOTHERMODE_L, F3DEX2_SetOtherMode_L ); |
173 | GBI_SetGBI( G_RDPHALF_1, F3DEX2_RDPHALF_1, F3D_RDPHalf_1 ); |
174 | GBI_SetGBI( G_SPNOOP, F3DEX2_SPNOOP, F3D_SPNoOp ); |
175 | GBI_SetGBI( G_ENDDL, F3DEX2_ENDDL, F3D_EndDL ); |
176 | GBI_SetGBI( G_DL, F3DEX2_DL, F3D_DList ); |
177 | GBI_SetGBI( G_LOAD_UCODE, F3DEX2_LOAD_UCODE, F3DEX_Load_uCode ); |
178 | GBI_SetGBI( G_MOVEMEM, F3DEX2_MOVEMEM, F3DCBFD_MoveMem); |
179 | GBI_SetGBI( G_MOVEWORD, F3DEX2_MOVEWORD, F3DCBFD_MoveWord); |
180 | GBI_SetGBI( G_MTX, F3DEX2_MTX, F3DEX2_Mtx ); |
181 | GBI_SetGBI( G_GEOMETRYMODE, F3DEX2_GEOMETRYMODE, F3DEX2_GeometryMode ); |
182 | GBI_SetGBI( G_POPMTX, F3DEX2_POPMTX, F3DEX2_PopMtx ); |
183 | GBI_SetGBI( G_TEXTURE, F3DEX2_TEXTURE, F3DEX2_Texture ); |
184 | GBI_SetGBI( G_DMA_IO, F3DEX2_DMA_IO, F3DEX2_DMAIO ); |
185 | GBI_SetGBI( G_SPECIAL_1, F3DEX2_SPECIAL_1, F3DEX2_Special_1 ); |
186 | GBI_SetGBI( G_SPECIAL_2, F3DEX2_SPECIAL_2, F3DEX2_Special_2 ); |
187 | GBI_SetGBI( G_SPECIAL_3, F3DEX2_SPECIAL_3, F3DEX2_Special_3 ); |
188 | |
189 | |
190 | |
191 | GBI_SetGBI(G_VTX, F3DEX2_VTX, F3DCBFD_Vtx); |
192 | GBI_SetGBI(G_MODIFYVTX, F3DEX2_MODIFYVTX, F3DEX_ModifyVtx); |
193 | GBI_SetGBI(G_CULLDL, F3DEX2_CULLDL, F3DEX_CullDL); |
194 | GBI_SetGBI(G_BRANCH_Z, F3DEX2_BRANCH_Z, F3DEX_Branch_Z); |
195 | GBI_SetGBI(G_TRI1, F3DEX2_TRI1, F3DEX2_Tri1); |
196 | GBI_SetGBI(G_TRI2, F3DEX2_TRI2, F3DEX_Tri2); |
197 | GBI_SetGBI(G_QUAD, F3DEX2_QUAD, F3DEX2_Quad); |
198 | // GBI_SetGBI( G_LINE3D, F3DEX2_LINE3D, F3DEX2_Line3D ); |
199 | |
200 | //for some reason glide64 maps TRI4 to these locations: |
201 | |
202 | for(int i = 0x10; i <= 0x1F; i++) |
203 | { |
204 | GBI_SetGBI(G_TRI4, i, F3DCBFD_Tri4); |
205 | } |
206 | |
207 | GBI_SetGBI( G_BG_1CYC, S2DEX2_BG_1CYC, S2DEX_BG_1Cyc); |
208 | GBI_SetGBI( G_BG_COPY, S2DEX2_BG_COPY, S2DEX_BG_Copy); |
209 | GBI_SetGBI( G_OBJ_RENDERMODE, S2DEX2_OBJ_RENDERMODE, S2DEX_Obj_RenderMode); |
210 | |
211 | } |
212 | |