From 51a0968638a3011f97b728241205cf34a008f07a Mon Sep 17 00:00:00 2001 From: mattn Date: Thu, 26 Jun 2008 11:21:13 +0000 Subject: [PATCH] * fixed warnings * removed www dir (dead links, almost none of the posted links are available - correct me when i'm wrong, then we can revert this remove) git-svn-id: https://zerowing.idsoftware.com/svn/radiant/GtkRadiant/trunk@275 8a3a26a2-13c4-0310-b231-cf6edde360e5 --- libs/l_net/l_net_berkeley.c | 18 +- libs/mathlib/linear.c | 1 + libs/mathlib/m4x4.c | 37 ++-- libs/picomodel/picomodel.c | 211 +++++++++++----------- libs/picomodel/pm_ase.c | 93 +++++----- libs/picomodel/pm_obj.c | 6 +- plugins/vfspak/vfs.cpp | 41 +++-- plugins/vfspk3/vfs.cpp | 56 +++--- plugins/vfswad/vfs.cpp | 8 +- radiant/mainframe.cpp | 2 +- www/bug.shtml | 271 ---------------------------- www/coding.html | 154 ---------------- www/files.html | 166 ------------------ www/gtkradiant.html | 338 ----------------------------------- www/hosted.html | 170 ------------------ www/index.html | 339 ------------------------------------ www/reviews.html | 155 ----------------- 17 files changed, 237 insertions(+), 1829 deletions(-) delete mode 100644 www/bug.shtml delete mode 100644 www/coding.html delete mode 100644 www/files.html delete mode 100644 www/gtkradiant.html delete mode 100644 www/hosted.html delete mode 100644 www/index.html delete mode 100644 www/reviews.html diff --git a/libs/l_net/l_net_berkeley.c b/libs/l_net/l_net_berkeley.c index e7d0b961..e100b948 100644 --- a/libs/l_net/l_net_berkeley.c +++ b/libs/l_net/l_net_berkeley.c @@ -143,13 +143,13 @@ int WINS_Init(void) char buff[MAXHOSTNAMELEN]; struct sockaddr_s addr; char *p; - int r; -/* +/* linux doesn't have anything to initialize for the net - "Windows .. built for the internet .. the internet .. built with unix" + "Windows .. built for the internet .. the internet .. built with unix" */ #if 0 - WORD wVersionRequested; + int r; + WORD wVersionRequested; wVersionRequested = MAKEWORD(2, 2); @@ -432,7 +432,7 @@ static int PartialIPAddress (char *in, struct sockaddr_s *hostaddr) int addr; int num; int mask; - + buff[0] = '.'; b = buff; strcpy(buff+1, in); @@ -449,11 +449,11 @@ static int PartialIPAddress (char *in, struct sockaddr_s *hostaddr) mask<<=8; addr = (addr<<8) + num; } - + hostaddr->sa_family = AF_INET; ((struct sockaddr_in *)hostaddr)->sin_port = htons((u_short)net_hostport); ((struct sockaddr_in *)hostaddr)->sin_addr.s_addr = (myAddr & htonl(mask)) | htonl(addr); - + return 0; } //end of the function PartialIPAddress //=========================================================================== @@ -594,7 +594,7 @@ int WINS_Broadcast (int socket, byte *buf, int len) //=========================================================================== int WINS_Write(int socket, byte *buf, int len, struct sockaddr_s *addr) { - int ret, written; + int ret = 0, written; if (addr) { @@ -725,7 +725,7 @@ int WINS_GetAddrFromName(char *name, struct sockaddr_s *addr) if (name[0] >= '0' && name[0] <= '9') return PartialIPAddress (name, addr); - + hostentry = gethostbyname (name); if (!hostentry) return -1; diff --git a/libs/mathlib/linear.c b/libs/mathlib/linear.c index 7414c135..f6482201 100644 --- a/libs/mathlib/linear.c +++ b/libs/mathlib/linear.c @@ -52,6 +52,7 @@ int ludcmp(float **a, int n, int *indx, float *d) float big,dum,sum,temp; float *vv; + imax = 0; vv=(float*)malloc(sizeof(float)*n); *d=1.0; for (i=0;i i ) idst = ti-1; - + for ( tj = 0; tj < 4; tj++ ) { if ( tj < j ) @@ -740,7 +741,7 @@ void m4_submat( m4x4_t mr, m3x3_t mb, int i, int j ) else if ( tj > j ) jdst = tj-1; - + if ( ti != i && tj != j ) mb[idst*3 + jdst] = mr[ti*4 + tj ]; } @@ -752,15 +753,15 @@ float m4_det( m4x4_t mr ) float det, result = 0, i = 1; m3x3_t msub3; int n; - + for ( n = 0; n < 4; n++, i *= -1 ) { m4_submat( mr, msub3, 0, n ); - + det = m3_det( msub3 ); result += mr[n] * det * i; } - + return result; } @@ -770,21 +771,21 @@ int m4x4_invert(m4x4_t matrix) m3x3_t mtemp; int i, j, sign; m4x4_t m4x4_temp; - + if ( fabs( mdet ) < 0.0000000001 ) //% 0.0005 return 1; memcpy(m4x4_temp, matrix, sizeof(m4x4_t)); - + for ( i = 0; i < 4; i++ ) for ( j = 0; j < 4; j++ ) { sign = 1 - ( (i +j) % 2 ) * 2; - + m4_submat( m4x4_temp, mtemp, i, j ); - + matrix[i+j*4] = ( m3_det( mtemp ) * sign ) / mdet; } - + return 0; } diff --git a/libs/picomodel/picomodel.c b/libs/picomodel/picomodel.c index d7790c37..dcba41b1 100644 --- a/libs/picomodel/picomodel.c +++ b/libs/picomodel/picomodel.c @@ -161,17 +161,17 @@ picoModel_t *PicoLoadModel( char *fileName, int frameNum ) int bufSize; char *modelFileName, *remapFileName; - + /* init */ model = NULL; - + /* make sure we've got a file name */ if( fileName == NULL ) { _pico_printf( PICO_ERROR, "PicoLoadModel: No filename given (fileName == NULL)" ); return NULL; } - + /* load file data (buffer is allocated by host app) */ _pico_load_file( fileName, &buffer, &bufSize ); if( bufSize < 0 ) @@ -182,14 +182,14 @@ picoModel_t *PicoLoadModel( char *fileName, int frameNum ) /* get ptr to list of supported modules */ modules = PicoModuleList( NULL ); - + /* run it through the various loader functions and try */ /* to find a loader that fits the given file data */ for( ; *modules != NULL; modules++ ) { /* get module */ pm = *modules; - + /* sanity check */ if( pm == NULL) break; @@ -197,7 +197,7 @@ picoModel_t *PicoLoadModel( char *fileName, int frameNum ) /* module must be able to load */ if( pm->canload == NULL || pm->load == NULL ) continue; - + /* see whether this module can load the model file or not */ if( pm->canload( fileName, buffer, bufSize ) == PICO_PMV_OK ) { @@ -208,13 +208,13 @@ picoModel_t *PicoLoadModel( char *fileName, int frameNum ) _pico_free_file( buffer ); return NULL; } - + /* assign pointer to file format module */ model->module = pm; - + /* get model file name */ modelFileName = PicoGetModelFileName( model ); - + /* apply model remappings from .remap */ if( strlen( modelFileName ) ) { @@ -233,12 +233,12 @@ picoModel_t *PicoLoadModel( char *fileName, int frameNum ) _pico_free( remapFileName ); } } - + /* model was loaded, so break out of loop */ break; } } - + /* free memory used by file buffer */ if( buffer) _pico_free_file( buffer ); @@ -261,7 +261,7 @@ creates a new pico model picoModel_t *PicoNewModel( void ) { picoModel_t *model; - + /* allocate */ model = _pico_alloc( sizeof(picoModel_t) ); if( model == NULL ) @@ -269,7 +269,7 @@ picoModel_t *PicoNewModel( void ) /* clear */ memset( model,0,sizeof(picoModel_t) ); - + /* model set up */ _pico_zero_bounds( model->mins,model->maxs ); @@ -290,26 +290,26 @@ frees a model and all associated data void PicoFreeModel( picoModel_t *model ) { int i; - + /* sanity check */ if( model == NULL ) return; - + /* free bits */ if( model->name ) _pico_free( model->name ); - + /* free shaders */ for( i = 0; i < model->numShaders; i++ ) PicoFreeShader( model->shader[ i ] ); free( model->shader ); - + /* free surfaces */ for( i = 0; i < model->numSurfaces; i++ ) PicoFreeSurface( model->surface[ i ] ); free( model->surface ); - + /* free the model */ _pico_free( model ); } @@ -327,7 +327,7 @@ int PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces ) /* dummy check */ if( model == NULL ) return 0; - + /* bare minimums */ /* sea: null surface/shader fix (1s=>0s) */ if( numShaders < 0 ) @@ -342,11 +342,11 @@ int PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces ) if( !_pico_realloc( (void *) &model->shader, model->numShaders * sizeof( *model->shader ), model->maxShaders * sizeof( *model->shader ) ) ) return 0; } - + /* set shader count to higher */ if( numShaders > model->numShaders ) model->numShaders = numShaders; - + /* additional surfaces? */ while( numSurfaces > model->maxSurfaces ) { @@ -354,11 +354,11 @@ int PicoAdjustModel( picoModel_t *model, int numShaders, int numSurfaces ) if( !_pico_realloc( (void *) &model->surface, model->numSurfaces * sizeof( *model->surface ), model->maxSurfaces * sizeof( *model->surface ) ) ) return 0; } - + /* set shader count to higher */ if( numSurfaces > model->numSurfaces ) model->numSurfaces = numSurfaces; - + /* return ok */ return 1; } @@ -377,14 +377,14 @@ creates a new pico shader and returns its index. -sea picoShader_t *PicoNewShader( picoModel_t *model ) { picoShader_t *shader; - + /* allocate and clear */ shader = _pico_alloc( sizeof(picoShader_t) ); if( shader == NULL ) return NULL; memset( shader, 0, sizeof(picoShader_t) ); - + /* attach it to the model */ if( model != NULL ) { @@ -423,13 +423,13 @@ void PicoFreeShader( picoShader_t *shader ) /* dummy check */ if( shader == NULL ) return; - + /* free bits */ if( shader->name ) _pico_free( shader->name ); if( shader->mapName ) _pico_free( shader->mapName ); - + /* free the shader */ _pico_free( shader ); } @@ -444,12 +444,12 @@ finds a named shader in a model picoShader_t *PicoFindShader( picoModel_t *model, char *name, int caseSensitive ) { int i; - - + + /* sanity checks */ if( model == NULL || name == NULL ) /* sea: null name fix */ return NULL; - + /* walk list */ for( i = 0; i < model->numShaders; i++ ) { @@ -467,7 +467,7 @@ picoShader_t *PicoFindShader( picoModel_t *model, char *name, int caseSensitive else if( !_pico_stricmp( name, model->shader[ i ]->name ) ) return model->shader[ i ]; } - + /* named shader not found */ return NULL; } @@ -487,13 +487,13 @@ picoSurface_t *PicoNewSurface( picoModel_t *model ) { picoSurface_t *surface; char surfaceName[64]; - + /* allocate and clear */ surface = _pico_alloc( sizeof( *surface ) ); if( surface == NULL ) return NULL; memset( surface, 0, sizeof( *surface ) ); - + /* attach it to the model */ if( model != NULL ) { @@ -503,16 +503,16 @@ picoSurface_t *PicoNewSurface( picoModel_t *model ) _pico_free( surface ); return NULL; } - + /* attach */ model->surface[ model->numSurfaces - 1 ] = surface; surface->model = model; - + /* set default name */ sprintf( surfaceName, "Unnamed_%d", model->numSurfaces ); PicoSetSurfaceName( surface, surfaceName ); } - + /* return */ return surface; } @@ -526,18 +526,18 @@ frees a surface and all associated data void PicoFreeSurface( picoSurface_t *surface ) { int i; - - + + /* dummy check */ if( surface == NULL ) return; - + /* free bits */ _pico_free( surface->xyz ); _pico_free( surface->normal ); _pico_free( surface->index ); _pico_free( surface->faceNormal ); - + /* free arrays */ for( i = 0; i < surface->numSTArrays; i++ ) _pico_free( surface->st[ i ] ); @@ -545,7 +545,7 @@ void PicoFreeSurface( picoSurface_t *surface ) for( i = 0; i < surface->numColorArrays; i++ ) _pico_free( surface->color[ i ] ); free( surface->color ); - + /* free the surface */ _pico_free( surface ); } @@ -561,12 +561,12 @@ will always grow, never shrink int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, int numColorArrays, int numIndexes, int numFaceNormals ) { int i; - - + + /* dummy check */ if( surface == NULL ) return 0; - + /* bare minimums */ if( numVertexes < 1 ) numVertexes = 1; @@ -576,7 +576,7 @@ int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, numColorArrays = 1; if( numIndexes < 1 ) numIndexes = 1; - + /* additional vertexes? */ while( numVertexes > surface->maxVertexes ) /* fix */ { @@ -592,11 +592,11 @@ int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, if( !_pico_realloc( (void*) &surface->color[ i ], surface->numVertexes * sizeof( *surface->color[ i ] ), surface->maxVertexes * sizeof( *surface->color[ i ] ) ) ) return 0; } - + /* set vertex count to higher */ if( numVertexes > surface->numVertexes ) surface->numVertexes = numVertexes; - + /* additional st arrays? */ while( numSTArrays > surface->maxSTArrays ) /* fix */ { @@ -610,7 +610,7 @@ int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, surface->numSTArrays++; } } - + /* additional color arrays? */ while( numColorArrays > surface->maxColorArrays ) /* fix */ { @@ -624,7 +624,7 @@ int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, surface->numColorArrays++; } } - + /* additional indexes? */ while( numIndexes > surface->maxIndexes ) /* fix */ { @@ -632,7 +632,7 @@ int PicoAdjustSurface( picoSurface_t *surface, int numVertexes, int numSTArrays, if( !_pico_realloc( (void*) &surface->index, surface->numIndexes * sizeof( *surface->index ), surface->maxIndexes * sizeof( *surface->index ) ) ) return 0; } - + /* set index count to higher */ if( numIndexes > surface->numIndexes ) surface->numIndexes = numIndexes; @@ -665,7 +665,7 @@ picoSurface_t *PicoFindSurface( /* sanity check */ if( model == NULL || name == NULL ) return NULL; - + /* walk list */ for( i = 0; i < model->numSurfaces; i++ ) { @@ -1035,7 +1035,7 @@ picoShader_t *PicoGetModelShader( picoModel_t *model, int num ) return NULL; if( num < 0 || num >= model->numShaders ) return NULL; - + /* return the shader */ return model->shader[ num ]; } @@ -1060,7 +1060,7 @@ picoSurface_t *PicoGetModelSurface( picoModel_t *model, int num ) return NULL; if( num < 0 || num >= model->numSurfaces ) return NULL; - + /* return the surface */ return model->surface[ num ]; } @@ -1070,17 +1070,17 @@ picoSurface_t *PicoGetModelSurface( picoModel_t *model, int num ) int PicoGetModelTotalVertexes( picoModel_t *model ) { int i, count; - - + + if( model == NULL ) return 0; if( model->surface == NULL ) return 0; - + count = 0; for( i = 0; i < model->numSurfaces; i++ ) count += PicoGetSurfaceNumVertexes( model->surface[ i ] ); - + return count; } @@ -1089,17 +1089,17 @@ int PicoGetModelTotalVertexes( picoModel_t *model ) int PicoGetModelTotalIndexes( picoModel_t *model ) { int i, count; - - + + if( model == NULL ) return 0; if( model->surface == NULL ) return 0; - + count = 0; for( i = 0; i < model->numSurfaces; i++ ) count += PicoGetSurfaceNumIndexes( model->surface[ i ] ); - + return count; } @@ -1413,7 +1413,7 @@ picoVertexCombinationHash_t *PicoFindVertexCombinationInHashTable( picoVertexCom /* check normal */ if( (vertexCombinationHash->vcd.normal[ 0 ] != normal[ 0 ] || vertexCombinationHash->vcd.normal[ 1 ] != normal[ 1 ] || vertexCombinationHash->vcd.normal[ 2 ] != normal[ 2 ]) ) continue; - + /* check st */ if( vertexCombinationHash->vcd.st[ 0 ] != st[ 0 ] || vertexCombinationHash->vcd.st[ 1 ] != st[ 1 ] ) continue; @@ -1429,7 +1429,7 @@ picoVertexCombinationHash_t *PicoFindVertexCombinationInHashTable( picoVertexCom ( fabs(normal[ 1 ] - vertexCombinationHash->vcd.normal[ 1 ]) ) > HASH_NORMAL_EPSILON || ( fabs(normal[ 2 ] - vertexCombinationHash->vcd.normal[ 2 ]) ) > HASH_NORMAL_EPSILON ) continue; - + /* check st */ if( ( fabs(st[ 0 ] - vertexCombinationHash->vcd.st[ 0 ]) ) > HASH_ST_EPSILON || ( fabs(st[ 1 ] - vertexCombinationHash->vcd.st[ 1 ]) ) > HASH_ST_EPSILON ) @@ -1488,23 +1488,23 @@ fixme: needs non-naive algorithm int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t normal, int numSTs, picoVec2_t *st, int numColors, picoColor_t *color ) { int i, j; - - + + /* dummy check */ if( surface == NULL || surface->numVertexes <= 0 ) return -1; - + /* walk vertex list */ for( i = 0; i < surface->numVertexes; i++ ) { /* check xyz */ if( xyz != NULL && (surface->xyz[ i ][ 0 ] != xyz[ 0 ] || surface->xyz[ i ][ 1 ] != xyz[ 1 ] || surface->xyz[ i ][ 2 ] != xyz[ 2 ]) ) continue; - + /* check normal */ if( normal != NULL && (surface->normal[ i ][ 0 ] != normal[ 0 ] || surface->normal[ i ][ 1 ] != normal[ 1 ] || surface->normal[ i ][ 2 ] != normal[ 2 ]) ) continue; - + /* check st */ if( numSTs > 0 && st != NULL ) { @@ -1516,7 +1516,7 @@ int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t if( j != numSTs ) continue; } - + /* check color */ if( numColors > 0 && color != NULL ) { @@ -1528,11 +1528,11 @@ int PicoFindSurfaceVertexNum( picoSurface_t *surface, picoVec3_t xyz, picoVec3_t if( j != numColors ) continue; } - + /* vertex matches */ return i; } - + /* nada */ return -1; } @@ -1554,16 +1554,16 @@ void PicoFixSurfaceNormals( picoSurface_t *surface ) picoVec3_t votes[ MAX_NORMAL_VOTES ]; picoVec3_t *normals, diff; picoVec4_t plane; - - + + /* dummy check */ if( surface == NULL || surface->numVertexes == 0 ) return; - + /* fixme: handle other surface types */ if( surface->type != PICO_TRIANGLES ) return; - + /* allocate normal storage */ normals = _pico_alloc( surface->numVertexes * sizeof( *normals ) ); if( normals == NULL ) @@ -1571,16 +1571,16 @@ void PicoFixSurfaceNormals( picoSurface_t *surface ) _pico_printf( PICO_ERROR, "PicoFixSurfaceNormals: Unable to allocate memory for temporary normal storage" ); return; } - + /* zero it out */ memset( normals, 0, surface->numVertexes * sizeof( *normals ) ); - + /* walk vertex list */ for( i = 0; i < surface->numVertexes; i++ ) { /* zero out votes */ numVotes = 0; - + /* find all the triangles that reference this vertex */ for( j = 0, faceIndex = 0; j < surface->numIndexes; j += 3, faceIndex++ ) { @@ -1588,17 +1588,17 @@ void PicoFixSurfaceNormals( picoSurface_t *surface ) a = surface->index[ j ]; b = surface->index[ j + 1 ]; c = surface->index[ j + 2 ]; - + /* ignore degenerate triangles */ if( a == b || b == c || c == a ) continue; - + /* ignore indexes out of range */ if( a < 0 || a >= surface->numVertexes || b < 0 || b >= surface->numVertexes || c < 0 || c >= surface->numVertexes ) continue; - + /* test triangle */ if( a == i || b == i || c == i ) { @@ -1630,7 +1630,7 @@ void PicoFixSurfaceNormals( picoSurface_t *surface ) fabs( diff[ 2 ] ) < EQUAL_NORMAL_EPSILON ) break; } - + /* add a new vote? */ if( k == numVotes && numVotes < MAX_NORMAL_VOTES ) { @@ -1639,7 +1639,7 @@ void PicoFixSurfaceNormals( picoSurface_t *surface ) } } } - + /* tally votes */ if( numVotes > 0 ) { @@ -1647,7 +1647,7 @@ void PicoFixSurfaceNormals( picoSurface_t *surface ) _pico_zero_vec( normals[ i ] ); for( k = 0; k < numVotes; k++ ) _pico_add_vec( normals[ i ], votes[ k ], normals[ i ] ); - + /* normalize it */ if( _pico_normalize_vec( normals[ i ] ) ) { @@ -1662,7 +1662,7 @@ void PicoFixSurfaceNormals( picoSurface_t *surface ) } } } - + /* free normal storage */ _pico_free( normals ); } @@ -1689,21 +1689,21 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ) picoParser_t *p; picoByte_t *remapBuffer; int remapBufSize; - - + + /* sanity checks */ if( model == NULL || remapFile == NULL ) return 0; - + /* load remap file contents */ _pico_load_file( remapFile,&remapBuffer,&remapBufSize ); - + /* check result */ if( remapBufSize == 0 ) return 1; /* file is empty: no error */ if( remapBufSize < 0 ) return 0; /* load failed: error */ - + /* create a new pico parser */ p = _pico_new_parser( remapBuffer, remapBufSize ); if (p == NULL) @@ -1711,7 +1711,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ) /* ram is really cheap nowadays... */ _prm_error_return; } - + /* doo teh parse */ while( 1 ) { @@ -1725,7 +1725,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ) _pico_parse_skip_rest( p ); continue; } - + /* block for quick material shader name remapping */ /* materials { "m" (=>|->|=) "s" } */ if( !_pico_stricmp(p->token, "materials" ) ) @@ -1741,8 +1741,8 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ) { picoShader_t *shader; char *materialName; - - + + /* get material name */ if (_pico_parse( p,1 ) == NULL) break; if (!strlen(p->token)) continue; @@ -1807,7 +1807,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ) /* check square closing bracket */ if (!_pico_parse_check( p,0,"]" )) - _prm_error_return; + _prm_error_return; /* try to find material by name */ shader = PicoFindShader( model,tempMaterialName,0 ); @@ -1864,6 +1864,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ) color[ 0 ] = (picoByte_t)v[ 0 ]; color[ 1 ] = (picoByte_t)v[ 1 ]; color[ 2 ] = (picoByte_t)v[ 2 ]; + color[ 3 ] = 1; /* set new ambient color */ PicoSetShaderAmbientColor( shader,color ); @@ -1881,6 +1882,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ) color[ 0 ] = (picoByte_t)v[ 0 ]; color[ 1 ] = (picoByte_t)v[ 1 ]; color[ 2 ] = (picoByte_t)v[ 2 ]; + color[ 3 ] = 1; /* set new ambient color */ PicoSetShaderDiffuseColor( shader,color ); @@ -1898,6 +1900,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ) color[ 0 ] = (picoByte_t)v[ 0 ]; color[ 1 ] = (picoByte_t)v[ 1 ]; color[ 2 ] = (picoByte_t)v[ 2 ]; + color[ 3 ] = 1; /* set new ambient color */ PicoSetShaderSpecularColor( shader,color ); @@ -1908,7 +1911,7 @@ int PicoRemapModel( picoModel_t *model, char *remapFile ) } /* end 'materials[' */ } - + /* free both parser and file buffer */ _pico_free_parser( p ); _pico_free_file( remapBuffer ); @@ -1924,7 +1927,7 @@ A nice way to add individual triangles to the model. Chooses an appropriate surface based on the shader, or adds a new surface if necessary */ -void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** normals, +void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** normals, int numSTs, picoVec2_t **st, int numColors, picoColor_t **colors, picoShader_t* shader ) { @@ -1937,7 +1940,7 @@ void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** { workSurface = model->surface[i]; if ( workSurface->shader == shader ) - { + { break; } } @@ -1960,7 +1963,7 @@ void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** } /* add the triangle data to the surface */ - for ( i = 0 ; i < 3 ; i++ ) + for ( i = 0 ; i < 3 ; i++ ) { /* get the next free spot in the index array */ int newVertIndex = PicoGetSurfaceNumIndexes ( workSurface ); @@ -1970,13 +1973,13 @@ void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** /* the vertex wasn't found, so create a new vertex in the pool from the data we have */ if ( vertDataIndex == -1 ) - { + { /* find the next spot for a new vertex */ - vertDataIndex = PicoGetSurfaceNumVertexes ( workSurface ); + vertDataIndex = PicoGetSurfaceNumVertexes ( workSurface ); /* assign the data to it */ PicoSetSurfaceXYZ ( workSurface ,vertDataIndex , *xyz[i] ); - PicoSetSurfaceNormal ( workSurface , vertDataIndex , *normals[i] ); + PicoSetSurfaceNormal ( workSurface , vertDataIndex , *normals[i] ); /* make sure to copy over all available ST's and colors for the vertex */ for ( j = 0 ; j < numColors ; j++ ) @@ -1989,7 +1992,7 @@ void PicoAddTriangleToModel( picoModel_t *model, picoVec3_t** xyz, picoVec3_t** } } - /* add this vertex to the triangle */ + /* add this vertex to the triangle */ PicoSetSurfaceIndex ( workSurface , newVertIndex , vertDataIndex ); - } + } } diff --git a/libs/picomodel/pm_ase.c b/libs/picomodel/pm_ase.c index ae5698df..fc0a6d3b 100644 --- a/libs/picomodel/pm_ase.c +++ b/libs/picomodel/pm_ase.c @@ -37,7 +37,7 @@ SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. #define PM_ASE_C /* uncomment when debugging this module */ -//#define DEBUG_PM_ASE +//#define DEBUG_PM_ASE //#define DEBUG_PM_ASE_EX @@ -61,14 +61,14 @@ typedef struct aseSubMaterial_s struct aseSubMaterial_s* next; int subMtlId; picoShader_t* shader; - + } aseSubMaterial_t; typedef struct aseMaterial_s { struct aseMaterial_s* next; struct aseSubMaterial_s* subMtls; - int mtlId; + int mtlId; } aseMaterial_t; /* Material/SubMaterial management functions */ @@ -198,9 +198,6 @@ typedef struct aseFace_s /* ASE Face management functions */ void _ase_add_face( aseFace_t **list, aseFace_t **tail, aseFace_t *newFace ) { - aseFace_t* face = *list; - aseFace_t* tempFace = NULL; - /* insert as head of list */ if ( !(*list) ) { @@ -209,11 +206,11 @@ void _ase_add_face( aseFace_t **list, aseFace_t **tail, aseFace_t *newFace ) else { (*tail)->next = newFace; - } + } *tail = newFace; newFace->next = NULL; - + //tag the color indices so we can detect them and apply the default color to them newFace->index[6] = -1; newFace->index[7] = -1; @@ -258,36 +255,36 @@ static void _ase_free_faces (aseFace_t** list, aseFace_t** tail ) static int _ase_canload( PM_PARAMS_CANLOAD ) { picoParser_t *p; - - + + /* quick data length validation */ if( bufSize < 80 ) return PICO_PMV_ERROR_SIZE; - + /* keep the friggin compiler happy */ *fileName = *fileName; - + /* create pico parser */ p = _pico_new_parser( (picoByte_t*) buffer, bufSize ); if( p == NULL ) return PICO_PMV_ERROR_MEMORY; - + /* get first token */ if( _pico_parse_first( p ) == NULL) { return PICO_PMV_ERROR_IDENT; } - + /* check first token */ if( _pico_stricmp( p->token, "*3dsmax_asciiexport" ) ) { _pico_free_parser( p ); return PICO_PMV_ERROR_IDENT; } - + /* free the pico parser object */ _pico_free_parser( p ); - + /* file seems to be a valid ase file */ return PICO_PMV_OK; } @@ -329,14 +326,14 @@ static void _ase_submit_triangles ( picoSurface_t* surface , picoModel_t* model return; } } - + /* we pull the data from the surface using the facelist data */ for ( i = 0 ; i < 3 ; i ++ ) { xyz[i] = (picoVec3_t*) PicoGetSurfaceXYZ ( surface, face->index[ i ] ); - normal[i] = (picoVec3_t*) PicoGetSurfaceNormal( surface, face->index[ i ] ); + normal[i] = (picoVec3_t*) PicoGetSurfaceNormal( surface, face->index[ i ] ); st[i] = (picoVec2_t*) PicoGetSurfaceST ( surface, 0, face->index[ i + 3 ] ); - + if ( face->index [ i + 6] >= 0 ) { color[i] = (picoColor_t*)PicoGetSurfaceColor ( surface, 0, face->index[ i + 6 ] ); @@ -345,15 +342,15 @@ static void _ase_submit_triangles ( picoSurface_t* surface , picoModel_t* model { color[i] = &white; } - + } /* submit the triangle to the model */ PicoAddTriangleToModel ( model , xyz , normal , 1 , st , 1 , color , subMtl->shader ); /* advance to the next face */ - face = face->next; - } + face = face->next; + } } /* _ase_load: @@ -438,7 +435,7 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) //_ase_make_surface( model, &surface ); _ase_submit_triangles (surface, model ,materials,faces); _ase_free_faces (&faces,&facesTail); - + /* allocate new pico surface */ surface = PicoNewSurface( NULL ); if (surface == NULL) @@ -544,7 +541,7 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) PicoSetSurfaceIndex( surface, (index * 9 + 0), indexes[2] ); PicoSetSurfaceIndex( surface, (index * 9 + 1), indexes[1] ); PicoSetSurfaceIndex( surface, (index * 9 + 2), indexes[0] ); - + /* parse to the subMaterial ID */ while ( 1 ) { @@ -553,12 +550,12 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) { aseFace_t* newFace; int subMtlId; - + _pico_parse_int ( p , &subMtlId ); newFace = _pico_calloc ( 1 , sizeof ( aseFace_t )); - + /* we fix up the mtlId later when we parse the material_ref */ - newFace->mtlId = 0; + newFace->mtlId = 0; newFace->subMtlId = subMtlId; newFace->index[0] = indexes[2]; newFace->index[1] = indexes[1]; @@ -568,7 +565,7 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) break; } } - + } /* model texture vertex */ else if (!_pico_stricmp(p->token,"*mesh_tvert")) @@ -591,10 +588,10 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) /* get uv vertex t */ if (!_pico_parse_float( p,&uv[1] )) _ase_error_return("UV vertex parse error"); - + /* ydnar: invert t */ uv[ 1 ] = 1.0f - uv[ 1 ]; - + /* set texture vertex */ PicoSetSurfaceST( surface,0,index,uv ); } @@ -604,27 +601,27 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) picoIndex_t indexes[3]; int index; aseFace_t* face; - + /* we must have a valid surface */ if( surface == NULL ) continue; - + /* get face index */ if (!_pico_parse_int( p,&index )) _ase_error_return("Texture face parse error"); - + /* get 1st vertex index */ if (!_pico_parse_int( p,&indexes[0] )) _ase_error_return("Texture face parse error"); - + /* get 2nd vertex index */ if (!_pico_parse_int( p,&indexes[1] )) _ase_error_return("Texture face parse error"); - + /* get 3rd vertex index */ if (!_pico_parse_int( p,&indexes[2] )) _ase_error_return("Texture face parse error"); - + /* set face indexes (note interleaved offset!) */ PicoSetSurfaceIndex( surface, (index * 9 + 3), indexes[2] ); PicoSetSurfaceIndex( surface, (index * 9 + 4), indexes[1] ); @@ -664,7 +661,7 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) if (!_pico_parse_float( p,&colorInput )) _ase_error_return("color vertex parse error"); color[2] = (picoByte_t)(colorInput * 255); - + /* leave alpha alone since we don't get any data from the ASE format */ color[3] = 255; @@ -722,15 +719,15 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) picoColor_t ambientColor, diffuseColor, specularColor; char *mapname = NULL; int subMtlId, subMaterialLevel = -1; - - + + /* get material index */ _pico_parse_int( p,&index ); - + /* check brace */ if (!_pico_parse_check(p,1,"{")) _ase_error_return("Material missing opening brace"); - + /* parse material block */ while( 1 ) { @@ -775,7 +772,7 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) /* parse submaterial index */ if (!_pico_stricmp(p->token,"*submaterial")) - { + { /* allocate new pico shader */ _pico_parse_int( p , &subMtlId ); @@ -784,7 +781,7 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) { PicoFreeModel( model ); return NULL; - } + } subMaterialLevel = level; } /* parse material name */ @@ -793,7 +790,7 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) char* name = _pico_parse(p,0); if ( name == NULL) _ase_error_return("Missing material name"); - + strcpy ( materialName , name ); /* skip rest and continue with next token */ _pico_parse_skip_rest( p ); @@ -895,12 +892,12 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) /* get next token */ if (_pico_parse(p,1) == NULL) break; if (!strlen(p->token)) continue; - + /* handle levels */ if (p->token[0] == '{') sublevel++; if (p->token[0] == '}') sublevel--; if (!sublevel) break; - + /* parse diffuse map bitmap */ if (!_pico_stricmp(p->token,"*bitmap")) { @@ -956,7 +953,7 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) /* this is just a material with 1 submaterial */ subMaterial = _ase_add_submaterial( &materials, index, 0, shader ); } - + /* ydnar: free mapname */ if( mapname != NULL ) _pico_free( mapname ); @@ -965,7 +962,7 @@ static picoModel_t *_ase_load( PM_PARAMS_LOAD ) /* skip unparsed rest of line and continue */ _pico_parse_skip_rest( p ); } - + /* ydnar: finish existing surface */ // _ase_make_surface( model, &surface ); _ase_submit_triangles (surface, model ,materials,faces); diff --git a/libs/picomodel/pm_obj.c b/libs/picomodel/pm_obj.c index 6cb40668..95bc68a5 100644 --- a/libs/picomodel/pm_obj.c +++ b/libs/picomodel/pm_obj.c @@ -215,9 +215,10 @@ static void FreeObjVertexData( TObjVertexData *vertexData ) } } +#if 0 static int _obj_mtl_load( picoModel_t *model ) { - picoShader_t *curShader = NULL; + //picoShader_t *curShader = NULL; picoParser_t *p; picoByte_t *mtlBuffer; int mtlBufSize; @@ -258,7 +259,7 @@ static int _obj_mtl_load( picoModel_t *model ) p = _pico_new_parser( mtlBuffer, mtlBufSize ); if (p == NULL) _obj_mtl_error_return; - + /* doo teh .mtl parse */ while( 1 ) { @@ -477,6 +478,7 @@ static int _obj_mtl_load( picoModel_t *model ) /* return with success */ return 1; } +#endif /* _obj_load: * loads a wavefront obj model file. diff --git a/plugins/vfspak/vfs.cpp b/plugins/vfspak/vfs.cpp index 5b5a0299..f2bb8ac2 100644 --- a/plugins/vfspak/vfs.cpp +++ b/plugins/vfspak/vfs.cpp @@ -2,30 +2,30 @@ Copyright (c) 2001, Loki software, inc. All rights reserved. -Redistribution and use in source and binary forms, with or without modification, +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -Redistributions of source code must retain the above copyright notice, this list +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -Neither the name of Loki software nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior -written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Neither the name of Loki software nor the names of its contributors may be used +to endorse or promote products derived from this software without specific prior +written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // @@ -256,7 +256,7 @@ static GSList* vfsGetListInternal (const char *dir, const char *ext, bool direct files = g_slist_append (files, g_strdup (ptr)); } } - + for (i = 0; i < g_numDirs; i++) { strcpy (dirname, g_strDirs[i]); @@ -382,7 +382,6 @@ void vfsInitDirectory (const char *path) char filename[PATH_MAX]; //struct dirent *direntry; GDir *dir; - //GSList *dirlistptr; GSList *dirlist = NULL; if (g_numDirs == (VFS_MAXDIRS-1)) @@ -620,9 +619,9 @@ void vfsCleanFileName(char *in) const char* vfsBasePromptPath() { #ifdef _WIN32 - static char* path = "C:"; + static const char* path = "C:"; #else - static char* path = "/"; + static const char* path = "/"; #endif return path; } @@ -730,7 +729,7 @@ char* vfsGetFullPath(const char *in, int index, int flag) char *ptr,*lastptr; lastptr = file->name; - while (ptr = strchr(lastptr,'/')) + while ((ptr = strchr(lastptr,'/')) != NULL) lastptr = ptr+1; if (strcmp (lastptr, fixed) == 0) diff --git a/plugins/vfspk3/vfs.cpp b/plugins/vfspk3/vfs.cpp index 69578298..ec44fc9f 100644 --- a/plugins/vfspk3/vfs.cpp +++ b/plugins/vfspk3/vfs.cpp @@ -2,30 +2,30 @@ Copyright (c) 2001, Loki software, inc. All rights reserved. -Redistribution and use in source and binary forms, with or without modification, +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: -Redistributions of source code must retain the above copyright notice, this list +Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. -Neither the name of Loki software nor the names of its contributors may be used -to endorse or promote products derived from this software without specific prior -written permission. - -THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' -AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE -IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE -DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY -DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES -(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; -LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON -ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT -(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS -SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. +Neither the name of Loki software nor the names of its contributors may be used +to endorse or promote products derived from this software without specific prior +written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS'' +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE FOR ANY +DIRECT,INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES +(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; +LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON +ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT +(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS +SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ // @@ -336,7 +336,7 @@ static int vfsPakSort (const void *a, const void *b) { c2 = '/'; } - + // Arnout: note - sort pakfiles in reverse order. This ensures that // later pakfiles override earlier ones. This because the vfs module // returns a filehandle to the first file it can find (while it should @@ -353,7 +353,7 @@ static int vfsPakSort (const void *a, const void *b) return -1; } } while (c1); - + return 0; // strings are equal } @@ -370,7 +370,7 @@ void vfsInitDirectory (const char *path) { char filename[PATH_MAX]; GDir *dir; - GSList *dirlistptr, *dirlist = NULL; + GSList *dirlist = NULL; int iGameMode; // 0: no filtering 1: SP 2: MP if (g_numDirs == (VFS_MAXDIRS-1)) @@ -386,7 +386,7 @@ void vfsInitDirectory (const char *path) else if (strcmp (gamemode, "mp") == 0) iGameMode = 2; else - iGameMode = 0; + iGameMode = 0; } else iGameMode = 0; @@ -540,7 +540,7 @@ int vfsGetFileCount (const char *filename, int flag) for (lst = g_pakFiles; lst != NULL; lst = g_slist_next (lst)) { VFS_PAKFILE* file = (VFS_PAKFILE*)lst->data; - + if (strcmp (file->name, fixed) == 0) count++; } @@ -633,7 +633,7 @@ int vfsLoadFile (const char *filename, void **bufferptr, int index) ((char*) (*bufferptr))[file->size] = 0; i = unzReadCurrentFile (file->zipfile , *bufferptr, file->size); - unzCloseCurrentFile (file->zipfile); + unzCloseCurrentFile (file->zipfile); if (i > 0) return file->size; else @@ -670,7 +670,7 @@ char* vfsExtractRelativePath_short(const char *in, bool shorten) Sys_Printf("vfsExtractRelativePath: %s\n", in); #endif -#ifdef _WIN32 +#ifdef _WIN32 if (shorten) { // make it short @@ -690,7 +690,7 @@ char* vfsExtractRelativePath_short(const char *in, bool shorten) #else strcpy(l_in, in); vfsCleanFileName(l_in); -#endif // ifdef WIN32 +#endif // ifdef WIN32 #ifdef DBG_RLTPATH @@ -804,7 +804,7 @@ char* vfsGetFullPath(const char *in, int index, int flag) char *ptr,*lastptr; lastptr = file->name; - while (ptr = strchr(lastptr,'/')) + while ((ptr = strchr(lastptr,'/')) != NULL) lastptr = ptr+1; if (strcmp (lastptr, fixed) == 0) @@ -844,10 +844,10 @@ char* vfsGetFullPath(const char *in, int index, int flag) // or .. add an API so that the base prompt can be set during VFS init const char* vfsBasePromptPath() { -#ifdef _WIN32 - static char* path = "C:"; +#ifdef _WIN32 + static const char* path = "C:"; #else - static char* path = "/"; + static const char* path = "/"; #endif return path; } diff --git a/plugins/vfswad/vfs.cpp b/plugins/vfswad/vfs.cpp index 251fc704..b6e69823 100644 --- a/plugins/vfswad/vfs.cpp +++ b/plugins/vfswad/vfs.cpp @@ -398,8 +398,6 @@ void vfsInitDirectory (const char *path) // (for instance when modifying the project settings) void vfsShutdown () { - wadFile_t *tmpptr; - while (g_wadFiles) { wadCleanup((wadFile_t *)g_wadFiles->data); @@ -710,7 +708,7 @@ char* vfsGetFullPath(const char *in, int index, int flag) char *ptr,*lastptr; lastptr = file->name; - while (ptr = strchr(lastptr,'/')) + while ((ptr = strchr(lastptr,'/')) != NULL) lastptr = ptr+1; if (strcmp (lastptr, fixed) == 0) @@ -750,9 +748,9 @@ char* vfsGetFullPath(const char *in, int index, int flag) const char* vfsBasePromptPath() { #ifdef _WIN32 - static char* path = "C:"; + static const char* path = "C:"; #else - static char* path = "/"; + static const char* path = "/"; #endif return path; } diff --git a/radiant/mainframe.cpp b/radiant/mainframe.cpp index f894ffb2..2ccd2c38 100644 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@ -4614,7 +4614,7 @@ void MainFrame::OnPrefs() bool bPluginToolbar = g_PrefsDlg.m_bPluginToolbar; int nShader = g_PrefsDlg.m_nShader; int nTextureQuality = g_PrefsDlg.m_nTextureQuality; - int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses; +// int nLightRadiuses = g_PrefsDlg.m_nLightRadiuses; g_PrefsDlg.LoadPrefs(); if (g_PrefsDlg.DoModal() == IDOK) diff --git a/www/bug.shtml b/www/bug.shtml deleted file mode 100644 index dfea47be..00000000 --- a/www/bug.shtml +++ /dev/null @@ -1,271 +0,0 @@ - - - - QERadiant.com | Bug Report Form - - - - -
- - - - - - - - - - - - -
-
- - - - - - - - -
- - - - - - - - - - - - - - - - - -
QERadiant is FREE. It is based on the source code released by id software for QE4 (the editor they used to make Quake2). Do NOT send me or ask to send me money or compensation of any kind. If you have extra money laying around, give it to a good abused children's charity.
- - - - - - -

- -There are many versions of Radiant out there. It is very common that a company -would release the tools they used to make a game. That's how we have KPRadiant, -SoFRadiant, FAKKRadiant etc.

- -We are mainly providing support and looking forward to hear bug reports about -the main version we are working on, GtkRadiant. We don't have the resources nor the possibility to -support other versions. (NOTE: if we can direct you somewhere else for help on a -particular editor we can put links here)

- -Before you submit something, make sure you are on topic: the right editor -(latest version), and an editor related problem (a crash, misbehaviour, a -feature suggestion). We won't answer mapping questions like "how do I do a sky -shader" or "how does func_pendulum work". Try the FAQ to find links and -forums about mapping stuff.

- -The leading cause of radiant crashes is video card drivers. It doesn't matter -how new the drivers are, they can still have bugs in them that will crash -Radiant. Most of the time this is due to lack of full featured drivers. Radiant -uses much more of the OpenGL set than quake & derivatives of.

- -There is a bunch of resources you should read before reporting a bug, The better -the bug report, the most chances you have to see it solved in next release. Be -sure to read the FAQ Item about bug reports.

- -Please only use this form for bug reports you find within the latest version of -GtkRadiant. All submissions dealing with versions of GtkRadiant that are not the -current version will be ignored. Thank you.

- -
- -

-
- - -What CPU do you own?: 

- -What Video Card do you own?: 

-What 3d video card do you own?: 

- -What video drivers are you using?: 

-What opengl drivers are being used?: 

- -How much Ram do you have?: 

-How much hard drive space do is available?: 

- -What operating system are you running?: 

-What version of Radiant are you using?: 

- -What is your E-MAIL address?: 

- -What is the error?: 

-What did you perform to cause the error?: 

- - -

- -

  
-
- - - - - - -
-
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Main
Tutorials / Tips
Plugins / Coding
Hosted Sites
Bug Report
Reviews
Interviews
Forums
Files
Gamedesign.net
Links
Credits / Staff
- -

 

- - - - - - -

- -
-
- -
- - - - - - - - - -
Main - Tutorials / Tips - Plugins / Coding - Hosted Sites - Bug Report - Reviews - Interviews - Forums - Files - Gamedesign.net - Links - Credits / Staff
- -
- - - - diff --git a/www/coding.html b/www/coding.html deleted file mode 100644 index ef6e3d91..00000000 --- a/www/coding.html +++ /dev/null @@ -1,154 +0,0 @@ - - - QERadiant.com - QERadiant plugins - - - -
- - - - - - - - - - - - -
- - - - - -
- - - - - - - - - - - -
QERadiant is FREE. It is based on the source code released by id software for QE4 (the editor they used to make Quake2). Do NOT send me or ask to send me money or compensation of any kind. If you have extra money laying around, give it to a good abused children's charity.
- - 
Coding - updated Thursday, May 25, 2000 -

-Q3Radiant 199 Plugin SDK. more info soon

-QERadiant plugin API documentation. -
NOTE: this is documentation for QERadiant Build 147. But the info is still true for Q3Radiant.

-QERadiant 147 Plugin coding SDK. (See files for download)
-

-
-
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Qeradiant Home
Plugins Home
Plugins Coding
Hosted Plugins
Plugin Reviews
Plugin Files
FAQ
Interviews
Forums
Gamedesign.net
Links
Credits & Staff
-

 

- - - - -

-
-
-
- - - - - - -
- - QERadiant Home - - Plugins Home - - Plugins Coding - - Hosted Plugins - - Plugin Reviews - - Plugin Files - - Interviews - - Forums - - Gamedesign.net - - Links - - Credits & Staff - -
-
- - \ No newline at end of file diff --git a/www/files.html b/www/files.html deleted file mode 100644 index d5225278..00000000 --- a/www/files.html +++ /dev/null @@ -1,166 +0,0 @@ - - - QERadiant.com - QERadiant plugins - - - -
- - - - - - - - - - - - -
- - - - - -
- - - - - - - - - - - -
QERadiant is FREE. It is based on the source code released by id software for QE4 (the editor they used to make Quake2). Do NOT send me or ask to send me money or compensation of any kind. If you have extra money laying around, give it to a good abused children's charity.

For Q3Radiant plugins, go to the -main files section
- - 
Files -
-
-QERadiant 147 files:
-MGS download page.
-Rogue plugin binaries.
-Rogue plugin sources.
-Plugin coding SDK.
-

Reviews - Zipped versions -
-
-QERadiant 147 reviews:
-Rogue plugins review.
-Half-Life plugin review. -
-
- - - - - - - - - - - - - - - - - - - - - - -
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
Qeradiant Home
Plugins Home
Plugins Coding
Hosted Plugins
Plugin Reviews
Plugin Files
FAQ
Interviews
Forums
Gamedesign.net
Links
Credits & Staff
-

 

- - - - -

-
-
-
- - - - - - -
- - QERadiant Home - - Plugins Home - - Plugins Coding - - Hosted Plugins - - Plugin Reviews - - Plugin Files - - Interviews - - Forums - - Gamedesign.net - - Links - - Credits & Staff - -
-
- - diff --git a/www/gtkradiant.html b/www/gtkradiant.html deleted file mode 100644 index 71cb178b..00000000 --- a/www/gtkradiant.html +++ /dev/null @@ -1,338 +0,0 @@ - -
GTKRadiant 1.1 beta
-
-
- - - - - -Installation -
- -GtkRadiant 1.1 beta is available for Windows and Linux. Quake III Arena editing -is the only game supported so far. You can get the setup files from several -mirrors:
- -
-
- -3DDownloads
- -Loki's -ftp
- -Fileplanet: Linux Win32 (full) Win32 -(patch)
- -French mirror at Quakexpert.com
- -
- -
-Win32 Installation instructions:
- -Grab one of the two setups: a full installation or an upgrade. If you don't know -what to choose, get the full setup (GtkRadiantSetup-1.1-beta.zip 8Mb), if you have a working -installation of Q3Radiant above 199, or GtkRadiant Alpha, get the patch (GtkRadiantSetup-1.1-beta-patch.zip 4Mb). GtkRadiant -installation doesn't interfere with your current Q3Radiant installation: -everything will be installed under GtkRadiant/ (whereas usual path for Q3Radiant -is Tools/) and a new file quakev2.qe4 will be installed in baseq3/scripts/ - -
- -
-Linux Installation:
- -Get linuxq3sdk-1.1b.x86.run. Once downloaded, execute it from your -favorite shell (as root).
NOTE: this is the full Quake III Arena SDK, it -will install the game source and mod tools as well. - -
- - - - -Getting started -
- -Some features in GtkRadiant have undergone major changes compared to Q3Radiant. -The main difference is the use of Gtk for all the widgets (buttons, lists, -dialog boxes). It looks and feels different but you'll get used to it quickly. -We believe the Gtk toolkit brings a great deal of clarity to the interface.
- -
- -
- -Scroll down to see the full changelog for GtkRadiant. Since it is pretty huge -I'll only go over the new functionalities. - -
- -
- -
  • - -Compilation monitoring: GtkRadiant comes with a modified version of q3map that -reports to GtkRadiant through the network. You get the output of q3map in the -console window. And the compiling errors can be processed. So far it detects -leaks, bad brush planes and winding errors. This requires using the version 2 -project files (the newest ones). You can still use the classic compilation -process and set a few options in the preferences: see the 'BSP monitoring' -in the preferenes dialog (Edit > Preferences).
    - -
  • - -Sleep mode: you can put Radiant to sleep and have it release all the GL stuff. -Very handy to run Quake 3 Arena engine without eating too much GL resources. -You can trigger sleep mode by hand from File > Sleep, or turn it on -automatically in the BSP monitoring prefs. Expect waking up from sleep mode to -be about the same speed as loading the map -(you need to reload all the textures).
    - -
  • - -Improved q3map: the version of q3map that comes in GtkRadiant has been optimized -to require less memory for normal use. The 1.0q version of q3map allocates around -75Mb of RAM on startup. This new version shrinks the startup memory allocation -by around 45Mb, bringing the minimum requirements around 30Mb. Then it will -dynamically allocate as needed. These changes need a lot of testing, don't -hesitate to send some feedback. - -
  • - -The project file format has changed a bit. The new format (version 2) is in -baseq3/scripts/quakev2.qe4 (it will be loaded by default at startup). Some of -the new features of GtkRadiant rely on this new format, old one is still -supported but you should move to the new one. We are using a template scheme: -when you load quakev2.qe4 a custom project file will be generated and saved for -you in baseq3/scripts/user0.qe4. If you have custom BSP commands, you can edit -that resulting userxx.qe4 to add your stuff. (see below for the new BSP process -monitoring)
    - -
  • - -Inspectors: the increments steps are now available in the surface inspector -(S) and in the patch inspector (Shift+S). The keyboard shortcuts Shift+Arrows -are following these increment steps as well. - -
  • - -Radiant is no longer using the windows registry. All settings are stored in -radiant.ini and savedinfo.bin under the radiant directory (i.e. same directory -as the binary)
    - -
  • - -The shortcut keys file has changed name from radiant.ini to shortcuts.ini and a -bit changed syntax. See shortcuts.ini.sample in the distribution for a -sample.
    - -
  • - - - - -Feedback and discussion -
    - -This is a beta release. We consider it to be ready for production use. It has -been in internal testing for a while, the main problems remaining would be -driver or OS related, so we are tagging it as beta. Overall we will bring -minor improvements until the final release (bringing more plugins in and -fixing issues that will appear). Brand new functionalities will go in 1.2
    - -
    -
    - -
  • - -The documentation is outdated. We'll have a new version of the manual ready. -Until then this page, the faq, the newsgroup and the forum are the best -references.
    - -
  • - -
    -QERadiant.com is preparing a site reorganization to handle the newcomer GtkRadiant. The developpement team has grown bigger since Loki Software is involved in the project. They are providing most of the resources (cvs server, mailing list, bug tracking and newsgroup). As time goes we'll open the developpement more and more. For now we are providing the following for feedback and discussion:
    - -
  • - -The Quake 3 World editing forum is a good place for end user discussion.
    - -
  • - -Technical topics (specific crashes, driver issues etc.) should be discussed on the newsgroup loki.games.q3sdk. Be sure to specify the version of GtkRadiant you are using, the details of your hardware and the platform you are running GtkRadiant on (windows or linux).
    - -
  • - -You can view our current list of bugs on fenris, the bug tracking server. You can report problems there. Run a query with the Q3SDK program and MapEditor component.
    - -
  • - -IRC! .. most of us are IRC whores .. idling a lot on irc.telefragged.com #qeradiant
    - -
  • - - - - -Credits -
    -Waaa... so many people involved in that project, trying to list a few (this is the GtkRadiant contributors, for qeradiant.com see the staff page):
    -Loki:
    -Leonardo Zide leo@lokigames.com
    -Mike Phillips (early testing)
    -Bernd Kreimeier (overall coordination)
    -QER.com:
    -TTimo timo@qeradiant.com
    -^Fishman (Pablo Zurita) fish@gamedesign.net
    -Curry plugin Team:
    -Mike "mickey" Jackman
    -Tim "Maj" Rennie
    -William "SmallPileOfGibs" Joseph
    -PrtView plugin, various bug fixes and q3map guru:
    -Geoffrey DeWan
    -Updated shader files, textures, entities.def, keyboard shortcut list and< -overall testing / feedback:
    -Jean-Francois "Eutectic" Groleau
    -Improvements and bug fixing to the editor:
    -Jan Paul "MrElusive" van Waveren, Robert Duffy
    -Web:
    -Dave "Bargle" Koenig and Jason "Wolfen" Spencer
    -FAQ:
    -Equim and Wex
    -Thanks to everyone on the beta mailing list and irc.telefragged.com -#qeradiant -for testing and feedback.
    -
    - - - - - -Changelog -
    -
    -GtkRadiant 1.1 beta Changes
    ----------------------------
    -
    -MrElusive:
    -- bspc 2.1c, MAX_MAPFILE_PLANES bumped up (needed on big maps)
    -
    -G_Dewan:
    -- fix to BSP menu order getting mixed up
    -- fix to bogus noshader error message in q3map
    -- suppressed winsock2 dependency, only requires winsock1 now
    -- improved q3map, reducing minimal memory footprint by about 45Mb
    -
    -leo:
    -- Fixed q3map crashing if visbytes is greater than the maximum allowed
    -- fixed texture window not scrolling when last texture is large
    -- Fixed q3map Makefile
    -- Fixed +/- numpad keys not working in win32
    -- Fixed Alt shortcuts not working in win32
    -- fixed prefab path and user ini in preferences dialog
    -- fixed add/remove bsp items in project settings dialog
    -- fixed some console not working in view #3
    -- fixed warning when exiting in views #2 #3
    -- Fixed patch inspector not showing after it has been closed
    -- Fixed load window position bug (saved pos greater than screen resolution)
    -- Fixed selection nudge bug
    -- fixed Z window not shrinking small enough in floating windows mode (win32)
    -- Improved entity windows layout
    -- Added 'Reset' button to entity dialog
    -- added LOD for patches, see in prefs for the LOD you want to display on patches
    -- no more DOS dialog box under windows, Gtk errors and warnings are
    -redirected to the console
    -- remember size/position of the entities dialog
    -- new 128 and 256 grid
    -
    -- added shift+rclick+mouse move to zoom in/out of the view
    -(way cool feature! check it out!)
    -
    -TTimo:
    -- fixed the Region commands, "Region > Set brush" is working
    -Region uses the camera as spawn point.
    -- updated quakev2.qe4 with -vlight options
    -- added checks in q3map to prevent crashing on allocating a winding too big.
    -- improved snapshots behaviour, doesn't snapshot non-modified maps
    -- improved the CycleCapTexturePatch command, now cycle across the 3 planes only 
    -and works on multiple patches in one shot
    -- fixed the help menu, Help > Help or F1 will try to open the Q3Radiant manual 
    -(if you have office installed) (Help > Links also fixed)
    -- surface inspector allows to change increments steps and stores them in 
    -registry. General behaviour of the surface inspector has been reworked. Undo 
    -works better on the surface inspector.
    -- shift+arrows shortcuts now match the increments from the surface inspector
    -- button 'Match Grid' in the SI to set the increment to current grid
    -
    -- debug stream between GtkRadiant 1.1 and q3map:
    -As with the Alpha version, q3map connects to Q3Radiant to report on it's 
    -progress. The progress reporting code has been enhanced with an XML stream. If 
    -your map has errors that need geometry information to be fixed, Radiant can help 
    -you out. To get a grip on this feature, load baseq3/maps/museum.map and compile 
    -it (with BSP monitoring turned on of course).
    -
    -- cleaned the entity inspector window, better layout management
    -
    -- two new items in the View > Show menu:
    -the X, Y and Z axis have been assigned colors (Z: Red, X: Green, Y: Blue)
    -Show outline draws a colored outline around your view, helping you know what 
    -view is currently active.
    -Show Axes will draw a small axis base in the upper left corner
    -
    -GtkRadiant alpha version Changes
    ---------------------------------
    -
    -MrElusive:
    --q3map 1.0q: fixed a bug in q3map that sometimes cause mapobjects not to be lit
    -
    -G_Dewan:
    --more arrows drawn on entities with relevant angle information
    -
    -Fishman:
    --antialiased lines
    -
    -leo & TTimo:
    -- based on Q3Radiant 202
    -- patched q3map with network code
    -- shortcut keys are now in shortcuts.ini
    -the syntax has changed a bit, no spaces between the '='
    -see shortcuts.sample
    -- no longer using the registry, settings are stored in radiant.ini and savedinfo.bin
    -in Radiant directory
    -- project settings templates:
    -the project settings file format has changed a bit.
    -it has version information now, and the setups come with a new quakev2.qe4 file
    -the project files are true templates, Radiant will read them and then store actual
    -project settings it uses in baseq3/scripts/user0.qe4 user1.qe4 etc.
    -- new compilation monitoring
    -GtkRadiant comes with a modified version of q3map that reports to GtkRadiant through
    -the network. You get the output of q3map in the console window. And the compiling
    -errors can be processed (currently it detects leaks)
    -- sleep mode:
    -before running Quake 3 Arena to playtest your maps, you can put Radiant to sleep:
    -manually with File > Sleep command
    -automatic if you compile and set "Activate sleep mode when running the engine"
    -
    -
    - -
    diff --git a/www/hosted.html b/www/hosted.html deleted file mode 100644 index 1ed7165e..00000000 --- a/www/hosted.html +++ /dev/null @@ -1,170 +0,0 @@ - - - QERadiant.com - QERadiant plugins - - -
    - - - - - - - - - - - - -
    - - - - - -
    - - - - - - - - - - - -
    QERadiant is FREE. It is based on the source code released by id software for QE4 (the editor they used to make Quake2). Do NOT send me or ask to send me money or compensation of any kind. If you have extra money laying around, give it to a good abused children's charity.
    - - 
    Hosted plugins -

    -MGS
    -MGS is a toolbox for map makers .. check out the numerous features ! -
    NOTE: the MGS plugin is for QERadiant build 147, it's not available for Q3Radiant yet
    -
    -Halflife
    -Wanna edit half-life with Radiant? Grab the plugin! -
    NOTE: the halflife plugin is for QERadiant build 147, it's not available for Q3Radiant
    -
    -TexTool
    Texture manipulation tools (online documentation)
    -
    -DeQbsp3
    Q2 BSP to Q3 MAP converter (online documentation)
    - - 
    Other QERadiant plugins -

    -GenSurf
    -GenSurf can create great natural-looking surfaces for you ... and it's for Q3Radiant! -

    -Q3Build
    -Home of Q3Build ... check there for news / update / help .. -

    -Curry
    -The GPL shader preview and editing software -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Qeradiant Home
    Plugins Home
    Plugins Coding
    Hosted Plugins
    Plugin Reviews
    Plugin Files
    FAQ
    Interviews
    Forums
    Gamedesign.net
    Links
    Credits & Staff
    -

     

    - - - - -

    -
    -
    -
    - - - - - - -
    - - QERadiant Home - - Plugins Home - - Plugins Coding - - Hosted Plugins - - Plugin Reviews - - Plugin Files - - Interviews - - Forums - - Gamedesign.net - - Links - - Credits & Staff - -
    -
    - - diff --git a/www/index.html b/www/index.html deleted file mode 100644 index 77f21d73..00000000 --- a/www/index.html +++ /dev/null @@ -1,339 +0,0 @@ - - - - - QERadiant.com - QERadiant plugins - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - -
    QERadiant is FREE. It is based on the source code released by id software for QE4 (the editor they used to make Quake2). Do NOT send me or ask to send me money or compensation of any kind. If you have extra money laying around, give it to a good abused children's charity.
    - - 
    Plugins for Q3Radiant 200 - Thursday, June 25, 2000 -
    - -Here is the current list of plugins publicly available for Q3Radiant 200. If you are writing a plugin for Q3R and are -not listed here let me know so I can add you. Plugin SDK for 200 will be released shortly.

    -bobToolz - detect overlapping brushes
    -Curry - shader preview and editing
    -Q3Build - a frontend to the BSP tools
    -GenSurf - surface generator
    -TexTool - Texture manipulation tools (online documentation)
    -PrtView - Portal viewer for map optimisations
    -Pk3Man - A pk3 manipulation plugin
    -MGS - all-purpose tools for MAP manipulations (no official release yet)

    - -See the plugins file section for -some downloads.
    - -If you want to code your own plugins, need help/ideas/stuff .. get on the mailing list: - - -
    -
    - - - - - - - - - - -
    - Subscribe to Radiant plugins coding -
    - - - -
    - radiant-plugins - archive - - Hosted by - eGroups.com -
    -
    -
    - -You can also meet the staff on irc.telefragged.com #qeradiant - -
    - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Qeradiant Home
    Plugins Home
    Plugins Coding
    Hosted Plugins
    Plugin Reviews
    Plugin Files
    FAQ
    Interviews
    Forums
    Gamedesign.net
    Links
    Credits & Staff
    - -

     

    - - - - - - - - - -

    - -
    - -
    - -
    - - - - - - - - - - - - - -
    - - - - QERadiant Home - - - Plugins Home - - - Plugins Coding - - - Hosted Plugins - - - Plugin Reviews - - - Plugin Files - - - Interviews - - - Forums - - - Gamedesign.net - - - Links - - - Credits & Staff - - - -
    - -
    - - - - - diff --git a/www/reviews.html b/www/reviews.html deleted file mode 100644 index 9c4e17e2..00000000 --- a/www/reviews.html +++ /dev/null @@ -1,155 +0,0 @@ - - - QERadiant.com - QERadiant plugins - - - -
    - - - - - - - - - - - - -
    - - - - - -
    - - - - - - - - - - - -
    QERadiant is FREE. It is based on the source code released by id software for QE4 (the editor they used to make Quake2). Do NOT send me or ask to send me money or compensation of any kind. If you have extra money laying around, give it to a good abused children's charity.
    - - 
    Reviews - Sunday, May 30, 1999 -

    -QERadiant 147 plugins Review:
    -
    -Half-Life plugin review brought to you by Kramit

    -Rogue plugins review

    -

    - -
    -
    - - - - - - - - - - - - - - - - - - - - - - -
    - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
    Qeradiant Home
    Plugins Home
    Plugins Coding
    Hosted Plugins
    Plugin Reviews
    Plugin Files
    FAQ
    Interviews
    Forums
    Gamedesign.net
    Links
    Credits & Staff
    -

     

    - - - - -

    -
    -
    -
    - - - - - - -
    - - QERadiant Home - - Plugins Home - - Plugins Coding - - Hosted Plugins - - Plugin Reviews - - Plugin Files - - Interviews - - Forums - - Gamedesign.net - - Links - - Credits & Staff - -
    -
    - - -- 2.39.2