X-Git-Url: http://de.git.xonotic.org/?a=blobdiff_plain;f=tools%2Fquake3%2Fq3map2%2Fmain.c;h=b8c469dbdbd16e0188dbe8c8125efe4ee7601f9f;hb=870333585c699ba2915285311c284ef1b4a2f38e;hp=74530f7767b19c4b5fd9e12bc3ea0d1096e96bf5;hpb=b9177e76bf69b30965c2ddcd54326bc9fb786ab2;p=xonotic%2Fnetradiant.git diff --git a/tools/quake3/q3map2/main.c b/tools/quake3/q3map2/main.c index 74530f77..b8c469db 100644 --- a/tools/quake3/q3map2/main.c +++ b/tools/quake3/q3map2/main.c @@ -1,4 +1,4 @@ -/* ------------------------------------------------------------------------------- +/* -------------------------------------------------------------------------------; Copyright (C) 1999-2007 id Software, Inc. and contributors. For a list of contributors, see the accompanying CONTRIBUTORS file. @@ -75,7 +75,7 @@ typedef struct minimap_s float *sample_offsets; float sharpen_boxmult; float sharpen_centermult; - float boost; + float boost, brightness, contrast; float *data1f; float *sharpendata1f; vec3_t mins, size; @@ -303,6 +303,17 @@ static void MiniMapContrastBoost(int y) } } +static void MiniMapBrightnessContrast(int y) +{ + int x; + float *q = &minimap.data1f[y * minimap.width]; + for(x = 0; x < minimap.width; ++x) + { + *q = *q * minimap.contrast + minimap.brightness; + ++q; + } +} + void MiniMapMakeMinsMaxs(vec3_t mins_in, vec3_t maxs_in, float border, qboolean keepaspect) { vec3_t mins, maxs, extend; @@ -350,67 +361,10 @@ determines solid non-sky brushes in the world void MiniMapSetupBrushes( void ) { - int i, b, compileFlags; - bspBrush_t *brush; - bspShader_t *shader; - shaderInfo_t *si; - - - /* note it */ - Sys_FPrintf( SYS_VRB, "--- MiniMapSetupBrushes ---\n" ); - - /* allocate */ - if( opaqueBrushes == NULL ) - opaqueBrushes = safe_malloc( numBSPBrushes / 8 + 1 ); - - /* clear */ - memset( opaqueBrushes, 0, numBSPBrushes / 8 + 1 ); - numOpaqueBrushes = 0; - - /* walk the list of worldspawn brushes */ - for( i = 0; i < minimap.model->numBSPBrushes; i++ ) - { - /* get brush */ - b = minimap.model->firstBSPBrush + i; - brush = &bspBrushes[ b ]; - -#if 0 - /* check all sides */ - compileFlags = 0; - for( j = 0; j < brush->numSides; j++ ) - { - /* do bsp shader calculations */ - side = &bspBrushSides[ brush->firstSide + j ]; - shader = &bspShaders[ side->shaderNum ]; - - /* get shader info */ - si = ShaderInfoForShader( shader->shader ); - if( si == NULL ) - continue; - - /* or together compile flags */ - compileFlags |= si->compileFlags; - } -#else - shader = &bspShaders[ brush->shaderNum ]; - si = ShaderInfoForShader( shader->shader ); - if( si == NULL ) - compileFlags = 0; - else - compileFlags = si->compileFlags; -#endif - - /* determine if this brush is solid */ - if( (compileFlags & (C_SOLID | C_SKY)) == C_SOLID ) - { - opaqueBrushes[ b >> 3 ] |= (1 << (b & 7)); - numOpaqueBrushes++; - maxOpaqueBrush = i; - } - } - - /* emit some statistics */ - Sys_FPrintf( SYS_VRB, "%9d solid brushes\n", numOpaqueBrushes ); + SetupBrushesFlags(C_SOLID | C_SKY, C_SOLID, 0, 0); + // at least one must be solid + // none may be sky + // not all may be nodraw } qboolean MiniMapEvaluateSampleOffsets(int *bestj, int *bestk, float *bestval) @@ -540,6 +494,7 @@ int MiniMapBSPMain( int argc, char **argv ) char basename[1024]; char path[1024]; char relativeMinimapFilename[1024]; + qboolean autolevel; float minimapSharpen; float border; byte *data4b, *p; @@ -577,9 +532,12 @@ int MiniMapBSPMain( int argc, char **argv ) keepaspect = game->miniMapKeepAspect; mode = game->miniMapMode; + autolevel = qfalse; minimap.samples = 1; minimap.sample_offsets = NULL; minimap.boost = 1.0; + minimap.brightness = 0.0; + minimap.contrast = 1.0; /* process arguments */ for( i = 1; i < (argc - 1); i++ ) @@ -663,12 +621,34 @@ int MiniMapBSPMain( int argc, char **argv ) mode = MINIMAP_MODE_WHITE; Sys_Printf( "Writing as white alpha image\n" ); } - else if( !strcmp( argv[ i ], "-boost" ) ) + else if( !strcmp( argv[ i ], "-boost" ) && i < (argc - 2) ) { minimap.boost = atof(argv[i + 1]); i++; Sys_Printf( "Contrast boost set to %f\n", minimap.boost ); } + else if( !strcmp( argv[ i ], "-brightness" ) && i < (argc - 2) ) + { + minimap.brightness = atof(argv[i + 1]); + i++; + Sys_Printf( "Brightness set to %f\n", minimap.brightness ); + } + else if( !strcmp( argv[ i ], "-contrast" ) && i < (argc - 2) ) + { + minimap.contrast = atof(argv[i + 1]); + i++; + Sys_Printf( "Contrast set to %f\n", minimap.contrast ); + } + else if( !strcmp( argv[ i ], "-autolevel" ) ) + { + autolevel = qtrue; + Sys_Printf( "Auto level enabled\n", border ); + } + else if( !strcmp( argv[ i ], "-noautolevel" ) ) + { + autolevel = qfalse; + Sys_Printf( "Auto level disabled\n", border ); + } } MiniMapMakeMinsMaxs(mins, maxs, border, keepaspect); @@ -722,6 +702,50 @@ int MiniMapBSPMain( int argc, char **argv ) RunThreadsOnIndividual(minimap.height, qtrue, MiniMapContrastBoost); } + if(autolevel) + { + Sys_Printf( "\n--- MiniMapAutoLevel (%d) ---\n", minimap.height ); + float mi = 1, ma = 0; + float s, o; + + // TODO threads! + q = minimap.data1f; + for(y = 0; y < minimap.height; ++y) + for(x = 0; x < minimap.width; ++x) + { + float v = *q++; + if(v < mi) + mi = v; + if(v > ma) + ma = v; + } + if(ma > mi) + { + s = 1 / (ma - mi); + o = mi / (ma - mi); + + // equations: + // brightness + contrast * v + // after autolevel: + // brightness + contrast * (v * s - o) + // = + // (brightness - contrast * o) + (contrast * s) * v + minimap.brightness = minimap.brightness - minimap.contrast * o; + minimap.contrast *= s; + + Sys_Printf( "Auto level: Brightness changed to %f\n", minimap.brightness ); + Sys_Printf( "Auto level: Contrast changed to %f\n", minimap.contrast ); + } + else + Sys_Printf( "Auto level: failed because all pixels are the same value\n" ); + } + + if(minimap.brightness != 0 || minimap.contrast != 1) + { + Sys_Printf( "\n--- MiniMapBrightnessContrast (%d) ---\n", minimap.height ); + RunThreadsOnIndividual(minimap.height, qtrue, MiniMapBrightnessContrast); + } + if(minimap.sharpendata1f) { Sys_Printf( "\n--- MiniMapSharpen (%d) ---\n", minimap.height ); @@ -989,8 +1013,8 @@ int AnalyzeBSP( int argc, char **argv ) lump = (byte*) header + offset; lumpInt = LittleLong( (int) *((int*) lump) ); lumpFloat = LittleFloat( (float) *((float*) lump) ); - memcpy( lumpString, (char*) lump, (length < 1024 ? length : 1024) ); - lumpString[ 1024 ] = '\0'; + memcpy( lumpString, (char*) lump, ((size_t)length < sizeof(lumpString) ? (size_t)length : sizeof(lumpString)-1) ); + lumpString[ sizeof(lumpString)-1 ] = '\0'; /* print basic lump info */ Sys_Printf( "Lump: %d\n", i ); @@ -1199,27 +1223,30 @@ int ScaleBSPMain( int argc, char **argv ) return 0; } - /* get scale */ - scale[2] = scale[1] = scale[0] = atof( argv[ argc - 2 ] ); - if(argc >= 4) - scale[1] = scale[0] = atof( argv[ argc - 3 ] ); - if(argc >= 5) - scale[0] = atof( argv[ argc - 4 ] ); - - texscale = false; - for(i = 1; i < argc-1; ++i) + texscale = qfalse; + for(i = 1; i < argc-2; ++i) { if(!strcmp(argv[i], "-tex")) { - texscale = true; + texscale = qtrue; } else if(!strcmp(argv[i], "-spawn_ref")) { spawn_ref = atof(argv[i+1]); ++i; } + else + break; } + /* get scale */ + // if(argc-2 >= i) // always true + scale[2] = scale[1] = scale[0] = atof( argv[ argc - 2 ] ); + if(argc-3 >= i) + scale[1] = scale[0] = atof( argv[ argc - 3 ] ); + if(argc-4 >= i) + scale[0] = atof( argv[ argc - 4 ] ); + uniform = ((scale[0] == scale[1]) && (scale[1] == scale[2])); if( scale[0] == 0.0f || scale[1] == 0.0f || scale[2] == 0.0f ) @@ -1427,6 +1454,101 @@ int ScaleBSPMain( int argc, char **argv ) } +/* +PseudoCompileBSP() +a stripped down ProcessModels +*/ +void PseudoCompileBSP(qboolean need_tree) +{ + int models; + char modelValue[10]; + entity_t *entity; + face_t *faces; + tree_t *tree; + node_t *node; + brush_t *brush; + side_t *side; + int i; + + SetDrawSurfacesBuffer(); + mapDrawSurfs = safe_malloc( sizeof( mapDrawSurface_t ) * MAX_MAP_DRAW_SURFS ); + memset( mapDrawSurfs, 0, sizeof( mapDrawSurface_t ) * MAX_MAP_DRAW_SURFS ); + numMapDrawSurfs = 0; + + BeginBSPFile(); + models = 1; + for( mapEntityNum = 0; mapEntityNum < numEntities; mapEntityNum++ ) + { + /* get entity */ + entity = &entities[ mapEntityNum ]; + if( entity->brushes == NULL && entity->patches == NULL ) + continue; + + if(mapEntityNum != 0) + { + sprintf( modelValue, "*%d", models++); + SetKeyValue(entity, "model", modelValue); + } + + /* process the model */ + Sys_FPrintf( SYS_VRB, "############### model %i ###############\n", numBSPModels ); + BeginModel(); + + entity->firstDrawSurf = numMapDrawSurfs; + + ClearMetaTriangles(); + PatchMapDrawSurfs(entity); + + if(mapEntityNum == 0 && need_tree) + { + faces = MakeStructuralBSPFaceList(entities[0].brushes); + tree = FaceBSP(faces); + node = tree->headnode; + } + else + { + node = AllocNode(); + node->planenum = PLANENUM_LEAF; + tree = AllocTree(); + tree->headnode = node; + } + + /* a minimized ClipSidesIntoTree */ + for( brush = entity->brushes; brush; brush = brush->next ) + { + /* walk the brush sides */ + for( i = 0; i < brush->numsides; i++ ) + { + /* get side */ + side = &brush->sides[ i ]; + if( side->winding == NULL ) + continue; + /* shader? */ + if( side->shaderInfo == NULL ) + continue; + /* save this winding as a visible surface */ + DrawSurfaceForSide(entity, brush, side, side->winding); + } + } + + if(meta) + { + ClassifyEntitySurfaces(entity); + MakeEntityDecals(entity); + MakeEntityMetaTriangles(entity); + SmoothMetaTriangles(); + MergeMetaTriangles(); + } + FilterDrawsurfsIntoTree(entity, tree); + + FilterStructuralBrushesIntoTree(entity, tree); + FilterDetailBrushesIntoTree(entity, tree); + + EmitBrushes(entity->brushes, &entity->firstBrush, &entity->numBrushes ); + EndModel(entity, node); + } + EndBSPFile(qfalse); +} /* ConvertBSPMain() @@ -1438,16 +1560,21 @@ int ConvertBSPMain( int argc, char **argv ) int i; int (*convertFunc)( char * ); game_t *convertGame; + char ext[1024]; + qboolean map_allowed, force_bsp, force_map; /* set default */ convertFunc = ConvertBSPToASE; convertGame = NULL; + map_allowed = qfalse; + force_bsp = qfalse; + force_map = qfalse; /* arg checking */ if( argc < 1 ) { - Sys_Printf( "Usage: q3map -scale [-v] \n" ); + Sys_Printf( "Usage: q3map -convert -format [-shadesasbitmap|-lightmapsastexcoord|-deluxemapsastexcoord] [-readbsp|-readmap [-meta|-patchmeta]] \n" ); return 0; } @@ -1459,12 +1586,29 @@ int ConvertBSPMain( int argc, char **argv ) { i++; if( !Q_stricmp( argv[ i ], "ase" ) ) + { convertFunc = ConvertBSPToASE; + map_allowed = qfalse; + } + else if( !Q_stricmp( argv[ i ], "obj" ) ) + { + convertFunc = ConvertBSPToOBJ; + map_allowed = qfalse; + } + else if( !Q_stricmp( argv[ i ], "map_bp" ) ) + { + convertFunc = ConvertBSPToMap_BP; + map_allowed = qtrue; + } else if( !Q_stricmp( argv[ i ], "map" ) ) + { convertFunc = ConvertBSPToMap; + map_allowed = qtrue; + } else { convertGame = GetGame( argv[ i ] ); + map_allowed = qfalse; if( convertGame == NULL ) Sys_Printf( "Unknown conversion format \"%s\". Defaulting to ASE.\n", argv[ i ] ); } @@ -1483,24 +1627,53 @@ int ConvertBSPMain( int argc, char **argv ) } else if( !strcmp( argv[ i ], "-shadersasbitmap" ) ) shadersAsBitmap = qtrue; + else if( !strcmp( argv[ i ], "-lightmapsastexcoord" ) ) + lightmapsAsTexcoord = qtrue; + else if( !strcmp( argv[ i ], "-deluxemapsastexcoord" ) ) + { + lightmapsAsTexcoord = qtrue; + deluxemap = qtrue; + } + else if( !strcmp( argv[ i ], "-readbsp" ) ) + force_bsp = qtrue; + else if( !strcmp( argv[ i ], "-readmap" ) ) + force_map = qtrue; + else if( !strcmp( argv[ i ], "-meta" ) ) + meta = qtrue; + else if( !strcmp( argv[ i ], "-patchmeta" ) ) + { + meta = qtrue; + patchMeta = qtrue; + } } - - /* clean up map name */ - strcpy( source, ExpandArg( argv[ i ] ) ); - StripExtension( source ); - DefaultExtension( source, ".bsp" ); - + LoadShaderInfo(); - Sys_Printf( "Loading %s\n", source ); - - /* ydnar: load surface file */ - //% LoadSurfaceExtraFile( source ); - - LoadBSPFile( source ); - - /* parse bsp entities */ - ParseEntities(); + /* clean up map name */ + strcpy(source, ExpandArg(argv[i])); + ExtractFileExtension(source, ext); + + if(!map_allowed && !force_map) + force_bsp = qtrue; + + if(force_map || (!force_bsp && !Q_stricmp(ext, "map") && map_allowed)) + { + if(!map_allowed) + Sys_Printf("WARNING: the requested conversion should not be done from .map files. Compile a .bsp first.\n"); + StripExtension(source); + DefaultExtension(source, ".map"); + Sys_Printf("Loading %s\n", source); + LoadMapFile(source, qfalse, convertGame == NULL); + PseudoCompileBSP(convertGame != NULL); + } + else + { + StripExtension(source); + DefaultExtension(source, ".bsp"); + Sys_Printf("Loading %s\n", source); + LoadBSPFile(source); + ParseEntities(); + } /* bsp format convert? */ if( convertGame != NULL )