]> git.rm.cloudns.org Git - xonotic/netradiant.git/commitdiff
Q3map2:
authorGarux <garux@mail.ru>
Tue, 1 Aug 2017 10:33:37 +0000 (13:33 +0300)
committerGarux <garux@mail.ru>
Tue, 1 Aug 2017 10:33:37 +0000 (13:33 +0300)
* -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)

12 files changed:
Makefile
libs/mathlib.h
libs/mathlib/mathlib.c
radiant/brushmanip.cpp
radiant/mainframe.cpp
tools/quake3/q3map2/bsp.c
tools/quake3/q3map2/light.c
tools/quake3/q3map2/light_bounce.c
tools/quake3/q3map2/light_trace.c
tools/quake3/q3map2/map.c
tools/quake3/q3map2/model.c
tools/quake3/q3map2/q3map2.h

index 9eee12128f465bbbc5945ae2e63f1f3fa7ce379e..e2d56e38d9a293ee72a71980b71d9983617dd295 100644 (file)
--- 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): \
index 64f3f6e43d8db5e2019fc4410d859483fbd20f73..fb135b8ae0de4d4797f5cdf3eb7f838f6d3e1a86 100644 (file)
@@ -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 );
index ce6cfdc2d87fcf87e4920af33657deded791b020..642f9842e78ce94ad72d53950873fb79a8d67dd5 100644 (file)
@@ -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 ) {
index 79b8465737736096f5ecccded5fc6df5d9e00951..8e45973c981298b0c47776afba3209eacf41e845 100644 (file)
@@ -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 );
index 8fb38e32e4b6bdc1c2ab557a38749ae8b20be47a..26e337a44057d1bcb74c7851dbc0fb8fd0555d63 100644 (file)
@@ -3198,7 +3198,7 @@ void MainFrame_Construct(){
        GlobalCommands_insert( "Redo", FreeCaller<Redo>(), Accelerator( 'Y', (GdkModifierType)GDK_CONTROL_MASK ) );
        GlobalCommands_insert( "Copy", FreeCaller<Copy>(), Accelerator( 'C', (GdkModifierType)GDK_CONTROL_MASK ) );
        GlobalCommands_insert( "Paste", FreeCaller<Paste>(), Accelerator( 'V', (GdkModifierType)GDK_CONTROL_MASK ) );
-       GlobalCommands_insert( "PasteToCamera", FreeCaller<PasteToCamera>(), Accelerator( 'V', (GdkModifierType)GDK_MOD1_MASK ) );
+       GlobalCommands_insert( "PasteToCamera", FreeCaller<PasteToCamera>(), Accelerator( 'V', (GdkModifierType)GDK_SHIFT_MASK ) );
        GlobalCommands_insert( "CloneSelection", FreeCaller<Selection_Clone>(), Accelerator( GDK_space ) );
        GlobalCommands_insert( "CloneSelectionAndMakeUnique", FreeCaller<Selection_Clone_MakeUnique>(), Accelerator( GDK_space, (GdkModifierType)GDK_SHIFT_MASK ) );
 //     GlobalCommands_insert( "DeleteSelection", FreeCaller<deleteSelection>(), Accelerator( GDK_BackSpace ) );
index 98d399c932e34c1a8ac5d010687c280d84acfebe..2edf9f5d95538b9a6cbd42d266b82e60a6836e25 100644 (file)
@@ -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" );
index cdd9819fab8de5969e0c5bb35437336af00f5459..900e1fcadb9068616fc695b7318ee217f8be8185 100644 (file)
@@ -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" );
index 37d8c4e57ca4f6ed141cc37f2f8e24dd01a47d6a..82aacdb5bea1336ad7ee470e5ce52cdb18c02d76 100644 (file)
@@ -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 );
 
index cb22bb44407cb8bfcc60419296bf8017a4c82c80..08606f7e466615972f2124988704107e19a3a28c 100644 (file)
@@ -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;
 }
index e9bc3921893526b25dd5fa175df3bb88bf39905e..e0d1fddadb3f2e5cf5e450e5d9856ba1b95b6bac 100644 (file)
@@ -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
index 5798918ed2f786e706773d5d79643625f98670ab..7127591e0c0d107f8ed0eecfe2c5ac2c1b2baab0 100644 (file)
@@ -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;
 }
index 5221bb4f4234cb01c7230206496ca277f4e47492..c819d38ba4340d8fd55229399de293ea5c22ad33 100644 (file)
@@ -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 */