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" );
}
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 */
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().planenum = side.planeNum;
}
}
static void ConvertBrushFast( FILE *f, int bspBrushNum, const Vector3& origin, bool brushPrimitives ){
bspBrush_to_buildBrush( bspBrushes[bspBrushNum] );
if ( !CreateBrushWindings( buildBrush ) ) {
//Sys_Printf( "CreateBrushWindings failed\n" );
@ -249,7 +254,7 @@ static void ConvertBrushFast( FILE *f, int num, const bspBrush_t& brush, const V
}
/* start brush */
fprintf( f, "\t// brush %d\n", num );
fprintf( f, "\t// brush %d\n", bspBrushNum );
fprintf( f, "\t{\n" );
if ( brushPrimitives ) {
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" );
}
static void ConvertBrush( FILE *f, int num, const bspBrush_t& brush, const Vector3& origin, bool brushPrimitives ){
/* clear out build brush */
buildBrush.sides.clear();
static void ConvertBrush( FILE *f, int bspBrushNum, const Vector3& origin, bool brushPrimitives ){
bool modelclip = false;
/* 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;
}
bspBrush_to_buildBrush( bspBrushes[bspBrushNum] );
/* make brush windings */
if ( !CreateBrushWindings( buildBrush ) ) {
@ -374,7 +330,7 @@ static void ConvertBrush( FILE *f, int num, const bspBrush_t& brush, const Vecto
}
/* start brush */
fprintf( f, "\t// brush %d\n", num );
fprintf( f, "\t// brush %d\n", bspBrushNum );
fprintf( f, "\t{\n" );
if ( brushPrimitives ) {
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 ){
/* 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 ) {
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 */
for ( int i = 0; i < model.numBSPBrushes; i++ )
{
const int num = i + model.firstBSPBrush;
if( fast ){
ConvertBrushFast( f, num, bspBrushes[ num ], origin, brushPrimitives );
}
else{
ConvertBrush( f, num, bspBrushes[ num ], origin, brushPrimitives );
}
if( fast )
ConvertBrushFast( f, model.firstBSPBrush + i, origin, brushPrimitives );
else
ConvertBrush( f, model.firstBSPBrush + i, origin, brushPrimitives );
}
/* 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
*/
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 */
for ( const auto& ep : e->epairs )
for ( const auto& ep : e.epairs )
{
/* ignore empty keys/values */
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 modelNum;
FILE *f;
entity_t *e;
const char *value;
/* setup brush conversion prerequisites */
{
/* 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;
}
/* note it */
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() );
/* open it */
f = SafeOpenWrite( name );
FILE *f = SafeOpenWrite( name );
/* print header */
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 )
{
/* get entity */
e = &entities[ i ];
const entity_t& e = entities[ i ];
/* start entity */
fprintf( f, "// entity %zu\n", i );
fprintf( f, "{\n" );
/* get model num */
int modelNum;
if ( i == 0 ) {
modelNum = 0;
}
else
{
value = e->valueForKey( "model" );
const char *value = e.valueForKey( "model" );
if ( value[ 0 ] == '*' ) {
modelNum = atoi( value + 1 );
}
@ -942,7 +894,7 @@ int ConvertBSPToMap_Ext( char *bspName, bool brushPrimitives ){
/* only handle bsp models */
if ( modelNum >= 0 ) {
/* convert model */
ConvertModel( f, bspModels[ modelNum ], e->vectorForKey( "origin" ), brushPrimitives );
ConvertModel( f, bspModels[ modelNum ], e.vectorForKey( "origin" ), brushPrimitives );
}
/* end entity */