refactor bsp decompilation
This commit is contained in:
parent
a719e012fe
commit
bc7bd516e6
|
|
@ -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 */
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue
Block a user