00001
00002
00003
00004
00005 #ifndef ps2gl_vsmmanager_h
00006 #define ps2gl_vsmmanager_h
00007
00008 #include "eestruct.h"
00009
00010 #include "ps2s/vif.h"
00011
00012 #include "GL/gl.h"
00013
00014
00015
00016
00017
00018
00019 class CVu1RendererProps {
00020 public:
00021 unsigned int PrimType : 3;
00022 unsigned int Lighting : 1;
00023 unsigned int LightTypes : 5;
00024 unsigned int Texture : 1;
00025 unsigned int Specular : 1;
00026 unsigned int PerVtxMaterial : 3;
00027 unsigned int CullFace : 1;
00028 unsigned int TwoSidedLighting : 1;
00029
00030
00031
00032 inline operator unsigned int() const {
00033 unsigned int value;
00034 asm (" ### CVu1RendererProps to uint ### " : "=r" (value) : "0" (*this) );
00035 return value;
00036 }
00037 };
00038
00039 namespace Vu1RendererProps {
00040 typedef enum { kPtsLinesStripsFans = 1 << 0,
00041 kTriangles = 1 << 1,
00042 kQuads = 1 << 2 } tPrimType;
00043
00044 typedef enum { k3DirLights = 1 << 0,
00045 k8DirLights = 1 << 1,
00046 k1PtLight = 1 << 2,
00047 k2PtLights = 1 << 3,
00048 k8PtLights = 1 << 4 } tLightTypes;
00049
00050 typedef enum { kNone = 1 << 0,
00051 kDiffuse = 1 << 1,
00052 kSpecular = 1 << 2 } tPerVtxMaterial;
00053 }
00054
00055
00056
00057
00058
00059 class CGLContext;
00060 class CImmGeomManager;
00061 class CVifSCDmaPacket;
00062 class CGeometryBlock;
00063
00064 typedef enum { kDirectional, kPoint, kSpot } tLightType;
00065
00066 typedef struct {
00067 void *packet;
00068 CVu1RendererProps provides;
00069 unsigned char inputQuadsPerVert, outputQuadsPerVert;
00070 } tVu1Renderer;
00071
00072 class CVsmManager {
00073 CGLContext &GLContext;
00074
00075 CVu1RendererProps VsmRequirements;
00076 bool VsmReqsHaveChanged;
00077 const tVu1Renderer *CurrentVu1Renderer;
00078 static const tVu1Renderer Vu1Renderers[];
00079 static const int NumVu1Renderers;
00080
00081 sceGifTag GifTag;
00082
00083
00084 bool TexEnabled;
00085 bool ColorMaterialEnabled;
00086
00087 int WordsPerVertex, WordsPerNormal, WordsPerTexCoord, WordsPerColor;
00088 unsigned int VertexUnpackMode, NormalUnpackMode;
00089 unsigned int TexCoordUnpackMode, ColorUnpackMode;
00090 Vifs::tMask VertexUnpackMask, NormalUnpackMask;
00091 Vifs::tMask TexCoordUnpackMask, ColorUnpackMask;
00092
00093 void GetUnpackAttribs( int numWords, unsigned int &mode, Vifs::tMask &mask );
00094
00095 void FindNumBuffers( int numToAdd, int numVertsToRestart,
00096 int numVertsAlreadyInFirstBuffer, int maxVertsPerBuffer,
00097 int &numVertsFirstBuffer, int &numVertsLastBuffer,
00098 int &numBuffers );
00099 void XferBlock( CVifSCDmaPacket &packet, CImmGeomManager &gmanager, GLenum primType,
00100 void *vertices, void *normals, void *texCoords, void *colors,
00101 int vu1Offset, int firstElement, int numToAdd );
00102 void XferBufferHeader( CVifSCDmaPacket& packet, GLenum primType,
00103 int numVerts,
00104 int numStripsInBuffer, unsigned short *stripOffsets );
00105 void XferVectors( CVifSCDmaPacket &packet, unsigned int *dataStart,
00106 int startOffset, int numVectors, int wordsPerVec,
00107 Vifs::tMask unpackMask, tU32 unpackMode,
00108 int vu1MemOffset );
00109
00110 void DrawStrip( CVifSCDmaPacket &packet, CImmGeomManager &gmanager,
00111 CGeometryBlock &block, int maxVertsPerBuffer );
00112 void FinishBuffer( CVifSCDmaPacket &packet, CGeometryBlock &block,
00113 int numVertsInBuffer, int vu1QuadsPerVert,
00114 int numStripsInBuffer, unsigned short *stripOffsets );
00115
00116 public:
00117 CVsmManager( CGLContext &context);
00118
00119 void DrawArrays( CVifSCDmaPacket &packet, CImmGeomManager &gmanager,
00120 CGeometryBlock &block );
00121
00122 void TransferSetupInfo( CVifSCDmaPacket &packet,
00123 CImmGeomManager &gmanager, GLenum primType );
00124
00125 void SyncGifTag( CImmGeomManager &gmanager, GLenum primType );
00126 sceGifTag GetGifTag() const { return GifTag; }
00127
00128 bool SyncVu1Renderer();
00129 void XferVu1Renderer( CVifSCDmaPacket &packet );
00130
00131
00132
00133 void NumLightsChanged( tLightType type, int num );
00134 void PrimChanged( unsigned char prim );
00135 void TexEnabledChanged( bool enabled );
00136 void LightingEnabledChanged( bool enabled );
00137 void SpecularEnabledChanged( bool enabled );
00138 void PerVtxMaterialChanged( Vu1RendererProps::tPerVtxMaterial matType );
00139 void CullFaceEnabledChanged( bool enabled );
00140 };
00141
00142 #endif // ps2gl_vsmmanager_h