d96449bd886b950c8393a0cfe16a42db63129481
[mupen64plus-pandora.git] / source / gles2n64 / src / F3DCBFD.cpp
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