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 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
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