00001
00002
00003 This file is subject to the terms and conditions of the GNU Lesser
00004 General Public License Version 2.1. See the file "COPYING" in the
00005 main directory of this archive for more details. */
00006
00007 #include <stdio.h>
00008
00009 #include "GL/ps2gl.h"
00010
00011 #include "ps2s/packet.h"
00012 #include "ps2s/cpu_matrix.h"
00013 #include "ps2s/math.h"
00014 #include "ps2s/displayenv.h"
00015
00016 #include "ps2gl/gmanager.h"
00017 #include "ps2gl/glcontext.h"
00018 #include "ps2gl/dlist.h"
00019 #include "ps2gl/clear.h"
00020 #include "ps2gl/matrix.h"
00021 #include "ps2gl/debug.h"
00022
00023
00024
00025 * class CVertArray
00026 */
00027
00028 CVertArray::CVertArray()
00029 {
00030 Vertices = Normals = TexCoords = Colors = NULL;
00031 VerticesAreValid = NormalsAreValid = TexCoordsAreValid = ColorsAreValid = false;
00032 WordsPerVertex = WordsPerTexCoord = WordsPerColor = 0;
00033 WordsPerNormal = 3;
00034 }
00035
00036
00037 * class CGeomManager
00038 */
00039
00040
00041
00042 CVertArray *CGeomManager::VertArray;
00043
00044 tUserPrimEntry CGeomManager::UserPrimTypes[kMaxUserPrimTypes];
00045
00046 bool CGeomManager::DoNormalize = false;
00047
00048 CGeomManager::CGeomManager( CGLContext &context )
00049 : GLContext(context),
00050 CurNormal(0.0f, 0.0f, 0.0f),
00051 Prim(GL_INVALID_VALUE),
00052 InsideBeginEnd(false),
00053 LastArrayAccessWasIndexed(false), LastArrayAccessIsValid(false),
00054 UserRenderContextChanged(false)
00055 {
00056 for ( unsigned int i = 0; i < kMaxUserPrimTypes; i++ )
00057 UserPrimTypes[i].requirements = 0xffffffff;
00058 }
00059
00060
00061 * gl api
00062 */
00063
00082 void glVertexPointer( GLint size, GLenum type,
00083 GLsizei stride, const GLvoid *ptr )
00084 {
00085 if ( stride != 0 ) {
00086 mNotImplemented( "stride must be 0" );
00087 return;
00088 }
00089 if ( type != GL_FLOAT ) {
00090 mNotImplemented( "type must be float" );
00091 return;
00092 }
00093
00094 CVertArray &vertArray = pGLContext->GetGeomManager().GetVertArray();
00095 vertArray.SetVertices( (void*)ptr );
00096 vertArray.SetWordsPerVertex( size );
00097 }
00098
00104 void glNormalPointer( GLenum type, GLsizei stride,
00105 const GLvoid *ptr )
00106 {
00107 pglNormalPointer( 3, type, stride, ptr );
00108 }
00109
00116 void glTexCoordPointer( GLint size, GLenum type,
00117 GLsizei stride, const GLvoid *ptr )
00118 {
00119 if ( stride != 0 ) {
00120 mNotImplemented( "stride must be 0" );
00121 return;
00122 }
00123 if ( type != GL_FLOAT ) {
00124 mNotImplemented( "type must be float" );
00125 return;
00126 }
00127
00128 CVertArray &vertArray = pGLContext->GetGeomManager().GetVertArray();
00129 vertArray.SetTexCoords( (void*)ptr );
00130 vertArray.SetWordsPerTexCoord( size );
00131 }
00132
00139 void glColorPointer( GLint size, GLenum type,
00140 GLsizei stride, const GLvoid *ptr )
00141 {
00142 if ( stride != 0 ) {
00143 mNotImplemented( "stride must be 0" );
00144 return;
00145 }
00146 if ( type != GL_FLOAT ) {
00147 mNotImplemented( "type must be float" );
00148 return;
00149 }
00150
00151 CVertArray &vertArray = pGLContext->GetGeomManager().GetVertArray();
00152 vertArray.SetColors( (void*)ptr );
00153 vertArray.SetWordsPerColor( size );
00154 }
00155
00167 void glDrawArrays( GLenum mode, GLint first, GLsizei count )
00168 {
00169 CGeomManager& gmanager = pGLContext->GetGeomManager();
00170 gmanager.DrawArrays( mode, first, count );
00171 }
00172
00176 void glFlush( void )
00177 {
00178 CGeomManager& gmanager = pGLContext->GetGeomManager();
00179 gmanager.Flush();
00180 }
00181
00183
00184 void glEnableClientState( GLenum cap )
00185 {
00186 CGeomManager& gmanager = pGLContext->GetGeomManager();
00187 CVertArray &vertArray = gmanager.GetVertArray();
00188
00189 switch (cap) {
00190 case GL_NORMAL_ARRAY: vertArray.SetNormalsValid(true); break;
00191 case GL_VERTEX_ARRAY: vertArray.SetVerticesValid(true); break;
00192 case GL_COLOR_ARRAY: vertArray.SetColorsValid(true); break;
00193 case GL_TEXTURE_COORD_ARRAY: vertArray.SetTexCoordsValid(true); break;
00194
00195 case GL_INDEX_ARRAY:
00196 case GL_EDGE_FLAG_ARRAY:
00197 mNotImplemented( "capability = %d", cap );
00198 break;
00199 }
00200 }
00201
00202 void glDisableClientState( GLenum cap )
00203 {
00204 CGeomManager &gmanager = pGLContext->GetGeomManager();
00205 CVertArray &vertArray = gmanager.GetVertArray();
00206
00207 switch (cap) {
00208 case GL_NORMAL_ARRAY: vertArray.SetNormalsValid(false); break;
00209 case GL_VERTEX_ARRAY: vertArray.SetVerticesValid(false); break;
00210 case GL_COLOR_ARRAY: vertArray.SetColorsValid(false); break;
00211 case GL_TEXTURE_COORD_ARRAY: vertArray.SetTexCoordsValid(false); break;
00212
00213 case GL_INDEX_ARRAY:
00214 case GL_EDGE_FLAG_ARRAY:
00215 mNotImplemented( "capability = %d", cap );
00216 break;
00217 }
00218 }
00219
00220
00221
00222 void glBegin( GLenum mode )
00223 {
00224 CGeomManager& gmanager = pGLContext->GetGeomManager();
00225 gmanager.BeginGeom( mode );
00226 }
00227
00228 void glNormal3f( GLfloat x, GLfloat y, GLfloat z )
00229 {
00230 CGeomManager& gmanager = pGLContext->GetGeomManager();
00231 gmanager.Normal( cpu_vec_xyz(x, y, z) );
00232 }
00233
00234 void glNormal3fv( const GLfloat *v )
00235 {
00236 glNormal3f( v[0], v[1], v[2] );
00237 }
00238
00239 void glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
00240 {
00241 CGeomManager &gmanager = pGLContext->GetGeomManager();
00242 gmanager.Vertex( cpu_vec_xyzw(x, y, z, w) );
00243 }
00244
00245 void glVertex4fv( const GLfloat *vertex )
00246 {
00247 glVertex4f( vertex[0], vertex[1], vertex[2], vertex[3] );
00248 }
00249
00250 void glVertex3f( GLfloat x, GLfloat y, GLfloat z )
00251 {
00252 glVertex4f(x, y, z, 1.0f);
00253 }
00254
00255 void glVertex3fv( const GLfloat *vertex )
00256 {
00257 glVertex4f( vertex[0], vertex[1], vertex[2], 1.0f );
00258 }
00259
00260 void glTexCoord2f( GLfloat u, GLfloat v )
00261 {
00262 CGeomManager &gmanager = pGLContext->GetGeomManager();
00263 gmanager.TexCoord( u, v );
00264 }
00265
00266 void glTexCoord2fv( const GLfloat *texCoord )
00267 {
00268 glTexCoord2f( texCoord[0], texCoord[1] );
00269 }
00270
00271 void glColor3f( GLfloat red, GLfloat green, GLfloat blue )
00272 {
00273 CGeomManager &gmanager = pGLContext->GetGeomManager();
00274 gmanager.Color( cpu_vec_xyzw(red, green, blue, 1.0f) );
00275 }
00276
00277 void glColor3fv( const GLfloat *color )
00278 {
00279 glColor3f( color[0], color[1], color[2] );
00280 }
00281
00282 void glColor4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
00283 {
00284 CGeomManager &gmanager = pGLContext->GetGeomManager();
00285 gmanager.Color( cpu_vec_xyzw(red, green, blue, alpha) );
00286 }
00287
00288 void glColor4fv( const GLfloat *color )
00289 {
00290 glColor4f( color[0], color[1], color[2], color[3] );
00291 }
00292
00293 void glEnd( void )
00294 {
00295 CGeomManager &gmanager = pGLContext->GetGeomManager();
00296 gmanager.EndGeom();
00297 }
00298
00299
00300 * pgl api
00301 */
00302
00313 void pglNormalPointer( GLint size, GLenum type,
00314 GLsizei stride, const GLvoid *ptr )
00315 {
00316 if ( stride != 0 ) {
00317 mNotImplemented( "stride must be 0" );
00318 return;
00319 }
00320 if ( type != GL_FLOAT ) {
00321 mNotImplemented( "type must be float" );
00322 return;
00323 }
00324
00325 CVertArray &vertArray = pGLContext->GetGeomManager().GetVertArray();
00326 vertArray.SetNormals( (void*)ptr );
00327 vertArray.SetWordsPerNormal(size);
00328 }
00329
00330 void pglDrawIndexedArrays( GLenum primType,
00331 int numIndices, const unsigned char* indices,
00332 int numVertices )
00333 {
00334 pGLContext->GetGeomManager().DrawIndexedArrays(primType, numIndices, indices, numVertices);
00335 }
00336
00370 void
00371 pglRegisterCustomPrimType( GLenum primType,
00372 pglU64_t requirements, pglU64_t rendererReqMask, int mergeContiguous )
00373 {
00374 mErrorIf( ! CGeomManager::IsUserPrimType(primType), "custom prim types must have bit 31 set" );
00375 CGeomManager::RegisterUserPrimType( primType, requirements, rendererReqMask, mergeContiguous );
00376 }
00377
00384 void
00385 pglEnableCustom( pglU64_t flag )
00386 {
00387 flag &= ~(tU64)0xffffffff;
00388 pGLContext->GetGeomManager().EnableCustom( flag );
00389 }
00390
00397 void
00398 pglDisableCustom( pglU64_t flag )
00399 {
00400 flag &= ~(tU64)0xffffffff;
00401 pGLContext->GetGeomManager().DisableCustom( flag );
00402 }
00403
00404 void
00405 pglUserRenderContextChanged()
00406 {
00407 pGLContext->GetGeomManager().SetUserRenderContextChanged();
00408 }
00409