Arachnoid GLESv1.1 plugin. Compile and run (a bit glitchy and no frameskip) on the...
[mupen64plus-pandora.git] / source / mupen64plus-video-arachnoid / src / RSP / RSP.h
CommitLineData
22726e4d 1/******************************************************************************
2 * Arachnoid Graphics Plugin for Mupen64Plus
3 * http://bitbucket.org/wahrhaft/mupen64plus-video-arachnoid/
4 *
5 * Copyright (C) 2007 Kristofer Karlsson, Rickard Niklasson
6 *
7 * This program is free software; you can redistribute it and/or
8 * modify it under the terms of the GNU General Public License
9 * as published by the Free Software Foundation; either version 2
10 * of the License, or (at your option) any later version.
11 *
12 * This program is distributed in the hope that it will be useful,
13 * but WITHOUT ANY WARRANTY; without even the implied warranty of
14 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
15 * GNU General Public License for more details.
16 *
17 * You should have received a copy of the GNU General Public License
18 * along with this program; if not, write to the Free Software
19 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
20 *****************************************************************************/
21
22#ifndef REALITY_SIGNAL_PROCESSOR_H_
23#define REALITY_SIGNAL_PROCESSOR_H_
24
25#define M64P_PLUGIN_PROTOTYPES 1
26#include "m64p_plugin.h"
27#include "UCodeDefs.h"
28#include "RSPMatrixManager.h"
29#include "RSPVertexManager.h"
30#include "Matrix4.h"
31
32//Forward declarations
33class VI;
34struct RDPTile;
35class RDP;
36class Memory;
37class DisplayListParser;
38class RSPLightManager;
39class FogManager;
40
41//-----------------------------------------------------------------------------
42// Defines
43//-----------------------------------------------------------------------------
44
45#define RSP_1ST 0xBF
46#define RSP_TRI1 (RSP_1ST-0)
47#define RSP_CULLDL (RSP_1ST-1)
48#define RSP_POPMTX (RSP_1ST-2)
49#define RSP_MOVEWORD (RSP_1ST-3)
50#define RSP_TEXTURE (RSP_1ST-4)
51#define RSP_SETOTHERMODE_H (RSP_1ST-5)
52#define RSP_SETOTHERMODE_L (RSP_1ST-6)
53#define RSP_ENDDL (RSP_1ST-7)
54#define RSP_SETGEOMETRYMODE (RSP_1ST-8)
55#define RSP_CLEARGEOMETRYMODE (RSP_1ST-9)
56#define RSP_LINE3D (RSP_1ST-10)
57#define RSP_RDPHALF_1 (RSP_1ST-11)
58#define RSP_RDPHALF_2 (RSP_1ST-12)
59#define RSP_RDPHALF_CONT (RSP_1ST-13)
60
61#define RSP_MODIFYVTX (RSP_1ST-13)
62#define RSP_TRI2 (RSP_1ST-14)
63#define RSP_BRANCH_Z (RSP_1ST-15)
64#define RSP_LOAD_UCODE (RSP_1ST-16)
65
66#define RSP_SPRITE2D_SCALEFLIP (RSP_1ST-1)
67#define RSP_SPRITE2D_DRAW (RSP_1ST-2)
68
69// flags to inhibit pushing of the display list (on branch)
70#define RSP_DLIST_PUSH 0x00
71#define RSP_DLIST_NOPUSH 0x01
72
73//-----------------------------------------------------------------------------
74//! Viewport
75//-----------------------------------------------------------------------------
76struct Viewport
77{
78 float vscale[4];
79 float vtrans[4];
80 float x, y, width, height;
81 float nearz, farz;
82};
83
84
85//-----------------------------------------------------------------------------
86//! Struct used to store Information about Background Image
87//-----------------------------------------------------------------------------
88struct BGImageInfo
89{
90 unsigned int address; //!< Where texture is stored (in RDRAM)
91 unsigned int width; //!< Width of texture
92 unsigned int height; //!< Height of texture
93 unsigned int format; //!< Format of texture
94 unsigned int size; //!< Size of texture
95 unsigned int palette; //!< What Texture Lookup Table to use
96};
97
98//-----------------------------------------------------------------------------
99//* RSPTexture
100//! Struct used to store information about current texture on rsp
101//-----------------------------------------------------------------------------
102struct RSPTexture
103{
104 float scaleS, scaleT;
105 int level, on, tile;
106};
107
108//-----------------------------------------------------------------------------
109//! Singnal Processor Triangle
110//-----------------------------------------------------------------------------
111typedef SPVertex SPTriangle[3];
112
113//*****************************************************************************
114//* RSP
115//! Class for emulating the Reality Signal Processor
116//*****************************************************************************
117class RSP
118{
119public:
120 //Constructor
121 RSP();
122 //Destructor
123 ~RSP();
124
125 //Initialize
126 bool initialize(GFX_INFO* graphicsInfo, RDP* rdp, Memory* memory, VI* vi, DisplayListParser* displayListParser, FogManager* fogMgr);
127 void dispose();
128 void reset();
129
130 void updateGeometryStates();
131
132 //Trigger Interrupt
133 void triggerInterrupt();
134
135 void moveSegment(int segmentID, int value);
136
137 void moveMemViewport(unsigned int segmentAddress);
138
139 RDPTile* getTile(int tile) { return m_textureTiles[tile]; }
140 void setTile(RDPTile* tile, int index) { m_textureTiles[index] = tile; }
141 RSPTexture& getTexture() { return m_texture; }
142 bool getTexturesChanged() { return m_texturesChanged; }
143 void setTexturesChanged(bool changed) { m_texturesChanged = changed; }
144
145 RSPMatrixManager* getMatrixMgr() { return m_matrixMgr; }
146 RSPVertexManager* getVertexMgr() { return m_vertexMgr; }
147
148public:
149
150 //Matrix
151 void RSP_Matrix( unsigned int segmentAddress, bool projectionMatrix, bool push, bool replace );
152 void RSP_PopMatrix();
153 void RSP_PopMatrixN(unsigned int num);
154 void RSP_InsertMatrix(unsigned int where, unsigned int num);
155 void RSP_DMAMatrix( unsigned int matrix, unsigned char index, unsigned char multiply );
156 void RSP_ForceMatrix( unsigned int segmentAddress );
157 void RSP_LookAt( unsigned int l );
158 void RSP_PerspNormalize( unsigned short scale );
159
160 //Display List
161 void RSP_DisplayList(unsigned int segmentAddress);
162 void RSP_DMADisplayList( unsigned int w0, unsigned int w1 );
163 void RSP_CullDisplayList( unsigned int v0, unsigned int vn );
164 void RSP_BranchList( unsigned int dl );
165 void RSP_BranchLessZ( unsigned int branchdl, unsigned int vtx, float zval );
166 void RSP_EndDisplayList();
167
168 //Light
169 void RSP_Light( unsigned int lightIndex, unsigned int segmentAddress );
170 void RSP_NumLights( int n );
171 void RSP_LightColor( unsigned int lightIndex, unsigned int packedColor );
172
173 //Vertices
174 void RSP_Vertex(unsigned int segmentAddress, unsigned int numVertices, unsigned int firstVertexIndex);
175 void RSP_CIVertex(unsigned int segmentAddress, unsigned int numVertices, unsigned int firstVertexIndex);
176 void RSP_ModifyVertex( unsigned int vtx, unsigned int where, unsigned int val );
177 void RSP_SetVertexColor( unsigned int vtx, float r, float g, float b, float a);
178 void RSP_SetVertexTexCoord( unsigned int vtx, float s, float t);
179
180 void RSP_DMAVertex( unsigned int v, unsigned int n, unsigned int v0 );
181 void RSP_SetDMAOffsets( unsigned int mtxoffset, unsigned int vtxoffset );
182 void RSP_SetVertexColorBase(unsigned int segmentAddress);
183
184 //Indices
185 void RSP_1Triangle( int v00, int v01, int v02 );
186 void RSP_2Triangles( int v00, int v01, int v02, int flag0,
187 int v10, int v11, int v12, int flag1 );
188 void RSP_4Triangles( int v00, int v01, int v02,
189 int v10, int v11, int v12,
190 int v20, int v21, int v22,
191 int v30, int v31, int v32 );
192 void RSP_DMATriangles( unsigned int tris, unsigned int n );
193 void RSP_1Quadrangle( int v0, int v1, int v2, int v4 );
194
195 //Object
196 void RSP_ObjRectangle( unsigned int sp );
197 void RSP_ObjSprite( unsigned int sp );
198 void RSP_ObjLoadTxtr( unsigned int tx );
199 void RSP_ObjLoadTxSprite( unsigned int txsp );
200 void RSP_ObjLoadTxRectR( unsigned int txsp );
201 void RSP_ObjMatrix( unsigned int mtx );
202 void RSP_ObjSubMatrix( unsigned int mtx );
203
204 //Rendering
205 void RSP_Line3D( int v0, int v1, int flag );
206 void RSP_LineW3D( int v0, int v1, int wd, int flag );
207 void RSP_BgRect1Cyc( unsigned int bg );
208 void RSP_BgRectCopy( unsigned int bg );
209 void RSP_Sprite2DBase( unsigned int base );
210
211 //States
212 void RSP_GeometryMode( unsigned int clear, unsigned int set );
213 void RSP_SetGeometryMode( unsigned int mode );
214 void RSP_ClearGeometryMode( unsigned int mode );
215
216 //Clipping
217 void RSP_ClipRatio( unsigned int r );
218
219 //Texturing
220 void RSP_Texture( float sc, float tc, int level, int tile, int on );
221
222 //Fog
223 void RSP_FogFactor( short fm, short fo );
224
225 //UCode
226 void RSP_LoadUcodeEx( unsigned int uc_start, unsigned int uc_dstart, unsigned short uc_dsize );
227
228private:
229
230 //Pointers to big objects and managers
231 GFX_INFO* m_graphicsInfo; //!< Access to emulator data (like RDRAM ...)
232 VI* m_vi; //!< Videointerface
233 Memory* m_memory; //!< Memory managers (handles RDRAM, Texture Memory...)
234 DisplayListParser* m_displayListParser; //!< Display list parser
235 FogManager* m_fogMgr; //!< Manager that handles fog
236 RDP* m_rdp; //!< Pointer to Reality Drawing Processor
237
238 //Helper managers
239 RSPMatrixManager* m_matrixMgr; //!< Handles matrix stack
240 RSPVertexManager* m_vertexMgr; //!< Vertex Manager, processes and modifies vertices
241 RSPLightManager* m_lightMgr; //!< Light Manager, handles lights
242
243 //Geometry Mode
244 unsigned int m_geometryMode; //!< Contains states (lighting, shading, culling...)
245
246 //Textures
247 RSPTexture m_texture;
248 RDPTile* m_textureTiles[2];
249 bool m_texturesChanged;
250
251 //Viewport
252 Viewport m_viewport;
253
254};
255
256#endif