refactor bsp decompilation

This commit is contained in:
Garux 2021-10-14 14:32:49 +03:00
parent a719e012fe
commit bc7bd516e6

View File

@ -190,7 +190,7 @@ static void ConvertOriginBrush( FILE *f, int num, const Vector3& origin, bool br
fprintf( f, "\t}\n\n" ); fprintf( f, "\t}\n\n" );
} }
static void ConvertBrushFast( FILE *f, int num, const bspBrush_t& brush, const Vector3& origin, bool brushPrimitives ){ static void bspBrush_to_buildBrush( const bspBrush_t& brush ){
/* clear out build brush */ /* clear out build brush */
buildBrush.sides.clear(); buildBrush.sides.clear();
@ -242,6 +242,11 @@ static void ConvertBrushFast( FILE *f, int num, const bspBrush_t& brush, const V
buildBrush.sides.back().shaderInfo = ShaderInfoForShader( shader.shader ); buildBrush.sides.back().shaderInfo = ShaderInfoForShader( shader.shader );
buildBrush.sides.back().planenum = side.planeNum; buildBrush.sides.back().planenum = side.planeNum;
} }
}
static void ConvertBrushFast( FILE *f, int bspBrushNum, const Vector3& origin, bool brushPrimitives ){
bspBrush_to_buildBrush( bspBrushes[bspBrushNum] );
if ( !CreateBrushWindings( buildBrush ) ) { if ( !CreateBrushWindings( buildBrush ) ) {
//Sys_Printf( "CreateBrushWindings failed\n" ); //Sys_Printf( "CreateBrushWindings failed\n" );
@ -249,7 +254,7 @@ static void ConvertBrushFast( FILE *f, int num, const bspBrush_t& brush, const V
} }
/* start brush */ /* start brush */
fprintf( f, "\t// brush %d\n", num ); fprintf( f, "\t// brush %d\n", bspBrushNum );
fprintf( f, "\t{\n" ); fprintf( f, "\t{\n" );
if ( brushPrimitives ) { if ( brushPrimitives ) {
fprintf( f, "\tbrushDef\n" ); fprintf( f, "\tbrushDef\n" );
@ -314,58 +319,9 @@ static void ConvertBrushFast( FILE *f, int num, const bspBrush_t& brush, const V
fprintf( f, "\t}\n\n" ); fprintf( f, "\t}\n\n" );
} }
static void ConvertBrush( FILE *f, int num, const bspBrush_t& brush, const Vector3& origin, bool brushPrimitives ){ static void ConvertBrush( FILE *f, int bspBrushNum, const Vector3& origin, bool brushPrimitives ){
/* clear out build brush */
buildBrush.sides.clear();
bool modelclip = false; bspBrush_to_buildBrush( bspBrushes[bspBrushNum] );
/* try to guess if thats model clip */
if ( force ){
int notNoShader = 0;
modelclip = true;
for ( int i = 0; i < brush.numSides; i++ )
{
/* get side */
const bspBrushSide_t& side = bspBrushSides[ brush.firstSide + i ];
/* get shader */
if ( side.shaderNum < 0 || side.shaderNum >= int( bspShaders.size() ) ) {
continue;
}
const bspShader_t& shader = bspShaders[ side.shaderNum ];
//"noshader" happens on modelclip and unwanted sides ( usually breaking complex brushes )
if( !striEqual( shader.shader, "noshader" ) ){
notNoShader++;
}
if( notNoShader > 1 ){
modelclip = false;
break;
}
}
}
/* iterate through bsp brush sides */
for ( int i = 0; i < brush.numSides; i++ )
{
/* get side */
const bspBrushSide_t& side = bspBrushSides[ brush.firstSide + i ];
/* get shader */
if ( side.shaderNum < 0 || side.shaderNum >= int( bspShaders.size() ) ) {
continue;
}
const bspShader_t& shader = bspShaders[ side.shaderNum ];
//"noshader" happens on modelclip and unwanted sides ( usually breaking complex brushes )
if( striEqual( shader.shader, "default" ) || ( striEqual( shader.shader, "noshader" ) && !modelclip ) )
continue;
/* add build side */
buildBrush.sides.emplace_back();
/* tag it */
buildBrush.sides.back().shaderInfo = ShaderInfoForShader( shader.shader );
buildBrush.sides.back().planenum = side.planeNum;
}
/* make brush windings */ /* make brush windings */
if ( !CreateBrushWindings( buildBrush ) ) { if ( !CreateBrushWindings( buildBrush ) ) {
@ -374,7 +330,7 @@ static void ConvertBrush( FILE *f, int num, const bspBrush_t& brush, const Vecto
} }
/* start brush */ /* start brush */
fprintf( f, "\t// brush %d\n", num ); fprintf( f, "\t// brush %d\n", bspBrushNum );
fprintf( f, "\t{\n" ); fprintf( f, "\t{\n" );
if ( brushPrimitives ) { if ( brushPrimitives ) {
fprintf( f, "\tbrushDef\n" ); fprintf( f, "\tbrushDef\n" );
@ -809,21 +765,6 @@ static void ConvertPatch( FILE *f, int num, const bspDrawSurface_t& ds, const Ve
*/ */
static void ConvertModel( FILE *f, const bspModel_t& model, const Vector3& origin, bool brushPrimitives ){ static void ConvertModel( FILE *f, const bspModel_t& model, const Vector3& origin, bool brushPrimitives ){
/* convert bsp planes to map planes */
mapplanes.resize( bspPlanes.size() );
for ( size_t i = 0; i < bspPlanes.size(); ++i )
{
plane_t& plane = mapplanes[i];
plane.plane = bspPlanes[ i ];
plane.type = PlaneTypeForNormal( plane.normal() );
plane.hash_chain = 0;
}
/* allocate a build brush */
buildBrush.sides.reserve( MAX_BUILD_SIDES );
buildBrush.entityNum = 0;
buildBrush.original = &buildBrush;
if ( origin != g_vector3_identity ) { if ( origin != g_vector3_identity ) {
ConvertOriginBrush( f, -1, origin, brushPrimitives ); ConvertOriginBrush( f, -1, origin, brushPrimitives );
} }
@ -831,13 +772,10 @@ static void ConvertModel( FILE *f, const bspModel_t& model, const Vector3& origi
/* go through each brush in the model */ /* go through each brush in the model */
for ( int i = 0; i < model.numBSPBrushes; i++ ) for ( int i = 0; i < model.numBSPBrushes; i++ )
{ {
const int num = i + model.firstBSPBrush; if( fast )
if( fast ){ ConvertBrushFast( f, model.firstBSPBrush + i, origin, brushPrimitives );
ConvertBrushFast( f, num, bspBrushes[ num ], origin, brushPrimitives ); else
} ConvertBrush( f, model.firstBSPBrush + i, origin, brushPrimitives );
else{
ConvertBrush( f, num, bspBrushes[ num ], origin, brushPrimitives );
}
} }
/* go through each drawsurf in the model */ /* go through each drawsurf in the model */
@ -860,9 +798,9 @@ static void ConvertModel( FILE *f, const bspModel_t& model, const Vector3& origi
exports entity key/value pairs to a map file exports entity key/value pairs to a map file
*/ */
static void ConvertEPairs( FILE *f, entity_t *e, bool skip_origin ){ static void ConvertEPairs( FILE *f, const entity_t& e, bool skip_origin ){
/* walk epairs */ /* walk epairs */
for ( const auto& ep : e->epairs ) for ( const auto& ep : e.epairs )
{ {
/* ignore empty keys/values */ /* ignore empty keys/values */
if ( ep.key.empty() || ep.value.empty() ) { if ( ep.key.empty() || ep.value.empty() ) {
@ -892,10 +830,23 @@ static void ConvertEPairs( FILE *f, entity_t *e, bool skip_origin ){
*/ */
int ConvertBSPToMap_Ext( char *bspName, bool brushPrimitives ){ int ConvertBSPToMap_Ext( char *bspName, bool brushPrimitives ){
int modelNum; /* setup brush conversion prerequisites */
FILE *f; {
entity_t *e; /* convert bsp planes to map planes */
const char *value; mapplanes.resize( bspPlanes.size() );
for ( size_t i = 0; i < bspPlanes.size(); ++i )
{
plane_t& plane = mapplanes[i];
plane.plane = bspPlanes[ i ];
plane.type = PlaneTypeForNormal( plane.normal() );
plane.hash_chain = 0;
}
/* allocate a build brush */
buildBrush.sides.reserve( MAX_BUILD_SIDES );
buildBrush.entityNum = 0;
buildBrush.original = &buildBrush;
}
/* note it */ /* note it */
Sys_Printf( "--- Convert BSP to MAP ---\n" ); Sys_Printf( "--- Convert BSP to MAP ---\n" );
@ -905,7 +856,7 @@ int ConvertBSPToMap_Ext( char *bspName, bool brushPrimitives ){
Sys_Printf( "writing %s\n", name.c_str() ); Sys_Printf( "writing %s\n", name.c_str() );
/* open it */ /* open it */
f = SafeOpenWrite( name ); FILE *f = SafeOpenWrite( name );
/* print header */ /* print header */
fprintf( f, "// Generated by Q3Map2 (ydnar) -convert -format map\n" ); fprintf( f, "// Generated by Q3Map2 (ydnar) -convert -format map\n" );
@ -914,19 +865,20 @@ int ConvertBSPToMap_Ext( char *bspName, bool brushPrimitives ){
for ( std::size_t i = 0; i < entities.size(); ++i ) for ( std::size_t i = 0; i < entities.size(); ++i )
{ {
/* get entity */ /* get entity */
e = &entities[ i ]; const entity_t& e = entities[ i ];
/* start entity */ /* start entity */
fprintf( f, "// entity %zu\n", i ); fprintf( f, "// entity %zu\n", i );
fprintf( f, "{\n" ); fprintf( f, "{\n" );
/* get model num */ /* get model num */
int modelNum;
if ( i == 0 ) { if ( i == 0 ) {
modelNum = 0; modelNum = 0;
} }
else else
{ {
value = e->valueForKey( "model" ); const char *value = e.valueForKey( "model" );
if ( value[ 0 ] == '*' ) { if ( value[ 0 ] == '*' ) {
modelNum = atoi( value + 1 ); modelNum = atoi( value + 1 );
} }
@ -942,7 +894,7 @@ int ConvertBSPToMap_Ext( char *bspName, bool brushPrimitives ){
/* only handle bsp models */ /* only handle bsp models */
if ( modelNum >= 0 ) { if ( modelNum >= 0 ) {
/* convert model */ /* convert model */
ConvertModel( f, bspModels[ modelNum ], e->vectorForKey( "origin" ), brushPrimitives ); ConvertModel( f, bspModels[ modelNum ], e.vectorForKey( "origin" ), brushPrimitives );
} }
/* end entity */ /* end entity */