]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - tools/quake3/q3map2/convert_map.c
make it output nice looking origin brushes
[xonotic/netradiant.git] / tools / quake3 / q3map2 / convert_map.c
index 03933a54175fcef6b1905047af18f7ac11603017..0a650aac1ad04044f65b1cef349920324c6492d2 100644 (file)
@@ -145,6 +145,46 @@ exwinding:
        //      fprintf(stderr, "brushside with %s: %d matches (%f area)\n", buildSide->shaderInfo->shader, matches, best);
 }
 
+static void ConvertOriginBrush( FILE *f, int num, vec3_t origin )
+{
+       char pattern[6][5][3] = {
+               { "+++", "+-+", "-++", " - ", "-  " },
+               { "+++", "-++", "++-", "+  ", "  +" },
+               { "+++", "++-", "+-+", " - ", "  +" },
+               { "---", "+--", "-+-", " - ", "+  " },
+               { "---", "--+", "+--", "-  ", "  +" },
+               { "---", "-+-", "--+", " + ", "  +" }
+       };
+       int i;
+#define S(a,b,c) (pattern[a][b][c] == '+' ? +1 : pattern[a][b][c] == '-' ? -1 : 0)
+#define FRAC(x) ((x) - floor(x))
+
+       /* start brush */
+       fprintf( f, "\t// brush %d\n", num );
+       fprintf( f, "\t{\n" );
+       fprintf( f, "\tbrushDef\n" );
+       fprintf( f, "\t{\n" );
+       /* print brush side */
+       /* ( 640 24 -224 ) ( 448 24 -224 ) ( 448 -232 -224 ) common/caulk 0 48 0 0.500000 0.500000 0 0 0 */
+
+       for(i = 0; i < 6; ++i)
+               fprintf( f, "\t\t( %.3f %.3f %.3f ) ( %.3f %.3f %.3f ) ( %.3f %.3f %.3f ) ( ( %.8f %.8f %.8f ) ( %.8f %.8f %.8f ) ) %s %d 0 0\n",
+                               origin[0] + 8 * S(i,0,0), origin[1] + 8 * S(i,0,1), origin[2] + 8 * S(i,0,2),
+                               origin[0] + 8 * S(i,1,0), origin[1] + 8 * S(i,1,1), origin[2] + 8 * S(i,1,2),
+                               origin[0] + 8 * S(i,2,0), origin[1] + 8 * S(i,2,1), origin[2] + 8 * S(i,2,2),
+                               1/16.0, 0.0, FRAC((S(i,3,0) * origin[0] + S(i,3,1) * origin[1] + S(i,3,2) * origin[2]) / 16.0 + 0.5),
+                               0.0, 1/16.0, FRAC((S(i,4,0) * origin[0] + S(i,4,1) * origin[1] + S(i,4,2) * origin[2]) / 16.0 + 0.5),
+                               "common/origin",
+                               0
+                          );
+#undef FRAC
+#undef S
+       
+       /* end brush */
+       fprintf( f, "\t}\n" );
+       fprintf( f, "\t}\n\n" );
+}
+
 static void ConvertBrush( FILE *f, int num, bspBrush_t *brush, vec3_t origin )
 {
        int                             i, j;
@@ -490,6 +530,9 @@ static void ConvertModel( FILE *f, bspModel_t *model, int modelNum, vec3_t origi
        buildBrush = AllocBrush( 512 );
        buildBrush->entityNum = 0;
        buildBrush->original = buildBrush;
+
+       if(origin[0] != 0 || origin[1] != 0 || origin[2] != 0)
+               ConvertOriginBrush(f, -1, origin);
        
        /* go through each brush in the model */
        for( i = 0; i < model->numBSPBrushes; i++ )
@@ -521,7 +564,7 @@ ConvertEPairs()
 exports entity key/value pairs to a map file
 */
 
-static void ConvertEPairs( FILE *f, entity_t *e )
+static void ConvertEPairs( FILE *f, entity_t *e, qboolean skip_origin )
 {
        epair_t *ep;
        
@@ -537,6 +580,10 @@ static void ConvertEPairs( FILE *f, entity_t *e )
                if( !Q_stricmp( ep->key, "model" ) && ep->value[ 0 ] == '*' )
                        continue;
                
+               /* ignore origin keys if skip_origin is set */
+               if( skip_origin && !Q_stricmp( ep->key, "origin" ) )
+                       continue;
+               
                /* emit the epair */
                fprintf( f, "\t\"%s\" \"%s\"\n", ep->key, ep->value );
        }
@@ -590,10 +637,6 @@ int ConvertBSPToMap( char *bspName )
                fprintf( f, "// entity %d\n", i );
                fprintf( f, "{\n" );
                
-               /* export keys */
-               ConvertEPairs( f, e );
-               fprintf( f, "\n" );
-               
                /* get model num */
                if( i == 0 )
                        modelNum = 0;
@@ -606,6 +649,10 @@ int ConvertBSPToMap( char *bspName )
                                modelNum = -1;
                }
                
+               /* export keys */
+               ConvertEPairs( f, e, modelNum >= 0 );
+               fprintf( f, "\n" );
+               
                /* only handle bsp models */
                if( modelNum >= 0 )
                {