]> git.xonotic.org Git - xonotic/netradiant.git/blobdiff - contrib/gtkgensurf/genmap.cpp
reformat code! now the code is only ugly on the *inside*
[xonotic/netradiant.git] / contrib / gtkgensurf / genmap.cpp
index a31bfbcb207558e99f101dbae0e46311ebd24787..ce55785e6984449427f45af71fa7be3a1e14c5b4 100644 (file)
 #include <stdio.h>
 #include "gensurf.h"
 
-double xmin,xmax,ymin,ymax,zmin,zmax;
+double xmin, xmax, ymin, ymax, zmin, zmax;
 double backface;
 extern double dh, dv;
-FILE  *fmap;
+FILE *fmap;
 XYZ xyz[MAX_ROWS + 1][MAX_ROWS + 1];
 int contents;
 int surface[3];
@@ -41,216 +41,191 @@ int surface[3];
 
 #include "scenelib.h"
 
-scene::Nodeh_func_group;
-scene::Nodeh_worldspawn;
+scene::Node *h_func_group;
+scene::Node *h_worldspawn;
 
 
 //=============================================================
 // Hydra : snap-to-grid begin
-double CalculateSnapValue( double value ){
-       long snapvalue;
-
-       // simple uncomplicated snapping, rounding both UP and DOWN to the nearest
-       // grid unit.
-       if ( SnapToGrid > 0 ) {
-               snapvalue = (int)value / SnapToGrid;
-               if ( (long)value % SnapToGrid < ( SnapToGrid / 2 ) ) { // Snap Downwards if less than halfway between to grid units
-                       value = snapvalue * SnapToGrid;
-               }
-               else{ // Snap Upwards if more than halfway between to grid units
-                       value = ( snapvalue + 1 ) * SnapToGrid;
-               }
-       }
-       return value;
+double CalculateSnapValue(double value)
+{
+    long snapvalue;
+
+    // simple uncomplicated snapping, rounding both UP and DOWN to the nearest
+    // grid unit.
+    if (SnapToGrid > 0) {
+        snapvalue = (int) value / SnapToGrid;
+        if ((long) value % SnapToGrid < (SnapToGrid / 2)) { // Snap Downwards if less than halfway between to grid units
+            value = snapvalue * SnapToGrid;
+        } else { // Snap Upwards if more than halfway between to grid units
+            value = (snapvalue + 1) * SnapToGrid;
+        }
+    }
+    return value;
 }
 // Hydra : snap-to-grid end
 
 //=============================================================
-bool ValidSurface(){
-       if ( WaveType == WAVE_BITMAP && !gbmp.colors ) {
-               return FALSE;
-       }
-       if ( NH  < 1 ) {
-               return FALSE;
-       }
-       if ( NH  > MAX_ROWS ) {
-               return FALSE;
-       }
-       if ( NV  < 1 ) {
-               return FALSE;
-       }
-       if ( NV  > MAX_ROWS ) {
-               return FALSE;
-       }
-       if ( Hll >= Hur ) {
-               return FALSE;
-       }
-       if ( Vll >= Vur ) {
-               return FALSE;
-       }
-       return TRUE;
+bool ValidSurface()
+{
+    if (WaveType == WAVE_BITMAP && !gbmp.colors) {
+        return FALSE;
+    }
+    if (NH < 1) {
+        return FALSE;
+    }
+    if (NH > MAX_ROWS) {
+        return FALSE;
+    }
+    if (NV < 1) {
+        return FALSE;
+    }
+    if (NV > MAX_ROWS) {
+        return FALSE;
+    }
+    if (Hll >= Hur) {
+        return FALSE;
+    }
+    if (Vll >= Vur) {
+        return FALSE;
+    }
+    return TRUE;
 }
 
 //=============================================================
-int MapPatches(){
-       int NH_remain;
-       int NV_remain;
-       int NH_patch;
-       int NV_patch;
-       int BrushNum = 0;
-       int i, j, k1, k2, k3;
-       int i0, j0, ii;
-       char szOops[128];
-
-       dh = ( Hur - Hll ) / NH;
-       dv = ( Vur - Vll ) / NV;
-
-       // Generate control points in pp array to give desired values currently
-       // in p array.
-       switch ( Plane )
-       {
-       case PLANE_XY0:
-       case PLANE_XY1:
-               k1 = 0;
-               k2 = 1;
-               k3 = 2;
-               break;
-       case PLANE_XZ0:
-       case PLANE_XZ1:
-               k1 = 0;
-               k2 = 2;
-               k3 = 1;
-               break;
-       case PLANE_YZ0:
-       case PLANE_YZ1:
-               k1 = 1;
-               k2 = 2;
-               k3 = 0;
-               break;
-       }
-       for ( i = 0; i <= NH; i++ )
-       {
-               for ( j = 0; j <= NV; j++ )
-               {
-                       xyz[i][j].pp[k1] = xyz[i][j].p[k1];
-                       xyz[i][j].pp[k2] = xyz[i][j].p[k2];
-               }
-       }
-       for ( i = 0; i <= NH; i += 2 )
-       {
-               for ( j = 0; j <= NV; j += 2 )
-                       xyz[i][j].pp[k3] = xyz[i][j].p[k3];
-       }
-       for ( i = 1; i < NH; i += 2 )
-       {
-               for ( j = 0; j <= NV; j += 2 )
-               {
-                       xyz[i][j].pp[k3] = ( 4 * xyz[i][j].p[k3] - xyz[i - 1][j].p[k3] - xyz[i + 1][j].p[k3] ) / 2;
-               }
-       }
-       for ( j = 1; j < NV; j += 2 )
-       {
-               for ( i = 0; i <= NH; i += 2 )
-               {
-                       xyz[i][j].pp[k3] = ( 4 * xyz[i][j].p[k3] - xyz[i][j - 1].p[k3] - xyz[i][j + 1].p[k3] ) / 2;
-               }
-       }
-       for ( i = 1; i < NH; i += 2 )
-       {
-               for ( j = 1; j < NV; j += 2 )
-               {
-                       xyz[i][j].pp[k3] = ( 16 * xyz[i][j].p[k3] - xyz[i - 1][j - 1].p[k3] - 2 * xyz[i][j - 1].p[k3]
-                                                                - xyz[i + 1][j - 1].p[k3] - 2 * xyz[i - 1][j].p[k3] - 2 * xyz[i + 1][j].p[k3]
-                                                                - xyz[i - 1][j + 1].p[k3] - 2 * xyz[i][j + 1].p[k3] - xyz[i + 1][j + 1].p[k3] ) / 4;
-               }
-       }
-
-       NH_remain = NH + 1;
-       i0 = 0;
-       while ( NH_remain > 1 )
-       {
-               if ( ( ( NH_remain - 1 ) % 14 ) == 0 ) {
-                       NH_patch = 15;
-               }
-               else if ( ( ( NH_remain - 1 ) % 12 ) == 0 ) {
-                       NH_patch = 13;
-               }
-               else if ( ( ( NH_remain - 1 ) % 10 ) == 0 ) {
-                       NH_patch = 11;
-               }
-               else if ( ( ( NH_remain - 1 ) % 8 ) == 0 ) {
-                       NH_patch = 9;
-               }
-               else if ( ( ( NH_remain - 1 ) % 6 ) == 0 ) {
-                       NH_patch = 7;
-               }
-               else if ( ( ( NH_remain - 1 ) % 4 ) == 0 ) {
-                       NH_patch = 5;
-               }
-               else if ( ( ( NH_remain - 1 ) % 2 ) == 0 ) {
-                       NH_patch = 3;
-               }
-               else if ( NH_remain > 16 ) {
-                       NH_patch = 7;
-               }
-               else if ( NH_remain > 4 ) {
-                       NH_patch = 5;
-               }
-               else{
-                       NH_patch = 3;
-               }
-               while ( NH_patch > 3 && ( NH_patch - 1 ) * dh > 512 )
-                       NH_patch -= 2;
-               NH_remain -= ( NH_patch - 1 );
-               if ( NH_remain < 0 ) {
-                       sprintf( szOops,"Oops... screwed up with NH=%d",NH );
-                       g_FuncTable.m_pfnMessageBox( NULL,szOops,"Uh oh" );
-               }
-               NV_remain = NV + 1;
-               j0 = 0;
-               while ( NV_remain > 1 )
-               {
-                       if ( ( ( NV_remain - 1 ) % 14 ) == 0 ) {
-                               NV_patch = 15;
-                       }
-                       else if ( ( ( NV_remain - 1 ) % 12 ) == 0 ) {
-                               NV_patch = 13;
-                       }
-                       else if ( ( ( NV_remain - 1 ) % 10 ) == 0 ) {
-                               NV_patch = 11;
-                       }
-                       else if ( ( ( NV_remain - 1 ) % 8 ) == 0 ) {
-                               NV_patch = 9;
-                       }
-                       else if ( ( ( NV_remain - 1 ) % 6 ) == 0 ) {
-                               NV_patch = 7;
-                       }
-                       else if ( ( ( NV_remain - 1 ) % 4 ) == 0 ) {
-                               NV_patch = 5;
-                       }
-                       else if ( ( ( NV_remain - 1 ) % 2 ) == 0 ) {
-                               NV_patch = 3;
-                       }
-                       else if ( NV_remain > 16 ) {
-                               NV_patch = 7;
-                       }
-                       else if ( NV_remain > 4 ) {
-                               NV_patch = 5;
-                       }
-                       else{
-                               NV_patch = 3;
-                       }
-                       while ( NV_patch > 3 && ( NV_patch - 1 ) * dh > 512 )
-                               NV_patch -= 2;
-                       NV_remain -= ( NV_patch - 1 );
-                       if ( NV_remain < 0 ) {
-                               sprintf( szOops,"Oops... screwed up with NV=%d",NV );
-                               g_FuncTable.m_pfnMessageBox( NULL,szOops,"Uh oh" );
-                       }
-
-                       scene::Node* patch = MakePatch();
+int MapPatches()
+{
+    int NH_remain;
+    int NV_remain;
+    int NH_patch;
+    int NV_patch;
+    int BrushNum = 0;
+    int i, j, k1, k2, k3;
+    int i0, j0, ii;
+    char szOops[128];
+
+    dh = (Hur - Hll) / NH;
+    dv = (Vur - Vll) / NV;
+
+    // Generate control points in pp array to give desired values currently
+    // in p array.
+    switch (Plane) {
+        case PLANE_XY0:
+        case PLANE_XY1:
+            k1 = 0;
+            k2 = 1;
+            k3 = 2;
+            break;
+        case PLANE_XZ0:
+        case PLANE_XZ1:
+            k1 = 0;
+            k2 = 2;
+            k3 = 1;
+            break;
+        case PLANE_YZ0:
+        case PLANE_YZ1:
+            k1 = 1;
+            k2 = 2;
+            k3 = 0;
+            break;
+    }
+    for (i = 0; i <= NH; i++) {
+        for (j = 0; j <= NV; j++) {
+            xyz[i][j].pp[k1] = xyz[i][j].p[k1];
+            xyz[i][j].pp[k2] = xyz[i][j].p[k2];
+        }
+    }
+    for (i = 0; i <= NH; i += 2) {
+        for (j = 0; j <= NV; j += 2) {
+            xyz[i][j].pp[k3] = xyz[i][j].p[k3];
+        }
+    }
+    for (i = 1; i < NH; i += 2) {
+        for (j = 0; j <= NV; j += 2) {
+            xyz[i][j].pp[k3] = (4 * xyz[i][j].p[k3] - xyz[i - 1][j].p[k3] - xyz[i + 1][j].p[k3]) / 2;
+        }
+    }
+    for (j = 1; j < NV; j += 2) {
+        for (i = 0; i <= NH; i += 2) {
+            xyz[i][j].pp[k3] = (4 * xyz[i][j].p[k3] - xyz[i][j - 1].p[k3] - xyz[i][j + 1].p[k3]) / 2;
+        }
+    }
+    for (i = 1; i < NH; i += 2) {
+        for (j = 1; j < NV; j += 2) {
+            xyz[i][j].pp[k3] = (16 * xyz[i][j].p[k3] - xyz[i - 1][j - 1].p[k3] - 2 * xyz[i][j - 1].p[k3]
+                                - xyz[i + 1][j - 1].p[k3] - 2 * xyz[i - 1][j].p[k3] - 2 * xyz[i + 1][j].p[k3]
+                                - xyz[i - 1][j + 1].p[k3] - 2 * xyz[i][j + 1].p[k3] - xyz[i + 1][j + 1].p[k3]) / 4;
+        }
+    }
+
+    NH_remain = NH + 1;
+    i0 = 0;
+    while (NH_remain > 1) {
+        if (((NH_remain - 1) % 14) == 0) {
+            NH_patch = 15;
+        } else if (((NH_remain - 1) % 12) == 0) {
+            NH_patch = 13;
+        } else if (((NH_remain - 1) % 10) == 0) {
+            NH_patch = 11;
+        } else if (((NH_remain - 1) % 8) == 0) {
+            NH_patch = 9;
+        } else if (((NH_remain - 1) % 6) == 0) {
+            NH_patch = 7;
+        } else if (((NH_remain - 1) % 4) == 0) {
+            NH_patch = 5;
+        } else if (((NH_remain - 1) % 2) == 0) {
+            NH_patch = 3;
+        } else if (NH_remain > 16) {
+            NH_patch = 7;
+        } else if (NH_remain > 4) {
+            NH_patch = 5;
+        } else {
+            NH_patch = 3;
+        }
+        while (NH_patch > 3 && (NH_patch - 1) * dh > 512) {
+            NH_patch -= 2;
+        }
+        NH_remain -= (NH_patch - 1);
+        if (NH_remain < 0) {
+            sprintf(szOops, "Oops... screwed up with NH=%d", NH);
+            g_FuncTable.m_pfnMessageBox(NULL, szOops, "Uh oh");
+        }
+        NV_remain = NV + 1;
+        j0 = 0;
+        while (NV_remain > 1) {
+            if (((NV_remain - 1) % 14) == 0) {
+                NV_patch = 15;
+            } else if (((NV_remain - 1) % 12) == 0) {
+                NV_patch = 13;
+            } else if (((NV_remain - 1) % 10) == 0) {
+                NV_patch = 11;
+            } else if (((NV_remain - 1) % 8) == 0) {
+                NV_patch = 9;
+            } else if (((NV_remain - 1) % 6) == 0) {
+                NV_patch = 7;
+            } else if (((NV_remain - 1) % 4) == 0) {
+                NV_patch = 5;
+            } else if (((NV_remain - 1) % 2) == 0) {
+                NV_patch = 3;
+            } else if (NV_remain > 16) {
+                NV_patch = 7;
+            } else if (NV_remain > 4) {
+                NV_patch = 5;
+            } else {
+                NV_patch = 3;
+            }
+            while (NV_patch > 3 && (NV_patch - 1) * dh > 512) {
+                NV_patch -= 2;
+            }
+            NV_remain -= (NV_patch - 1);
+            if (NV_remain < 0) {
+                sprintf(szOops, "Oops... screwed up with NV=%d", NV);
+                g_FuncTable.m_pfnMessageBox(NULL, szOops, "Uh oh");
+            }
+
+            scene::Node *patch = MakePatch();
 #if 0
-                       b->pPatch->setDims( NH_patch, NV_patch );
+                                                                                                                                    b->pPatch->setDims( NH_patch, NV_patch );
                        for ( i = 0; i < NH_patch; i++ )
                        {
                                switch ( Plane )
@@ -274,1379 +249,1299 @@ int MapPatches(){
                        }
                        b->pPatch->UpdateCachedData();
 #endif
-                       BrushNum++;
-                       j0 += NV_patch - 1;
-               }
-               i0 += NH_patch - 1;
-       }
-       return BrushNum;
+            BrushNum++;
+            j0 += NV_patch - 1;
+        }
+        i0 += NH_patch - 1;
+    }
+    return BrushNum;
 }
 
 //=============================================================
-void MapBrushes(){
-       char hint[128];
-       char skip[128];
-       char sidetext[64];
-       char surftext[64];
-       char surftext2[64];
-       char surft[64];
-       float Steep;
-       vec3_t PlaneNormal,SurfNormal;
-       vec3_t t[2];
-       int i, j, k;
-       int surf;
-       bool CheckAngle;
-       BRUSH brush;
-       XYZ v[8];
-
-       strcpy( surftext,Texture[Game][0] );
-       strcpy( sidetext,( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
-       strcpy( surftext2,( strlen( Texture[Game][2] ) ? Texture[Game][2] : Texture[Game][0] ) );
-
-       // if surftext2 is identical to surftext, there's no need to
-       // check surface angle
-       if ( !g_strcasecmp( surftext,surftext2 ) ) {
-               CheckAngle = FALSE;
-       }
-       else
-       {
-               CheckAngle = TRUE;
-               Steep = (float)cos( (double)SlantAngle / 57.2957795 );
-               switch ( Plane )
-               {
-               case PLANE_XY0: PlaneNormal[0] = 0.; PlaneNormal[1] = 0.; PlaneNormal[2] = 1.; break;
-               case PLANE_XY1: PlaneNormal[0] = 0.; PlaneNormal[1] = 0.; PlaneNormal[2] = -1.; break;
-               case PLANE_XZ0: PlaneNormal[0] = 0.; PlaneNormal[1] = 1.; PlaneNormal[2] = 1.; break;
-               case PLANE_XZ1: PlaneNormal[0] = 0.; PlaneNormal[1] = -1.; PlaneNormal[2] = 1.; break;
-               case PLANE_YZ0: PlaneNormal[0] = 1.; PlaneNormal[1] = 0.; PlaneNormal[2] = 1.; break;
-               case PLANE_YZ1: PlaneNormal[0] = -1.; PlaneNormal[1] = 0.; PlaneNormal[2] = 1.; break;
-               }
-       }
-
-       OpenFuncGroup();
-
-       for ( i = 0; i < NH; i++ )
-       {
-               for ( j = 0; j < NV; j++ )
-               {
-                       if ( ( i + j ) % 2 ) {
-                               VectorCopy( xyz[i  ][j  ].p, v[0].p );
-                               switch ( Plane )
-                               {
-                               case PLANE_XY1:
-                               case PLANE_XZ1:
-                               case PLANE_YZ1:
-                                       VectorCopy( xyz[i + 1][j  ].p, v[1].p );
-                                       VectorCopy( xyz[i + 1][j + 1].p, v[2].p );
-                                       break;
-                               default:
-                                       VectorCopy( xyz[i + 1][j + 1].p, v[1].p );
-                                       VectorCopy( xyz[i + 1][j  ].p, v[2].p );
-                               }
-                       }
-                       else
-                       {
-                               VectorCopy( xyz[i  ][j  ].p, v[0].p );
-                               switch ( Plane )
-                               {
-                               case PLANE_XY1:
-                               case PLANE_XZ1:
-                               case PLANE_YZ1:
-                                       VectorCopy( xyz[i + 1][j  ].p, v[1].p );
-                                       VectorCopy( xyz[i  ][j + 1].p, v[2].p );
-                                       break;
-                               default:
-                                       VectorCopy( xyz[i  ][j + 1].p, v[1].p );
-                                       VectorCopy( xyz[i + 1][j  ].p, v[2].p );
-                               }
-                       }
-                       VectorCopy( v[0].p,v[3].p );
-                       VectorCopy( v[1].p,v[4].p );
-                       VectorCopy( v[2].p,v[5].p );
-                       switch ( Plane )
-                       {
-                       case PLANE_XZ0:
-                       case PLANE_XZ1:
-                               v[0].p[1] = backface;
-                               v[1].p[1] = backface;
-                               v[2].p[1] = backface;
-                               break;
-                       case PLANE_YZ0:
-                       case PLANE_YZ1:
-                               v[3].p[0] = backface;
-                               v[4].p[0] = backface;
-                               v[5].p[0] = backface;
-                               break;
-                       default:
-                               v[3].p[2] = backface;
-                               v[4].p[2] = backface;
-                               v[5].p[2] = backface;
-                       }
-
-                       brush.Number   = i * NV * 2 + j * 2;
-                       brush.NumFaces = 5;
-                       XYZtoV( &v[0],&brush.face[0].v[0] );
-                       XYZtoV( &v[3],&brush.face[0].v[1] );
-                       XYZtoV( &v[4],&brush.face[0].v[2] );
-                       strcpy( brush.face[0].texture,
-                                       ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
-                       brush.face[0].Shift[0] = (float)TexOffset[0];
-                       brush.face[0].Shift[1] = (float)TexOffset[1];
-                       brush.face[0].Rotate   = 0.;
-                       brush.face[0].Scale[0] = (float)TexScale[0];
-                       brush.face[0].Scale[1] = (float)TexScale[1];
-                       brush.face[0].Contents = contents;
-                       brush.face[0].Surface  = surface[1];
-                       brush.face[0].Value    = 0;
-
-                       XYZtoV( &v[1],&brush.face[1].v[0] );
-                       XYZtoV( &v[4],&brush.face[1].v[1] );
-                       XYZtoV( &v[5],&brush.face[1].v[2] );
-                       strcpy( brush.face[1].texture,
-                                       ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
-                       brush.face[1].Shift[0] = (float)TexOffset[0];
-                       brush.face[1].Shift[1] = (float)TexOffset[1];
-                       brush.face[1].Rotate   = 0.;
-                       brush.face[1].Scale[0] = (float)TexScale[0];
-                       brush.face[1].Scale[1] = (float)TexScale[1];
-                       brush.face[1].Contents = contents;
-                       brush.face[1].Surface  = surface[1];
-                       brush.face[1].Value    = 0;
-
-                       XYZtoV( &v[2],&brush.face[2].v[0] );
-                       XYZtoV( &v[5],&brush.face[2].v[1] );
-                       XYZtoV( &v[3],&brush.face[2].v[2] );
-                       strcpy( brush.face[2].texture,
-                                       ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
-                       brush.face[2].Shift[0] = (float)TexOffset[0];
-                       brush.face[2].Shift[1] = (float)TexOffset[1];
-                       brush.face[2].Rotate   = 0.;
-                       brush.face[2].Scale[0] = (float)TexScale[0];
-                       brush.face[2].Scale[1] = (float)TexScale[1];
-                       brush.face[2].Contents = contents;
-                       brush.face[2].Surface  = surface[1];
-                       brush.face[2].Value    = 0;
-
-                       if ( CheckAngle && ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ) ) {
-                               XYZVectorSubtract( v[4].p,v[3].p,t[0] );
-                               XYZVectorSubtract( v[5].p,v[4].p,t[1] );
-                               CrossProduct( t[0],t[1],SurfNormal );
-                               VectorNormalize( SurfNormal,SurfNormal );
-                               if ( DotProduct( SurfNormal,PlaneNormal ) < Steep ) {
-                                       strcpy( surft,surftext2 );
-                                       surf = surface[2];
-                               }
-                               else
-                               {
-                                       strcpy( surft,surftext );
-                                       surf = surface[0];
-                               }
-                       }
-                       else
-                       {
-                               strcpy( surft,surftext );
-                               surf = surface[0];
-                       }
-
-                       XYZtoV( &v[3],&brush.face[3].v[0] );
-                       XYZtoV( &v[5],&brush.face[3].v[1] );
-                       XYZtoV( &v[4],&brush.face[3].v[2] );
-                       strcpy( brush.face[3].texture,
-                                       ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surft : sidetext ) );
-                       brush.face[3].Shift[0] = (float)TexOffset[0];
-                       brush.face[3].Shift[1] = (float)TexOffset[1];
-                       brush.face[3].Rotate   = 0.;
-                       brush.face[3].Scale[0] = (float)TexScale[0];
-                       brush.face[3].Scale[1] = (float)TexScale[1];
-                       brush.face[3].Contents = contents;
-                       brush.face[3].Surface  = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surf : surface[1] );
-                       brush.face[3].Value    = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? ArghRad2 : 0 );
-
-                       if ( CheckAngle && Plane != PLANE_XZ0 && Plane != PLANE_XZ1 ) {
-                               XYZVectorSubtract( v[2].p,v[0].p,t[0] );
-                               XYZVectorSubtract( v[1].p,v[2].p,t[1] );
-                               CrossProduct( t[0],t[1],SurfNormal );
-                               VectorNormalize( SurfNormal,SurfNormal );
-                               if ( DotProduct( SurfNormal,PlaneNormal ) < Steep ) {
-                                       strcpy( surft,surftext2 );
-                                       surf = surface[2];
-                               }
-                               else
-                               {
-                                       strcpy( surft,surftext );
-                                       surf = surface[0];
-                               }
-                       }
-                       else
-                       {
-                               strcpy( surft,surftext );
-                               surf = surface[0];
-                       }
-
-                       XYZtoV( &v[0],&brush.face[4].v[0] );
-                       XYZtoV( &v[1],&brush.face[4].v[1] );
-                       XYZtoV( &v[2],&brush.face[4].v[2] );
-                       strcpy( brush.face[4].texture,
-                                       ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? sidetext : surft ) );
-                       brush.face[4].Shift[0] = (float)TexOffset[0];
-                       brush.face[4].Shift[1] = (float)TexOffset[1];
-                       brush.face[4].Rotate   = 0.;
-                       brush.face[4].Scale[0] = (float)TexScale[0];
-                       brush.face[4].Scale[1] = (float)TexScale[1];
-                       brush.face[4].Contents = contents;
-                       brush.face[4].Surface  = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surface[1] : surf );
-                       brush.face[4].Value    = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? 0 : ArghRad2 );
-
-                       MakeBrush( &brush );
-                       if ( ( i + j ) % 2 ) {
-                               VectorCopy( xyz[i  ][j + 1].p,v[0].p );
-                               switch ( Plane )
-                               {
-                               case PLANE_XY1:
-                               case PLANE_XZ1:
-                               case PLANE_YZ1:
-                                       VectorCopy( xyz[i  ][j  ].p,v[1].p );
-                                       VectorCopy( xyz[i + 1][j + 1].p,v[2].p );
-                                       break;
-                               default:
-                                       VectorCopy( xyz[i + 1][j + 1].p,v[1].p );
-                                       VectorCopy( xyz[i  ][j  ].p,v[2].p );
-                               }
-                       }
-                       else
-                       {
-                               VectorCopy( xyz[i  ][j + 1].p,v[0].p );
-                               switch ( Plane )
-                               {
-                               case PLANE_XY1:
-                               case PLANE_XZ1:
-                               case PLANE_YZ1:
-                                       VectorCopy( xyz[i + 1][j  ].p,v[1].p );
-                                       VectorCopy( xyz[i + 1][j + 1].p,v[2].p );
-                                       break;
-                               default:
-                                       VectorCopy( xyz[i + 1][j + 1].p,v[1].p );
-                                       VectorCopy( xyz[i + 1][j  ].p,v[2].p );
-                               }
-                       }
-                       VectorCopy( v[0].p,v[3].p );
-                       VectorCopy( v[1].p,v[4].p );
-                       VectorCopy( v[2].p,v[5].p );
-                       switch ( Plane )
-                       {
-                       case PLANE_XZ0:
-                       case PLANE_XZ1:
-                               v[0].p[1] = backface;
-                               v[1].p[1] = backface;
-                               v[2].p[1] = backface;
-                               break;
-                       case PLANE_YZ0:
-                       case PLANE_YZ1:
-                               v[3].p[0] = backface;
-                               v[4].p[0] = backface;
-                               v[5].p[0] = backface;
-                               break;
-                       default:
-                               v[3].p[2] = backface;
-                               v[4].p[2] = backface;
-                               v[5].p[2] = backface;
-                       }
-                       brush.Number   = i * NV * 2 + j * 2 + 1;
-                       brush.NumFaces = 5;
-                       XYZtoV( &v[0],&brush.face[0].v[0] );
-                       XYZtoV( &v[3],&brush.face[0].v[1] );
-                       XYZtoV( &v[4],&brush.face[0].v[2] );
-                       strcpy( brush.face[0].texture,
-                                       ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
-                       brush.face[0].Shift[0] = (float)TexOffset[0];
-                       brush.face[0].Shift[1] = (float)TexOffset[1];
-                       brush.face[0].Rotate   = 0.;
-                       brush.face[0].Scale[0] = (float)TexScale[0];
-                       brush.face[0].Scale[1] = (float)TexScale[1];
-                       brush.face[0].Contents = contents;
-                       brush.face[0].Surface  = surface[1];
-                       brush.face[0].Value    = 0;
-
-                       XYZtoV( &v[1],&brush.face[1].v[0] );
-                       XYZtoV( &v[4],&brush.face[1].v[1] );
-                       XYZtoV( &v[5],&brush.face[1].v[2] );
-                       strcpy( brush.face[1].texture,
-                                       ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
-                       brush.face[1].Shift[0] = (float)TexOffset[0];
-                       brush.face[1].Shift[1] = (float)TexOffset[1];
-                       brush.face[1].Rotate   = 0.;
-                       brush.face[1].Scale[0] = (float)TexScale[0];
-                       brush.face[1].Scale[1] = (float)TexScale[1];
-                       brush.face[1].Contents = contents;
-                       brush.face[1].Surface  = surface[1];
-                       brush.face[1].Value    = 0;
-
-                       XYZtoV( &v[2],&brush.face[2].v[0] );
-                       XYZtoV( &v[5],&brush.face[2].v[1] );
-                       XYZtoV( &v[3],&brush.face[2].v[2] );
-                       strcpy( brush.face[2].texture,
-                                       ( strlen( Texture[Game][1] ) ? Texture[Game][1] : Texture[Game][0] ) );
-                       brush.face[2].Shift[0] = (float)TexOffset[0];
-                       brush.face[2].Shift[1] = (float)TexOffset[1];
-                       brush.face[2].Rotate   = 0.;
-                       brush.face[2].Scale[0] = (float)TexScale[0];
-                       brush.face[2].Scale[1] = (float)TexScale[1];
-                       brush.face[2].Contents = contents;
-                       brush.face[2].Surface  = surface[1];
-                       brush.face[2].Value    = 0;
-
-                       if ( CheckAngle && ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ) ) {
-                               XYZVectorSubtract( v[4].p,v[3].p,t[0] );
-                               XYZVectorSubtract( v[5].p,v[4].p,t[1] );
-                               CrossProduct( t[0],t[1],SurfNormal );
-                               VectorNormalize( SurfNormal,SurfNormal );
-                               if ( DotProduct( SurfNormal,PlaneNormal ) < Steep ) {
-                                       strcpy( surft,surftext2 );
-                                       surf = surface[2];
-                               }
-                               else
-                               {
-                                       strcpy( surft,surftext );
-                                       surf = surface[0];
-                               }
-                       }
-                       else
-                       {
-                               strcpy( surft,surftext );
-                               surf = surface[0];
-                       }
-                       XYZtoV( &v[3],&brush.face[3].v[0] );
-                       XYZtoV( &v[5],&brush.face[3].v[1] );
-                       XYZtoV( &v[4],&brush.face[3].v[2] );
-                       strcpy( brush.face[3].texture,
-                                       ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surft : sidetext ) );
-                       brush.face[3].Shift[0] = (float)TexOffset[0];
-                       brush.face[3].Shift[1] = (float)TexOffset[1];
-                       brush.face[3].Rotate   = 0.;
-                       brush.face[3].Scale[0] = (float)TexScale[0];
-                       brush.face[3].Scale[1] = (float)TexScale[1];
-                       brush.face[3].Contents = contents;
-                       brush.face[3].Surface  = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surf : surface[1] );
-                       brush.face[3].Value    = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? ArghRad2 : 0 );
-
-                       if ( CheckAngle && Plane != PLANE_XZ0 && Plane != PLANE_XZ1 ) {
-                               XYZVectorSubtract( v[2].p,v[0].p,t[0] );
-                               XYZVectorSubtract( v[1].p,v[2].p,t[1] );
-                               CrossProduct( t[0],t[1],SurfNormal );
-                               VectorNormalize( SurfNormal,SurfNormal );
-                               if ( DotProduct( SurfNormal,PlaneNormal ) < Steep ) {
-                                       strcpy( surft,surftext2 );
-                                       surf = surface[2];
-                               }
-                               else
-                               {
-                                       strcpy( surft,surftext );
-                                       surf = surface[0];
-                               }
-                       }
-                       else
-                       {
-                               strcpy( surft,surftext );
-                               surf = surface[0];
-                       }
-                       XYZtoV( &v[0],&brush.face[4].v[0] );
-                       XYZtoV( &v[1],&brush.face[4].v[1] );
-                       XYZtoV( &v[2],&brush.face[4].v[2] );
-                       strcpy( brush.face[4].texture,
-                                       ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? sidetext : surft ) );
-                       brush.face[4].Shift[0] = (float)TexOffset[0];
-                       brush.face[4].Shift[1] = (float)TexOffset[1];
-                       brush.face[4].Rotate   = 0.;
-                       brush.face[4].Scale[0] = (float)TexScale[0];
-                       brush.face[4].Scale[1] = (float)TexScale[1];
-                       brush.face[4].Contents = contents;
-                       brush.face[4].Surface  = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surface[1] : surf );
-                       brush.face[4].Value    = ( Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? 0 : ArghRad2 );
-
-                       MakeBrush( &brush );
-               }
-       }
-       CloseFuncGroup();
-
-       if ( AddHints || GimpHints ) {
-               int detail, i1, j1, N;
-               double front;
-
-               switch ( Game )
-               {
-               case HALFLIFE:
-                       strcpy( hint,"HINT" );
-                       strcpy( skip,"HINT" );
-                       break;
-               case SIN:
-                       strcpy( hint,"generic/misc/hint" );
-                       strcpy( skip,"generic/misc/skip" );
-                       break;
-               case HERETIC2:
-                       strcpy( hint,"general/hint" );
-                       strcpy( skip,"general/hint" ); // Heretic2 doesn't have a skip texture
-                       break;
-               case KINGPIN:
-                       strcpy( hint,"common/0_hint" );
-                       strcpy( skip,"common/0_skip" );
-                       break;
-               case GENESIS3D:
-                       strcpy( hint,"hint" );
-                       strcpy( skip,"hint" );
-                       break;
-               case QUAKE3:
-                       strcpy( hint,"textures/common/hint" );
-                       strcpy( skip,"textures/common/skip" );
-                       break;
-               default:
-                       strcpy( hint,"e1u1/hint" );
-                       strcpy( skip,"e1u1/skip" );
-               }
-
-               OpenFuncGroup();
-
-               if ( AddHints == 1 ) {
-                       detail = CONTENTS_DETAIL;
-                       N = 0;
-                       for ( i = 0; i < NH; i++ )
-                       {
-                               i1 = i + 1;
-
-                               for ( j = 0; j < NV; j++ )
-                               {
-
-                                       // For detail hint brushes, no need to use a hint brush over
-                                       // EVERY grid square... it would be redundant. Instead use
-                                       // a checkerboard pattern
-                                       if ( ( i + j ) % 2 ) {
-                                               continue;
-                                       }
-
-                                       j1 = j + 1;
-
-                                       VectorCopy( xyz[i  ][j  ].p, v[0].p );
-                                       switch ( Plane )
-                                       {
-                                       case PLANE_XY1:
-                                       case PLANE_XZ1:
-                                       case PLANE_YZ1:
-                                               VectorCopy( xyz[i1][j ].p, v[1].p );
-                                               VectorCopy( xyz[i1][j1].p, v[2].p );
-                                               VectorCopy( xyz[i ][j1].p, v[3].p );
-                                               break;
-                                       default:
-                                               VectorCopy( xyz[i ][j1].p, v[1].p );
-                                               VectorCopy( xyz[i1][j1].p, v[2].p );
-                                               VectorCopy( xyz[i1][j ].p, v[3].p );
-                                       }
-
-                                       VectorCopy( v[0].p,v[4].p );
-                                       VectorCopy( v[1].p,v[5].p );
-                                       VectorCopy( v[2].p,v[6].p );
-                                       VectorCopy( v[3].p,v[7].p );
-
-                                       switch ( Plane )
-                                       {
-                                       case PLANE_XY1:
-                                               front  = LessThan( zmin,32. );
-                                               v[4].p[2] = backface;
-                                               v[5].p[2] = backface;
-                                               v[6].p[2] = backface;
-                                               v[7].p[2] = backface;
-                                               break;
-                                       case PLANE_XZ0:
-                                               front  = MoreThan( ymax,32. );
-                                               v[0].p[1] = backface;
-                                               v[1].p[1] = backface;
-                                               v[2].p[1] = backface;
-                                               v[3].p[1] = backface;
-                                               break;
-                                       case PLANE_XZ1:
-                                               front  = LessThan( ymin,32. );
-                                               v[0].p[1] = backface;
-                                               v[1].p[1] = backface;
-                                               v[2].p[1] = backface;
-                                               v[3].p[1] = backface;
-                                               break;
-                                       case PLANE_YZ0:
-                                               front  = MoreThan( xmax,32. );
-                                               v[4].p[0] = backface;
-                                               v[5].p[0] = backface;
-                                               v[6].p[0] = backface;
-                                               v[7].p[0] = backface;
-                                               break;
-                                       case PLANE_YZ1:
-                                               front  = LessThan( xmin,32. );
-                                               v[4].p[0] = backface;
-                                               v[5].p[0] = backface;
-                                               v[6].p[0] = backface;
-                                               v[7].p[0] = backface;
-                                               break;
-                                       default:
-                                               front  = MoreThan( zmax,32. );
-                                               v[4].p[2] = backface;
-                                               v[5].p[2] = backface;
-                                               v[6].p[2] = backface;
-                                               v[7].p[2] = backface;
-                                       }
-
-                                       switch ( Plane )
-                                       {
-                                       case PLANE_XZ0:
-                                       case PLANE_XZ1:
-                                               v[4].p[1] = front;
-                                               v[5].p[1] = v[4].p[1];
-                                               v[6].p[1] = v[4].p[1];
-                                               v[7].p[1] = v[4].p[1];
-                                               break;
-                                       case PLANE_YZ0:
-                                       case PLANE_YZ1:
-                                               v[0].p[0] = front;
-                                               v[1].p[0] = v[0].p[0];
-                                               v[2].p[0] = v[0].p[0];
-                                               v[3].p[0] = v[0].p[0];
-                                               break;
-                                       default:
-                                               v[0].p[2] = front;
-                                               v[1].p[2] = v[0].p[2];
-                                               v[2].p[2] = v[0].p[2];
-                                               v[3].p[2] = v[0].p[2];
-                                       }
-
-                                       brush.NumFaces = 6;
-                                       brush.Number   = N;
-                                       XYZtoV( &v[0],&brush.face[0].v[0] );
-                                       XYZtoV( &v[1],&brush.face[0].v[1] );
-                                       XYZtoV( &v[2],&brush.face[0].v[2] );
-                                       strcpy( brush.face[0].texture,skip );
-                                       brush.face[0].Shift[0] = 0.;
-                                       brush.face[0].Shift[1] = 0.;
-                                       brush.face[0].Rotate   = 0.;
-                                       brush.face[0].Scale[0] = 1.;
-                                       brush.face[0].Scale[1] = 1.;
-                                       brush.face[0].Contents = detail;
-                                       brush.face[0].Surface  = SURF_SKIP;
-                                       brush.face[0].Value    = 0;
-
-                                       XYZtoV( &v[4],&brush.face[1].v[0] );
-                                       XYZtoV( &v[7],&brush.face[1].v[1] );
-                                       XYZtoV( &v[6],&brush.face[1].v[2] );
-                                       strcpy( brush.face[1].texture,skip );
-                                       brush.face[1].Shift[0] = 0.;
-                                       brush.face[1].Shift[1] = 0.;
-                                       brush.face[1].Rotate   = 0.;
-                                       brush.face[1].Scale[0] = 1.;
-                                       brush.face[1].Scale[1] = 1.;
-                                       brush.face[1].Contents = detail;
-                                       brush.face[1].Surface  = SURF_SKIP;
-                                       brush.face[1].Value    = 0;
-
-                                       XYZtoV( &v[0],&brush.face[2].v[0] );
-                                       XYZtoV( &v[4],&brush.face[2].v[1] );
-                                       XYZtoV( &v[5],&brush.face[2].v[2] );
-                                       strcpy( brush.face[2].texture,hint );
-                                       brush.face[2].Shift[0] = 0.;
-                                       brush.face[2].Shift[1] = 0.;
-                                       brush.face[2].Rotate   = 0.;
-                                       brush.face[2].Scale[0] = 1.;
-                                       brush.face[2].Scale[1] = 1.;
-                                       brush.face[2].Contents = detail;
-                                       brush.face[2].Surface  = SURF_HINT;
-                                       brush.face[2].Value    = 0;
-
-                                       XYZtoV( &v[1],&brush.face[3].v[0] );
-                                       XYZtoV( &v[5],&brush.face[3].v[1] );
-                                       XYZtoV( &v[6],&brush.face[3].v[2] );
-                                       strcpy( brush.face[3].texture,hint );
-                                       brush.face[3].Shift[0] = 0.;
-                                       brush.face[3].Shift[1] = 0.;
-                                       brush.face[3].Rotate   = 0.;
-                                       brush.face[3].Scale[0] = 1.;
-                                       brush.face[3].Scale[1] = 1.;
-                                       brush.face[3].Contents = detail;
-                                       brush.face[3].Surface  = SURF_HINT;
-                                       brush.face[3].Value    = 0;
-
-                                       XYZtoV( &v[2],&brush.face[4].v[0] );
-                                       XYZtoV( &v[6],&brush.face[4].v[1] );
-                                       XYZtoV( &v[7],&brush.face[4].v[2] );
-                                       strcpy( brush.face[4].texture,hint );
-                                       brush.face[4].Shift[0] = 0.;
-                                       brush.face[4].Shift[1] = 0.;
-                                       brush.face[4].Rotate   = 0.;
-                                       brush.face[4].Scale[0] = 1.;
-                                       brush.face[4].Scale[1] = 1.;
-                                       brush.face[4].Contents = detail;
-                                       brush.face[4].Surface  = SURF_HINT;
-                                       brush.face[4].Value    = 0;
-
-                                       XYZtoV( &v[3],&brush.face[5].v[0] );
-                                       XYZtoV( &v[7],&brush.face[5].v[1] );
-                                       XYZtoV( &v[4],&brush.face[5].v[2] );
-                                       strcpy( brush.face[5].texture,hint );
-                                       brush.face[5].Shift[0] = 0.;
-                                       brush.face[5].Shift[1] = 0.;
-                                       brush.face[5].Rotate   = 0.;
-                                       brush.face[5].Scale[0] = 1.;
-                                       brush.face[5].Scale[1] = 1.;
-                                       brush.face[5].Contents = detail;
-                                       brush.face[5].Surface  = SURF_HINT;
-                                       brush.face[5].Value    = 0;
-
-                                       MakeBrush( &brush );
-                                       N++;
-                               }
-                       }
-               }
-               if ( GimpHints ) {
-                       N = 0;
-                       // these brush parameters never change
-                       brush.NumFaces = 5;
-                       for ( i = 0; i < 6; i++ )
-                       {
-                               strcpy( brush.face[i].texture,hint );
-                               brush.face[i].Shift[0] = 0.;
-                               brush.face[i].Shift[1] = 0.;
-                               brush.face[i].Rotate   = 0.;
-                               brush.face[i].Scale[0] = 1.;
-                               brush.face[i].Scale[1] = 1.;
-                               brush.face[i].Contents = 0;
-                               brush.face[i].Surface  = SURF_HINT;
-                               brush.face[i].Value    = 0;
-                       }
-                       for ( i = 0; i < NH; i++ )
-                       {
-                               for ( j = 0; j < NV; j++ )
-                               {
-                                       for ( k = 0; k < 2; k++ )
-                                       {
-                                               if ( k == 0 ) {
-                                                       if ( ( i + j ) % 2 ) {
-                                                               VectorCopy( xyz[i  ][j  ].p, v[0].p );
-                                                               switch ( Plane )
-                                                               {
-                                                               case PLANE_XY1:
-                                                               case PLANE_XZ1:
-                                                               case PLANE_YZ1:
-                                                                       VectorCopy( xyz[i + 1][j  ].p, v[1].p );
-                                                                       VectorCopy( xyz[i + 1][j + 1].p, v[2].p );
-                                                                       break;
-                                                               default:
-                                                                       VectorCopy( xyz[i + 1][j + 1].p, v[1].p );
-                                                                       VectorCopy( xyz[i + 1][j  ].p, v[2].p );
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               VectorCopy( xyz[i  ][j  ].p, v[0].p );
-                                                               switch ( Plane )
-                                                               {
-                                                               case PLANE_XY1:
-                                                               case PLANE_XZ1:
-                                                               case PLANE_YZ1:
-                                                                       VectorCopy( xyz[i + 1][j  ].p, v[1].p );
-                                                                       VectorCopy( xyz[i  ][j + 1].p, v[2].p );
-                                                                       break;
-                                                               default:
-                                                                       VectorCopy( xyz[i  ][j + 1].p, v[1].p );
-                                                                       VectorCopy( xyz[i + 1][j  ].p, v[2].p );
-                                                               }
-                                                       }
-                                               }
-                                               else
-                                               {
-                                                       if ( ( i + j ) % 2 ) {
-                                                               VectorCopy( xyz[i  ][j + 1].p,v[0].p );
-                                                               switch ( Plane )
-                                                               {
-                                                               case PLANE_XY1:
-                                                               case PLANE_XZ1:
-                                                               case PLANE_YZ1:
-                                                                       VectorCopy( xyz[i  ][j  ].p,v[1].p );
-                                                                       VectorCopy( xyz[i + 1][j + 1].p,v[2].p );
-                                                                       break;
-                                                               default:
-                                                                       VectorCopy( xyz[i + 1][j + 1].p,v[1].p );
-                                                                       VectorCopy( xyz[i  ][j  ].p,v[2].p );
-                                                               }
-                                                       }
-                                                       else
-                                                       {
-                                                               VectorCopy( xyz[i  ][j + 1].p,v[0].p );
-                                                               switch ( Plane )
-                                                               {
-                                                               case PLANE_XY1:
-                                                               case PLANE_XZ1:
-                                                               case PLANE_YZ1:
-                                                                       VectorCopy( xyz[i + 1][j  ].p,v[1].p );
-                                                                       VectorCopy( xyz[i + 1][j + 1].p,v[2].p );
-                                                                       break;
-                                                               default:
-                                                                       VectorCopy( xyz[i + 1][j + 1].p,v[1].p );
-                                                                       VectorCopy( xyz[i + 1][j  ].p,v[2].p );
-                                                               }
-                                                       }
-                                               }
-                                               VectorCopy( v[0].p,v[3].p );
-                                               VectorCopy( v[1].p,v[4].p );
-                                               VectorCopy( v[2].p,v[5].p );
-                                               switch ( Plane )
-                                               {
-                                               case PLANE_XY0:
-                                                       v[0].p[2] += HINT_OFFSET;
-                                                       v[1].p[2] += HINT_OFFSET;
-                                                       v[2].p[2] += HINT_OFFSET;
+void MapBrushes()
+{
+    char hint[128];
+    char skip[128];
+    char sidetext[64];
+    char surftext[64];
+    char surftext2[64];
+    char surft[64];
+    float Steep;
+    vec3_t PlaneNormal, SurfNormal;
+    vec3_t t[2];
+    int i, j, k;
+    int surf;
+    bool CheckAngle;
+    BRUSH brush;
+    XYZ v[8];
+
+    strcpy(surftext, Texture[Game][0]);
+    strcpy(sidetext, (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
+    strcpy(surftext2, (strlen(Texture[Game][2]) ? Texture[Game][2] : Texture[Game][0]));
+
+    // if surftext2 is identical to surftext, there's no need to
+    // check surface angle
+    if (!g_strcasecmp(surftext, surftext2)) {
+        CheckAngle = FALSE;
+    } else {
+        CheckAngle = TRUE;
+        Steep = (float) cos((double) SlantAngle / 57.2957795);
+        switch (Plane) {
+            case PLANE_XY0:
+                PlaneNormal[0] = 0.;
+                PlaneNormal[1] = 0.;
+                PlaneNormal[2] = 1.;
+                break;
+            case PLANE_XY1:
+                PlaneNormal[0] = 0.;
+                PlaneNormal[1] = 0.;
+                PlaneNormal[2] = -1.;
+                break;
+            case PLANE_XZ0:
+                PlaneNormal[0] = 0.;
+                PlaneNormal[1] = 1.;
+                PlaneNormal[2] = 1.;
+                break;
+            case PLANE_XZ1:
+                PlaneNormal[0] = 0.;
+                PlaneNormal[1] = -1.;
+                PlaneNormal[2] = 1.;
+                break;
+            case PLANE_YZ0:
+                PlaneNormal[0] = 1.;
+                PlaneNormal[1] = 0.;
+                PlaneNormal[2] = 1.;
+                break;
+            case PLANE_YZ1:
+                PlaneNormal[0] = -1.;
+                PlaneNormal[1] = 0.;
+                PlaneNormal[2] = 1.;
+                break;
+        }
+    }
+
+    OpenFuncGroup();
+
+    for (i = 0; i < NH; i++) {
+        for (j = 0; j < NV; j++) {
+            if ((i + j) % 2) {
+                VectorCopy(xyz[i][j].p, v[0].p);
+                switch (Plane) {
+                    case PLANE_XY1:
+                    case PLANE_XZ1:
+                    case PLANE_YZ1:
+                        VectorCopy(xyz[i + 1][j].p, v[1].p);
+                        VectorCopy(xyz[i + 1][j + 1].p, v[2].p);
+                        break;
+                    default:
+                        VectorCopy(xyz[i + 1][j + 1].p, v[1].p);
+                        VectorCopy(xyz[i + 1][j].p, v[2].p);
+                }
+            } else {
+                VectorCopy(xyz[i][j].p, v[0].p);
+                switch (Plane) {
+                    case PLANE_XY1:
+                    case PLANE_XZ1:
+                    case PLANE_YZ1:
+                        VectorCopy(xyz[i + 1][j].p, v[1].p);
+                        VectorCopy(xyz[i][j + 1].p, v[2].p);
+                        break;
+                    default:
+                        VectorCopy(xyz[i][j + 1].p, v[1].p);
+                        VectorCopy(xyz[i + 1][j].p, v[2].p);
+                }
+            }
+            VectorCopy(v[0].p, v[3].p);
+            VectorCopy(v[1].p, v[4].p);
+            VectorCopy(v[2].p, v[5].p);
+            switch (Plane) {
+                case PLANE_XZ0:
+                case PLANE_XZ1:
+                    v[0].p[1] = backface;
+                    v[1].p[1] = backface;
+                    v[2].p[1] = backface;
+                    break;
+                case PLANE_YZ0:
+                case PLANE_YZ1:
+                    v[3].p[0] = backface;
+                    v[4].p[0] = backface;
+                    v[5].p[0] = backface;
+                    break;
+                default:
+                    v[3].p[2] = backface;
+                    v[4].p[2] = backface;
+                    v[5].p[2] = backface;
+            }
+
+            brush.Number = i * NV * 2 + j * 2;
+            brush.NumFaces = 5;
+            XYZtoV(&v[0], &brush.face[0].v[0]);
+            XYZtoV(&v[3], &brush.face[0].v[1]);
+            XYZtoV(&v[4], &brush.face[0].v[2]);
+            strcpy(brush.face[0].texture,
+                   (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
+            brush.face[0].Shift[0] = (float) TexOffset[0];
+            brush.face[0].Shift[1] = (float) TexOffset[1];
+            brush.face[0].Rotate = 0.;
+            brush.face[0].Scale[0] = (float) TexScale[0];
+            brush.face[0].Scale[1] = (float) TexScale[1];
+            brush.face[0].Contents = contents;
+            brush.face[0].Surface = surface[1];
+            brush.face[0].Value = 0;
+
+            XYZtoV(&v[1], &brush.face[1].v[0]);
+            XYZtoV(&v[4], &brush.face[1].v[1]);
+            XYZtoV(&v[5], &brush.face[1].v[2]);
+            strcpy(brush.face[1].texture,
+                   (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
+            brush.face[1].Shift[0] = (float) TexOffset[0];
+            brush.face[1].Shift[1] = (float) TexOffset[1];
+            brush.face[1].Rotate = 0.;
+            brush.face[1].Scale[0] = (float) TexScale[0];
+            brush.face[1].Scale[1] = (float) TexScale[1];
+            brush.face[1].Contents = contents;
+            brush.face[1].Surface = surface[1];
+            brush.face[1].Value = 0;
+
+            XYZtoV(&v[2], &brush.face[2].v[0]);
+            XYZtoV(&v[5], &brush.face[2].v[1]);
+            XYZtoV(&v[3], &brush.face[2].v[2]);
+            strcpy(brush.face[2].texture,
+                   (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
+            brush.face[2].Shift[0] = (float) TexOffset[0];
+            brush.face[2].Shift[1] = (float) TexOffset[1];
+            brush.face[2].Rotate = 0.;
+            brush.face[2].Scale[0] = (float) TexScale[0];
+            brush.face[2].Scale[1] = (float) TexScale[1];
+            brush.face[2].Contents = contents;
+            brush.face[2].Surface = surface[1];
+            brush.face[2].Value = 0;
+
+            if (CheckAngle && (Plane == PLANE_XZ0 || Plane == PLANE_XZ1)) {
+                XYZVectorSubtract(v[4].p, v[3].p, t[0]);
+                XYZVectorSubtract(v[5].p, v[4].p, t[1]);
+                CrossProduct(t[0], t[1], SurfNormal);
+                VectorNormalize(SurfNormal, SurfNormal);
+                if (DotProduct(SurfNormal, PlaneNormal) < Steep) {
+                    strcpy(surft, surftext2);
+                    surf = surface[2];
+                } else {
+                    strcpy(surft, surftext);
+                    surf = surface[0];
+                }
+            } else {
+                strcpy(surft, surftext);
+                surf = surface[0];
+            }
+
+            XYZtoV(&v[3], &brush.face[3].v[0]);
+            XYZtoV(&v[5], &brush.face[3].v[1]);
+            XYZtoV(&v[4], &brush.face[3].v[2]);
+            strcpy(brush.face[3].texture,
+                   (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surft : sidetext));
+            brush.face[3].Shift[0] = (float) TexOffset[0];
+            brush.face[3].Shift[1] = (float) TexOffset[1];
+            brush.face[3].Rotate = 0.;
+            brush.face[3].Scale[0] = (float) TexScale[0];
+            brush.face[3].Scale[1] = (float) TexScale[1];
+            brush.face[3].Contents = contents;
+            brush.face[3].Surface = (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surf : surface[1]);
+            brush.face[3].Value = (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? ArghRad2 : 0);
+
+            if (CheckAngle && Plane != PLANE_XZ0 && Plane != PLANE_XZ1) {
+                XYZVectorSubtract(v[2].p, v[0].p, t[0]);
+                XYZVectorSubtract(v[1].p, v[2].p, t[1]);
+                CrossProduct(t[0], t[1], SurfNormal);
+                VectorNormalize(SurfNormal, SurfNormal);
+                if (DotProduct(SurfNormal, PlaneNormal) < Steep) {
+                    strcpy(surft, surftext2);
+                    surf = surface[2];
+                } else {
+                    strcpy(surft, surftext);
+                    surf = surface[0];
+                }
+            } else {
+                strcpy(surft, surftext);
+                surf = surface[0];
+            }
+
+            XYZtoV(&v[0], &brush.face[4].v[0]);
+            XYZtoV(&v[1], &brush.face[4].v[1]);
+            XYZtoV(&v[2], &brush.face[4].v[2]);
+            strcpy(brush.face[4].texture,
+                   (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? sidetext : surft));
+            brush.face[4].Shift[0] = (float) TexOffset[0];
+            brush.face[4].Shift[1] = (float) TexOffset[1];
+            brush.face[4].Rotate = 0.;
+            brush.face[4].Scale[0] = (float) TexScale[0];
+            brush.face[4].Scale[1] = (float) TexScale[1];
+            brush.face[4].Contents = contents;
+            brush.face[4].Surface = (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surface[1] : surf);
+            brush.face[4].Value = (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? 0 : ArghRad2);
+
+            MakeBrush(&brush);
+            if ((i + j) % 2) {
+                VectorCopy(xyz[i][j + 1].p, v[0].p);
+                switch (Plane) {
+                    case PLANE_XY1:
+                    case PLANE_XZ1:
+                    case PLANE_YZ1:
+                        VectorCopy(xyz[i][j].p, v[1].p);
+                        VectorCopy(xyz[i + 1][j + 1].p, v[2].p);
+                        break;
+                    default:
+                        VectorCopy(xyz[i + 1][j + 1].p, v[1].p);
+                        VectorCopy(xyz[i][j].p, v[2].p);
+                }
+            } else {
+                VectorCopy(xyz[i][j + 1].p, v[0].p);
+                switch (Plane) {
+                    case PLANE_XY1:
+                    case PLANE_XZ1:
+                    case PLANE_YZ1:
+                        VectorCopy(xyz[i + 1][j].p, v[1].p);
+                        VectorCopy(xyz[i + 1][j + 1].p, v[2].p);
+                        break;
+                    default:
+                        VectorCopy(xyz[i + 1][j + 1].p, v[1].p);
+                        VectorCopy(xyz[i + 1][j].p, v[2].p);
+                }
+            }
+            VectorCopy(v[0].p, v[3].p);
+            VectorCopy(v[1].p, v[4].p);
+            VectorCopy(v[2].p, v[5].p);
+            switch (Plane) {
+                case PLANE_XZ0:
+                case PLANE_XZ1:
+                    v[0].p[1] = backface;
+                    v[1].p[1] = backface;
+                    v[2].p[1] = backface;
+                    break;
+                case PLANE_YZ0:
+                case PLANE_YZ1:
+                    v[3].p[0] = backface;
+                    v[4].p[0] = backface;
+                    v[5].p[0] = backface;
+                    break;
+                default:
+                    v[3].p[2] = backface;
+                    v[4].p[2] = backface;
+                    v[5].p[2] = backface;
+            }
+            brush.Number = i * NV * 2 + j * 2 + 1;
+            brush.NumFaces = 5;
+            XYZtoV(&v[0], &brush.face[0].v[0]);
+            XYZtoV(&v[3], &brush.face[0].v[1]);
+            XYZtoV(&v[4], &brush.face[0].v[2]);
+            strcpy(brush.face[0].texture,
+                   (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
+            brush.face[0].Shift[0] = (float) TexOffset[0];
+            brush.face[0].Shift[1] = (float) TexOffset[1];
+            brush.face[0].Rotate = 0.;
+            brush.face[0].Scale[0] = (float) TexScale[0];
+            brush.face[0].Scale[1] = (float) TexScale[1];
+            brush.face[0].Contents = contents;
+            brush.face[0].Surface = surface[1];
+            brush.face[0].Value = 0;
+
+            XYZtoV(&v[1], &brush.face[1].v[0]);
+            XYZtoV(&v[4], &brush.face[1].v[1]);
+            XYZtoV(&v[5], &brush.face[1].v[2]);
+            strcpy(brush.face[1].texture,
+                   (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
+            brush.face[1].Shift[0] = (float) TexOffset[0];
+            brush.face[1].Shift[1] = (float) TexOffset[1];
+            brush.face[1].Rotate = 0.;
+            brush.face[1].Scale[0] = (float) TexScale[0];
+            brush.face[1].Scale[1] = (float) TexScale[1];
+            brush.face[1].Contents = contents;
+            brush.face[1].Surface = surface[1];
+            brush.face[1].Value = 0;
+
+            XYZtoV(&v[2], &brush.face[2].v[0]);
+            XYZtoV(&v[5], &brush.face[2].v[1]);
+            XYZtoV(&v[3], &brush.face[2].v[2]);
+            strcpy(brush.face[2].texture,
+                   (strlen(Texture[Game][1]) ? Texture[Game][1] : Texture[Game][0]));
+            brush.face[2].Shift[0] = (float) TexOffset[0];
+            brush.face[2].Shift[1] = (float) TexOffset[1];
+            brush.face[2].Rotate = 0.;
+            brush.face[2].Scale[0] = (float) TexScale[0];
+            brush.face[2].Scale[1] = (float) TexScale[1];
+            brush.face[2].Contents = contents;
+            brush.face[2].Surface = surface[1];
+            brush.face[2].Value = 0;
+
+            if (CheckAngle && (Plane == PLANE_XZ0 || Plane == PLANE_XZ1)) {
+                XYZVectorSubtract(v[4].p, v[3].p, t[0]);
+                XYZVectorSubtract(v[5].p, v[4].p, t[1]);
+                CrossProduct(t[0], t[1], SurfNormal);
+                VectorNormalize(SurfNormal, SurfNormal);
+                if (DotProduct(SurfNormal, PlaneNormal) < Steep) {
+                    strcpy(surft, surftext2);
+                    surf = surface[2];
+                } else {
+                    strcpy(surft, surftext);
+                    surf = surface[0];
+                }
+            } else {
+                strcpy(surft, surftext);
+                surf = surface[0];
+            }
+            XYZtoV(&v[3], &brush.face[3].v[0]);
+            XYZtoV(&v[5], &brush.face[3].v[1]);
+            XYZtoV(&v[4], &brush.face[3].v[2]);
+            strcpy(brush.face[3].texture,
+                   (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surft : sidetext));
+            brush.face[3].Shift[0] = (float) TexOffset[0];
+            brush.face[3].Shift[1] = (float) TexOffset[1];
+            brush.face[3].Rotate = 0.;
+            brush.face[3].Scale[0] = (float) TexScale[0];
+            brush.face[3].Scale[1] = (float) TexScale[1];
+            brush.face[3].Contents = contents;
+            brush.face[3].Surface = (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surf : surface[1]);
+            brush.face[3].Value = (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? ArghRad2 : 0);
+
+            if (CheckAngle && Plane != PLANE_XZ0 && Plane != PLANE_XZ1) {
+                XYZVectorSubtract(v[2].p, v[0].p, t[0]);
+                XYZVectorSubtract(v[1].p, v[2].p, t[1]);
+                CrossProduct(t[0], t[1], SurfNormal);
+                VectorNormalize(SurfNormal, SurfNormal);
+                if (DotProduct(SurfNormal, PlaneNormal) < Steep) {
+                    strcpy(surft, surftext2);
+                    surf = surface[2];
+                } else {
+                    strcpy(surft, surftext);
+                    surf = surface[0];
+                }
+            } else {
+                strcpy(surft, surftext);
+                surf = surface[0];
+            }
+            XYZtoV(&v[0], &brush.face[4].v[0]);
+            XYZtoV(&v[1], &brush.face[4].v[1]);
+            XYZtoV(&v[2], &brush.face[4].v[2]);
+            strcpy(brush.face[4].texture,
+                   (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? sidetext : surft));
+            brush.face[4].Shift[0] = (float) TexOffset[0];
+            brush.face[4].Shift[1] = (float) TexOffset[1];
+            brush.face[4].Rotate = 0.;
+            brush.face[4].Scale[0] = (float) TexScale[0];
+            brush.face[4].Scale[1] = (float) TexScale[1];
+            brush.face[4].Contents = contents;
+            brush.face[4].Surface = (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? surface[1] : surf);
+            brush.face[4].Value = (Plane == PLANE_XZ0 || Plane == PLANE_XZ1 ? 0 : ArghRad2);
+
+            MakeBrush(&brush);
+        }
+    }
+    CloseFuncGroup();
+
+    if (AddHints || GimpHints) {
+        int detail, i1, j1, N;
+        double front;
+
+        switch (Game) {
+            case HALFLIFE:
+                strcpy(hint, "HINT");
+                strcpy(skip, "HINT");
+                break;
+            case SIN:
+                strcpy(hint, "generic/misc/hint");
+                strcpy(skip, "generic/misc/skip");
+                break;
+            case HERETIC2:
+                strcpy(hint, "general/hint");
+                strcpy(skip, "general/hint"); // Heretic2 doesn't have a skip texture
+                break;
+            case KINGPIN:
+                strcpy(hint, "common/0_hint");
+                strcpy(skip, "common/0_skip");
+                break;
+            case GENESIS3D:
+                strcpy(hint, "hint");
+                strcpy(skip, "hint");
+                break;
+            case QUAKE3:
+                strcpy(hint, "textures/common/hint");
+                strcpy(skip, "textures/common/skip");
+                break;
+            default:
+                strcpy(hint, "e1u1/hint");
+                strcpy(skip, "e1u1/skip");
+        }
+
+        OpenFuncGroup();
+
+        if (AddHints == 1) {
+            detail = CONTENTS_DETAIL;
+            N = 0;
+            for (i = 0; i < NH; i++) {
+                i1 = i + 1;
+
+                for (j = 0; j < NV; j++) {
+
+                    // For detail hint brushes, no need to use a hint brush over
+                    // EVERY grid square... it would be redundant. Instead use
+                    // a checkerboard pattern
+                    if ((i + j) % 2) {
+                        continue;
+                    }
+
+                    j1 = j + 1;
+
+                    VectorCopy(xyz[i][j].p, v[0].p);
+                    switch (Plane) {
+                        case PLANE_XY1:
+                        case PLANE_XZ1:
+                        case PLANE_YZ1:
+                            VectorCopy(xyz[i1][j].p, v[1].p);
+                            VectorCopy(xyz[i1][j1].p, v[2].p);
+                            VectorCopy(xyz[i][j1].p, v[3].p);
+                            break;
+                        default:
+                            VectorCopy(xyz[i][j1].p, v[1].p);
+                            VectorCopy(xyz[i1][j1].p, v[2].p);
+                            VectorCopy(xyz[i1][j].p, v[3].p);
+                    }
+
+                    VectorCopy(v[0].p, v[4].p);
+                    VectorCopy(v[1].p, v[5].p);
+                    VectorCopy(v[2].p, v[6].p);
+                    VectorCopy(v[3].p, v[7].p);
+
+                    switch (Plane) {
+                        case PLANE_XY1:
+                            front = LessThan(zmin, 32.);
+                            v[4].p[2] = backface;
+                            v[5].p[2] = backface;
+                            v[6].p[2] = backface;
+                            v[7].p[2] = backface;
+                            break;
+                        case PLANE_XZ0:
+                            front = MoreThan(ymax, 32.);
+                            v[0].p[1] = backface;
+                            v[1].p[1] = backface;
+                            v[2].p[1] = backface;
+                            v[3].p[1] = backface;
+                            break;
+                        case PLANE_XZ1:
+                            front = LessThan(ymin, 32.);
+                            v[0].p[1] = backface;
+                            v[1].p[1] = backface;
+                            v[2].p[1] = backface;
+                            v[3].p[1] = backface;
+                            break;
+                        case PLANE_YZ0:
+                            front = MoreThan(xmax, 32.);
+                            v[4].p[0] = backface;
+                            v[5].p[0] = backface;
+                            v[6].p[0] = backface;
+                            v[7].p[0] = backface;
+                            break;
+                        case PLANE_YZ1:
+                            front = LessThan(xmin, 32.);
+                            v[4].p[0] = backface;
+                            v[5].p[0] = backface;
+                            v[6].p[0] = backface;
+                            v[7].p[0] = backface;
+                            break;
+                        default:
+                            front = MoreThan(zmax, 32.);
+                            v[4].p[2] = backface;
+                            v[5].p[2] = backface;
+                            v[6].p[2] = backface;
+                            v[7].p[2] = backface;
+                    }
+
+                    switch (Plane) {
+                        case PLANE_XZ0:
+                        case PLANE_XZ1:
+                            v[4].p[1] = front;
+                            v[5].p[1] = v[4].p[1];
+                            v[6].p[1] = v[4].p[1];
+                            v[7].p[1] = v[4].p[1];
+                            break;
+                        case PLANE_YZ0:
+                        case PLANE_YZ1:
+                            v[0].p[0] = front;
+                            v[1].p[0] = v[0].p[0];
+                            v[2].p[0] = v[0].p[0];
+                            v[3].p[0] = v[0].p[0];
+                            break;
+                        default:
+                            v[0].p[2] = front;
+                            v[1].p[2] = v[0].p[2];
+                            v[2].p[2] = v[0].p[2];
+                            v[3].p[2] = v[0].p[2];
+                    }
+
+                    brush.NumFaces = 6;
+                    brush.Number = N;
+                    XYZtoV(&v[0], &brush.face[0].v[0]);
+                    XYZtoV(&v[1], &brush.face[0].v[1]);
+                    XYZtoV(&v[2], &brush.face[0].v[2]);
+                    strcpy(brush.face[0].texture, skip);
+                    brush.face[0].Shift[0] = 0.;
+                    brush.face[0].Shift[1] = 0.;
+                    brush.face[0].Rotate = 0.;
+                    brush.face[0].Scale[0] = 1.;
+                    brush.face[0].Scale[1] = 1.;
+                    brush.face[0].Contents = detail;
+                    brush.face[0].Surface = SURF_SKIP;
+                    brush.face[0].Value = 0;
+
+                    XYZtoV(&v[4], &brush.face[1].v[0]);
+                    XYZtoV(&v[7], &brush.face[1].v[1]);
+                    XYZtoV(&v[6], &brush.face[1].v[2]);
+                    strcpy(brush.face[1].texture, skip);
+                    brush.face[1].Shift[0] = 0.;
+                    brush.face[1].Shift[1] = 0.;
+                    brush.face[1].Rotate = 0.;
+                    brush.face[1].Scale[0] = 1.;
+                    brush.face[1].Scale[1] = 1.;
+                    brush.face[1].Contents = detail;
+                    brush.face[1].Surface = SURF_SKIP;
+                    brush.face[1].Value = 0;
+
+                    XYZtoV(&v[0], &brush.face[2].v[0]);
+                    XYZtoV(&v[4], &brush.face[2].v[1]);
+                    XYZtoV(&v[5], &brush.face[2].v[2]);
+                    strcpy(brush.face[2].texture, hint);
+                    brush.face[2].Shift[0] = 0.;
+                    brush.face[2].Shift[1] = 0.;
+                    brush.face[2].Rotate = 0.;
+                    brush.face[2].Scale[0] = 1.;
+                    brush.face[2].Scale[1] = 1.;
+                    brush.face[2].Contents = detail;
+                    brush.face[2].Surface = SURF_HINT;
+                    brush.face[2].Value = 0;
+
+                    XYZtoV(&v[1], &brush.face[3].v[0]);
+                    XYZtoV(&v[5], &brush.face[3].v[1]);
+                    XYZtoV(&v[6], &brush.face[3].v[2]);
+                    strcpy(brush.face[3].texture, hint);
+                    brush.face[3].Shift[0] = 0.;
+                    brush.face[3].Shift[1] = 0.;
+                    brush.face[3].Rotate = 0.;
+                    brush.face[3].Scale[0] = 1.;
+                    brush.face[3].Scale[1] = 1.;
+                    brush.face[3].Contents = detail;
+                    brush.face[3].Surface = SURF_HINT;
+                    brush.face[3].Value = 0;
+
+                    XYZtoV(&v[2], &brush.face[4].v[0]);
+                    XYZtoV(&v[6], &brush.face[4].v[1]);
+                    XYZtoV(&v[7], &brush.face[4].v[2]);
+                    strcpy(brush.face[4].texture, hint);
+                    brush.face[4].Shift[0] = 0.;
+                    brush.face[4].Shift[1] = 0.;
+                    brush.face[4].Rotate = 0.;
+                    brush.face[4].Scale[0] = 1.;
+                    brush.face[4].Scale[1] = 1.;
+                    brush.face[4].Contents = detail;
+                    brush.face[4].Surface = SURF_HINT;
+                    brush.face[4].Value = 0;
+
+                    XYZtoV(&v[3], &brush.face[5].v[0]);
+                    XYZtoV(&v[7], &brush.face[5].v[1]);
+                    XYZtoV(&v[4], &brush.face[5].v[2]);
+                    strcpy(brush.face[5].texture, hint);
+                    brush.face[5].Shift[0] = 0.;
+                    brush.face[5].Shift[1] = 0.;
+                    brush.face[5].Rotate = 0.;
+                    brush.face[5].Scale[0] = 1.;
+                    brush.face[5].Scale[1] = 1.;
+                    brush.face[5].Contents = detail;
+                    brush.face[5].Surface = SURF_HINT;
+                    brush.face[5].Value = 0;
+
+                    MakeBrush(&brush);
+                    N++;
+                }
+            }
+        }
+        if (GimpHints) {
+            N = 0;
+            // these brush parameters never change
+            brush.NumFaces = 5;
+            for (i = 0; i < 6; i++) {
+                strcpy(brush.face[i].texture, hint);
+                brush.face[i].Shift[0] = 0.;
+                brush.face[i].Shift[1] = 0.;
+                brush.face[i].Rotate = 0.;
+                brush.face[i].Scale[0] = 1.;
+                brush.face[i].Scale[1] = 1.;
+                brush.face[i].Contents = 0;
+                brush.face[i].Surface = SURF_HINT;
+                brush.face[i].Value = 0;
+            }
+            for (i = 0; i < NH; i++) {
+                for (j = 0; j < NV; j++) {
+                    for (k = 0; k < 2; k++) {
+                        if (k == 0) {
+                            if ((i + j) % 2) {
+                                VectorCopy(xyz[i][j].p, v[0].p);
+                                switch (Plane) {
+                                    case PLANE_XY1:
+                                    case PLANE_XZ1:
+                                    case PLANE_YZ1:
+                                        VectorCopy(xyz[i + 1][j].p, v[1].p);
+                                        VectorCopy(xyz[i + 1][j + 1].p, v[2].p);
+                                        break;
+                                    default:
+                                        VectorCopy(xyz[i + 1][j + 1].p, v[1].p);
+                                        VectorCopy(xyz[i + 1][j].p, v[2].p);
+                                }
+                            } else {
+                                VectorCopy(xyz[i][j].p, v[0].p);
+                                switch (Plane) {
+                                    case PLANE_XY1:
+                                    case PLANE_XZ1:
+                                    case PLANE_YZ1:
+                                        VectorCopy(xyz[i + 1][j].p, v[1].p);
+                                        VectorCopy(xyz[i][j + 1].p, v[2].p);
+                                        break;
+                                    default:
+                                        VectorCopy(xyz[i][j + 1].p, v[1].p);
+                                        VectorCopy(xyz[i + 1][j].p, v[2].p);
+                                }
+                            }
+                        } else {
+                            if ((i + j) % 2) {
+                                VectorCopy(xyz[i][j + 1].p, v[0].p);
+                                switch (Plane) {
+                                    case PLANE_XY1:
+                                    case PLANE_XZ1:
+                                    case PLANE_YZ1:
+                                        VectorCopy(xyz[i][j].p, v[1].p);
+                                        VectorCopy(xyz[i + 1][j + 1].p, v[2].p);
+                                        break;
+                                    default:
+                                        VectorCopy(xyz[i + 1][j + 1].p, v[1].p);
+                                        VectorCopy(xyz[i][j].p, v[2].p);
+                                }
+                            } else {
+                                VectorCopy(xyz[i][j + 1].p, v[0].p);
+                                switch (Plane) {
+                                    case PLANE_XY1:
+                                    case PLANE_XZ1:
+                                    case PLANE_YZ1:
+                                        VectorCopy(xyz[i + 1][j].p, v[1].p);
+                                        VectorCopy(xyz[i + 1][j + 1].p, v[2].p);
+                                        break;
+                                    default:
+                                        VectorCopy(xyz[i + 1][j + 1].p, v[1].p);
+                                        VectorCopy(xyz[i + 1][j].p, v[2].p);
+                                }
+                            }
+                        }
+                        VectorCopy(v[0].p, v[3].p);
+                        VectorCopy(v[1].p, v[4].p);
+                        VectorCopy(v[2].p, v[5].p);
+                        switch (Plane) {
+                            case PLANE_XY0:
+                                v[0].p[2] += HINT_OFFSET;
+                                v[1].p[2] += HINT_OFFSET;
+                                v[2].p[2] += HINT_OFFSET;
 //              v[3].p[2] = backface;
 //              v[4].p[2] = backface;
 //              v[5].p[2] = backface;
-                                                       break;
-                                               case PLANE_XY1:
-                                                       v[0].p[2] -= HINT_OFFSET;
-                                                       v[1].p[2] -= HINT_OFFSET;
-                                                       v[2].p[2] -= HINT_OFFSET;
+                                break;
+                            case PLANE_XY1:
+                                v[0].p[2] -= HINT_OFFSET;
+                                v[1].p[2] -= HINT_OFFSET;
+                                v[2].p[2] -= HINT_OFFSET;
 //              v[3].p[2] = backface;
 //              v[4].p[2] = backface;
 //              v[5].p[2] = backface;
-                                                       break;
-                                               case PLANE_XZ0:
+                                break;
+                            case PLANE_XZ0:
 //              v[0].p[1] = backface;
 //              v[1].p[1] = backface;
 //              v[2].p[1] = backface;
-                                                       v[3].p[1] += HINT_OFFSET;
-                                                       v[4].p[1] += HINT_OFFSET;
-                                                       v[5].p[1] += HINT_OFFSET;
-                                                       break;
-                                               case PLANE_XZ1:
+                                v[3].p[1] += HINT_OFFSET;
+                                v[4].p[1] += HINT_OFFSET;
+                                v[5].p[1] += HINT_OFFSET;
+                                break;
+                            case PLANE_XZ1:
 //              v[0].p[1] = backface;
 //              v[1].p[1] = backface;
 //              v[2].p[1] = backface;
-                                                       v[3].p[1] -= HINT_OFFSET;
-                                                       v[4].p[1] -= HINT_OFFSET;
-                                                       v[5].p[1] -= HINT_OFFSET;
-                                                       break;
-                                               case PLANE_YZ0:
-                                                       v[0].p[0] += HINT_OFFSET;
-                                                       v[1].p[0] += HINT_OFFSET;
-                                                       v[2].p[0] += HINT_OFFSET;
+                                v[3].p[1] -= HINT_OFFSET;
+                                v[4].p[1] -= HINT_OFFSET;
+                                v[5].p[1] -= HINT_OFFSET;
+                                break;
+                            case PLANE_YZ0:
+                                v[0].p[0] += HINT_OFFSET;
+                                v[1].p[0] += HINT_OFFSET;
+                                v[2].p[0] += HINT_OFFSET;
 //              v[3].p[0] = backface;
 //              v[4].p[0] = backface;
 //              v[5].p[0] = backface;
-                                                       break;
-                                               case PLANE_YZ1:
-                                                       v[0].p[0] -= HINT_OFFSET;
-                                                       v[1].p[0] -= HINT_OFFSET;
-                                                       v[2].p[0] -= HINT_OFFSET;
+                                break;
+                            case PLANE_YZ1:
+                                v[0].p[0] -= HINT_OFFSET;
+                                v[1].p[0] -= HINT_OFFSET;
+                                v[2].p[0] -= HINT_OFFSET;
 //              v[3].p[0] = backface;
 //              v[4].p[0] = backface;
 //              v[5].p[0] = backface;
-                                                       break;
-                                               }
-                                               brush.Number   = N;
-                                               XYZtoV( &v[0],&brush.face[0].v[0] );
-                                               XYZtoV( &v[3],&brush.face[0].v[1] );
-                                               XYZtoV( &v[4],&brush.face[0].v[2] );
-
-                                               XYZtoV( &v[1],&brush.face[1].v[0] );
-                                               XYZtoV( &v[4],&brush.face[1].v[1] );
-                                               XYZtoV( &v[5],&brush.face[1].v[2] );
-
-                                               XYZtoV( &v[2],&brush.face[2].v[0] );
-                                               XYZtoV( &v[5],&brush.face[2].v[1] );
-                                               XYZtoV( &v[3],&brush.face[2].v[2] );
-
-                                               XYZtoV( &v[3],&brush.face[3].v[0] );
-                                               XYZtoV( &v[5],&brush.face[3].v[1] );
-                                               XYZtoV( &v[4],&brush.face[3].v[2] );
-
-                                               XYZtoV( &v[0],&brush.face[4].v[0] );
-                                               XYZtoV( &v[1],&brush.face[4].v[1] );
-                                               XYZtoV( &v[2],&brush.face[4].v[2] );
-
-                                               MakeBrush( &brush );
-                                               N++;
-                                       }
-                               }
-                       }
-               } // endif AddHints==1
-               CloseFuncGroup();
-       }
+                                break;
+                        }
+                        brush.Number = N;
+                        XYZtoV(&v[0], &brush.face[0].v[0]);
+                        XYZtoV(&v[3], &brush.face[0].v[1]);
+                        XYZtoV(&v[4], &brush.face[0].v[2]);
+
+                        XYZtoV(&v[1], &brush.face[1].v[0]);
+                        XYZtoV(&v[4], &brush.face[1].v[1]);
+                        XYZtoV(&v[5], &brush.face[1].v[2]);
+
+                        XYZtoV(&v[2], &brush.face[2].v[0]);
+                        XYZtoV(&v[5], &brush.face[2].v[1]);
+                        XYZtoV(&v[3], &brush.face[2].v[2]);
+
+                        XYZtoV(&v[3], &brush.face[3].v[0]);
+                        XYZtoV(&v[5], &brush.face[3].v[1]);
+                        XYZtoV(&v[4], &brush.face[3].v[2]);
+
+                        XYZtoV(&v[0], &brush.face[4].v[0]);
+                        XYZtoV(&v[1], &brush.face[4].v[1]);
+                        XYZtoV(&v[2], &brush.face[4].v[2]);
+
+                        MakeBrush(&brush);
+                        N++;
+                    }
+                }
+            }
+        } // endif AddHints==1
+        CloseFuncGroup();
+    }
 
 } // end MapBrushes
 
 //=============================================================
-void GenerateMap(){
-       extern void MapOut( int,int,NODE *,TRI * );
-       extern bool SingleBrushSelected;
-       int ntri;
-
-       if ( !ValidSurface() ) {
-               return;
-       }
-       /*
+void GenerateMap()
+{
+    extern void MapOut(int, int, NODE *, TRI *);
+    extern bool SingleBrushSelected;
+    int ntri;
+
+    if (!ValidSurface()) {
+        return;
+    }
+    /*
           ghCursorCurrent = LoadCursor(NULL,IDC_WAIT);
           SetCursor(ghCursorCurrent);
         */
 #if 0
-       if ( SingleBrushSelected ) {
+                                                                                                                            if ( SingleBrushSelected ) {
                g_FuncTable.m_pfnDeleteSelection();
        }
 #endif
 
-       GenerateXYZ();
-       ntri = NH * NV * 2;
+    GenerateXYZ();
+    ntri = NH * NV * 2;
 
-       if ( Game == QUAKE3 && UsePatches != 0 ) {
-               MapPatches();
-       }
+    if (Game == QUAKE3 && UsePatches != 0) {
+        MapPatches();
+    }
 
-       if ( Decimate > 0 && ( Game != QUAKE3 || UsePatches == 0 ) ) {
-               MapOut( gNumNodes,gNumTris,gNode,gTri );
-               /*
+    if (Decimate > 0 && (Game != QUAKE3 || UsePatches == 0)) {
+        MapOut(gNumNodes, gNumTris, gNode, gTri);
+        /*
                   ghCursorCurrent = ghCursorDefault;
                   SetCursor(ghCursorCurrent);
                 */
-               return;
-       }
-
-       contents = 0;
-       // HL doesn't have detail property
-       if ( ( Game != HALFLIFE ) && UseDetail ) {
-               contents += CONTENTS_DETAIL;
-       }
-       // HL and Q3 don't have ladder property
-       if ( ( Game != HALFLIFE && Game != QUAKE3 ) && UseLadder ) {
-               contents += CONTENTS_LADDER;
-       }
-       // Genesis requires solid property to be set explicitly
-       if ( Game == GENESIS3D ) {
-               contents |= CONTENTS_SOLID;
-       }
-       // Heretic 2 uses different sounds (in surface props) for different texture types
-       if ( Game == HERETIC2 ) {
-               surface[0] = GetDefSurfaceProps( Texture[Game][0] );
-               surface[1] = GetDefSurfaceProps( Texture[Game][1] );
-               surface[2] = GetDefSurfaceProps( Texture[Game][2] );
-       }
-       else
-       {
-               surface[0] = 0;
-               surface[1] = 0;
-               surface[2] = 0;
-       }
-       if ( Game != QUAKE3 || UsePatches == 0 ) {
-               MapBrushes();
-       }
-
-       /*
+        return;
+    }
+
+    contents = 0;
+    // HL doesn't have detail property
+    if ((Game != HALFLIFE) && UseDetail) {
+        contents += CONTENTS_DETAIL;
+    }
+    // HL and Q3 don't have ladder property
+    if ((Game != HALFLIFE && Game != QUAKE3) && UseLadder) {
+        contents += CONTENTS_LADDER;
+    }
+    // Genesis requires solid property to be set explicitly
+    if (Game == GENESIS3D) {
+        contents |= CONTENTS_SOLID;
+    }
+    // Heretic 2 uses different sounds (in surface props) for different texture types
+    if (Game == HERETIC2) {
+        surface[0] = GetDefSurfaceProps(Texture[Game][0]);
+        surface[1] = GetDefSurfaceProps(Texture[Game][1]);
+        surface[2] = GetDefSurfaceProps(Texture[Game][2]);
+    } else {
+        surface[0] = 0;
+        surface[1] = 0;
+        surface[2] = 0;
+    }
+    if (Game != QUAKE3 || UsePatches == 0) {
+        MapBrushes();
+    }
+
+    /*
           ghCursorCurrent = ghCursorDefault;
           SetCursor(ghCursorCurrent);
         */
 }
 
 //=============================================================
-void GenerateXYZ(){
-       extern void MakeDecimatedMap( int *, int *, NODE * *, TRI * * );
-       double zl, zu;
-       double wh, wv;
-       int NHalfcycles;
-       double a,v,h,ha,va;
-       double delta, dr, rate;
-       double range, maxrange;
-       double r;
-       int i, j, k, N;
-       int i0, i1, j0, j1;
-       int ii, jj;
+void GenerateXYZ()
+{
+    extern void MakeDecimatedMap(int *, int *, NODE **, TRI **);
+    double zl, zu;
+    double wh, wv;
+    int NHalfcycles;
+    double a, v, h, ha, va;
+    double delta, dr, rate;
+    double range, maxrange;
+    double r;
+    int i, j, k, N;
+    int i0, i1, j0, j1;
+    int ii, jj;
 
 //  FILE *f;
 //  char CSV[64];
 
-       if ( !ValidSurface() ) {
-               return;
-       }
-
-       srand( 1 );
-       srand( RandomSeed );
-
-       dh = ( Hur - Hll ) / NH;
-       dv = ( Vur - Vll ) / NV;
-
-       // H & V
-       for ( i = 0; i <= NH; i++ )
-       {
-               for ( j = 0; j <= NV; j++ )
-               {
-                       switch ( Plane )
-                       {
-                       case PLANE_XZ0:
-                       case PLANE_XZ1:
-                               xyz[i][j].p[0] = Hll + i * dh;
-                               xyz[i][j].p[2] = Vll + j * dv;
-                               break;
-                       case PLANE_YZ0:
-                       case PLANE_YZ1:
-                               xyz[i][j].p[1] = Hll + i * dh;
-                               xyz[i][j].p[2] = Vll + j * dv;
-                               break;
-                       default:
-                               xyz[i][j].p[0] = Hll + i * dh;
-                               xyz[i][j].p[1] = Vll + j * dv;
-                       }
-               }
-       }
-
-       if ( WaveType == WAVE_BITMAP ) {
-               GenerateBitmapMapping();
-       }
-       /*
+    if (!ValidSurface()) {
+        return;
+    }
+
+    srand(1);
+    srand(RandomSeed);
+
+    dh = (Hur - Hll) / NH;
+    dv = (Vur - Vll) / NV;
+
+    // H & V
+    for (i = 0; i <= NH; i++) {
+        for (j = 0; j <= NV; j++) {
+            switch (Plane) {
+                case PLANE_XZ0:
+                case PLANE_XZ1:
+                    xyz[i][j].p[0] = Hll + i * dh;
+                    xyz[i][j].p[2] = Vll + j * dv;
+                    break;
+                case PLANE_YZ0:
+                case PLANE_YZ1:
+                    xyz[i][j].p[1] = Hll + i * dh;
+                    xyz[i][j].p[2] = Vll + j * dv;
+                    break;
+                default:
+                    xyz[i][j].p[0] = Hll + i * dh;
+                    xyz[i][j].p[1] = Vll + j * dv;
+            }
+        }
+    }
+
+    if (WaveType == WAVE_BITMAP) {
+        GenerateBitmapMapping();
+    }
+        /*
           else if(WaveType == WAVE_FORMULA)
           DoFormula();
         */
-       else
-       {
-               // Initialize Z values using bilinear interpolation
-               for ( i = 0; i <= NH; i++ )
-               {
-                       zl = Z00 + i * ( Z10 - Z00 ) / NH;
-                       zu = Z01 + i * ( Z11 - Z01 ) / NH;
-                       switch ( Plane )
-                       {
-                       case PLANE_XZ0:
-                       case PLANE_XZ1:
-                               for ( j = 0; j <= NV; j++ )
-                                       xyz[i][j].p[1] = zl + j * ( zu - zl ) / NV;
-                               break;
-                       case PLANE_YZ0:
-                       case PLANE_YZ1:
-                               for ( j = 0; j <= NV; j++ )
-                                       xyz[i][j].p[0] = zl + j * ( zu - zl ) / NV;
-                               break;
-                       default:
-                               for ( j = 0; j <= NV; j++ )
-                                       xyz[i][j].p[2] = zl + j * ( zu - zl ) / NV;
-                       }
-               }
-       }
-
-       switch ( WaveType )
-       {
-       case WAVE_COS_SIN:
-               if ( FixBorders ) {
-                       NHalfcycles = (int)( ( Hur - Hll ) / ( WaveLength / 2. ) );
-                       NHalfcycles = max( NHalfcycles,1 );
-                       wh = 2. * ( Hur - Hll ) / NHalfcycles;
-                       NHalfcycles = (int)( ( Vur - Vll ) / ( WaveLength / 2. ) );
-                       wv = 2. * ( Vur - Vll ) / NHalfcycles;
-                       NHalfcycles = max( NHalfcycles,1 );
-                       i0 = 1;
-                       i1 = NH - 1;
-                       j0 = 1;
-                       j1 = NV - 1;
-               }
-               else
-               {
-                       wh = WaveLength;
-                       wv = WaveLength;
-                       i0 = 0;
-                       i1 = NH;
-                       j0 = 0;
-                       j1 = NV;
-               }
-
-               for ( i = i0; i <= i1; i++ )
-               {
-                       h  = Hll + i * dh;
-                       ha = ( ( h - Hll ) / wh ) * 2. * PI - PI / 2.;
-                       for ( j = j0; j <= j1; j++ )
-                       {
-                               v  = Vll + j * dv;
-                               va = ( ( v - Vll ) / wv ) * 2. * PI;
-                               a = Amplitude * cos( ha ) * sin( va );
-                               switch ( Plane )
-                               {
-                               case PLANE_XY1:
-                                       xyz[i][j].p[2] -= a;
-                                       break;
-                               case PLANE_XZ0:
-                                       xyz[i][j].p[1] += a;
-                                       break;
-                               case PLANE_XZ1:
-                                       xyz[i][j].p[1] -= a;
-                                       break;
-                               case PLANE_YZ0:
-                                       xyz[i][j].p[0] += a;
-                                       break;
-                               case PLANE_YZ1:
-                                       xyz[i][j].p[0] -= a;
-                                       break;
-                               default:
-                                       xyz[i][j].p[2] += a;
-                               }
-                       }
-               }
-               break;
-       case WAVE_HCYLINDER:
-               for ( i = 0; i <= NH; i++ )
-               {
-                       h  = Hll + i * dh;
-                       ha = ( ( h - Hll ) / WaveLength ) * 2. * PI - PI / 2.;
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               a = Amplitude * cos( ha );
-                               switch ( Plane )
-                               {
-                               case PLANE_XY1:
-                                       xyz[i][j].p[2] -= a;
-                                       break;
-                               case PLANE_XZ0:
-                                       xyz[i][j].p[1] += a;
-                                       break;
-                               case PLANE_XZ1:
-                                       xyz[i][j].p[1] -= a;
-                                       break;
-                               case PLANE_YZ0:
-                                       xyz[i][j].p[0] += a;
-                                       break;
-                               case PLANE_YZ1:
-                                       xyz[i][j].p[0] -= a;
-                                       break;
-                               default:
-                                       xyz[i][j].p[2] += a;
-                               }
-                       }
-               }
-               break;
-       case WAVE_VCYLINDER:
-               for ( i = 0; i <= NH; i++ )
-               {
-                       h  = Hll + i * dh;
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               v  = Vll + j * dv;
-                               va = ( ( v - Vll ) / WaveLength ) * 2. * PI;
-                               a = Amplitude * sin( va );
-                               switch ( Plane )
-                               {
-                               case PLANE_XY1:
-                                       xyz[i][j].p[2] -= a;
-                                       break;
-                               case PLANE_XZ0:
-                                       xyz[i][j].p[1] += a;
-                                       break;
-                               case PLANE_XZ1:
-                                       xyz[i][j].p[1] -= a;
-                                       break;
-                               case PLANE_YZ0:
-                                       xyz[i][j].p[0] += a;
-                                       break;
-                               case PLANE_YZ1:
-                                       xyz[i][j].p[0] -= a;
-                                       break;
-                               default:
-                                       xyz[i][j].p[2] += a;
-                               }
-                       }
-               }
-               break;
-       case WAVE_ROUGH_ONLY:
-               PlasmaCloud();
-               break;
-       }
-
-       if ( WaveType != WAVE_ROUGH_ONLY ) {
-               // Fixed values
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               if ( xyz[i][j].fixed ) {
-                                       switch ( Plane )
-                                       {
-                                       case PLANE_XZ0:
-                                       case PLANE_XZ1:
-                                               xyz[i][j].p[1] = xyz[i][j].fixed_value;
-                                               break;
-                                       case PLANE_YZ0:
-                                       case PLANE_YZ1:
-                                               xyz[i][j].p[0] = xyz[i][j].fixed_value;
-                                               break;
-                                       default:
-                                               xyz[i][j].p[2] = xyz[i][j].fixed_value;
-                                       }
-
-                                       if ( xyz[i][j].range > 0 ) {
-                                               maxrange = pow( xyz[i][j].range,2 ); // so we don't have to do sqrt's
-                                               i0 = i - (int)( floor( xyz[i][j].range / dh - 0.5 ) + 1 );
-                                               i1 = i + i - i0;
-                                               j0 = j - (int)( floor( xyz[i][j].range / dv - 0.5 ) + 1 );
-                                               j1 = j + j - j0;
-                                               if ( FixBorders ) {
-                                                       i0 = max( i0,1 );
-                                                       i1 = min( i1,NH - 1 );
-                                                       j0 = max( j0,1 );
-                                                       j1 = min( j1,NV - 1 );
-                                               }
-                                               else
-                                               {
-                                                       i0 = max( i0,0 );
-                                                       i1 = min( i1,NH );
-                                                       j0 = max( j0,0 );
-                                                       j1 = min( j1,NV );
-                                               }
-                                               for ( ii = i0; ii <= i1; ii++ )
-                                               {
-                                                       for ( jj = j0; jj <= j1; jj++ )
-                                                       {
-                                                               if ( ii == i && jj == j ) {
-                                                                       continue;
-                                                               }
-                                                               range = pow( dh * ( i - ii ), 2 ) + pow( dv * ( j - jj ), 2 );
-                                                               if ( range > maxrange ) {
-                                                                       continue;
-                                                               }
-                                                               dr = sqrt( range / maxrange );
-                                                               rate = max( -30.,min( xyz[i][j].rate,30. ) );
-                                                               if ( rate < -1. ) {
-                                                                       delta = pow( ( 1. - dr ),-rate + 1. );
-                                                               }
-                                                               else if ( rate < 0. ) {
-                                                                       delta = ( 1 + rate ) * 0.5 * ( cos( dr * PI ) + 1.0 ) -
-                                                                                       rate*pow( ( 1. - dr ),2 );
-                                                               }
-                                                               else if ( rate == 0. ) {
-                                                                       delta = 0.5 * ( cos( dr * PI ) + 1.0 );
-                                                               }
-                                                               else if ( rate <= 1. ) {
-                                                                       delta = ( 1. - rate ) * 0.5 * ( cos( dr * PI ) + 1.0 ) +
-                                                                                       rate * ( 1. - pow( dr,2 ) );
-                                                               }
-                                                               else
-                                                               {
-                                                                       delta = 1. - pow( dr,rate + 1 );
-                                                               }
-                                                               switch ( Plane )
-                                                               {
-                                                               case PLANE_XZ0:
-                                                               case PLANE_XZ1:
-                                                                       xyz[ii][jj].p[1] += ( xyz[i][j].p[1] - xyz[ii][jj].p[1] ) * delta;
-                                                                       break;
-                                                               case PLANE_YZ0:
-                                                               case PLANE_YZ1:
-                                                                       xyz[ii][jj].p[0] += ( xyz[i][j].p[0] - xyz[ii][jj].p[0] ) * delta;
-                                                                       break;
-                                                               default:
-                                                                       xyz[ii][jj].p[2] += ( xyz[i][j].p[2] - xyz[ii][jj].p[2] ) * delta;
-                                                               }
-                                                       }
-                                               }
-                                       }
-                               }
-                       }
-               }
-       }
-
-       if ( ( Roughness > 0. ) && ( WaveType != WAVE_ROUGH_ONLY ) ) {
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               if ( CanEdit( i,j ) && !xyz[i][j].fixed ) {
-                                       switch ( Plane )
-                                       {
-                                       case PLANE_XZ0:
-                                       case PLANE_XZ1:
-                                               xyz[i][j].p[1] += -Roughness / 2. + Roughness * ( (double)rand() / (double)RAND_MAX );
-                                               break;
-                                       case PLANE_YZ0:
-                                       case PLANE_YZ1:
-                                               xyz[i][j].p[0] += -Roughness / 2. + Roughness * ( (double)rand() / (double)RAND_MAX );
-                                               break;
-                                       default:
-                                               xyz[i][j].p[2] += -Roughness / 2. + Roughness * ( (double)rand() / (double)RAND_MAX );
-                                       }
-                               }
-                               else{
-                                       r = rand(); // We still get a random number, so that fixing points
-                               }
-                               // doesn't change the sequence.
-
-                       }
-               }
-       }
-
-       for ( i = 0; i <= NH; i++ )
-       {
-               for ( j = 0; j <= NV; j++ )
-               {
-                       for ( k = 0; k < 3; k++ )
-                       {
-                               xyz[i][j].p[k] = Nearest( xyz[i][j].p[k],2.0 );
-                       }
-               }
-       }
-
-       // Find minima and maxima
-       switch ( Plane )
-       {
-       case PLANE_XZ0:
-       case PLANE_XZ1:
-               xmin = Hll;
-               xmax = Hur;
-               zmin = Vll;
-               zmax = Vur;
-               ymin = xyz[0][0].p[1];
-               ymax = ymin;
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               ymin = min( ymin,xyz[i][j].p[1] );
-                               ymax = max( ymax,xyz[i][j].p[1] );
-                       }
-               }
-               break;
-       case PLANE_YZ0:
-       case PLANE_YZ1:
-               ymin = Hll;
-               ymax = Hur;
-               zmin = Vll;
-               zmax = Vur;
-               xmin = xyz[0][0].p[0];
-               xmax = ymin;
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               xmin = min( xmin,xyz[i][j].p[0] );
-                               xmax = max( xmax,xyz[i][j].p[0] );
-                       }
-               }
-               break;
-               break;
-       default:
-               xmin = Hll;
-               xmax = Hur;
-               ymin = Vll;
-               ymax = Vur;
-               zmin = xyz[0][0].p[2];
-               zmax = zmin;
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               zmin = min( zmin,xyz[i][j].p[2] );
-                               zmax = max( zmax,xyz[i][j].p[2] );
-                       }
-               }
-       }
-
-       xmin = Nearest( xmin,2. );
-       xmax = Nearest( xmax,2. );
-       ymin = Nearest( ymin,2. );
-       ymax = Nearest( ymax,2. );
-       zmin = Nearest( zmin,2. );
-       zmax = Nearest( zmax,2. );
-
-       switch ( Plane )
-       {
-       case PLANE_XY1:
-               backface = AtLeast( zmax + 32.,32. );
-               break;
-       case PLANE_XZ0:
-               backface = NoMoreThan( ymin - 32.,32. );
-               break;
-       case PLANE_XZ1:
-               backface = AtLeast( ymax + 32.,32. );
-               break;
-       case PLANE_YZ0:
-               backface = NoMoreThan( xmin - 32.,32. );
-               break;
-       case PLANE_YZ1:
-               backface = AtLeast( xmax + 32.,32. );
-               break;
-       default:
-               backface = NoMoreThan( zmin - 32.,32. );
-       }
-
-       if ( gNode ) {
-               free( gNode );
-               free( gTri );
-               gNode = (NODE *)NULL;
-               gTri  = (TRI *)NULL;
-       }
-       if ( Decimate > 0 && ( Game != QUAKE3 || UsePatches == 0 ) ) {
-               MakeDecimatedMap( &gNumNodes,&gNumTris,&gNode,&gTri );
-       }
-       else
-       {
-               gNumNodes = ( NH + 1 ) * ( NV + 1 );
-               gNumTris  = NH * NV * 2;
-               gNode = (NODE *) malloc( gNumNodes * sizeof( NODE ) );
-               gTri = (TRI *) malloc( gNumTris * sizeof( TRI ) );
-
-               for ( i = 0,N = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++, N++ )
-                       {
-                               gNode[N].used = 1;
-                               gNode[N].p[0] = (float)xyz[i][j].p[0];
-                               gNode[N].p[1] = (float)xyz[i][j].p[1];
-                               gNode[N].p[2] = (float)xyz[i][j].p[2];
-                       }
-               }
-
-               for ( i = 0; i < NH; i++ )
-               {
-                       for ( j = 0; j < NV; j++ )
-                       {
-                               k = i * NV * 2 + j * 2;
-                               if ( ( i + j ) % 2 ) {
-                                       switch ( Plane )
-                                       {
-                                       case PLANE_XY1:
-                                       case PLANE_XZ1:
-                                       case PLANE_YZ1:
-                                               gTri[k  ].v[0] = i * ( NV + 1 ) + j;
-                                               gTri[k  ].v[1] = ( i + 1 ) * ( NV + 1 ) + j + 1;
-                                               gTri[k  ].v[2] = ( i + 1 ) * ( NV + 1 ) + j;
-                                               gTri[k + 1].v[0] = i * ( NV + 1 ) + j;
-                                               gTri[k + 1].v[1] = i * ( NV + 1 ) + j + 1;
-                                               gTri[k + 1].v[2] = ( i + 1 ) * ( NV + 1 ) + j + 1;
-                                               break;
-                                       default:
-                                               gTri[k  ].v[0] = i * ( NV + 1 ) + j;
-                                               gTri[k  ].v[1] = ( i + 1 ) * ( NV + 1 ) + j;
-                                               gTri[k  ].v[2] = ( i + 1 ) * ( NV + 1 ) + j + 1;
-                                               gTri[k + 1].v[0] = i * ( NV + 1 ) + j;
-                                               gTri[k + 1].v[1] = ( i + 1 ) * ( NV + 1 ) + j + 1;
-                                               gTri[k + 1].v[2] = i * ( NV + 1 ) + j + 1;
-                                       }
-                               }
-                               else
-                               {
-                                       switch ( Plane )
-                                       {
-                                       case PLANE_XY1:
-                                       case PLANE_XZ1:
-                                       case PLANE_YZ1:
-                                               gTri[k  ].v[0] = i * ( NV + 1 ) + j;
-                                               gTri[k  ].v[1] = i * ( NV + 1 ) + j + 1;
-                                               gTri[k  ].v[2] = ( i + 1 ) * ( NV + 1 ) + j;
-                                               gTri[k + 1].v[0] = ( i + 1 ) * ( NV + 1 ) + j;
-                                               gTri[k + 1].v[1] = i * ( NV + 1 ) + j + 1;
-                                               gTri[k + 1].v[2] = ( i + 1 ) * ( NV + 1 ) + j + 1;
-                                               break;
-                                       default:
-                                               gTri[k  ].v[0] = i * ( NV + 1 ) + j;
-                                               gTri[k  ].v[1] = ( i + 1 ) * ( NV + 1 ) + j;
-                                               gTri[k  ].v[2] = i * ( NV + 1 ) + j + 1;
-                                               gTri[k + 1].v[0] = ( i + 1 ) * ( NV + 1 ) + j;
-                                               gTri[k + 1].v[1] = ( i + 1 ) * ( NV + 1 ) + j + 1;
-                                               gTri[k + 1].v[2] = i * ( NV + 1 ) + j + 1;
-                                       }
-                               }
-                       }
-               }
-       }
+    else {
+        // Initialize Z values using bilinear interpolation
+        for (i = 0; i <= NH; i++) {
+            zl = Z00 + i * (Z10 - Z00) / NH;
+            zu = Z01 + i * (Z11 - Z01) / NH;
+            switch (Plane) {
+                case PLANE_XZ0:
+                case PLANE_XZ1:
+                    for (j = 0; j <= NV; j++) {
+                        xyz[i][j].p[1] = zl + j * (zu - zl) / NV;
+                    }
+                    break;
+                case PLANE_YZ0:
+                case PLANE_YZ1:
+                    for (j = 0; j <= NV; j++) {
+                        xyz[i][j].p[0] = zl + j * (zu - zl) / NV;
+                    }
+                    break;
+                default:
+                    for (j = 0; j <= NV; j++) {
+                        xyz[i][j].p[2] = zl + j * (zu - zl) / NV;
+                    }
+            }
+        }
+    }
+
+    switch (WaveType) {
+        case WAVE_COS_SIN:
+            if (FixBorders) {
+                NHalfcycles = (int) ((Hur - Hll) / (WaveLength / 2.));
+                NHalfcycles = max(NHalfcycles, 1);
+                wh = 2. * (Hur - Hll) / NHalfcycles;
+                NHalfcycles = (int) ((Vur - Vll) / (WaveLength / 2.));
+                wv = 2. * (Vur - Vll) / NHalfcycles;
+                NHalfcycles = max(NHalfcycles, 1);
+                i0 = 1;
+                i1 = NH - 1;
+                j0 = 1;
+                j1 = NV - 1;
+            } else {
+                wh = WaveLength;
+                wv = WaveLength;
+                i0 = 0;
+                i1 = NH;
+                j0 = 0;
+                j1 = NV;
+            }
+
+            for (i = i0; i <= i1; i++) {
+                h = Hll + i * dh;
+                ha = ((h - Hll) / wh) * 2. * PI - PI / 2.;
+                for (j = j0; j <= j1; j++) {
+                    v = Vll + j * dv;
+                    va = ((v - Vll) / wv) * 2. * PI;
+                    a = Amplitude * cos(ha) * sin(va);
+                    switch (Plane) {
+                        case PLANE_XY1:
+                            xyz[i][j].p[2] -= a;
+                            break;
+                        case PLANE_XZ0:
+                            xyz[i][j].p[1] += a;
+                            break;
+                        case PLANE_XZ1:
+                            xyz[i][j].p[1] -= a;
+                            break;
+                        case PLANE_YZ0:
+                            xyz[i][j].p[0] += a;
+                            break;
+                        case PLANE_YZ1:
+                            xyz[i][j].p[0] -= a;
+                            break;
+                        default:
+                            xyz[i][j].p[2] += a;
+                    }
+                }
+            }
+            break;
+        case WAVE_HCYLINDER:
+            for (i = 0; i <= NH; i++) {
+                h = Hll + i * dh;
+                ha = ((h - Hll) / WaveLength) * 2. * PI - PI / 2.;
+                for (j = 0; j <= NV; j++) {
+                    a = Amplitude * cos(ha);
+                    switch (Plane) {
+                        case PLANE_XY1:
+                            xyz[i][j].p[2] -= a;
+                            break;
+                        case PLANE_XZ0:
+                            xyz[i][j].p[1] += a;
+                            break;
+                        case PLANE_XZ1:
+                            xyz[i][j].p[1] -= a;
+                            break;
+                        case PLANE_YZ0:
+                            xyz[i][j].p[0] += a;
+                            break;
+                        case PLANE_YZ1:
+                            xyz[i][j].p[0] -= a;
+                            break;
+                        default:
+                            xyz[i][j].p[2] += a;
+                    }
+                }
+            }
+            break;
+        case WAVE_VCYLINDER:
+            for (i = 0; i <= NH; i++) {
+                h = Hll + i * dh;
+                for (j = 0; j <= NV; j++) {
+                    v = Vll + j * dv;
+                    va = ((v - Vll) / WaveLength) * 2. * PI;
+                    a = Amplitude * sin(va);
+                    switch (Plane) {
+                        case PLANE_XY1:
+                            xyz[i][j].p[2] -= a;
+                            break;
+                        case PLANE_XZ0:
+                            xyz[i][j].p[1] += a;
+                            break;
+                        case PLANE_XZ1:
+                            xyz[i][j].p[1] -= a;
+                            break;
+                        case PLANE_YZ0:
+                            xyz[i][j].p[0] += a;
+                            break;
+                        case PLANE_YZ1:
+                            xyz[i][j].p[0] -= a;
+                            break;
+                        default:
+                            xyz[i][j].p[2] += a;
+                    }
+                }
+            }
+            break;
+        case WAVE_ROUGH_ONLY:
+            PlasmaCloud();
+            break;
+    }
+
+    if (WaveType != WAVE_ROUGH_ONLY) {
+        // Fixed values
+        for (i = 0; i <= NH; i++) {
+            for (j = 0; j <= NV; j++) {
+                if (xyz[i][j].fixed) {
+                    switch (Plane) {
+                        case PLANE_XZ0:
+                        case PLANE_XZ1:
+                            xyz[i][j].p[1] = xyz[i][j].fixed_value;
+                            break;
+                        case PLANE_YZ0:
+                        case PLANE_YZ1:
+                            xyz[i][j].p[0] = xyz[i][j].fixed_value;
+                            break;
+                        default:
+                            xyz[i][j].p[2] = xyz[i][j].fixed_value;
+                    }
+
+                    if (xyz[i][j].range > 0) {
+                        maxrange = pow(xyz[i][j].range, 2); // so we don't have to do sqrt's
+                        i0 = i - (int) (floor(xyz[i][j].range / dh - 0.5) + 1);
+                        i1 = i + i - i0;
+                        j0 = j - (int) (floor(xyz[i][j].range / dv - 0.5) + 1);
+                        j1 = j + j - j0;
+                        if (FixBorders) {
+                            i0 = max(i0, 1);
+                            i1 = min(i1, NH - 1);
+                            j0 = max(j0, 1);
+                            j1 = min(j1, NV - 1);
+                        } else {
+                            i0 = max(i0, 0);
+                            i1 = min(i1, NH);
+                            j0 = max(j0, 0);
+                            j1 = min(j1, NV);
+                        }
+                        for (ii = i0; ii <= i1; ii++) {
+                            for (jj = j0; jj <= j1; jj++) {
+                                if (ii == i && jj == j) {
+                                    continue;
+                                }
+                                range = pow(dh * (i - ii), 2) + pow(dv * (j - jj), 2);
+                                if (range > maxrange) {
+                                    continue;
+                                }
+                                dr = sqrt(range / maxrange);
+                                rate = max(-30., min(xyz[i][j].rate, 30.));
+                                if (rate < -1.) {
+                                    delta = pow((1. - dr), -rate + 1.);
+                                } else if (rate < 0.) {
+                                    delta = (1 + rate) * 0.5 * (cos(dr * PI) + 1.0) -
+                                            rate * pow((1. - dr), 2);
+                                } else if (rate == 0.) {
+                                    delta = 0.5 * (cos(dr * PI) + 1.0);
+                                } else if (rate <= 1.) {
+                                    delta = (1. - rate) * 0.5 * (cos(dr * PI) + 1.0) +
+                                            rate * (1. - pow(dr, 2));
+                                } else {
+                                    delta = 1. - pow(dr, rate + 1);
+                                }
+                                switch (Plane) {
+                                    case PLANE_XZ0:
+                                    case PLANE_XZ1:
+                                        xyz[ii][jj].p[1] += (xyz[i][j].p[1] - xyz[ii][jj].p[1]) * delta;
+                                        break;
+                                    case PLANE_YZ0:
+                                    case PLANE_YZ1:
+                                        xyz[ii][jj].p[0] += (xyz[i][j].p[0] - xyz[ii][jj].p[0]) * delta;
+                                        break;
+                                    default:
+                                        xyz[ii][jj].p[2] += (xyz[i][j].p[2] - xyz[ii][jj].p[2]) * delta;
+                                }
+                            }
+                        }
+                    }
+                }
+            }
+        }
+    }
+
+    if ((Roughness > 0.) && (WaveType != WAVE_ROUGH_ONLY)) {
+        for (i = 0; i <= NH; i++) {
+            for (j = 0; j <= NV; j++) {
+                if (CanEdit(i, j) && !xyz[i][j].fixed) {
+                    switch (Plane) {
+                        case PLANE_XZ0:
+                        case PLANE_XZ1:
+                            xyz[i][j].p[1] += -Roughness / 2. + Roughness * ((double) rand() / (double) RAND_MAX);
+                            break;
+                        case PLANE_YZ0:
+                        case PLANE_YZ1:
+                            xyz[i][j].p[0] += -Roughness / 2. + Roughness * ((double) rand() / (double) RAND_MAX);
+                            break;
+                        default:
+                            xyz[i][j].p[2] += -Roughness / 2. + Roughness * ((double) rand() / (double) RAND_MAX);
+                    }
+                } else {
+                    r = rand(); // We still get a random number, so that fixing points
+                }
+                // doesn't change the sequence.
+
+            }
+        }
+    }
+
+    for (i = 0; i <= NH; i++) {
+        for (j = 0; j <= NV; j++) {
+            for (k = 0; k < 3; k++) {
+                xyz[i][j].p[k] = Nearest(xyz[i][j].p[k], 2.0);
+            }
+        }
+    }
+
+    // Find minima and maxima
+    switch (Plane) {
+        case PLANE_XZ0:
+        case PLANE_XZ1:
+            xmin = Hll;
+            xmax = Hur;
+            zmin = Vll;
+            zmax = Vur;
+            ymin = xyz[0][0].p[1];
+            ymax = ymin;
+            for (i = 0; i <= NH; i++) {
+                for (j = 0; j <= NV; j++) {
+                    ymin = min(ymin, xyz[i][j].p[1]);
+                    ymax = max(ymax, xyz[i][j].p[1]);
+                }
+            }
+            break;
+        case PLANE_YZ0:
+        case PLANE_YZ1:
+            ymin = Hll;
+            ymax = Hur;
+            zmin = Vll;
+            zmax = Vur;
+            xmin = xyz[0][0].p[0];
+            xmax = ymin;
+            for (i = 0; i <= NH; i++) {
+                for (j = 0; j <= NV; j++) {
+                    xmin = min(xmin, xyz[i][j].p[0]);
+                    xmax = max(xmax, xyz[i][j].p[0]);
+                }
+            }
+            break;
+            break;
+        default:
+            xmin = Hll;
+            xmax = Hur;
+            ymin = Vll;
+            ymax = Vur;
+            zmin = xyz[0][0].p[2];
+            zmax = zmin;
+            for (i = 0; i <= NH; i++) {
+                for (j = 0; j <= NV; j++) {
+                    zmin = min(zmin, xyz[i][j].p[2]);
+                    zmax = max(zmax, xyz[i][j].p[2]);
+                }
+            }
+    }
+
+    xmin = Nearest(xmin, 2.);
+    xmax = Nearest(xmax, 2.);
+    ymin = Nearest(ymin, 2.);
+    ymax = Nearest(ymax, 2.);
+    zmin = Nearest(zmin, 2.);
+    zmax = Nearest(zmax, 2.);
+
+    switch (Plane) {
+        case PLANE_XY1:
+            backface = AtLeast(zmax + 32., 32.);
+            break;
+        case PLANE_XZ0:
+            backface = NoMoreThan(ymin - 32., 32.);
+            break;
+        case PLANE_XZ1:
+            backface = AtLeast(ymax + 32., 32.);
+            break;
+        case PLANE_YZ0:
+            backface = NoMoreThan(xmin - 32., 32.);
+            break;
+        case PLANE_YZ1:
+            backface = AtLeast(xmax + 32., 32.);
+            break;
+        default:
+            backface = NoMoreThan(zmin - 32., 32.);
+    }
+
+    if (gNode) {
+        free(gNode);
+        free(gTri);
+        gNode = (NODE *) NULL;
+        gTri = (TRI *) NULL;
+    }
+    if (Decimate > 0 && (Game != QUAKE3 || UsePatches == 0)) {
+        MakeDecimatedMap(&gNumNodes, &gNumTris, &gNode, &gTri);
+    } else {
+        gNumNodes = (NH + 1) * (NV + 1);
+        gNumTris = NH * NV * 2;
+        gNode = (NODE *) malloc(gNumNodes * sizeof(NODE));
+        gTri = (TRI *) malloc(gNumTris * sizeof(TRI));
+
+        for (i = 0, N = 0; i <= NH; i++) {
+            for (j = 0; j <= NV; j++, N++) {
+                gNode[N].used = 1;
+                gNode[N].p[0] = (float) xyz[i][j].p[0];
+                gNode[N].p[1] = (float) xyz[i][j].p[1];
+                gNode[N].p[2] = (float) xyz[i][j].p[2];
+            }
+        }
+
+        for (i = 0; i < NH; i++) {
+            for (j = 0; j < NV; j++) {
+                k = i * NV * 2 + j * 2;
+                if ((i + j) % 2) {
+                    switch (Plane) {
+                        case PLANE_XY1:
+                        case PLANE_XZ1:
+                        case PLANE_YZ1:
+                            gTri[k].v[0] = i * (NV + 1) + j;
+                            gTri[k].v[1] = (i + 1) * (NV + 1) + j + 1;
+                            gTri[k].v[2] = (i + 1) * (NV + 1) + j;
+                            gTri[k + 1].v[0] = i * (NV + 1) + j;
+                            gTri[k + 1].v[1] = i * (NV + 1) + j + 1;
+                            gTri[k + 1].v[2] = (i + 1) * (NV + 1) + j + 1;
+                            break;
+                        default:
+                            gTri[k].v[0] = i * (NV + 1) + j;
+                            gTri[k].v[1] = (i + 1) * (NV + 1) + j;
+                            gTri[k].v[2] = (i + 1) * (NV + 1) + j + 1;
+                            gTri[k + 1].v[0] = i * (NV + 1) + j;
+                            gTri[k + 1].v[1] = (i + 1) * (NV + 1) + j + 1;
+                            gTri[k + 1].v[2] = i * (NV + 1) + j + 1;
+                    }
+                } else {
+                    switch (Plane) {
+                        case PLANE_XY1:
+                        case PLANE_XZ1:
+                        case PLANE_YZ1:
+                            gTri[k].v[0] = i * (NV + 1) + j;
+                            gTri[k].v[1] = i * (NV + 1) + j + 1;
+                            gTri[k].v[2] = (i + 1) * (NV + 1) + j;
+                            gTri[k + 1].v[0] = (i + 1) * (NV + 1) + j;
+                            gTri[k + 1].v[1] = i * (NV + 1) + j + 1;
+                            gTri[k + 1].v[2] = (i + 1) * (NV + 1) + j + 1;
+                            break;
+                        default:
+                            gTri[k].v[0] = i * (NV + 1) + j;
+                            gTri[k].v[1] = (i + 1) * (NV + 1) + j;
+                            gTri[k].v[2] = i * (NV + 1) + j + 1;
+                            gTri[k + 1].v[0] = (i + 1) * (NV + 1) + j;
+                            gTri[k + 1].v[1] = (i + 1) * (NV + 1) + j + 1;
+                            gTri[k + 1].v[2] = i * (NV + 1) + j + 1;
+                    }
+                }
+            }
+        }
+    }
 /*
    sprintf(CSV,"csv%03d.csv",Decimate);
    f = fopen(CSV,"w");
@@ -1657,386 +1552,389 @@ void GenerateXYZ(){
    }
    fclose(f);
  */
-       for ( i = 0; i < gNumTris; i++ )
-               PlaneFromPoints( gNode[gTri[i].v[0]].p,
-                                                gNode[gTri[i].v[1]].p,
-                                                gNode[gTri[i].v[2]].p,
-                                                &gTri[i].plane );
-
-       // Hydra: snap-to-grid begin
-       if ( SnapToGrid > 0 ) {
-               for ( i = 0; i < NH; i++ )
-               {
-                       for ( j = 0; j < NV; j++ )
-                       {
-                               switch ( Plane )
-                               {
-                               case PLANE_XZ0:
-                               case PLANE_XZ1:
-                                       xyz[i][j].p[1] = CalculateSnapValue( xyz[i][j].p[1] );
-                                       break;
-                               case PLANE_YZ0:
-                               case PLANE_YZ1:
-                                       xyz[i][j].p[0] = CalculateSnapValue( xyz[i][j].p[0] );
-                                       break;
-                               default:
-                                       xyz[i][j].p[2] = CalculateSnapValue( xyz[i][j].p[2] );
-                               }
-                       }
-               }
-       }
-       // Hydra: snap-to-grid end
+    for (i = 0; i < gNumTris; i++) {
+        PlaneFromPoints(gNode[gTri[i].v[0]].p,
+                        gNode[gTri[i].v[1]].p,
+                        gNode[gTri[i].v[2]].p,
+                        &gTri[i].plane);
+    }
+
+    // Hydra: snap-to-grid begin
+    if (SnapToGrid > 0) {
+        for (i = 0; i < NH; i++) {
+            for (j = 0; j < NV; j++) {
+                switch (Plane) {
+                    case PLANE_XZ0:
+                    case PLANE_XZ1:
+                        xyz[i][j].p[1] = CalculateSnapValue(xyz[i][j].p[1]);
+                        break;
+                    case PLANE_YZ0:
+                    case PLANE_YZ1:
+                        xyz[i][j].p[0] = CalculateSnapValue(xyz[i][j].p[0]);
+                        break;
+                    default:
+                        xyz[i][j].p[2] = CalculateSnapValue(xyz[i][j].p[2]);
+                }
+            }
+        }
+    }
+    // Hydra: snap-to-grid end
 }
-//=============================================================
-double Nearest( double x, double dx ){
-       double xx;
 
-       xx = (double)( floor( x / dx - 0.5 ) + 1. ) * dx;
-       if ( fabs( xx ) < dx / 2 ) {
-               xx = 0.;
-       }
-       return xx;
-}
 //=============================================================
-double NoMoreThan( double x, double dx ){
-       double xx;
-
-       xx = (double)( floor( x / dx - 0.5 ) + 1. ) * dx;
-       if ( xx > x ) {
-               xx -= dx;
-       }
-       return xx;
+double Nearest(double x, double dx)
+{
+    double xx;
+
+    xx = (double) (floor(x / dx - 0.5) + 1.) * dx;
+    if (fabs(xx) < dx / 2) {
+        xx = 0.;
+    }
+    return xx;
 }
-//=============================================================
-double AtLeast( double x, double dx ){
-       double xx;
 
-       xx = (double)( floor( x / dx - 0.5 ) + 1. ) * dx;
-       if ( xx < x ) {
-               xx += dx;
-       }
-       return xx;
-}
 //=============================================================
-double LessThan( double x,double dx ){
-       double xx;
+double NoMoreThan(double x, double dx)
+{
+    double xx;
+
+    xx = (double) (floor(x / dx - 0.5) + 1.) * dx;
+    if (xx > x) {
+        xx -= dx;
+    }
+    return xx;
+}
 
-       xx = (double)( floor( x / dx - 0.5 ) + 1. ) * dx;
-       if ( xx >= x ) {
-               xx -= dx;
-       }
-       return xx;
+//=============================================================
+double AtLeast(double x, double dx)
+{
+    double xx;
+
+    xx = (double) (floor(x / dx - 0.5) + 1.) * dx;
+    if (xx < x) {
+        xx += dx;
+    }
+    return xx;
 }
+
 //=============================================================
-double MoreThan( double x,double dx ){
-       double xx;
+double LessThan(double x, double dx)
+{
+    double xx;
+
+    xx = (double) (floor(x / dx - 0.5) + 1.) * dx;
+    if (xx >= x) {
+        xx -= dx;
+    }
+    return xx;
+}
 
-       xx = (double)( floor( x / dx - 0.5 ) + 1. ) * dx;
-       while ( xx <= x )
-               xx += dx;
-       return xx;
+//=============================================================
+double MoreThan(double x, double dx)
+{
+    double xx;
+
+    xx = (double) (floor(x / dx - 0.5) + 1.) * dx;
+    while (xx <= x) {
+        xx += dx;
+    }
+    return xx;
 }
+
 //=============================================================
-void SubdividePlasma( int i0,int j0,int i1,int j1 ){
-       int i, j;
-       double z1, z2;
-       double r;    // NOTE: This is used to keep the random number sequence the same
-                    //       when we fix a point. If we did NOT do this, then simply
-                    //       fixing a point at its current value would change the entire
-                    //       surface.
-
-       i = ( i0 + i1 ) / 2;
-       j = ( j0 + j1 ) / 2;
-       if ( i1 > i0 + 1 ) {
-               if ( !xyz[i][j0].done ) {
-                       xyz[i][j0].pp[2] = xyz[i0][j0].pp[2] +
-                                                          ( xyz[i1][j0].pp[2] - xyz[i0][j0].pp[2] ) * (double)( i - i0 ) / (double)( i1 - i0 ) +
-                                                          ( (double)( i - i0 ) ) * ( -Roughness / 2. + Roughness * ( (double)rand() / (double)RAND_MAX ) );
-                       xyz[i][j0].done = 1;
-               }
-               else{
-                       r = rand();
-               }
-               if ( ( j1 > j0 ) && ( !xyz[i][j1].done ) ) {
-                       xyz[i][j1].pp[2] = xyz[i0][j1].pp[2] +
-                                                          ( xyz[i1][j1].pp[2] - xyz[i0][j1].pp[2] ) * (double)( i - i0 ) / (double)( i1 - i0 ) +
-                                                          ( (double)( i - i0 ) ) * ( -Roughness / 2. + Roughness * ( (double)rand() / (double)RAND_MAX ) );
-                       xyz[i][j1].done = 1;
-               }
-               else{
-                       r = rand();
-               }
-       }
-       if ( j1 > j0 + 1 ) {
-               if ( !xyz[i0][j].done ) {
-                       xyz[i0][j].pp[2] = xyz[i0][j0].pp[2] +
-                                                          ( xyz[i0][j1].pp[2] - xyz[i0][j0].pp[2] ) * (double)( j - j0 ) / (double)( j1 - j0 ) +
-                                                          ( (double)( j - j0 ) ) * ( -Roughness / 2. + Roughness * ( (double)rand() / (double)RAND_MAX ) );
-                       xyz[i0][j].done = 1;
-               }
-               else{
-                       r = rand();
-               }
-               if ( ( i1 > i0 ) && ( !xyz[i1][j].done ) ) {
-                       xyz[i1][j].pp[2] = xyz[i1][j0].pp[2] +
-                                                          ( xyz[i1][j1].pp[2] - xyz[i1][j0].pp[2] ) * (double)( j - j0 ) / (double)( j1 - j0 ) +
-                                                          ( (double)( j - j0 ) ) * ( -Roughness / 2. + Roughness * ( (double)rand() / (double)RAND_MAX ) );
-                       xyz[i1][j].done = 1;
-               }
-               else{
-                       r = rand();
-               }
-       }
-       if ( ( i1 > i0 + 1 ) && ( j1 > j0 + 1 ) ) {
-               if ( !xyz[i][j].done ) {
-                       z1 = xyz[i0][j].pp[2] +
-                                ( xyz[i1][j].pp[2] - xyz[i0][j].pp[2] ) * (double)( i - i0 ) / (double)( i1 - i0 );
-                       z2 = xyz[i][j0].pp[2] +
-                                ( xyz[i][j1].pp[2] - xyz[i][j0].pp[2] ) * (double)( j - j0 ) / (double)( j1 - j0 );
-                       xyz[i][j].pp[2] = ( z1 + z2 ) / 2. +
-                                                         ( (double)( i - i0 ) ) * ( -Roughness / 2. + Roughness * ( (double)rand() / (double)RAND_MAX ) );
-                       xyz[i][j].done = 1;
-               }
-               else{
-                       r = rand();
-               }
-       }
-       if ( i > i0 + 1 || j > j0 + 1 ) {
-               SubdividePlasma( i0,j0,i,j );
-       }
-       if ( i1 > i + 1 || j > j0 + 1 ) {
-               SubdividePlasma( i,j0,i1,j );
-       }
-       if ( i > i0 + 1 || j1 > j0 + 1 ) {
-               SubdividePlasma( i0,j,i,j1 );
-       }
-       if ( i1 > i + 1 || j1 > j0 + 1 ) {
-               SubdividePlasma( i,j,i1,j1 );
-       }
+void SubdividePlasma(int i0, int j0, int i1, int j1)
+{
+    int i, j;
+    double z1, z2;
+    double r;    // NOTE: This is used to keep the random number sequence the same
+    //       when we fix a point. If we did NOT do this, then simply
+    //       fixing a point at its current value would change the entire
+    //       surface.
+
+    i = (i0 + i1) / 2;
+    j = (j0 + j1) / 2;
+    if (i1 > i0 + 1) {
+        if (!xyz[i][j0].done) {
+            xyz[i][j0].pp[2] = xyz[i0][j0].pp[2] +
+                               (xyz[i1][j0].pp[2] - xyz[i0][j0].pp[2]) * (double) (i - i0) / (double) (i1 - i0) +
+                               ((double) (i - i0)) *
+                               (-Roughness / 2. + Roughness * ((double) rand() / (double) RAND_MAX));
+            xyz[i][j0].done = 1;
+        } else {
+            r = rand();
+        }
+        if ((j1 > j0) && (!xyz[i][j1].done)) {
+            xyz[i][j1].pp[2] = xyz[i0][j1].pp[2] +
+                               (xyz[i1][j1].pp[2] - xyz[i0][j1].pp[2]) * (double) (i - i0) / (double) (i1 - i0) +
+                               ((double) (i - i0)) *
+                               (-Roughness / 2. + Roughness * ((double) rand() / (double) RAND_MAX));
+            xyz[i][j1].done = 1;
+        } else {
+            r = rand();
+        }
+    }
+    if (j1 > j0 + 1) {
+        if (!xyz[i0][j].done) {
+            xyz[i0][j].pp[2] = xyz[i0][j0].pp[2] +
+                               (xyz[i0][j1].pp[2] - xyz[i0][j0].pp[2]) * (double) (j - j0) / (double) (j1 - j0) +
+                               ((double) (j - j0)) *
+                               (-Roughness / 2. + Roughness * ((double) rand() / (double) RAND_MAX));
+            xyz[i0][j].done = 1;
+        } else {
+            r = rand();
+        }
+        if ((i1 > i0) && (!xyz[i1][j].done)) {
+            xyz[i1][j].pp[2] = xyz[i1][j0].pp[2] +
+                               (xyz[i1][j1].pp[2] - xyz[i1][j0].pp[2]) * (double) (j - j0) / (double) (j1 - j0) +
+                               ((double) (j - j0)) *
+                               (-Roughness / 2. + Roughness * ((double) rand() / (double) RAND_MAX));
+            xyz[i1][j].done = 1;
+        } else {
+            r = rand();
+        }
+    }
+    if ((i1 > i0 + 1) && (j1 > j0 + 1)) {
+        if (!xyz[i][j].done) {
+            z1 = xyz[i0][j].pp[2] +
+                 (xyz[i1][j].pp[2] - xyz[i0][j].pp[2]) * (double) (i - i0) / (double) (i1 - i0);
+            z2 = xyz[i][j0].pp[2] +
+                 (xyz[i][j1].pp[2] - xyz[i][j0].pp[2]) * (double) (j - j0) / (double) (j1 - j0);
+            xyz[i][j].pp[2] = (z1 + z2) / 2. +
+                              ((double) (i - i0)) *
+                              (-Roughness / 2. + Roughness * ((double) rand() / (double) RAND_MAX));
+            xyz[i][j].done = 1;
+        } else {
+            r = rand();
+        }
+    }
+    if (i > i0 + 1 || j > j0 + 1) {
+        SubdividePlasma(i0, j0, i, j);
+    }
+    if (i1 > i + 1 || j > j0 + 1) {
+        SubdividePlasma(i, j0, i1, j);
+    }
+    if (i > i0 + 1 || j1 > j0 + 1) {
+        SubdividePlasma(i0, j, i, j1);
+    }
+    if (i1 > i + 1 || j1 > j0 + 1) {
+        SubdividePlasma(i, j, i1, j1);
+    }
 }
+
 //==================================================================================
-void PlasmaCloud(){
-       int i, j;
-       /* use pp[2] values until done to avoid messing with a bunch of
+void PlasmaCloud()
+{
+    int i, j;
+    /* use pp[2] values until done to avoid messing with a bunch of
           switch statements */
 
-       for ( i = 0; i <= NH; i++ )
-       {
-               for ( j = 0; j <= NV; j++ )
-               {
-                       if ( FixedPoint( i,j ) ) {
-                               xyz[i][j].done = 1;
-                       }
-                       else{
-                               xyz[i][j].done = 0;
-                       }
-               }
-       }
-
-       switch ( Plane )
-       {
-       case PLANE_XZ0:
-       case PLANE_XZ1:
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               if ( xyz[i][j].fixed ) {
-                                       xyz[i][j].pp[2] = xyz[i][j].fixed_value;
-                               }
-                               else{
-                                       xyz[i][j].pp[2] = xyz[i][j].p[1];
-                               }
-                       }
-               }
-               break;
-       case PLANE_YZ0:
-       case PLANE_YZ1:
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               if ( xyz[i][j].fixed ) {
-                                       xyz[i][j].pp[2] = xyz[i][j].fixed_value;
-                               }
-                               else{
-                                       xyz[i][j].pp[2] = xyz[i][j].p[0];
-                               }
-                       }
-               }
-               break;
-       default:
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               if ( xyz[i][j].fixed ) {
-                                       xyz[i][j].pp[2] = xyz[i][j].fixed_value;
-                               }
-                               else{
-                                       xyz[i][j].pp[2] = xyz[i][j].p[2];
-                               }
-                       }
-               }
-               break;
-       }
-       SubdividePlasma( 0,0,NH,NV );
-       switch ( Plane )
-       {
-       case PLANE_XZ0:
-       case PLANE_XZ1:
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               xyz[i][j].p[1] = xyz[i][j].pp[2];
-                       }
-               }
-               break;
-       case PLANE_YZ0:
-       case PLANE_YZ1:
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               xyz[i][j].p[0] = xyz[i][j].pp[2];
-                       }
-               }
-               break;
-       default:
-               for ( i = 0; i <= NH; i++ )
-               {
-                       for ( j = 0; j <= NV; j++ )
-                       {
-                               xyz[i][j].p[2] = xyz[i][j].pp[2];
-                       }
-               }
-               break;
-       }
+    for (i = 0; i <= NH; i++) {
+        for (j = 0; j <= NV; j++) {
+            if (FixedPoint(i, j)) {
+                xyz[i][j].done = 1;
+            } else {
+                xyz[i][j].done = 0;
+            }
+        }
+    }
+
+    switch (Plane) {
+        case PLANE_XZ0:
+        case PLANE_XZ1:
+            for (i = 0; i <= NH; i++) {
+                for (j = 0; j <= NV; j++) {
+                    if (xyz[i][j].fixed) {
+                        xyz[i][j].pp[2] = xyz[i][j].fixed_value;
+                    } else {
+                        xyz[i][j].pp[2] = xyz[i][j].p[1];
+                    }
+                }
+            }
+            break;
+        case PLANE_YZ0:
+        case PLANE_YZ1:
+            for (i = 0; i <= NH; i++) {
+                for (j = 0; j <= NV; j++) {
+                    if (xyz[i][j].fixed) {
+                        xyz[i][j].pp[2] = xyz[i][j].fixed_value;
+                    } else {
+                        xyz[i][j].pp[2] = xyz[i][j].p[0];
+                    }
+                }
+            }
+            break;
+        default:
+            for (i = 0; i <= NH; i++) {
+                for (j = 0; j <= NV; j++) {
+                    if (xyz[i][j].fixed) {
+                        xyz[i][j].pp[2] = xyz[i][j].fixed_value;
+                    } else {
+                        xyz[i][j].pp[2] = xyz[i][j].p[2];
+                    }
+                }
+            }
+            break;
+    }
+    SubdividePlasma(0, 0, NH, NV);
+    switch (Plane) {
+        case PLANE_XZ0:
+        case PLANE_XZ1:
+            for (i = 0; i <= NH; i++) {
+                for (j = 0; j <= NV; j++) {
+                    xyz[i][j].p[1] = xyz[i][j].pp[2];
+                }
+            }
+            break;
+        case PLANE_YZ0:
+        case PLANE_YZ1:
+            for (i = 0; i <= NH; i++) {
+                for (j = 0; j <= NV; j++) {
+                    xyz[i][j].p[0] = xyz[i][j].pp[2];
+                }
+            }
+            break;
+        default:
+            for (i = 0; i <= NH; i++) {
+                for (j = 0; j <= NV; j++) {
+                    xyz[i][j].p[2] = xyz[i][j].pp[2];
+                }
+            }
+            break;
+    }
 }
+
 //===========================================================================
-bool FixedPoint( int i, int j ){
-       if ( xyz[i][j].fixed ) {
-               return TRUE;
-       }
-       return !CanEdit( i,j );
+bool FixedPoint(int i, int j)
+{
+    if (xyz[i][j].fixed) {
+        return TRUE;
+    }
+    return !CanEdit(i, j);
 }
+
 //===========================================================================
-bool CanEdit( int i, int j ){
-       if ( FixBorders && ( ( WaveType == WAVE_COS_SIN ) || ( WaveType == WAVE_ROUGH_ONLY ) ) ) {
-               if ( i == 0 ) {
-                       return FALSE;
-               }
-               if ( i == NH ) {
-                       return FALSE;
-               }
-               if ( j == 0 ) {
-                       return FALSE;
-               }
-               if ( j == NV ) {
-                       return FALSE;
-               }
-       }
-       if ( i == 0 && j == 0 ) {
-               return FALSE;
-       }
-       if ( i == NH && j == 0 ) {
-               return FALSE;
-       }
-       if ( i == 0 && j == NV ) {
-               return FALSE;
-       }
-       if ( i == NH && j == NV ) {
-               return FALSE;
-       }
-       return TRUE;
+bool CanEdit(int i, int j)
+{
+    if (FixBorders && ((WaveType == WAVE_COS_SIN) || (WaveType == WAVE_ROUGH_ONLY))) {
+        if (i == 0) {
+            return FALSE;
+        }
+        if (i == NH) {
+            return FALSE;
+        }
+        if (j == 0) {
+            return FALSE;
+        }
+        if (j == NV) {
+            return FALSE;
+        }
+    }
+    if (i == 0 && j == 0) {
+        return FALSE;
+    }
+    if (i == NH && j == 0) {
+        return FALSE;
+    }
+    if (i == 0 && j == NV) {
+        return FALSE;
+    }
+    if (i == NH && j == NV) {
+        return FALSE;
+    }
+    return TRUE;
 }
+
 /*============================================================================
    TriangleFromPoint
    Determines which triangle in the gTri array bounds the input point. Doesn't
    do anything special with border points.
  */
-int TriangleFromPoint( double x, double y ){
-       int j, tri;
-
-       if ( !gTri ) {
-               return -1;
-       }
-
-       for ( j = 0, tri = -1; j < gNumTris && tri == -1; j++ )
-       {
-               if ( side( x,y,
-                                  gNode[gTri[j].v[0]].p[0],gNode[gTri[j].v[0]].p[1],
-                                  gNode[gTri[j].v[1]].p[0],gNode[gTri[j].v[1]].p[1] ) < 0. ) {
-                       continue;
-               }
-               if ( side( x,y,
-                                  gNode[gTri[j].v[1]].p[0],gNode[gTri[j].v[1]].p[1],
-                                  gNode[gTri[j].v[2]].p[0],gNode[gTri[j].v[2]].p[1] ) < 0. ) {
-                       continue;
-               }
-               if ( side( x,y,
-                                  gNode[gTri[j].v[2]].p[0],gNode[gTri[j].v[2]].p[1],
-                                  gNode[gTri[j].v[0]].p[0],gNode[gTri[j].v[0]].p[1] ) < 0. ) {
-                       continue;
-               }
-               tri = j;
-       }
-
-       return tri;
+int TriangleFromPoint(double x, double y)
+{
+    int j, tri;
+
+    if (!gTri) {
+        return -1;
+    }
+
+    for (j = 0, tri = -1; j < gNumTris && tri == -1; j++) {
+        if (side(x, y,
+                 gNode[gTri[j].v[0]].p[0], gNode[gTri[j].v[0]].p[1],
+                 gNode[gTri[j].v[1]].p[0], gNode[gTri[j].v[1]].p[1]) < 0.) {
+            continue;
+        }
+        if (side(x, y,
+                 gNode[gTri[j].v[1]].p[0], gNode[gTri[j].v[1]].p[1],
+                 gNode[gTri[j].v[2]].p[0], gNode[gTri[j].v[2]].p[1]) < 0.) {
+            continue;
+        }
+        if (side(x, y,
+                 gNode[gTri[j].v[2]].p[0], gNode[gTri[j].v[2]].p[1],
+                 gNode[gTri[j].v[0]].p[0], gNode[gTri[j].v[0]].p[1]) < 0.) {
+            continue;
+        }
+        tri = j;
+    }
+
+    return tri;
 }
+
 /*============================================================================
    PlayerStartZ
    Determines minimum height to place the player start such that he doesn't
    intersect any surface brushes.
  */
-int PlayerStartZ( double x, double y ){
-       int k,t[5];
-       double z, zt;
-
-       if ( !gTri ) {
-               return (int)zmax;
-       }
-
-       t[0] = TriangleFromPoint( x,y );
-       t[1] = TriangleFromPoint( x + PlayerBox[Game].x[0],y + PlayerBox[Game].y[0] );
-       t[2] = TriangleFromPoint( x + PlayerBox[Game].x[0],y + PlayerBox[Game].y[1] );
-       t[3] = TriangleFromPoint( x + PlayerBox[Game].x[1],y + PlayerBox[Game].y[0] );
-       t[4] = TriangleFromPoint( x + PlayerBox[Game].x[1],y + PlayerBox[Game].y[1] );
-       z = zmin;
-       for ( k = 0; k < 5; k++ )
-       {
-               zt = ( gTri[t[k]].plane.dist -
-                          gTri[t[k]].plane.normal[0] * x -
-                          gTri[t[k]].plane.normal[1] * y   ) /
-                        gTri[t[k]].plane.normal[2];
-               z = max( z,zt );
-       }
-       return (int)( AtLeast( z,2. ) - PlayerBox[Game].z[0] );
+int PlayerStartZ(double x, double y)
+{
+    int k, t[5];
+    double z, zt;
+
+    if (!gTri) {
+        return (int) zmax;
+    }
+
+    t[0] = TriangleFromPoint(x, y);
+    t[1] = TriangleFromPoint(x + PlayerBox[Game].x[0], y + PlayerBox[Game].y[0]);
+    t[2] = TriangleFromPoint(x + PlayerBox[Game].x[0], y + PlayerBox[Game].y[1]);
+    t[3] = TriangleFromPoint(x + PlayerBox[Game].x[1], y + PlayerBox[Game].y[0]);
+    t[4] = TriangleFromPoint(x + PlayerBox[Game].x[1], y + PlayerBox[Game].y[1]);
+    z = zmin;
+    for (k = 0; k < 5; k++) {
+        zt = (gTri[t[k]].plane.dist -
+              gTri[t[k]].plane.normal[0] * x -
+              gTri[t[k]].plane.normal[1] * y) /
+             gTri[t[k]].plane.normal[2];
+        z = max(z, zt);
+    }
+    return (int) (AtLeast(z, 2.) - PlayerBox[Game].z[0]);
 }
+
 //=============================================================
-void XYZtoV( XYZ *xyz, vec3 *v ){
-       v[0][0] = (vec)Nearest( xyz->p[0],2. );
-       v[0][1] = (vec)Nearest( xyz->p[1],2. );
-       v[0][2] = (vec)Nearest( xyz->p[2],2. );
+void XYZtoV(XYZ *xyz, vec3 *v)
+{
+    v[0][0] = (vec) Nearest(xyz->p[0], 2.);
+    v[0][1] = (vec) Nearest(xyz->p[1], 2.);
+    v[0][2] = (vec) Nearest(xyz->p[2], 2.);
 }
 
 //=============================================================
-scene::Node* MakePatch( void ){
-       scene::Node* patch = Patch_AllocNode();
+scene::Node *MakePatch(void)
+{
+    scene::Node *patch = Patch_AllocNode();
 #if 0
-       patch->m_patch->SetShader( Texture[Game][0] );
+    patch->m_patch->SetShader( Texture[Game][0] );
 #endif
-       Node_getTraversable( h_worldspawn )->insert( patch );
-       return patch;
+    Node_getTraversable(h_worldspawn)->insert(patch);
+    return patch;
 }
 
 //=============================================================
-void MakeBrush( BRUSH *brush ){
-       NodePtr node( Brush_AllocNode() );
+void MakeBrush(BRUSH *brush)
+{
+    NodePtr node(Brush_AllocNode());
 
 #if 0
-       for ( int i = 0; i < brush->NumFaces; i++ )
+                                                                                                                            for ( int i = 0; i < brush->NumFaces; i++ )
        {
                _QERFaceData QERFaceData;
                if ( !strncmp( brush->face[i].texture, "textures/", 9 ) ) {
@@ -2069,20 +1967,24 @@ void MakeBrush( BRUSH *brush ){
        }
 #endif
 
-       Node_getTraversable( h_func_group )->insert( node );
+    Node_getTraversable(h_func_group)->insert(node);
 }
+
 //=============================================================
-void OpenFuncGroup(){
-       h_func_group = GlobalEntityCreator().createEntity( "func_group" );
-       h_func_group->IncRef();
-       if ( AddTerrainKey ) {
-               h_func_group->m_entity->setkeyvalue( "terrain", "1" );
-       }
+void OpenFuncGroup()
+{
+    h_func_group = GlobalEntityCreator().createEntity("func_group");
+    h_func_group->IncRef();
+    if (AddTerrainKey) {
+        h_func_group->m_entity->setkeyvalue("terrain", "1");
+    }
 }
+
 //=============================================================
-void CloseFuncGroup(){
-       h_func_group->DecRef();
-       if ( g_FuncTable.m_pfnSysUpdateWindows != NULL ) {
-               g_FuncTable.m_pfnSysUpdateWindows( W_ALL );
-       }
+void CloseFuncGroup()
+{
+    h_func_group->DecRef();
+    if (g_FuncTable.m_pfnSysUpdateWindows != NULL) {
+        g_FuncTable.m_pfnSysUpdateWindows(W_ALL);
+    }
 }