00001
00002
00003
00004
00005 #include <stdio.h>
00006
00007 #include "GL/ps2gl.h"
00008
00009 #include "ps2s/packet.h"
00010 #include "ps2s/cpu_matrix.h"
00011 #include "ps2s/math.h"
00012 #include "ps2s/displayenv.h"
00013
00014 #include "ps2gl/gmanager.h"
00015 #include "ps2gl/glcontext.h"
00016 #include "ps2gl/dlist.h"
00017 #include "ps2gl/clear.h"
00018 #include "ps2gl/matrix.h"
00019 #include "ps2gl/debug.h"
00020
00021
00022
00023
00024
00025 CVertArray::CVertArray()
00026 {
00027 Vertices = Normals = TexCoords = Colors = NULL;
00028 VerticesAreValid = NormalsAreValid = TexCoordsAreValid = ColorsAreValid = false;
00029 WordsPerVertex = WordsPerTexCoord = WordsPerColor = 0;
00030 WordsPerNormal = 3;
00031 }
00032
00033
00034
00035
00036
00037
00038
00039 CVertArray *CGeomManager::VertArray;
00040
00041 bool CGeomManager::DoNormalize = false;
00042
00043 CGeomManager::CGeomManager( CGLContext &context )
00044 : GLContext(context),
00045 CurNormal(0.0f, 0.0f, 0.0f),
00046 Vu1Prim(GL_INVALID_VALUE),
00047 InsideBeginEnd(false)
00048 {
00049 }
00050
00051
00052
00053
00054
00073 void glVertexPointer( GLint size, GLenum type,
00074 GLsizei stride, const GLvoid *ptr )
00075 {
00076 if ( stride != 0 ) {
00077 mNotImplemented( "stride must be 0" );
00078 return;
00079 }
00080 if ( type != GL_FLOAT ) {
00081 mNotImplemented( "type must be float" );
00082 return;
00083 }
00084
00085 CVertArray &vertArray = pGLContext->GetGeomManager().GetVertArray();
00086 vertArray.SetVertices( (void*)ptr );
00087 vertArray.SetWordsPerVertex( size );
00088 }
00089
00095 void glNormalPointer( GLenum type, GLsizei stride,
00096 const GLvoid *ptr )
00097 {
00098 pglNormalPointer( 3, type, stride, ptr );
00099 }
00100
00107 void glTexCoordPointer( GLint size, GLenum type,
00108 GLsizei stride, const GLvoid *ptr )
00109 {
00110 if ( stride != 0 ) {
00111 mNotImplemented( "stride must be 0" );
00112 return;
00113 }
00114 if ( type != GL_FLOAT ) {
00115 mNotImplemented( "type must be float" );
00116 return;
00117 }
00118
00119 CVertArray &vertArray = pGLContext->GetGeomManager().GetVertArray();
00120 vertArray.SetTexCoords( (void*)ptr );
00121 vertArray.SetWordsPerTexCoord( size );
00122 }
00123
00130 void glColorPointer( GLint size, GLenum type,
00131 GLsizei stride, const GLvoid *ptr )
00132 {
00133 if ( stride != 0 ) {
00134 mNotImplemented( "stride must be 0" );
00135 return;
00136 }
00137 if ( type != GL_FLOAT ) {
00138 mNotImplemented( "type must be float" );
00139 return;
00140 }
00141
00142 CVertArray &vertArray = pGLContext->GetGeomManager().GetVertArray();
00143 vertArray.SetColors( (void*)ptr );
00144 vertArray.SetWordsPerColor( size );
00145 }
00146
00158 void glDrawArrays( GLenum mode, GLint first, GLsizei count )
00159 {
00160 CGeomManager& gmanager = pGLContext->GetGeomManager();
00161 gmanager.DrawArrays( mode, first, count );
00162 }
00163
00167 void glFlush( void )
00168 {
00169 CGeomManager& gmanager = pGLContext->GetGeomManager();
00170 gmanager.Flush();
00171 }
00172
00174
00175 void glEnableClientState( GLenum cap )
00176 {
00177 CGeomManager& gmanager = pGLContext->GetGeomManager();
00178 CVertArray &vertArray = gmanager.GetVertArray();
00179
00180 switch (cap) {
00181 case GL_NORMAL_ARRAY: vertArray.SetNormalsValid(true); break;
00182 case GL_VERTEX_ARRAY: vertArray.SetVerticesValid(true); break;
00183 case GL_COLOR_ARRAY: vertArray.SetColorsValid(true); break;
00184 case GL_TEXTURE_COORD_ARRAY: vertArray.SetTexCoordsValid(true); break;
00185
00186 case GL_INDEX_ARRAY:
00187 case GL_EDGE_FLAG_ARRAY:
00188 mNotImplemented( "capability = %d", cap );
00189 break;
00190 }
00191 }
00192
00193 void glDisableClientState( GLenum cap )
00194 {
00195 CGeomManager &gmanager = pGLContext->GetGeomManager();
00196 CVertArray &vertArray = gmanager.GetVertArray();
00197
00198 switch (cap) {
00199 case GL_NORMAL_ARRAY: vertArray.SetNormalsValid(false); break;
00200 case GL_VERTEX_ARRAY: vertArray.SetVerticesValid(false); break;
00201 case GL_COLOR_ARRAY: vertArray.SetColorsValid(false); break;
00202 case GL_TEXTURE_COORD_ARRAY: vertArray.SetTexCoordsValid(false); break;
00203
00204 case GL_INDEX_ARRAY:
00205 case GL_EDGE_FLAG_ARRAY:
00206 mNotImplemented( "capability = %d", cap );
00207 break;
00208 }
00209 }
00210
00211
00212
00213 void glBegin( GLenum mode )
00214 {
00215 CGeomManager& gmanager = pGLContext->GetGeomManager();
00216 gmanager.BeginGeom( mode );
00217 }
00218
00219 void glNormal3f( GLfloat x, GLfloat y, GLfloat z )
00220 {
00221 CGeomManager& gmanager = pGLContext->GetGeomManager();
00222 gmanager.Normal( cpu_vec_xyz(x, y, z) );
00223 }
00224
00225 void glNormal3fv( const GLfloat *v )
00226 {
00227 glNormal3f( v[0], v[1], v[2] );
00228 }
00229
00230 void glVertex4f( GLfloat x, GLfloat y, GLfloat z, GLfloat w )
00231 {
00232 CGeomManager &gmanager = pGLContext->GetGeomManager();
00233 gmanager.Vertex( cpu_vec_xyzw(x, y, z, w) );
00234 }
00235
00236 void glVertex4fv( const GLfloat *vertex )
00237 {
00238 glVertex4f( vertex[0], vertex[1], vertex[2], vertex[3] );
00239 }
00240
00241 void glVertex3f( GLfloat x, GLfloat y, GLfloat z )
00242 {
00243 glVertex4f(x, y, z, 1.0f);
00244 }
00245
00246 void glVertex3fv( const GLfloat *vertex )
00247 {
00248 glVertex4f( vertex[0], vertex[1], vertex[2], 1.0f );
00249 }
00250
00251 void glTexCoord2f( GLfloat u, GLfloat v )
00252 {
00253 CGeomManager &gmanager = pGLContext->GetGeomManager();
00254 gmanager.TexCoord( u, v );
00255 }
00256
00257 void glTexCoord2fv( const GLfloat *texCoord )
00258 {
00259 glTexCoord2f( texCoord[0], texCoord[1] );
00260 }
00261
00262 void glColor3f( GLfloat red, GLfloat green, GLfloat blue )
00263 {
00264 CGeomManager &gmanager = pGLContext->GetGeomManager();
00265 gmanager.Color( cpu_vec_xyzw(red, green, blue, 1.0f) );
00266 }
00267
00268 void glEnd( void )
00269 {
00270 CGeomManager &gmanager = pGLContext->GetGeomManager();
00271 gmanager.EndGeom();
00272 }
00273
00274
00275
00276
00277
00285 void pglNormalPointer( GLint size, GLenum type,
00286 GLsizei stride, const GLvoid *ptr )
00287 {
00288 if ( stride != 0 ) {
00289 mNotImplemented( "stride must be 0" );
00290 return;
00291 }
00292 if ( type != GL_FLOAT ) {
00293 mNotImplemented( "type must be float" );
00294 return;
00295 }
00296
00297 CVertArray &vertArray = pGLContext->GetGeomManager().GetVertArray();
00298 vertArray.SetNormals( (void*)ptr );
00299 vertArray.SetWordsPerNormal(size);
00300 }