Main Page   Modules   Namespace List   Class Hierarchy   Alphabetical List   Compound List   File List   Namespace Members   Compound Members   File Members  

gmanager.cpp

Go to the documentation of this file.
00001 /*        Copyright (C) 2000,2001,2002  Sony Computer Entertainment America
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; // not set by NormalPointer
00034 }
00035 
00036 /********************************************
00037  * class CGeomManager
00038  */
00039 
00040 // static members
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 glDrawElements( GLenum mode, GLsizei count, GLenum type, const GLvoid *indices )
00177 {
00178    mError("glDrawElements is a placeholder ATM and should not be called");
00179 }
00180 
00184 void glInterleavedArrays( GLenum format, GLsizei stride, const GLvoid *pointer )
00185 {
00186    mError("glInterleavedArrays is a placeholder ATM and should not be called");
00187 }
00188 
00192 void glArrayElement( GLint i )
00193 {
00194    mError("glArrayElement is a placeholder ATM and should not be called");
00195 }
00196 
00200 void glFlush( void )
00201 {
00202    CGeomManager& gmanager = pGLContext->GetGeomManager();
00203    gmanager.Flush();
00204 }
00205  // gl_api
00207 
00208 void glEnableClientState( GLenum cap )
00209 {
00210    CGeomManager& gmanager = pGLContext->GetGeomManager();
00211    CVertArray &vertArray = gmanager.GetVertArray();
00212 
00213    switch (cap) {
00214       case GL_NORMAL_ARRAY: vertArray.SetNormalsValid(true); break;
00215       case GL_VERTEX_ARRAY: vertArray.SetVerticesValid(true); break;
00216       case GL_COLOR_ARRAY: vertArray.SetColorsValid(true); break;
00217       case GL_TEXTURE_COORD_ARRAY: vertArray.SetTexCoordsValid(true); break;
00218 
00219       case GL_INDEX_ARRAY:
00220       case GL_EDGE_FLAG_ARRAY:
00221          mNotImplemented( "capability = %d", cap );
00222          break;
00223    }
00224 }
00225 
00226 void glDisableClientState( GLenum cap )
00227 {
00228    CGeomManager &gmanager = pGLContext->GetGeomManager();
00229    CVertArray &vertArray = gmanager.GetVertArray();
00230 
00231    switch (cap) {
00232       case GL_NORMAL_ARRAY: vertArray.SetNormalsValid(false); break;
00233       case GL_VERTEX_ARRAY: vertArray.SetVerticesValid(false); break;
00234       case GL_COLOR_ARRAY: vertArray.SetColorsValid(false); break;
00235       case GL_TEXTURE_COORD_ARRAY: vertArray.SetTexCoordsValid(false); break;
00236 
00237       case GL_INDEX_ARRAY:
00238       case GL_EDGE_FLAG_ARRAY:
00239          mNotImplemented( "capability = %d", cap );
00240          break;
00241    }
00242 }
00243 
00244 
00245 
00246 void glBegin( GLenum mode )
00247 {
00248    CGeomManager& gmanager = pGLContext->GetGeomManager();
00249    gmanager.BeginGeom( mode );
00250 }
00251 
00252 void glNormal3f( GLfloat x, GLfloat y, GLfloat z )
00253 {
00254    CGeomManager& gmanager = pGLContext->GetGeomManager();
00255    gmanager.Normal( cpu_vec_xyz(x, y, z) );
00256 }
00257 
00258 void glNormal3fv( const GLfloat *v )
00259 {
00260    glNormal3f( v[0], v[1], v[2] );
00261 }
00262 
00263 void glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
00264 {
00265    CGeomManager &gmanager = pGLContext->GetGeomManager();
00266    gmanager.Vertex( cpu_vec_xyzw(x, y, z, w) );
00267 }
00268 
00269 void glVertex4fv( const GLfloat *vertex )
00270 {
00271    glVertex4f( vertex[0], vertex[1], vertex[2], vertex[3] );
00272 }
00273 
00274 void glVertex3f( GLfloat x, GLfloat y, GLfloat z )
00275 {
00276    glVertex4f(x, y, z, 1.0f);
00277 }
00278 
00279 void glVertex3fv( const GLfloat *vertex )
00280 {
00281    glVertex4f( vertex[0], vertex[1], vertex[2], 1.0f );
00282 }
00283 
00284 void glTexCoord2f( GLfloat u, GLfloat v )
00285 {
00286    CGeomManager &gmanager = pGLContext->GetGeomManager();
00287    gmanager.TexCoord( u, v );
00288 }
00289 
00290 void glTexCoord2fv( const GLfloat *texCoord )
00291 {
00292    glTexCoord2f( texCoord[0], texCoord[1] );
00293 }
00294 
00295 void glColor3f( GLfloat red, GLfloat green, GLfloat blue )
00296 {
00297    CGeomManager &gmanager = pGLContext->GetGeomManager();
00298    gmanager.Color( cpu_vec_xyzw(red, green, blue, 1.0f) );
00299 }
00300 
00301 void glColor3fv( const GLfloat *color )
00302 {
00303    glColor3f( color[0], color[1], color[2] );
00304 }
00305 
00306 void glColor4f( GLfloat red, GLfloat green, GLfloat blue, GLfloat alpha )
00307 {
00308    CGeomManager &gmanager = pGLContext->GetGeomManager();
00309    gmanager.Color( cpu_vec_xyzw(red, green, blue, alpha) );
00310 }
00311 
00312 void glColor4fv( const GLfloat *color )
00313 {
00314    glColor4f( color[0], color[1], color[2], color[3] );
00315 }
00316 
00317 void glEnd( void )
00318 {
00319    CGeomManager &gmanager = pGLContext->GetGeomManager();
00320    gmanager.EndGeom();
00321 }
00322 
00323 /********************************************
00324  * pgl api
00325  */
00326 
00337 void pglNormalPointer( GLint size, GLenum type,
00338                        GLsizei stride, const GLvoid *ptr )
00339 {
00340    if ( stride != 0 ) {
00341       mNotImplemented( "stride must be 0" );
00342       return;
00343    }
00344    if ( type != GL_FLOAT ) {
00345       mNotImplemented( "type must be float" );
00346       return;
00347    }
00348    
00349    CVertArray &vertArray = pGLContext->GetGeomManager().GetVertArray();
00350    vertArray.SetNormals( (void*)ptr );
00351    vertArray.SetWordsPerNormal(size);
00352 }
00353 
00354 void pglDrawIndexedArrays( GLenum primType,
00355                            int numIndices, const unsigned char* indices,
00356                            int numVertices )
00357 {
00358    pGLContext->GetGeomManager().DrawIndexedArrays(primType, numIndices, indices, numVertices);
00359 }
00360 
00394 void
00395 pglRegisterCustomPrimType( GLenum primType,
00396                            pglU64_t requirements, pglU64_t rendererReqMask, int mergeContiguous )
00397 {
00398    mErrorIf( ! CGeomManager::IsUserPrimType(primType), "custom prim types must have bit 31 set" );
00399    CGeomManager::RegisterUserPrimType( primType, requirements, rendererReqMask, mergeContiguous );
00400 }
00401 
00408 void
00409 pglEnableCustom( pglU64_t flag )
00410 {
00411    flag &= ~(tU64)0xffffffff;
00412    pGLContext->GetGeomManager().EnableCustom( flag );
00413 }
00414 
00421 void
00422 pglDisableCustom( pglU64_t flag )
00423 {
00424    flag &= ~(tU64)0xffffffff;
00425    pGLContext->GetGeomManager().DisableCustom( flag );
00426 }
00427 
00428 void
00429 pglUserRenderContextChanged()
00430 {
00431    pGLContext->GetGeomManager().SetUserRenderContextChanged();
00432 }
00433 

ps2gl version cvs