From: Rudolf Polzer Date: Mon, 14 May 2012 18:57:25 +0000 (+0200) Subject: make whitespace match master better X-Git-Url: https://git.rm.cloudns.org/?a=commitdiff_plain;h=cdf98d81c7c545929a455339c3091f171a95bf8b;p=xonotic%2Fnetradiant.git make whitespace match master better --- diff --git a/tools/quake3/q3map2/map.c b/tools/quake3/q3map2/map.c index 36b45e04..22a85b2b 100644 --- a/tools/quake3/q3map2/map.c +++ b/tools/quake3/q3map2/map.c @@ -41,16 +41,16 @@ /* FIXME: remove these vars */ /* undefine to make plane finding use linear sort (note: really slow) */ -#define USE_HASHING -#define PLANE_HASHES 8192 +#define USE_HASHING +#define PLANE_HASHES 8192 -int planehash[ PLANE_HASHES ]; +int planehash[ PLANE_HASHES ]; -int c_boxbevels; -int c_edgebevels; -int c_areaportals; -int c_detail; -int c_structural; +int c_boxbevels; +int c_edgebevels; +int c_areaportals; +int c_detail; +int c_structural; @@ -60,13 +60,13 @@ int c_structural; */ qboolean PlaneEqual( plane_t *p, vec3_t normal, vec_t dist ){ - float ne, de; - - + float ne, de; + + /* get local copies */ ne = normalEpsilon; de = distanceEpsilon; - + /* compare */ // We check equality of each component since we're using '<', not '<=' // (the epsilons may be zero). We want to use '<' intead of '<=' to be @@ -78,7 +78,7 @@ qboolean PlaneEqual( plane_t *p, vec3_t normal, vec_t dist ){ ( p->normal[2] == normal[2] || fabs( p->normal[2] - normal[2] ) < ne ) ) { return qtrue; } - + /* different */ return qfalse; } @@ -90,9 +90,9 @@ qboolean PlaneEqual( plane_t *p, vec3_t normal, vec_t dist ){ */ void AddPlaneToHash( plane_t *p ){ - int hash; + int hash; + - hash = ( PLANE_HASHES - 1 ) & (int) fabs( p->dist ); p->hash_chain = planehash[hash]; @@ -105,7 +105,7 @@ void AddPlaneToHash( plane_t *p ){ ================ */ int CreateNewFloatPlane( vec3_t normal, vec_t dist ){ - plane_t *p, temp; + plane_t *p, temp; if ( VectorLength( normal ) < 0.5 ) { Sys_Printf( "FloatPlane: bad normal\n" ); @@ -154,8 +154,8 @@ int CreateNewFloatPlane( vec3_t normal, vec_t dist ){ qboolean SnapNormal( vec3_t normal ){ #if Q3MAP2_EXPERIMENTAL_SNAP_NORMAL_FIX - int i; - qboolean adjusted = qfalse; + int i; + qboolean adjusted = qfalse; // A change from the original SnapNormal() is that we snap each // component that's close to 0. So for example if a normal is @@ -165,7 +165,7 @@ qboolean SnapNormal( vec3_t normal ){ // only snapped vectors that were near a perfect axis. for ( i = 0; i < 3; i++ ) - { + { if ( normal[i] != 0.0 && -normalEpsilon < normal[i] && normal[i] < normalEpsilon ) { normal[i] = 0.0; adjusted = qtrue; @@ -178,25 +178,25 @@ qboolean SnapNormal( vec3_t normal ){ } return qfalse; #else - int i; + int i; // I would suggest that you uncomment the following code and look at the // results: /* - Sys_Printf("normalEpsilon is %f\n", normalEpsilon); - for (i = 0;; i++) - { - normal[0] = 1.0; - normal[1] = 0.0; - normal[2] = i * 0.000001; - VectorNormalize(normal, normal); - if (1.0 - normal[0] >= normalEpsilon) { - Sys_Printf("(%f %f %f)\n", normal[0], normal[1], normal[2]); - Error("SnapNormal: test completed"); - } - } - */ + Sys_Printf("normalEpsilon is %f\n", normalEpsilon); + for (i = 0;; i++) + { + normal[0] = 1.0; + normal[1] = 0.0; + normal[2] = i * 0.000001; + VectorNormalize(normal, normal); + if (1.0 - normal[0] >= normalEpsilon) { + Sys_Printf("(%f %f %f)\n", normal[0], normal[1], normal[2]); + Error("SnapNormal: test completed"); + } + } + */ // When the normalEpsilon is 0.00001, the loop will break out when normal is // (0.999990 0.000000 0.004469). In other words, this is the vector closest @@ -214,7 +214,7 @@ qboolean SnapNormal( vec3_t normal ){ // code fix. for ( i = 0; i < 3; i++ ) - { + { if ( fabs( normal[ i ] - 1 ) < normalEpsilon ) { VectorClear( normal ); normal[ i ] = 1; @@ -242,8 +242,8 @@ void SnapPlane( vec3_t normal, vec_t *dist, vec3_t center ){ // brushes made from triangles of embedded models, and it has little effect // on anything else (axial planes are usually derived from snapped points) /* - SnapPlane reenabled by namespace because of multiple reports of - q3map2-crashes which were triggered by this patch. + SnapPlane reenabled by namespace because of multiple reports of + q3map2-crashes which were triggered by this patch. */ SnapNormal( normal ); @@ -278,9 +278,9 @@ void SnapPlane( vec3_t normal, vec_t *dist, vec3_t center ){ snaps a plane to normal/distance epsilons, improved code */ void SnapPlaneImproved( vec3_t normal, vec_t *dist, int numPoints, const vec3_t *points ){ - int i; - vec3_t center; - vec_t distNearestInt; + int i; + vec3_t center; + vec_t distNearestInt; if ( SnapNormal( normal ) ) { if ( numPoints > 0 ) { @@ -318,10 +318,10 @@ int FindFloatPlane( vec3_t innormal, vec_t dist, int numPoints, vec3_t *points ) #ifdef USE_HASHING { - int i, j, hash, h; + int i, j, hash, h; int pidx; - plane_t *p; - vec_t d; + plane_t *p; + vec_t d; vec3_t normal; VectorCopy( innormal, normal ); @@ -332,7 +332,7 @@ int FindFloatPlane( vec3_t innormal, vec_t dist, int numPoints, vec3_t *points ) #endif /* hash the plane */ hash = ( PLANE_HASHES - 1 ) & (int) fabs( dist ); - + /* search the border bins as well */ for ( i = -1; i <= 1; i++ ) { @@ -345,10 +345,10 @@ int FindFloatPlane( vec3_t innormal, vec_t dist, int numPoints, vec3_t *points ) if ( !PlaneEqual( p, normal, dist ) ) { continue; } - + /* ydnar: uncomment the following line for old-style plane finding */ //% return p - mapplanes; - + /* ydnar: test supplied points against this plane */ for ( j = 0; j < numPoints; j++ ) { @@ -361,16 +361,16 @@ int FindFloatPlane( vec3_t innormal, vec_t dist, int numPoints, vec3_t *points ) d = fabs( d ); if ( d != 0.0 && d >= distanceEpsilon ) { break; // Point is too far from plane. + } } - } - + /* found a matching plane */ if ( j >= numPoints ) { return p - mapplanes; + } } } - } - + /* none found, so create a new one */ return CreateNewFloatPlane( normal, dist ); } @@ -378,15 +378,15 @@ int FindFloatPlane( vec3_t innormal, vec_t dist, int numPoints, vec3_t *points ) #else { - int i; - plane_t *p; + int i; + plane_t *p; vec3_t normal; - + VectorCopy( innormal, normal ); #if Q3MAP2_EXPERIMENTAL_SNAP_PLANE_FIX SnapPlaneImproved( normal, &dist, numPoints, (const vec3_t *) points ); #else - SnapPlane( normal, &dist ); + SnapPlane( normal, &dist ); #endif for ( i = 0, p = mapplanes; i < nummapplanes; i++, p++ ) { @@ -396,16 +396,16 @@ int FindFloatPlane( vec3_t innormal, vec_t dist, int numPoints, vec3_t *points ) /* ydnar: uncomment the following line for old-style plane finding */ //% return i; - + /* ydnar: test supplied points against this plane */ for ( j = 0; j < numPoints; j++ ) { d = DotProduct( points[ j ], p->normal ) - p->dist; if ( fabs( d ) > distanceEpsilon ) { break; + } } - } - + /* found a matching plane */ if ( j >= numPoints ) { return i; @@ -414,7 +414,7 @@ int FindFloatPlane( vec3_t innormal, vec_t dist, int numPoints, vec3_t *points ) // for the provided points. It should do that. I think this code // is unmaintained because nobody sets USE_HASHING to off. } - + return CreateNewFloatPlane( normal, dist ); } @@ -429,10 +429,10 @@ int FindFloatPlane( vec3_t innormal, vec_t dist, int numPoints, vec3_t *points ) int MapPlaneFromPoints( vec3_t *p ){ #if Q3MAP2_EXPERIMENTAL_HIGH_PRECISION_MATH_FIXES - vec3_accu_t paccu[3]; - vec3_accu_t t1, t2, normalAccu; - vec3_t normal; - vec_t dist; + vec3_accu_t paccu[3]; + vec3_accu_t t1, t2, normalAccu; + vec3_t normal; + vec_t dist; VectorCopyRegularToAccu( p[0], paccu[0] ); VectorCopyRegularToAccu( p[1], paccu[1] ); @@ -450,19 +450,19 @@ int MapPlaneFromPoints( vec3_t *p ){ return FindFloatPlane( normal, dist, 3, p ); #else - vec3_t t1, t2, normal; - vec_t dist; - - + vec3_t t1, t2, normal; + vec_t dist; + + /* calc plane normal */ VectorSubtract( p[ 0 ], p[ 1 ], t1 ); VectorSubtract( p[ 2 ], p[ 1 ], t2 ); CrossProduct( t1, t2, normal ); VectorNormalize( normal, normal ); - + /* calc plane distance */ dist = DotProduct( p[ 0 ], normal ); - + /* store the plane */ return FindFloatPlane( normal, dist, 3, p ); #endif @@ -476,19 +476,19 @@ int MapPlaneFromPoints( vec3_t *p ){ */ void SetBrushContents( brush_t *b ){ - int contentFlags, compileFlags; - side_t *s; - int i; + int contentFlags, compileFlags; + side_t *s; + int i; //% qboolean mixed; - - + + /* get initial compile flags from first side */ s = &b->sides[ 0 ]; contentFlags = s->contentFlags; compileFlags = s->compileFlags; b->contentShader = s->shaderInfo; //% mixed = qfalse; - + /* get the content/compile flags for every side in the brush */ for ( i = 1; i < b->numsides; i++, s++ ) { @@ -502,7 +502,7 @@ void SetBrushContents( brush_t *b ){ contentFlags |= s->contentFlags; compileFlags |= s->compileFlags; } - + /* ydnar: getting rid of this stupid warning */ //% if( mixed ) //% Sys_FPrintf( SYS_VRB,"Entity %i, Brush %i: mixed face contentFlags\n", b->entitynum, b->brushnum ); @@ -512,17 +512,17 @@ void SetBrushContents( brush_t *b ){ xml_Select( "Mixed detail and structural (defaulting to structural)", mapEnt->mapEntityNum, entitySourceBrushes, qfalse ); compileFlags &= ~C_DETAIL; } - + /* the fulldetail flag will cause detail brushes to be treated like normal brushes */ if ( fulldetail ) { compileFlags &= ~C_DETAIL; } - + /* all translucent brushes that aren't specifically made structural will be detail */ if ( ( compileFlags & C_TRANSLUCENT ) && !( compileFlags & C_STRUCTURAL ) ) { compileFlags |= C_DETAIL; } - + /* detail? */ if ( compileFlags & C_DETAIL ) { c_detail++; @@ -533,7 +533,7 @@ void SetBrushContents( brush_t *b ){ c_structural++; b->detail = qfalse; } - + /* opaque? */ if ( compileFlags & C_TRANSLUCENT ) { b->opaque = qfalse; @@ -541,12 +541,12 @@ void SetBrushContents( brush_t *b ){ else{ b->opaque = qtrue; } - + /* areaportal? */ if ( compileFlags & C_AREAPORTAL ) { c_areaportals++; } - + /* set brush flags */ b->contentFlags = contentFlags; b->compileFlags = compileFlags; @@ -562,15 +562,15 @@ void SetBrushContents( brush_t *b ){ */ void AddBrushBevels( void ){ - int axis, dir; - int i, j, k, l, order; - side_t sidetemp; - side_t *s, *s2; - winding_t *w, *w2; - vec3_t normal; - float dist; - vec3_t vec, vec2; - float d, minBack; + int axis, dir; + int i, j, k, l, order; + side_t sidetemp; + side_t *s, *s2; + winding_t *w, *w2; + vec3_t normal; + float dist; + vec3_t vec, vec2; + float d, minBack; // // add the axial planes @@ -583,20 +583,20 @@ void AddBrushBevels( void ){ { /* ydnar: testing disabling of mre code */ #if 0 - if ( dir > 0 ) { - if ( mapplanes[s->planenum].normal[axis] >= 0.9999f ) { - break; - } + if ( dir > 0 ) { + if ( mapplanes[s->planenum].normal[axis] >= 0.9999f ) { + break; } - else { - if ( mapplanes[s->planenum].normal[axis] <= -0.9999f ) { - break; - } + } + else { + if ( mapplanes[s->planenum].normal[axis] <= -0.9999f ) { + break; } + } #else if ( ( dir > 0 && mapplanes[ s->planenum ].normal[ axis ] == 1.0f ) || ( dir < 0 && mapplanes[ s->planenum ].normal[ axis ] == -1.0f ) ) { - break; + break; } #endif } @@ -618,7 +618,7 @@ void AddBrushBevels( void ){ } else{ dist = buildBrush->maxs[ axis ]; - } + } } else { @@ -628,7 +628,7 @@ void AddBrushBevels( void ){ } else{ dist = -buildBrush->mins[ axis ]; - } + } } s->planenum = FindFloatPlane( normal, dist, 0, NULL ); @@ -650,7 +650,7 @@ void AddBrushBevels( void ){ // add the edge bevels // if ( buildBrush->numsides == 6 ) { - return; // pure axial + return; // pure axial } // test the non-axial plane edges @@ -669,11 +669,11 @@ void AddBrushBevels( void ){ SnapNormal( vec ); for ( k = 0; k < 3; k++ ) { if ( vec[k] == -1.0f || vec[k] == 1.0f || ( vec[k] == 0.0f && vec[( k + 1 ) % 3] == 0.0f ) ) { - break; // axial + break; // axial } } if ( k != 3 ) { - continue; // only test non-axial edges + continue; // only test non-axial edges } /* debug code */ @@ -690,7 +690,7 @@ void AddBrushBevels( void ){ continue; } dist = DotProduct( w->p[j], normal ); - + // if all the points on all the sides are // behind this plane, it is a proper edge bevel for ( k = 0; k < buildBrush->numsides; k++ ) { @@ -708,7 +708,7 @@ void AddBrushBevels( void ){ for ( l = 0; l < w2->numpoints; l++ ) { d = DotProduct( w2->p[l], normal ) - dist; if ( d > 0.1f ) { - break; // point in front + break; // point in front } if ( d < minBack ) { minBack = d; @@ -727,12 +727,12 @@ void AddBrushBevels( void ){ } if ( k != buildBrush->numsides ) { - continue; // wasn't part of the outer hull + continue; // wasn't part of the outer hull } - + /* debug code */ //% Sys_Printf( "n = %f %f %f\n", normal[ 0 ], normal[ 1 ], normal[ 2 ] ); - + // add this plane if ( buildBrush->numsides == MAX_BUILD_SIDES ) { xml_Select( "MAX_BUILD_SIDES", buildBrush->entityNum, buildBrush->brushNum, qtrue ); @@ -775,9 +775,9 @@ static void MergeOrigin( entity_t *ent, vec3_t origin ){ } brush_t *FinishBrush( qboolean noCollapseGroups ){ - brush_t *b; - - + brush_t *b; + + /* create windings for sides and bounds for brush */ if ( !CreateBrushWindings( buildBrush ) ) { return NULL; @@ -786,17 +786,17 @@ brush_t *FinishBrush( qboolean noCollapseGroups ){ /* origin brushes are removed, but they set the rotation origin for the rest of the brushes in the entity. after the entire entity is parsed, the planenums and texinfos will be adjusted for the origin brush */ if ( buildBrush->compileFlags & C_ORIGIN ) { - vec3_t origin; + vec3_t origin; - Sys_Printf( "Entity %i, Brush %i: origin brush detected\n", - mapEnt->mapEntityNum, entitySourceBrushes ); + Sys_Printf( "Entity %i, Brush %i: origin brush detected\n", + mapEnt->mapEntityNum, entitySourceBrushes ); if ( numEntities == 1 ) { - Sys_Printf( "Entity %i, Brush %i: origin brushes not allowed in world\n", - mapEnt->mapEntityNum, entitySourceBrushes ); + Sys_Printf( "Entity %i, Brush %i: origin brushes not allowed in world\n", + mapEnt->mapEntityNum, entitySourceBrushes ); return NULL; } - + VectorAdd( buildBrush->mins, buildBrush->maxs, origin ); VectorScale( origin, 0.5, origin ); @@ -805,7 +805,7 @@ brush_t *FinishBrush( qboolean noCollapseGroups ){ /* don't keep this brush */ return NULL; } - + /* determine if the brush is an area portal */ if ( buildBrush->compileFlags & C_AREAPORTAL ) { if ( numEntities != 1 ) { @@ -813,29 +813,29 @@ brush_t *FinishBrush( qboolean noCollapseGroups ){ return NULL; } } - + /* add bevel planes */ if ( !noCollapseGroups ) { AddBrushBevels(); } - + /* keep it */ b = CopyBrush( buildBrush ); - + /* set map entity and brush numbering */ b->entityNum = mapEnt->mapEntityNum; b->brushNum = entitySourceBrushes; - + /* set original */ b->original = b; - + /* link opaque brushes to head of list, translucent brushes to end */ if ( b->opaque || mapEnt->lastBrush == NULL ) { b->next = mapEnt->brushes; mapEnt->brushes = b; if ( mapEnt->lastBrush == NULL ) { mapEnt->lastBrush = b; - } + } } else { @@ -843,15 +843,15 @@ brush_t *FinishBrush( qboolean noCollapseGroups ){ mapEnt->lastBrush->next = b; mapEnt->lastBrush = b; } - + /* link colorMod volume brushes to the entity directly */ if ( b->contentShader != NULL && - b->contentShader->colorMod != NULL && + b->contentShader->colorMod != NULL && b->contentShader->colorMod->type == CM_VOLUME ) { b->nextColorModBrush = mapEnt->colorModBrushes; mapEnt->colorModBrushes = b; } - + /* return to sender */ return b; } @@ -864,33 +864,33 @@ brush_t *FinishBrush( qboolean noCollapseGroups ){ (must be identical in radiant!) */ -vec3_t baseaxis[18] = +vec3_t baseaxis[18] = { - {0,0,1}, {1,0,0}, {0,-1,0}, // floor - {0,0,-1}, {1,0,0}, {0,-1,0}, // ceiling - {1,0,0}, {0,1,0}, {0,0,-1}, // west wall - {-1,0,0}, {0,1,0}, {0,0,-1}, // east wall - {0,1,0}, {1,0,0}, {0,0,-1}, // south wall - {0,-1,0}, {1,0,0}, {0,0,-1} // north wall + {0,0,1}, {1,0,0}, {0,-1,0}, // floor + {0,0,-1}, {1,0,0}, {0,-1,0}, // ceiling + {1,0,0}, {0,1,0}, {0,0,-1}, // west wall + {-1,0,0}, {0,1,0}, {0,0,-1}, // east wall + {0,1,0}, {1,0,0}, {0,0,-1}, // south wall + {0,-1,0}, {1,0,0}, {0,0,-1} // north wall }; void TextureAxisFromPlane( plane_t *pln, vec3_t xv, vec3_t yv ){ - int bestaxis; - vec_t dot,best; - int i; - + int bestaxis; + vec_t dot,best; + int i; + best = 0; bestaxis = 0; - + for ( i = 0 ; i < 6 ; i++ ) - { + { dot = DotProduct( pln->normal, baseaxis[i * 3] ); if ( dot > best + 0.0001f ) { /* ydnar: bug 637 fix, suggested by jmonroe */ best = dot; bestaxis = i; } } - + VectorCopy( baseaxis[bestaxis * 3 + 1], xv ); VectorCopy( baseaxis[bestaxis * 3 + 2], yv ); } @@ -903,15 +903,15 @@ void TextureAxisFromPlane( plane_t *pln, vec3_t xv, vec3_t yv ){ */ void QuakeTextureVecs( plane_t *plane, vec_t shift[ 2 ], vec_t rotate, vec_t scale[ 2 ], vec_t mappingVecs[ 2 ][ 4 ] ){ - vec3_t vecs[2]; - int sv, tv; - vec_t ang, sinv, cosv; - vec_t ns, nt; - int i, j; - - + vec3_t vecs[2]; + int sv, tv; + vec_t ang, sinv, cosv; + vec_t ns, nt; + int i, j; + + TextureAxisFromPlane( plane, vecs[0], vecs[1] ); - + if ( !scale[0] ) { scale[0] = 1; } @@ -933,7 +933,7 @@ void QuakeTextureVecs( plane_t *plane, vec_t shift[ 2 ], vec_t rotate, vec_t sca sinv = -1 ; cosv = 0; } else - { + { ang = rotate / 180 * Q_PI; sinv = sin( ang ); cosv = cos( ang ); @@ -948,7 +948,7 @@ void QuakeTextureVecs( plane_t *plane, vec_t shift[ 2 ], vec_t rotate, vec_t sca else{ sv = 2; } - + if ( vecs[1][0] ) { tv = 0; } @@ -958,7 +958,7 @@ void QuakeTextureVecs( plane_t *plane, vec_t shift[ 2 ], vec_t rotate, vec_t sca else{ tv = 2; } - + for ( i = 0 ; i < 2 ; i++ ) { ns = cosv * vecs[i][sv] - sinv * vecs[i][tv]; nt = sinv * vecs[i][sv] + cosv * vecs[i][tv]; @@ -991,27 +991,27 @@ void QuakeTextureVecs( plane_t *plane, vec_t shift[ 2 ], vec_t rotate, vec_t sca */ static void ParseRawBrush( qboolean onlyLights ){ - side_t *side; - vec3_t planePoints[ 3 ]; - int planenum; - shaderInfo_t *si; - vec_t shift[ 2 ]; - vec_t rotate = 0; - vec_t scale[ 2 ]; - char name[ MAX_QPATH ]; - char shader[ MAX_QPATH ]; - int flags; - - + side_t *side; + vec3_t planePoints[ 3 ]; + int planenum; + shaderInfo_t *si; + vec_t shift[ 2 ]; + vec_t rotate = 0; + vec_t scale[ 2 ]; + char name[ MAX_QPATH ]; + char shader[ MAX_QPATH ]; + int flags; + + /* initial setup */ buildBrush->numsides = 0; buildBrush->detail = qfalse; - + /* bp */ if ( g_bBrushPrimit == BPRIMIT_NEWBRUSHES ) { MatchToken( "{" ); } - + /* parse sides */ while ( 1 ) { @@ -1021,7 +1021,7 @@ static void ParseRawBrush( qboolean onlyLights ){ if ( !strcmp( token, "}" ) ) { break; } - + /* ttimo : bp: here we may have to jump over brush epairs (only used in editor) */ if ( g_bBrushPrimit == BPRIMIT_NEWBRUSHES ) { while ( 1 ) @@ -1036,31 +1036,31 @@ static void ParseRawBrush( qboolean onlyLights ){ } } UnGetToken(); - + /* test side count */ if ( buildBrush->numsides >= MAX_BUILD_SIDES ) { xml_Select( "MAX_BUILD_SIDES", buildBrush->entityNum, buildBrush->brushNum, qtrue ); } - + /* add side */ side = &buildBrush->sides[ buildBrush->numsides ]; memset( side, 0, sizeof( *side ) ); buildBrush->numsides++; - + /* read the three point plane definition */ Parse1DMatrix( 3, planePoints[ 0 ] ); Parse1DMatrix( 3, planePoints[ 1 ] ); Parse1DMatrix( 3, planePoints[ 2 ] ); - + /* bp: read the texture matrix */ if ( g_bBrushPrimit == BPRIMIT_NEWBRUSHES ) { Parse2DMatrix( 2, 3, (float*) side->texMat ); } - + /* read shader name */ GetToken( qfalse ); strcpy( name, token ); - + /* bp */ if ( g_bBrushPrimit == BPRIMIT_OLDBRUSHES ) { GetToken( qfalse ); @@ -1068,13 +1068,13 @@ static void ParseRawBrush( qboolean onlyLights ){ GetToken( qfalse ); shift[ 1 ] = atof( token ); GetToken( qfalse ); - rotate = atof( token ); + rotate = atof( token ); GetToken( qfalse ); scale[ 0 ] = atof( token ); GetToken( qfalse ); scale[ 1 ] = atof( token ); } - + /* set default flags and values */ sprintf( shader, "textures/%s", name ); if ( onlyLights ) { @@ -1088,24 +1088,24 @@ static void ParseRawBrush( qboolean onlyLights ){ side->contentFlags = si->contentFlags; side->compileFlags = si->compileFlags; side->value = si->value; - + /* ydnar: gs mods: bias texture shift */ if ( si->globalTexture == qfalse ) { shift[ 0 ] -= ( floor( shift[ 0 ] / si->shaderWidth ) * si->shaderWidth ); shift[ 1 ] -= ( floor( shift[ 1 ] / si->shaderHeight ) * si->shaderHeight ); } - + /* - historically, there are 3 integer values at the end of a brushside line in a .map file. - in quake 3, the only thing that mattered was the first of these three values, which - was previously the content flags. and only then did a single bit matter, the detail - bit. because every game has its own special flags for specifying detail, the - traditionally game-specified CONTENTS_DETAIL flag was overridden for Q3Map 2.3.0 - by C_DETAIL, defined in q3map2.h. the value is exactly as it was before, but - is stored in compileFlags, as opposed to contentFlags, for multiple-game - portability. :sigh: - */ - + historically, there are 3 integer values at the end of a brushside line in a .map file. + in quake 3, the only thing that mattered was the first of these three values, which + was previously the content flags. and only then did a single bit matter, the detail + bit. because every game has its own special flags for specifying detail, the + traditionally game-specified CONTENTS_DETAIL flag was overridden for Q3Map 2.3.0 + by C_DETAIL, defined in q3map2.h. the value is exactly as it was before, but + is stored in compileFlags, as opposed to contentFlags, for multiple-game + portability. :sigh: + */ + if ( TokenAvailable() ) { /* get detail bit from map content flags */ GetToken( qfalse ); @@ -1113,24 +1113,24 @@ static void ParseRawBrush( qboolean onlyLights ){ if ( flags & C_DETAIL ) { side->compileFlags |= C_DETAIL; } - + /* historical */ GetToken( qfalse ); //% td.flags = atoi( token ); GetToken( qfalse ); //% td.value = atoi( token ); } - + /* find the plane number */ planenum = MapPlaneFromPoints( planePoints ); side->planenum = planenum; - + /* bp: get the texture mapping for this texturedef / plane combination */ if ( g_bBrushPrimit == BPRIMIT_OLDBRUSHES ) { QuakeTextureVecs( &mapplanes[ planenum ], shift, rotate, scale, side->vecs ); + } } - } - + /* bp */ if ( g_bBrushPrimit == BPRIMIT_NEWBRUSHES ) { UnGetToken(); @@ -1149,8 +1149,8 @@ static void ParseRawBrush( qboolean onlyLights ){ */ qboolean RemoveDuplicateBrushPlanes( brush_t *b ){ - int i, j, k; - side_t *sides; + int i, j, k; + side_t *sides; sides = b->sides; @@ -1158,7 +1158,7 @@ qboolean RemoveDuplicateBrushPlanes( brush_t *b ){ // check for a degenerate plane if ( sides[i].planenum == -1 ) { - xml_Select( "degenerate plane", b->entityNum, b->brushNum, qfalse ); + xml_Select( "degenerate plane", b->entityNum, b->brushNum, qfalse ); // remove it for ( k = i + 1 ; k < b->numsides ; k++ ) { sides[k - 1] = sides[k]; @@ -1171,7 +1171,7 @@ qboolean RemoveDuplicateBrushPlanes( brush_t *b ){ // check for duplication and mirroring for ( j = 0 ; j < i ; j++ ) { if ( sides[i].planenum == sides[j].planenum ) { - xml_Select( "duplicate plane", b->entityNum, b->brushNum, qfalse ); + xml_Select( "duplicate plane", b->entityNum, b->brushNum, qfalse ); // remove the second duplicate for ( k = i + 1 ; k < b->numsides ; k++ ) { sides[k - 1] = sides[k]; @@ -1183,7 +1183,7 @@ qboolean RemoveDuplicateBrushPlanes( brush_t *b ){ if ( sides[i].planenum == ( sides[j].planenum ^ 1 ) ) { // mirror plane, brush is invalid - xml_Select( "mirrored plane", b->entityNum, b->brushNum, qfalse ); + xml_Select( "mirrored plane", b->entityNum, b->brushNum, qfalse ); return qfalse; } } @@ -1201,44 +1201,44 @@ qboolean RemoveDuplicateBrushPlanes( brush_t *b ){ static void ParseBrush( qboolean onlyLights, qboolean noCollapseGroups ){ /* parse the brush out of the map */ ParseRawBrush( onlyLights ); - + /* only go this far? */ if ( onlyLights ) { return; } - + /* set some defaults */ buildBrush->portalareas[ 0 ] = -1; buildBrush->portalareas[ 1 ] = -1; buildBrush->entityNum = numMapEntities - 1; buildBrush->brushNum = entitySourceBrushes; - + /* if there are mirrored planes, the entire brush is invalid */ if ( !RemoveDuplicateBrushPlanes( buildBrush ) ) { return; } - + /* get the content for the entire brush */ SetBrushContents( buildBrush ); - + /* allow detail brushes to be removed */ if ( nodetail && ( buildBrush->compileFlags & C_DETAIL ) ) { //% FreeBrush( buildBrush ); return; } - + /* allow liquid brushes to be removed */ if ( nowater && ( buildBrush->compileFlags & C_LIQUID ) ) { //% FreeBrush( buildBrush ); return; } - + /* ydnar: allow hint brushes to be removed */ if ( noHint && ( buildBrush->compileFlags & C_HINT ) ) { //% FreeBrush( buildBrush ); return; } - + /* finish the brush */ FinishBrush( noCollapseGroups ); } @@ -1254,27 +1254,27 @@ static void ParseBrush( qboolean onlyLights, qboolean noCollapseGroups ){ void AdjustBrushesForOrigin( entity_t *ent ); void MoveBrushesToWorld( entity_t *ent ){ - brush_t *b, *next; - parseMesh_t *pm; + brush_t *b, *next; + parseMesh_t *pm; /* we need to undo the common/origin adjustment, and instead shift them by the entity key origin */ VectorScale( ent->origin, -1, ent->originbrush_origin ); AdjustBrushesForOrigin( ent ); VectorClear( ent->originbrush_origin ); - + /* move brushes */ for ( b = ent->brushes; b != NULL; b = next ) { /* get next brush */ next = b->next; - + /* link opaque brushes to head of list, translucent brushes to end */ if ( b->opaque || entities[ 0 ].lastBrush == NULL ) { b->next = entities[ 0 ].brushes; entities[ 0 ].brushes = b; if ( entities[ 0 ].lastBrush == NULL ) { entities[ 0 ].lastBrush = b; - } + } } else { @@ -1284,24 +1284,24 @@ void MoveBrushesToWorld( entity_t *ent ){ } } ent->brushes = NULL; - + /* ydnar: move colormod brushes */ if ( ent->colorModBrushes != NULL ) { for ( b = ent->colorModBrushes; b->nextColorModBrush != NULL; b = b->nextColorModBrush ) ; - + b->nextColorModBrush = entities[ 0 ].colorModBrushes; entities[ 0 ].colorModBrushes = ent->colorModBrushes; - + ent->colorModBrushes = NULL; } - + /* move patches */ if ( ent->patches != NULL ) { for ( pm = ent->patches; pm->next != NULL; pm = pm->next ) ; - + pm->next = entities[ 0 ].patches; entities[ 0 ].patches = ent->patches; - + ent->patches = NULL; } } @@ -1313,13 +1313,13 @@ void MoveBrushesToWorld( entity_t *ent ){ */ void AdjustBrushesForOrigin( entity_t *ent ){ - - int i; - side_t *s; - vec_t newdist; - brush_t *b; - parseMesh_t *p; - + + int i; + side_t *s; + vec_t newdist; + brush_t *b; + parseMesh_t *p; + /* walk brush list */ for ( b = ent->brushes; b != NULL; b = b->next ) { @@ -1328,18 +1328,18 @@ void AdjustBrushesForOrigin( entity_t *ent ){ { /* get brush side */ s = &b->sides[ i ]; - + /* offset side plane */ newdist = mapplanes[ s->planenum ].dist - DotProduct( mapplanes[ s->planenum ].normal, ent->originbrush_origin ); - + /* find a new plane */ s->planenum = FindFloatPlane( mapplanes[ s->planenum ].normal, newdist, 0, NULL ); } - + /* rebuild brush windings (ydnar: just offsetting the winding above should be fine) */ CreateBrushWindings( b ); } - + /* walk patch list */ for ( p = ent->patches; p != NULL; p = p->next ) { @@ -1356,14 +1356,14 @@ void AdjustBrushesForOrigin( entity_t *ent ){ */ void SetEntityBounds( entity_t *e ){ - int i; - brush_t *b; - parseMesh_t *p; - vec3_t mins, maxs; - const char *value; + int i; + brush_t *b; + parseMesh_t *p; + vec3_t mins, maxs; + const char *value; + + - - /* walk the entity's brushes/patches and determine bounds */ ClearBounds( mins, maxs ); @@ -1377,17 +1377,17 @@ void SetEntityBounds( entity_t *e ){ for ( i = 0; i < ( p->mesh.width * p->mesh.height ); i++ ) AddPointToBounds( p->mesh.verts[ i ].xyz, mins, maxs ); } - + /* try to find explicit min/max key */ - value = ValueForKey( e, "min" ); + value = ValueForKey( e, "min" ); if ( value[ 0 ] != '\0' ) { GetVectorForKey( e, "min", mins ); } - value = ValueForKey( e, "max" ); + value = ValueForKey( e, "max" ); if ( value[ 0 ] != '\0' ) { GetVectorForKey( e, "max", maxs ); } - + /* store the bounds */ for ( b = e->brushes; b; b = b->next ) { @@ -1409,21 +1409,21 @@ void SetEntityBounds( entity_t *e ){ */ void LoadEntityIndexMap( entity_t *e ){ - int i, size, numLayers, w, h; - const char *value, *indexMapFilename, *shader; - char ext[ MAX_QPATH ], offset[ 4096 ], *search, *space; - byte *pixels; - unsigned int *pixels32; - indexMap_t *im; - brush_t *b; - parseMesh_t *p; - - + int i, size, numLayers, w, h; + const char *value, *indexMapFilename, *shader; + char ext[ MAX_QPATH ], offset[ 4096 ], *search, *space; + byte *pixels; + unsigned int *pixels32; + indexMap_t *im; + brush_t *b; + parseMesh_t *p; + + /* this only works with bmodel ents */ if ( e->brushes == NULL && e->patches == NULL ) { return; } - + /* determine if there is an index map (support legacy "alphamap" key as well) */ value = ValueForKey( e, "_indexmap" ); if ( value[ 0 ] == '\0' ) { @@ -1433,7 +1433,7 @@ void LoadEntityIndexMap( entity_t *e ){ return; } indexMapFilename = value; - + /* get number of layers (support legacy "layers" key as well) */ value = ValueForKey( e, "_layers" ); if ( value[ 0 ] == '\0' ) { @@ -1450,7 +1450,7 @@ void LoadEntityIndexMap( entity_t *e ){ Sys_Printf( "Entity will not be textured properly. Check your keys/values.\n" ); return; } - + /* get base shader name (support legacy "shader" key as well) */ value = ValueForKey( mapEnt, "_shader" ); if ( value[ 0 ] == '\0' ) { @@ -1462,18 +1462,18 @@ void LoadEntityIndexMap( entity_t *e ){ return; } shader = value; - + /* note it */ Sys_FPrintf( SYS_VRB, "Entity %d (%s) has shader index map \"%s\"\n", mapEnt->mapEntityNum, ValueForKey( e, "classname" ), indexMapFilename ); - + /* get index map file extension */ ExtractFileExtension( indexMapFilename, ext ); - + /* handle tga image */ if ( !Q_stricmp( ext, "tga" ) ) { /* load it */ Load32BitImage( indexMapFilename, &pixels32, &w, &h ); - + /* convert to bytes */ size = w * h; pixels = safe_malloc( size ); @@ -1482,9 +1482,9 @@ void LoadEntityIndexMap( entity_t *e ){ pixels[ i ] = ( ( pixels32[ i ] & 0xFF ) * numLayers ) / 256; if ( pixels[ i ] >= numLayers ) { pixels[ i ] = numLayers - 1; + } } - } - + /* free the 32 bit image */ free( pixels32 ); } @@ -1492,10 +1492,10 @@ void LoadEntityIndexMap( entity_t *e ){ { /* load it */ Load256Image( indexMapFilename, &pixels, NULL, &w, &h ); - + /* debug code */ //% Sys_Printf( "-------------------------------" ); - + /* fix up out-of-range values */ size = w * h; for ( i = 0; i < size; i++ ) @@ -1503,17 +1503,17 @@ void LoadEntityIndexMap( entity_t *e ){ if ( pixels[ i ] >= numLayers ) { pixels[ i ] = numLayers - 1; } - + /* debug code */ //% if( (i % w) == 0 ) //% Sys_Printf( "\n" ); //% Sys_Printf( "%c", pixels[ i ] + '0' ); } - + /* debug code */ //% Sys_Printf( "\n-------------------------------\n" ); } - + /* the index map must be at least 2x2 pixels */ if ( w < 2 || h < 2 ) { Sys_Printf( "WARNING: Entity with index/alpha map \"%s\" is smaller than 2x2 pixels\n", indexMapFilename ); @@ -1525,7 +1525,7 @@ void LoadEntityIndexMap( entity_t *e ){ /* create a new index map */ im = safe_malloc( sizeof( *im ) ); memset( im, 0, sizeof( *im ) ); - + /* set it up */ im->w = w; im->h = h; @@ -1533,7 +1533,7 @@ void LoadEntityIndexMap( entity_t *e ){ strcpy( im->name, indexMapFilename ); strcpy( im->shader, shader ); im->pixels = pixels; - + /* get height offsets */ value = ValueForKey( mapEnt, "_offsets" ); if ( value[ 0 ] == '\0' ) { @@ -1543,7 +1543,7 @@ void LoadEntityIndexMap( entity_t *e ){ /* value is a space-seperated set of numbers */ strcpy( offset, value ); search = offset; - + /* get each value */ for ( i = 0; i < 256 && *search != '\0'; i++ ) { @@ -1558,7 +1558,7 @@ void LoadEntityIndexMap( entity_t *e ){ search = space + 1; } } - + /* store the index map in every brush/patch in the entity */ for ( b = e->brushes; b != NULL; b = b->next ) b->im = im; @@ -1578,65 +1578,65 @@ void LoadEntityIndexMap( entity_t *e ){ */ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ){ - epair_t *ep; - const char *classname, *value; - float lightmapScale, shadeAngle; - int lightmapSampleSize; - char shader[ MAX_QPATH ]; - shaderInfo_t *celShader = NULL; - brush_t *brush; - parseMesh_t *patch; - qboolean funcGroup; - int castShadows, recvShadows; + epair_t *ep; + const char *classname, *value; + float lightmapScale, shadeAngle; + int lightmapSampleSize; + char shader[ MAX_QPATH ]; + shaderInfo_t *celShader = NULL; + brush_t *brush; + parseMesh_t *patch; + qboolean funcGroup; + int castShadows, recvShadows; vec3_t colormod; - - + + /* eof check */ if ( !GetToken( qtrue ) ) { return qfalse; } - + /* conformance check */ if ( strcmp( token, "{" ) ) { Sys_Printf( "WARNING: ParseEntity: { not found, found %s on line %d - last entity was at: <%4.2f, %4.2f, %4.2f>...\n" - "Continuing to process map, but resulting BSP may be invalid.\n", - token, scriptline, entities[ numEntities ].origin[ 0 ], entities[ numEntities ].origin[ 1 ], entities[ numEntities ].origin[ 2 ] ); + "Continuing to process map, but resulting BSP may be invalid.\n", + token, scriptline, entities[ numEntities ].origin[ 0 ], entities[ numEntities ].origin[ 1 ], entities[ numEntities ].origin[ 2 ] ); return qfalse; } - + /* range check */ AUTOEXPAND_BY_REALLOC( entities, numEntities, allocatedEntities, 32 ); - + /* setup */ entitySourceBrushes = 0; mapEnt = &entities[ numEntities ]; numEntities++; memset( mapEnt, 0, sizeof( *mapEnt ) ); - + /* ydnar: true entity numbering */ mapEnt->mapEntityNum = numMapEntities; numMapEntities++; - + /* loop */ while ( 1 ) { /* get initial token */ if ( !GetToken( qtrue ) ) { Sys_Printf( "WARNING: ParseEntity: EOF without closing brace\n" - "Continuing to process map, but resulting BSP may be invalid.\n" ); + "Continuing to process map, but resulting BSP may be invalid.\n" ); return qfalse; } - + if ( !strcmp( token, "}" ) ) { break; } - + if ( !strcmp( token, "{" ) ) { /* parse a brush or patch */ if ( !GetToken( qtrue ) ) { break; } - + /* check */ if ( !strcmp( token, "patchDef2" ) ) { numMapPatches++; @@ -1644,14 +1644,14 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) } else if ( !strcmp( token, "terrainDef" ) ) { //% ParseTerrain(); - Sys_Printf( "WARNING: Terrain entity parsing not supported in this build.\n" ); /* ydnar */ + Sys_Printf( "WARNING: Terrain entity parsing not supported in this build.\n" ); /* ydnar */ } else if ( !strcmp( token, "brushDef" ) ) { if ( g_bBrushPrimit == BPRIMIT_OLDBRUSHES ) { Error( "Old brush format not allowed in new brush format map" ); } g_bBrushPrimit = BPRIMIT_NEWBRUSHES; - + /* parse brush primitive */ ParseBrush( onlyLights, noCollapseGroups ); } @@ -1661,7 +1661,7 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) Error( "New brush format not allowed in old brush format map" ); } g_bBrushPrimit = BPRIMIT_OLDBRUSHES; - + /* parse old brush format */ UnGetToken(); ParseBrush( onlyLights, noCollapseGroups ); @@ -1672,7 +1672,7 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) { /* parse a key / value pair */ ep = ParseEPair(); - + /* ydnar: 2002-07-06 fixed wolf bug with empty epairs */ if ( ep->key[ 0 ] != '\0' && ep->value[ 0 ] != '\0' ) { ep->next = mapEnt->epairs; @@ -1680,16 +1680,16 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) } } } - + /* ydnar: get classname */ classname = ValueForKey( mapEnt, "classname" ); - + /* ydnar: only lights? */ if ( onlyLights && Q_strncasecmp( classname, "light", 5 ) ) { numEntities--; return qtrue; } - + /* ydnar: determine if this is a func_group */ if ( !Q_stricmp( "func_group", classname ) ) { funcGroup = qtrue; @@ -1697,14 +1697,14 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) else{ funcGroup = qfalse; } - + /* worldspawn (and func_groups) default to cast/recv shadows in worldspawn group */ if ( funcGroup || mapEnt->mapEntityNum == 0 ) { //% Sys_Printf( "World: %d\n", mapEnt->mapEntityNum ); castShadows = WORLDSPAWN_CAST_SHADOWS; recvShadows = WORLDSPAWN_RECV_SHADOWS; } - + /* other entities don't cast any shadows, but recv worldspawn shadows */ else { @@ -1712,15 +1712,15 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) castShadows = ENTITY_CAST_SHADOWS; recvShadows = ENTITY_RECV_SHADOWS; } - + /* get explicit shadow flags */ GetEntityShadowFlags( mapEnt, NULL, &castShadows, &recvShadows ); - + /* vortex: added _ls key (short name of lightmapscale) */ /* ydnar: get lightmap scaling value for this entity */ lightmapScale = 0.0f; if ( strcmp( "", ValueForKey( mapEnt, "lightmapscale" ) ) || - strcmp( "", ValueForKey( mapEnt, "_lightmapscale" ) ) || + strcmp( "", ValueForKey( mapEnt, "_lightmapscale" ) ) || strcmp( "", ValueForKey( mapEnt, "_ls" ) ) ) { /* get lightmap scale from entity */ lightmapScale = FloatForKey( mapEnt, "lightmapscale" ); @@ -1735,7 +1735,7 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) } if ( lightmapScale > 0.0f ) { Sys_Printf( "Entity %d (%s) has lightmap scale of %.4f\n", mapEnt->mapEntityNum, classname, lightmapScale ); - } + } } VectorClear(colormod); @@ -1779,7 +1779,7 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) else if ( strcmp( "", ValueForKey( mapEnt, "_smooth" ) ) ) { shadeAngle = FloatForKey( mapEnt, "_smooth" ); } - + if ( shadeAngle < 0.0f ) { shadeAngle = 0.0f; } @@ -1787,7 +1787,7 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) if ( shadeAngle > 0.0f ) { Sys_Printf( "Entity %d (%s) has shading angle of %.4f\n", mapEnt->mapEntityNum, classname, shadeAngle ); } - + /* jal : entity based _samplesize */ lightmapSampleSize = 0; if ( strcmp( "", ValueForKey( mapEnt, "_lightmapsamplesize" ) ) ) { @@ -1796,7 +1796,7 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) else if ( strcmp( "", ValueForKey( mapEnt, "_samplesize" ) ) ) { lightmapSampleSize = IntForKey( mapEnt, "_samplesize" ); } - + if ( lightmapSampleSize < 0 ) { lightmapSampleSize = 0; } @@ -1804,7 +1804,7 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) if ( lightmapSampleSize > 0 ) { Sys_Printf( "Entity %d (%s) has lightmap sample size of %d\n", mapEnt->mapEntityNum, classname, lightmapSampleSize ); } - + /* attach stuff to everything in the entity */ for ( brush = mapEnt->brushes; brush != NULL; brush = brush->next ) { @@ -1817,7 +1817,7 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) brush->shadeAngleDegrees = shadeAngle; brush->colormod = colormod; } - + for ( patch = mapEnt->patches; patch != NULL; patch = patch->next ) { patch->entityNum = mapEnt->mapEntityNum; @@ -1828,13 +1828,13 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) patch->celShader = celShader; patch->colormod = colormod; } - + /* ydnar: gs mods: set entity bounds */ SetEntityBounds( mapEnt ); - + /* ydnar: gs mods: load shader index map (equivalent to old terrain alphamap) */ LoadEntityIndexMap( mapEnt ); - + /* get entity origin and adjust brushes */ GetVectorForKey( mapEnt, "origin", mapEnt->origin ); if ( mapEnt->originbrush_origin[ 0 ] || mapEnt->originbrush_origin[ 1 ] || mapEnt->originbrush_origin[ 2 ] ) { @@ -1846,14 +1846,14 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) numEntities--; return qtrue; } - + /* group entities are just for editor convenience, toss all brushes into worldspawn */ if ( !noCollapseGroups && funcGroup ) { MoveBrushesToWorld( mapEnt ); numEntities--; return qtrue; } - + /* done */ return qtrue; } @@ -1866,22 +1866,22 @@ static qboolean ParseMapEntity( qboolean onlyLights, qboolean noCollapseGroups ) */ void LoadMapFile( char *filename, qboolean onlyLights, qboolean noCollapseGroups ){ - FILE *file; - brush_t *b; - int oldNumEntities = 0, numMapBrushes; - - + FILE *file; + brush_t *b; + int oldNumEntities = 0, numMapBrushes; + + /* note it */ Sys_FPrintf( SYS_VRB, "--- LoadMapFile ---\n" ); Sys_Printf( "Loading %s\n", filename ); - + /* hack */ file = SafeOpenRead( filename ); fclose( file ); - + /* load the map file */ LoadScriptFile( filename, -1 ); - + /* setup */ if ( onlyLights ) { oldNumEntities = numEntities; @@ -1889,18 +1889,18 @@ void LoadMapFile( char *filename, qboolean onlyLights, qboolean noCollapseGroups else{ numEntities = 0; } - + /* initial setup */ numMapDrawSurfs = 0; c_detail = 0; g_bBrushPrimit = BPRIMIT_UNDEFINED; - + /* allocate a very large temporary brush for building the brushes as they are loaded */ buildBrush = AllocBrush( MAX_BUILD_SIDES ); - + /* parse the map file */ while ( ParseMapEntity( onlyLights, noCollapseGroups ) ) ; - + /* light loading */ if ( onlyLights ) { /* emit some statistics */ @@ -1915,13 +1915,13 @@ void LoadMapFile( char *filename, qboolean onlyLights, qboolean noCollapseGroups AddPointToBounds( b->mins, mapMins, mapMaxs ); AddPointToBounds( b->maxs, mapMins, mapMaxs ); } - + /* get brush counts */ numMapBrushes = CountBrushList( entities[ 0 ].brushes ); if ( (float) c_detail / (float) numMapBrushes < 0.10f && numMapBrushes > 500 ) { Sys_Printf( "WARNING: Over 90 percent structural map detected. Compile time may be adversely affected.\n" ); } - + /* emit some statistics */ Sys_FPrintf( SYS_VRB, "%9d total world brushes\n", numMapBrushes ); Sys_FPrintf( SYS_VRB, "%9d detail brushes\n", c_detail ); @@ -1932,12 +1932,12 @@ void LoadMapFile( char *filename, qboolean onlyLights, qboolean noCollapseGroups Sys_FPrintf( SYS_VRB, "%9d planes\n", nummapplanes ); Sys_Printf( "%9d areaportals\n", c_areaportals ); Sys_Printf( "Size: %5.0f, %5.0f, %5.0f to %5.0f, %5.0f, %5.0f\n", - mapMins[ 0 ], mapMins[ 1 ], mapMins[ 2 ], + mapMins[ 0 ], mapMins[ 1 ], mapMins[ 2 ], mapMaxs[ 0 ], mapMaxs[ 1 ], mapMaxs[ 2 ] ); - + /* write bogus map */ if ( fakemap ) { WriteBSPBrushMap( "fakemap.map", entities[ 0 ].brushes ); - } + } } } diff --git a/tools/quake3/q3map2/model.c b/tools/quake3/q3map2/model.c index 7489bcf0..32f65d08 100644 --- a/tools/quake3/q3map2/model.c +++ b/tools/quake3/q3map2/model.c @@ -38,7 +38,7 @@ -/* +/* PicoPrintFunc() callback for picomodel.lib */ @@ -49,31 +49,31 @@ void PicoPrintFunc( int level, const char *str ){ } switch ( level ) { - case PICO_NORMAL: - Sys_Printf( "%s\n", str ); - break; - - case PICO_VERBOSE: - Sys_FPrintf( SYS_VRB, "%s\n", str ); - break; - - case PICO_WARNING: - Sys_Printf( "WARNING: %s\n", str ); - break; - - case PICO_ERROR: - Sys_Printf( "ERROR: %s\n", str ); - break; - - case PICO_FATAL: - Error( "ERROR: %s\n", str ); - break; + case PICO_NORMAL: + Sys_Printf( "%s\n", str ); + break; + + case PICO_VERBOSE: + Sys_FPrintf( SYS_VRB, "%s\n", str ); + break; + + case PICO_WARNING: + Sys_Printf( "WARNING: %s\n", str ); + break; + + case PICO_ERROR: + Sys_Printf( "ERROR: %s\n", str ); + break; + + case PICO_FATAL: + Error( "ERROR: %s\n", str ); + break; } } -/* +/* PicoLoadFileFunc() callback for picomodel.lib */ @@ -90,29 +90,29 @@ void PicoLoadFileFunc( const char *name, byte **buffer, int *bufSize ){ */ picoModel_t *FindModel( const char *name, int frame ){ - int i; - - + int i; + + /* init */ if ( numPicoModels <= 0 ) { memset( picoModels, 0, sizeof( picoModels ) ); } - + /* dummy check */ if ( name == NULL || name[ 0 ] == '\0' ) { return NULL; } - + /* search list */ for ( i = 0; i < MAX_MODELS; i++ ) { if ( picoModels[ i ] != NULL && - !strcmp( PicoGetModelName( picoModels[ i ] ), name ) && + !strcmp( PicoGetModelName( picoModels[ i ] ), name ) && PicoGetModelFrameNum( picoModels[ i ] ) == frame ) { return picoModels[ i ]; + } } - } - + /* no matching picoModel found */ return NULL; } @@ -125,44 +125,44 @@ picoModel_t *FindModel( const char *name, int frame ){ */ picoModel_t *LoadModel( const char *name, int frame ){ - int i; - picoModel_t *model, **pm; - - + int i; + picoModel_t *model, **pm; + + /* init */ if ( numPicoModels <= 0 ) { memset( picoModels, 0, sizeof( picoModels ) ); } - + /* dummy check */ if ( name == NULL || name[ 0 ] == '\0' ) { return NULL; } - + /* try to find existing picoModel */ model = FindModel( name, frame ); if ( model != NULL ) { return model; } - + /* none found, so find first non-null picoModel */ pm = NULL; for ( i = 0; i < MAX_MODELS; i++ ) - { + { if ( picoModels[ i ] == NULL ) { pm = &picoModels[ i ]; break; } } - + /* too many picoModels? */ if ( pm == NULL ) { Error( "MAX_MODELS (%d) exceeded, there are too many model files referenced by the map.", MAX_MODELS ); } - + /* attempt to parse model */ *pm = PicoLoadModel( name, frame ); - + /* if loading failed, make a bogus model to silence the rest of the warnings */ if ( *pm == NULL ) { /* allocate a new model */ @@ -170,19 +170,19 @@ picoModel_t *LoadModel( const char *name, int frame ){ if ( *pm == NULL ) { return NULL; } - + /* set data */ PicoSetModelName( *pm, name ); PicoSetModelFrameNum( *pm, frame ); } - + /* debug code */ #if 0 { - int numSurfaces, numVertexes; - picoSurface_t *ps; - - + int numSurfaces, numVertexes; + picoSurface_t *ps; + + Sys_Printf( "Model %s\n", name ); numSurfaces = PicoGetModelNumSurfaces( *pm ); for ( i = 0; i < numSurfaces; i++ ) @@ -193,12 +193,12 @@ picoModel_t *LoadModel( const char *name, int frame ){ } } #endif - + /* set count */ if ( *pm != NULL ) { numPicoModels++; } - + /* return the picoModel */ return *pm; } @@ -211,29 +211,29 @@ picoModel_t *LoadModel( const char *name, int frame ){ */ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap_t *remap, shaderInfo_t *celShader, int eNum, int castShadows, int recvShadows, int spawnFlags, float lightmapScale, int lightmapSampleSize, float shadeAngle, vec3_t colormod ){ - int i, j, s, numSurfaces; - m4x4_t identity, nTransform; - picoModel_t *model; - picoShader_t *shader; - picoSurface_t *surface; - shaderInfo_t *si; - mapDrawSurface_t *ds; - bspDrawVert_t *dv; - char *picoShaderName; - char shaderName[ MAX_QPATH ]; - picoVec_t *xyz, *normal, *st; - byte *color; - picoIndex_t *indexes; - remap_t *rm, *glob; - skinfile_t *sf, *sf2; - double normalEpsilon_save; - double distanceEpsilon_save; - char skinfilename[ MAX_QPATH ]; - char *skinfilecontent; - int skinfilesize; - char *skinfileptr, *skinfilenextptr; - - + int i, j, s, numSurfaces; + m4x4_t identity, nTransform; + picoModel_t *model; + picoShader_t *shader; + picoSurface_t *surface; + shaderInfo_t *si; + mapDrawSurface_t *ds; + bspDrawVert_t *dv; + char *picoShaderName; + char shaderName[ MAX_QPATH ]; + picoVec_t *xyz, *normal, *st; + byte *color; + picoIndex_t *indexes; + remap_t *rm, *glob; + skinfile_t *sf, *sf2; + double normalEpsilon_save; + double distanceEpsilon_save; + char skinfilename[ MAX_QPATH ]; + char *skinfilecontent; + int skinfilesize; + char *skinfileptr, *skinfilenextptr; + + /* get model */ model = LoadModel( name, frame ); if ( model == NULL ) { @@ -251,7 +251,7 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap skinfilesize = vfsLoadFile( skinfilename, (void**) &skinfilecontent, 0 ); if ( skinfilesize >= 0 ) { Sys_Printf( "Skin %d of %s does not exist, using 0 instead\n", skin, name ); - } + } } sf = NULL; if ( skinfilesize >= 0 ) { @@ -298,25 +298,25 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap } free( skinfilecontent ); } - + /* handle null matrix */ if ( transform == NULL ) { m4x4_identity( identity ); transform = identity; } - + /* hack: Stable-1_2 and trunk have differing row/column major matrix order this transpose is necessary with Stable-1_2 uncomment the following line with old m4x4_t (non 1.3/spog_branch) code */ //% m4x4_transpose( transform ); - + /* create transform matrix for normals */ memcpy( nTransform, transform, sizeof( m4x4_t ) ); if ( m4x4_invert( nTransform ) ) { Sys_FPrintf( SYS_VRB, "WARNING: Can't invert model transform matrix, using transpose instead\n" ); } m4x4_transpose( nTransform ); - + /* fix bogus lightmap scale */ if ( lightmapScale <= 0.0f ) { lightmapScale = 1.0f; @@ -326,7 +326,7 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap if ( shadeAngle <= 0.0f ) { shadeAngle = 0.0f; } - + /* each surface on the model will become a new map drawsurface */ numSurfaces = PicoGetModelNumSurfaces( model ); //% Sys_FPrintf( SYS_VRB, "Model %s has %d surfaces\n", name, numSurfaces ); @@ -337,14 +337,14 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap if ( surface == NULL ) { continue; } - + /* only handle triangle surfaces initially (fixme: support patches) */ if ( PicoGetSurfaceType( surface ) != PICO_TRIANGLES ) { continue; } - + /* get shader name */ - shader = PicoGetSurfaceShader( surface ); + shader = PicoGetSurfaceShader( surface ); if ( shader == NULL ) { picoShaderName = ""; } @@ -356,7 +356,7 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap if ( sf ) { picoShaderName = NULL; for ( sf2 = sf; sf2 != NULL; sf2 = sf2->next ) - { + { if ( !Q_stricmp( surface->name, sf2->name ) ) { Sys_FPrintf( SYS_VRB, "Skin file: mapping %s to %s\n", surface->name, sf2->to ); picoShaderName = sf2->to; @@ -383,12 +383,12 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap break; } } - + if ( glob != NULL ) { Sys_FPrintf( SYS_VRB, "Globbing %s to %s\n", picoShaderName, glob->to ); picoShaderName = glob->to; } - + /* shader renaming for sof2 */ if ( renameModelShaders ) { strcpy( shaderName, picoShaderName ); @@ -404,7 +404,7 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap else{ si = ShaderInfoForShader( picoShaderName ); } - + /* allocate a surface (ydnar: gs mods) */ ds = AllocDrawSurface( SURFACE_TRIANGLES ); ds->entityNum = eNum; @@ -428,7 +428,7 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap if ( lightmapSampleSize > 0.0f ) { ds->sampleSize = lightmapSampleSize; } - + /* set lightmap scale */ if ( lightmapScale > 0.0f ) { ds->lightmapScale = lightmapScale; @@ -441,27 +441,27 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap if ( shadeAngle > 0.0f ) { ds->shadeAngleDegrees = shadeAngle; } - + /* set particulars */ ds->numVerts = PicoGetSurfaceNumVertexes( surface ); ds->verts = safe_malloc( ds->numVerts * sizeof( ds->verts[ 0 ] ) ); memset( ds->verts, 0, ds->numVerts * sizeof( ds->verts[ 0 ] ) ); - + ds->numIndexes = PicoGetSurfaceNumIndexes( surface ); ds->indexes = safe_malloc( ds->numIndexes * sizeof( ds->indexes[ 0 ] ) ); memset( ds->indexes, 0, ds->numIndexes * sizeof( ds->indexes[ 0 ] ) ); - + /* copy vertexes */ for ( i = 0; i < ds->numVerts; i++ ) { /* get vertex */ dv = &ds->verts[ i ]; - + /* xyz and normal */ xyz = PicoGetSurfaceXYZ( surface, i ); VectorCopy( xyz, dv->xyz ); m4x4_transform_point( transform, dv->xyz ); - + normal = PicoGetSurfaceNormal( surface, i ); VectorCopy( normal, dv->normal ); m4x4_transform_normal( nTransform, dv->normal ); @@ -472,14 +472,14 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap dv->st[ 0 ] = si->stFlat[ 0 ]; dv->st[ 1 ] = si->stFlat[ 1 ]; } - + /* ydnar: gs mods: added support for explicit shader texcoord generation */ else if ( si->tcGen ) { /* project the texture */ dv->st[ 0 ] = DotProduct( si->vecs[ 0 ], dv->xyz ); dv->st[ 1 ] = DotProduct( si->vecs[ 1 ], dv->xyz ); } - + /* normal texture coordinates */ else { @@ -487,7 +487,7 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap dv->st[ 0 ] = st[ 0 ]; dv->st[ 1 ] = st[ 1 ]; } - + /* set lightmap/color bits */ color = PicoGetSurfaceColor( surface, 0, i ); for ( j = 0; j < MAX_LIGHTMAPS; j++ ) @@ -509,44 +509,44 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap } } } - + /* copy indexes */ indexes = PicoGetSurfaceIndexes( surface, 0 ); for ( i = 0; i < ds->numIndexes; i++ ) ds->indexes[ i ] = indexes[ i ]; - + /* set cel shader */ ds->celShader = celShader; - + /* ydnar: giant hack land: generate clipping brushes for model triangles */ if ( si->clipModel || ( spawnFlags & 2 ) ) { /* 2nd bit */ - vec3_t points[ 4 ], backs[ 3 ]; - vec4_t plane, reverse, pa, pb, pc; - - + vec3_t points[ 4 ], backs[ 3 ]; + vec4_t plane, reverse, pa, pb, pc; + + /* temp hack */ if ( !si->clipModel && !( si->compileFlags & C_SOLID ) ) { continue; } - + /* walk triangle list */ for ( i = 0; i < ds->numIndexes; i += 3 ) { /* overflow hack */ AUTOEXPAND_BY_REALLOC( mapplanes, ( nummapplanes + 64 ) << 1, allocatedmapplanes, 1024 ); - + /* make points and back points */ for ( j = 0; j < 3; j++ ) { /* get vertex */ dv = &ds->verts[ ds->indexes[ i + j ] ]; - + /* copy xyz */ VectorCopy( dv->xyz, points[ j ] ); } VectorCopy( points[0], points[3] ); // for cyclic usage - + /* make plane for triangle */ // div0: add some extra spawnflags: // 0: snap normals to axial planes for extrusion @@ -617,7 +617,7 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap } if ( distanceEpsilon > 0 ) { distanceEpsilon = 0; - } + } } else{ buildBrush->detail = qtrue; @@ -642,13 +642,13 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap // that's at least sqrt(1/3) backPlaneDistance, unless in DOWN mode; in DOWN mode, we are screwed anyway if we encounter a plane that's perpendicular to the xy plane) if ( PlaneFromPoints( pa, points[ 2 ], points[ 1 ], backs[ 1 ] ) && - PlaneFromPoints( pb, points[ 1 ], points[ 0 ], backs[ 0 ] ) && + PlaneFromPoints( pb, points[ 1 ], points[ 0 ], backs[ 0 ] ) && PlaneFromPoints( pc, points[ 0 ], points[ 2 ], backs[ 2 ] ) ) { /* set up brush sides */ buildBrush->numsides = 5; buildBrush->sides[ 0 ].shaderInfo = si; for ( j = 1; j < buildBrush->numsides; j++ ) - buildBrush->sides[ j ].shaderInfo = NULL; // don't emit these faces as draw surfaces, should make smaller BSPs; hope this works + buildBrush->sides[ j ].shaderInfo = NULL; // don't emit these faces as draw surfaces, should make smaller BSPs; hope this works buildBrush->sides[ 0 ].planenum = FindFloatPlane( plane, plane[ 3 ], 3, points ); buildBrush->sides[ 1 ].planenum = FindFloatPlane( pa, pa[ 3 ], 2, &points[ 1 ] ); // pa contains points[1] and points[2] @@ -675,11 +675,11 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap } else{ free( buildBrush ); + } } } } } - } } @@ -690,25 +690,25 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap */ void AddTriangleModels( entity_t *e ){ - int num, frame, skin, castShadows, recvShadows, spawnFlags; - entity_t *e2; - const char *targetName; - const char *target, *model, *value; - char shader[ MAX_QPATH ]; - shaderInfo_t *celShader; - float temp, baseLightmapScale, lightmapScale; - float shadeAngle; - int lightmapSampleSize; - vec3_t origin, scale, angles; - m4x4_t transform; - epair_t *ep; - remap_t *remap, *remap2; - char *split; - - + int num, frame, skin, castShadows, recvShadows, spawnFlags; + entity_t *e2; + const char *targetName; + const char *target, *model, *value; + char shader[ MAX_QPATH ]; + shaderInfo_t *celShader; + float temp, baseLightmapScale, lightmapScale; + float shadeAngle; + int lightmapSampleSize; + vec3_t origin, scale, angles; + m4x4_t transform; + epair_t *ep; + remap_t *remap, *remap2; + char *split; + + /* note it */ Sys_FPrintf( SYS_VRB, "--- AddTriangleModels ---\n" ); - + /* get current brush entity targetname */ if ( e == entities ) { targetName = ""; @@ -716,18 +716,18 @@ void AddTriangleModels( entity_t *e ){ else { targetName = ValueForKey( e, "targetname" ); - + /* misc_model entities target non-worldspawn brush model entities */ if ( targetName[ 0 ] == '\0' ) { return; + } } - } - + /* get lightmap scale */ /* vortex: added _ls key (short name of lightmapscale) */ baseLightmapScale = 0.0f; if ( strcmp( "", ValueForKey( e, "lightmapscale" ) ) || - strcmp( "", ValueForKey( e, "_lightmapscale" ) ) || + strcmp( "", ValueForKey( e, "_lightmapscale" ) ) || strcmp( "", ValueForKey( e, "_ls" ) ) ) { baseLightmapScale = FloatForKey( e, "lightmapscale" ); if ( baseLightmapScale <= 0.0f ) { @@ -741,16 +741,16 @@ void AddTriangleModels( entity_t *e ){ } if ( baseLightmapScale > 0.0f ) { Sys_Printf( "World Entity has lightmap scale of %.4f\n", baseLightmapScale ); + } } - } - - + + /* walk the entity list */ for ( num = 1; num < numEntities; num++ ) { /* get e2 */ e2 = &entities[ num ]; - + /* convert misc_models into raw geometry */ if ( Q_stricmp( "misc_model", ValueForKey( e2, "classname" ) ) ) { continue; @@ -761,15 +761,15 @@ void AddTriangleModels( entity_t *e ){ if ( strcmp( target, targetName ) ) { continue; } - + /* get model name */ model = ValueForKey( e2, "model" ); if ( model[ 0 ] == '\0' ) { Sys_Printf( "WARNING: misc_model at %i %i %i without a model key\n", - (int) origin[ 0 ], (int) origin[ 1 ], (int) origin[ 2 ] ); + (int) origin[ 0 ], (int) origin[ 1 ], (int) origin[ 2 ] ); continue; } - + /* get model frame */ frame = 0; if ( strcmp( "", ValueForKey( e2, "_frame" ) ) ) { @@ -778,30 +778,30 @@ void AddTriangleModels( entity_t *e ){ else if ( strcmp( "", ValueForKey( e2, "frame" ) ) ) { frame = IntForKey( e2, "frame" ); } - + /* worldspawn (and func_groups) default to cast/recv shadows in worldspawn group */ if ( e == entities ) { castShadows = WORLDSPAWN_CAST_SHADOWS; recvShadows = WORLDSPAWN_RECV_SHADOWS; } - + /* other entities don't cast any shadows, but recv worldspawn shadows */ else { castShadows = ENTITY_CAST_SHADOWS; recvShadows = ENTITY_RECV_SHADOWS; } - + /* get explicit shadow flags */ GetEntityShadowFlags( e2, e, &castShadows, &recvShadows ); - + /* get spawnflags */ spawnFlags = IntForKey( e2, "spawnflags" ); - + /* get origin */ GetVectorForKey( e2, "origin", origin ); - VectorSubtract( origin, e->origin, origin ); /* offset by parent */ - + VectorSubtract( origin, e->origin, origin ); /* offset by parent */ + /* get scale */ scale[ 0 ] = scale[ 1 ] = scale[ 2 ] = 1.0f; temp = FloatForKey( e2, "modelscale" ); @@ -812,7 +812,7 @@ void AddTriangleModels( entity_t *e ){ if ( value[ 0 ] != '\0' ) { sscanf( value, "%f %f %f", &scale[ 0 ], &scale[ 1 ], &scale[ 2 ] ); } - + /* get "angle" (yaw) or "angles" (pitch yaw roll) */ angles[ 0 ] = angles[ 1 ] = angles[ 2 ] = 0.0f; angles[ 2 ] = FloatForKey( e2, "angle" ); @@ -820,25 +820,25 @@ void AddTriangleModels( entity_t *e ){ if ( value[ 0 ] != '\0' ) { sscanf( value, "%f %f %f", &angles[ 1 ], &angles[ 2 ], &angles[ 0 ] ); } - + /* set transform matrix (thanks spog) */ m4x4_identity( transform ); m4x4_pivoted_transform_by_vec3( transform, origin, angles, eXYZ, scale, vec3_origin ); - + /* get shader remappings */ remap = NULL; for ( ep = e2->epairs; ep != NULL; ep = ep->next ) { /* look for keys prefixed with "_remap" */ if ( ep->key != NULL && ep->value != NULL && - ep->key[ 0 ] != '\0' && ep->value[ 0 ] != '\0' && + ep->key[ 0 ] != '\0' && ep->value[ 0 ] != '\0' && !Q_strncasecmp( ep->key, "_remap", 6 ) ) { /* create new remapping */ remap2 = remap; remap = safe_malloc( sizeof( *remap ) ); remap->next = remap2; strcpy( remap->from, ep->value ); - + /* split the string */ split = strchr( remap->from, ';' ); if ( split == NULL ) { @@ -847,16 +847,16 @@ void AddTriangleModels( entity_t *e ){ remap = remap2; continue; } - + /* store the split */ *split = '\0'; strcpy( remap->to, ( split + 1 ) ); - + /* note it */ //% Sys_FPrintf( SYS_VRB, "Remapping %s to %s\n", remap->from, remap->to ); } } - + /* ydnar: cel shader support */ value = ValueForKey( e2, "_celshader" ); if ( value[ 0 ] == '\0' ) { @@ -891,7 +891,7 @@ void AddTriangleModels( entity_t *e ){ /* vortex: added _ls key (short name of lightmapscale) */ lightmapScale = 0.0f; if ( strcmp( "", ValueForKey( e2, "lightmapscale" ) ) || - strcmp( "", ValueForKey( e2, "_lightmapscale" ) ) || + strcmp( "", ValueForKey( e2, "_lightmapscale" ) ) || strcmp( "", ValueForKey( e2, "_ls" ) ) ) { lightmapScale = FloatForKey( e2, "lightmapscale" ); if ( lightmapScale <= 0.0f ) { @@ -905,7 +905,7 @@ void AddTriangleModels( entity_t *e ){ } if ( lightmapScale > 0.0f ) { Sys_Printf( "misc_model has lightmap scale of %.4f\n", lightmapScale ); - } + } } /* jal : entity based _shadeangle */ @@ -942,7 +942,7 @@ void AddTriangleModels( entity_t *e ){ /* insert the model */ InsertModel( model, skin, frame, transform, remap, celShader, mapEntityNum, castShadows, recvShadows, spawnFlags, lightmapScale, lightmapSampleSize, shadeAngle, colormod ); - + /* free shader remappings */ while ( remap != NULL ) { diff --git a/tools/quake3/q3map2/q3map2.h b/tools/quake3/q3map2/q3map2.h index 55e4b9d4..175672a5 100644 --- a/tools/quake3/q3map2/q3map2.h +++ b/tools/quake3/q3map2/q3map2.h @@ -38,7 +38,7 @@ #ifndef Q3MAP_VERSION #error no Q3MAP_VERSION defined #endif -#define Q3MAP_MOTD "Your map saw the pretty lights from q3map2's BFG" +#define Q3MAP_MOTD "Your map saw the pretty lights from q3map2's BFG" @@ -66,7 +66,7 @@ /* general */ -#include "version.h" /* ttimo: might want to guard that if built outside of the GtkRadiant tree */ +#include "version.h" /* ttimo: might want to guard that if built outside of the GtkRadiant tree */ #include "cmdlib.h" #include "mathlib.h" @@ -95,20 +95,20 @@ ------------------------------------------------------------------------------- */ -#define MAC_STATIC_HACK 0 -#if defined( __APPLE__ ) && MAC_STATIC_HACK - #define MAC_STATIC static +#define MAC_STATIC_HACK 0 +#if defined( __APPLE__ ) && MAC_STATIC_HACK + #define MAC_STATIC static #else - #define MAC_STATIC + #define MAC_STATIC #endif #if 1 #ifdef WIN32 - #define Q_stricmp stricmp - #define Q_strncasecmp strnicmp + #define Q_stricmp stricmp + #define Q_strncasecmp strnicmp #else - #define Q_stricmp strcasecmp - #define Q_strncasecmp strncasecmp + #define Q_stricmp strcasecmp + #define Q_strncasecmp strncasecmp #endif #endif @@ -125,164 +125,164 @@ /* temporary hacks and tests (please keep off in SVN to prevent anyone's legacy map from screwing up) */ /* 2011-01-10 TTimo says we should turn these on in SVN, so turning on now */ -#define Q3MAP2_EXPERIMENTAL_HIGH_PRECISION_MATH_FIXES 1 -#define Q3MAP2_EXPERIMENTAL_SNAP_NORMAL_FIX 1 -#define Q3MAP2_EXPERIMENTAL_SNAP_PLANE_FIX 1 +#define Q3MAP2_EXPERIMENTAL_HIGH_PRECISION_MATH_FIXES 1 +#define Q3MAP2_EXPERIMENTAL_SNAP_NORMAL_FIX 1 +#define Q3MAP2_EXPERIMENTAL_SNAP_PLANE_FIX 1 /* general */ -#define MAX_QPATH 64 +#define MAX_QPATH 64 -#define MAX_IMAGES 512 -#define DEFAULT_IMAGE "*default" +#define MAX_IMAGES 512 +#define DEFAULT_IMAGE "*default" -#define MAX_MODELS 512 +#define MAX_MODELS 512 -#define DEF_BACKSPLASH_FRACTION 0.05f /* 5% backsplash by default */ -#define DEF_BACKSPLASH_DISTANCE 23 +#define DEF_BACKSPLASH_FRACTION 0.05f /* 5% backsplash by default */ +#define DEF_BACKSPLASH_DISTANCE 23 -#define DEF_RADIOSITY_BOUNCE 1.0f /* ydnar: default to 100% re-emitted light */ +#define DEF_RADIOSITY_BOUNCE 1.0f /* ydnar: default to 100% re-emitted light */ -#define MAX_SHADER_INFO 8192 +#define MAX_SHADER_INFO 8192 #define MAX_CUST_SURFACEPARMS 256 -#define SHADER_MAX_VERTEXES 1000 +#define SHADER_MAX_VERTEXES 1000 #define SHADER_MAX_INDEXES ( 6 * SHADER_MAX_VERTEXES ) -#define MAX_JITTERS 256 +#define MAX_JITTERS 256 /* epair parsing (note case-sensitivity directive) */ -#define CASE_INSENSITIVE_EPAIRS 1 +#define CASE_INSENSITIVE_EPAIRS 1 #if CASE_INSENSITIVE_EPAIRS - #define EPAIR_STRCMP Q_stricmp + #define EPAIR_STRCMP Q_stricmp #else - #define EPAIR_STRCMP strcmp + #define EPAIR_STRCMP strcmp #endif /* ydnar: compiler flags, because games have widely varying content/surface flags */ -#define C_SOLID 0x00000001 -#define C_TRANSLUCENT 0x00000002 -#define C_STRUCTURAL 0x00000004 -#define C_HINT 0x00000008 -#define C_NODRAW 0x00000010 -#define C_LIGHTGRID 0x00000020 -#define C_ALPHASHADOW 0x00000040 -#define C_LIGHTFILTER 0x00000080 -#define C_VERTEXLIT 0x00000100 -#define C_LIQUID 0x00000200 -#define C_FOG 0x00000400 -#define C_SKY 0x00000800 -#define C_ORIGIN 0x00001000 -#define C_AREAPORTAL 0x00002000 -#define C_ANTIPORTAL 0x00004000 /* like hint, but doesn't generate portals */ -#define C_SKIP 0x00008000 /* like hint, but skips this face (doesn't split bsp) */ -#define C_NOMARKS 0x00010000 /* no decals */ -#define C_DETAIL 0x08000000 /* THIS MUST BE THE SAME AS IN RADIANT! */ +#define C_SOLID 0x00000001 +#define C_TRANSLUCENT 0x00000002 +#define C_STRUCTURAL 0x00000004 +#define C_HINT 0x00000008 +#define C_NODRAW 0x00000010 +#define C_LIGHTGRID 0x00000020 +#define C_ALPHASHADOW 0x00000040 +#define C_LIGHTFILTER 0x00000080 +#define C_VERTEXLIT 0x00000100 +#define C_LIQUID 0x00000200 +#define C_FOG 0x00000400 +#define C_SKY 0x00000800 +#define C_ORIGIN 0x00001000 +#define C_AREAPORTAL 0x00002000 +#define C_ANTIPORTAL 0x00004000 /* like hint, but doesn't generate portals */ +#define C_SKIP 0x00008000 /* like hint, but skips this face (doesn't split bsp) */ +#define C_NOMARKS 0x00010000 /* no decals */ +#define C_DETAIL 0x08000000 /* THIS MUST BE THE SAME AS IN RADIANT! */ /* shadow flags */ -#define WORLDSPAWN_CAST_SHADOWS 1 -#define WORLDSPAWN_RECV_SHADOWS 1 -#define ENTITY_CAST_SHADOWS 0 -#define ENTITY_RECV_SHADOWS 1 +#define WORLDSPAWN_CAST_SHADOWS 1 +#define WORLDSPAWN_RECV_SHADOWS 1 +#define ENTITY_CAST_SHADOWS 0 +#define ENTITY_RECV_SHADOWS 1 /* bsp */ -#define MAX_PATCH_SIZE 32 -#define MAX_BRUSH_SIDES 1024 -#define MAX_BUILD_SIDES 1024 +#define MAX_PATCH_SIZE 32 +#define MAX_BRUSH_SIDES 1024 +#define MAX_BUILD_SIDES 1024 -#define MAX_EXPANDED_AXIS 128 +#define MAX_EXPANDED_AXIS 128 -#define CLIP_EPSILON 0.1f -#define PLANESIDE_EPSILON 0.001f -#define PLANENUM_LEAF -1 +#define CLIP_EPSILON 0.1f +#define PLANESIDE_EPSILON 0.001f +#define PLANENUM_LEAF -1 -#define HINT_PRIORITY 1000 /* ydnar: force hint splits first and antiportal/areaportal splits last */ -#define ANTIPORTAL_PRIORITY -1000 -#define AREAPORTAL_PRIORITY -1000 -#define DETAIL_PRIORITY -3000 +#define HINT_PRIORITY 1000 /* ydnar: force hint splits first and antiportal/areaportal splits last */ +#define ANTIPORTAL_PRIORITY -1000 +#define AREAPORTAL_PRIORITY -1000 +#define DETAIL_PRIORITY -3000 -#define PSIDE_FRONT 1 -#define PSIDE_BACK 2 +#define PSIDE_FRONT 1 +#define PSIDE_BACK 2 #define PSIDE_BOTH ( PSIDE_FRONT | PSIDE_BACK ) -#define PSIDE_FACING 4 +#define PSIDE_FACING 4 -#define BPRIMIT_UNDEFINED 0 -#define BPRIMIT_OLDBRUSHES 1 -#define BPRIMIT_NEWBRUSHES 2 +#define BPRIMIT_UNDEFINED 0 +#define BPRIMIT_OLDBRUSHES 1 +#define BPRIMIT_NEWBRUSHES 2 /* vis */ -#define VIS_HEADER_SIZE 8 +#define VIS_HEADER_SIZE 8 -#define SEPERATORCACHE /* seperator caching helps a bit */ +#define SEPERATORCACHE /* seperator caching helps a bit */ -#define PORTALFILE "PRT1" +#define PORTALFILE "PRT1" -#define MAX_PORTALS 0x20000 /* same as MAX_MAP_PORTALS */ -#define MAX_SEPERATORS MAX_POINTS_ON_WINDING -#define MAX_POINTS_ON_FIXED_WINDING 24 /* ydnar: increased this from 12 at the expense of more memory */ -#define MAX_PORTALS_ON_LEAF 1024 +#define MAX_PORTALS 0x20000 /* same as MAX_MAP_PORTALS */ +#define MAX_SEPERATORS MAX_POINTS_ON_WINDING +#define MAX_POINTS_ON_FIXED_WINDING 24 /* ydnar: increased this from 12 at the expense of more memory */ +#define MAX_PORTALS_ON_LEAF 1024 /* light */ -#define EMIT_POINT 0 -#define EMIT_AREA 1 -#define EMIT_SPOT 2 -#define EMIT_SUN 3 - -#define LIGHT_ATTEN_LINEAR 1 -#define LIGHT_ATTEN_ANGLE 2 -#define LIGHT_ATTEN_DISTANCE 4 -#define LIGHT_TWOSIDED 8 -#define LIGHT_GRID 16 -#define LIGHT_SURFACES 32 -#define LIGHT_DARK 64 /* probably never use this */ -#define LIGHT_FAST 256 -#define LIGHT_FAST_TEMP 512 +#define EMIT_POINT 0 +#define EMIT_AREA 1 +#define EMIT_SPOT 2 +#define EMIT_SUN 3 + +#define LIGHT_ATTEN_LINEAR 1 +#define LIGHT_ATTEN_ANGLE 2 +#define LIGHT_ATTEN_DISTANCE 4 +#define LIGHT_TWOSIDED 8 +#define LIGHT_GRID 16 +#define LIGHT_SURFACES 32 +#define LIGHT_DARK 64 /* probably never use this */ +#define LIGHT_FAST 256 +#define LIGHT_FAST_TEMP 512 #define LIGHT_FAST_ACTUAL ( LIGHT_FAST | LIGHT_FAST_TEMP ) -#define LIGHT_NEGATIVE 1024 -#define LIGHT_UNNORMALIZED 2048 /* vortex: do not normalize _color */ +#define LIGHT_NEGATIVE 1024 +#define LIGHT_UNNORMALIZED 2048 /* vortex: do not normalize _color */ #define LIGHT_SUN_DEFAULT ( LIGHT_ATTEN_ANGLE | LIGHT_GRID | LIGHT_SURFACES ) #define LIGHT_AREA_DEFAULT ( LIGHT_ATTEN_ANGLE | LIGHT_ATTEN_DISTANCE | LIGHT_GRID | LIGHT_SURFACES ) /* q3a and wolf are the same */ #define LIGHT_Q3A_DEFAULT ( LIGHT_ATTEN_ANGLE | LIGHT_ATTEN_DISTANCE | LIGHT_GRID | LIGHT_SURFACES | LIGHT_FAST ) #define LIGHT_WOLF_DEFAULT ( LIGHT_ATTEN_LINEAR | LIGHT_ATTEN_DISTANCE | LIGHT_GRID | LIGHT_SURFACES | LIGHT_FAST ) -#define MAX_TRACE_TEST_NODES 256 -#define DEFAULT_INHIBIT_RADIUS 1.5f +#define MAX_TRACE_TEST_NODES 256 +#define DEFAULT_INHIBIT_RADIUS 1.5f -#define LUXEL_EPSILON 0.125f -#define VERTEX_EPSILON -0.125f -#define GRID_EPSILON 0.0f +#define LUXEL_EPSILON 0.125f +#define VERTEX_EPSILON -0.125f +#define GRID_EPSILON 0.0f -#define DEFAULT_LIGHTMAP_SAMPLE_SIZE 16 -#define DEFAULT_LIGHTMAP_MIN_SAMPLE_SIZE 0 -#define DEFAULT_LIGHTMAP_SAMPLE_OFFSET 1.0f -#define DEFAULT_SUBDIVIDE_THRESHOLD 1.0f +#define DEFAULT_LIGHTMAP_SAMPLE_SIZE 16 +#define DEFAULT_LIGHTMAP_MIN_SAMPLE_SIZE 0 +#define DEFAULT_LIGHTMAP_SAMPLE_OFFSET 1.0f +#define DEFAULT_SUBDIVIDE_THRESHOLD 1.0f -#define EXTRA_SCALE 2 /* -extrawide = -super 2 */ -#define EXTRAWIDE_SCALE 2 /* -extrawide = -super 2 -filter */ +#define EXTRA_SCALE 2 /* -extrawide = -super 2 */ +#define EXTRAWIDE_SCALE 2 /* -extrawide = -super 2 -filter */ -#define CLUSTER_UNMAPPED -1 -#define CLUSTER_OCCLUDED -2 -#define CLUSTER_FLOODED -3 +#define CLUSTER_UNMAPPED -1 +#define CLUSTER_OCCLUDED -2 +#define CLUSTER_FLOODED -3 -#define VERTEX_LUXEL_SIZE 3 -#define BSP_LUXEL_SIZE 3 -#define RAD_LUXEL_SIZE 3 -#define SUPER_LUXEL_SIZE 4 -#define SUPER_FLAG_SIZE 4 +#define VERTEX_LUXEL_SIZE 3 +#define BSP_LUXEL_SIZE 3 +#define RAD_LUXEL_SIZE 3 +#define SUPER_LUXEL_SIZE 4 +#define SUPER_FLAG_SIZE 4 #define FLAG_FORCE_SUBSAMPLING 1 #define FLAG_ALREADY_SUBSAMPLED 2 -#define SUPER_ORIGIN_SIZE 3 -#define SUPER_NORMAL_SIZE 4 -#define SUPER_DELUXEL_SIZE 3 -#define BSP_DELUXEL_SIZE 3 -#define SUPER_FLOODLIGHT_SIZE 4 +#define SUPER_ORIGIN_SIZE 3 +#define SUPER_NORMAL_SIZE 4 +#define SUPER_DELUXEL_SIZE 3 +#define BSP_DELUXEL_SIZE 3 +#define SUPER_FLOODLIGHT_SIZE 4 #define VERTEX_LUXEL( s, v ) ( vertexLuxels[ s ] + ( ( v ) * VERTEX_LUXEL_SIZE ) ) #define RAD_VERTEX_LUXEL( s, v )( radVertexLuxels[ s ] + ( ( v ) * VERTEX_LUXEL_SIZE ) ) @@ -306,41 +306,41 @@ ------------------------------------------------------------------------------- */ -#define EXTERNAL_LIGHTMAP "lm_%04d.tga" +#define EXTERNAL_LIGHTMAP "lm_%04d.tga" -#define MAX_LIGHTMAPS 4 /* RBSP */ -#define MAX_LIGHT_STYLES 64 -#define MAX_SWITCHED_LIGHTS 32 -#define LS_NORMAL 0x00 -#define LS_UNUSED 0xFE -#define LS_NONE 0xFF +#define MAX_LIGHTMAPS 4 /* RBSP */ +#define MAX_LIGHT_STYLES 64 +#define MAX_SWITCHED_LIGHTS 32 +#define LS_NORMAL 0x00 +#define LS_UNUSED 0xFE +#define LS_NONE 0xFF -#define MAX_LIGHTMAP_SHADERS 256 +#define MAX_LIGHTMAP_SHADERS 256 /* ok to increase these at the expense of more memory */ -#define MAX_MAP_AREAS 0x100 /* MAX_MAP_AREA_BYTES in q_shared must match! */ -#define MAX_MAP_FOGS 30 //& 0x100 /* RBSP (32 - world fog - goggles) */ -#define MAX_MAP_LEAFS 0x20000 -#define MAX_MAP_PORTALS 0x20000 -#define MAX_MAP_LIGHTING 0x800000 -#define MAX_MAP_LIGHTGRID 0x100000 //% 0x800000 /* ydnar: set to points, not bytes */ +#define MAX_MAP_AREAS 0x100 /* MAX_MAP_AREA_BYTES in q_shared must match! */ +#define MAX_MAP_FOGS 30 //& 0x100 /* RBSP (32 - world fog - goggles) */ +#define MAX_MAP_LEAFS 0x20000 +#define MAX_MAP_PORTALS 0x20000 +#define MAX_MAP_LIGHTING 0x800000 +#define MAX_MAP_LIGHTGRID 0x100000 //% 0x800000 /* ydnar: set to points, not bytes */ #define MAX_MAP_VISCLUSTERS 0x4000 // <= MAX_MAP_LEAFS #define MAX_MAP_VISIBILITY ( VIS_HEADER_SIZE + MAX_MAP_VISCLUSTERS * ( ( ( MAX_MAP_VISCLUSTERS + 63 ) & ~63 ) >> 3 ) ) -#define MAX_MAP_DRAW_SURFS 0x20000 +#define MAX_MAP_DRAW_SURFS 0x20000 -#define MAX_MAP_ADVERTISEMENTS 30 +#define MAX_MAP_ADVERTISEMENTS 30 /* key / value pair sizes in the entities lump */ -#define MAX_KEY 32 -#define MAX_VALUE 1024 +#define MAX_KEY 32 +#define MAX_VALUE 1024 /* the editor uses these predefined yaw angles to orient entities up or down */ -#define ANGLE_UP -1 -#define ANGLE_DOWN -2 +#define ANGLE_UP -1 +#define ANGLE_DOWN -2 -#define LIGHTMAP_WIDTH 128 -#define LIGHTMAP_HEIGHT 128 +#define LIGHTMAP_WIDTH 128 +#define LIGHTMAP_HEIGHT 128 #define MIN_WORLD_COORD ( -65536 ) #define MAX_WORLD_COORD ( 65536 ) @@ -352,35 +352,35 @@ typedef void ( *bspFunc )( const char * ); typedef struct { - int offset, length; + int offset, length; } bspLump_t; typedef struct { - char ident[ 4 ]; - int version; - - bspLump_t lumps[ 100 ]; /* theoretical maximum # of bsp lumps */ + char ident[ 4 ]; + int version; + + bspLump_t lumps[ 100 ]; /* theoretical maximum # of bsp lumps */ } bspHeader_t; typedef struct { - float mins[ 3 ], maxs[ 3 ]; - int firstBSPSurface, numBSPSurfaces; - int firstBSPBrush, numBSPBrushes; + float mins[ 3 ], maxs[ 3 ]; + int firstBSPSurface, numBSPSurfaces; + int firstBSPBrush, numBSPBrushes; } bspModel_t; typedef struct { - char shader[ MAX_QPATH ]; - int surfaceFlags; - int contentFlags; + char shader[ MAX_QPATH ]; + int surfaceFlags; + int contentFlags; } bspShader_t; @@ -389,73 +389,73 @@ bspShader_t; typedef struct { - float normal[ 3 ]; - float dist; + float normal[ 3 ]; + float dist; } bspPlane_t; typedef struct { - int planeNum; - int children[ 2 ]; /* negative numbers are -(leafs+1), not nodes */ - int mins[ 3 ]; /* for frustom culling */ - int maxs[ 3 ]; + int planeNum; + int children[ 2 ]; /* negative numbers are -(leafs+1), not nodes */ + int mins[ 3 ]; /* for frustom culling */ + int maxs[ 3 ]; } bspNode_t; typedef struct { - int cluster; /* -1 = opaque cluster (do I still store these?) */ - int area; - - int mins[ 3 ]; /* for frustum culling */ - int maxs[ 3 ]; - - int firstBSPLeafSurface; - int numBSPLeafSurfaces; - - int firstBSPLeafBrush; - int numBSPLeafBrushes; + int cluster; /* -1 = opaque cluster (do I still store these?) */ + int area; + + int mins[ 3 ]; /* for frustum culling */ + int maxs[ 3 ]; + + int firstBSPLeafSurface; + int numBSPLeafSurfaces; + + int firstBSPLeafBrush; + int numBSPLeafBrushes; } bspLeaf_t; typedef struct { - int planeNum; /* positive plane side faces out of the leaf */ - int shaderNum; - int surfaceNum; /* RBSP */ + int planeNum; /* positive plane side faces out of the leaf */ + int shaderNum; + int surfaceNum; /* RBSP */ } bspBrushSide_t; typedef struct { - int firstSide; - int numSides; - int shaderNum; /* the shader that determines the content flags */ + int firstSide; + int numSides; + int shaderNum; /* the shader that determines the content flags */ } bspBrush_t; typedef struct { - char shader[ MAX_QPATH ]; - int brushNum; - int visibleSide; /* the brush side that ray tests need to clip against (-1 == none) */ + char shader[ MAX_QPATH ]; + int brushNum; + int visibleSide; /* the brush side that ray tests need to clip against (-1 == none) */ } bspFog_t; typedef struct { - vec3_t xyz; - float st[ 2 ]; - float lightmap[ MAX_LIGHTMAPS ][ 2 ]; /* RBSP */ - vec3_t normal; - byte color[ MAX_LIGHTMAPS ][ 4 ]; /* RBSP */ + vec3_t xyz; + float st[ 2 ]; + float lightmap[ MAX_LIGHTMAPS ][ 2 ]; /* RBSP */ + vec3_t normal; + byte color[ MAX_LIGHTMAPS ][ 4 ]; /* RBSP */ } bspDrawVert_t; @@ -474,47 +474,47 @@ bspSurfaceType_t; typedef struct bspGridPoint_s { - byte ambient[ MAX_LIGHTMAPS ][ 3 ]; - byte directed[ MAX_LIGHTMAPS ][ 3 ]; - byte styles[ MAX_LIGHTMAPS ]; - byte latLong[ 2 ]; + byte ambient[ MAX_LIGHTMAPS ][ 3 ]; + byte directed[ MAX_LIGHTMAPS ][ 3 ]; + byte styles[ MAX_LIGHTMAPS ]; + byte latLong[ 2 ]; } bspGridPoint_t; typedef struct { - int shaderNum; - int fogNum; - int surfaceType; - - int firstVert; - int numVerts; - - int firstIndex; - int numIndexes; - - byte lightmapStyles[ MAX_LIGHTMAPS ]; /* RBSP */ - byte vertexStyles[ MAX_LIGHTMAPS ]; /* RBSP */ - int lightmapNum[ MAX_LIGHTMAPS ]; /* RBSP */ - int lightmapX[ MAX_LIGHTMAPS ], lightmapY[ MAX_LIGHTMAPS ]; /* RBSP */ - int lightmapWidth, lightmapHeight; - - vec3_t lightmapOrigin; - vec3_t lightmapVecs[ 3 ]; /* on patches, [ 0 ] and [ 1 ] are lodbounds */ - - int patchWidth; - int patchHeight; + int shaderNum; + int fogNum; + int surfaceType; + + int firstVert; + int numVerts; + + int firstIndex; + int numIndexes; + + byte lightmapStyles[ MAX_LIGHTMAPS ]; /* RBSP */ + byte vertexStyles[ MAX_LIGHTMAPS ]; /* RBSP */ + int lightmapNum[ MAX_LIGHTMAPS ]; /* RBSP */ + int lightmapX[ MAX_LIGHTMAPS ], lightmapY[ MAX_LIGHTMAPS ]; /* RBSP */ + int lightmapWidth, lightmapHeight; + + vec3_t lightmapOrigin; + vec3_t lightmapVecs[ 3 ]; /* on patches, [ 0 ] and [ 1 ] are lodbounds */ + + int patchWidth; + int patchHeight; } bspDrawSurface_t; /* advertisements */ typedef struct { - int cellId; - vec3_t normal; - vec3_t rect[4]; - char model[ MAX_QPATH ]; + int cellId; + vec3_t normal; + vec3_t rect[4]; + char model[ MAX_QPATH ]; } bspAdvertisement_t; @@ -525,20 +525,20 @@ typedef struct { ------------------------------------------------------------------------------- */ /* ydnar: for smaller structs */ -typedef unsigned char qb_t; +typedef unsigned char qb_t; /* ydnar: for q3map_tcMod */ -typedef float tcMod_t[ 3 ][ 3 ]; +typedef float tcMod_t[ 3 ][ 3 ]; /* ydnar: for multiple game support */ typedef struct surfaceParm_s { - char *name; - int contentFlags, contentFlagsClear; - int surfaceFlags, surfaceFlagsClear; - int compileFlags, compileFlagsClear; + char *name; + int contentFlags, contentFlagsClear; + int surfaceFlags, surfaceFlagsClear; + int compileFlags, compileFlagsClear; } surfaceParm_t; @@ -552,110 +552,110 @@ miniMapMode_t; typedef struct game_s { - char *arg; /* -game matches this */ - char *gamePath; /* main game data dir */ - char *homeBasePath; /* home sub-dir on unix */ - char *magic; /* magic word for figuring out base path */ - char *shaderPath; /* shader directory */ - int maxLMSurfaceVerts; /* default maximum meta surface verts */ - int maxSurfaceVerts; /* default maximum surface verts */ - int maxSurfaceIndexes; /* default maximum surface indexes (tris * 3) */ - qboolean emitFlares; /* when true, emit flare surfaces */ - char *flareShader; /* default flare shader (MUST BE SET) */ - qboolean wolfLight; /* when true, lights work like wolf q3map */ - int lightmapSize; /* bsp lightmap width/height */ - float lightmapGamma; /* default lightmap gamma */ + char *arg; /* -game matches this */ + char *gamePath; /* main game data dir */ + char *homeBasePath; /* home sub-dir on unix */ + char *magic; /* magic word for figuring out base path */ + char *shaderPath; /* shader directory */ + int maxLMSurfaceVerts; /* default maximum meta surface verts */ + int maxSurfaceVerts; /* default maximum surface verts */ + int maxSurfaceIndexes; /* default maximum surface indexes (tris * 3) */ + qboolean emitFlares; /* when true, emit flare surfaces */ + char *flareShader; /* default flare shader (MUST BE SET) */ + qboolean wolfLight; /* when true, lights work like wolf q3map */ + int lightmapSize; /* bsp lightmap width/height */ + float lightmapGamma; /* default lightmap gamma */ qboolean lightmapsRGB; /* default lightmap sRGB mode */ qboolean texturesRGB; /* default texture sRGB mode */ qboolean colorsRGB; /* default color sRGB mode */ - float lightmapExposure; /* default lightmap exposure */ - float lightmapCompensate; /* default lightmap compensate value */ - float gridScale; /* vortex: default lightgrid scale (affects both directional and ambient spectres) */ - float gridAmbientScale; /* vortex: default lightgrid ambient spectre scale */ - qboolean lightAngleHL; /* jal: use half-lambert curve for light angle attenuation */ - qboolean noStyles; /* use lightstyles hack or not */ - qboolean keepLights; /* keep light entities on bsp */ - int patchSubdivisions; /* default patch subdivisions tolerance */ - qboolean patchShadows; /* patch casting enabled */ - qboolean deluxeMap; /* compile deluxemaps */ - int deluxeMode; /* deluxemap mode (0 - modelspace, 1 - tangentspace with renormalization, 2 - tangentspace without renormalization) */ - int miniMapSize; /* minimap size */ - float miniMapSharpen; /* minimap sharpening coefficient */ - float miniMapBorder; /* minimap border amount */ - qboolean miniMapKeepAspect; /* minimap keep aspect ratio by letterboxing */ - miniMapMode_t miniMapMode; /* minimap mode */ + float lightmapExposure; /* default lightmap exposure */ + float lightmapCompensate; /* default lightmap compensate value */ + float gridScale; /* vortex: default lightgrid scale (affects both directional and ambient spectres) */ + float gridAmbientScale; /* vortex: default lightgrid ambient spectre scale */ + qboolean lightAngleHL; /* jal: use half-lambert curve for light angle attenuation */ + qboolean noStyles; /* use lightstyles hack or not */ + qboolean keepLights; /* keep light entities on bsp */ + int patchSubdivisions; /* default patch subdivisions tolerance */ + qboolean patchShadows; /* patch casting enabled */ + qboolean deluxeMap; /* compile deluxemaps */ + int deluxeMode; /* deluxemap mode (0 - modelspace, 1 - tangentspace with renormalization, 2 - tangentspace without renormalization) */ + int miniMapSize; /* minimap size */ + float miniMapSharpen; /* minimap sharpening coefficient */ + float miniMapBorder; /* minimap border amount */ + qboolean miniMapKeepAspect; /* minimap keep aspect ratio by letterboxing */ + miniMapMode_t miniMapMode; /* minimap mode */ char *miniMapNameFormat; /* minimap name format */ - char *bspIdent; /* 4-letter bsp file prefix */ - int bspVersion; /* bsp version to use */ - qboolean lumpSwap; /* cod-style len/ofs order */ - bspFunc load, write; /* load/write function pointers */ - surfaceParm_t surfaceParms[ 128 ]; /* surfaceparm array */ + char *bspIdent; /* 4-letter bsp file prefix */ + int bspVersion; /* bsp version to use */ + qboolean lumpSwap; /* cod-style len/ofs order */ + bspFunc load, write; /* load/write function pointers */ + surfaceParm_t surfaceParms[ 128 ]; /* surfaceparm array */ } game_t; typedef struct image_s { - char *name, *filename; - int refCount; - int width, height; - byte *pixels; + char *name, *filename; + int refCount; + int width, height; + byte *pixels; } image_t; typedef struct sun_s { - struct sun_s *next; - vec3_t direction, color; - float photons, deviance, filterRadius; - int numSamples, style; + struct sun_s *next; + vec3_t direction, color; + float photons, deviance, filterRadius; + int numSamples, style; } sun_t; -typedef struct surfaceModel_s +typedef struct surfaceModel_s { - struct surfaceModel_s *next; - char model[ MAX_QPATH ]; - float density, odds; - float minScale, maxScale; - float minAngle, maxAngle; - qboolean oriented; + struct surfaceModel_s *next; + char model[ MAX_QPATH ]; + float density, odds; + float minScale, maxScale; + float minAngle, maxAngle; + qboolean oriented; } surfaceModel_t; /* ydnar/sd: foliage stuff for wolf et (engine-supported optimization of the above) */ -typedef struct foliage_s +typedef struct foliage_s { - struct foliage_s *next; - char model[ MAX_QPATH ]; - float scale, density, odds; - qboolean inverseAlpha; + struct foliage_s *next; + char model[ MAX_QPATH ]; + float scale, density, odds; + qboolean inverseAlpha; } foliage_t; typedef struct foliageInstance_s { - vec3_t xyz, normal; + vec3_t xyz, normal; } foliageInstance_t; typedef struct remap_s { - struct remap_s *next; - char from[ 1024 ]; - char to[ MAX_QPATH ]; + struct remap_s *next; + char from[ 1024 ]; + char to[ MAX_QPATH ]; } remap_t; typedef struct skinfile_s { - struct skinfile_s *next; - char name[ 1024 ]; - char to[ MAX_QPATH ]; + struct skinfile_s *next; + char name[ 1024 ]; + char to[ MAX_QPATH ]; } skinfile_t; @@ -685,9 +685,9 @@ colorModType_t; typedef struct colorMod_s { - struct colorMod_s *next; - colorModType_t type; - vec_t data[ 16 ]; + struct colorMod_s *next; + colorModType_t type; + vec_t data[ 16 ]; } colorMod_t; @@ -704,115 +704,115 @@ implicitMap_t; typedef struct shaderInfo_s { - char shader[ MAX_QPATH ]; - int surfaceFlags; - int contentFlags; - int compileFlags; - float value; /* light value */ - - char *flareShader; /* for light flares */ - char *damageShader; /* ydnar: sof2 damage shader name */ - char *backShader; /* for surfaces that generate different front and back passes */ - char *cloneShader; /* ydnar: for cloning of a surface */ - char *remapShader; /* ydnar: remap a shader in final stage */ - char *deprecateShader; /* vortex: shader is deprecated and replaced by this on use */ - - surfaceModel_t *surfaceModel; /* ydnar: for distribution of models */ - foliage_t *foliage; /* ydnar/splash damage: wolf et foliage */ - - float subdivisions; /* from a "tesssize xxx" */ - float backsplashFraction; /* floating point value, usually 0.05 */ - float backsplashDistance; /* default 16 */ - float lightSubdivide; /* default 999 */ - float lightFilterRadius; /* ydnar: lightmap filtering/blurring radius for lights created by this shader (default: 0) */ - - int lightmapSampleSize; /* lightmap sample size */ - float lightmapSampleOffset; /* ydnar: lightmap sample offset (default: 1.0) */ - - float bounceScale; /* ydnar: radiosity re-emission [0,1.0+] */ - float offset; /* ydnar: offset in units */ - float shadeAngleDegrees; /* ydnar: breaking angle for smooth shading (degrees) */ - - vec3_t mins, maxs; /* ydnar: for particle studio vertexDeform move support */ - - qb_t legacyTerrain; /* ydnar: enable legacy terrain crutches */ - qb_t indexed; /* ydnar: attempt to use indexmap (terrain alphamap style) */ - qb_t forceMeta; /* ydnar: force metasurface path */ - qb_t noClip; /* ydnar: don't clip into bsp, preserve original face winding */ - qb_t noFast; /* ydnar: supress fast lighting for surfaces with this shader */ - qb_t invert; /* ydnar: reverse facing */ - qb_t nonplanar; /* ydnar: for nonplanar meta surface merging */ - qb_t tcGen; /* ydnar: has explicit texcoord generation */ - vec3_t vecs[ 2 ]; /* ydnar: explicit texture vectors for [0,1] texture space */ - tcMod_t mod; /* ydnar: q3map_tcMod matrix for djbob :) */ - vec3_t lightmapAxis; /* ydnar: explicit lightmap axis projection */ - colorMod_t *colorMod; /* ydnar: q3map_rgb/color/alpha/Set/Mod support */ - - int furNumLayers; /* ydnar: number of fur layers */ - float furOffset; /* ydnar: offset of each layer */ - float furFade; /* ydnar: alpha fade amount per layer */ - - qb_t splotchFix; /* ydnar: filter splotches on lightmaps */ - - qb_t hasPasses; /* false if the shader doesn't define any rendering passes */ - qb_t globalTexture; /* don't normalize texture repeats */ - qb_t twoSided; /* cull none */ - qb_t autosprite; /* autosprite shaders will become point lights instead of area lights */ - qb_t polygonOffset; /* ydnar: don't face cull this or against this */ - qb_t patchShadows; /* have patches casting shadows when using -light for this surface */ - qb_t vertexShadows; /* shadows will be casted at this surface even when vertex lit */ - qb_t forceSunlight; /* force sun light at this surface even tho we might not calculate shadows in vertex lighting */ - qb_t notjunc; /* don't use this surface for tjunction fixing */ - qb_t fogParms; /* ydnar: has fogparms */ - qb_t noFog; /* ydnar: supress fogging */ - qb_t clipModel; /* ydnar: solid model hack */ - qb_t noVertexLight; /* ydnar: leave vertex color alone */ - qb_t noDirty; /* jal: do not apply the dirty pass to this surface */ - - byte styleMarker; /* ydnar: light styles hack */ - - float vertexScale; /* vertex light scale */ - - char skyParmsImageBase[ MAX_QPATH ]; /* ydnar: for skies */ - - char editorImagePath[ MAX_QPATH ]; /* use this image to generate texture coordinates */ - char lightImagePath[ MAX_QPATH ]; /* use this image to generate color / averageColor */ - char normalImagePath[ MAX_QPATH ]; /* ydnar: normalmap image for bumpmapping */ - - implicitMap_t implicitMap; /* ydnar: enemy territory implicit shaders */ - char implicitImagePath[ MAX_QPATH ]; - - image_t *shaderImage; - image_t *lightImage; - image_t *normalImage; - - float skyLightValue; /* ydnar */ - int skyLightIterations; /* ydnar */ - sun_t *sun; /* ydnar */ - - vec3_t color; /* normalized color */ - vec3_t averageColor; - byte lightStyle; + char shader[ MAX_QPATH ]; + int surfaceFlags; + int contentFlags; + int compileFlags; + float value; /* light value */ + + char *flareShader; /* for light flares */ + char *damageShader; /* ydnar: sof2 damage shader name */ + char *backShader; /* for surfaces that generate different front and back passes */ + char *cloneShader; /* ydnar: for cloning of a surface */ + char *remapShader; /* ydnar: remap a shader in final stage */ + char *deprecateShader; /* vortex: shader is deprecated and replaced by this on use */ + + surfaceModel_t *surfaceModel; /* ydnar: for distribution of models */ + foliage_t *foliage; /* ydnar/splash damage: wolf et foliage */ + + float subdivisions; /* from a "tesssize xxx" */ + float backsplashFraction; /* floating point value, usually 0.05 */ + float backsplashDistance; /* default 16 */ + float lightSubdivide; /* default 999 */ + float lightFilterRadius; /* ydnar: lightmap filtering/blurring radius for lights created by this shader (default: 0) */ + + int lightmapSampleSize; /* lightmap sample size */ + float lightmapSampleOffset; /* ydnar: lightmap sample offset (default: 1.0) */ + + float bounceScale; /* ydnar: radiosity re-emission [0,1.0+] */ + float offset; /* ydnar: offset in units */ + float shadeAngleDegrees; /* ydnar: breaking angle for smooth shading (degrees) */ + + vec3_t mins, maxs; /* ydnar: for particle studio vertexDeform move support */ + + qb_t legacyTerrain; /* ydnar: enable legacy terrain crutches */ + qb_t indexed; /* ydnar: attempt to use indexmap (terrain alphamap style) */ + qb_t forceMeta; /* ydnar: force metasurface path */ + qb_t noClip; /* ydnar: don't clip into bsp, preserve original face winding */ + qb_t noFast; /* ydnar: supress fast lighting for surfaces with this shader */ + qb_t invert; /* ydnar: reverse facing */ + qb_t nonplanar; /* ydnar: for nonplanar meta surface merging */ + qb_t tcGen; /* ydnar: has explicit texcoord generation */ + vec3_t vecs[ 2 ]; /* ydnar: explicit texture vectors for [0,1] texture space */ + tcMod_t mod; /* ydnar: q3map_tcMod matrix for djbob :) */ + vec3_t lightmapAxis; /* ydnar: explicit lightmap axis projection */ + colorMod_t *colorMod; /* ydnar: q3map_rgb/color/alpha/Set/Mod support */ + + int furNumLayers; /* ydnar: number of fur layers */ + float furOffset; /* ydnar: offset of each layer */ + float furFade; /* ydnar: alpha fade amount per layer */ + + qb_t splotchFix; /* ydnar: filter splotches on lightmaps */ + + qb_t hasPasses; /* false if the shader doesn't define any rendering passes */ + qb_t globalTexture; /* don't normalize texture repeats */ + qb_t twoSided; /* cull none */ + qb_t autosprite; /* autosprite shaders will become point lights instead of area lights */ + qb_t polygonOffset; /* ydnar: don't face cull this or against this */ + qb_t patchShadows; /* have patches casting shadows when using -light for this surface */ + qb_t vertexShadows; /* shadows will be casted at this surface even when vertex lit */ + qb_t forceSunlight; /* force sun light at this surface even tho we might not calculate shadows in vertex lighting */ + qb_t notjunc; /* don't use this surface for tjunction fixing */ + qb_t fogParms; /* ydnar: has fogparms */ + qb_t noFog; /* ydnar: supress fogging */ + qb_t clipModel; /* ydnar: solid model hack */ + qb_t noVertexLight; /* ydnar: leave vertex color alone */ + qb_t noDirty; /* jal: do not apply the dirty pass to this surface */ + + byte styleMarker; /* ydnar: light styles hack */ + + float vertexScale; /* vertex light scale */ + + char skyParmsImageBase[ MAX_QPATH ]; /* ydnar: for skies */ + + char editorImagePath[ MAX_QPATH ]; /* use this image to generate texture coordinates */ + char lightImagePath[ MAX_QPATH ]; /* use this image to generate color / averageColor */ + char normalImagePath[ MAX_QPATH ]; /* ydnar: normalmap image for bumpmapping */ + + implicitMap_t implicitMap; /* ydnar: enemy territory implicit shaders */ + char implicitImagePath[ MAX_QPATH ]; + + image_t *shaderImage; + image_t *lightImage; + image_t *normalImage; + + float skyLightValue; /* ydnar */ + int skyLightIterations; /* ydnar */ + sun_t *sun; /* ydnar */ + + vec3_t color; /* normalized color */ + vec3_t averageColor; + byte lightStyle; /* vortex: per-surface floodlight */ - float floodlightDirectionScale; - vec3_t floodlightRGB; - float floodlightIntensity; - float floodlightDistance; - - qb_t lmMergable; /* ydnar */ - int lmCustomWidth, lmCustomHeight; /* ydnar */ - float lmBrightness; /* ydnar */ - float lmFilterRadius; /* ydnar: lightmap filtering/blurring radius for this shader (default: 0) */ - - int shaderWidth, shaderHeight; /* ydnar */ - float stFlat[ 2 ]; - - vec3_t fogDir; /* ydnar */ - - char *shaderText; /* ydnar */ - qb_t custom; - qb_t finished; + float floodlightDirectionScale; + vec3_t floodlightRGB; + float floodlightIntensity; + float floodlightDistance; + + qb_t lmMergable; /* ydnar */ + int lmCustomWidth, lmCustomHeight; /* ydnar */ + float lmBrightness; /* ydnar */ + float lmFilterRadius; /* ydnar: lightmap filtering/blurring radius for this shader (default: 0) */ + + int shaderWidth, shaderHeight; /* ydnar */ + float stFlat[ 2 ]; + + vec3_t fogDir; /* ydnar */ + + char *shaderText; /* ydnar */ + qb_t custom; + qb_t finished; } shaderInfo_t; @@ -826,57 +826,57 @@ shaderInfo_t; typedef struct face_s { - struct face_s *next; - int planenum; - int priority; + struct face_s *next; + int planenum; + int priority; //qboolean checked; - int compileFlags; - winding_t *w; + int compileFlags; + winding_t *w; } face_t; typedef struct plane_s { - vec3_t normal; - vec_t dist; - int type; - int counter; - int hash_chain; + vec3_t normal; + vec_t dist; + int type; + int counter; + int hash_chain; } plane_t; typedef struct side_s { - int planenum; - - int outputNum; /* set when the side is written to the file list */ - - float texMat[ 2 ][ 3 ]; /* brush primitive texture matrix */ - float vecs[ 2 ][ 4 ]; /* old-style texture coordinate mapping */ - - winding_t *winding; - winding_t *visibleHull; /* convex hull of all visible fragments */ - - shaderInfo_t *shaderInfo; - - int contentFlags; /* from shaderInfo */ - int surfaceFlags; /* from shaderInfo */ - int compileFlags; /* from shaderInfo */ - int value; /* from shaderInfo */ - - qboolean visible; /* choose visble planes first */ - qboolean bevel; /* don't ever use for bsp splitting, and don't bother making windings for it */ - qboolean culled; /* ydnar: face culling */ + int planenum; + + int outputNum; /* set when the side is written to the file list */ + + float texMat[ 2 ][ 3 ]; /* brush primitive texture matrix */ + float vecs[ 2 ][ 4 ]; /* old-style texture coordinate mapping */ + + winding_t *winding; + winding_t *visibleHull; /* convex hull of all visible fragments */ + + shaderInfo_t *shaderInfo; + + int contentFlags; /* from shaderInfo */ + int surfaceFlags; /* from shaderInfo */ + int compileFlags; /* from shaderInfo */ + int value; /* from shaderInfo */ + + qboolean visible; /* choose visble planes first */ + qboolean bevel; /* don't ever use for bsp splitting, and don't bother making windings for it */ + qboolean culled; /* ydnar: face culling */ } side_t; typedef struct sideRef_s { - struct sideRef_s *next; - side_t *side; + struct sideRef_s *next; + side_t *side; } sideRef_t; @@ -884,105 +884,105 @@ sideRef_t; /* ydnar: generic index mapping for entities (natural extension of terrain texturing) */ typedef struct indexMap_s { - int w, h, numLayers; - char name[ MAX_QPATH ], shader[ MAX_QPATH ]; - float offsets[ 256 ]; - byte *pixels; + int w, h, numLayers; + char name[ MAX_QPATH ], shader[ MAX_QPATH ]; + float offsets[ 256 ]; + byte *pixels; } indexMap_t; typedef struct brush_s { - struct brush_s *next; - struct brush_s *nextColorModBrush; /* ydnar: colorMod volume brushes go here */ - struct brush_s *original; /* chopped up brushes will reference the originals */ - + struct brush_s *next; + struct brush_s *nextColorModBrush; /* ydnar: colorMod volume brushes go here */ + struct brush_s *original; /* chopped up brushes will reference the originals */ + int entityNum, brushNum; /* editor numbering */ - int outputNum; /* set when the brush is written to the file list */ - + int outputNum; /* set when the brush is written to the file list */ + /* ydnar: for shadowcasting entities */ - int castShadows; - int recvShadows; - - shaderInfo_t *contentShader; - shaderInfo_t *celShader; /* :) */ - + int castShadows; + int recvShadows; + + shaderInfo_t *contentShader; + shaderInfo_t *celShader; /* :) */ + /* ydnar: gs mods */ - int lightmapSampleSize; /* jal : entity based _lightmapsamplesize */ - float lightmapScale; + int lightmapSampleSize; /* jal : entity based _lightmapsamplesize */ + float lightmapScale; vec3_t colormod; - float shadeAngleDegrees; /* jal : entity based _shadeangle */ - vec3_t eMins, eMaxs; - indexMap_t *im; + float shadeAngleDegrees; /* jal : entity based _shadeangle */ + vec3_t eMins, eMaxs; + indexMap_t *im; - int contentFlags; - int compileFlags; /* ydnar */ - qboolean detail; - qboolean opaque; + int contentFlags; + int compileFlags; /* ydnar */ + qboolean detail; + qboolean opaque; - int portalareas[ 2 ]; + int portalareas[ 2 ]; - vec3_t mins, maxs; - int numsides; + vec3_t mins, maxs; + int numsides; - side_t sides[ 6 ]; /* variably sized */ + side_t sides[ 6 ]; /* variably sized */ } brush_t; typedef struct fog_s { - shaderInfo_t *si; - brush_t *brush; - int visibleSide; /* the brush side that ray tests need to clip against (-1 == none) */ + shaderInfo_t *si; + brush_t *brush; + int visibleSide; /* the brush side that ray tests need to clip against (-1 == none) */ } fog_t; typedef struct { - int width, height; - bspDrawVert_t *verts; + int width, height; + bspDrawVert_t *verts; } mesh_t; typedef struct parseMesh_s { - struct parseMesh_s *next; - - int entityNum, brushNum; /* ydnar: editor numbering */ - + struct parseMesh_s *next; + + int entityNum, brushNum; /* ydnar: editor numbering */ + /* ydnar: for shadowcasting entities */ - int castShadows; - int recvShadows; - - mesh_t mesh; - shaderInfo_t *shaderInfo; - shaderInfo_t *celShader; /* :) */ - + int castShadows; + int recvShadows; + + mesh_t mesh; + shaderInfo_t *shaderInfo; + shaderInfo_t *celShader; /* :) */ + /* ydnar: gs mods */ - int lightmapSampleSize; /* jal : entity based _lightmapsamplesize */ - float lightmapScale; + int lightmapSampleSize; /* jal : entity based _lightmapsamplesize */ + float lightmapScale; vec3_t colormod; - vec3_t eMins, eMaxs; - indexMap_t *im; - + vec3_t eMins, eMaxs; + indexMap_t *im; + /* grouping */ - qboolean grouped; - float longestCurve; - int maxIterations; + qboolean grouped; + float longestCurve; + int maxIterations; } parseMesh_t; /* - ydnar: the drawsurf struct was extended to allow for: - - non-convex planar surfaces - - non-planar brushface surfaces - - lightmapped terrain - - planar patches + ydnar: the drawsurf struct was extended to allow for: + - non-convex planar surfaces + - non-planar brushface surfaces + - lightmapped terrain + - planar patches */ typedef enum @@ -993,114 +993,114 @@ typedef enum SURFACE_PATCH, SURFACE_TRIANGLES, SURFACE_FLARE, - SURFACE_FOLIAGE, /* wolf et */ - + SURFACE_FOLIAGE, /* wolf et */ + /* ydnar: compiler-relevant surface types */ SURFACE_FORCED_META, SURFACE_META, SURFACE_FOGHULL, SURFACE_DECAL, SURFACE_SHADER, - + NUM_SURFACE_TYPES } surfaceType_t; -char *surfaceTypes[ NUM_SURFACE_TYPES ] +char *surfaceTypes[ NUM_SURFACE_TYPES ] #ifndef MAIN_C ; #else - = - { - "SURFACE_BAD", - "SURFACE_FACE", - "SURFACE_PATCH", - "SURFACE_TRIANGLES", - "SURFACE_FLARE", - "SURFACE_FOLIAGE", - "SURFACE_FORCED_META", - "SURFACE_META", - "SURFACE_FOGHULL", - "SURFACE_DECAL", - "SURFACE_SHADER" - }; + = + { + "SURFACE_BAD", + "SURFACE_FACE", + "SURFACE_PATCH", + "SURFACE_TRIANGLES", + "SURFACE_FLARE", + "SURFACE_FOLIAGE", + "SURFACE_FORCED_META", + "SURFACE_META", + "SURFACE_FOGHULL", + "SURFACE_DECAL", + "SURFACE_SHADER" + }; #endif /* ydnar: this struct needs an overhaul (again, heh) */ typedef struct mapDrawSurface_s { - surfaceType_t type; - qboolean planar; - int outputNum; /* ydnar: to match this sort of thing up */ - - qboolean fur; /* ydnar: this is kind of a hack, but hey... */ - qboolean skybox; /* ydnar: yet another fun hack */ - qboolean backSide; /* ydnar: q3map_backShader support */ - - struct mapDrawSurface_s *parent; /* ydnar: for cloned (skybox) surfaces to share lighting data */ - struct mapDrawSurface_s *clone; /* ydnar: for cloned surfaces */ - struct mapDrawSurface_s *cel; /* ydnar: for cloned cel surfaces */ - - shaderInfo_t *shaderInfo; - shaderInfo_t *celShader; - brush_t *mapBrush; - parseMesh_t *mapMesh; - sideRef_t *sideRef; - - int fogNum; - - int numVerts; /* vertexes and triangles */ - bspDrawVert_t *verts; - int numIndexes; - int *indexes; - - int planeNum; - vec3_t lightmapOrigin; /* also used for flares */ - vec3_t lightmapVecs[ 3 ]; /* also used for flares */ - int lightStyle; /* used for flares */ - + surfaceType_t type; + qboolean planar; + int outputNum; /* ydnar: to match this sort of thing up */ + + qboolean fur; /* ydnar: this is kind of a hack, but hey... */ + qboolean skybox; /* ydnar: yet another fun hack */ + qboolean backSide; /* ydnar: q3map_backShader support */ + + struct mapDrawSurface_s *parent; /* ydnar: for cloned (skybox) surfaces to share lighting data */ + struct mapDrawSurface_s *clone; /* ydnar: for cloned surfaces */ + struct mapDrawSurface_s *cel; /* ydnar: for cloned cel surfaces */ + + shaderInfo_t *shaderInfo; + shaderInfo_t *celShader; + brush_t *mapBrush; + parseMesh_t *mapMesh; + sideRef_t *sideRef; + + int fogNum; + + int numVerts; /* vertexes and triangles */ + bspDrawVert_t *verts; + int numIndexes; + int *indexes; + + int planeNum; + vec3_t lightmapOrigin; /* also used for flares */ + vec3_t lightmapVecs[ 3 ]; /* also used for flares */ + int lightStyle; /* used for flares */ + /* ydnar: per-surface (per-entity, actually) lightmap sample size scaling */ - float lightmapScale; + float lightmapScale; /* divVerent: per-surface (per-entity, actually) color modding */ vec3_t colormod; /* jal: per-surface (per-entity, actually) shadeangle */ - float shadeAngleDegrees; - + float shadeAngleDegrees; + /* ydnar: surface classification */ - vec3_t mins, maxs; - vec3_t lightmapAxis; - int sampleSize; - + vec3_t mins, maxs; + vec3_t lightmapAxis; + int sampleSize; + /* ydnar: shadow group support */ - int castShadows, recvShadows; - + int castShadows, recvShadows; + /* ydnar: texture coordinate range monitoring for hardware with limited texcoord precision (in texel space) */ - float bias[ 2 ]; - int texMins[ 2 ], texMaxs[ 2 ], texRange[ 2 ]; - + float bias[ 2 ]; + int texMins[ 2 ], texMaxs[ 2 ], texRange[ 2 ]; + /* ydnar: for patches */ - float longestCurve; - int maxIterations; - int patchWidth, patchHeight; - vec3_t bounds[ 2 ]; + float longestCurve; + int maxIterations; + int patchWidth, patchHeight; + vec3_t bounds[ 2 ]; /* ydnar/sd: for foliage */ - int numFoliageInstances; - + int numFoliageInstances; + /* ydnar: editor/useful numbering */ - int entityNum; - int surfaceNum; + int entityNum; + int surfaceNum; } mapDrawSurface_t; typedef struct drawSurfRef_s { - struct drawSurfRef_s *nextRef; - int outputNum; + struct drawSurfRef_s *nextRef; + int outputNum; } drawSurfRef_t; @@ -1108,34 +1108,34 @@ drawSurfRef_t; /* ydnar: metasurfaces are constructed from lists of metatriangles so they can be merged in the best way */ typedef struct metaTriangle_s { - shaderInfo_t *si; - side_t *side; - int entityNum, surfaceNum, planeNum, fogNum, sampleSize, castShadows, recvShadows; - float shadeAngleDegrees; - vec4_t plane; - vec3_t lightmapAxis; - int indexes[ 3 ]; + shaderInfo_t *si; + side_t *side; + int entityNum, surfaceNum, planeNum, fogNum, sampleSize, castShadows, recvShadows; + float shadeAngleDegrees; + vec4_t plane; + vec3_t lightmapAxis; + int indexes[ 3 ]; } metaTriangle_t; typedef struct epair_s { - struct epair_s *next; - char *key, *value; + struct epair_s *next; + char *key, *value; } epair_t; typedef struct { - vec3_t origin; - brush_t *brushes, *lastBrush, *colorModBrushes; - parseMesh_t *patches; - int mapEntityNum, firstDrawSurf; - int firstBrush, numBrushes; /* only valid during BSP compile */ - epair_t *epairs; - vec3_t originbrush_origin; + vec3_t origin; + brush_t *brushes, *lastBrush, *colorModBrushes; + parseMesh_t *patches; + int mapEntityNum, firstDrawSurf; + int firstBrush, numBrushes; /* only valid during BSP compile */ + epair_t *epairs; + vec3_t originbrush_origin; } entity_t; @@ -1143,58 +1143,58 @@ entity_t; typedef struct node_s { /* both leafs and nodes */ - int planenum; /* -1 = leaf node */ - struct node_s *parent; - vec3_t mins, maxs; /* valid after portalization */ - brush_t *volume; /* one for each leaf/node */ + int planenum; /* -1 = leaf node */ + struct node_s *parent; + vec3_t mins, maxs; /* valid after portalization */ + brush_t *volume; /* one for each leaf/node */ /* nodes only */ - side_t *side; /* the side that created the node */ - struct node_s *children[ 2 ]; - int compileFlags; /* ydnar: hint, antiportal */ - int tinyportals; - vec3_t referencepoint; + side_t *side; /* the side that created the node */ + struct node_s *children[ 2 ]; + int compileFlags; /* ydnar: hint, antiportal */ + int tinyportals; + vec3_t referencepoint; /* leafs only */ - qboolean opaque; /* view can never be inside */ - qboolean areaportal; - qboolean skybox; /* ydnar: a skybox leaf */ - qboolean sky; /* ydnar: a sky leaf */ - int cluster; /* for portalfile writing */ - int area; /* for areaportals */ - brush_t *brushlist; /* fragments of all brushes in this leaf */ - drawSurfRef_t *drawSurfReferences; + qboolean opaque; /* view can never be inside */ + qboolean areaportal; + qboolean skybox; /* ydnar: a skybox leaf */ + qboolean sky; /* ydnar: a sky leaf */ + int cluster; /* for portalfile writing */ + int area; /* for areaportals */ + brush_t *brushlist; /* fragments of all brushes in this leaf */ + drawSurfRef_t *drawSurfReferences; - int occupied; /* 1 or greater can reach entity */ - entity_t *occupant; /* for leak file testing */ + int occupied; /* 1 or greater can reach entity */ + entity_t *occupant; /* for leak file testing */ - struct portal_s *portals; /* also on nodes during construction */ + struct portal_s *portals; /* also on nodes during construction */ - qboolean has_structural_children; + qboolean has_structural_children; } node_t; typedef struct portal_s { - plane_t plane; - node_t *onnode; /* NULL = outside box */ - node_t *nodes[ 2 ]; /* [ 0 ] = front side of plane */ - struct portal_s *next[ 2 ]; - winding_t *winding; - - qboolean sidefound; /* false if ->side hasn't been checked */ - int compileFlags; /* from original face that caused the split */ - side_t *side; /* NULL = non-visible */ + plane_t plane; + node_t *onnode; /* NULL = outside box */ + node_t *nodes[ 2 ]; /* [ 0 ] = front side of plane */ + struct portal_s *next[ 2 ]; + winding_t *winding; + + qboolean sidefound; /* false if ->side hasn't been checked */ + int compileFlags; /* from original face that caused the split */ + side_t *side; /* NULL = non-visible */ } portal_t; typedef struct { - node_t *headnode; - node_t outside_node; - vec3_t mins, maxs; + node_t *headnode; + node_t outside_node; + vec3_t mins, maxs; } tree_t; @@ -1208,24 +1208,24 @@ tree_t; typedef struct { - vec3_t normal; - float dist; + vec3_t normal; + float dist; } visPlane_t; typedef struct { - int numpoints; - vec3_t points[ MAX_POINTS_ON_FIXED_WINDING ]; /* variable sized */ -} + int numpoints; + vec3_t points[ MAX_POINTS_ON_FIXED_WINDING ]; /* variable sized */ +} fixedWinding_t; typedef struct passage_s { - struct passage_s *next; - byte cansee[ 1 ]; /* all portals that can be seen through this passage */ + struct passage_s *next; + byte cansee[ 1 ]; /* all portals that can be seen through this passage */ } passage_t; @@ -1240,54 +1240,54 @@ vstatus_t; typedef struct { - int num; - qboolean hint; /* true if this portal was created from a hint splitter */ - qboolean removed; - visPlane_t plane; /* normal pointing into neighbor */ - int leaf; /* neighbor */ - - vec3_t origin; /* for fast clip testing */ - float radius; - - fixedWinding_t *winding; - vstatus_t status; - byte *portalfront; /* [portals], preliminary */ - byte *portalflood; /* [portals], intermediate */ - byte *portalvis; /* [portals], final */ - - int nummightsee; /* bit count on portalflood for sort */ - passage_t *passages; /* there are just as many passages as there */ - /* are portals in the leaf this portal leads */ + int num; + qboolean hint; /* true if this portal was created from a hint splitter */ + qboolean removed; + visPlane_t plane; /* normal pointing into neighbor */ + int leaf; /* neighbor */ + + vec3_t origin; /* for fast clip testing */ + float radius; + + fixedWinding_t *winding; + vstatus_t status; + byte *portalfront; /* [portals], preliminary */ + byte *portalflood; /* [portals], intermediate */ + byte *portalvis; /* [portals], final */ + + int nummightsee; /* bit count on portalflood for sort */ + passage_t *passages; /* there are just as many passages as there */ + /* are portals in the leaf this portal leads */ } vportal_t; typedef struct leaf_s { - int numportals; - int merged; - vportal_t *portals[MAX_PORTALS_ON_LEAF]; + int numportals; + int merged; + vportal_t *portals[MAX_PORTALS_ON_LEAF]; } leaf_t; - + typedef struct pstack_s { - byte mightsee[ MAX_PORTALS / 8 ]; - struct pstack_s *next; - leaf_t *leaf; - vportal_t *portal; /* portal exiting */ - fixedWinding_t *source; - fixedWinding_t *pass; + byte mightsee[ MAX_PORTALS / 8 ]; + struct pstack_s *next; + leaf_t *leaf; + vportal_t *portal; /* portal exiting */ + fixedWinding_t *source; + fixedWinding_t *pass; - fixedWinding_t windings[ 3 ]; /* source, pass, temp in any order */ - int freewindings[ 3 ]; + fixedWinding_t windings[ 3 ]; /* source, pass, temp in any order */ + int freewindings[ 3 ]; - visPlane_t portalplane; + visPlane_t portalplane; int depth; #ifdef SEPERATORCACHE - visPlane_t seperators[ 2 ][ MAX_SEPERATORS ]; - int numseperators[ 2 ]; + visPlane_t seperators[ 2 ][ MAX_SEPERATORS ]; + int numseperators[ 2 ]; #endif } pstack_t; @@ -1295,9 +1295,9 @@ pstack_t; typedef struct { - vportal_t *base; - int c_chains; - pstack_t pstack_head; + vportal_t *base; + int c_chains; + pstack_t pstack_head; } threaddata_t; @@ -1312,35 +1312,35 @@ threaddata_t; /* ydnar: new light struct with flags */ typedef struct light_s { - struct light_s *next; - - int type; - int flags; /* ydnar: condensed all the booleans into one flags int */ - shaderInfo_t *si; - - vec3_t origin; - vec3_t normal; /* for surfaces, spotlights, and suns */ - float dist; /* plane location along normal */ - - float photons; - int style; - vec3_t color; - float radiusByDist; /* for spotlights */ - float fade; /* ydnar: from wolf, for linear lights */ - float angleScale; /* ydnar: stolen from vlight for K */ - float extraDist; /* "extra dimension" distance of the light, to kill hot spots */ - - float add; /* ydnar: used for area lights */ - float envelope; /* ydnar: units until falloff < tolerance */ - float envelope2; /* ydnar: envelope squared (tiny optimization) */ - vec3_t mins, maxs; /* ydnar: pvs envelope */ - int cluster; /* ydnar: cluster light falls into */ - - winding_t *w; - vec3_t emitColor; /* full out-of-gamut value */ - - float falloffTolerance; /* ydnar: minimum attenuation threshold */ - float filterRadius; /* ydnar: lightmap filter radius in world units, 0 == default */ + struct light_s *next; + + int type; + int flags; /* ydnar: condensed all the booleans into one flags int */ + shaderInfo_t *si; + + vec3_t origin; + vec3_t normal; /* for surfaces, spotlights, and suns */ + float dist; /* plane location along normal */ + + float photons; + int style; + vec3_t color; + float radiusByDist; /* for spotlights */ + float fade; /* ydnar: from wolf, for linear lights */ + float angleScale; /* ydnar: stolen from vlight for K */ + float extraDist; /* "extra dimension" distance of the light, to kill hot spots */ + + float add; /* ydnar: used for area lights */ + float envelope; /* ydnar: units until falloff < tolerance */ + float envelope2; /* ydnar: envelope squared (tiny optimization) */ + vec3_t mins, maxs; /* ydnar: pvs envelope */ + int cluster; /* ydnar: cluster light falls into */ + + winding_t *w; + vec3_t emitColor; /* full out-of-gamut value */ + + float falloffTolerance; /* ydnar: minimum attenuation threshold */ + float filterRadius; /* ydnar: lightmap filter radius in world units, 0 == default */ } light_t; @@ -1348,45 +1348,45 @@ light_t; typedef struct { /* constant input */ - qboolean testOcclusion, forceSunlight, testAll; - int recvShadows; - - int numSurfaces; - int *surfaces; - - int numLights; - light_t **lights; - - qboolean twoSided; - + qboolean testOcclusion, forceSunlight, testAll; + int recvShadows; + + int numSurfaces; + int *surfaces; + + int numLights; + light_t **lights; + + qboolean twoSided; + /* per-sample input */ - int cluster; - vec3_t origin, normal; - vec_t inhibitRadius; /* sphere in which occluding geometry is ignored */ - + int cluster; + vec3_t origin, normal; + vec_t inhibitRadius; /* sphere in which occluding geometry is ignored */ + /* per-light input */ - light_t *light; - vec3_t end; - + light_t *light; + vec3_t end; + /* calculated input */ - vec3_t displacement, direction; - vec_t distance; - + vec3_t displacement, direction; + vec_t distance; + /* input and output */ - vec3_t color; /* starts out at full color, may be reduced if transparent surfaces are crossed */ - vec3_t colorNoShadow; /* result color with no shadow casting */ - vec3_t directionContribution; /* result contribution to the deluxe map */ + vec3_t color; /* starts out at full color, may be reduced if transparent surfaces are crossed */ + vec3_t colorNoShadow; /* result color with no shadow casting */ + vec3_t directionContribution; /* result contribution to the deluxe map */ /* output */ - vec3_t hit; - int compileFlags; /* for determining surface compile flags traced through */ - qboolean passSolid; - qboolean opaque; - vec_t forceSubsampling; /* needs subsampling (alphashadow), value = max color contribution possible from it */ - + vec3_t hit; + int compileFlags; /* for determining surface compile flags traced through */ + qboolean passSolid; + qboolean opaque; + vec_t forceSubsampling; /* needs subsampling (alphashadow), value = max color contribution possible from it */ + /* working data */ - int numTestNodes; - int testNodes[ MAX_TRACE_TEST_NODES ]; + int numTestNodes; + int testNodes[ MAX_TRACE_TEST_NODES ]; } trace_t; @@ -1395,19 +1395,19 @@ trace_t; /* must be identical to bspDrawVert_t except for float color! */ typedef struct { - vec3_t xyz; - float st[ 2 ]; - float lightmap[ MAX_LIGHTMAPS ][ 2 ]; - vec3_t normal; - float color[ MAX_LIGHTMAPS ][ 4 ]; + vec3_t xyz; + float st[ 2 ]; + float lightmap[ MAX_LIGHTMAPS ][ 2 ]; + vec3_t normal; + float color[ MAX_LIGHTMAPS ][ 4 ]; } radVert_t; typedef struct { - int numVerts; - radVert_t verts[ MAX_POINTS_ON_WINDING ]; + int numVerts; + radVert_t verts[ MAX_POINTS_ON_WINDING ]; } radWinding_t; @@ -1415,8 +1415,8 @@ radWinding_t; /* crutch for poor local allocations in win32 smp */ typedef struct { - vec_t dists[ MAX_POINTS_ON_WINDING + 4 ]; - int sides[ MAX_POINTS_ON_WINDING + 4 ]; + vec_t dists[ MAX_POINTS_ON_WINDING + 4 ]; + int sides[ MAX_POINTS_ON_WINDING + 4 ]; } clipWork_t; @@ -1424,90 +1424,90 @@ clipWork_t; /* ydnar: new lightmap handling code */ typedef struct outLightmap_s { - int lightmapNum, extLightmapNum; - int customWidth, customHeight; - int numLightmaps; - int freeLuxels; - int numShaders; - shaderInfo_t *shaders[ MAX_LIGHTMAP_SHADERS ]; - byte *lightBits; - byte *bspLightBytes; - byte *bspDirBytes; + int lightmapNum, extLightmapNum; + int customWidth, customHeight; + int numLightmaps; + int freeLuxels; + int numShaders; + shaderInfo_t *shaders[ MAX_LIGHTMAP_SHADERS ]; + byte *lightBits; + byte *bspLightBytes; + byte *bspDirBytes; } outLightmap_t; typedef struct rawLightmap_s { - qboolean finished, splotchFix, wrap[ 2 ]; - int customWidth, customHeight; - float brightness; - float filterRadius; - - int firstLightSurface, numLightSurfaces; /* index into lightSurfaces */ - int numLightClusters, *lightClusters; - - int sampleSize, actualSampleSize, axisNum; + qboolean finished, splotchFix, wrap[ 2 ]; + int customWidth, customHeight; + float brightness; + float filterRadius; + + int firstLightSurface, numLightSurfaces; /* index into lightSurfaces */ + int numLightClusters, *lightClusters; + + int sampleSize, actualSampleSize, axisNum; /* vortex: per-surface floodlight */ - float floodlightDirectionScale; - vec3_t floodlightRGB; - float floodlightIntensity; - float floodlightDistance; - - int entityNum; - int recvShadows; - vec3_t mins, maxs, axis, origin, *vecs; - float *plane; - int w, h, sw, sh, used; - - qboolean solid[ MAX_LIGHTMAPS ]; - vec3_t solidColor[ MAX_LIGHTMAPS ]; - - int numStyledTwins; - struct rawLightmap_s *twins[ MAX_LIGHTMAPS ]; - - int outLightmapNums[ MAX_LIGHTMAPS ]; - int twinNums[ MAX_LIGHTMAPS ]; - int lightmapX[ MAX_LIGHTMAPS ], lightmapY[ MAX_LIGHTMAPS ]; - byte styles[ MAX_LIGHTMAPS ]; - float *bspLuxels[ MAX_LIGHTMAPS ]; - float *radLuxels[ MAX_LIGHTMAPS ]; - float *superLuxels[ MAX_LIGHTMAPS ]; - unsigned char *superFlags; - float *superOrigins; - float *superNormals; - int *superClusters; - - float *superDeluxels; /* average light direction */ - float *bspDeluxels; - float *superFloodLight; + float floodlightDirectionScale; + vec3_t floodlightRGB; + float floodlightIntensity; + float floodlightDistance; + + int entityNum; + int recvShadows; + vec3_t mins, maxs, axis, origin, *vecs; + float *plane; + int w, h, sw, sh, used; + + qboolean solid[ MAX_LIGHTMAPS ]; + vec3_t solidColor[ MAX_LIGHTMAPS ]; + + int numStyledTwins; + struct rawLightmap_s *twins[ MAX_LIGHTMAPS ]; + + int outLightmapNums[ MAX_LIGHTMAPS ]; + int twinNums[ MAX_LIGHTMAPS ]; + int lightmapX[ MAX_LIGHTMAPS ], lightmapY[ MAX_LIGHTMAPS ]; + byte styles[ MAX_LIGHTMAPS ]; + float *bspLuxels[ MAX_LIGHTMAPS ]; + float *radLuxels[ MAX_LIGHTMAPS ]; + float *superLuxels[ MAX_LIGHTMAPS ]; + unsigned char *superFlags; + float *superOrigins; + float *superNormals; + int *superClusters; + + float *superDeluxels; /* average light direction */ + float *bspDeluxels; + float *superFloodLight; } rawLightmap_t; typedef struct rawGridPoint_s { - vec3_t ambient[ MAX_LIGHTMAPS ]; - vec3_t directed[ MAX_LIGHTMAPS ]; - vec3_t dir; - byte styles[ MAX_LIGHTMAPS ]; + vec3_t ambient[ MAX_LIGHTMAPS ]; + vec3_t directed[ MAX_LIGHTMAPS ]; + vec3_t dir; + byte styles[ MAX_LIGHTMAPS ]; } rawGridPoint_t; typedef struct surfaceInfo_s { - int modelindex; - shaderInfo_t *si; - rawLightmap_t *lm; - int parentSurfaceNum, childSurfaceNum; - int entityNum, castShadows, recvShadows, sampleSize, patchIterations; - float longestCurve; - float *plane; - vec3_t axis, mins, maxs; - qboolean hasLightmap, approximated; - int firstSurfaceCluster, numSurfaceClusters; + int modelindex; + shaderInfo_t *si; + rawLightmap_t *lm; + int parentSurfaceNum, childSurfaceNum; + int entityNum, castShadows, recvShadows, sampleSize, patchIterations; + float longestCurve; + float *plane; + vec3_t axis, mins, maxs; + qboolean hasLightmap, approximated; + int firstSurfaceCluster, numSurfaceClusters; } surfaceInfo_t; @@ -1518,94 +1518,94 @@ surfaceInfo_t; ------------------------------------------------------------------------------- */ /* main.c */ -vec_t Random( void ); +vec_t Random( void ); char *Q_strncpyz( char *dst, const char *src, size_t len ); char *Q_strcat( char *dst, size_t dlen, const char *src ); char *Q_strncat( char *dst, size_t dlen, const char *src, size_t slen ); -int BSPInfo( int count, char **fileNames ); -int ScaleBSPMain( int argc, char **argv ); -int ConvertMain( int argc, char **argv ); +int BSPInfo( int count, char **fileNames ); +int ScaleBSPMain( int argc, char **argv ); +int ConvertMain( int argc, char **argv ); /* path_init.c */ -game_t *GetGame( char *arg ); -void InitPaths( int *argc, char **argv ); +game_t *GetGame( char *arg ); +void InitPaths( int *argc, char **argv ); /* bsp.c */ -int BSPMain( int argc, char **argv ); +int BSPMain( int argc, char **argv ); /* convert_map.c */ -int ConvertBSPToMap( char *bspName ); -int ConvertBSPToMap_BP( char *bspName ); +int ConvertBSPToMap( char *bspName ); +int ConvertBSPToMap_BP( char *bspName ); /* convert_ase.c */ -int ConvertBSPToASE( char *bspName ); +int ConvertBSPToASE( char *bspName ); /* convert_obj.c */ -int ConvertBSPToOBJ( char *bspName ); +int ConvertBSPToOBJ( char *bspName ); /* brush.c */ -sideRef_t *AllocSideRef( side_t *side, sideRef_t *next ); -int CountBrushList( brush_t *brushes ); -brush_t *AllocBrush( int numsides ); -void FreeBrush( brush_t *brushes ); -void FreeBrushList( brush_t *brushes ); -brush_t *CopyBrush( brush_t *brush ); -qboolean BoundBrush( brush_t *brush ); -qboolean CreateBrushWindings( brush_t *brush ); -brush_t *BrushFromBounds( vec3_t mins, vec3_t maxs ); -vec_t BrushVolume( brush_t *brush ); -void WriteBSPBrushMap( char *name, brush_t *list ); - -void FilterDetailBrushesIntoTree( entity_t *e, tree_t *tree ); -void FilterStructuralBrushesIntoTree( entity_t *e, tree_t *tree ); - -int BoxOnPlaneSide( vec3_t mins, vec3_t maxs, plane_t *plane ); -qboolean WindingIsTiny( winding_t *w ); +sideRef_t *AllocSideRef( side_t *side, sideRef_t *next ); +int CountBrushList( brush_t *brushes ); +brush_t *AllocBrush( int numsides ); +void FreeBrush( brush_t *brushes ); +void FreeBrushList( brush_t *brushes ); +brush_t *CopyBrush( brush_t *brush ); +qboolean BoundBrush( brush_t *brush ); +qboolean CreateBrushWindings( brush_t *brush ); +brush_t *BrushFromBounds( vec3_t mins, vec3_t maxs ); +vec_t BrushVolume( brush_t *brush ); +void WriteBSPBrushMap( char *name, brush_t *list ); + +void FilterDetailBrushesIntoTree( entity_t *e, tree_t *tree ); +void FilterStructuralBrushesIntoTree( entity_t *e, tree_t *tree ); + +int BoxOnPlaneSide( vec3_t mins, vec3_t maxs, plane_t *plane ); +qboolean WindingIsTiny( winding_t *w ); void SplitBrush( brush_t *brush, int planenum, brush_t **front, brush_t **back ); -tree_t *AllocTree( void ); -node_t *AllocNode( void ); +tree_t *AllocTree( void ); +node_t *AllocNode( void ); /* mesh.c */ -void LerpDrawVert( bspDrawVert_t *a, bspDrawVert_t *b, bspDrawVert_t *out ); -void LerpDrawVertAmount( bspDrawVert_t *a, bspDrawVert_t *b, float amount, bspDrawVert_t *out ); -void FreeMesh( mesh_t *m ); -mesh_t *CopyMesh( mesh_t *mesh ); -void PrintMesh( mesh_t *m ); -mesh_t *TransposeMesh( mesh_t *in ); -void InvertMesh( mesh_t *m ); -mesh_t *SubdivideMesh( mesh_t in, float maxError, float minLength ); -int IterationsForCurve( float len, int subdivisions ); -mesh_t *SubdivideMesh2( mesh_t in, int iterations ); -mesh_t *SubdivideMeshQuads( mesh_t *in, float minLength, int maxsize, int *widthtable, int *heighttable ); -mesh_t *RemoveLinearMeshColumnsRows( mesh_t *in ); -void MakeMeshNormals( mesh_t in ); -void PutMeshOnCurve( mesh_t in ); - -void MakeNormalVectors( vec3_t forward, vec3_t right, vec3_t up ); +void LerpDrawVert( bspDrawVert_t *a, bspDrawVert_t *b, bspDrawVert_t *out ); +void LerpDrawVertAmount( bspDrawVert_t *a, bspDrawVert_t *b, float amount, bspDrawVert_t *out ); +void FreeMesh( mesh_t *m ); +mesh_t *CopyMesh( mesh_t *mesh ); +void PrintMesh( mesh_t *m ); +mesh_t *TransposeMesh( mesh_t *in ); +void InvertMesh( mesh_t *m ); +mesh_t *SubdivideMesh( mesh_t in, float maxError, float minLength ); +int IterationsForCurve( float len, int subdivisions ); +mesh_t *SubdivideMesh2( mesh_t in, int iterations ); +mesh_t *SubdivideMeshQuads( mesh_t *in, float minLength, int maxsize, int *widthtable, int *heighttable ); +mesh_t *RemoveLinearMeshColumnsRows( mesh_t *in ); +void MakeMeshNormals( mesh_t in ); +void PutMeshOnCurve( mesh_t in ); + +void MakeNormalVectors( vec3_t forward, vec3_t right, vec3_t up ); /* map.c */ -void LoadMapFile( char *filename, qboolean onlyLights, qboolean noCollapseGroups ); -int FindFloatPlane( vec3_t normal, vec_t dist, int numPoints, vec3_t *points ); -int PlaneTypeForNormal( vec3_t normal ); -void AddBrushBevels( void ); +void LoadMapFile( char *filename, qboolean onlyLights, qboolean noCollapseGroups ); +int FindFloatPlane( vec3_t normal, vec_t dist, int numPoints, vec3_t *points ); +int PlaneTypeForNormal( vec3_t normal ); +void AddBrushBevels( void ); brush_t *FinishBrush( qboolean noCollapseGroups ); /* portals.c */ -void MakeHeadnodePortals( tree_t *tree ); -void MakeNodePortal( node_t *node ); -void SplitNodePortals( node_t *node ); +void MakeHeadnodePortals( tree_t *tree ); +void MakeNodePortal( node_t *node ); +void SplitNodePortals( node_t *node ); -qboolean PortalPassable( portal_t *p ); +qboolean PortalPassable( portal_t *p ); #define FLOODENTITIES_LEAKED 1 #define FLOODENTITIES_GOOD 0 @@ -1613,310 +1613,310 @@ qboolean PortalPassable( portal_t *p ); int FloodEntities( tree_t *tree ); void FillOutside( node_t *headnode ); void FloodAreas( tree_t *tree ); -face_t *VisibleFaces( entity_t *e, tree_t *tree ); -void FreePortal( portal_t *p ); +face_t *VisibleFaces( entity_t *e, tree_t *tree ); +void FreePortal( portal_t *p ); -void MakeTreePortals( tree_t *tree ); +void MakeTreePortals( tree_t *tree ); /* leakfile.c */ -xmlNodePtr LeakFile( tree_t *tree ); +xmlNodePtr LeakFile( tree_t *tree ); /* prtfile.c */ -void NumberClusters( tree_t *tree ); -void WritePortalFile( tree_t *tree ); +void NumberClusters( tree_t *tree ); +void WritePortalFile( tree_t *tree ); /* writebsp.c */ -void SetModelNumbers( void ); -void SetLightStyles( void ); +void SetModelNumbers( void ); +void SetLightStyles( void ); -int EmitShader( const char *shader, int *contentFlags, int *surfaceFlags ); +int EmitShader( const char *shader, int *contentFlags, int *surfaceFlags ); -void BeginBSPFile( void ); -void EndBSPFile( qboolean do_write ); -void EmitBrushes( brush_t *brushes, int *firstBrush, int *numBrushes ); -void EmitFogs( void ); +void BeginBSPFile( void ); +void EndBSPFile( qboolean do_write ); +void EmitBrushes( brush_t *brushes, int *firstBrush, int *numBrushes ); +void EmitFogs( void ); -void BeginModel( void ); -void EndModel( entity_t *e, node_t *headnode ); +void BeginModel( void ); +void EndModel( entity_t *e, node_t *headnode ); /* tree.c */ -void FreeTree( tree_t *tree ); -void FreeTree_r( node_t *node ); -void PrintTree_r( node_t *node, int depth ); -void FreeTreePortals_r( node_t *node ); +void FreeTree( tree_t *tree ); +void FreeTree_r( node_t *node ); +void PrintTree_r( node_t *node, int depth ); +void FreeTreePortals_r( node_t *node ); /* patch.c */ -void ParsePatch( qboolean onlyLights ); -mesh_t *SubdivideMesh( mesh_t in, float maxError, float minLength ); -void PatchMapDrawSurfs( entity_t *e ); +void ParsePatch( qboolean onlyLights ); +mesh_t *SubdivideMesh( mesh_t in, float maxError, float minLength ); +void PatchMapDrawSurfs( entity_t *e ); void TriangulatePatchSurface( entity_t *e, mapDrawSurface_t *ds ); /* tjunction.c */ -void FixTJunctions( entity_t *e ); +void FixTJunctions( entity_t *e ); /* fog.c */ -winding_t *WindingFromDrawSurf( mapDrawSurface_t *ds ); -void FogDrawSurfaces( entity_t *e ); -int FogForPoint( vec3_t point, float epsilon ); -int FogForBounds( vec3_t mins, vec3_t maxs, float epsilon ); -void CreateMapFogs( void ); +winding_t *WindingFromDrawSurf( mapDrawSurface_t *ds ); +void FogDrawSurfaces( entity_t *e ); +int FogForPoint( vec3_t point, float epsilon ); +int FogForBounds( vec3_t mins, vec3_t maxs, float epsilon ); +void CreateMapFogs( void ); /* facebsp.c */ -face_t *MakeStructuralBSPFaceList( brush_t *list ); -face_t *MakeVisibleBSPFaceList( brush_t *list ); -tree_t *FaceBSP( face_t *list ); +face_t *MakeStructuralBSPFaceList( brush_t *list ); +face_t *MakeVisibleBSPFaceList( brush_t *list ); +tree_t *FaceBSP( face_t *list ); /* model.c */ -void PicoPrintFunc( int level, const char *str ); -void PicoLoadFileFunc( const char *name, byte **buffer, int *bufSize ); -picoModel_t *FindModel( const char *name, int frame ); -picoModel_t *LoadModel( const char *name, int frame ); +void PicoPrintFunc( int level, const char *str ); +void PicoLoadFileFunc( const char *name, byte **buffer, int *bufSize ); +picoModel_t *FindModel( const char *name, int frame ); +picoModel_t *LoadModel( const char *name, int frame ); void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap_t *remap, shaderInfo_t *celShader, int eNum, int castShadows, int recvShadows, int spawnFlags, float lightmapScale, int lightmapSampleSize, float shadeAngle, vec3_t colormod ); -void AddTriangleModels( entity_t *e ); +void AddTriangleModels( entity_t *e ); /* surface.c */ -mapDrawSurface_t *AllocDrawSurface( surfaceType_t type ); -void FinishSurface( mapDrawSurface_t *ds ); -void StripFaceSurface( mapDrawSurface_t *ds ); -void MaxAreaFaceSurface( mapDrawSurface_t *ds ); -qboolean CalcSurfaceTextureRange( mapDrawSurface_t *ds ); -qboolean CalcLightmapAxis( vec3_t normal, vec3_t axis ); -void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ); -void ClassifyEntitySurfaces( entity_t *e ); -void TidyEntitySurfaces( entity_t *e ); -mapDrawSurface_t *CloneSurface( mapDrawSurface_t *src, shaderInfo_t *si ); -mapDrawSurface_t *MakeCelSurface( mapDrawSurface_t *src, shaderInfo_t *si ); -qboolean IsTriangleDegenerate( bspDrawVert_t *points, int a, int b, int c ); -void ClearSurface( mapDrawSurface_t *ds ); -void AddEntitySurfaceModels( entity_t *e ); -mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, winding_t *w ); -mapDrawSurface_t *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh ); -mapDrawSurface_t *DrawSurfaceForFlare( int entNum, vec3_t origin, vec3_t normal, vec3_t color, const char *flareShader, int lightStyle ); -mapDrawSurface_t *DrawSurfaceForShader( char *shader ); -void ClipSidesIntoTree( entity_t *e, tree_t *tree ); -void MakeDebugPortalSurfs( tree_t *tree ); -void MakeFogHullSurfs( entity_t *e, tree_t *tree, char *shader ); -void SubdivideFaceSurfaces( entity_t *e, tree_t *tree ); -void AddEntitySurfaceModels( entity_t *e ); -int AddSurfaceModels( mapDrawSurface_t *ds ); -void FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree ); -void EmitPatchSurface( entity_t *e, mapDrawSurface_t *ds ); -void EmitTriangleSurface( mapDrawSurface_t *ds ); +mapDrawSurface_t *AllocDrawSurface( surfaceType_t type ); +void FinishSurface( mapDrawSurface_t *ds ); +void StripFaceSurface( mapDrawSurface_t *ds ); +void MaxAreaFaceSurface( mapDrawSurface_t *ds ); +qboolean CalcSurfaceTextureRange( mapDrawSurface_t *ds ); +qboolean CalcLightmapAxis( vec3_t normal, vec3_t axis ); +void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ); +void ClassifyEntitySurfaces( entity_t *e ); +void TidyEntitySurfaces( entity_t *e ); +mapDrawSurface_t *CloneSurface( mapDrawSurface_t *src, shaderInfo_t *si ); +mapDrawSurface_t *MakeCelSurface( mapDrawSurface_t *src, shaderInfo_t *si ); +qboolean IsTriangleDegenerate( bspDrawVert_t *points, int a, int b, int c ); +void ClearSurface( mapDrawSurface_t *ds ); +void AddEntitySurfaceModels( entity_t *e ); +mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, winding_t *w ); +mapDrawSurface_t *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh ); +mapDrawSurface_t *DrawSurfaceForFlare( int entNum, vec3_t origin, vec3_t normal, vec3_t color, const char *flareShader, int lightStyle ); +mapDrawSurface_t *DrawSurfaceForShader( char *shader ); +void ClipSidesIntoTree( entity_t *e, tree_t *tree ); +void MakeDebugPortalSurfs( tree_t *tree ); +void MakeFogHullSurfs( entity_t *e, tree_t *tree, char *shader ); +void SubdivideFaceSurfaces( entity_t *e, tree_t *tree ); +void AddEntitySurfaceModels( entity_t *e ); +int AddSurfaceModels( mapDrawSurface_t *ds ); +void FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree ); +void EmitPatchSurface( entity_t *e, mapDrawSurface_t *ds ); +void EmitTriangleSurface( mapDrawSurface_t *ds ); /* surface_fur.c */ -void Fur( mapDrawSurface_t *src ); +void Fur( mapDrawSurface_t *src ); /* surface_foliage.c */ -void Foliage( mapDrawSurface_t *src ); +void Foliage( mapDrawSurface_t *src ); /* ydnar: surface_meta.c */ -void ClearMetaTriangles( void ); -int FindMetaTriangle( metaTriangle_t *src, bspDrawVert_t *a, bspDrawVert_t *b, bspDrawVert_t *c, int planeNum ); -void MakeEntityMetaTriangles( entity_t *e ); -void FixMetaTJunctions( void ); -void SmoothMetaTriangles( void ); -void MergeMetaTriangles( void ); -void EmitMetaStats(); // vortex: print meta statistics even in no-verbose mode +void ClearMetaTriangles( void ); +int FindMetaTriangle( metaTriangle_t *src, bspDrawVert_t *a, bspDrawVert_t *b, bspDrawVert_t *c, int planeNum ); +void MakeEntityMetaTriangles( entity_t *e ); +void FixMetaTJunctions( void ); +void SmoothMetaTriangles( void ); +void MergeMetaTriangles( void ); +void EmitMetaStats(); // vortex: print meta statistics even in no-verbose mode /* surface_extra.c */ -void SetDefaultSampleSize( int sampleSize ); +void SetDefaultSampleSize( int sampleSize ); -void SetSurfaceExtra( mapDrawSurface_t *ds, int num ); +void SetSurfaceExtra( mapDrawSurface_t *ds, int num ); -shaderInfo_t *GetSurfaceExtraShaderInfo( int num ); -int GetSurfaceExtraParentSurfaceNum( int num ); -int GetSurfaceExtraEntityNum( int num ); -int GetSurfaceExtraCastShadows( int num ); -int GetSurfaceExtraRecvShadows( int num ); -int GetSurfaceExtraSampleSize( int num ); -int GetSurfaceExtraMinSampleSize( int num ); -float GetSurfaceExtraLongestCurve( int num ); -void GetSurfaceExtraLightmapAxis( int num, vec3_t lightmapAxis ); +shaderInfo_t *GetSurfaceExtraShaderInfo( int num ); +int GetSurfaceExtraParentSurfaceNum( int num ); +int GetSurfaceExtraEntityNum( int num ); +int GetSurfaceExtraCastShadows( int num ); +int GetSurfaceExtraRecvShadows( int num ); +int GetSurfaceExtraSampleSize( int num ); +int GetSurfaceExtraMinSampleSize( int num ); +float GetSurfaceExtraLongestCurve( int num ); +void GetSurfaceExtraLightmapAxis( int num, vec3_t lightmapAxis ); -void WriteSurfaceExtraFile( const char *path ); -void LoadSurfaceExtraFile( const char *path ); +void WriteSurfaceExtraFile( const char *path ); +void LoadSurfaceExtraFile( const char *path ); /* decals.c */ -void ProcessDecals( void ); -void MakeEntityDecals( entity_t *e ); +void ProcessDecals( void ); +void MakeEntityDecals( entity_t *e ); /* map.c */ -void TextureAxisFromPlane( plane_t *pln, vec3_t xv, vec3_t yv ); +void TextureAxisFromPlane( plane_t *pln, vec3_t xv, vec3_t yv ); /* brush_primit.c */ void ComputeAxisBase( vec3_t normal, vec3_t texX, vec3_t texY ); /* vis.c */ -fixedWinding_t *NewFixedWinding( int points ); -int VisMain( int argc, char **argv ); +fixedWinding_t *NewFixedWinding( int points ); +int VisMain( int argc, char **argv ); /* visflow.c */ -int CountBits( byte *bits, int numbits ); -void PassageFlow( int portalnum ); -void CreatePassages( int portalnum ); -void PassageMemory( void ); -void BasePortalVis( int portalnum ); -void BetterPortalVis( int portalnum ); -void PortalFlow( int portalnum ); -void PassagePortalFlow( int portalnum ); +int CountBits( byte *bits, int numbits ); +void PassageFlow( int portalnum ); +void CreatePassages( int portalnum ); +void PassageMemory( void ); +void BasePortalVis( int portalnum ); +void BetterPortalVis( int portalnum ); +void PortalFlow( int portalnum ); +void PassagePortalFlow( int portalnum ); /* light.c */ -float PointToPolygonFormFactor( const vec3_t point, const vec3_t normal, const winding_t *w ); -int LightContributionToSample( trace_t *trace ); +float PointToPolygonFormFactor( const vec3_t point, const vec3_t normal, const winding_t *w ); +int LightContributionToSample( trace_t *trace ); void LightingAtSample( trace_t * trace, byte styles[ MAX_LIGHTMAPS ], vec3_t colors[ MAX_LIGHTMAPS ] ); -int LightContributionToPoint( trace_t *trace ); -int LightMain( int argc, char **argv ); +int LightContributionToPoint( trace_t *trace ); +int LightMain( int argc, char **argv ); /* light_trace.c */ -void SetupTraceNodes( void ); -void TraceLine( trace_t *trace ); -float SetupTrace( trace_t *trace ); +void SetupTraceNodes( void ); +void TraceLine( trace_t *trace ); +float SetupTrace( trace_t *trace ); /* light_bounce.c */ qboolean RadSampleImage( byte * pixels, int width, int height, float st[ 2 ], float color[ 4 ] ); -void RadLightForTriangles( int num, int lightmapNum, rawLightmap_t *lm, shaderInfo_t *si, float scale, float subdivide, clipWork_t *cw ); -void RadLightForPatch( int num, int lightmapNum, rawLightmap_t *lm, shaderInfo_t *si, float scale, float subdivide, clipWork_t *cw ); -void RadCreateDiffuseLights( void ); -void RadFreeLights(); +void RadLightForTriangles( int num, int lightmapNum, rawLightmap_t *lm, shaderInfo_t *si, float scale, float subdivide, clipWork_t *cw ); +void RadLightForPatch( int num, int lightmapNum, rawLightmap_t *lm, shaderInfo_t *si, float scale, float subdivide, clipWork_t *cw ); +void RadCreateDiffuseLights( void ); +void RadFreeLights(); /* light_ydnar.c */ -void ColorToBytes( const float *color, byte *colorBytes, float scale ); -void SmoothNormals( void ); +void ColorToBytes( const float *color, byte *colorBytes, float scale ); +void SmoothNormals( void ); -void MapRawLightmap( int num ); +void MapRawLightmap( int num ); -void SetupDirt(); -float DirtForSample( trace_t *trace ); -void DirtyRawLightmap( int num ); +void SetupDirt(); +float DirtForSample( trace_t *trace ); +void DirtyRawLightmap( int num ); -void SetupFloodLight(); -void FloodlightRawLightmaps(); -void FloodlightIlluminateLightmap( rawLightmap_t *lm ); +void SetupFloodLight(); +void FloodlightRawLightmaps(); +void FloodlightIlluminateLightmap( rawLightmap_t *lm ); float FloodLightForSample( trace_t *trace, float floodLightDistance, qboolean floodLightLowQuality ); -void FloodLightRawLightmap( int num ); +void FloodLightRawLightmap( int num ); -void IlluminateRawLightmap( int num ); -void IlluminateVertexes( int num ); +void IlluminateRawLightmap( int num ); +void IlluminateVertexes( int num ); void SetupBrushesFlags( int mask_any, int test_any, int mask_all, int test_all ); -void SetupBrushes( void ); -void SetupClusters( void ); -qboolean ClusterVisible( int a, int b ); -qboolean ClusterVisibleToPoint( vec3_t point, int cluster ); -int ClusterForPoint( vec3_t point ); -int ClusterForPointExt( vec3_t point, float epsilon ); -int ClusterForPointExtFilter( vec3_t point, float epsilon, int numClusters, int *clusters ); -int ShaderForPointInLeaf( vec3_t point, int leafNum, float epsilon, int wantContentFlags, int wantSurfaceFlags, int *contentFlags, int *surfaceFlags ); -void SetupEnvelopes( qboolean forGrid, qboolean fastFlag ); -void FreeTraceLights( trace_t *trace ); -void CreateTraceLightsForBounds( vec3_t mins, vec3_t maxs, vec3_t normal, int numClusters, int *clusters, int flags, trace_t *trace ); -void CreateTraceLightsForSurface( int num, trace_t *trace ); +void SetupBrushes( void ); +void SetupClusters( void ); +qboolean ClusterVisible( int a, int b ); +qboolean ClusterVisibleToPoint( vec3_t point, int cluster ); +int ClusterForPoint( vec3_t point ); +int ClusterForPointExt( vec3_t point, float epsilon ); +int ClusterForPointExtFilter( vec3_t point, float epsilon, int numClusters, int *clusters ); +int ShaderForPointInLeaf( vec3_t point, int leafNum, float epsilon, int wantContentFlags, int wantSurfaceFlags, int *contentFlags, int *surfaceFlags ); +void SetupEnvelopes( qboolean forGrid, qboolean fastFlag ); +void FreeTraceLights( trace_t *trace ); +void CreateTraceLightsForBounds( vec3_t mins, vec3_t maxs, vec3_t normal, int numClusters, int *clusters, int flags, trace_t *trace ); +void CreateTraceLightsForSurface( int num, trace_t *trace ); /* lightmaps_ydnar.c */ -void ExportLightmaps( void ); +void ExportLightmaps( void ); -int ExportLightmapsMain( int argc, char **argv ); -int ImportLightmapsMain( int argc, char **argv ); +int ExportLightmapsMain( int argc, char **argv ); +int ImportLightmapsMain( int argc, char **argv ); -void SetupSurfaceLightmaps( void ); -void StitchSurfaceLightmaps( void ); -void StoreSurfaceLightmaps( void ); +void SetupSurfaceLightmaps( void ); +void StitchSurfaceLightmaps( void ); +void StoreSurfaceLightmaps( void ); /* image.c */ -void ImageFree( image_t *image ); -image_t *ImageFind( const char *filename ); -image_t *ImageLoad( const char *filename ); +void ImageFree( image_t *image ); +image_t *ImageFind( const char *filename ); +image_t *ImageLoad( const char *filename ); /* shaders.c */ -void ColorMod( colorMod_t *am, int numVerts, bspDrawVert_t *drawVerts ); +void ColorMod( colorMod_t *am, int numVerts, bspDrawVert_t *drawVerts ); -void TCMod( tcMod_t mod, float st[ 2 ] ); -void TCModIdentity( tcMod_t mod ); -void TCModMultiply( tcMod_t a, tcMod_t b, tcMod_t out ); -void TCModTranslate( tcMod_t mod, float s, float t ); -void TCModScale( tcMod_t mod, float s, float t ); -void TCModRotate( tcMod_t mod, float euler ); +void TCMod( tcMod_t mod, float st[ 2 ] ); +void TCModIdentity( tcMod_t mod ); +void TCModMultiply( tcMod_t a, tcMod_t b, tcMod_t out ); +void TCModTranslate( tcMod_t mod, float s, float t ); +void TCModScale( tcMod_t mod, float s, float t ); +void TCModRotate( tcMod_t mod, float euler ); -qboolean ApplySurfaceParm( char *name, int *contentFlags, int *surfaceFlags, int *compileFlags ); +qboolean ApplySurfaceParm( char *name, int *contentFlags, int *surfaceFlags, int *compileFlags ); -void BeginMapShaderFile( const char *mapFile ); -void WriteMapShaderFile( void ); -shaderInfo_t *CustomShader( shaderInfo_t *si, char *find, char *replace ); -void EmitVertexRemapShader( char *from, char *to ); +void BeginMapShaderFile( const char *mapFile ); +void WriteMapShaderFile( void ); +shaderInfo_t *CustomShader( shaderInfo_t *si, char *find, char *replace ); +void EmitVertexRemapShader( char *from, char *to ); -void LoadShaderInfo( void ); -shaderInfo_t *ShaderInfoForShader( const char *shader ); +void LoadShaderInfo( void ); +shaderInfo_t *ShaderInfoForShader( const char *shader ); shaderInfo_t *ShaderInfoForShaderNull( const char *shader ); /* bspfile_abstract.c */ -void SetGridPoints( int n ); -void SetDrawVerts( int n ); -void IncDrawVerts(); +void SetGridPoints( int n ); +void SetDrawVerts( int n ); +void IncDrawVerts(); void SetDrawSurfaces( int n ); -void SetDrawSurfacesBuffer(); -void BSPFilesCleanup(); - -void SwapBlock( int *block, int size ); - -int GetLumpElements( bspHeader_t *header, int lump, int size ); -void *GetLump( bspHeader_t *header, int lump ); -int CopyLump( bspHeader_t *header, int lump, void *dest, int size ); -int CopyLump_Allocate( bspHeader_t *header, int lump, void **dest, int size, int *allocationVariable ); -void AddLump( FILE *file, bspHeader_t *header, int lumpNum, const void *data, int length ); - -void LoadBSPFile( const char *filename ); -void WriteBSPFile( const char *filename ); -void PrintBSPFileSizes( void ); - -epair_t *ParseEPair( void ); -void ParseEntities( void ); -void UnparseEntities( void ); -void PrintEntity( const entity_t *ent ); -void SetKeyValue( entity_t *ent, const char *key, const char *value ); -qboolean KeyExists( const entity_t *ent, const char *key ); /* VorteX: check if key exists */ -const char *ValueForKey( const entity_t *ent, const char *key ); -int IntForKey( const entity_t *ent, const char *key ); -vec_t FloatForKey( const entity_t *ent, const char *key ); -void GetVectorForKey( const entity_t *ent, const char *key, vec3_t vec ); -entity_t *FindTargetEntity( const char *target ); -void GetEntityShadowFlags( const entity_t *ent, const entity_t *ent2, int *castShadows, int *recvShadows ); +void SetDrawSurfacesBuffer(); +void BSPFilesCleanup(); + +void SwapBlock( int *block, int size ); + +int GetLumpElements( bspHeader_t *header, int lump, int size ); +void *GetLump( bspHeader_t *header, int lump ); +int CopyLump( bspHeader_t *header, int lump, void *dest, int size ); +int CopyLump_Allocate( bspHeader_t *header, int lump, void **dest, int size, int *allocationVariable ); +void AddLump( FILE *file, bspHeader_t *header, int lumpNum, const void *data, int length ); + +void LoadBSPFile( const char *filename ); +void WriteBSPFile( const char *filename ); +void PrintBSPFileSizes( void ); + +epair_t *ParseEPair( void ); +void ParseEntities( void ); +void UnparseEntities( void ); +void PrintEntity( const entity_t *ent ); +void SetKeyValue( entity_t *ent, const char *key, const char *value ); +qboolean KeyExists( const entity_t *ent, const char *key ); /* VorteX: check if key exists */ +const char *ValueForKey( const entity_t *ent, const char *key ); +int IntForKey( const entity_t *ent, const char *key ); +vec_t FloatForKey( const entity_t *ent, const char *key ); +void GetVectorForKey( const entity_t *ent, const char *key, vec3_t vec ); +entity_t *FindTargetEntity( const char *target ); +void GetEntityShadowFlags( const entity_t *ent, const entity_t *ent2, int *castShadows, int *recvShadows ); void InjectCommandLine( char **argv, int beginArgs, int endArgs ); - + /* bspfile_ibsp.c */ -void LoadIBSPFile( const char *filename ); -void WriteIBSPFile( const char *filename ); +void LoadIBSPFile( const char *filename ); +void WriteIBSPFile( const char *filename ); /* bspfile_rbsp.c */ -void LoadRBSPFile( const char *filename ); -void WriteRBSPFile( const char *filename ); +void LoadRBSPFile( const char *filename ); +void WriteRBSPFile( const char *filename ); @@ -1928,122 +1928,122 @@ void WriteRBSPFile( const char *filename ); #ifdef MAIN_C #define Q_EXTERN - #define Q_ASSIGN( a ) = a + #define Q_ASSIGN( a ) = a #else #define Q_EXTERN extern - #define Q_ASSIGN( a ) + #define Q_ASSIGN( a ) #endif /* game support */ -Q_EXTERN game_t games[] +Q_EXTERN game_t games[] #ifndef MAIN_C ; #else - = - { + = + { #include "game_quake3.h" - , + , #include "game_quakelive.h" /* most be after game_quake3.h as they share defines! */ - , + , #include "game_nexuiz.h" /* most be after game_quake3.h as they share defines! */ - , + , #include "game_xonotic.h" /* most be after game_quake3.h as they share defines! */ - , + , #include "game_tremulous.h" /*LinuxManMikeC: must be after game_quake3.h, depends on #define's set in it */ - , + , #include "game_tenebrae.h" - , + , #include "game_wolf.h" - , + , #include "game_wolfet.h" /* most be after game_wolf.h as they share defines! */ - , + , #include "game_etut.h" - , + , #include "game_ef.h" - , + , #include "game_sof2.h" - , - #include "game_jk2.h" /* most be after game_sof2.h as they share defines! */ - , - #include "game_ja.h" /* most be after game_jk2.h as they share defines! */ - , - #include "game_qfusion.h" /* qfusion game */ - , + , + #include "game_jk2.h" /* most be after game_sof2.h as they share defines! */ + , + #include "game_ja.h" /* most be after game_jk2.h as they share defines! */ + , + #include "game_qfusion.h" /* qfusion game */ + , #include "game_reaction.h" /* must be after game_quake3.h */ - , - #include "game_darkplaces.h" /* vortex: darkplaces q1 engine */ - , - #include "game_dq.h" /* vortex: deluxe quake game ( darkplaces q1 engine) */ - , - #include "game_prophecy.h" /* vortex: prophecy game ( darkplaces q1 engine) */ - , - #include "game__null.h" /* null game (must be last item) */ - }; + , + #include "game_darkplaces.h" /* vortex: darkplaces q1 engine */ + , + #include "game_dq.h" /* vortex: deluxe quake game ( darkplaces q1 engine) */ + , + #include "game_prophecy.h" /* vortex: prophecy game ( darkplaces q1 engine) */ + , + #include "game__null.h" /* null game (must be last item) */ + }; #endif -Q_EXTERN game_t *game Q_ASSIGN( &games[ 0 ] ); +Q_EXTERN game_t *game Q_ASSIGN( &games[ 0 ] ); /* general */ -Q_EXTERN int numImages Q_ASSIGN( 0 ); -Q_EXTERN image_t images[ MAX_IMAGES ]; +Q_EXTERN int numImages Q_ASSIGN( 0 ); +Q_EXTERN image_t images[ MAX_IMAGES ]; -Q_EXTERN int numPicoModels Q_ASSIGN( 0 ); -Q_EXTERN picoModel_t *picoModels[ MAX_MODELS ]; +Q_EXTERN int numPicoModels Q_ASSIGN( 0 ); +Q_EXTERN picoModel_t *picoModels[ MAX_MODELS ]; -Q_EXTERN shaderInfo_t *shaderInfo Q_ASSIGN( NULL ); -Q_EXTERN int numShaderInfo Q_ASSIGN( 0 ); -Q_EXTERN int numVertexRemaps Q_ASSIGN( 0 ); +Q_EXTERN shaderInfo_t *shaderInfo Q_ASSIGN( NULL ); +Q_EXTERN int numShaderInfo Q_ASSIGN( 0 ); +Q_EXTERN int numVertexRemaps Q_ASSIGN( 0 ); -Q_EXTERN surfaceParm_t custSurfaceParms[ MAX_CUST_SURFACEPARMS ]; -Q_EXTERN int numCustSurfaceParms Q_ASSIGN( 0 ); +Q_EXTERN surfaceParm_t custSurfaceParms[ MAX_CUST_SURFACEPARMS ]; +Q_EXTERN int numCustSurfaceParms Q_ASSIGN( 0 ); -Q_EXTERN char mapName[ MAX_QPATH ]; /* ydnar: per-map custom shaders for larger lightmaps */ -Q_EXTERN char mapShaderFile[ 1024 ]; -Q_EXTERN qboolean warnImage Q_ASSIGN( qtrue ); +Q_EXTERN char mapName[ MAX_QPATH ]; /* ydnar: per-map custom shaders for larger lightmaps */ +Q_EXTERN char mapShaderFile[ 1024 ]; +Q_EXTERN qboolean warnImage Q_ASSIGN( qtrue ); /* ydnar: sinusoid samples */ -Q_EXTERN float jitters[ MAX_JITTERS ]; +Q_EXTERN float jitters[ MAX_JITTERS ]; /* commandline arguments */ -Q_EXTERN qboolean verbose; -Q_EXTERN qboolean verboseEntities Q_ASSIGN( qfalse ); -Q_EXTERN qboolean force Q_ASSIGN( qfalse ); -Q_EXTERN qboolean infoMode Q_ASSIGN( qfalse ); -Q_EXTERN qboolean useCustomInfoParms Q_ASSIGN( qfalse ); -Q_EXTERN qboolean noprune Q_ASSIGN( qfalse ); -Q_EXTERN qboolean leaktest Q_ASSIGN( qfalse ); -Q_EXTERN qboolean nodetail Q_ASSIGN( qfalse ); -Q_EXTERN qboolean nosubdivide Q_ASSIGN( qfalse ); -Q_EXTERN qboolean notjunc Q_ASSIGN( qfalse ); -Q_EXTERN qboolean fulldetail Q_ASSIGN( qfalse ); -Q_EXTERN qboolean nowater Q_ASSIGN( qfalse ); -Q_EXTERN qboolean noCurveBrushes Q_ASSIGN( qfalse ); -Q_EXTERN qboolean fakemap Q_ASSIGN( qfalse ); -Q_EXTERN qboolean coplanar Q_ASSIGN( qfalse ); -Q_EXTERN qboolean nofog Q_ASSIGN( qfalse ); -Q_EXTERN qboolean noHint Q_ASSIGN( qfalse ); /* ydnar */ -Q_EXTERN qboolean renameModelShaders Q_ASSIGN( qfalse ); /* ydnar */ -Q_EXTERN qboolean skyFixHack Q_ASSIGN( qfalse ); /* ydnar */ -Q_EXTERN qboolean bspAlternateSplitWeights Q_ASSIGN( qfalse ); /* 27 */ -Q_EXTERN qboolean deepBSP Q_ASSIGN( qfalse ); /* div0 */ -Q_EXTERN qboolean maxAreaFaceSurface Q_ASSIGN( qfalse ); /* divVerent */ - -Q_EXTERN int patchSubdivisions Q_ASSIGN( 8 ); /* ydnar: -patchmeta subdivisions */ - -Q_EXTERN int maxLMSurfaceVerts Q_ASSIGN( 64 ); /* ydnar */ -Q_EXTERN int maxSurfaceVerts Q_ASSIGN( 999 ); /* ydnar */ -Q_EXTERN int maxSurfaceIndexes Q_ASSIGN( 6000 ); /* ydnar */ -Q_EXTERN float npDegrees Q_ASSIGN( 0.0f ); /* ydnar: nonplanar degrees */ -Q_EXTERN int bevelSnap Q_ASSIGN( 0 ); /* ydnar: bevel plane snap */ -Q_EXTERN int texRange Q_ASSIGN( 0 ); -Q_EXTERN qboolean flat Q_ASSIGN( qfalse ); -Q_EXTERN qboolean meta Q_ASSIGN( qfalse ); -Q_EXTERN qboolean patchMeta Q_ASSIGN( qfalse ); -Q_EXTERN qboolean emitFlares Q_ASSIGN( qfalse ); -Q_EXTERN qboolean debugSurfaces Q_ASSIGN( qfalse ); -Q_EXTERN qboolean debugInset Q_ASSIGN( qfalse ); -Q_EXTERN qboolean debugPortals Q_ASSIGN( qfalse ); +Q_EXTERN qboolean verbose; +Q_EXTERN qboolean verboseEntities Q_ASSIGN( qfalse ); +Q_EXTERN qboolean force Q_ASSIGN( qfalse ); +Q_EXTERN qboolean infoMode Q_ASSIGN( qfalse ); +Q_EXTERN qboolean useCustomInfoParms Q_ASSIGN( qfalse ); +Q_EXTERN qboolean noprune Q_ASSIGN( qfalse ); +Q_EXTERN qboolean leaktest Q_ASSIGN( qfalse ); +Q_EXTERN qboolean nodetail Q_ASSIGN( qfalse ); +Q_EXTERN qboolean nosubdivide Q_ASSIGN( qfalse ); +Q_EXTERN qboolean notjunc Q_ASSIGN( qfalse ); +Q_EXTERN qboolean fulldetail Q_ASSIGN( qfalse ); +Q_EXTERN qboolean nowater Q_ASSIGN( qfalse ); +Q_EXTERN qboolean noCurveBrushes Q_ASSIGN( qfalse ); +Q_EXTERN qboolean fakemap Q_ASSIGN( qfalse ); +Q_EXTERN qboolean coplanar Q_ASSIGN( qfalse ); +Q_EXTERN qboolean nofog Q_ASSIGN( qfalse ); +Q_EXTERN qboolean noHint Q_ASSIGN( qfalse ); /* ydnar */ +Q_EXTERN qboolean renameModelShaders Q_ASSIGN( qfalse ); /* ydnar */ +Q_EXTERN qboolean skyFixHack Q_ASSIGN( qfalse ); /* ydnar */ +Q_EXTERN qboolean bspAlternateSplitWeights Q_ASSIGN( qfalse ); /* 27 */ +Q_EXTERN qboolean deepBSP Q_ASSIGN( qfalse ); /* div0 */ +Q_EXTERN qboolean maxAreaFaceSurface Q_ASSIGN( qfalse ); /* divVerent */ + +Q_EXTERN int patchSubdivisions Q_ASSIGN( 8 ); /* ydnar: -patchmeta subdivisions */ + +Q_EXTERN int maxLMSurfaceVerts Q_ASSIGN( 64 ); /* ydnar */ +Q_EXTERN int maxSurfaceVerts Q_ASSIGN( 999 ); /* ydnar */ +Q_EXTERN int maxSurfaceIndexes Q_ASSIGN( 6000 ); /* ydnar */ +Q_EXTERN float npDegrees Q_ASSIGN( 0.0f ); /* ydnar: nonplanar degrees */ +Q_EXTERN int bevelSnap Q_ASSIGN( 0 ); /* ydnar: bevel plane snap */ +Q_EXTERN int texRange Q_ASSIGN( 0 ); +Q_EXTERN qboolean flat Q_ASSIGN( qfalse ); +Q_EXTERN qboolean meta Q_ASSIGN( qfalse ); +Q_EXTERN qboolean patchMeta Q_ASSIGN( qfalse ); +Q_EXTERN qboolean emitFlares Q_ASSIGN( qfalse ); +Q_EXTERN qboolean debugSurfaces Q_ASSIGN( qfalse ); +Q_EXTERN qboolean debugInset Q_ASSIGN( qfalse ); +Q_EXTERN qboolean debugPortals Q_ASSIGN( qfalse ); Q_EXTERN qboolean lightmapTriangleCheck Q_ASSIGN( qfalse ); Q_EXTERN qboolean lightmapExtraVisClusterNudge Q_ASSIGN( qfalse ); Q_EXTERN qboolean lightmapFill Q_ASSIGN( qfalse ); @@ -2059,7 +2059,7 @@ Q_EXTERN float metaMaxBBoxDistance Q_ASSIGN( -1 ); // of this writing, FindFloatPlane() and AddBrushBevels()). Q_EXTERN double normalEpsilon Q_ASSIGN( 0.00005 ); #else -Q_EXTERN double normalEpsilon Q_ASSIGN( 0.00001 ); +Q_EXTERN double normalEpsilon Q_ASSIGN( 0.00001 ); #endif #if Q3MAP2_EXPERIMENTAL_HIGH_PRECISION_MATH_FIXES @@ -2073,90 +2073,90 @@ Q_EXTERN double normalEpsilon Q_ASSIGN( 0.00001 ); // (or even 2^14). Q_EXTERN double distanceEpsilon Q_ASSIGN( 0.005 ); #else -Q_EXTERN double distanceEpsilon Q_ASSIGN( 0.01 ); +Q_EXTERN double distanceEpsilon Q_ASSIGN( 0.01 ); #endif /* bsp */ -Q_EXTERN int numMapEntities Q_ASSIGN( 0 ); +Q_EXTERN int numMapEntities Q_ASSIGN( 0 ); -Q_EXTERN int blockSize[ 3 ] /* should be the same as in radiant */ +Q_EXTERN int blockSize[ 3 ] /* should be the same as in radiant */ #ifndef MAIN_C ; #else - = { 1024, 1024, 1024 }; + = { 1024, 1024, 1024 }; #endif -Q_EXTERN char name[ 1024 ]; -Q_EXTERN char source[ 1024 ]; -Q_EXTERN char outbase[ 32 ]; +Q_EXTERN char name[ 1024 ]; +Q_EXTERN char source[ 1024 ]; +Q_EXTERN char outbase[ 32 ]; -Q_EXTERN int sampleSize; /* lightmap sample size in units */ -Q_EXTERN int minSampleSize; /* minimum sample size to use at all */ -Q_EXTERN int sampleScale; /* vortex: lightmap sample scale (ie quality)*/ +Q_EXTERN int sampleSize; /* lightmap sample size in units */ +Q_EXTERN int minSampleSize; /* minimum sample size to use at all */ +Q_EXTERN int sampleScale; /* vortex: lightmap sample scale (ie quality)*/ -Q_EXTERN int mapEntityNum Q_ASSIGN( 0 ); +Q_EXTERN int mapEntityNum Q_ASSIGN( 0 ); -Q_EXTERN int entitySourceBrushes; +Q_EXTERN int entitySourceBrushes; Q_EXTERN plane_t *mapplanes Q_ASSIGN( NULL ); /* mapplanes[ num ^ 1 ] will always be the mirror or mapplanes[ num ] */ Q_EXTERN int nummapplanes Q_ASSIGN( 0 ); /* nummapplanes will always be even */ Q_EXTERN int allocatedmapplanes Q_ASSIGN( 0 ); -Q_EXTERN int numMapPatches; -Q_EXTERN vec3_t mapMins, mapMaxs; +Q_EXTERN int numMapPatches; +Q_EXTERN vec3_t mapMins, mapMaxs; -Q_EXTERN int defaultFogNum Q_ASSIGN( -1 ); /* ydnar: cleaner fog handling */ -Q_EXTERN int numMapFogs Q_ASSIGN( 0 ); -Q_EXTERN fog_t mapFogs[ MAX_MAP_FOGS ]; +Q_EXTERN int defaultFogNum Q_ASSIGN( -1 ); /* ydnar: cleaner fog handling */ +Q_EXTERN int numMapFogs Q_ASSIGN( 0 ); +Q_EXTERN fog_t mapFogs[ MAX_MAP_FOGS ]; -Q_EXTERN entity_t *mapEnt; -Q_EXTERN brush_t *buildBrush; -Q_EXTERN int numActiveBrushes; -Q_EXTERN int g_bBrushPrimit; +Q_EXTERN entity_t *mapEnt; +Q_EXTERN brush_t *buildBrush; +Q_EXTERN int numActiveBrushes; +Q_EXTERN int g_bBrushPrimit; -Q_EXTERN int numStrippedLights Q_ASSIGN( 0 ); +Q_EXTERN int numStrippedLights Q_ASSIGN( 0 ); /* surface stuff */ -Q_EXTERN mapDrawSurface_t *mapDrawSurfs Q_ASSIGN( NULL ); -Q_EXTERN int numMapDrawSurfs; +Q_EXTERN mapDrawSurface_t *mapDrawSurfs Q_ASSIGN( NULL ); +Q_EXTERN int numMapDrawSurfs; -Q_EXTERN int numSurfacesByType[ NUM_SURFACE_TYPES ]; -Q_EXTERN int numClearedSurfaces; -Q_EXTERN int numStripSurfaces; -Q_EXTERN int numMaxAreaSurfaces; -Q_EXTERN int numFanSurfaces; -Q_EXTERN int numMergedSurfaces; -Q_EXTERN int numMergedVerts; +Q_EXTERN int numSurfacesByType[ NUM_SURFACE_TYPES ]; +Q_EXTERN int numClearedSurfaces; +Q_EXTERN int numStripSurfaces; +Q_EXTERN int numMaxAreaSurfaces; +Q_EXTERN int numFanSurfaces; +Q_EXTERN int numMergedSurfaces; +Q_EXTERN int numMergedVerts; -Q_EXTERN int numRedundantIndexes; +Q_EXTERN int numRedundantIndexes; -Q_EXTERN int numSurfaceModels Q_ASSIGN( 0 ); +Q_EXTERN int numSurfaceModels Q_ASSIGN( 0 ); -Q_EXTERN byte debugColors[ 12 ][ 3 ] +Q_EXTERN byte debugColors[ 12 ][ 3 ] #ifndef MAIN_C ; #else - = - { - { 255, 0, 0 }, - { 192, 128, 128 }, - { 255, 255, 0 }, - { 192, 192, 128 }, - { 0, 255, 255 }, - { 128, 192, 192 }, - { 0, 0, 255 }, - { 128, 128, 192 }, - { 255, 0, 255 }, - { 192, 128, 192 }, - { 0, 255, 0 }, - { 128, 192, 128 } - }; + = + { + { 255, 0, 0 }, + { 192, 128, 128 }, + { 255, 255, 0 }, + { 192, 192, 128 }, + { 0, 255, 255 }, + { 128, 192, 192 }, + { 0, 0, 255 }, + { 128, 128, 192 }, + { 255, 0, 255 }, + { 192, 128, 192 }, + { 0, 255, 0 }, + { 128, 192, 128 } + }; #endif -Q_EXTERN qboolean skyboxPresent Q_ASSIGN( qfalse ); -Q_EXTERN int skyboxArea Q_ASSIGN( -1 ); -Q_EXTERN m4x4_t skyboxTransform; +Q_EXTERN qboolean skyboxPresent Q_ASSIGN( qfalse ); +Q_EXTERN int skyboxArea Q_ASSIGN( -1 ); +Q_EXTERN m4x4_t skyboxTransform; @@ -2167,45 +2167,45 @@ Q_EXTERN m4x4_t skyboxTransform; ------------------------------------------------------------------------------- */ /* commandline arguments */ -Q_EXTERN qboolean fastvis; -Q_EXTERN qboolean noPassageVis; -Q_EXTERN qboolean passageVisOnly; -Q_EXTERN qboolean mergevis; -Q_EXTERN qboolean mergevisportals; -Q_EXTERN qboolean nosort; -Q_EXTERN qboolean saveprt; -Q_EXTERN qboolean hint; /* ydnar */ -Q_EXTERN char inbase[ MAX_QPATH ]; -Q_EXTERN char globalCelShader[ MAX_QPATH ]; +Q_EXTERN qboolean fastvis; +Q_EXTERN qboolean noPassageVis; +Q_EXTERN qboolean passageVisOnly; +Q_EXTERN qboolean mergevis; +Q_EXTERN qboolean mergevisportals; +Q_EXTERN qboolean nosort; +Q_EXTERN qboolean saveprt; +Q_EXTERN qboolean hint; /* ydnar */ +Q_EXTERN char inbase[ MAX_QPATH ]; +Q_EXTERN char globalCelShader[ MAX_QPATH ]; -Q_EXTERN float farPlaneDist; /* rr2do2, rf, mre, ydnar all contributed to this one... */ +Q_EXTERN float farPlaneDist; /* rr2do2, rf, mre, ydnar all contributed to this one... */ -Q_EXTERN int numportals; -Q_EXTERN int portalclusters; +Q_EXTERN int numportals; +Q_EXTERN int portalclusters; -Q_EXTERN vportal_t *portals; -Q_EXTERN leaf_t *leafs; +Q_EXTERN vportal_t *portals; +Q_EXTERN leaf_t *leafs; -Q_EXTERN vportal_t *faces; -Q_EXTERN leaf_t *faceleafs; +Q_EXTERN vportal_t *faces; +Q_EXTERN leaf_t *faceleafs; -Q_EXTERN int numfaces; +Q_EXTERN int numfaces; -Q_EXTERN int c_portaltest, c_portalpass, c_portalcheck; -Q_EXTERN int c_portalskip, c_leafskip; -Q_EXTERN int c_vistest, c_mighttest; -Q_EXTERN int c_chains; +Q_EXTERN int c_portaltest, c_portalpass, c_portalcheck; +Q_EXTERN int c_portalskip, c_leafskip; +Q_EXTERN int c_vistest, c_mighttest; +Q_EXTERN int c_chains; -Q_EXTERN byte *vismap, *vismap_p, *vismap_end; +Q_EXTERN byte *vismap, *vismap_p, *vismap_end; -Q_EXTERN int testlevel; +Q_EXTERN int testlevel; -Q_EXTERN byte *uncompressed; +Q_EXTERN byte *uncompressed; -Q_EXTERN int leafbytes, leaflongs; -Q_EXTERN int portalbytes, portallongs; +Q_EXTERN int leafbytes, leaflongs; +Q_EXTERN int portalbytes, portallongs; -Q_EXTERN vportal_t *sorted_portals[ MAX_MAP_PORTALS * 2 ]; +Q_EXTERN vportal_t *sorted_portals[ MAX_MAP_PORTALS * 2 ]; @@ -2216,245 +2216,245 @@ Q_EXTERN vportal_t *sorted_portals[ MAX_MAP_PORTALS * 2 ]; ------------------------------------------------------------------------------- */ /* commandline arguments */ -Q_EXTERN qboolean wolfLight Q_ASSIGN( qfalse ); -Q_EXTERN float extraDist Q_ASSIGN( 0.0f ); -Q_EXTERN qboolean loMem Q_ASSIGN( qfalse ); -Q_EXTERN qboolean noStyles Q_ASSIGN( qfalse ); -Q_EXTERN qboolean keepLights Q_ASSIGN( qfalse ); - -Q_EXTERN int sampleSize Q_ASSIGN( DEFAULT_LIGHTMAP_SAMPLE_SIZE ); -Q_EXTERN int minSampleSize Q_ASSIGN( DEFAULT_LIGHTMAP_MIN_SAMPLE_SIZE ); -Q_EXTERN qboolean noVertexLighting Q_ASSIGN( qfalse ); -Q_EXTERN qboolean noGridLighting Q_ASSIGN( qfalse ); - -Q_EXTERN qboolean noTrace Q_ASSIGN( qfalse ); -Q_EXTERN qboolean noSurfaces Q_ASSIGN( qfalse ); -Q_EXTERN qboolean patchShadows Q_ASSIGN( qfalse ); -Q_EXTERN qboolean cpmaHack Q_ASSIGN( qfalse ); - -Q_EXTERN qboolean deluxemap Q_ASSIGN( qfalse ); -Q_EXTERN qboolean debugDeluxemap Q_ASSIGN( qfalse ); -Q_EXTERN int deluxemode Q_ASSIGN( 0 ); /* deluxemap format (0 - modelspace, 1 - tangentspace with renormalization, 2 - tangentspace without renormalization) */ - -Q_EXTERN qboolean fast Q_ASSIGN( qfalse ); +Q_EXTERN qboolean wolfLight Q_ASSIGN( qfalse ); +Q_EXTERN float extraDist Q_ASSIGN( 0.0f ); +Q_EXTERN qboolean loMem Q_ASSIGN( qfalse ); +Q_EXTERN qboolean noStyles Q_ASSIGN( qfalse ); +Q_EXTERN qboolean keepLights Q_ASSIGN( qfalse ); + +Q_EXTERN int sampleSize Q_ASSIGN( DEFAULT_LIGHTMAP_SAMPLE_SIZE ); +Q_EXTERN int minSampleSize Q_ASSIGN( DEFAULT_LIGHTMAP_MIN_SAMPLE_SIZE ); +Q_EXTERN qboolean noVertexLighting Q_ASSIGN( qfalse ); +Q_EXTERN qboolean noGridLighting Q_ASSIGN( qfalse ); + +Q_EXTERN qboolean noTrace Q_ASSIGN( qfalse ); +Q_EXTERN qboolean noSurfaces Q_ASSIGN( qfalse ); +Q_EXTERN qboolean patchShadows Q_ASSIGN( qfalse ); +Q_EXTERN qboolean cpmaHack Q_ASSIGN( qfalse ); + +Q_EXTERN qboolean deluxemap Q_ASSIGN( qfalse ); +Q_EXTERN qboolean debugDeluxemap Q_ASSIGN( qfalse ); +Q_EXTERN int deluxemode Q_ASSIGN( 0 ); /* deluxemap format (0 - modelspace, 1 - tangentspace with renormalization, 2 - tangentspace without renormalization) */ + +Q_EXTERN qboolean fast Q_ASSIGN( qfalse ); Q_EXTERN qboolean fastpoint Q_ASSIGN( qtrue ); -Q_EXTERN qboolean faster Q_ASSIGN( qfalse ); -Q_EXTERN qboolean fastgrid Q_ASSIGN( qfalse ); -Q_EXTERN qboolean fastbounce Q_ASSIGN( qfalse ); -Q_EXTERN qboolean cheap Q_ASSIGN( qfalse ); -Q_EXTERN qboolean cheapgrid Q_ASSIGN( qfalse ); -Q_EXTERN int bounce Q_ASSIGN( 0 ); -Q_EXTERN qboolean bounceOnly Q_ASSIGN( qfalse ); -Q_EXTERN qboolean bouncing Q_ASSIGN( qfalse ); -Q_EXTERN qboolean bouncegrid Q_ASSIGN( qfalse ); -Q_EXTERN qboolean normalmap Q_ASSIGN( qfalse ); -Q_EXTERN qboolean trisoup Q_ASSIGN( qfalse ); -Q_EXTERN qboolean shade Q_ASSIGN( qfalse ); -Q_EXTERN float shadeAngleDegrees Q_ASSIGN( 0.0f ); -Q_EXTERN int superSample Q_ASSIGN( 0 ); -Q_EXTERN int lightSamples Q_ASSIGN( 1 ); -Q_EXTERN qboolean lightRandomSamples Q_ASSIGN( qfalse ); -Q_EXTERN int lightSamplesSearchBoxSize Q_ASSIGN( 1 ); -Q_EXTERN qboolean filter Q_ASSIGN( qfalse ); -Q_EXTERN qboolean dark Q_ASSIGN( qfalse ); -Q_EXTERN qboolean sunOnly Q_ASSIGN( qfalse ); -Q_EXTERN int approximateTolerance Q_ASSIGN( 0 ); -Q_EXTERN qboolean noCollapse Q_ASSIGN( qfalse ); -Q_EXTERN int lightmapSearchBlockSize Q_ASSIGN( 0 ); -Q_EXTERN qboolean exportLightmaps Q_ASSIGN( qfalse ); -Q_EXTERN qboolean externalLightmaps Q_ASSIGN( qfalse ); -Q_EXTERN int lmCustomSize Q_ASSIGN( LIGHTMAP_WIDTH ); -Q_EXTERN char * lmCustomDir Q_ASSIGN( NULL ); -Q_EXTERN int lmLimitSize Q_ASSIGN( 0 ); - -Q_EXTERN qboolean dirty Q_ASSIGN( qfalse ); -Q_EXTERN qboolean dirtDebug Q_ASSIGN( qfalse ); -Q_EXTERN int dirtMode Q_ASSIGN( 0 ); -Q_EXTERN float dirtDepth Q_ASSIGN( 128.0f ); -Q_EXTERN float dirtScale Q_ASSIGN( 1.0f ); -Q_EXTERN float dirtGain Q_ASSIGN( 1.0f ); +Q_EXTERN qboolean faster Q_ASSIGN( qfalse ); +Q_EXTERN qboolean fastgrid Q_ASSIGN( qfalse ); +Q_EXTERN qboolean fastbounce Q_ASSIGN( qfalse ); +Q_EXTERN qboolean cheap Q_ASSIGN( qfalse ); +Q_EXTERN qboolean cheapgrid Q_ASSIGN( qfalse ); +Q_EXTERN int bounce Q_ASSIGN( 0 ); +Q_EXTERN qboolean bounceOnly Q_ASSIGN( qfalse ); +Q_EXTERN qboolean bouncing Q_ASSIGN( qfalse ); +Q_EXTERN qboolean bouncegrid Q_ASSIGN( qfalse ); +Q_EXTERN qboolean normalmap Q_ASSIGN( qfalse ); +Q_EXTERN qboolean trisoup Q_ASSIGN( qfalse ); +Q_EXTERN qboolean shade Q_ASSIGN( qfalse ); +Q_EXTERN float shadeAngleDegrees Q_ASSIGN( 0.0f ); +Q_EXTERN int superSample Q_ASSIGN( 0 ); +Q_EXTERN int lightSamples Q_ASSIGN( 1 ); +Q_EXTERN qboolean lightRandomSamples Q_ASSIGN( qfalse ); +Q_EXTERN int lightSamplesSearchBoxSize Q_ASSIGN( 1 ); +Q_EXTERN qboolean filter Q_ASSIGN( qfalse ); +Q_EXTERN qboolean dark Q_ASSIGN( qfalse ); +Q_EXTERN qboolean sunOnly Q_ASSIGN( qfalse ); +Q_EXTERN int approximateTolerance Q_ASSIGN( 0 ); +Q_EXTERN qboolean noCollapse Q_ASSIGN( qfalse ); +Q_EXTERN int lightmapSearchBlockSize Q_ASSIGN( 0 ); +Q_EXTERN qboolean exportLightmaps Q_ASSIGN( qfalse ); +Q_EXTERN qboolean externalLightmaps Q_ASSIGN( qfalse ); +Q_EXTERN int lmCustomSize Q_ASSIGN( LIGHTMAP_WIDTH ); +Q_EXTERN char * lmCustomDir Q_ASSIGN( NULL ); +Q_EXTERN int lmLimitSize Q_ASSIGN( 0 ); + +Q_EXTERN qboolean dirty Q_ASSIGN( qfalse ); +Q_EXTERN qboolean dirtDebug Q_ASSIGN( qfalse ); +Q_EXTERN int dirtMode Q_ASSIGN( 0 ); +Q_EXTERN float dirtDepth Q_ASSIGN( 128.0f ); +Q_EXTERN float dirtScale Q_ASSIGN( 1.0f ); +Q_EXTERN float dirtGain Q_ASSIGN( 1.0f ); /* 27: floodlighting */ -Q_EXTERN qboolean debugnormals Q_ASSIGN( qfalse ); -Q_EXTERN qboolean floodlighty Q_ASSIGN( qfalse ); -Q_EXTERN qboolean floodlight_lowquality Q_ASSIGN( qfalse ); -Q_EXTERN vec3_t floodlightRGB; -Q_EXTERN float floodlightIntensity Q_ASSIGN( 512.0f ); -Q_EXTERN float floodlightDistance Q_ASSIGN( 1024.0f ); -Q_EXTERN float floodlightDirectionScale Q_ASSIGN( 1.0f ); - -Q_EXTERN qboolean dump Q_ASSIGN( qfalse ); -Q_EXTERN qboolean debug Q_ASSIGN( qfalse ); -Q_EXTERN qboolean debugUnused Q_ASSIGN( qfalse ); -Q_EXTERN qboolean debugAxis Q_ASSIGN( qfalse ); -Q_EXTERN qboolean debugCluster Q_ASSIGN( qfalse ); -Q_EXTERN qboolean debugOrigin Q_ASSIGN( qfalse ); -Q_EXTERN qboolean lightmapBorder Q_ASSIGN( qfalse ); +Q_EXTERN qboolean debugnormals Q_ASSIGN( qfalse ); +Q_EXTERN qboolean floodlighty Q_ASSIGN( qfalse ); +Q_EXTERN qboolean floodlight_lowquality Q_ASSIGN( qfalse ); +Q_EXTERN vec3_t floodlightRGB; +Q_EXTERN float floodlightIntensity Q_ASSIGN( 512.0f ); +Q_EXTERN float floodlightDistance Q_ASSIGN( 1024.0f ); +Q_EXTERN float floodlightDirectionScale Q_ASSIGN( 1.0f ); + +Q_EXTERN qboolean dump Q_ASSIGN( qfalse ); +Q_EXTERN qboolean debug Q_ASSIGN( qfalse ); +Q_EXTERN qboolean debugUnused Q_ASSIGN( qfalse ); +Q_EXTERN qboolean debugAxis Q_ASSIGN( qfalse ); +Q_EXTERN qboolean debugCluster Q_ASSIGN( qfalse ); +Q_EXTERN qboolean debugOrigin Q_ASSIGN( qfalse ); +Q_EXTERN qboolean lightmapBorder Q_ASSIGN( qfalse ); /* longest distance across the map */ -Q_EXTERN float maxMapDistance Q_ASSIGN( 0 ); +Q_EXTERN float maxMapDistance Q_ASSIGN( 0 ); /* for run time tweaking of light sources */ -Q_EXTERN float pointScale Q_ASSIGN( 7500.0f ); +Q_EXTERN float pointScale Q_ASSIGN( 7500.0f ); Q_EXTERN float spotScale Q_ASSIGN( 7500.0f ); -Q_EXTERN float areaScale Q_ASSIGN( 0.25f ); -Q_EXTERN float skyScale Q_ASSIGN( 1.0f ); -Q_EXTERN float bounceScale Q_ASSIGN( 0.25f ); +Q_EXTERN float areaScale Q_ASSIGN( 0.25f ); +Q_EXTERN float skyScale Q_ASSIGN( 1.0f ); +Q_EXTERN float bounceScale Q_ASSIGN( 0.25f ); /* jal: alternative angle attenuation curve */ -Q_EXTERN qboolean lightAngleHL Q_ASSIGN( qfalse ); - +Q_EXTERN qboolean lightAngleHL Q_ASSIGN( qfalse ); + /* vortex: gridscale and gridambientscale */ -Q_EXTERN float gridScale Q_ASSIGN( 1.0f ); -Q_EXTERN float gridAmbientScale Q_ASSIGN( 1.0f ); -Q_EXTERN float gridDirectionality Q_ASSIGN( 1.0f ); -Q_EXTERN float gridAmbientDirectionality Q_ASSIGN( 0.0f ); +Q_EXTERN float gridScale Q_ASSIGN( 1.0f ); +Q_EXTERN float gridAmbientScale Q_ASSIGN( 1.0f ); +Q_EXTERN float gridDirectionality Q_ASSIGN( 1.0f ); +Q_EXTERN float gridAmbientDirectionality Q_ASSIGN( 0.0f ); Q_EXTERN qboolean inGrid Q_ASSIGN( 0 ); /* ydnar: lightmap gamma/compensation */ -Q_EXTERN float lightmapGamma Q_ASSIGN( 1.0f ); +Q_EXTERN float lightmapGamma Q_ASSIGN( 1.0f ); Q_EXTERN float lightmapsRGB Q_ASSIGN( qfalse ); Q_EXTERN float texturesRGB Q_ASSIGN( qfalse ); Q_EXTERN float colorsRGB Q_ASSIGN( qfalse ); Q_EXTERN float lightmapExposure Q_ASSIGN( 0.0f ); -Q_EXTERN float lightmapCompensate Q_ASSIGN( 1.0f ); +Q_EXTERN float lightmapCompensate Q_ASSIGN( 1.0f ); /* ydnar: for runtime tweaking of falloff tolerance */ -Q_EXTERN float falloffTolerance Q_ASSIGN( 1.0f ); -Q_EXTERN qboolean exactPointToPolygon Q_ASSIGN( qtrue ); -Q_EXTERN float formFactorValueScale Q_ASSIGN( 3.0f ); -Q_EXTERN float linearScale Q_ASSIGN( 1.0f / 8000.0f ); +Q_EXTERN float falloffTolerance Q_ASSIGN( 1.0f ); +Q_EXTERN qboolean exactPointToPolygon Q_ASSIGN( qtrue ); +Q_EXTERN float formFactorValueScale Q_ASSIGN( 3.0f ); +Q_EXTERN float linearScale Q_ASSIGN( 1.0f / 8000.0f ); // for .ase conversion -Q_EXTERN qboolean shadersAsBitmap Q_ASSIGN( qfalse ); -Q_EXTERN qboolean lightmapsAsTexcoord Q_ASSIGN( qfalse ); +Q_EXTERN qboolean shadersAsBitmap Q_ASSIGN( qfalse ); +Q_EXTERN qboolean lightmapsAsTexcoord Q_ASSIGN( qfalse ); -Q_EXTERN light_t *lights; -Q_EXTERN int numPointLights; -Q_EXTERN int numSpotLights; -Q_EXTERN int numSunLights; -Q_EXTERN int numAreaLights; +Q_EXTERN light_t *lights; +Q_EXTERN int numPointLights; +Q_EXTERN int numSpotLights; +Q_EXTERN int numSunLights; +Q_EXTERN int numAreaLights; /* ydnar: for luxel placement */ -Q_EXTERN int numSurfaceClusters, maxSurfaceClusters; -Q_EXTERN int *surfaceClusters; +Q_EXTERN int numSurfaceClusters, maxSurfaceClusters; +Q_EXTERN int *surfaceClusters; /* ydnar: for radiosity */ -Q_EXTERN int numDiffuseLights; -Q_EXTERN int numBrushDiffuseLights; -Q_EXTERN int numTriangleDiffuseLights; -Q_EXTERN int numPatchDiffuseLights; +Q_EXTERN int numDiffuseLights; +Q_EXTERN int numBrushDiffuseLights; +Q_EXTERN int numTriangleDiffuseLights; +Q_EXTERN int numPatchDiffuseLights; /* ydnar: general purpose extra copy of drawvert list */ -Q_EXTERN bspDrawVert_t *yDrawVerts; +Q_EXTERN bspDrawVert_t *yDrawVerts; /* ydnar: for tracing statistics */ -Q_EXTERN int minSurfacesTested; -Q_EXTERN int maxSurfacesTested; -Q_EXTERN int totalSurfacesTested; -Q_EXTERN int totalTraces; +Q_EXTERN int minSurfacesTested; +Q_EXTERN int maxSurfacesTested; +Q_EXTERN int totalSurfacesTested; +Q_EXTERN int totalTraces; -Q_EXTERN FILE *dumpFile; +Q_EXTERN FILE *dumpFile; -Q_EXTERN int c_visible, c_occluded; -Q_EXTERN int c_subsampled; /* ydnar */ +Q_EXTERN int c_visible, c_occluded; +Q_EXTERN int c_subsampled; /* ydnar */ -Q_EXTERN int defaultLightSubdivide Q_ASSIGN( 999 ); +Q_EXTERN int defaultLightSubdivide Q_ASSIGN( 999 ); -Q_EXTERN vec3_t ambientColor; -Q_EXTERN vec3_t minLight, minVertexLight, minGridLight; +Q_EXTERN vec3_t ambientColor; +Q_EXTERN vec3_t minLight, minVertexLight, minGridLight; -Q_EXTERN int *entitySurface; -Q_EXTERN vec3_t *surfaceOrigin; +Q_EXTERN int *entitySurface; +Q_EXTERN vec3_t *surfaceOrigin; -Q_EXTERN vec3_t sunDirection; -Q_EXTERN vec3_t sunLight; +Q_EXTERN vec3_t sunDirection; +Q_EXTERN vec3_t sunLight; /* tracing */ -Q_EXTERN int c_totalTrace; -Q_EXTERN int c_cullTrace, c_testTrace; -Q_EXTERN int c_testFacets; +Q_EXTERN int c_totalTrace; +Q_EXTERN int c_cullTrace, c_testTrace; +Q_EXTERN int c_testFacets; /* ydnar: light optimization */ -Q_EXTERN float subdivideThreshold Q_ASSIGN( DEFAULT_SUBDIVIDE_THRESHOLD ); +Q_EXTERN float subdivideThreshold Q_ASSIGN( DEFAULT_SUBDIVIDE_THRESHOLD ); -Q_EXTERN int numOpaqueBrushes, maxOpaqueBrush; -Q_EXTERN byte *opaqueBrushes; +Q_EXTERN int numOpaqueBrushes, maxOpaqueBrush; +Q_EXTERN byte *opaqueBrushes; -Q_EXTERN int numLights; -Q_EXTERN int numCulledLights; +Q_EXTERN int numLights; +Q_EXTERN int numCulledLights; -Q_EXTERN int gridBoundsCulled; -Q_EXTERN int gridEnvelopeCulled; +Q_EXTERN int gridBoundsCulled; +Q_EXTERN int gridEnvelopeCulled; -Q_EXTERN int lightsBoundsCulled; -Q_EXTERN int lightsEnvelopeCulled; -Q_EXTERN int lightsPlaneCulled; -Q_EXTERN int lightsClusterCulled; +Q_EXTERN int lightsBoundsCulled; +Q_EXTERN int lightsEnvelopeCulled; +Q_EXTERN int lightsPlaneCulled; +Q_EXTERN int lightsClusterCulled; /* ydnar: radiosity */ -Q_EXTERN float diffuseSubdivide Q_ASSIGN( 256.0f ); -Q_EXTERN float minDiffuseSubdivide Q_ASSIGN( 64.0f ); -Q_EXTERN int numDiffuseSurfaces Q_ASSIGN( 0 ); +Q_EXTERN float diffuseSubdivide Q_ASSIGN( 256.0f ); +Q_EXTERN float minDiffuseSubdivide Q_ASSIGN( 64.0f ); +Q_EXTERN int numDiffuseSurfaces Q_ASSIGN( 0 ); /* ydnar: list of surface information necessary for lightmap calculation */ -Q_EXTERN surfaceInfo_t *surfaceInfos Q_ASSIGN( NULL ); +Q_EXTERN surfaceInfo_t *surfaceInfos Q_ASSIGN( NULL ); /* ydnar: sorted list of surfaces */ -Q_EXTERN int *sortSurfaces Q_ASSIGN( NULL ); +Q_EXTERN int *sortSurfaces Q_ASSIGN( NULL ); /* clumps of surfaces that share a raw lightmap */ -Q_EXTERN int numLightSurfaces Q_ASSIGN( 0 ); -Q_EXTERN int *lightSurfaces Q_ASSIGN( NULL ); +Q_EXTERN int numLightSurfaces Q_ASSIGN( 0 ); +Q_EXTERN int *lightSurfaces Q_ASSIGN( NULL ); /* raw lightmaps */ -Q_EXTERN int numRawSuperLuxels Q_ASSIGN( 0 ); -Q_EXTERN int numRawLightmaps Q_ASSIGN( 0 ); -Q_EXTERN rawLightmap_t *rawLightmaps Q_ASSIGN( NULL ); -Q_EXTERN int *sortLightmaps Q_ASSIGN( NULL ); +Q_EXTERN int numRawSuperLuxels Q_ASSIGN( 0 ); +Q_EXTERN int numRawLightmaps Q_ASSIGN( 0 ); +Q_EXTERN rawLightmap_t *rawLightmaps Q_ASSIGN( NULL ); +Q_EXTERN int *sortLightmaps Q_ASSIGN( NULL ); /* vertex luxels */ -Q_EXTERN float *vertexLuxels[ MAX_LIGHTMAPS ]; -Q_EXTERN float *radVertexLuxels[ MAX_LIGHTMAPS ]; +Q_EXTERN float *vertexLuxels[ MAX_LIGHTMAPS ]; +Q_EXTERN float *radVertexLuxels[ MAX_LIGHTMAPS ]; /* bsp lightmaps */ -Q_EXTERN int numLightmapShaders Q_ASSIGN( 0 ); -Q_EXTERN int numSolidLightmaps Q_ASSIGN( 0 ); -Q_EXTERN int numOutLightmaps Q_ASSIGN( 0 ); -Q_EXTERN int numBSPLightmaps Q_ASSIGN( 0 ); -Q_EXTERN int numExtLightmaps Q_ASSIGN( 0 ); -Q_EXTERN outLightmap_t *outLightmaps Q_ASSIGN( NULL ); +Q_EXTERN int numLightmapShaders Q_ASSIGN( 0 ); +Q_EXTERN int numSolidLightmaps Q_ASSIGN( 0 ); +Q_EXTERN int numOutLightmaps Q_ASSIGN( 0 ); +Q_EXTERN int numBSPLightmaps Q_ASSIGN( 0 ); +Q_EXTERN int numExtLightmaps Q_ASSIGN( 0 ); +Q_EXTERN outLightmap_t *outLightmaps Q_ASSIGN( NULL ); /* vortex: per surface floodlight statictics */ -Q_EXTERN int numSurfacesFloodlighten Q_ASSIGN( 0 ); +Q_EXTERN int numSurfacesFloodlighten Q_ASSIGN( 0 ); /* grid points */ -Q_EXTERN int numRawGridPoints Q_ASSIGN( 0 ); -Q_EXTERN rawGridPoint_t *rawGridPoints Q_ASSIGN( NULL ); - -Q_EXTERN int numSurfsVertexLit Q_ASSIGN( 0 ); -Q_EXTERN int numSurfsVertexForced Q_ASSIGN( 0 ); -Q_EXTERN int numSurfsVertexApproximated Q_ASSIGN( 0 ); -Q_EXTERN int numSurfsLightmapped Q_ASSIGN( 0 ); -Q_EXTERN int numPlanarsLightmapped Q_ASSIGN( 0 ); -Q_EXTERN int numNonPlanarsLightmapped Q_ASSIGN( 0 ); -Q_EXTERN int numPatchesLightmapped Q_ASSIGN( 0 ); -Q_EXTERN int numPlanarPatchesLightmapped Q_ASSIGN( 0 ); - -Q_EXTERN int numLuxels Q_ASSIGN( 0 ); -Q_EXTERN int numLuxelsMapped Q_ASSIGN( 0 ); -Q_EXTERN int numLuxelsOccluded Q_ASSIGN( 0 ); -Q_EXTERN int numLuxelsIlluminated Q_ASSIGN( 0 ); -Q_EXTERN int numVertsIlluminated Q_ASSIGN( 0 ); +Q_EXTERN int numRawGridPoints Q_ASSIGN( 0 ); +Q_EXTERN rawGridPoint_t *rawGridPoints Q_ASSIGN( NULL ); + +Q_EXTERN int numSurfsVertexLit Q_ASSIGN( 0 ); +Q_EXTERN int numSurfsVertexForced Q_ASSIGN( 0 ); +Q_EXTERN int numSurfsVertexApproximated Q_ASSIGN( 0 ); +Q_EXTERN int numSurfsLightmapped Q_ASSIGN( 0 ); +Q_EXTERN int numPlanarsLightmapped Q_ASSIGN( 0 ); +Q_EXTERN int numNonPlanarsLightmapped Q_ASSIGN( 0 ); +Q_EXTERN int numPatchesLightmapped Q_ASSIGN( 0 ); +Q_EXTERN int numPlanarPatchesLightmapped Q_ASSIGN( 0 ); + +Q_EXTERN int numLuxels Q_ASSIGN( 0 ); +Q_EXTERN int numLuxelsMapped Q_ASSIGN( 0 ); +Q_EXTERN int numLuxelsOccluded Q_ASSIGN( 0 ); +Q_EXTERN int numLuxelsIlluminated Q_ASSIGN( 0 ); +Q_EXTERN int numVertsIlluminated Q_ASSIGN( 0 ); /* lightgrid */ -Q_EXTERN vec3_t gridMins; -Q_EXTERN int gridBounds[ 3 ]; -Q_EXTERN vec3_t gridSize +Q_EXTERN vec3_t gridMins; +Q_EXTERN int gridBounds[ 3 ]; +Q_EXTERN vec3_t gridSize #ifndef MAIN_C ; #else - = { 64, 64, 128 }; + = { 64, 64, 128 }; #endif @@ -2465,77 +2465,77 @@ Q_EXTERN vec3_t gridSize ------------------------------------------------------------------------------- */ -Q_EXTERN int numEntities Q_ASSIGN( 0 ); -Q_EXTERN int numBSPEntities Q_ASSIGN( 0 ); +Q_EXTERN int numEntities Q_ASSIGN( 0 ); +Q_EXTERN int numBSPEntities Q_ASSIGN( 0 ); Q_EXTERN int allocatedEntities Q_ASSIGN( 0 ); Q_EXTERN entity_t* entities Q_ASSIGN( NULL ); -Q_EXTERN int numBSPModels Q_ASSIGN( 0 ); -Q_EXTERN int allocatedBSPModels Q_ASSIGN( 0 ); +Q_EXTERN int numBSPModels Q_ASSIGN( 0 ); +Q_EXTERN int allocatedBSPModels Q_ASSIGN( 0 ); Q_EXTERN bspModel_t* bspModels Q_ASSIGN( NULL ); -Q_EXTERN int numBSPShaders Q_ASSIGN( 0 ); -Q_EXTERN int allocatedBSPShaders Q_ASSIGN( 0 ); +Q_EXTERN int numBSPShaders Q_ASSIGN( 0 ); +Q_EXTERN int allocatedBSPShaders Q_ASSIGN( 0 ); Q_EXTERN bspShader_t* bspShaders Q_ASSIGN( 0 ); -Q_EXTERN int bspEntDataSize Q_ASSIGN( 0 ); -Q_EXTERN int allocatedBSPEntData Q_ASSIGN( 0 ); +Q_EXTERN int bspEntDataSize Q_ASSIGN( 0 ); +Q_EXTERN int allocatedBSPEntData Q_ASSIGN( 0 ); Q_EXTERN char *bspEntData Q_ASSIGN( 0 ); -Q_EXTERN int numBSPLeafs Q_ASSIGN( 0 ); -Q_EXTERN bspLeaf_t bspLeafs[ MAX_MAP_LEAFS ]; +Q_EXTERN int numBSPLeafs Q_ASSIGN( 0 ); +Q_EXTERN bspLeaf_t bspLeafs[ MAX_MAP_LEAFS ]; -Q_EXTERN int numBSPPlanes Q_ASSIGN( 0 ); +Q_EXTERN int numBSPPlanes Q_ASSIGN( 0 ); Q_EXTERN int allocatedBSPPlanes Q_ASSIGN( 0 ); -Q_EXTERN bspPlane_t *bspPlanes; +Q_EXTERN bspPlane_t *bspPlanes; -Q_EXTERN int numBSPNodes Q_ASSIGN( 0 ); -Q_EXTERN int allocatedBSPNodes Q_ASSIGN( 0 ); +Q_EXTERN int numBSPNodes Q_ASSIGN( 0 ); +Q_EXTERN int allocatedBSPNodes Q_ASSIGN( 0 ); Q_EXTERN bspNode_t* bspNodes Q_ASSIGN( NULL ); -Q_EXTERN int numBSPLeafSurfaces Q_ASSIGN( 0 ); -Q_EXTERN int allocatedBSPLeafSurfaces Q_ASSIGN( 0 ); +Q_EXTERN int numBSPLeafSurfaces Q_ASSIGN( 0 ); +Q_EXTERN int allocatedBSPLeafSurfaces Q_ASSIGN( 0 ); Q_EXTERN int* bspLeafSurfaces Q_ASSIGN( NULL ); -Q_EXTERN int numBSPLeafBrushes Q_ASSIGN( 0 ); -Q_EXTERN int allocatedBSPLeafBrushes Q_ASSIGN( 0 ); +Q_EXTERN int numBSPLeafBrushes Q_ASSIGN( 0 ); +Q_EXTERN int allocatedBSPLeafBrushes Q_ASSIGN( 0 ); Q_EXTERN int* bspLeafBrushes Q_ASSIGN( NULL ); -Q_EXTERN int numBSPBrushes Q_ASSIGN( 0 ); -Q_EXTERN int allocatedBSPBrushes Q_ASSIGN( 0 ); +Q_EXTERN int numBSPBrushes Q_ASSIGN( 0 ); +Q_EXTERN int allocatedBSPBrushes Q_ASSIGN( 0 ); Q_EXTERN bspBrush_t* bspBrushes Q_ASSIGN( NULL ); -Q_EXTERN int numBSPBrushSides Q_ASSIGN( 0 ); -Q_EXTERN int allocatedBSPBrushSides Q_ASSIGN( 0 ); +Q_EXTERN int numBSPBrushSides Q_ASSIGN( 0 ); +Q_EXTERN int allocatedBSPBrushSides Q_ASSIGN( 0 ); Q_EXTERN bspBrushSide_t* bspBrushSides Q_ASSIGN( NULL ); -Q_EXTERN int numBSPLightBytes Q_ASSIGN( 0 ); -Q_EXTERN byte *bspLightBytes Q_ASSIGN( NULL ); +Q_EXTERN int numBSPLightBytes Q_ASSIGN( 0 ); +Q_EXTERN byte *bspLightBytes Q_ASSIGN( NULL ); //% Q_EXTERN int numBSPGridPoints Q_ASSIGN( 0 ); //% Q_EXTERN byte *bspGridPoints Q_ASSIGN( NULL ); -Q_EXTERN int numBSPGridPoints Q_ASSIGN( 0 ); -Q_EXTERN bspGridPoint_t *bspGridPoints Q_ASSIGN( NULL ); +Q_EXTERN int numBSPGridPoints Q_ASSIGN( 0 ); +Q_EXTERN bspGridPoint_t *bspGridPoints Q_ASSIGN( NULL ); -Q_EXTERN int numBSPVisBytes Q_ASSIGN( 0 ); -Q_EXTERN byte bspVisBytes[ MAX_MAP_VISIBILITY ]; +Q_EXTERN int numBSPVisBytes Q_ASSIGN( 0 ); +Q_EXTERN byte bspVisBytes[ MAX_MAP_VISIBILITY ]; -Q_EXTERN int numBSPDrawVerts Q_ASSIGN( 0 ); -Q_EXTERN bspDrawVert_t *bspDrawVerts Q_ASSIGN( NULL ); +Q_EXTERN int numBSPDrawVerts Q_ASSIGN( 0 ); +Q_EXTERN bspDrawVert_t *bspDrawVerts Q_ASSIGN( NULL ); -Q_EXTERN int numBSPDrawIndexes Q_ASSIGN( 0 ); +Q_EXTERN int numBSPDrawIndexes Q_ASSIGN( 0 ); Q_EXTERN int allocatedBSPDrawIndexes Q_ASSIGN( 0 ); Q_EXTERN int *bspDrawIndexes Q_ASSIGN( NULL ); -Q_EXTERN int numBSPDrawSurfaces Q_ASSIGN( 0 ); -Q_EXTERN bspDrawSurface_t *bspDrawSurfaces Q_ASSIGN( NULL ); +Q_EXTERN int numBSPDrawSurfaces Q_ASSIGN( 0 ); +Q_EXTERN bspDrawSurface_t *bspDrawSurfaces Q_ASSIGN( NULL ); -Q_EXTERN int numBSPFogs Q_ASSIGN( 0 ); -Q_EXTERN bspFog_t bspFogs[ MAX_MAP_FOGS ]; +Q_EXTERN int numBSPFogs Q_ASSIGN( 0 ); +Q_EXTERN bspFog_t bspFogs[ MAX_MAP_FOGS ]; -Q_EXTERN int numBSPAds Q_ASSIGN( 0 ); -Q_EXTERN bspAdvertisement_t bspAds[ MAX_MAP_ADVERTISEMENTS ]; +Q_EXTERN int numBSPAds Q_ASSIGN( 0 ); +Q_EXTERN bspAdvertisement_t bspAds[ MAX_MAP_ADVERTISEMENTS ]; #define AUTOEXPAND_BY_REALLOC( ptr, reqitem, allocated, def ) \ do \ @@ -2545,7 +2545,7 @@ Q_EXTERN bspAdvertisement_t bspAds[ MAX_MAP_ADVERTISEMENTS ]; if ( allocated == 0 ) { \ allocated = def; } \ while ( reqitem >= allocated && allocated ) \ - allocated *= 2; \ + allocated *= 2; \ if ( !allocated || allocated > 2147483647 / (int)sizeof( *ptr ) ) \ { \ Error( # ptr " over 2 GB" ); \ diff --git a/tools/quake3/q3map2/surface.c b/tools/quake3/q3map2/surface.c index 7d990bb6..0e2a25d0 100644 --- a/tools/quake3/q3map2/surface.c +++ b/tools/quake3/q3map2/surface.c @@ -44,29 +44,29 @@ */ mapDrawSurface_t *AllocDrawSurface( surfaceType_t type ){ - mapDrawSurface_t *ds; - - + mapDrawSurface_t *ds; + + /* ydnar: gs mods: only allocate valid types */ if ( type <= SURFACE_BAD || type >= NUM_SURFACE_TYPES ) { Error( "AllocDrawSurface: Invalid surface type %d specified", type ); } - + /* bounds check */ if ( numMapDrawSurfs >= MAX_MAP_DRAW_SURFS ) { Error( "MAX_MAP_DRAW_SURFS (%d) exceeded", MAX_MAP_DRAW_SURFS ); } ds = &mapDrawSurfs[ numMapDrawSurfs ]; numMapDrawSurfs++; - + /* ydnar: do initial surface setup */ memset( ds, 0, sizeof( mapDrawSurface_t ) ); ds->type = type; ds->planeNum = -1; - ds->fogNum = defaultFogNum; /* ydnar 2003-02-12 */ - ds->outputNum = -1; /* ydnar 2002-08-13 */ - ds->surfaceNum = numMapDrawSurfs - 1; /* ydnar 2003-02-16 */ - + ds->fogNum = defaultFogNum; /* ydnar 2003-02-12 */ + ds->outputNum = -1; /* ydnar 2002-08-13 */ + ds->surfaceNum = numMapDrawSurfs - 1; /* ydnar 2003-02-16 */ + return ds; } @@ -78,29 +78,29 @@ mapDrawSurface_t *AllocDrawSurface( surfaceType_t type ){ */ void FinishSurface( mapDrawSurface_t *ds ){ - mapDrawSurface_t *ds2; - - + mapDrawSurface_t *ds2; + + /* dummy check */ if ( ds->type <= SURFACE_BAD || ds->type >= NUM_SURFACE_TYPES || ds == NULL || ds->shaderInfo == NULL ) { return; } - + /* ydnar: rocking tek-fu celshading */ if ( ds->celShader != NULL ) { MakeCelSurface( ds, ds->celShader ); } - + /* backsides stop here */ if ( ds->backSide ) { return; } - + /* ydnar: rocking surface cloning (fur baby yeah!) */ if ( ds->shaderInfo->cloneShader != NULL && ds->shaderInfo->cloneShader[ 0 ] != '\0' ) { CloneSurface( ds, ShaderInfoForShader( ds->shaderInfo->cloneShader ) ); } - + /* ydnar: q3map_backShader support */ if ( ds->shaderInfo->backShader != NULL && ds->shaderInfo->backShader[ 0 ] != '\0' ) { ds2 = CloneSurface( ds, ShaderInfoForShader( ds->shaderInfo->backShader ) ); @@ -116,42 +116,42 @@ void FinishSurface( mapDrawSurface_t *ds ){ */ mapDrawSurface_t *CloneSurface( mapDrawSurface_t *src, shaderInfo_t *si ){ - mapDrawSurface_t *ds; - - + mapDrawSurface_t *ds; + + /* dummy check */ if ( src == NULL || si == NULL ) { return NULL; } - + /* allocate a new surface */ ds = AllocDrawSurface( src->type ); if ( ds == NULL ) { return NULL; } - + /* copy it */ memcpy( ds, src, sizeof( *ds ) ); - + /* destroy side reference */ ds->sideRef = NULL; - + /* set shader */ ds->shaderInfo = si; - + /* copy verts */ if ( ds->numVerts > 0 ) { ds->verts = safe_malloc( ds->numVerts * sizeof( *ds->verts ) ); memcpy( ds->verts, src->verts, ds->numVerts * sizeof( *ds->verts ) ); } - + /* copy indexes */ if ( ds->numIndexes <= 0 ) { return ds; } ds->indexes = safe_malloc( ds->numIndexes * sizeof( *ds->indexes ) ); memcpy( ds->indexes, src->indexes, ds->numIndexes * sizeof( *ds->indexes ) ); - + /* return the surface */ return ds; } @@ -164,31 +164,31 @@ mapDrawSurface_t *CloneSurface( mapDrawSurface_t *src, shaderInfo_t *si ){ */ mapDrawSurface_t *MakeCelSurface( mapDrawSurface_t *src, shaderInfo_t *si ){ - mapDrawSurface_t *ds; - - + mapDrawSurface_t *ds; + + /* dummy check */ if ( src == NULL || si == NULL ) { return NULL; } - + /* don't create cel surfaces for certain types of shaders */ if ( ( src->shaderInfo->compileFlags & C_TRANSLUCENT ) || ( src->shaderInfo->compileFlags & C_SKY ) ) { return NULL; } - + /* make a copy */ ds = CloneSurface( src, si ); if ( ds == NULL ) { return NULL; } - + /* do some fixups for celshading */ ds->planar = qfalse; ds->planeNum = -1; ds->celShader = NULL; /* don't cel shade cels :P */ - + /* return the surface */ return ds; } @@ -201,37 +201,37 @@ mapDrawSurface_t *MakeCelSurface( mapDrawSurface_t *src, shaderInfo_t *si ){ */ mapDrawSurface_t *MakeSkyboxSurface( mapDrawSurface_t *src ){ - int i; - mapDrawSurface_t *ds; - - + int i; + mapDrawSurface_t *ds; + + /* dummy check */ if ( src == NULL ) { return NULL; } - + /* make a copy */ ds = CloneSurface( src, src->shaderInfo ); if ( ds == NULL ) { return NULL; } - + /* set parent */ ds->parent = src; - + /* scale the surface vertexes */ for ( i = 0; i < ds->numVerts; i++ ) { m4x4_transform_point( skyboxTransform, ds->verts[ i ].xyz ); - + /* debug code */ //% bspDrawVerts[ bspDrawSurfaces[ ds->outputNum ].firstVert + i ].color[ 0 ][ 1 ] = 0; //% bspDrawVerts[ bspDrawSurfaces[ ds->outputNum ].firstVert + i ].color[ 0 ][ 2 ] = 0; } - + /* so backface culling creep doesn't bork the surface */ VectorClear( ds->lightmapVecs[ 2 ] ); - + /* return the surface */ return ds; } @@ -243,24 +243,24 @@ mapDrawSurface_t *MakeSkyboxSurface( mapDrawSurface_t *src ){ returns qtrue if all three points are colinear, backwards, or the triangle is just plain bogus */ -#define TINY_AREA 1.0f +#define TINY_AREA 1.0f qboolean IsTriangleDegenerate( bspDrawVert_t *points, int a, int b, int c ){ - vec3_t v1, v2, v3; - float d; - - + vec3_t v1, v2, v3; + float d; + + /* calcuate the area of the triangle */ VectorSubtract( points[ b ].xyz, points[ a ].xyz, v1 ); VectorSubtract( points[ c ].xyz, points[ a ].xyz, v2 ); CrossProduct( v1, v2, v3 ); d = VectorLength( v3 ); - + /* assume all very small or backwards triangles will cause problems */ if ( d < TINY_AREA ) { return qtrue; } - + /* must be a good triangle */ return qfalse; } @@ -297,46 +297,46 @@ void ClearSurface( mapDrawSurface_t *ds ){ */ void TidyEntitySurfaces( entity_t *e ){ - int i, j, deleted; - mapDrawSurface_t *out, *in = NULL; - - + int i, j, deleted; + mapDrawSurface_t *out, *in = NULL; + + /* note it */ Sys_FPrintf( SYS_VRB, "--- TidyEntitySurfaces ---\n" ); - + /* walk the surface list */ deleted = 0; for ( i = e->firstDrawSurf, j = e->firstDrawSurf; j < numMapDrawSurfs; i++, j++ ) { /* get out surface */ out = &mapDrawSurfs[ i ]; - + /* walk the surface list again until a proper surface is found */ for ( ; j < numMapDrawSurfs; j++ ) { /* get in surface */ in = &mapDrawSurfs[ j ]; - + /* this surface ok? */ if ( in->type == SURFACE_FLARE || in->type == SURFACE_SHADER || ( in->type != SURFACE_BAD && in->numVerts > 0 ) ) { break; } - + /* nuke it */ ClearSurface( in ); deleted++; } - + /* copy if necessary */ if ( i != j ) { memcpy( out, in, sizeof( mapDrawSurface_t ) ); + } } - } - + /* set the new number of drawsurfs */ numMapDrawSurfs = i; - + /* emit some stats */ Sys_FPrintf( SYS_VRB, "%9d empty or malformed surfaces deleted\n", deleted ); } @@ -349,15 +349,15 @@ void TidyEntitySurfaces( entity_t *e ){ */ qboolean CalcSurfaceTextureRange( mapDrawSurface_t *ds ){ - int i, j, v, size[ 2 ]; - float mins[ 2 ], maxs[ 2 ]; - - + int i, j, v, size[ 2 ]; + float mins[ 2 ], maxs[ 2 ]; + + /* try to early out */ if ( ds->numVerts <= 0 ) { return qtrue; } - + /* walk the verts and determine min/max st values */ mins[ 0 ] = 999999; mins[ 1 ] = 999999; @@ -372,14 +372,14 @@ qboolean CalcSurfaceTextureRange( mapDrawSurface_t *ds ){ } if ( ds->verts[ i ].st[ j ] > maxs[ j ] ) { maxs[ j ] = ds->verts[ i ].st[ j ]; + } } } - } - + /* clamp to integer range and calculate surface bias values */ for ( j = 0; j < 2; j++ ) ds->bias[ j ] = -floor( 0.5f * ( mins[ j ] + maxs[ j ] ) ); - + /* find biased texture coordinate mins/maxs */ size[ 0 ] = ds->shaderInfo->shaderWidth; size[ 1 ] = ds->shaderInfo->shaderHeight; @@ -397,27 +397,27 @@ qboolean CalcSurfaceTextureRange( mapDrawSurface_t *ds ){ } if ( v > ds->texMaxs[ j ] ) { ds->texMaxs[ j ] = v; + } } } - } - + /* calc ranges */ for ( j = 0; j < 2; j++ ) ds->texRange[ j ] = ( ds->texMaxs[ j ] - ds->texMins[ j ] ); - + /* if range is zero, then assume unlimited precision */ if ( texRange == 0 ) { return qtrue; } - + /* within range? */ for ( j = 0; j < 2; j++ ) { if ( ds->texMins[ j ] < -texRange || ds->texMaxs[ j ] > texRange ) { return qfalse; + } } - } - + /* within range */ return qtrue; } @@ -430,20 +430,20 @@ qboolean CalcSurfaceTextureRange( mapDrawSurface_t *ds ){ */ qboolean CalcLightmapAxis( vec3_t normal, vec3_t axis ){ - vec3_t absolute; - - + vec3_t absolute; + + /* test */ if ( normal[ 0 ] == 0.0f && normal[ 1 ] == 0.0f && normal[ 2 ] == 0.0f ) { VectorClear( axis ); return qfalse; } - + /* get absolute normal */ absolute[ 0 ] = fabs( normal[ 0 ] ); absolute[ 1 ] = fabs( normal[ 1 ] ); absolute[ 2 ] = fabs( normal[ 2 ] ); - + /* test and set */ if ( absolute[ 2 ] > absolute[ 0 ] - 0.0001f && absolute[ 2 ] > absolute[ 1 ] - 0.0001f ) { if ( normal[ 2 ] > 0.0f ) { @@ -451,7 +451,7 @@ qboolean CalcLightmapAxis( vec3_t normal, vec3_t axis ){ } else{ VectorSet( axis, 0.0f, 0.0f, -1.0f ); - } + } } else if ( absolute[ 0 ] > absolute[ 1 ] - 0.0001f && absolute[ 0 ] > absolute[ 2 ] - 0.0001f ) { if ( normal[ 0 ] > 0.0f ) { @@ -459,7 +459,7 @@ qboolean CalcLightmapAxis( vec3_t normal, vec3_t axis ){ } else{ VectorSet( axis, -1.0f, 0.0f, 0.0f ); - } + } } else { @@ -468,9 +468,9 @@ qboolean CalcLightmapAxis( vec3_t normal, vec3_t axis ){ } else{ VectorSet( axis, 0.0f, -1.0f, 0.0f ); + } } - } - + /* return ok */ return qtrue; } @@ -482,24 +482,24 @@ qboolean CalcLightmapAxis( vec3_t normal, vec3_t axis ){ fills out a bunch of info in the surfaces, including planar status, lightmap projection, and bounding box */ -#define PLANAR_EPSILON 0.5f //% 0.126f 0.25f +#define PLANAR_EPSILON 0.5f //% 0.126f 0.25f void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){ - int i, bestAxis; - float dist; - vec4_t plane; - shaderInfo_t *si; - static vec3_t axii[ 6 ] = - { - { 0, 0, -1 }, - { 0, 0, 1 }, - { -1, 0, 0 }, - { 1, 0, 0 }, - { 0, -1, 0 }, - { 0, 1, 0 } - }; - - + int i, bestAxis; + float dist; + vec4_t plane; + shaderInfo_t *si; + static vec3_t axii[ 6 ] = + { + { 0, 0, -1 }, + { 0, 0, 1 }, + { -1, 0, 0 }, + { 1, 0, 0 }, + { 0, -1, 0 }, + { 0, 1, 0 } + }; + + /* walk the list of surfaces */ for ( ; numSurfs > 0; numSurfs--, ds++ ) { @@ -507,42 +507,42 @@ void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){ if ( ds->type == SURFACE_BAD || ds->numVerts <= 0 ) { continue; } - + /* get shader */ si = ds->shaderInfo; - + /* ----------------------------------------------------------------- force meta if vertex count is too high or shader requires it ----------------------------------------------------------------- */ - + if ( ds->type != SURFACE_PATCH && ds->type != SURFACE_FACE ) { if ( ds->numVerts > SHADER_MAX_VERTEXES ) { ds->type = SURFACE_FORCED_META; + } } - } - + /* ----------------------------------------------------------------- - plane and bounding box classification + plane and bounding box classification ----------------------------------------------------------------- */ - + /* set surface bounding box */ ClearBounds( ds->mins, ds->maxs ); for ( i = 0; i < ds->numVerts; i++ ) AddPointToBounds( ds->verts[ i ].xyz, ds->mins, ds->maxs ); - + /* try to get an existing plane */ if ( ds->planeNum >= 0 ) { VectorCopy( mapplanes[ ds->planeNum ].normal, plane ); plane[ 3 ] = mapplanes[ ds->planeNum ].dist; } - + /* construct one from the first vert with a valid normal */ else { VectorClear( plane ); plane[ 3 ] = 0.0f; for ( i = 0; i < ds->numVerts; i++ ) - { + { if ( ds->verts[ i ].normal[ 0 ] != 0.0f && ds->verts[ i ].normal[ 1 ] != 0.0f && ds->verts[ i ].normal[ 2 ] != 0.0f ) { VectorCopy( ds->verts[ i ].normal, plane ); plane[ 3 ] = DotProduct( ds->verts[ i ].xyz, plane ); @@ -550,7 +550,7 @@ void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){ } } } - + /* test for bogus plane */ if ( VectorLength( plane ) <= 0.0f ) { ds->planar = qfalse; @@ -560,7 +560,7 @@ void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){ { /* determine if surface is planar */ ds->planar = qtrue; - + /* test each vert */ for ( i = 0; i < ds->numVerts; i++ ) { @@ -577,7 +577,7 @@ void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){ } } } - + /* find map plane if necessary */ if ( ds->planar ) { if ( ds->planeNum < 0 ) { @@ -592,11 +592,11 @@ void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){ //% if( ds->type == SURF_META || ds->type == SURF_FACE ) //% Sys_Printf( "WARNING: Non-planar face (%d): %s\n", ds->planeNum, ds->shaderInfo->shader ); } - + /* ----------------------------------------------------------------- lightmap bounds and axis projection ----------------------------------------------------------------- */ - + /* vertex lit surfaces don't need this information */ if ( si->compileFlags & C_VERTEXLIT || ds->type == SURFACE_TRIANGLES ) { VectorClear( ds->lightmapAxis ); @@ -604,7 +604,7 @@ void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){ ds->sampleSize = 0; continue; } - + /* the shader can specify an explicit lightmap axis */ if ( si->lightmapAxis[ 0 ] || si->lightmapAxis[ 1 ] || si->lightmapAxis[ 2 ] ) { VectorCopy( si->lightmapAxis, ds->lightmapAxis ); @@ -623,30 +623,30 @@ void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){ for ( i = 0; i < ds->numVerts && bestAxis < 6; i++ ) { //% Sys_Printf( "Comparing %1.3f %1.3f %1.3f to %1.3f %1.3f %1.3f\n", - //% ds->verts[ i ].normal[ 0 ], ds->verts[ i ].normal[ 1 ], ds->verts[ i ].normal[ 2 ], - //% axii[ bestAxis ][ 0 ], axii[ bestAxis ][ 1 ], axii[ bestAxis ][ 2 ] ); + //% ds->verts[ i ].normal[ 0 ], ds->verts[ i ].normal[ 1 ], ds->verts[ i ].normal[ 2 ], + //% axii[ bestAxis ][ 0 ], axii[ bestAxis ][ 1 ], axii[ bestAxis ][ 2 ] ); if ( DotProduct( ds->verts[ i ].normal, axii[ bestAxis ] ) < 0.25f ) { /* fixme: adjust this tolerance to taste */ break; + } } - } - + if ( i == ds->numVerts ) { break; + } } - } - + /* set axis if possible */ if ( bestAxis < 6 ) { //% if( ds->type == SURFACE_PATCH ) - //% Sys_Printf( "Mapped axis %d onto patch\n", bestAxis ); + //% Sys_Printf( "Mapped axis %d onto patch\n", bestAxis ); VectorCopy( axii[ bestAxis ], ds->lightmapAxis ); } - + /* debug code */ //% if( ds->type == SURFACE_PATCH ) - //% Sys_Printf( "Failed to map axis %d onto patch\n", bestAxis ); + //% Sys_Printf( "Failed to map axis %d onto patch\n", bestAxis ); } - + /* calculate lightmap sample size */ if ( ds->shaderInfo->lightmapSampleSize > 0 ) { /* shader value overrides every other */ ds->sampleSize = ds->shaderInfo->lightmapSampleSize; @@ -670,7 +670,7 @@ void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){ if ( ds->sampleSize > 16384 ) { /* powers of 2 are preferred */ ds->sampleSize = 16384; - } + } } } @@ -682,19 +682,19 @@ void ClassifySurfaces( int numSurfs, mapDrawSurface_t *ds ){ */ void ClassifyEntitySurfaces( entity_t *e ){ - int i; - - + int i; + + /* note it */ Sys_FPrintf( SYS_VRB, "--- ClassifyEntitySurfaces ---\n" ); - + /* walk the surface list */ for ( i = e->firstDrawSurf; i < numMapDrawSurfs; i++ ) { FinishSurface( &mapDrawSurfs[ i ] ); ClassifySurfaces( 1, &mapDrawSurfs[ i ] ); } - + /* tidy things up */ TidyEntitySurfaces( e ); } @@ -707,75 +707,75 @@ void ClassifyEntitySurfaces( entity_t *e ){ */ byte GetShaderIndexForPoint( indexMap_t *im, vec3_t eMins, vec3_t eMaxs, vec3_t point ){ - int i, x, y; - float s, t; - vec3_t mins, maxs, size; - - + int i, x, y; + float s, t; + vec3_t mins, maxs, size; + + /* early out if no indexmap */ if ( im == NULL ) { return 0; } - + /* this code is really broken */ #if 0 - /* legacy precision fudges for terrain */ + /* legacy precision fudges for terrain */ for ( i = 0; i < 3; i++ ) - { - mins[ i ] = floor( eMins[ i ] + 0.1 ); - maxs[ i ] = floor( eMaxs[ i ] + 0.1 ); - size[ i ] = maxs[ i ] - mins[ i ]; - } - - /* find st (fixme: support more than just z-axis projection) */ - s = floor( point[ 0 ] + 0.1f - mins[ 0 ] ) / size[ 0 ]; - t = floor( maxs[ 1 ] - point[ 1 ] + 0.1f ) / size[ 1 ]; + { + mins[ i ] = floor( eMins[ i ] + 0.1 ); + maxs[ i ] = floor( eMaxs[ i ] + 0.1 ); + size[ i ] = maxs[ i ] - mins[ i ]; + } + + /* find st (fixme: support more than just z-axis projection) */ + s = floor( point[ 0 ] + 0.1f - mins[ 0 ] ) / size[ 0 ]; + t = floor( maxs[ 1 ] - point[ 1 ] + 0.1f ) / size[ 1 ]; if ( s < 0.0f ) { - s = 0.0f; + s = 0.0f; } else if ( s > 1.0f ) { - s = 1.0f; + s = 1.0f; } if ( t < 0.0f ) { - t = 0.0f; + t = 0.0f; } else if ( t > 1.0f ) { - t = 1.0f; + t = 1.0f; } - - /* make xy */ + + /* make xy */ x = ( im->w - 1 ) * s; y = ( im->h - 1 ) * t; #else - /* get size */ + /* get size */ for ( i = 0; i < 3; i++ ) - { - mins[ i ] = eMins[ i ]; - maxs[ i ] = eMaxs[ i ]; - size[ i ] = maxs[ i ] - mins[ i ]; - } - - /* calc st */ + { + mins[ i ] = eMins[ i ]; + maxs[ i ] = eMaxs[ i ]; + size[ i ] = maxs[ i ] - mins[ i ]; + } + + /* calc st */ s = ( point[ 0 ] - mins[ 0 ] ) / size[ 0 ]; t = ( maxs[ 1 ] - point[ 1 ] ) / size[ 1 ]; - - /* calc xy */ - x = s * im->w; - y = t * im->h; + + /* calc xy */ + x = s * im->w; + y = t * im->h; if ( x < 0 ) { - x = 0; + x = 0; } else if ( x > ( im->w - 1 ) ) { x = ( im->w - 1 ); } if ( y < 0 ) { - y = 0; + y = 0; } else if ( y > ( im->h - 1 ) ) { y = ( im->h - 1 ); } #endif - + /* return index */ return im->pixels[ y * im->w + x ]; } @@ -789,17 +789,17 @@ byte GetShaderIndexForPoint( indexMap_t *im, vec3_t eMins, vec3_t eMaxs, vec3_t */ shaderInfo_t *GetIndexedShader( shaderInfo_t *parent, indexMap_t *im, int numPoints, byte *shaderIndexes ){ - int i; - byte minShaderIndex, maxShaderIndex; - char shader[ MAX_QPATH ]; - shaderInfo_t *si; - - + int i; + byte minShaderIndex, maxShaderIndex; + char shader[ MAX_QPATH ]; + shaderInfo_t *si; + + /* early out if bad data */ if ( im == NULL || numPoints <= 0 || shaderIndexes == NULL ) { return ShaderInfoForShader( "default" ); } - + /* determine min/max index */ minShaderIndex = 255; maxShaderIndex = 0; @@ -810,9 +810,9 @@ shaderInfo_t *GetIndexedShader( shaderInfo_t *parent, indexMap_t *im, int numPoi } if ( shaderIndexes[ i ] > maxShaderIndex ) { maxShaderIndex = shaderIndexes[ i ]; + } } - } - + /* set alpha inline */ for ( i = 0; i < numPoints; i++ ) { @@ -822,9 +822,9 @@ shaderInfo_t *GetIndexedShader( shaderInfo_t *parent, indexMap_t *im, int numPoi } else{ shaderIndexes[ i ] = 255; + } } - } - + /* make a shader name */ if ( minShaderIndex == maxShaderIndex ) { sprintf( shader, "textures/%s_%d", im->shader, maxShaderIndex ); @@ -832,10 +832,10 @@ shaderInfo_t *GetIndexedShader( shaderInfo_t *parent, indexMap_t *im, int numPoi else{ sprintf( shader, "textures/%s_%dto%d", im->shader, minShaderIndex, maxShaderIndex ); } - + /* get the shader */ si = ShaderInfoForShader( shader ); - + /* inherit a few things from parent shader */ if ( parent->globalTexture ) { si->globalTexture = qtrue; @@ -859,7 +859,7 @@ shaderInfo_t *GetIndexedShader( shaderInfo_t *parent, indexMap_t *im, int numPoi /* set lightmap projection axis */ VectorCopy( parent->lightmapAxis, si->lightmapAxis ); } - + /* return the shader */ return si; } @@ -872,41 +872,41 @@ shaderInfo_t *GetIndexedShader( shaderInfo_t *parent, indexMap_t *im, int numPoi creates a SURF_FACE drawsurface from a given brush side and winding */ -#define SNAP_FLOAT_TO_INT 8 +#define SNAP_FLOAT_TO_INT 8 #define SNAP_INT_TO_FLOAT ( 1.0 / SNAP_FLOAT_TO_INT ) mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, winding_t *w ){ - int i, j, k; - mapDrawSurface_t *ds; - shaderInfo_t *si, *parent; - bspDrawVert_t *dv; - vec3_t texX, texY; - vec_t x, y; - vec3_t vTranslated; - qboolean indexed; - byte shaderIndexes[ 256 ]; - float offsets[ 256 ]; - char tempShader[ MAX_QPATH ]; - - + int i, j, k; + mapDrawSurface_t *ds; + shaderInfo_t *si, *parent; + bspDrawVert_t *dv; + vec3_t texX, texY; + vec_t x, y; + vec3_t vTranslated; + qboolean indexed; + byte shaderIndexes[ 256 ]; + float offsets[ 256 ]; + char tempShader[ MAX_QPATH ]; + + /* ydnar: don't make a drawsurf for culled sides */ if ( s->culled ) { return NULL; } - + /* range check */ if ( w->numpoints > MAX_POINTS_ON_WINDING ) { Error( "DrawSurfaceForSide: w->numpoints = %d (> %d)", w->numpoints, MAX_POINTS_ON_WINDING ); } - + /* get shader */ si = s->shaderInfo; - + /* ydnar: gs mods: check for indexed shader */ if ( si->indexed && b->im != NULL ) { /* indexed */ indexed = qtrue; - + /* get shader indexes for each point */ for ( i = 0; i < w->numpoints; i++ ) { @@ -914,7 +914,7 @@ mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, windin offsets[ i ] = b->im->offsets[ shaderIndexes[ i ] ]; //% Sys_Printf( "%f ", offsets[ i ] ); } - + /* get matching shader and set alpha */ parent = si; si = GetIndexedShader( parent, b->im, w->numpoints, shaderIndexes ); @@ -922,7 +922,7 @@ mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, windin else{ indexed = qfalse; } - + /* ydnar: sky hack/fix for GL_CLAMP borders on ati cards */ if ( skyFixHack && si->skyParmsImageBase[ 0 ] != '\0' ) { //% Sys_FPrintf( SYS_VRB, "Enabling sky hack for shader %s using env %s\n", si->shader, si->skyParmsImageBase ); @@ -939,17 +939,17 @@ mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, windin sprintf( tempShader, "%s_dn", si->skyParmsImageBase ); DrawSurfaceForShader( tempShader ); } - + /* ydnar: gs mods */ ds = AllocDrawSurface( SURFACE_FACE ); ds->entityNum = b->entityNum; ds->castShadows = b->castShadows; ds->recvShadows = b->recvShadows; - + ds->planar = qtrue; ds->planeNum = s->planenum; VectorCopy( mapplanes[ s->planenum ].normal, ds->lightmapVecs[ 2 ] ); - + ds->shaderInfo = si; ds->mapBrush = b; ds->sideRef = AllocSideRef( s, NULL ); @@ -960,39 +960,39 @@ mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, windin ds->numVerts = w->numpoints; ds->verts = safe_malloc( ds->numVerts * sizeof( *ds->verts ) ); memset( ds->verts, 0, ds->numVerts * sizeof( *ds->verts ) ); - + /* compute s/t coordinates from brush primitive texture matrix (compute axis base) */ ComputeAxisBase( mapplanes[ s->planenum ].normal, texX, texY ); - + /* create the vertexes */ for ( j = 0; j < w->numpoints; j++ ) { /* get the drawvert */ dv = ds->verts + j; - + /* copy xyz and do potential z offset */ VectorCopy( w->p[ j ], dv->xyz ); if ( indexed ) { dv->xyz[ 2 ] += offsets[ j ]; } - + /* round the xyz to a given precision and translate by origin */ for ( i = 0 ; i < 3 ; i++ ) dv->xyz[ i ] = SNAP_INT_TO_FLOAT * floor( dv->xyz[ i ] * SNAP_FLOAT_TO_INT + 0.5f ); VectorAdd( dv->xyz, e->origin, vTranslated ); - + /* ydnar: tek-fu celshading support for flat shaded shit */ if ( flat ) { dv->st[ 0 ] = si->stFlat[ 0 ]; dv->st[ 1 ] = si->stFlat[ 1 ]; } - + /* ydnar: gs mods: added support for explicit shader texcoord generation */ else if ( si->tcGen ) { dv->st[ 0 ] = DotProduct( si->vecs[ 0 ], vTranslated ); dv->st[ 1 ] = DotProduct( si->vecs[ 1 ], vTranslated ); } - + /* old quake-style texturing */ else if ( g_bBrushPrimit == BPRIMIT_OLDBRUSHES ) { /* nearest-axial projection */ @@ -1001,7 +1001,7 @@ mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, windin dv->st[ 0 ] /= si->shaderWidth; dv->st[ 1 ] /= si->shaderHeight; } - + /* brush primitive texturing */ else { @@ -1011,22 +1011,22 @@ mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, windin dv->st[ 0 ] = s->texMat[ 0 ][ 0 ] * x + s->texMat[ 0 ][ 1 ] * y + s->texMat[ 0 ][ 2 ]; dv->st[ 1 ] = s->texMat[ 1 ][ 0 ] * x + s->texMat[ 1 ][ 1 ] * y + s->texMat[ 1 ][ 2 ]; } - + /* copy normal */ VectorCopy( mapplanes[ s->planenum ].normal, dv->normal ); - + /* ydnar: set color */ for ( k = 0; k < MAX_LIGHTMAPS; k++ ) { dv->color[ k ][ 0 ] = 255; dv->color[ k ][ 1 ] = 255; dv->color[ k ][ 2 ] = 255; - + /* ydnar: gs mods: handle indexed shader blending */ dv->color[ k ][ 3 ] = ( indexed ? shaderIndexes[ j ] : 255 ); } } - + /* set cel shader */ ds->celShader = b->celShader; @@ -1034,7 +1034,7 @@ mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, windin if ( b->shadeAngleDegrees > 0.0f ) { ds->shadeAngleDegrees = b->shadeAngleDegrees; } - + /* ydnar: gs mods: moved st biasing elsewhere */ return ds; } @@ -1049,9 +1049,9 @@ mapDrawSurface_t *DrawSurfaceForSide( entity_t *e, brush_t *b, side_t *s, windin #define YDNAR_NORMAL_EPSILON 0.50f qboolean VectorCompareExt( vec3_t n1, vec3_t n2, float epsilon ){ - int i; - - + int i; + + /* test */ for ( i = 0; i < 3; i++ ) if ( fabs( n1[ i ] - n2[ i ] ) > epsilon ) { @@ -1061,20 +1061,20 @@ qboolean VectorCompareExt( vec3_t n1, vec3_t n2, float epsilon ){ } mapDrawSurface_t *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh ){ - int i, k, numVerts; - vec4_t plane; - qboolean planar; - float dist; - mapDrawSurface_t *ds; - shaderInfo_t *si, *parent; - bspDrawVert_t *dv; - vec3_t vTranslated; - mesh_t *copy; - qboolean indexed; - byte shaderIndexes[ MAX_EXPANDED_AXIS * MAX_EXPANDED_AXIS ]; - float offsets[ MAX_EXPANDED_AXIS * MAX_EXPANDED_AXIS ]; - - + int i, k, numVerts; + vec4_t plane; + qboolean planar; + float dist; + mapDrawSurface_t *ds; + shaderInfo_t *si, *parent; + bspDrawVert_t *dv; + vec3_t vTranslated; + mesh_t *copy; + qboolean indexed; + byte shaderIndexes[ MAX_EXPANDED_AXIS * MAX_EXPANDED_AXIS ]; + float offsets[ MAX_EXPANDED_AXIS * MAX_EXPANDED_AXIS ]; + + /* get mesh and shader shader */ if ( mesh == NULL ) { mesh = &p->mesh; @@ -1083,22 +1083,22 @@ mapDrawSurface_t *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh if ( mesh == NULL || si == NULL ) { return NULL; } - + /* get vertex count */ numVerts = mesh->width * mesh->height; - + /* to make valid normals for patches with degenerate edges, we need to make a copy of the mesh and put the aproximating points onto the curve */ - + /* create a copy of the mesh */ copy = CopyMesh( mesh ); - + /* store off the original (potentially bad) normals */ MakeMeshNormals( *copy ); for ( i = 0; i < numVerts; i++ ) VectorCopy( copy->verts[ i ].normal, mesh->verts[ i ].normal ); - + /* put the mesh on the curve */ PutMeshOnCurve( *copy ); @@ -1109,12 +1109,12 @@ mapDrawSurface_t *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh /* ydnar: only copy normals that are significantly different from the originals */ if ( DotProduct( copy->verts[ i ].normal, mesh->verts[ i ].normal ) < 0.75f ) { VectorCopy( copy->verts[ i ].normal, mesh->verts[ i ].normal ); + } } - } - + /* free the old mesh */ FreeMesh( copy ); - + /* ydnar: gs mods: check for indexed shader */ if ( si->indexed && p->im != NULL ) { /* indexed */ @@ -1126,7 +1126,7 @@ mapDrawSurface_t *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh shaderIndexes[ i ] = GetShaderIndexForPoint( p->im, p->eMins, p->eMaxs, mesh->verts[ i ].xyz ); offsets[ i ] = p->im->offsets[ shaderIndexes[ i ] ]; } - + /* get matching shader and set alpha */ parent = si; si = GetIndexedShader( parent, p->im, numVerts, shaderIndexes ); @@ -1134,41 +1134,41 @@ mapDrawSurface_t *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh else{ indexed = qfalse; } - - + + /* ydnar: gs mods */ ds = AllocDrawSurface( SURFACE_PATCH ); ds->entityNum = p->entityNum; ds->castShadows = p->castShadows; ds->recvShadows = p->recvShadows; - + ds->shaderInfo = si; ds->mapMesh = p; ds->sampleSize = p->lightmapSampleSize; - ds->lightmapScale = p->lightmapScale; /* ydnar */ + ds->lightmapScale = p->lightmapScale; /* ydnar */ ds->colormod = p->colormod; ds->patchWidth = mesh->width; ds->patchHeight = mesh->height; ds->numVerts = ds->patchWidth * ds->patchHeight; ds->verts = safe_malloc( ds->numVerts * sizeof( *ds->verts ) ); memcpy( ds->verts, mesh->verts, ds->numVerts * sizeof( *ds->verts ) ); - + ds->fogNum = -1; ds->planeNum = -1; - + ds->longestCurve = p->longestCurve; ds->maxIterations = p->maxIterations; - + /* construct a plane from the first vert */ VectorCopy( mesh->verts[ 0 ].normal, plane ); plane[ 3 ] = DotProduct( mesh->verts[ 0 ].xyz, plane ); planar = qtrue; - + /* spew forth errors */ if ( VectorLength( plane ) < 0.001f ) { Sys_Printf( "BOGUS " ); } - + /* test each vert */ for ( i = 1; i < ds->numVerts && planar; i++ ) { @@ -1176,37 +1176,37 @@ mapDrawSurface_t *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh if ( VectorCompare( plane, mesh->verts[ i ].normal ) == qfalse ) { planar = qfalse; } - + /* point-plane test */ dist = DotProduct( mesh->verts[ i ].xyz, plane ) - plane[ 3 ]; if ( fabs( dist ) > EQUAL_EPSILON ) { planar = qfalse; + } } - } - + /* add a map plane */ if ( planar ) { /* make a map plane */ ds->planeNum = FindFloatPlane( plane, plane[ 3 ], 1, &mesh->verts[ 0 ].xyz ); VectorCopy( plane, ds->lightmapVecs[ 2 ] ); - + /* push this normal to all verts (ydnar 2003-02-14: bad idea, small patches get screwed up) */ for ( i = 0; i < ds->numVerts; i++ ) VectorCopy( plane, ds->verts[ i ].normal ); } - + /* walk the verts to do special stuff */ for ( i = 0; i < ds->numVerts; i++ ) { /* get the drawvert */ dv = &ds->verts[ i ]; - + /* ydnar: tek-fu celshading support for flat shaded shit */ if ( flat ) { dv->st[ 0 ] = si->stFlat[ 0 ]; dv->st[ 1 ] = si->stFlat[ 1 ]; } - + /* ydnar: gs mods: added support for explicit shader texcoord generation */ else if ( si->tcGen ) { /* translate by origin and project the texture */ @@ -1214,27 +1214,27 @@ mapDrawSurface_t *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh dv->st[ 0 ] = DotProduct( si->vecs[ 0 ], vTranslated ); dv->st[ 1 ] = DotProduct( si->vecs[ 1 ], vTranslated ); } - + /* ydnar: set color */ for ( k = 0; k < MAX_LIGHTMAPS; k++ ) { dv->color[ k ][ 0 ] = 255; dv->color[ k ][ 1 ] = 255; dv->color[ k ][ 2 ] = 255; - + /* ydnar: gs mods: handle indexed shader blending */ dv->color[ k ][ 3 ] = ( indexed ? shaderIndexes[ i ] : 255 ); } - + /* ydnar: offset */ if ( indexed ) { dv->xyz[ 2 ] += offsets[ i ]; + } } - } - + /* set cel shader */ ds->celShader = p->celShader; - + /* return the drawsurface */ return ds; } @@ -1247,18 +1247,18 @@ mapDrawSurface_t *DrawSurfaceForMesh( entity_t *e, parseMesh_t *p, mesh_t *mesh */ mapDrawSurface_t *DrawSurfaceForFlare( int entNum, vec3_t origin, vec3_t normal, vec3_t color, const char *flareShader, int lightStyle ){ - mapDrawSurface_t *ds; - - + mapDrawSurface_t *ds; + + /* emit flares? */ if ( emitFlares == qfalse ) { return NULL; } - + /* allocate drawsurface */ ds = AllocDrawSurface( SURFACE_FLARE ); ds->entityNum = entNum; - + /* set it up */ if ( flareShader != NULL && flareShader[ 0 ] != '\0' ) { ds->shaderInfo = ShaderInfoForShader( flareShader ); @@ -1275,15 +1275,15 @@ mapDrawSurface_t *DrawSurfaceForFlare( int entNum, vec3_t origin, vec3_t normal, if ( color != NULL ) { VectorCopy( color, ds->lightmapVecs[ 0 ] ); } - + /* store light style */ ds->lightStyle = lightStyle; if ( ds->lightStyle < 0 || ds->lightStyle >= LS_NONE ) { ds->lightStyle = LS_NORMAL; } - + /* fixme: fog */ - + /* return to sender */ return ds; } @@ -1296,11 +1296,11 @@ mapDrawSurface_t *DrawSurfaceForFlare( int entNum, vec3_t origin, vec3_t normal, */ mapDrawSurface_t *DrawSurfaceForShader( char *shader ){ - int i; - shaderInfo_t *si; - mapDrawSurface_t *ds; - - + int i; + shaderInfo_t *si; + mapDrawSurface_t *ds; + + /* get shader */ si = ShaderInfoForShader( shader ); @@ -1309,18 +1309,18 @@ mapDrawSurface_t *DrawSurfaceForShader( char *shader ){ { /* get surface */ ds = &mapDrawSurfs[ i ]; - + /* check it */ if ( ds->shaderInfo == si ) { return ds; + } } - } - + /* create a new surface */ ds = AllocDrawSurface( SURFACE_SHADER ); ds->entityNum = 0; ds->shaderInfo = ShaderInfoForShader( shader ); - + /* return to sender */ return ds; } @@ -1333,10 +1333,10 @@ mapDrawSurface_t *DrawSurfaceForShader( char *shader ){ */ static void AddSurfaceFlare( mapDrawSurface_t *ds, vec3_t entityOrigin ){ - vec3_t origin; - int i; - - + vec3_t origin; + int i; + + /* find centroid */ VectorClear( origin ); for ( i = 0; i < ds->numVerts; i++ ) @@ -1345,10 +1345,10 @@ static void AddSurfaceFlare( mapDrawSurface_t *ds, vec3_t entityOrigin ){ if ( entityOrigin != NULL ) { VectorAdd( origin, entityOrigin, origin ); } - + /* push origin off surface a bit */ VectorMA( origin, 2.0f, ds->lightmapVecs[ 2 ], origin ); - + /* create the drawsurface */ DrawSurfaceForFlare( ds->entityNum, origin, ds->lightmapVecs[ 2 ], ds->shaderInfo->color, ds->shaderInfo->flareShader, ds->shaderInfo->lightStyle ); } @@ -1361,15 +1361,15 @@ static void AddSurfaceFlare( mapDrawSurface_t *ds, vec3_t entityOrigin ){ */ static void SubdivideFace_r( entity_t *e, brush_t *brush, side_t *side, winding_t *w, int fogNum, float subdivisions ){ - int i; - int axis; - vec3_t bounds[ 2 ]; - const float epsilon = 0.1; - int subFloor, subCeil; - winding_t *frontWinding, *backWinding; - mapDrawSurface_t *ds; - - + int i; + int axis; + vec3_t bounds[ 2 ]; + const float epsilon = 0.1; + int subFloor, subCeil; + winding_t *frontWinding, *backWinding; + mapDrawSurface_t *ds; + + /* dummy check */ if ( w == NULL ) { return; @@ -1377,20 +1377,20 @@ static void SubdivideFace_r( entity_t *e, brush_t *brush, side_t *side, winding_ if ( w->numpoints < 3 ) { Error( "SubdivideFace_r: Bad w->numpoints (%d < 3)", w->numpoints ); } - + /* determine surface bounds */ ClearBounds( bounds[ 0 ], bounds[ 1 ] ); for ( i = 0; i < w->numpoints; i++ ) AddPointToBounds( w->p[ i ], bounds[ 0 ], bounds[ 1 ] ); - + /* split the face */ for ( axis = 0; axis < 3; axis++ ) { - vec3_t planePoint = { 0, 0, 0 }; - vec3_t planeNormal = { 0, 0, 0 }; - float d; - - + vec3_t planePoint = { 0, 0, 0 }; + vec3_t planeNormal = { 0, 0, 0 }; + float d; + + /* create an axial clipping plane */ subFloor = floor( bounds[ 0 ][ axis ] / subdivisions ) * subdivisions; subCeil = ceil( bounds[ 1 ][ axis ] / subdivisions ) * subdivisions; @@ -1418,10 +1418,10 @@ static void SubdivideFace_r( entity_t *e, brush_t *brush, side_t *side, winding_ } } } - + /* create a face surface */ ds = DrawSurfaceForSide( e, brush, side, w ); - + /* set correct fog num */ ds->fogNum = fogNum; } @@ -1435,18 +1435,18 @@ static void SubdivideFace_r( entity_t *e, brush_t *brush, side_t *side, winding_ */ void SubdivideFaceSurfaces( entity_t *e, tree_t *tree ){ - int i, j, numBaseDrawSurfs, fogNum; - mapDrawSurface_t *ds; - brush_t *brush; - side_t *side; - shaderInfo_t *si; - winding_t *w; - float range, size, subdivisions, s2; - - + int i, j, numBaseDrawSurfs, fogNum; + mapDrawSurface_t *ds; + brush_t *brush; + side_t *side; + shaderInfo_t *si; + winding_t *w; + float range, size, subdivisions, s2; + + /* note it */ Sys_FPrintf( SYS_VRB, "--- SubdivideFaceSurfaces ---\n" ); - + /* walk the list of surfaces */ numBaseDrawSurfs = numMapDrawSurfs; for ( i = e->firstDrawSurf; i < numBaseDrawSurfs; i++ ) @@ -1458,22 +1458,22 @@ void SubdivideFaceSurfaces( entity_t *e, tree_t *tree ){ if ( ds->type != SURFACE_FACE || ds->mapBrush == NULL || ds->sideRef == NULL || ds->sideRef->side == NULL ) { continue; } - + /* get bits */ brush = ds->mapBrush; side = ds->sideRef->side; - + /* check subdivision for shader */ si = side->shaderInfo; if ( si == NULL ) { continue; } - + /* ydnar: don't subdivide sky surfaces */ if ( si->compileFlags & C_SKY ) { continue; } - + /* do texture coordinate range check */ ClassifySurfaces( 1, ds ); if ( CalcSurfaceTextureRange( ds ) == qfalse ) { @@ -1498,7 +1498,7 @@ void SubdivideFaceSurfaces( entity_t *e, tree_t *tree ){ else{ subdivisions = si->subdivisions; } - + /* get subdivisions from shader */ if ( si->subdivisions > 0 && si->subdivisions < subdivisions ) { subdivisions = si->subdivisions; @@ -1506,14 +1506,14 @@ void SubdivideFaceSurfaces( entity_t *e, tree_t *tree ){ if ( subdivisions < 1.0f ) { continue; } - + /* preserve fog num */ fogNum = ds->fogNum; - + /* make a winding and free the surface */ w = WindingFromDrawSurf( ds ); ClearSurface( ds ); - + /* subdivide it */ SubdivideFace_r( e, brush, side, w, fogNum, subdivisions ); } @@ -1530,8 +1530,8 @@ void SubdivideFaceSurfaces( entity_t *e, tree_t *tree ){ */ void ClipSideIntoTree_r( winding_t *w, side_t *side, node_t *node ){ - plane_t *plane; - winding_t *front, *back; + plane_t *plane; + winding_t *front, *back; if ( !w ) { return; @@ -1588,9 +1588,9 @@ static int g_numHiddenFaces, g_numCoinFaces; #define CULL_EPSILON 0.1f qboolean CullVectorCompare( const vec3_t v1, const vec3_t v2 ){ - int i; - - + int i; + + for ( i = 0; i < 3; i++ ) if ( fabs( v1[ i ] - v2[ i ] ) > CULL_EPSILON ) { return qfalse; @@ -1606,10 +1606,10 @@ qboolean CullVectorCompare( const vec3_t v1, const vec3_t v2 ){ */ qboolean SideInBrush( side_t *side, brush_t *b ){ - int i, s; - plane_t *plane; - - + int i, s; + plane_t *plane; + + /* ignore sides w/o windings or shaders */ if ( side->winding == NULL || side->shaderInfo == NULL ) { return qtrue; @@ -1633,16 +1633,16 @@ qboolean SideInBrush( side_t *side, brush_t *b ){ s = WindingOnPlaneSide( side->winding, plane->normal, plane->dist ); if ( s == SIDE_FRONT || s == SIDE_CROSS ) { return qfalse; + } } - } - + /* don't cull autosprite or polygonoffset surfaces */ if ( side->shaderInfo ) { if ( side->shaderInfo->autosprite || side->shaderInfo->polygonOffset ) { return qfalse; + } } - } - + /* inside */ side->culled = qtrue; g_numHiddenFaces++; @@ -1656,19 +1656,19 @@ qboolean SideInBrush( side_t *side, brush_t *b ){ */ void CullSides( entity_t *e ){ - int numPoints; - int i, j, k, l, first, second, dir; - winding_t *w1, *w2; - brush_t *b1, *b2; - side_t *side1, *side2; - - + int numPoints; + int i, j, k, l, first, second, dir; + winding_t *w1, *w2; + brush_t *b1, *b2; + side_t *side1, *side2; + + /* note it */ Sys_FPrintf( SYS_VRB, "--- CullSides ---\n" ); - + g_numHiddenFaces = 0; g_numCoinFaces = 0; - + /* brush interator 1 */ for ( b1 = e->brushes; b1; b1 = b1->next ) { @@ -1684,12 +1684,12 @@ void CullSides( entity_t *e ){ if ( b2->numsides < 1 ) { continue; } - + /* original check */ if ( b1->original == b2->original && b1->original != NULL ) { continue; } - + /* bbox check */ j = 0; for ( i = 0; i < 3; i++ ) @@ -1705,7 +1705,7 @@ void CullSides( entity_t *e ){ SideInBrush( &b1->sides[ i ], b2 ); for ( i = 0; i < b2->numsides; i++ ) SideInBrush( &b2->sides[ i ], b1 ); - + /* side iterator 1 */ for ( i = 0; i < b1->numsides; i++ ) { @@ -1719,7 +1719,7 @@ void CullSides( entity_t *e ){ if ( side1->shaderInfo == NULL ) { continue; } - + /* side iterator 2 */ for ( j = 0; j < b2->numsides; j++ ) { @@ -1738,12 +1738,12 @@ void CullSides( entity_t *e ){ if ( side1->culled == qtrue && side2->culled == qtrue ) { continue; } - + /* compare planes */ if ( ( side1->planenum & ~0x00000001 ) != ( side2->planenum & ~0x00000001 ) ) { continue; } - + /* get autosprite and polygonoffset status */ if ( side1->shaderInfo && ( side1->shaderInfo->autosprite || side1->shaderInfo->polygonOffset ) ) { @@ -1753,11 +1753,11 @@ void CullSides( entity_t *e ){ ( side2->shaderInfo->autosprite || side2->shaderInfo->polygonOffset ) ) { continue; } - + /* find first common point */ first = -1; for ( k = 0; k < numPoints; k++ ) - { + { if ( VectorCompare( w1->p[ 0 ], w2->p[ k ] ) ) { first = k; k = numPoints; @@ -1766,7 +1766,7 @@ void CullSides( entity_t *e ){ if ( first == -1 ) { continue; } - + /* find second common point (regardless of winding order) */ second = -1; dir = 0; @@ -1789,12 +1789,12 @@ void CullSides( entity_t *e ){ } if ( CullVectorCompare( w1->p[ 1 ], w2->p[ second ] ) ) { dir = -1; - } + } } if ( dir == 0 ) { continue; } - + /* compare the rest of the points */ l = first; for ( k = 0; k < numPoints; k++ ) @@ -1802,29 +1802,29 @@ void CullSides( entity_t *e ){ if ( !CullVectorCompare( w1->p[ k ], w2->p[ l ] ) ) { k = 100000; } - + l += dir; if ( l < 0 ) { l = numPoints - 1; } else if ( l >= numPoints ) { l = 0; - } + } } if ( k >= 100000 ) { continue; } - + /* cull face 1 */ if ( !side2->culled && !( side2->compileFlags & C_TRANSLUCENT ) && !( side2->compileFlags & C_NODRAW ) ) { side1->culled = qtrue; g_numCoinFaces++; } - + if ( side1->planenum == side2->planenum && side1->culled == qtrue ) { continue; } - + /* cull face 2 */ if ( !side1->culled && !( side1->compileFlags & C_TRANSLUCENT ) && !( side1->compileFlags & C_NODRAW ) ) { side2->culled = qtrue; @@ -1834,7 +1834,7 @@ void CullSides( entity_t *e ){ } } } - + /* emit some stats */ Sys_FPrintf( SYS_VRB, "%9d hidden faces culled\n", g_numHiddenFaces ); Sys_FPrintf( SYS_VRB, "%9d coincident faces culled\n", g_numCoinFaces ); @@ -1854,19 +1854,19 @@ void CullSides( entity_t *e ){ */ void ClipSidesIntoTree( entity_t *e, tree_t *tree ){ - brush_t *b; - int i; - winding_t *w; - side_t *side, *newSide; - shaderInfo_t *si; - - + brush_t *b; + int i; + winding_t *w; + side_t *side, *newSide; + shaderInfo_t *si; + + /* ydnar: cull brush sides */ CullSides( e ); - + /* note it */ Sys_FPrintf( SYS_VRB, "--- ClipSidesIntoTree ---\n" ); - + /* walk the brush list */ for ( b = e->brushes; b; b = b->next ) { @@ -1878,35 +1878,35 @@ void ClipSidesIntoTree( entity_t *e, tree_t *tree ){ if ( side->winding == NULL ) { continue; } - + /* copy the winding */ w = CopyWinding( side->winding ); side->visibleHull = NULL; ClipSideIntoTree_r( w, side, tree->headnode ); - + /* anything left? */ w = side->visibleHull; if ( w == NULL ) { continue; } - + /* shader? */ si = side->shaderInfo; if ( si == NULL ) { continue; } - + /* don't create faces for non-visible sides */ /* ydnar: except indexed shaders, like common/terrain and nodraw fog surfaces */ if ( ( si->compileFlags & C_NODRAW ) && si->indexed == qfalse && !( si->compileFlags & C_FOG ) ) { continue; } - + /* always use the original winding for autosprites and noclip faces */ if ( si->autosprite || si->noClip ) { w = side->winding; } - + /* save this winding as a visible surface */ DrawSurfaceForSide( e, b, side, w ); @@ -1914,14 +1914,14 @@ void ClipSidesIntoTree( entity_t *e, tree_t *tree ){ if ( !( si->compileFlags & C_FOG ) ) { continue; } - + /* duplicate the up-facing side */ w = ReverseWinding( w ); newSide = safe_malloc( sizeof( *side ) ); *newSide = *side; newSide->visibleHull = w; newSide->planenum ^= 1; - + /* save this winding as a visible surface */ DrawSurfaceForSide( e, b, newSide, w ); } @@ -1943,28 +1943,28 @@ void ClipSidesIntoTree( entity_t *e, tree_t *tree ){ */ int AddReferenceToLeaf( mapDrawSurface_t *ds, node_t *node ){ - drawSurfRef_t *dsr; - - + drawSurfRef_t *dsr; + + /* dummy check */ if ( node->planenum != PLANENUM_LEAF || node->opaque ) { return 0; } - + /* try to find an existing reference */ for ( dsr = node->drawSurfReferences; dsr; dsr = dsr->nextRef ) { if ( dsr->outputNum == numBSPDrawSurfaces ) { return 0; + } } - } - + /* add a new reference */ dsr = safe_malloc( sizeof( *dsr ) ); dsr->outputNum = numBSPDrawSurfaces; dsr->nextRef = node->drawSurfReferences; node->drawSurfReferences = dsr; - + /* ydnar: sky/skybox surfaces */ if ( node->skybox ) { ds->skybox = qtrue; @@ -1972,7 +1972,7 @@ int AddReferenceToLeaf( mapDrawSurface_t *ds, node_t *node ){ if ( ds->shaderInfo->compileFlags & C_SKY ) { node->sky = qtrue; } - + /* return */ return 1; } @@ -1985,14 +1985,14 @@ int AddReferenceToLeaf( mapDrawSurface_t *ds, node_t *node ){ */ int AddReferenceToTree_r( mapDrawSurface_t *ds, node_t *node, qboolean skybox ){ - int i, refs = 0; - - + int i, refs = 0; + + /* dummy check */ if ( node == NULL ) { return 0; } - + /* is this a decision node? */ if ( node->planenum != PLANENUM_LEAF ) { /* add to child nodes and return */ @@ -2000,19 +2000,19 @@ int AddReferenceToTree_r( mapDrawSurface_t *ds, node_t *node, qboolean skybox ){ refs += AddReferenceToTree_r( ds, node->children[ 1 ], skybox ); return refs; } - + /* ydnar */ if ( skybox ) { /* skybox surfaces only get added to sky leaves */ if ( !node->sky ) { return 0; } - + /* increase the leaf bounds */ for ( i = 0; i < ds->numVerts; i++ ) AddPointToBounds( ds->verts[ i ].xyz, node->mins, node->maxs ); } - + /* add a reference */ return AddReferenceToLeaf( ds, node ); } @@ -2025,17 +2025,17 @@ int AddReferenceToTree_r( mapDrawSurface_t *ds, node_t *node, qboolean skybox ){ */ int FilterPointIntoTree_r( vec3_t point, mapDrawSurface_t *ds, node_t *node ){ - float d; - plane_t *plane; - int refs = 0; - - + float d; + plane_t *plane; + int refs = 0; + + /* is this a decision node? */ if ( node->planenum != PLANENUM_LEAF ) { /* classify the point in relation to the plane */ plane = &mapplanes[ node->planenum ]; d = DotProduct( point, plane->normal ) - plane->dist; - + /* filter by this plane */ refs = 0; if ( d >= -ON_EPSILON ) { @@ -2044,11 +2044,11 @@ int FilterPointIntoTree_r( vec3_t point, mapDrawSurface_t *ds, node_t *node ){ if ( d <= ON_EPSILON ) { refs += FilterPointIntoTree_r( point, ds, node->children[ 1 ] ); } - + /* return */ return refs; } - + /* add a reference */ return AddReferenceToLeaf( ds, node ); } @@ -2059,15 +2059,15 @@ int FilterPointIntoTree_r( vec3_t point, mapDrawSurface_t *ds, node_t *node ){ */ int FilterPointConvexHullIntoTree_r( vec3_t **points, int npoints, mapDrawSurface_t *ds, node_t *node ){ - float d, dmin, dmax; - plane_t *plane; - int refs = 0; - int i; + float d, dmin, dmax; + plane_t *plane; + int refs = 0; + int i; if ( !points ) { return 0; } - + /* is this a decision node? */ if ( node->planenum != PLANENUM_LEAF ) { /* classify the point in relation to the plane */ @@ -2082,9 +2082,9 @@ int FilterPointConvexHullIntoTree_r( vec3_t **points, int npoints, mapDrawSurfac } if ( d < dmin ) { dmin = d; + } } - } - + /* filter by this plane */ refs = 0; if ( dmax >= -ON_EPSILON ) { @@ -2093,11 +2093,11 @@ int FilterPointConvexHullIntoTree_r( vec3_t **points, int npoints, mapDrawSurfac if ( dmin <= ON_EPSILON ) { refs += FilterPointConvexHullIntoTree_r( points, npoints, ds, node->children[ 1 ] ); } - + /* return */ return refs; } - + /* add a reference */ return AddReferenceToLeaf( ds, node ); } @@ -2109,20 +2109,20 @@ int FilterPointConvexHullIntoTree_r( vec3_t **points, int npoints, mapDrawSurfac */ int FilterWindingIntoTree_r( winding_t *w, mapDrawSurface_t *ds, node_t *node ){ - int i, refs = 0; - plane_t *p1, *p2; + int i, refs = 0; + plane_t *p1, *p2; vec4_t plane1, plane2; - winding_t *fat, *front, *back; - shaderInfo_t *si; - - + winding_t *fat, *front, *back; + shaderInfo_t *si; + + /* get shaderinfo */ si = ds->shaderInfo; - + /* ydnar: is this the head node? */ if ( node->parent == NULL && si != NULL && ( si->mins[ 0 ] != 0.0f || si->maxs[ 0 ] != 0.0f || - si->mins[ 1 ] != 0.0f || si->maxs[ 1 ] != 0.0f || + si->mins[ 1 ] != 0.0f || si->maxs[ 1 ] != 0.0f || si->mins[ 2 ] != 0.0f || si->maxs[ 2 ] != 0.0f ) ) { static qboolean warned = qfalse; if ( !warned ) { @@ -2151,56 +2151,56 @@ int FilterWindingIntoTree_r( winding_t *w, mapDrawSurface_t *ds, node_t *node ){ * added to the three sub-windings, the fattening at least doesn't make * it worse */ - + FreeWinding( w ); w = fat; } - + /* is this a decision node? */ if ( node->planenum != PLANENUM_LEAF ) { /* get node plane */ p1 = &mapplanes[ node->planenum ]; VectorCopy( p1->normal, plane1 ); plane1[ 3 ] = p1->dist; - + /* check if surface is planar */ if ( ds->planeNum >= 0 ) { /* get surface plane */ p2 = &mapplanes[ ds->planeNum ]; VectorCopy( p2->normal, plane2 ); plane2[ 3 ] = p2->dist; - + #if 0 /* div0: this is the plague (inaccurate) */ vec4_t reverse; - /* invert surface plane */ - VectorSubtract( vec3_origin, plane2, reverse ); - reverse[ 3 ] = -plane2[ 3 ]; - - /* compare planes */ + /* invert surface plane */ + VectorSubtract( vec3_origin, plane2, reverse ); + reverse[ 3 ] = -plane2[ 3 ]; + + /* compare planes */ if ( DotProduct( plane1, plane2 ) > 0.999f && fabs( plane1[ 3 ] - plane2[ 3 ] ) < 0.001f ) { - return FilterWindingIntoTree_r( w, ds, node->children[ 0 ] ); + return FilterWindingIntoTree_r( w, ds, node->children[ 0 ] ); } if ( DotProduct( plane1, reverse ) > 0.999f && fabs( plane1[ 3 ] - reverse[ 3 ] ) < 0.001f ) { - return FilterWindingIntoTree_r( w, ds, node->children[ 1 ] ); + return FilterWindingIntoTree_r( w, ds, node->children[ 1 ] ); } #else /* div0: this is the cholera (doesn't hit enough) */ - /* the drawsurf might have an associated plane, if so, force a filter here */ + /* the drawsurf might have an associated plane, if so, force a filter here */ if ( ds->planeNum == node->planenum ) { - return FilterWindingIntoTree_r( w, ds, node->children[ 0 ] ); + return FilterWindingIntoTree_r( w, ds, node->children[ 0 ] ); } if ( ds->planeNum == ( node->planenum ^ 1 ) ) { - return FilterWindingIntoTree_r( w, ds, node->children[ 1 ] ); + return FilterWindingIntoTree_r( w, ds, node->children[ 1 ] ); } #endif } - + /* clip the winding by this plane */ ClipWindingEpsilonStrict( w, plane1, plane1[ 3 ], ON_EPSILON, &front, &back ); /* strict; we handle the "winding disappeared" case */ - + /* filter by this plane */ refs = 0; if ( front == NULL && back == NULL ) { @@ -2216,11 +2216,11 @@ int FilterWindingIntoTree_r( winding_t *w, mapDrawSurface_t *ds, node_t *node ){ refs += FilterWindingIntoTree_r( back, ds, node->children[ 1 ] ); } FreeWinding( w ); - + /* return */ return refs; } - + /* add a reference */ return AddReferenceToLeaf( ds, node ); } @@ -2233,14 +2233,14 @@ int FilterWindingIntoTree_r( winding_t *w, mapDrawSurface_t *ds, node_t *node ){ */ int FilterFaceIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ - winding_t *w; - int refs = 0; - - + winding_t *w; + int refs = 0; + + /* make a winding and filter it into the tree */ w = WindingFromDrawSurf( ds ); refs = FilterWindingIntoTree_r( w, ds, tree->headnode ); - + /* return */ return refs; } @@ -2252,11 +2252,11 @@ int FilterFaceIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ subdivides a patch into an approximate curve and filters it into the tree */ -#define FILTER_SUBDIVISION 8 +#define FILTER_SUBDIVISION 8 static int FilterPatchIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ - int x, y, refs = 0; - + int x, y, refs = 0; + for ( y = 0; y + 2 < ds->patchHeight; y += 2 ) for ( x = 0; x + 2 < ds->patchWidth; x += 2 ) { @@ -2284,21 +2284,21 @@ static int FilterPatchIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ */ static int FilterTrianglesIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ - int i, refs; - winding_t *w; - - + int i, refs; + winding_t *w; + + /* ydnar: gs mods: this was creating bogus triangles before */ refs = 0; for ( i = 0; i < ds->numIndexes; i += 3 ) { /* error check */ if ( ds->indexes[ i ] >= ds->numVerts || - ds->indexes[ i + 1 ] >= ds->numVerts || + ds->indexes[ i + 1 ] >= ds->numVerts || ds->indexes[ i + 2 ] >= ds->numVerts ) { Error( "Index %d greater than vertex count %d", ds->indexes[ i ], ds->numVerts ); } - + /* make a triangle winding and filter it into the tree */ w = AllocWinding( 3 ); w->numpoints = 3; @@ -2307,7 +2307,7 @@ static int FilterTrianglesIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ VectorCopy( ds->verts[ ds->indexes[ i + 2 ] ].xyz, w->p[ 2 ] ); refs += FilterWindingIntoTree_r( w, ds, tree->headnode ); } - + /* use point filtering as well */ for ( i = 0; i < ds->numVerts; i++ ) refs += FilterPointIntoTree_r( ds->verts[ i ].xyz, ds, tree->headnode ); @@ -2323,29 +2323,29 @@ static int FilterTrianglesIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ */ static int FilterFoliageIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ - int f, i, refs; - bspDrawVert_t *instance; - vec3_t xyz; - winding_t *w; - - + int f, i, refs; + bspDrawVert_t *instance; + vec3_t xyz; + winding_t *w; + + /* walk origin list */ refs = 0; for ( f = 0; f < ds->numFoliageInstances; f++ ) { /* get instance */ instance = ds->verts + ds->patchHeight + f; - + /* walk triangle list */ for ( i = 0; i < ds->numIndexes; i += 3 ) { /* error check */ if ( ds->indexes[ i ] >= ds->numVerts || - ds->indexes[ i + 1 ] >= ds->numVerts || + ds->indexes[ i + 1 ] >= ds->numVerts || ds->indexes[ i + 2 ] >= ds->numVerts ) { Error( "Index %d greater than vertex count %d", ds->indexes[ i ], ds->numVerts ); } - + /* make a triangle winding and filter it into the tree */ w = AllocWinding( 3 ); w->numpoints = 3; @@ -2354,7 +2354,7 @@ static int FilterFoliageIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ VectorAdd( instance->xyz, ds->verts[ ds->indexes[ i + 2 ] ].xyz, w->p[ 2 ] ); refs += FilterWindingIntoTree_r( w, ds, tree->headnode ); } - + /* use point filtering as well */ for ( i = 0; i < ( ds->numVerts - ds->numFoliageInstances ); i++ ) { @@ -2362,7 +2362,7 @@ static int FilterFoliageIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ refs += FilterPointIntoTree_r( xyz, ds, tree->headnode ); } } - + return refs; } @@ -2384,16 +2384,16 @@ static int FilterFlareSurfIntoTree( mapDrawSurface_t *ds, tree_t *tree ){ */ void EmitDrawVerts( mapDrawSurface_t *ds, bspDrawSurface_t *out ){ - int i, k; - bspDrawVert_t *dv; - shaderInfo_t *si; - float offset; - - + int i, k; + bspDrawVert_t *dv; + shaderInfo_t *si; + float offset; + + /* get stuff */ si = ds->shaderInfo; offset = si->offset; - + /* copy the verts */ out->firstVert = numBSPDrawVerts; out->numVerts = ds->numVerts; @@ -2402,22 +2402,22 @@ void EmitDrawVerts( mapDrawSurface_t *ds, bspDrawSurface_t *out ){ /* allocate a new vert */ IncDrawVerts(); dv = &bspDrawVerts[ numBSPDrawVerts - 1 ]; - + /* copy it */ memcpy( dv, &ds->verts[ i ], sizeof( *dv ) ); - + /* offset? */ if ( offset != 0.0f ) { VectorMA( dv->xyz, offset, dv->normal, dv->xyz ); } - + /* expand model bounds necessary because of misc_model surfaces on entities note: does not happen on worldspawn as its bounds is only used for determining lightgrid bounds */ if ( numBSPModels > 0 ) { AddPointToBounds( dv->xyz, bspModels[ numBSPModels ].mins, bspModels[ numBSPModels ].maxs ); } - + /* debug color? */ if ( debugSurfaces ) { for ( k = 0; k < MAX_LIGHTMAPS; k++ ) @@ -2436,17 +2436,17 @@ void EmitDrawVerts( mapDrawSurface_t *ds, bspDrawSurface_t *out ){ */ int FindDrawIndexes( int numIndexes, int *indexes ){ - int i, j, numTestIndexes; - - + int i, j, numTestIndexes; + + /* dummy check */ if ( numIndexes < 3 || numBSPDrawIndexes < numIndexes || indexes == NULL ) { return numBSPDrawIndexes; } - + /* set limit */ numTestIndexes = 1 + numBSPDrawIndexes - numIndexes; - + /* handle 3 indexes as a special case for performance */ if ( numIndexes == 3 ) { /* run through all indexes */ @@ -2454,30 +2454,30 @@ int FindDrawIndexes( int numIndexes, int *indexes ){ { /* test 3 indexes */ if ( indexes[ 0 ] == bspDrawIndexes[ i ] && - indexes[ 1 ] == bspDrawIndexes[ i + 1 ] && + indexes[ 1 ] == bspDrawIndexes[ i + 1 ] && indexes[ 2 ] == bspDrawIndexes[ i + 2 ] ) { numRedundantIndexes += numIndexes; return i; } } - + /* failed */ return numBSPDrawIndexes; } - + /* handle 4 or more indexes */ for ( i = 0; i < numTestIndexes; i++ ) { /* test first 4 indexes */ if ( indexes[ 0 ] == bspDrawIndexes[ i ] && - indexes[ 1 ] == bspDrawIndexes[ i + 1 ] && - indexes[ 2 ] == bspDrawIndexes[ i + 2 ] && + indexes[ 1 ] == bspDrawIndexes[ i + 1 ] && + indexes[ 2 ] == bspDrawIndexes[ i + 2 ] && indexes[ 3 ] == bspDrawIndexes[ i + 3 ] ) { /* handle 4 indexes */ if ( numIndexes == 4 ) { return i; } - + /* test the remainder */ for ( j = 4; j < numIndexes; j++ ) { @@ -2491,7 +2491,7 @@ int FindDrawIndexes( int numIndexes, int *indexes ){ } } } - + /* failed */ return numBSPDrawIndexes; } @@ -2504,9 +2504,9 @@ int FindDrawIndexes( int numIndexes, int *indexes ){ */ void EmitDrawIndexes( mapDrawSurface_t *ds, bspDrawSurface_t *out ){ - int i; - - + int i; + + /* attempt to use redundant indexing */ out->firstIndex = FindDrawIndexes( ds->numIndexes, ds->indexes ); out->numIndexes = ds->numIndexes; @@ -2521,14 +2521,14 @@ void EmitDrawIndexes( mapDrawSurface_t *ds, bspDrawSurface_t *out ){ if ( ds->type != SURFACE_PATCH ) { if ( bspDrawIndexes[ numBSPDrawIndexes ] < 0 || bspDrawIndexes[ numBSPDrawIndexes ] >= ds->numVerts ) { Sys_Printf( "WARNING: %d %s has invalid index %d (%d)\n", - numBSPDrawSurfaces, - ds->shaderInfo->shader, - bspDrawIndexes[ numBSPDrawIndexes ], - i ); + numBSPDrawSurfaces, + ds->shaderInfo->shader, + bspDrawIndexes[ numBSPDrawIndexes ], + i ); bspDrawIndexes[ numBSPDrawIndexes ] = 0; } } - + /* increment index count */ numBSPDrawIndexes++; } @@ -2544,20 +2544,20 @@ void EmitDrawIndexes( mapDrawSurface_t *ds, bspDrawSurface_t *out ){ */ void EmitFlareSurface( mapDrawSurface_t *ds ){ - int i; - bspDrawSurface_t *out; - - + int i; + bspDrawSurface_t *out; + + /* ydnar: nuking useless flare drawsurfaces */ if ( emitFlares == qfalse && ds->type != SURFACE_SHADER ) { return; } - + /* limit check */ if ( numBSPDrawSurfaces == MAX_MAP_DRAW_SURFS ) { Error( "MAX_MAP_DRAW_SURFS" ); } - + /* allocate a new surface */ if ( numBSPDrawSurfaces == MAX_MAP_DRAW_SURFS ) { Error( "MAX_MAP_DRAW_SURFS" ); @@ -2566,12 +2566,12 @@ void EmitFlareSurface( mapDrawSurface_t *ds ){ ds->outputNum = numBSPDrawSurfaces; numBSPDrawSurfaces++; memset( out, 0, sizeof( *out ) ); - + /* set it up */ out->surfaceType = MST_FLARE; out->shaderNum = EmitShader( ds->shaderInfo->shader, &ds->shaderInfo->contentFlags, &ds->shaderInfo->surfaceFlags ); out->fogNum = ds->fogNum; - + /* RBSP */ for ( i = 0; i < MAX_LIGHTMAPS; i++ ) { @@ -2581,12 +2581,12 @@ void EmitFlareSurface( mapDrawSurface_t *ds ){ } out->lightmapStyles[ 0 ] = ds->lightStyle; out->vertexStyles[ 0 ] = ds->lightStyle; - - VectorCopy( ds->lightmapOrigin, out->lightmapOrigin ); /* origin */ - VectorCopy( ds->lightmapVecs[ 0 ], out->lightmapVecs[ 0 ] ); /* color */ + + VectorCopy( ds->lightmapOrigin, out->lightmapOrigin ); /* origin */ + VectorCopy( ds->lightmapVecs[ 0 ], out->lightmapVecs[ 0 ] ); /* color */ VectorCopy( ds->lightmapVecs[ 1 ], out->lightmapVecs[ 1 ] ); - VectorCopy( ds->lightmapVecs[ 2 ], out->lightmapVecs[ 2 ] ); /* normal */ - + VectorCopy( ds->lightmapVecs[ 2 ], out->lightmapVecs[ 2 ] ); /* normal */ + /* add to count */ numSurfacesByType[ ds->type ]++; } @@ -2597,25 +2597,25 @@ void EmitFlareSurface( mapDrawSurface_t *ds ){ */ void EmitPatchSurface( entity_t *e, mapDrawSurface_t *ds ){ - int i, j; - bspDrawSurface_t *out; - int surfaceFlags, contentFlags; - int forcePatchMeta; + int i, j; + bspDrawSurface_t *out; + int surfaceFlags, contentFlags; + int forcePatchMeta; /* vortex: _patchMeta support */ forcePatchMeta = IntForKey( e, "_patchMeta" ); if ( !forcePatchMeta ) { forcePatchMeta = IntForKey( e, "patchMeta" ); } - + /* invert the surface if necessary */ if ( ds->backSide || ds->shaderInfo->invert ) { - bspDrawVert_t *dv1, *dv2, temp; + bspDrawVert_t *dv1, *dv2, temp; /* walk the verts, flip the normal */ for ( i = 0; i < ds->numVerts; i++ ) VectorScale( ds->verts[ i ].normal, -1.0f, ds->verts[ i ].normal ); - + /* walk the verts again, but this time reverse their order */ for ( j = 0; j < ds->patchHeight; j++ ) { @@ -2628,7 +2628,7 @@ void EmitPatchSurface( entity_t *e, mapDrawSurface_t *ds ){ memcpy( dv2, &temp, sizeof( bspDrawVert_t ) ); } } - + /* invert facing */ VectorScale( ds->lightmapVecs[ 2 ], -1.0f, ds->lightmapVecs[ 2 ] ); } @@ -2653,7 +2653,7 @@ void EmitPatchSurface( entity_t *e, mapDrawSurface_t *ds ){ contentFlags = ds->shaderInfo->contentFlags; ApplySurfaceParm( "nodraw", &contentFlags, &surfaceFlags, NULL ); ApplySurfaceParm( "pointlight", &contentFlags, &surfaceFlags, NULL ); - + /* we don't want this patch getting lightmapped */ VectorClear( ds->lightmapVecs[ 2 ] ); VectorClear( ds->lightmapAxis ); @@ -2668,7 +2668,7 @@ void EmitPatchSurface( entity_t *e, mapDrawSurface_t *ds ){ out->patchWidth = ds->patchWidth; out->patchHeight = ds->patchHeight; out->fogNum = ds->fogNum; - + /* RBSP */ for ( i = 0; i < MAX_LIGHTMAPS; i++ ) { @@ -2678,22 +2678,22 @@ void EmitPatchSurface( entity_t *e, mapDrawSurface_t *ds ){ } out->lightmapStyles[ 0 ] = LS_NORMAL; out->vertexStyles[ 0 ] = LS_NORMAL; - + /* ydnar: gs mods: previously, the lod bounds were stored in lightmapVecs[ 0 ] and [ 1 ], moved to bounds[ 0 ] and [ 1 ] */ VectorCopy( ds->lightmapOrigin, out->lightmapOrigin ); VectorCopy( ds->bounds[ 0 ], out->lightmapVecs[ 0 ] ); VectorCopy( ds->bounds[ 1 ], out->lightmapVecs[ 1 ] ); VectorCopy( ds->lightmapVecs[ 2 ], out->lightmapVecs[ 2 ] ); - + /* ydnar: gs mods: clear out the plane normal */ if ( ds->planar == qfalse ) { VectorClear( out->lightmapVecs[ 2 ] ); } - + /* emit the verts and indexes */ EmitDrawVerts( ds, out ); EmitDrawIndexes( ds, out ); - + /* add to count */ numSurfacesByType[ ds->type ]++; } @@ -2703,28 +2703,28 @@ void EmitPatchSurface( entity_t *e, mapDrawSurface_t *ds ){ optimizes the vertex/index data in a triangle surface */ -#define VERTEX_CACHE_SIZE 16 +#define VERTEX_CACHE_SIZE 16 static void OptimizeTriangleSurface( mapDrawSurface_t *ds ){ - int i, j, k, temp, first, best, bestScore, score; - int vertexCache[ VERTEX_CACHE_SIZE + 1 ]; /* one more for optimizing insert */ - int *indexes; - - + int i, j, k, temp, first, best, bestScore, score; + int vertexCache[ VERTEX_CACHE_SIZE + 1 ]; /* one more for optimizing insert */ + int *indexes; + + /* certain surfaces don't get optimized */ if ( ds->numIndexes <= VERTEX_CACHE_SIZE || ds->shaderInfo->autosprite ) { return; } - + /* create index scratch pad */ indexes = safe_malloc( ds->numIndexes * sizeof( *indexes ) ); memcpy( indexes, ds->indexes, ds->numIndexes * sizeof( *indexes ) ); - + /* setup */ for ( i = 0; i <= VERTEX_CACHE_SIZE && i < ds->numIndexes; i++ ) vertexCache[ i ] = indexes[ i ]; - + /* add triangles in a vertex cache-aware order */ for ( i = 0; i < ds->numIndexes; i += 3 ) { @@ -2740,34 +2740,34 @@ static void OptimizeTriangleSurface( mapDrawSurface_t *ds ){ if ( first < 0 ) { first = j; } - + /* score the triangle */ score = 0; for ( k = 0; k < VERTEX_CACHE_SIZE; k++ ) { if ( indexes[ j ] == vertexCache[ k ] || indexes[ j + 1 ] == vertexCache[ k ] || indexes[ j + 2 ] == vertexCache[ k ] ) { score++; + } } - } - + /* better triangle? */ if ( score > bestScore ) { bestScore = score; best = j; } - + /* a perfect score of 3 means this triangle's verts are already present in the vertex cache */ if ( score == 3 ) { break; + } } } - } - + /* check if no decent triangle was found, and use first available */ if ( best < 0 ) { best = first; } - + /* valid triangle? */ if ( best >= 0 ) { /* add triangle to vertex cache */ @@ -2777,29 +2777,29 @@ static void OptimizeTriangleSurface( mapDrawSurface_t *ds ){ { if ( indexes[ best + j ] == vertexCache[ k ] ) { break; + } } - } - + if ( k >= VERTEX_CACHE_SIZE ) { /* pop off top of vertex cache */ for ( k = VERTEX_CACHE_SIZE; k > 0; k-- ) vertexCache[ k ] = vertexCache[ k - 1 ]; - + /* add vertex */ vertexCache[ 0 ] = indexes[ best + j ]; } } - + /* add triangle to surface */ ds->indexes[ i ] = indexes[ best ]; ds->indexes[ i + 1 ] = indexes[ best + 1 ]; ds->indexes[ i + 2 ] = indexes[ best + 2 ]; - + /* clear from input pool */ indexes[ best ] = -1; indexes[ best + 1 ] = -1; indexes[ best + 2 ] = -1; - + /* sort triangle windings (312 -> 123) */ while ( ds->indexes[ i ] > ds->indexes[ i + 1 ] || ds->indexes[ i ] > ds->indexes[ i + 2 ] ) { @@ -2810,7 +2810,7 @@ static void OptimizeTriangleSurface( mapDrawSurface_t *ds ){ } } } - + /* clean up */ free( indexes ); } @@ -2823,8 +2823,8 @@ static void OptimizeTriangleSurface( mapDrawSurface_t *ds ){ */ void EmitTriangleSurface( mapDrawSurface_t *ds ){ - int i, temp; - bspDrawSurface_t *out; + int i, temp; + bspDrawSurface_t *out; /* invert the surface if necessary */ if ( ds->backSide || ds->shaderInfo->invert ) { @@ -2835,15 +2835,15 @@ void EmitTriangleSurface( mapDrawSurface_t *ds ){ ds->indexes[ i ] = ds->indexes[ i + 1 ]; ds->indexes[ i + 1 ] = temp; } - + /* walk the verts, flip the normal */ for ( i = 0; i < ds->numVerts; i++ ) VectorScale( ds->verts[ i ].normal, -1.0f, ds->verts[ i ].normal ); - + /* invert facing */ VectorScale( ds->lightmapVecs[ 2 ], -1.0f, ds->lightmapVecs[ 2 ] ); } - + /* allocate a new surface */ if ( numBSPDrawSurfaces == MAX_MAP_DRAW_SURFS ) { Error( "MAX_MAP_DRAW_SURFS" ); @@ -2852,27 +2852,27 @@ void EmitTriangleSurface( mapDrawSurface_t *ds ){ ds->outputNum = numBSPDrawSurfaces; numBSPDrawSurfaces++; memset( out, 0, sizeof( *out ) ); - + /* ydnar/sd: handle wolf et foliage surfaces */ if ( ds->type == SURFACE_FOLIAGE ) { out->surfaceType = MST_FOLIAGE; } - + /* ydnar: gs mods: handle lightmapped terrain (force to planar type) */ //% else if( VectorLength( ds->lightmapAxis ) <= 0.0f || ds->type == SURFACE_TRIANGLES || ds->type == SURFACE_FOGHULL || debugSurfaces ) else if ( ( VectorLength( ds->lightmapAxis ) <= 0.0f && ds->planar == qfalse ) || - ds->type == SURFACE_TRIANGLES || - ds->type == SURFACE_FOGHULL || - ds->numVerts > maxLMSurfaceVerts || + ds->type == SURFACE_TRIANGLES || + ds->type == SURFACE_FOGHULL || + ds->numVerts > maxLMSurfaceVerts || debugSurfaces ) { out->surfaceType = MST_TRIANGLE_SOUP; } - + /* set to a planar face */ else{ out->surfaceType = MST_PLANAR; } - + /* set it up */ if ( debugSurfaces ) { out->shaderNum = EmitShader( "debugsurfaces", NULL, NULL ); @@ -2883,13 +2883,13 @@ void EmitTriangleSurface( mapDrawSurface_t *ds ){ out->patchWidth = ds->patchWidth; out->patchHeight = ds->patchHeight; out->fogNum = ds->fogNum; - + /* debug inset (push each triangle vertex towards the center of each triangle it is on */ if ( debugInset ) { - bspDrawVert_t *a, *b, *c; - vec3_t cent, dir; + bspDrawVert_t *a, *b, *c; + vec3_t cent, dir; + - /* walk triangle list */ for ( i = 0; i < ds->numIndexes; i += 3 ) { @@ -2897,13 +2897,13 @@ void EmitTriangleSurface( mapDrawSurface_t *ds ){ a = &ds->verts[ ds->indexes[ i ] ]; b = &ds->verts[ ds->indexes[ i + 1 ] ]; c = &ds->verts[ ds->indexes[ i + 2 ] ]; - + /* calculate centroid */ VectorCopy( a->xyz, cent ); VectorAdd( cent, b->xyz, cent ); VectorAdd( cent, c->xyz, cent ); VectorScale( cent, 1.0f / 3.0f, cent ); - + /* offset each vertex */ VectorSubtract( cent, a->xyz, dir ); VectorNormalize( dir, dir ); @@ -2916,7 +2916,7 @@ void EmitTriangleSurface( mapDrawSurface_t *ds ){ VectorAdd( c->xyz, dir, c->xyz ); } } - + /* RBSP */ for ( i = 0; i < MAX_LIGHTMAPS; i++ ) { @@ -2926,25 +2926,25 @@ void EmitTriangleSurface( mapDrawSurface_t *ds ){ } out->lightmapStyles[ 0 ] = LS_NORMAL; out->vertexStyles[ 0 ] = LS_NORMAL; - + /* lightmap vectors (lod bounds for patches */ VectorCopy( ds->lightmapOrigin, out->lightmapOrigin ); VectorCopy( ds->lightmapVecs[ 0 ], out->lightmapVecs[ 0 ] ); VectorCopy( ds->lightmapVecs[ 1 ], out->lightmapVecs[ 1 ] ); VectorCopy( ds->lightmapVecs[ 2 ], out->lightmapVecs[ 2 ] ); - + /* ydnar: gs mods: clear out the plane normal */ if ( ds->planar == qfalse ) { VectorClear( out->lightmapVecs[ 2 ] ); } - + /* optimize the surface's triangles */ OptimizeTriangleSurface( ds ); - + /* emit the verts and indexes */ EmitDrawVerts( ds, out ); EmitDrawIndexes( ds, out ); - + /* add to count */ numSurfacesByType[ ds->type ]++; } @@ -2974,44 +2974,44 @@ static void EmitFaceSurface( mapDrawSurface_t *ds ){ */ static void MakeDebugPortalSurfs_r( node_t *node, shaderInfo_t *si ){ - int i, k, c, s; - portal_t *p; - winding_t *w; - mapDrawSurface_t *ds; - bspDrawVert_t *dv; - - + int i, k, c, s; + portal_t *p; + winding_t *w; + mapDrawSurface_t *ds; + bspDrawVert_t *dv; + + /* recurse if decision node */ if ( node->planenum != PLANENUM_LEAF ) { MakeDebugPortalSurfs_r( node->children[ 0 ], si ); MakeDebugPortalSurfs_r( node->children[ 1 ], si ); return; } - + /* don't bother with opaque leaves */ if ( node->opaque ) { return; } - + /* walk the list of portals */ for ( c = 0, p = node->portals; p != NULL; c++, p = p->next[ s ] ) { /* get winding and side even/odd */ w = p->winding; s = ( p->nodes[ 1 ] == node ); - + /* is this a valid portal for this leaf? */ if ( w && p->nodes[ 0 ] == node ) { /* is this portal passable? */ if ( PortalPassable( p ) == qfalse ) { continue; } - + /* check max points */ if ( w->numpoints > 64 ) { Error( "MakePortalSurfs_r: w->numpoints = %d", w->numpoints ); } - + /* allocate a drawsurface */ ds = AllocDrawSurface( SURFACE_FACE ); ds->shaderInfo = si; @@ -3023,13 +3023,13 @@ static void MakeDebugPortalSurfs_r( node_t *node, shaderInfo_t *si ){ ds->numVerts = w->numpoints; ds->verts = safe_malloc( ds->numVerts * sizeof( *ds->verts ) ); memset( ds->verts, 0, ds->numVerts * sizeof( *ds->verts ) ); - + /* walk the winding */ for ( i = 0; i < ds->numVerts; i++ ) { /* get vert */ dv = ds->verts + i; - + /* set it */ VectorCopy( w->p[ i ], dv->xyz ); VectorCopy( p->plane.normal, dv->normal ); @@ -3053,15 +3053,15 @@ static void MakeDebugPortalSurfs_r( node_t *node, shaderInfo_t *si ){ */ void MakeDebugPortalSurfs( tree_t *tree ){ - shaderInfo_t *si; - - + shaderInfo_t *si; + + /* note it */ Sys_FPrintf( SYS_VRB, "--- MakeDebugPortalSurfs ---\n" ); - + /* get portal debug shader */ si = ShaderInfoForShader( "debugportals" ); - + /* walk the tree */ MakeDebugPortalSurfs_r( tree->headnode, si ); } @@ -3074,28 +3074,28 @@ void MakeDebugPortalSurfs( tree_t *tree ){ */ void MakeFogHullSurfs( entity_t *e, tree_t *tree, char *shader ){ - shaderInfo_t *si; - mapDrawSurface_t *ds; - vec3_t fogMins, fogMaxs; - int i, indexes[] = - { - 0, 1, 2, 0, 2, 3, - 4, 7, 5, 5, 7, 6, - 1, 5, 6, 1, 6, 2, - 0, 4, 5, 0, 5, 1, - 2, 6, 7, 2, 7, 3, - 3, 7, 4, 3, 4, 0 - }; - - + shaderInfo_t *si; + mapDrawSurface_t *ds; + vec3_t fogMins, fogMaxs; + int i, indexes[] = + { + 0, 1, 2, 0, 2, 3, + 4, 7, 5, 5, 7, 6, + 1, 5, 6, 1, 6, 2, + 0, 4, 5, 0, 5, 1, + 2, 6, 7, 2, 7, 3, + 3, 7, 4, 3, 4, 0 + }; + + /* dummy check */ if ( shader == NULL || shader[ 0 ] == '\0' ) { return; } - + /* note it */ Sys_FPrintf( SYS_VRB, "--- MakeFogHullSurfs ---\n" ); - + /* get hull bounds */ VectorCopy( mapMins, fogMins ); VectorCopy( mapMaxs, fogMaxs ); @@ -3104,10 +3104,10 @@ void MakeFogHullSurfs( entity_t *e, tree_t *tree, char *shader ){ fogMins[ i ] -= 128; fogMaxs[ i ] += 128; } - + /* get foghull shader */ si = ShaderInfoForShader( shader ); - + /* allocate a drawsurface */ ds = AllocDrawSurface( SURFACE_FOGHULL ); ds->shaderInfo = si; @@ -3118,18 +3118,18 @@ void MakeFogHullSurfs( entity_t *e, tree_t *tree, char *shader ){ ds->numIndexes = 36; ds->indexes = safe_malloc( ds->numIndexes * sizeof( *ds->indexes ) ); memset( ds->indexes, 0, ds->numIndexes * sizeof( *ds->indexes ) ); - + /* set verts */ VectorSet( ds->verts[ 0 ].xyz, fogMins[ 0 ], fogMins[ 1 ], fogMins[ 2 ] ); VectorSet( ds->verts[ 1 ].xyz, fogMins[ 0 ], fogMaxs[ 1 ], fogMins[ 2 ] ); VectorSet( ds->verts[ 2 ].xyz, fogMaxs[ 0 ], fogMaxs[ 1 ], fogMins[ 2 ] ); VectorSet( ds->verts[ 3 ].xyz, fogMaxs[ 0 ], fogMins[ 1 ], fogMins[ 2 ] ); - + VectorSet( ds->verts[ 4 ].xyz, fogMins[ 0 ], fogMins[ 1 ], fogMaxs[ 2 ] ); VectorSet( ds->verts[ 5 ].xyz, fogMins[ 0 ], fogMaxs[ 1 ], fogMaxs[ 2 ] ); VectorSet( ds->verts[ 6 ].xyz, fogMaxs[ 0 ], fogMaxs[ 1 ], fogMaxs[ 2 ] ); VectorSet( ds->verts[ 7 ].xyz, fogMaxs[ 0 ], fogMins[ 1 ], fogMaxs[ 2 ] ); - + /* set indexes */ memcpy( ds->indexes, indexes, ds->numIndexes * sizeof( *ds->indexes ) ); } @@ -3142,17 +3142,17 @@ void MakeFogHullSurfs( entity_t *e, tree_t *tree, char *shader ){ */ void BiasSurfaceTextures( mapDrawSurface_t *ds ){ - int i; - - + int i; + + /* calculate the surface texture bias */ CalcSurfaceTextureRange( ds ); - + /* don't bias globaltextured shaders */ if ( ds->shaderInfo->globalTexture ) { return; } - + /* bias the texture coordinates */ for ( i = 0; i < ds->numVerts; i++ ) { @@ -3169,19 +3169,19 @@ void BiasSurfaceTextures( mapDrawSurface_t *ds ){ */ int AddSurfaceModelsToTriangle_r( mapDrawSurface_t *ds, surfaceModel_t *model, bspDrawVert_t **tri ){ - bspDrawVert_t mid, *tri2[ 3 ]; - int max, n, localNumSurfaceModels; - - + bspDrawVert_t mid, *tri2[ 3 ]; + int max, n, localNumSurfaceModels; + + /* init */ localNumSurfaceModels = 0; - + /* subdivide calc */ { - int i; - float *a, *b, dx, dy, dz, dist, maxDist; - - + int i; + float *a, *b, dx, dy, dz, dist, maxDist; + + /* find the longest edge and split it */ max = -1; maxDist = 0.0f; @@ -3190,47 +3190,47 @@ int AddSurfaceModelsToTriangle_r( mapDrawSurface_t *ds, surfaceModel_t *model, b /* get verts */ a = tri[ i ]->xyz; b = tri[ ( i + 1 ) % 3 ]->xyz; - + /* get dists */ dx = a[ 0 ] - b[ 0 ]; dy = a[ 1 ] - b[ 1 ]; dz = a[ 2 ] - b[ 2 ]; dist = ( dx * dx ) + ( dy * dy ) + ( dz * dz ); - + /* longer? */ if ( dist > maxDist ) { maxDist = dist; max = i; } } - + /* is the triangle small enough? */ if ( max < 0 || maxDist <= ( model->density * model->density ) ) { - float odds, r, angle; - vec3_t origin, normal, scale, axis[ 3 ], angles; - m4x4_t transform, temp; + float odds, r, angle; + vec3_t origin, normal, scale, axis[ 3 ], angles; + m4x4_t transform, temp; + - /* roll the dice (model's odds scaled by vertex alpha) */ odds = model->odds * ( tri[ 0 ]->color[ 0 ][ 3 ] + tri[ 0 ]->color[ 0 ][ 3 ] + tri[ 0 ]->color[ 0 ][ 3 ] ) / 765.0f; r = Random(); if ( r > odds ) { return 0; } - + /* calculate scale */ r = model->minScale + Random() * ( model->maxScale - model->minScale ); VectorSet( scale, r, r, r ); - + /* calculate angle */ angle = model->minAngle + Random() * ( model->maxAngle - model->minAngle ); - + /* calculate average origin */ VectorCopy( tri[ 0 ]->xyz, origin ); VectorAdd( origin, tri[ 1 ]->xyz, origin ); VectorAdd( origin, tri[ 2 ]->xyz, origin ); VectorScale( origin, ( 1.0f / 3.0f ), origin ); - + /* clear transform matrix */ m4x4_identity( transform ); @@ -3238,7 +3238,7 @@ int AddSurfaceModelsToTriangle_r( mapDrawSurface_t *ds, surfaceModel_t *model, b if ( model->oriented ) { /* set angles */ VectorSet( angles, 0.0f, 0.0f, angle ); - + /* calculate average normal */ VectorCopy( tri[ 0 ]->normal, normal ); VectorAdd( normal, tri[ 1 ]->normal, normal ); @@ -3246,50 +3246,50 @@ int AddSurfaceModelsToTriangle_r( mapDrawSurface_t *ds, surfaceModel_t *model, b if ( VectorNormalize( normal, axis[ 2 ] ) == 0.0f ) { VectorCopy( tri[ 0 ]->normal, axis[ 2 ] ); } - + /* make perpendicular vectors */ MakeNormalVectors( axis[ 2 ], axis[ 1 ], axis[ 0 ] ); - + /* copy to matrix */ m4x4_identity( temp ); - temp[ 0 ] = axis[ 0 ][ 0 ]; temp[ 1 ] = axis[ 0 ][ 1 ]; temp[ 2 ] = axis[ 0 ][ 2 ]; - temp[ 4 ] = axis[ 1 ][ 0 ]; temp[ 5 ] = axis[ 1 ][ 1 ]; temp[ 6 ] = axis[ 1 ][ 2 ]; - temp[ 8 ] = axis[ 2 ][ 0 ]; temp[ 9 ] = axis[ 2 ][ 1 ]; temp[ 10 ] = axis[ 2 ][ 2 ]; - + temp[ 0 ] = axis[ 0 ][ 0 ]; temp[ 1 ] = axis[ 0 ][ 1 ]; temp[ 2 ] = axis[ 0 ][ 2 ]; + temp[ 4 ] = axis[ 1 ][ 0 ]; temp[ 5 ] = axis[ 1 ][ 1 ]; temp[ 6 ] = axis[ 1 ][ 2 ]; + temp[ 8 ] = axis[ 2 ][ 0 ]; temp[ 9 ] = axis[ 2 ][ 1 ]; temp[ 10 ] = axis[ 2 ][ 2 ]; + /* scale */ m4x4_scale_by_vec3( temp, scale ); - + /* rotate around z axis */ m4x4_rotate_by_vec3( temp, angles, eXYZ ); - + /* translate */ m4x4_translate_by_vec3( transform, origin ); - + /* tranform into axis space */ m4x4_multiply_by_m4x4( transform, temp ); } - + /* handle z-up models */ else { /* set angles */ VectorSet( angles, 0.0f, 0.0f, angle ); - + /* set matrix */ m4x4_pivoted_transform_by_vec3( transform, origin, angles, eXYZ, scale, vec3_origin ); } - + /* insert the model */ InsertModel( (char *) model->model, 0, 0, transform, NULL, ds->celShader, ds->entityNum, ds->castShadows, ds->recvShadows, 0, ds->lightmapScale, 0, 0, ds->colormod ); - + /* return to sender */ return 1; } } - + /* split the longest edge and map it */ LerpDrawVert( tri[ max ], tri[ ( max + 1 ) % 3 ], &mid ); - + /* recurse to first triangle */ VectorCopy( tri, tri2 ); tri2[ max ] = ∣ @@ -3298,7 +3298,7 @@ int AddSurfaceModelsToTriangle_r( mapDrawSurface_t *ds, surfaceModel_t *model, b return n; } localNumSurfaceModels += n; - + /* recurse to second triangle */ VectorCopy( tri, tri2 ); tri2[ ( max + 1 ) % 3 ] = ∣ @@ -3307,7 +3307,7 @@ int AddSurfaceModelsToTriangle_r( mapDrawSurface_t *ds, surfaceModel_t *model, b return n; } localNumSurfaceModels += n; - + /* return count */ return localNumSurfaceModels; } @@ -3320,158 +3320,158 @@ int AddSurfaceModelsToTriangle_r( mapDrawSurface_t *ds, surfaceModel_t *model, b */ int AddSurfaceModels( mapDrawSurface_t *ds ){ - surfaceModel_t *model; - int i, x, y, n, pw[ 5 ], r, localNumSurfaceModels, iterations; - mesh_t src, *mesh, *subdivided; - bspDrawVert_t centroid, *tri[ 3 ]; - float alpha; - - + surfaceModel_t *model; + int i, x, y, n, pw[ 5 ], r, localNumSurfaceModels, iterations; + mesh_t src, *mesh, *subdivided; + bspDrawVert_t centroid, *tri[ 3 ]; + float alpha; + + /* dummy check */ if ( ds == NULL || ds->shaderInfo == NULL || ds->shaderInfo->surfaceModel == NULL ) { return 0; } - + /* init */ localNumSurfaceModels = 0; - + /* walk the model list */ for ( model = ds->shaderInfo->surfaceModel; model != NULL; model = model->next ) { /* switch on type */ switch ( ds->type ) { - /* handle brush faces and decals */ - case SURFACE_FACE: - case SURFACE_DECAL: - /* calculate centroid */ - memset( ¢roid, 0, sizeof( centroid ) ); - alpha = 0.0f; - - /* walk verts */ + /* handle brush faces and decals */ + case SURFACE_FACE: + case SURFACE_DECAL: + /* calculate centroid */ + memset( ¢roid, 0, sizeof( centroid ) ); + alpha = 0.0f; + + /* walk verts */ for ( i = 0; i < ds->numVerts; i++ ) - { - VectorAdd( centroid.xyz, ds->verts[ i ].xyz, centroid.xyz ); - VectorAdd( centroid.normal, ds->verts[ i ].normal, centroid.normal ); - centroid.st[ 0 ] += ds->verts[ i ].st[ 0 ]; - centroid.st[ 1 ] += ds->verts[ i ].st[ 1 ]; - alpha += ds->verts[ i ].color[ 0 ][ 3 ]; - } - - /* average */ - centroid.xyz[ 0 ] /= ds->numVerts; - centroid.xyz[ 1 ] /= ds->numVerts; - centroid.xyz[ 2 ] /= ds->numVerts; + { + VectorAdd( centroid.xyz, ds->verts[ i ].xyz, centroid.xyz ); + VectorAdd( centroid.normal, ds->verts[ i ].normal, centroid.normal ); + centroid.st[ 0 ] += ds->verts[ i ].st[ 0 ]; + centroid.st[ 1 ] += ds->verts[ i ].st[ 1 ]; + alpha += ds->verts[ i ].color[ 0 ][ 3 ]; + } + + /* average */ + centroid.xyz[ 0 ] /= ds->numVerts; + centroid.xyz[ 1 ] /= ds->numVerts; + centroid.xyz[ 2 ] /= ds->numVerts; if ( VectorNormalize( centroid.normal, centroid.normal ) == 0.0f ) { - VectorCopy( ds->verts[ 0 ].normal, centroid.normal ); - } - centroid.st[ 0 ] /= ds->numVerts; - centroid.st[ 1 ] /= ds->numVerts; - alpha /= ds->numVerts; - centroid.color[ 0 ][ 0 ] = 0xFF; - centroid.color[ 0 ][ 1 ] = 0xFF; - centroid.color[ 0 ][ 2 ] = 0xFF; + VectorCopy( ds->verts[ 0 ].normal, centroid.normal ); + } + centroid.st[ 0 ] /= ds->numVerts; + centroid.st[ 1 ] /= ds->numVerts; + alpha /= ds->numVerts; + centroid.color[ 0 ][ 0 ] = 0xFF; + centroid.color[ 0 ][ 1 ] = 0xFF; + centroid.color[ 0 ][ 2 ] = 0xFF; centroid.color[ 0 ][ 2 ] = ( alpha > 255.0f ? 0xFF : alpha ); - - /* head vert is centroid */ - tri[ 0 ] = ¢roid; - - /* walk fanned triangles */ + + /* head vert is centroid */ + tri[ 0 ] = ¢roid; + + /* walk fanned triangles */ for ( i = 0; i < ds->numVerts; i++ ) - { - /* set triangle */ - tri[ 1 ] = &ds->verts[ i ]; + { + /* set triangle */ + tri[ 1 ] = &ds->verts[ i ]; tri[ 2 ] = &ds->verts[ ( i + 1 ) % ds->numVerts ]; - - /* create models */ - n = AddSurfaceModelsToTriangle_r( ds, model, tri ); + + /* create models */ + n = AddSurfaceModelsToTriangle_r( ds, model, tri ); if ( n < 0 ) { - return n; + return n; } - localNumSurfaceModels += n; - } - break; - - /* handle patches */ - case SURFACE_PATCH: - /* subdivide the surface */ - src.width = ds->patchWidth; - src.height = ds->patchHeight; - src.verts = ds->verts; - //% subdivided = SubdivideMesh( src, 8.0f, 512 ); - iterations = IterationsForCurve( ds->longestCurve, patchSubdivisions ); - subdivided = SubdivideMesh2( src, iterations ); - - /* fit it to the curve and remove colinear verts on rows/columns */ - PutMeshOnCurve( *subdivided ); - mesh = RemoveLinearMeshColumnsRows( subdivided ); - FreeMesh( subdivided ); - - /* subdivide each quad to place the models */ + localNumSurfaceModels += n; + } + break; + + /* handle patches */ + case SURFACE_PATCH: + /* subdivide the surface */ + src.width = ds->patchWidth; + src.height = ds->patchHeight; + src.verts = ds->verts; + //% subdivided = SubdivideMesh( src, 8.0f, 512 ); + iterations = IterationsForCurve( ds->longestCurve, patchSubdivisions ); + subdivided = SubdivideMesh2( src, iterations ); + + /* fit it to the curve and remove colinear verts on rows/columns */ + PutMeshOnCurve( *subdivided ); + mesh = RemoveLinearMeshColumnsRows( subdivided ); + FreeMesh( subdivided ); + + /* subdivide each quad to place the models */ for ( y = 0; y < ( mesh->height - 1 ); y++ ) - { + { for ( x = 0; x < ( mesh->width - 1 ); x++ ) - { - /* set indexes */ + { + /* set indexes */ pw[ 0 ] = x + ( y * mesh->width ); pw[ 1 ] = x + ( ( y + 1 ) * mesh->width ); pw[ 2 ] = x + 1 + ( ( y + 1 ) * mesh->width ); pw[ 3 ] = x + 1 + ( y * mesh->width ); pw[ 4 ] = x + ( y * mesh->width ); /* same as pw[ 0 ] */ - - /* set radix */ + + /* set radix */ r = ( x + y ) & 1; - - /* triangle 1 */ - tri[ 0 ] = &mesh->verts[ pw[ r + 0 ] ]; - tri[ 1 ] = &mesh->verts[ pw[ r + 1 ] ]; - tri[ 2 ] = &mesh->verts[ pw[ r + 2 ] ]; - n = AddSurfaceModelsToTriangle_r( ds, model, tri ); + + /* triangle 1 */ + tri[ 0 ] = &mesh->verts[ pw[ r + 0 ] ]; + tri[ 1 ] = &mesh->verts[ pw[ r + 1 ] ]; + tri[ 2 ] = &mesh->verts[ pw[ r + 2 ] ]; + n = AddSurfaceModelsToTriangle_r( ds, model, tri ); if ( n < 0 ) { - return n; + return n; } - localNumSurfaceModels += n; - - /* triangle 2 */ - tri[ 0 ] = &mesh->verts[ pw[ r + 0 ] ]; - tri[ 1 ] = &mesh->verts[ pw[ r + 2 ] ]; - tri[ 2 ] = &mesh->verts[ pw[ r + 3 ] ]; - n = AddSurfaceModelsToTriangle_r( ds, model, tri ); + localNumSurfaceModels += n; + + /* triangle 2 */ + tri[ 0 ] = &mesh->verts[ pw[ r + 0 ] ]; + tri[ 1 ] = &mesh->verts[ pw[ r + 2 ] ]; + tri[ 2 ] = &mesh->verts[ pw[ r + 3 ] ]; + n = AddSurfaceModelsToTriangle_r( ds, model, tri ); if ( n < 0 ) { - return n; - } - localNumSurfaceModels += n; + return n; } + localNumSurfaceModels += n; } - - /* free the subdivided mesh */ - FreeMesh( mesh ); - break; - - /* handle triangle surfaces */ - case SURFACE_TRIANGLES: - case SURFACE_FORCED_META: - case SURFACE_META: - /* walk the triangle list */ + } + + /* free the subdivided mesh */ + FreeMesh( mesh ); + break; + + /* handle triangle surfaces */ + case SURFACE_TRIANGLES: + case SURFACE_FORCED_META: + case SURFACE_META: + /* walk the triangle list */ for ( i = 0; i < ds->numIndexes; i += 3 ) - { - tri[ 0 ] = &ds->verts[ ds->indexes[ i ] ]; - tri[ 1 ] = &ds->verts[ ds->indexes[ i + 1 ] ]; - tri[ 2 ] = &ds->verts[ ds->indexes[ i + 2 ] ]; - n = AddSurfaceModelsToTriangle_r( ds, model, tri ); + { + tri[ 0 ] = &ds->verts[ ds->indexes[ i ] ]; + tri[ 1 ] = &ds->verts[ ds->indexes[ i + 1 ] ]; + tri[ 2 ] = &ds->verts[ ds->indexes[ i + 2 ] ]; + n = AddSurfaceModelsToTriangle_r( ds, model, tri ); if ( n < 0 ) { - return n; + return n; } - localNumSurfaceModels += n; - } - break; - - /* no support for flares, foghull, etc */ - default: - break; + localNumSurfaceModels += n; + } + break; + + /* no support for flares, foghull, etc */ + default: + break; } } - + /* return count */ return localNumSurfaceModels; } @@ -3484,12 +3484,12 @@ int AddSurfaceModels( mapDrawSurface_t *ds ){ */ void AddEntitySurfaceModels( entity_t *e ){ - int i; - - + int i; + + /* note it */ Sys_FPrintf( SYS_VRB, "--- AddEntitySurfaceModels ---\n" ); - + /* walk the surface list */ for ( i = e->firstDrawSurf; i < numMapDrawSurfs; i++ ) numSurfaceModels += AddSurfaceModels( &mapDrawSurfs[ i ] ); @@ -3503,17 +3503,17 @@ void AddEntitySurfaceModels( entity_t *e ){ */ static void VolumeColorMods( entity_t *e, mapDrawSurface_t *ds ){ - int i, j; - float d; - brush_t *b; - plane_t *plane; - - + int i, j; + float d; + brush_t *b; + plane_t *plane; + + /* early out */ if ( e->colorModBrushes == NULL ) { return; } - + /* iterate brushes */ for ( b = e->colorModBrushes; b != NULL; b = b->nextColorModBrush ) { @@ -3521,14 +3521,14 @@ static void VolumeColorMods( entity_t *e, mapDrawSurface_t *ds ){ if ( b->entityNum != 0 && b->entityNum != ds->entityNum ) { continue; } - + /* test bbox */ if ( b->mins[ 0 ] > ds->maxs[ 0 ] || b->maxs[ 0 ] < ds->mins[ 0 ] || - b->mins[ 1 ] > ds->maxs[ 1 ] || b->maxs[ 1 ] < ds->mins[ 1 ] || + b->mins[ 1 ] > ds->maxs[ 1 ] || b->maxs[ 1 ] < ds->mins[ 1 ] || b->mins[ 2 ] > ds->maxs[ 2 ] || b->maxs[ 2 ] < ds->mins[ 2 ] ) { continue; } - + /* iterate verts */ for ( i = 0; i < ds->numVerts; i++ ) { @@ -3540,15 +3540,15 @@ static void VolumeColorMods( entity_t *e, mapDrawSurface_t *ds ){ d = DotProduct( ds->verts[ i ].xyz, plane->normal ) - plane->dist; if ( d > 1.0f ) { break; + } } - } - + /* apply colormods */ if ( j == b->numsides ) { ColorMod( b->contentShader->colorMod, 1, &ds->verts[ i ] ); + } } } - } } @@ -3561,18 +3561,18 @@ static void VolumeColorMods( entity_t *e, mapDrawSurface_t *ds ){ */ void FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree ){ - int i, j; - mapDrawSurface_t *ds; - shaderInfo_t *si; - vec3_t origin, mins, maxs; - int refs; - int numSurfs, numRefs, numSkyboxSurfaces; - qboolean sb; - - + int i, j; + mapDrawSurface_t *ds; + shaderInfo_t *si; + vec3_t origin, mins, maxs; + int refs; + int numSurfs, numRefs, numSkyboxSurfaces; + qboolean sb; + + /* note it */ Sys_FPrintf( SYS_VRB, "--- FilterDrawsurfsIntoTree ---\n" ); - + /* filter surfaces into the tree */ numSurfs = 0; numRefs = 0; @@ -3584,7 +3584,7 @@ void FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree ){ if ( ds->numVerts == 0 && ds->type != SURFACE_FLARE && ds->type != SURFACE_SHADER ) { continue; } - + /* get shader */ si = ds->shaderInfo; @@ -3600,138 +3600,138 @@ void FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree ){ /* refs initially zero */ refs = 0; - + /* apply texture coordinate mods */ for ( j = 0; j < ds->numVerts; j++ ) TCMod( si->mod, ds->verts[ j ].st ); - + /* ydnar: apply shader colormod */ ColorMod( ds->shaderInfo->colorMod, ds->numVerts, ds->verts ); - + /* ydnar: apply brush colormod */ VolumeColorMods( e, ds ); - + /* ydnar: make fur surfaces */ if ( si->furNumLayers > 0 ) { Fur( ds ); } - + /* ydnar/sd: make foliage surfaces */ if ( si->foliage != NULL ) { Foliage( ds ); } - + /* create a flare surface if necessary */ if ( si->flareShader != NULL && si->flareShader[ 0 ] ) { AddSurfaceFlare( ds, e->origin ); } - + /* ydnar: don't emit nodraw surfaces (like nodraw fog) */ if ( ( si->compileFlags & C_NODRAW ) && ds->type != SURFACE_PATCH ) { continue; } - + /* ydnar: bias the surface textures */ BiasSurfaceTextures( ds ); - + /* ydnar: globalizing of fog volume handling (eek a hack) */ if ( e != entities && si->noFog == qfalse ) { /* find surface origin and offset by entity origin */ VectorAdd( ds->mins, ds->maxs, origin ); VectorScale( origin, 0.5f, origin ); VectorAdd( origin, e->origin, origin ); - + VectorAdd( ds->mins, e->origin, mins ); VectorAdd( ds->maxs, e->origin, maxs ); - + /* set the fog number for this surface */ - ds->fogNum = FogForBounds( mins, maxs, 1.0f ); //% FogForPoint( origin, 0.0f ); + ds->fogNum = FogForBounds( mins, maxs, 1.0f ); //% FogForPoint( origin, 0.0f ); } } - + /* ydnar: remap shader */ if ( ds->shaderInfo->remapShader && ds->shaderInfo->remapShader[ 0 ] ) { ds->shaderInfo = ShaderInfoForShader( ds->shaderInfo->remapShader ); } - + /* ydnar: gs mods: handle the various types of surfaces */ switch ( ds->type ) { - /* handle brush faces */ - case SURFACE_FACE: - case SURFACE_DECAL: + /* handle brush faces */ + case SURFACE_FACE: + case SURFACE_DECAL: if ( refs == 0 ) { - refs = FilterFaceIntoTree( ds, tree ); + refs = FilterFaceIntoTree( ds, tree ); } if ( refs > 0 ) { - EmitFaceSurface( ds ); + EmitFaceSurface( ds ); } - break; - - /* handle patches */ - case SURFACE_PATCH: + break; + + /* handle patches */ + case SURFACE_PATCH: if ( refs == 0 ) { - refs = FilterPatchIntoTree( ds, tree ); + refs = FilterPatchIntoTree( ds, tree ); } if ( refs > 0 ) { - EmitPatchSurface( e, ds ); + EmitPatchSurface( e, ds ); } - break; - - /* handle triangle surfaces */ - case SURFACE_TRIANGLES: - case SURFACE_FORCED_META: - case SURFACE_META: - //% Sys_FPrintf( SYS_VRB, "Surface %4d: [%1d] %4d verts %s\n", numSurfs, ds->planar, ds->numVerts, si->shader ); + break; + + /* handle triangle surfaces */ + case SURFACE_TRIANGLES: + case SURFACE_FORCED_META: + case SURFACE_META: + //% Sys_FPrintf( SYS_VRB, "Surface %4d: [%1d] %4d verts %s\n", numSurfs, ds->planar, ds->numVerts, si->shader ); if ( refs == 0 ) { - refs = FilterTrianglesIntoTree( ds, tree ); + refs = FilterTrianglesIntoTree( ds, tree ); } if ( refs > 0 ) { - EmitTriangleSurface( ds ); + EmitTriangleSurface( ds ); } - break; - - /* handle foliage surfaces (splash damage/wolf et) */ - case SURFACE_FOLIAGE: - //% Sys_FPrintf( SYS_VRB, "Surface %4d: [%d] %4d verts %s\n", numSurfs, ds->numFoliageInstances, ds->numVerts, si->shader ); + break; + + /* handle foliage surfaces (splash damage/wolf et) */ + case SURFACE_FOLIAGE: + //% Sys_FPrintf( SYS_VRB, "Surface %4d: [%d] %4d verts %s\n", numSurfs, ds->numFoliageInstances, ds->numVerts, si->shader ); if ( refs == 0 ) { - refs = FilterFoliageIntoTree( ds, tree ); + refs = FilterFoliageIntoTree( ds, tree ); } if ( refs > 0 ) { - EmitTriangleSurface( ds ); + EmitTriangleSurface( ds ); } - break; - - /* handle foghull surfaces */ - case SURFACE_FOGHULL: + break; + + /* handle foghull surfaces */ + case SURFACE_FOGHULL: if ( refs == 0 ) { - refs = AddReferenceToTree_r( ds, tree->headnode, qfalse ); + refs = AddReferenceToTree_r( ds, tree->headnode, qfalse ); } if ( refs > 0 ) { - EmitTriangleSurface( ds ); + EmitTriangleSurface( ds ); } - break; - - /* handle flares */ - case SURFACE_FLARE: + break; + + /* handle flares */ + case SURFACE_FLARE: if ( refs == 0 ) { - refs = FilterFlareSurfIntoTree( ds, tree ); + refs = FilterFlareSurfIntoTree( ds, tree ); } if ( refs > 0 ) { - EmitFlareSurface( ds ); - } - break; - - /* handle shader-only surfaces */ - case SURFACE_SHADER: - refs = 1; EmitFlareSurface( ds ); - break; - - /* no references */ - default: - refs = 0; - break; + } + break; + + /* handle shader-only surfaces */ + case SURFACE_SHADER: + refs = 1; + EmitFlareSurface( ds ); + break; + + /* no references */ + default: + refs = 0; + break; } /* maybe surface got marked as skybox again */ @@ -3739,28 +3739,28 @@ void FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree ){ if ( sb ) { ds->skybox = qfalse; } - + /* tot up the references */ if ( refs > 0 ) { /* tot up counts */ numSurfs++; numRefs += refs; - + /* emit extra surface data */ SetSurfaceExtra( ds, numBSPDrawSurfaces - 1 ); //% Sys_FPrintf( SYS_VRB, "%d verts %d indexes\n", ds->numVerts, ds->numIndexes ); - + /* one last sanity check */ { - bspDrawSurface_t *out; + bspDrawSurface_t *out; out = &bspDrawSurfaces[ numBSPDrawSurfaces - 1 ]; if ( out->numVerts == 3 && out->numIndexes > 3 ) { Sys_Printf( "\nWARNING: Potentially bad %s surface (%d: %d, %d)\n %s\n", - surfaceTypes[ ds->type ], - numBSPDrawSurfaces - 1, out->numVerts, out->numIndexes, si->shader ); + surfaceTypes[ ds->type ], + numBSPDrawSurfaces - 1, out->numVerts, out->numIndexes, si->shader ); } } - + /* ydnar: handle skybox surfaces */ if ( ds->skybox ) { MakeSkyboxSurface( ds ); @@ -3768,7 +3768,7 @@ void FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree ){ } } } - + /* emit some statistics */ Sys_FPrintf( SYS_VRB, "%9d references\n", numRefs ); Sys_FPrintf( SYS_VRB, "%9d (%d) emitted drawsurfs\n", numSurfs, numBSPDrawSurfaces ); @@ -3779,6 +3779,6 @@ void FilterDrawsurfsIntoTree( entity_t *e, tree_t *tree ){ Sys_FPrintf( SYS_VRB, "%9d skybox surfaces generated\n", numSkyboxSurfaces ); for ( i = 0; i < NUM_SURFACE_TYPES; i++ ) Sys_FPrintf( SYS_VRB, "%9d %s surfaces\n", numSurfacesByType[ i ], surfaceTypes[ i ] ); - + Sys_FPrintf( SYS_VRB, "%9d redundant indexes supressed, saving %d Kbytes\n", numRedundantIndexes, ( numRedundantIndexes * 4 / 1024 ) ); } diff --git a/tools/quake3/q3map2/surface_foliage.c b/tools/quake3/q3map2/surface_foliage.c index b4b44189..b0d57539 100644 --- a/tools/quake3/q3map2/surface_foliage.c +++ b/tools/quake3/q3map2/surface_foliage.c @@ -37,10 +37,10 @@ -#define MAX_FOLIAGE_INSTANCES 8192 +#define MAX_FOLIAGE_INSTANCES 8192 -static int numFoliageInstances; -static foliageInstance_t foliageInstances[ MAX_FOLIAGE_INSTANCES ]; +static int numFoliageInstances; +static foliageInstance_t foliageInstances[ MAX_FOLIAGE_INSTANCES ]; @@ -51,41 +51,41 @@ static foliageInstance_t foliageInstances[ MAX_FOLIAGE_INSTANCES ]; */ static void SubdivideFoliageTriangle_r( mapDrawSurface_t *ds, foliage_t *foliage, bspDrawVert_t **tri ){ - bspDrawVert_t mid, *tri2[ 3 ]; - int max; - - + bspDrawVert_t mid, *tri2[ 3 ]; + int max; + + /* limit test */ if ( numFoliageInstances >= MAX_FOLIAGE_INSTANCES ) { return; } - + /* plane test */ { - vec4_t plane; - - + vec4_t plane; + + /* make a plane */ if ( !PlaneFromPoints( plane, tri[ 0 ]->xyz, tri[ 1 ]->xyz, tri[ 2 ]->xyz ) ) { return; } - + /* if normal is too far off vertical, then don't place an instance */ if ( plane[ 2 ] < 0.5f ) { return; + } } - } - + /* subdivide calc */ { - int i; - float *a, *b, dx, dy, dz, dist, maxDist; - foliageInstance_t *fi; - - + int i; + float *a, *b, dx, dy, dz, dist, maxDist; + foliageInstance_t *fi; + + /* get instance */ fi = &foliageInstances[ numFoliageInstances ]; - + /* find the longest edge and split it */ max = -1; maxDist = 0.0f; @@ -96,29 +96,29 @@ static void SubdivideFoliageTriangle_r( mapDrawSurface_t *ds, foliage_t *foliage /* get verts */ a = tri[ i ]->xyz; b = tri[ ( i + 1 ) % 3 ]->xyz; - + /* get dists */ dx = a[ 0 ] - b[ 0 ]; dy = a[ 1 ] - b[ 1 ]; dz = a[ 2 ] - b[ 2 ]; dist = ( dx * dx ) + ( dy * dy ) + ( dz * dz ); - + /* longer? */ if ( dist > maxDist ) { maxDist = dist; max = i; } - + /* add to centroid */ VectorAdd( fi->xyz, tri[ i ]->xyz, fi->xyz ); VectorAdd( fi->normal, tri[ i ]->normal, fi->normal ); } - + /* is the triangle small enough? */ if ( maxDist <= ( foliage->density * foliage->density ) ) { - float alpha, odds, r; - - + float alpha, odds, r; + + /* get average alpha */ if ( foliage->inverseAlpha == 2 ) { alpha = 1.0f; @@ -131,36 +131,36 @@ static void SubdivideFoliageTriangle_r( mapDrawSurface_t *ds, foliage_t *foliage } if ( alpha < 0.75f ) { return; + } } - } - + /* roll the dice */ odds = foliage->odds * alpha; r = Random(); if ( r > odds ) { return; } - + /* scale centroid */ VectorScale( fi->xyz, 0.33333333f, fi->xyz ); if ( VectorNormalize( fi->normal, fi->normal ) == 0.0f ) { return; } - + /* add to count and return */ numFoliageInstances++; return; } } - + /* split the longest edge and map it */ LerpDrawVert( tri[ max ], tri[ ( max + 1 ) % 3 ], &mid ); - + /* recurse to first triangle */ VectorCopy( tri, tri2 ); tri2[ max ] = ∣ SubdivideFoliageTriangle_r( ds, foliage, tri2 ); - + /* recurse to second triangle */ VectorCopy( tri, tri2 ); tri2[ ( max + 1 ) % 3 ] = ∣ @@ -175,138 +175,138 @@ static void SubdivideFoliageTriangle_r( mapDrawSurface_t *ds, foliage_t *foliage */ void Foliage( mapDrawSurface_t *src ){ - int i, j, k, x, y, pw[ 5 ], r, oldNumMapDrawSurfs; - mapDrawSurface_t *ds; - shaderInfo_t *si; - foliage_t *foliage; - mesh_t srcMesh, *subdivided, *mesh; - bspDrawVert_t *verts, *dv[ 3 ], *fi; - vec3_t scale; - m4x4_t transform; - - + int i, j, k, x, y, pw[ 5 ], r, oldNumMapDrawSurfs; + mapDrawSurface_t *ds; + shaderInfo_t *si; + foliage_t *foliage; + mesh_t srcMesh, *subdivided, *mesh; + bspDrawVert_t *verts, *dv[ 3 ], *fi; + vec3_t scale; + m4x4_t transform; + + /* get shader */ si = src->shaderInfo; if ( si == NULL || si->foliage == NULL ) { return; } - + /* do every foliage */ for ( foliage = si->foliage; foliage != NULL; foliage = foliage->next ) { /* zero out */ numFoliageInstances = 0; - + /* map the surface onto the lightmap origin/cluster/normal buffers */ switch ( src->type ) { - case SURFACE_META: - case SURFACE_FORCED_META: - case SURFACE_TRIANGLES: - /* get verts */ - verts = src->verts; - - /* map the triangles */ + case SURFACE_META: + case SURFACE_FORCED_META: + case SURFACE_TRIANGLES: + /* get verts */ + verts = src->verts; + + /* map the triangles */ for ( i = 0; i < src->numIndexes; i += 3 ) - { - dv[ 0 ] = &verts[ src->indexes[ i ] ]; - dv[ 1 ] = &verts[ src->indexes[ i + 1 ] ]; - dv[ 2 ] = &verts[ src->indexes[ i + 2 ] ]; - SubdivideFoliageTriangle_r( src, foliage, dv ); - } - break; - - case SURFACE_PATCH: - /* make a mesh from the drawsurf */ - srcMesh.width = src->patchWidth; - srcMesh.height = src->patchHeight; - srcMesh.verts = src->verts; - subdivided = SubdivideMesh( srcMesh, 8, 512 ); - - /* fit it to the curve and remove colinear verts on rows/columns */ - PutMeshOnCurve( *subdivided ); - mesh = RemoveLinearMeshColumnsRows( subdivided ); - FreeMesh( subdivided ); - - /* get verts */ - verts = mesh->verts; - - /* map the mesh quads */ + { + dv[ 0 ] = &verts[ src->indexes[ i ] ]; + dv[ 1 ] = &verts[ src->indexes[ i + 1 ] ]; + dv[ 2 ] = &verts[ src->indexes[ i + 2 ] ]; + SubdivideFoliageTriangle_r( src, foliage, dv ); + } + break; + + case SURFACE_PATCH: + /* make a mesh from the drawsurf */ + srcMesh.width = src->patchWidth; + srcMesh.height = src->patchHeight; + srcMesh.verts = src->verts; + subdivided = SubdivideMesh( srcMesh, 8, 512 ); + + /* fit it to the curve and remove colinear verts on rows/columns */ + PutMeshOnCurve( *subdivided ); + mesh = RemoveLinearMeshColumnsRows( subdivided ); + FreeMesh( subdivided ); + + /* get verts */ + verts = mesh->verts; + + /* map the mesh quads */ for ( y = 0; y < ( mesh->height - 1 ); y++ ) - { + { for ( x = 0; x < ( mesh->width - 1 ); x++ ) - { - /* set indexes */ + { + /* set indexes */ pw[ 0 ] = x + ( y * mesh->width ); pw[ 1 ] = x + ( ( y + 1 ) * mesh->width ); pw[ 2 ] = x + 1 + ( ( y + 1 ) * mesh->width ); pw[ 3 ] = x + 1 + ( y * mesh->width ); pw[ 4 ] = x + ( y * mesh->width ); /* same as pw[ 0 ] */ - - /* set radix */ + + /* set radix */ r = ( x + y ) & 1; - - /* get drawverts and map first triangle */ - dv[ 0 ] = &verts[ pw[ r + 0 ] ]; - dv[ 1 ] = &verts[ pw[ r + 1 ] ]; - dv[ 2 ] = &verts[ pw[ r + 2 ] ]; - SubdivideFoliageTriangle_r( src, foliage, dv ); - - /* get drawverts and map second triangle */ - dv[ 0 ] = &verts[ pw[ r + 0 ] ]; - dv[ 1 ] = &verts[ pw[ r + 2 ] ]; - dv[ 2 ] = &verts[ pw[ r + 3 ] ]; - SubdivideFoliageTriangle_r( src, foliage, dv ); - } + + /* get drawverts and map first triangle */ + dv[ 0 ] = &verts[ pw[ r + 0 ] ]; + dv[ 1 ] = &verts[ pw[ r + 1 ] ]; + dv[ 2 ] = &verts[ pw[ r + 2 ] ]; + SubdivideFoliageTriangle_r( src, foliage, dv ); + + /* get drawverts and map second triangle */ + dv[ 0 ] = &verts[ pw[ r + 0 ] ]; + dv[ 1 ] = &verts[ pw[ r + 2 ] ]; + dv[ 2 ] = &verts[ pw[ r + 3 ] ]; + SubdivideFoliageTriangle_r( src, foliage, dv ); } - - /* free the mesh */ - FreeMesh( mesh ); - break; - - default: - break; + } + + /* free the mesh */ + FreeMesh( mesh ); + break; + + default: + break; } - + /* any origins? */ if ( numFoliageInstances < 1 ) { continue; } - + /* remember surface count */ oldNumMapDrawSurfs = numMapDrawSurfs; - + /* set transform matrix */ VectorSet( scale, foliage->scale, foliage->scale, foliage->scale ); m4x4_scale_for_vec3( transform, scale ); - + /* add the model to the bsp */ InsertModel( foliage->model, 0, 0, transform, NULL, NULL, src->entityNum, src->castShadows, src->recvShadows, 0, src->lightmapScale, 0, 0, src->colormod ); - + /* walk each new surface */ for ( i = oldNumMapDrawSurfs; i < numMapDrawSurfs; i++ ) { /* get surface */ ds = &mapDrawSurfs[ i ]; - + /* set up */ ds->type = SURFACE_FOLIAGE; ds->numFoliageInstances = numFoliageInstances; - + /* a wee hack */ ds->patchWidth = ds->numFoliageInstances; ds->patchHeight = ds->numVerts; - + /* set fog to be same as source surface */ ds->fogNum = src->fogNum; - + /* add a drawvert for every instance */ verts = safe_malloc( ( ds->numVerts + ds->numFoliageInstances ) * sizeof( *verts ) ); memset( verts, 0, ( ds->numVerts + ds->numFoliageInstances ) * sizeof( *verts ) ); memcpy( verts, ds->verts, ds->numVerts * sizeof( *verts ) ); free( ds->verts ); ds->verts = verts; - + /* copy the verts */ for ( j = 0; j < ds->numFoliageInstances; j++ ) { @@ -326,7 +326,7 @@ void Foliage( mapDrawSurface_t *src ){ fi->color[ k ][ 3 ] = 255; } } - + /* increment */ ds->numVerts += ds->numFoliageInstances; }