From bf803dd851539f0d5f806f12a1e2ab93fdddae08 Mon Sep 17 00:00:00 2001 From: Garux Date: Tue, 1 Aug 2017 13:33:37 +0300 Subject: [PATCH] Q3map2: * -bounceColorRatio 0..1 (ratio of colorizing sample by texture) * -debugclip: autoclip debug, uses shaders debugclip, debugclip2 * >2GB makefile option, allows up to 3GB ram on 32bit, 4GB on 64bit * speedup patch to use fast sqrt at some points of light phase, where precision is not needed Radiant: binds... * paste to camera - shift+v (alt+v was leading to texBro-View menu) --- Makefile | 2 +- libs/mathlib.h | 8 +- libs/mathlib/mathlib.c | 34 +++--- radiant/brushmanip.cpp | 4 + radiant/mainframe.cpp | 2 +- tools/quake3/q3map2/bsp.c | 16 ++- tools/quake3/q3map2/light.c | 19 +++- tools/quake3/q3map2/light_bounce.c | 14 ++- tools/quake3/q3map2/light_trace.c | 175 +++++++++++++++++------------ tools/quake3/q3map2/map.c | 9 +- tools/quake3/q3map2/model.c | 15 ++- tools/quake3/q3map2/q3map2.h | 5 +- 12 files changed, 197 insertions(+), 106 deletions(-) diff --git a/Makefile b/Makefile index 9eee1212..e2d56e38 100644 --- a/Makefile +++ b/Makefile @@ -482,7 +482,7 @@ endif %.o: %.c $(if $(findstring $(DEPEND_ON_MAKEFILE),yes),$(wildcard Makefile*),) | dependencies-check $(CC) $< $(CFLAGS) $(CFLAGS_COMMON) $(CPPFLAGS_EXTRA) $(CPPFLAGS_COMMON) $(CPPFLAGS) $(TARGET_ARCH) -c -o $@ - +$(INSTALLDIR)/q3map2.$(EXE): LDFLAGS_EXTRA := -Wl,--large-address-aware $(INSTALLDIR)/q3map2.$(EXE): LIBS_EXTRA := $(LIBS_XML) $(LIBS_GLIB) $(LIBS_PNG) $(LIBS_JPEG) $(LIBS_ZLIB) $(INSTALLDIR)/q3map2.$(EXE): CPPFLAGS_EXTRA := $(CPPFLAGS_XML) $(CPPFLAGS_GLIB) $(CPPFLAGS_PNG) $(CPPFLAGS_JPEG) -Itools/quake3/common -Ilibs -Iinclude $(INSTALLDIR)/q3map2.$(EXE): \ diff --git a/libs/mathlib.h b/libs/mathlib.h index 64f3f6e4..fb135b8a 100644 --- a/libs/mathlib.h +++ b/libs/mathlib.h @@ -101,7 +101,13 @@ void _CrossProduct( vec3_t v1, vec3_t v2, vec3_t cross ); // I need this define in order to test some of the regression tests from time to time. // This define affect the precision of VectorNormalize() function only. #define MATHLIB_VECTOR_NORMALIZE_PRECISION_FIX 1 -vec_t VectorNormalize( const vec3_t in, vec3_t out ); +vec_t VectorAccurateNormalize( const vec3_t in, vec3_t out ); +vec_t VectorFastNormalize( const vec3_t in, vec3_t out ); +#if MATHLIB_VECTOR_NORMALIZE_PRECISION_FIX +#define VectorNormalize VectorAccurateNormalize +#else +#define VectorNormalize VectorFastNormalize +#endif vec_t ColorNormalize( const vec3_t in, vec3_t out ); void VectorInverse( vec3_t v ); void VectorPolar( vec3_t v, float radius, float theta, float phi ); diff --git a/libs/mathlib/mathlib.c b/libs/mathlib/mathlib.c index ce6cfdc2..642f9842 100644 --- a/libs/mathlib/mathlib.c +++ b/libs/mathlib/mathlib.c @@ -153,9 +153,7 @@ void _VectorCopy( vec3_t in, vec3_t out ){ out[2] = in[2]; } -vec_t VectorNormalize( const vec3_t in, vec3_t out ) { - -#if MATHLIB_VECTOR_NORMALIZE_PRECISION_FIX +vec_t VectorAccurateNormalize( const vec3_t in, vec3_t out ) { // The sqrt() function takes double as an input and returns double as an // output according the the man pages on Debian and on FreeBSD. Therefore, @@ -179,26 +177,30 @@ vec_t VectorNormalize( const vec3_t in, vec3_t out ) { out[2] = (vec_t) ( z / length ); return (vec_t) length; +} -#else +vec_t VectorFastNormalize( const vec3_t in, vec3_t out ) { - vec_t length, ilength; + // SmileTheory: This is ioquake3's VectorNormalize2 + // for when accuracy matters less than speed + float length, ilength; - length = (vec_t)sqrt( in[0] * in[0] + in[1] * in[1] + in[2] * in[2] ); - if ( length == 0 ) { + length = in[0] * in[0] + in[1] * in[1] + in[2] * in[2]; + + if ( length ) { + /* writing it this way allows gcc to recognize that rsqrt can be used */ + ilength = 1 / (float)sqrt( length ); + /* sqrt(length) = length * (1 / sqrt(length)) */ + length *= ilength; + out[0] = in[0] * ilength; + out[1] = in[1] * ilength; + out[2] = in[2] * ilength; + } + else { VectorClear( out ); - return 0; } - ilength = 1.0f / length; - out[0] = in[0] * ilength; - out[1] = in[1] * ilength; - out[2] = in[2] * ilength; - return length; - -#endif - } vec_t ColorNormalize( const vec3_t in, vec3_t out ) { diff --git a/radiant/brushmanip.cpp b/radiant/brushmanip.cpp index 79b84657..8e45973c 100644 --- a/radiant/brushmanip.cpp +++ b/radiant/brushmanip.cpp @@ -1024,6 +1024,9 @@ filter_brush_any_face g_filter_brush_liquids( &g_filter_face_liquids ); filter_face_shader g_filter_face_hint( "textures/common/hint" ); filter_brush_any_face g_filter_brush_hint( &g_filter_face_hint ); +filter_face_shader g_filter_face_hintlocal( "textures/common/hintlocal" ); +filter_brush_any_face g_filter_brush_hintlocal( &g_filter_face_hintlocal ); + filter_face_shader g_filter_face_hint_q2( "textures/hint" ); filter_brush_any_face g_filter_brush_hint_q2( &g_filter_face_hint_q2 ); @@ -1065,6 +1068,7 @@ void BrushFilters_construct(){ add_face_filter( g_filter_face_caulk_ja, EXCLUDE_CAULK ); add_brush_filter( g_filter_brush_liquids, EXCLUDE_LIQUIDS ); add_brush_filter( g_filter_brush_hint, EXCLUDE_HINTSSKIPS ); + add_brush_filter( g_filter_brush_hintlocal, EXCLUDE_HINTSSKIPS ); add_brush_filter( g_filter_brush_hint_q2, EXCLUDE_HINTSSKIPS ); add_brush_filter( g_filter_brush_hint_ja, EXCLUDE_HINTSSKIPS ); add_brush_filter( g_filter_brush_clusterportal, EXCLUDE_CLUSTERPORTALS ); diff --git a/radiant/mainframe.cpp b/radiant/mainframe.cpp index 8fb38e32..26e337a4 100644 --- a/radiant/mainframe.cpp +++ b/radiant/mainframe.cpp @@ -3198,7 +3198,7 @@ void MainFrame_Construct(){ GlobalCommands_insert( "Redo", FreeCaller(), Accelerator( 'Y', (GdkModifierType)GDK_CONTROL_MASK ) ); GlobalCommands_insert( "Copy", FreeCaller(), Accelerator( 'C', (GdkModifierType)GDK_CONTROL_MASK ) ); GlobalCommands_insert( "Paste", FreeCaller(), Accelerator( 'V', (GdkModifierType)GDK_CONTROL_MASK ) ); - GlobalCommands_insert( "PasteToCamera", FreeCaller(), Accelerator( 'V', (GdkModifierType)GDK_MOD1_MASK ) ); + GlobalCommands_insert( "PasteToCamera", FreeCaller(), Accelerator( 'V', (GdkModifierType)GDK_SHIFT_MASK ) ); GlobalCommands_insert( "CloneSelection", FreeCaller(), Accelerator( GDK_space ) ); GlobalCommands_insert( "CloneSelectionAndMakeUnique", FreeCaller(), Accelerator( GDK_space, (GdkModifierType)GDK_SHIFT_MASK ) ); // GlobalCommands_insert( "DeleteSelection", FreeCaller(), Accelerator( GDK_BackSpace ) ); diff --git a/tools/quake3/q3map2/bsp.c b/tools/quake3/q3map2/bsp.c index 98d399c9..2edf9f5d 100644 --- a/tools/quake3/q3map2/bsp.c +++ b/tools/quake3/q3map2/bsp.c @@ -319,6 +319,10 @@ void ProcessWorldModel( void ){ /* check for patches with adjacent edges that need to lod together */ PatchMapDrawSurfs( e ); + if ( debugClip ) { + AddTriangleModels( e ); + } + /* build an initial bsp tree using all of the sides of all of the structural brushes */ faces = MakeStructuralBSPFaceList( entities[ 0 ].brushes ); tree = FaceBSP( faces ); @@ -387,7 +391,9 @@ void ProcessWorldModel( void ){ FloodAreas( tree ); /* create drawsurfs for triangle models */ - AddTriangleModels( e ); + if ( !debugClip ) { + AddTriangleModels( e ); + } /* create drawsurfs for surface models */ AddEntitySurfaceModels( e ); @@ -945,6 +951,14 @@ int BSPMain( int argc, char **argv ){ Sys_Printf( "Debug portal surfaces enabled\n" ); debugPortals = qtrue; } + else if ( !strcmp( argv[ i ], "-debugclip" ) ) { + Sys_Printf( "Debug model clip enabled\n" ); + debugClip = qtrue; + } + else if ( !strcmp( argv[ i ], "-snapmodelclip" ) ) { + Sys_Printf( "Snapping model clip enabled\n" ); + snapModelClip = qtrue; + } else if ( !strcmp( argv[ i ], "-sRGBtex" ) ) { texturesRGB = qtrue; Sys_Printf( "Textures are in sRGB\n" ); diff --git a/tools/quake3/q3map2/light.c b/tools/quake3/q3map2/light.c index cdd9819f..900e1fca 100644 --- a/tools/quake3/q3map2/light.c +++ b/tools/quake3/q3map2/light.c @@ -720,7 +720,7 @@ float PointToPolygonFormFactor( const vec3_t point, const vec3_t normal, const w for ( i = 0; i < w->numpoints; i++ ) { VectorSubtract( w->p[ i ], point, dirs[ i ] ); - VectorNormalize( dirs[ i ], dirs[ i ] ); + VectorFastNormalize( dirs[ i ], dirs[ i ] ); } /* duplicate first vertex to avoid mod operation */ @@ -746,7 +746,7 @@ float PointToPolygonFormFactor( const vec3_t point, const vec3_t normal, const w angle = acos( dot ); CrossProduct( dirs[ i ], dirs[ j ], triVector ); - if ( VectorNormalize( triVector, triNormal ) < 0.0001f ) { + if ( VectorFastNormalize( triVector, triNormal ) < 0.0001f ) { continue; } @@ -2260,6 +2260,19 @@ int LightMain( int argc, char **argv ){ Sys_Printf( "No lightmaps yo\n" ); } + else if ( !strcmp( argv[ i ], "-bouncecolorratio" ) ) { + f = atof( argv[ i + 1 ] ); + bounceColorRatio *= f; + if ( bounceColorRatio > 1 ) { + bounceColorRatio = 1; + } + if ( bounceColorRatio < 0 ) { + bounceColorRatio = 0; + } + Sys_Printf( "Bounce color ratio set to %f\n", bounceColorRatio ); + i++; + } + else if ( !strcmp( argv[ i ], "-bouncescale" ) ) { f = atof( argv[ i + 1 ] ); bounceScale *= f; @@ -2760,7 +2773,7 @@ int LightMain( int argc, char **argv ){ if ( ( atof( argv[ i + 1 ] ) != 0 ) && ( atof( argv[ i + 1 ] )) < 1 ) { noVertexLighting = ( atof( argv[ i + 1 ] ) ); i++; - Sys_Printf( "Setting vertex lighting globally to %d\n", noVertexLighting ); + Sys_Printf( "Setting vertex lighting globally to %f\n", noVertexLighting ); } else{ Sys_Printf( "Disabling vertex lighting\n" ); diff --git a/tools/quake3/q3map2/light_bounce.c b/tools/quake3/q3map2/light_bounce.c index 37d8c4e5..82aacdb5 100644 --- a/tools/quake3/q3map2/light_bounce.c +++ b/tools/quake3/q3map2/light_bounce.c @@ -256,7 +256,7 @@ qboolean RadSampleImage( byte *pixels, int width, int height, float st[ 2 ], flo #define SAMPLE_GRANULARITY 6 static void RadSample( int lightmapNum, bspDrawSurface_t *ds, rawLightmap_t *lm, shaderInfo_t *si, radWinding_t *rw, vec3_t average, vec3_t gradient, int *style ){ - int i, j, k, l, v, x, y, samples; + int i, j, k, l, v, x, y, samples, avgcolor; vec3_t color, mins, maxs; vec4_t textureColor; float alpha, alphaI, bf; @@ -290,8 +290,10 @@ static void RadSample( int lightmapNum, bspDrawSurface_t *ds, rawLightmap_t *lm, VectorCopy( si->averageColor, textureColor ); textureColor[ 4 ] = 255.0f; } + avgcolor = ( textureColor[ 0 ] + textureColor[ 1 ] + textureColor[ 2 ] ) / 3; for ( i = 0; i < 3; i++ ) - color[ i ] = ( textureColor[ i ] / 255 ) * ( rw->verts[ samples ].color[ lightmapNum ][ i ] / 255.0f ); + color[ i ] = ( ( textureColor[ i ] * bounceColorRatio + ( avgcolor * ( 1 - bounceColorRatio ) ) ) / 255 ) * ( rw->verts[ samples ].color[ lightmapNum ][ i ] / 255.0f ); +// color[ i ] = ( textureColor[ i ] / 255 ) * ( rw->verts[ samples ].color[ lightmapNum ][ i ] / 255.0f ); AddPointToBounds( color, mins, maxs ); VectorAdd( average, color, average ); @@ -374,9 +376,11 @@ static void RadSample( int lightmapNum, bspDrawSurface_t *ds, rawLightmap_t *lm, VectorCopy( si->averageColor, textureColor ); textureColor[ 4 ] = 255; } - for ( i = 0; i < 3; i++ ) - color[ i ] = ( textureColor[ i ] / 255 ) * ( radLuxel[ i ] / 255 ); - + avgcolor = ( textureColor[ 0 ] + textureColor[ 1 ] + textureColor[ 2 ] ) / 3; + for ( l = 0; l < 3; l++ ){ + color[ l ] = ( ( textureColor[ l ] * bounceColorRatio + ( avgcolor * ( 1 - bounceColorRatio ) ) ) / 255 ) * ( radLuxel[ l ] / 255 ); + //Sys_Printf( "%i %i %i %i %i \n", (int) textureColor[ 0 ], (int) textureColor[ 1 ], (int) textureColor[ 2 ], (int) avgcolor, (int) color[ i ] ); + } AddPointToBounds( color, mins, maxs ); VectorAdd( average, color, average ); diff --git a/tools/quake3/q3map2/light_trace.c b/tools/quake3/q3map2/light_trace.c index cb22bb44..08606f7e 100644 --- a/tools/quake3/q3map2/light_trace.c +++ b/tools/quake3/q3map2/light_trace.c @@ -1618,103 +1618,132 @@ qboolean TraceWinding( traceWinding_t *tw, trace_t *trace ){ /* TraceLine_r() returns qtrue if something is hit and tracing can stop + + SmileTheory: made half-iterative */ -static qboolean TraceLine_r( int nodeNum, vec3_t origin, vec3_t end, trace_t *trace ){ +#define TRACELINE_R_HALF_ITERATIVE 1 + +#if TRACELINE_R_HALF_ITERATIVE +static qboolean TraceLine_r( int nodeNum, const vec3_t start, const vec3_t end, trace_t *trace ) +#else +static qboolean TraceLine_r( int nodeNum, const vec3_t origin, const vec3_t end, trace_t *trace ) +#endif +{ traceNode_t *node; int side; float front, back, frac; - vec3_t mid; + vec3_t origin, mid; qboolean r; +#if TRACELINE_R_HALF_ITERATIVE + VectorCopy( start, origin ); - /* bogus node number means solid, end tracing unless testing all */ - if ( nodeNum < 0 ) { - VectorCopy( origin, trace->hit ); - trace->passSolid = qtrue; - return qtrue; - } + while ( 1 ) +#endif + { + /* bogus node number means solid, end tracing unless testing all */ + if ( nodeNum < 0 ) { + VectorCopy( origin, trace->hit ); + trace->passSolid = qtrue; + return qtrue; + } - /* get node */ - node = &traceNodes[ nodeNum ]; + /* get node */ + node = &traceNodes[ nodeNum ]; - /* solid? */ - if ( node->type == TRACE_LEAF_SOLID ) { - VectorCopy( origin, trace->hit ); - trace->passSolid = qtrue; - return qtrue; - } + /* solid? */ + if ( node->type == TRACE_LEAF_SOLID ) { + VectorCopy( origin, trace->hit ); + trace->passSolid = qtrue; + return qtrue; + } - /* leafnode? */ - if ( node->type < 0 ) { - /* note leaf and return */ - if ( node->numItems > 0 && trace->numTestNodes < MAX_TRACE_TEST_NODES ) { - trace->testNodes[ trace->numTestNodes++ ] = nodeNum; + /* leafnode? */ + if ( node->type < 0 ) { + /* note leaf and return */ + if ( node->numItems > 0 && trace->numTestNodes < MAX_TRACE_TEST_NODES ) { + trace->testNodes[ trace->numTestNodes++ ] = nodeNum; + } + return qfalse; } - return qfalse; - } - /* ydnar 2003-09-07: don't test branches of the bsp with nothing in them when testall is enabled */ - if ( trace->testAll && node->numItems == 0 ) { - return qfalse; - } + /* ydnar 2003-09-07: don't test branches of the bsp with nothing in them when testall is enabled */ + if ( trace->testAll && node->numItems == 0 ) { + return qfalse; + } - /* classify beginning and end points */ - switch ( node->type ) - { - case PLANE_X: - front = origin[ 0 ] - node->plane[ 3 ]; - back = end[ 0 ] - node->plane[ 3 ]; - break; + /* classify beginning and end points */ + switch ( node->type ) + { + case PLANE_X: + front = origin[ 0 ] - node->plane[ 3 ]; + back = end[ 0 ] - node->plane[ 3 ]; + break; - case PLANE_Y: - front = origin[ 1 ] - node->plane[ 3 ]; - back = end[ 1 ] - node->plane[ 3 ]; - break; + case PLANE_Y: + front = origin[ 1 ] - node->plane[ 3 ]; + back = end[ 1 ] - node->plane[ 3 ]; + break; - case PLANE_Z: - front = origin[ 2 ] - node->plane[ 3 ]; - back = end[ 2 ] - node->plane[ 3 ]; - break; + case PLANE_Z: + front = origin[ 2 ] - node->plane[ 3 ]; + back = end[ 2 ] - node->plane[ 3 ]; + break; - default: - front = DotProduct( origin, node->plane ) - node->plane[ 3 ]; - back = DotProduct( end, node->plane ) - node->plane[ 3 ]; - break; - } + default: + front = DotProduct( origin, node->plane ) - node->plane[ 3 ]; + back = DotProduct( end, node->plane ) - node->plane[ 3 ]; + break; + } - /* entirely in front side? */ - if ( front >= -TRACE_ON_EPSILON && back >= -TRACE_ON_EPSILON ) { - return TraceLine_r( node->children[ 0 ], origin, end, trace ); - } + /* entirely in front side? */ + if ( front >= -TRACE_ON_EPSILON && back >= -TRACE_ON_EPSILON ) { +#if TRACELINE_R_HALF_ITERATIVE + nodeNum = node->children[ 0 ]; + continue; +#else + return TraceLine_r( node->children[ 0 ], origin, end, trace ); +#endif + } - /* entirely on back side? */ - if ( front < TRACE_ON_EPSILON && back < TRACE_ON_EPSILON ) { - return TraceLine_r( node->children[ 1 ], origin, end, trace ); - } + /* entirely on back side? */ + if ( front < TRACE_ON_EPSILON && back < TRACE_ON_EPSILON ) { +#if TRACELINE_R_HALF_ITERATIVE + nodeNum = node->children[ 1 ]; + continue; +#else + return TraceLine_r( node->children[ 1 ], origin, end, trace ); +#endif + } - /* select side */ - side = front < 0; + /* select side */ + side = front < 0; - /* calculate intercept point */ - frac = front / ( front - back ); - mid[ 0 ] = origin[ 0 ] + ( end[ 0 ] - origin[ 0 ] ) * frac; - mid[ 1 ] = origin[ 1 ] + ( end[ 1 ] - origin[ 1 ] ) * frac; - mid[ 2 ] = origin[ 2 ] + ( end[ 2 ] - origin[ 2 ] ) * frac; + /* calculate intercept point */ + frac = front / ( front - back ); + mid[ 0 ] = origin[ 0 ] + ( end[ 0 ] - origin[ 0 ] ) * frac; + mid[ 1 ] = origin[ 1 ] + ( end[ 1 ] - origin[ 1 ] ) * frac; + mid[ 2 ] = origin[ 2 ] + ( end[ 2 ] - origin[ 2 ] ) * frac; - /* fixme: check inhibit radius, then solid nodes and ignore */ + /* fixme: check inhibit radius, then solid nodes and ignore */ - /* set trace hit here */ - //% VectorCopy( mid, trace->hit ); + /* set trace hit here */ + //% VectorCopy( mid, trace->hit ); - /* trace first side */ - r = TraceLine_r( node->children[ side ], origin, mid, trace ); - if ( r ) { - return r; - } + /* trace first side */ + if ( TraceLine_r( node->children[ side ], origin, mid, trace ) ) { + return qtrue; + } - /* trace other side */ - return TraceLine_r( node->children[ !side ], mid, end, trace ); + /* trace other side */ +#if TRACELINE_R_HALF_ITERATIVE + nodeNum = node->children[ !side ]; + VectorCopy( mid, origin ); +#else + return TraceLine_r( node->children[ !side ], mid, end, trace ); +#endif + } } @@ -1791,7 +1820,7 @@ void TraceLine( trace_t *trace ){ float SetupTrace( trace_t *trace ){ VectorSubtract( trace->end, trace->origin, trace->displacement ); - trace->distance = VectorNormalize( trace->displacement, trace->direction ); + trace->distance = VectorFastNormalize( trace->displacement, trace->direction ); VectorCopy( trace->origin, trace->hit ); return trace->distance; } diff --git a/tools/quake3/q3map2/map.c b/tools/quake3/q3map2/map.c index e9bc3921..e0d1fdda 100644 --- a/tools/quake3/q3map2/map.c +++ b/tools/quake3/q3map2/map.c @@ -237,7 +237,7 @@ qboolean SnapNormal( vec3_t normal ){ snaps a plane to normal/distance epsilons */ -void SnapPlane( vec3_t normal, vec_t *dist, vec3_t center ){ +void SnapPlane( vec3_t normal, vec_t *dist ){ // SnapPlane disabled by LordHavoc because it often messes up collision // brushes made from triangles of embedded models, and it has little effect // on anything else (axial planes are usually derived from snapped points) @@ -326,7 +326,12 @@ int FindFloatPlane( vec3_t innormal, vec_t dist, int numPoints, vec3_t *points ) VectorCopy( innormal, normal ); #if Q3MAP2_EXPERIMENTAL_SNAP_PLANE_FIX - SnapPlaneImproved( normal, &dist, numPoints, (const vec3_t *) points ); + if ( !doingModelClip ) { + SnapPlaneImproved( normal, &dist, numPoints, (const vec3_t *) points ); + } + if ( doingModelClip && snapModelClip ) { + SnapPlane( normal, &dist ); + } #else SnapPlane( normal, &dist ); #endif diff --git a/tools/quake3/q3map2/model.c b/tools/quake3/q3map2/model.c index 5798918e..7127591e 100644 --- a/tools/quake3/q3map2/model.c +++ b/tools/quake3/q3map2/model.c @@ -652,8 +652,15 @@ void InsertModel( const char *name, int skin, int frame, m4x4_t transform, remap /* 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 + for ( j = 1; j < buildBrush->numsides; j++ ) { + if ( debugClip ) { + buildBrush->sides[ 0 ].shaderInfo = ShaderInfoForShader( "debugclip2" ); + buildBrush->sides[ j ].shaderInfo = ShaderInfoForShader( "debugclip" ); + } + else { + 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] @@ -714,6 +721,8 @@ void AddTriangleModels( entity_t *e ){ /* note it */ Sys_FPrintf( SYS_VRB, "--- AddTriangleModels ---\n" ); + doingModelClip = qtrue; + /* get current brush entity targetname */ if ( e == entities ) { targetName = ""; @@ -962,4 +971,6 @@ void AddTriangleModels( entity_t *e ){ remap = remap2; } } + + doingModelClip = qfalse; } diff --git a/tools/quake3/q3map2/q3map2.h b/tools/quake3/q3map2/q3map2.h index 5221bb4f..c819d38b 100644 --- a/tools/quake3/q3map2/q3map2.h +++ b/tools/quake3/q3map2/q3map2.h @@ -2001,7 +2001,8 @@ Q_EXTERN float jitters[ MAX_JITTERS ]; /*can't code*/ Q_EXTERN qboolean doingBSP Q_ASSIGN( qfalse ); - +Q_EXTERN qboolean doingModelClip Q_ASSIGN( qfalse ); +Q_EXTERN qboolean snapModelClip Q_ASSIGN( qfalse ); /* commandline arguments */ Q_EXTERN qboolean nocmdline Q_ASSIGN( qfalse ); @@ -2043,6 +2044,7 @@ 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 debugClip Q_ASSIGN( qfalse ); /* debug model autoclipping */ Q_EXTERN qboolean lightmapTriangleCheck Q_ASSIGN( qfalse ); Q_EXTERN qboolean lightmapExtraVisClusterNudge Q_ASSIGN( qfalse ); Q_EXTERN qboolean lightmapFill Q_ASSIGN( qfalse ); @@ -2302,6 +2304,7 @@ 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 bounceColorRatio Q_ASSIGN( 1.0f ); Q_EXTERN float vertexglobalscale Q_ASSIGN( 1.0f ); /* jal: alternative angle attenuation curve */ -- 2.39.2