]> de.git.xonotic.org Git - xonotic/netradiant.git/blobdiff - tools/quake3/q3map2/convert_obj.c
(by LordHavoc) game_etut uses BSP format version 47 too
[xonotic/netradiant.git] / tools / quake3 / q3map2 / convert_obj.c
index dd11537effd30fc960cf8a9691cf6c8ad157b479..08e75e11c08041a525487f6695f093cc530e3b03 100644 (file)
@@ -43,6 +43,10 @@ ConvertSurface()
 converts a bsp drawsurface to an obj chunk
 */
 
+int firstLightmap = 0;
+int lastLightmap = -1;
+static void ConvertLightmapToMTL( FILE *f, const char *base, int lightmapNum );
+
 int objVertexCount = 0;
 int objLastShaderNum = -1;
 static void ConvertSurfaceToOBJ( FILE *f, bspModel_t *model, int modelNum, bspDrawSurface_t *ds, int surfaceNum, vec3_t origin )
@@ -70,8 +74,18 @@ static void ConvertSurfaceToOBJ( FILE *f, bspModel_t *model, int modelNum, bspDr
        {
                if(objLastShaderNum != ds->lightmapNum[0])
                {
-                       fprintf(f, "usemtl lm_%04d\r\n", ds->lightmapNum[0]);
-                       objLastShaderNum = ds->lightmapNum[0];
+                       fprintf(f, "usemtl lm_%04d\r\n", ds->lightmapNum[0] + deluxemap);
+                       objLastShaderNum = ds->lightmapNum[0] + deluxemap;
+               }
+               if(ds->lightmapNum[0] + deluxemap < firstLightmap)
+               {
+                       Sys_Printf( "WARNING: lightmap %d out of range (exporting anyway)\n", ds->lightmapNum[0] + deluxemap );
+                       firstLightmap = ds->lightmapNum[0] + deluxemap;
+               }
+               if(ds->lightmapNum[0] > lastLightmap)
+               {
+                       Sys_Printf( "WARNING: lightmap %d out of range (exporting anyway)\n", ds->lightmapNum[0] + deluxemap );
+                       lastLightmap = ds->lightmapNum[0] + deluxemap;
                }
        }
        else
@@ -162,9 +176,12 @@ static void ConvertShaderToMTL( FILE *f, bspShader_t *shader, int shaderNum )
                strcpy( filename, si->shaderImage->filename );
        else
                sprintf( filename, "%s.tga", si->shader );
+
+       /* blender hates this, so let's not do it
        for( c = filename; *c != '\0'; c++ )
                if( *c == '/' )
                        *c = '\\';
+       */
        
        /* print shader info */
        fprintf( f, "newmtl %s\r\n", shader->shader );
@@ -172,14 +189,21 @@ static void ConvertShaderToMTL( FILE *f, bspShader_t *shader, int shaderNum )
        if(shadersAsBitmap)
                fprintf( f, "map_Kd %s\r\n", shader->shader );
        else
+       /* blender hates this, so let's not do it
                fprintf( f, "map_Kd ..\\%s\r\n", filename );
+       */
+               fprintf( f, "map_Kd ../%s\r\n", filename );
 }
 
 static void ConvertLightmapToMTL( FILE *f, const char *base, int lightmapNum )
 {
        /* print shader info */
        fprintf( f, "newmtl lm_%04d\r\n", lightmapNum );
-       fprintf( f, "map_Kd %s\\lm_%04d.tga\r\n", base, lightmapNum );
+       if(lightmapNum >= 0)
+       /* blender hates this, so let's not do it
+               fprintf( f, "map_Kd %s\\lm_%04d.tga\r\n", base, lightmapNum );
+       */
+               fprintf( f, "map_Kd %s/lm_%04d.tga\r\n", base, lightmapNum );
 }
 
 
@@ -198,13 +222,15 @@ int ConvertBSPToOBJ( char *bspName )
        entity_t                *e;
        vec3_t                  origin;
        const char              *key;
-       char                    name[ 1024 ], base[ 1024 ], mtlname[ 1024 ];
+       char                    name[ 1024 ], base[ 1024 ], mtlname[ 1024 ], dirname[ 1024 ];
        
        
        /* note it */
        Sys_Printf( "--- Convert BSP to OBJ ---\n" );
 
        /* create the ase filename from the bsp name */
+       strcpy( dirname, bspName );
+       StripExtension( dirname );
        strcpy( name, bspName );
        StripExtension( name );
        strcat( name, ".obj" );
@@ -215,7 +241,6 @@ int ConvertBSPToOBJ( char *bspName )
        Sys_Printf( "writing %s\n", mtlname );
        
        ExtractFileBase( bspName, base );
-       strcat( base, ".bsp" );
        
        /* open it */
        f = fopen( name, "wb" );
@@ -228,7 +253,7 @@ int ConvertBSPToOBJ( char *bspName )
        /* print header */
        fprintf( f, "o %s\r\n", base );
        fprintf( f, "# Generated by Q3Map2 (ydnar) -convert -format obj\r\n" );
-       fprintf( f, "mtllib %s\r\n", mtlname );
+       fprintf( f, "mtllib %s.mtl\r\n", base );
 
        fprintf( fmtl, "# Generated by Q3Map2 (ydnar) -convert -format obj\r\n" );
        if(lightmapsAsTexcoord)
@@ -240,15 +265,14 @@ int ConvertBSPToOBJ( char *bspName )
                {
                        char buf[1024];
                        FILE *tmp;
-                       snprintf(buf, sizeof(buf), "%s/lm_%04d.tga", base, lightmapCount);
+                       snprintf(buf, sizeof(buf), "%s/lm_%04d.tga", dirname, lightmapCount);
                        buf[sizeof(buf) - 1] = 0;
                        tmp = fopen(buf, "rb");
                        if(!tmp)
                                break;
                        fclose(tmp);
                }
-               for( i = 0; i < lightmapCount; i++ )
-                       ConvertLightmapToMTL( fmtl, base, i );
+               lastLightmap = lightmapCount - 1;
        }
        else
        {
@@ -286,6 +310,12 @@ int ConvertBSPToOBJ( char *bspName )
                ConvertModelToOBJ( f, model, modelNum, origin );
        }
        
+       if(lightmapsAsTexcoord)
+       {
+               for( i = firstLightmap; i <= lastLightmap; i++ )
+                       ConvertLightmapToMTL( fmtl, base, i );
+       }
+
        /* close the file and return */
        fclose( f );
        fclose( fmtl );