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 glFlush( void )
00177 {
00178    CGeomManager& gmanager = pGLContext->GetGeomManager();
00179    gmanager.Flush();
00180 }
00181  // gl_api
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 

ps2gl version cvs