X-Git-Url: https://notaz.gp2x.de/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=source%2Fmupen64plus-video-arachnoid%2Fsrc%2FRSP%2FRSP.h;fp=source%2Fmupen64plus-video-arachnoid%2Fsrc%2FRSP%2FRSP.h;h=26692f63d51f135f2642e8708b7bafe9730fdc6f;hb=22726e4d55be26faa48b57b22689cbedde27ae44;hp=0000000000000000000000000000000000000000;hpb=fc5d46b49a19d41f9f2da5a9336daec452900475;p=mupen64plus-pandora.git diff --git a/source/mupen64plus-video-arachnoid/src/RSP/RSP.h b/source/mupen64plus-video-arachnoid/src/RSP/RSP.h new file mode 100755 index 0000000..26692f6 --- /dev/null +++ b/source/mupen64plus-video-arachnoid/src/RSP/RSP.h @@ -0,0 +1,256 @@ +/****************************************************************************** + * Arachnoid Graphics Plugin for Mupen64Plus + * http://bitbucket.org/wahrhaft/mupen64plus-video-arachnoid/ + * + * Copyright (C) 2007 Kristofer Karlsson, Rickard Niklasson + * + * This program is free software; you can redistribute it and/or + * modify it under the terms of the GNU General Public License + * as published by the Free Software Foundation; either version 2 + * of the License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. + *****************************************************************************/ + +#ifndef REALITY_SIGNAL_PROCESSOR_H_ +#define REALITY_SIGNAL_PROCESSOR_H_ + +#define M64P_PLUGIN_PROTOTYPES 1 +#include "m64p_plugin.h" +#include "UCodeDefs.h" +#include "RSPMatrixManager.h" +#include "RSPVertexManager.h" +#include "Matrix4.h" + +//Forward declarations +class VI; +struct RDPTile; +class RDP; +class Memory; +class DisplayListParser; +class RSPLightManager; +class FogManager; + +//----------------------------------------------------------------------------- +// Defines +//----------------------------------------------------------------------------- + +#define RSP_1ST 0xBF +#define RSP_TRI1 (RSP_1ST-0) +#define RSP_CULLDL (RSP_1ST-1) +#define RSP_POPMTX (RSP_1ST-2) +#define RSP_MOVEWORD (RSP_1ST-3) +#define RSP_TEXTURE (RSP_1ST-4) +#define RSP_SETOTHERMODE_H (RSP_1ST-5) +#define RSP_SETOTHERMODE_L (RSP_1ST-6) +#define RSP_ENDDL (RSP_1ST-7) +#define RSP_SETGEOMETRYMODE (RSP_1ST-8) +#define RSP_CLEARGEOMETRYMODE (RSP_1ST-9) +#define RSP_LINE3D (RSP_1ST-10) +#define RSP_RDPHALF_1 (RSP_1ST-11) +#define RSP_RDPHALF_2 (RSP_1ST-12) +#define RSP_RDPHALF_CONT (RSP_1ST-13) + +#define RSP_MODIFYVTX (RSP_1ST-13) +#define RSP_TRI2 (RSP_1ST-14) +#define RSP_BRANCH_Z (RSP_1ST-15) +#define RSP_LOAD_UCODE (RSP_1ST-16) + +#define RSP_SPRITE2D_SCALEFLIP (RSP_1ST-1) +#define RSP_SPRITE2D_DRAW (RSP_1ST-2) + +// flags to inhibit pushing of the display list (on branch) +#define RSP_DLIST_PUSH 0x00 +#define RSP_DLIST_NOPUSH 0x01 + +//----------------------------------------------------------------------------- +//! Viewport +//----------------------------------------------------------------------------- +struct Viewport +{ + float vscale[4]; + float vtrans[4]; + float x, y, width, height; + float nearz, farz; +}; + + +//----------------------------------------------------------------------------- +//! Struct used to store Information about Background Image +//----------------------------------------------------------------------------- +struct BGImageInfo +{ + unsigned int address; //!< Where texture is stored (in RDRAM) + unsigned int width; //!< Width of texture + unsigned int height; //!< Height of texture + unsigned int format; //!< Format of texture + unsigned int size; //!< Size of texture + unsigned int palette; //!< What Texture Lookup Table to use +}; + +//----------------------------------------------------------------------------- +//* RSPTexture +//! Struct used to store information about current texture on rsp +//----------------------------------------------------------------------------- +struct RSPTexture +{ + float scaleS, scaleT; + int level, on, tile; +}; + +//----------------------------------------------------------------------------- +//! Singnal Processor Triangle +//----------------------------------------------------------------------------- +typedef SPVertex SPTriangle[3]; + +//***************************************************************************** +//* RSP +//! Class for emulating the Reality Signal Processor +//***************************************************************************** +class RSP +{ +public: + //Constructor + RSP(); + //Destructor + ~RSP(); + + //Initialize + bool initialize(GFX_INFO* graphicsInfo, RDP* rdp, Memory* memory, VI* vi, DisplayListParser* displayListParser, FogManager* fogMgr); + void dispose(); + void reset(); + + void updateGeometryStates(); + + //Trigger Interrupt + void triggerInterrupt(); + + void moveSegment(int segmentID, int value); + + void moveMemViewport(unsigned int segmentAddress); + + RDPTile* getTile(int tile) { return m_textureTiles[tile]; } + void setTile(RDPTile* tile, int index) { m_textureTiles[index] = tile; } + RSPTexture& getTexture() { return m_texture; } + bool getTexturesChanged() { return m_texturesChanged; } + void setTexturesChanged(bool changed) { m_texturesChanged = changed; } + + RSPMatrixManager* getMatrixMgr() { return m_matrixMgr; } + RSPVertexManager* getVertexMgr() { return m_vertexMgr; } + +public: + + //Matrix + void RSP_Matrix( unsigned int segmentAddress, bool projectionMatrix, bool push, bool replace ); + void RSP_PopMatrix(); + void RSP_PopMatrixN(unsigned int num); + void RSP_InsertMatrix(unsigned int where, unsigned int num); + void RSP_DMAMatrix( unsigned int matrix, unsigned char index, unsigned char multiply ); + void RSP_ForceMatrix( unsigned int segmentAddress ); + void RSP_LookAt( unsigned int l ); + void RSP_PerspNormalize( unsigned short scale ); + + //Display List + void RSP_DisplayList(unsigned int segmentAddress); + void RSP_DMADisplayList( unsigned int w0, unsigned int w1 ); + void RSP_CullDisplayList( unsigned int v0, unsigned int vn ); + void RSP_BranchList( unsigned int dl ); + void RSP_BranchLessZ( unsigned int branchdl, unsigned int vtx, float zval ); + void RSP_EndDisplayList(); + + //Light + void RSP_Light( unsigned int lightIndex, unsigned int segmentAddress ); + void RSP_NumLights( int n ); + void RSP_LightColor( unsigned int lightIndex, unsigned int packedColor ); + + //Vertices + void RSP_Vertex(unsigned int segmentAddress, unsigned int numVertices, unsigned int firstVertexIndex); + void RSP_CIVertex(unsigned int segmentAddress, unsigned int numVertices, unsigned int firstVertexIndex); + void RSP_ModifyVertex( unsigned int vtx, unsigned int where, unsigned int val ); + void RSP_SetVertexColor( unsigned int vtx, float r, float g, float b, float a); + void RSP_SetVertexTexCoord( unsigned int vtx, float s, float t); + + void RSP_DMAVertex( unsigned int v, unsigned int n, unsigned int v0 ); + void RSP_SetDMAOffsets( unsigned int mtxoffset, unsigned int vtxoffset ); + void RSP_SetVertexColorBase(unsigned int segmentAddress); + + //Indices + void RSP_1Triangle( int v00, int v01, int v02 ); + void RSP_2Triangles( int v00, int v01, int v02, int flag0, + int v10, int v11, int v12, int flag1 ); + void RSP_4Triangles( int v00, int v01, int v02, + int v10, int v11, int v12, + int v20, int v21, int v22, + int v30, int v31, int v32 ); + void RSP_DMATriangles( unsigned int tris, unsigned int n ); + void RSP_1Quadrangle( int v0, int v1, int v2, int v4 ); + + //Object + void RSP_ObjRectangle( unsigned int sp ); + void RSP_ObjSprite( unsigned int sp ); + void RSP_ObjLoadTxtr( unsigned int tx ); + void RSP_ObjLoadTxSprite( unsigned int txsp ); + void RSP_ObjLoadTxRectR( unsigned int txsp ); + void RSP_ObjMatrix( unsigned int mtx ); + void RSP_ObjSubMatrix( unsigned int mtx ); + + //Rendering + void RSP_Line3D( int v0, int v1, int flag ); + void RSP_LineW3D( int v0, int v1, int wd, int flag ); + void RSP_BgRect1Cyc( unsigned int bg ); + void RSP_BgRectCopy( unsigned int bg ); + void RSP_Sprite2DBase( unsigned int base ); + + //States + void RSP_GeometryMode( unsigned int clear, unsigned int set ); + void RSP_SetGeometryMode( unsigned int mode ); + void RSP_ClearGeometryMode( unsigned int mode ); + + //Clipping + void RSP_ClipRatio( unsigned int r ); + + //Texturing + void RSP_Texture( float sc, float tc, int level, int tile, int on ); + + //Fog + void RSP_FogFactor( short fm, short fo ); + + //UCode + void RSP_LoadUcodeEx( unsigned int uc_start, unsigned int uc_dstart, unsigned short uc_dsize ); + +private: + + //Pointers to big objects and managers + GFX_INFO* m_graphicsInfo; //!< Access to emulator data (like RDRAM ...) + VI* m_vi; //!< Videointerface + Memory* m_memory; //!< Memory managers (handles RDRAM, Texture Memory...) + DisplayListParser* m_displayListParser; //!< Display list parser + FogManager* m_fogMgr; //!< Manager that handles fog + RDP* m_rdp; //!< Pointer to Reality Drawing Processor + + //Helper managers + RSPMatrixManager* m_matrixMgr; //!< Handles matrix stack + RSPVertexManager* m_vertexMgr; //!< Vertex Manager, processes and modifies vertices + RSPLightManager* m_lightMgr; //!< Light Manager, handles lights + + //Geometry Mode + unsigned int m_geometryMode; //!< Contains states (lighting, shading, culling...) + + //Textures + RSPTexture m_texture; + RDPTile* m_textureTiles[2]; + bool m_texturesChanged; + + //Viewport + Viewport m_viewport; + +}; + +#endif