mirror of
https://github.com/SapphireServer/Sapphire.git
synced 2025-04-29 07:37:45 +00:00
legit why the fuck are we missing stairs in towers (pcb)
This commit is contained in:
parent
b11f5e492f
commit
c7a2023df4
2 changed files with 53 additions and 54 deletions
|
@ -170,12 +170,8 @@ int main( int argc, char* argv[] )
|
||||||
}
|
}
|
||||||
|
|
||||||
LGB_FILE bgLgb( §ion[0] );
|
LGB_FILE bgLgb( §ion[0] );
|
||||||
|
|
||||||
uint32_t max_index = 0;
|
uint32_t max_index = 0;
|
||||||
|
|
||||||
std::vector<std::string> vertices;
|
|
||||||
std::vector<std::string> indices;
|
|
||||||
|
|
||||||
// dont bother if we cant write to a file
|
// dont bother if we cant write to a file
|
||||||
auto fp_out = fopen( ( zoneName + ".obj" ).c_str(), "w" );
|
auto fp_out = fopen( ( zoneName + ".obj" ).c_str(), "w" );
|
||||||
if( fp_out )
|
if( fp_out )
|
||||||
|
@ -245,28 +241,30 @@ int main( int argc, char* argv[] )
|
||||||
|
|
||||||
auto loadSgbFile = [&]( const std::string& fileName ) -> bool
|
auto loadSgbFile = [&]( const std::string& fileName ) -> bool
|
||||||
{
|
{
|
||||||
|
SGB_FILE sgbFile;
|
||||||
try
|
try
|
||||||
{
|
{
|
||||||
auto file = data1.get_file( fileName );
|
auto file = data1.get_file( fileName );
|
||||||
auto sections = file->get_data_sections();
|
auto sections = file->get_data_sections();
|
||||||
auto dataSection = §ions.at( 0 )[0];
|
auto dataSection = §ions.at( 0 )[0];
|
||||||
SGB_FILE sgbFile = SGB_FILE( &dataSection[0] );
|
sgbFile = SGB_FILE( &dataSection[0] );
|
||||||
sgbFiles.insert( std::make_pair( fileName, sgbFile ) );
|
sgbFiles.insert( std::make_pair( fileName, sgbFile ) );
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
catch( std::exception& e )
|
catch( std::exception& e )
|
||||||
{
|
{
|
||||||
std::cout << "Unable to load SGB " << fileName << "\n\tError:\n\t" << e.what() << "\n";
|
std::cout << "Unable to load SGB " << fileName << "\n\tError:\n\t" << e.what() << "\n";
|
||||||
return false;
|
sgbFiles.insert( std::make_pair( fileName, sgbFile ) );
|
||||||
}
|
}
|
||||||
|
return false;
|
||||||
};
|
};
|
||||||
auto pushVerts = [&]( const PCB_FILE& pcb_file, const std::string& name, const vec3* scale = nullptr, const vec3* rotation = nullptr, const vec3* translation = nullptr )
|
auto pushVerts = [&]( const PCB_FILE& pcb_file, const std::string& name, const vec3* scale = nullptr, const vec3* rotation = nullptr, const vec3* translation = nullptr )
|
||||||
{
|
{
|
||||||
char name2[0x100];
|
char name2[0x100];
|
||||||
memset( name2, 0, 0x100 );
|
memset( name2, 0, 0x100 );
|
||||||
sprintf(&name2[0], "%s_%u", &name[0], objCount[name]++ );
|
sprintf( &name2[0], "%s_%u", &name[0], objCount[name]++ );
|
||||||
fprintf( fp_out, "o %s\n", &name2[0] );
|
//fprintf( fp_out, "o %s\n", &name2[0] );
|
||||||
|
|
||||||
uint32_t groupCount = 0;
|
uint32_t groupCount = 0;
|
||||||
for( const auto &entry : pcb_file.entries )
|
for( const auto &entry : pcb_file.entries )
|
||||||
{
|
{
|
||||||
|
@ -315,12 +313,10 @@ int main( int argc, char* argv[] )
|
||||||
//fprintf( fp_out, "g %s_", (name2 + "_" + std::to_string( groupCount++ )).c_str() );
|
//fprintf( fp_out, "g %s_", (name2 + "_" + std::to_string( groupCount++ )).c_str() );
|
||||||
for( const auto &index : entry.data.indices )
|
for( const auto &index : entry.data.indices )
|
||||||
{
|
{
|
||||||
{
|
fprintf( fp_out, "f %i %i %i\n",
|
||||||
fprintf( fp_out, "f %i %i %i\n",
|
index.index[0] + max_index + 1,
|
||||||
index.index[0] + max_index + 1,
|
index.index[1] + max_index + 1,
|
||||||
index.index[1] + max_index + 1,
|
index.index[2] + max_index + 1 );
|
||||||
index.index[2] + max_index + 1 );
|
|
||||||
}
|
|
||||||
// std::cout << std::to_string( index.unknown[0] )<< " " << std::to_string( index.unknown[1] )<< " " << std::to_string( index.unknown[2]) << std::endl;
|
// std::cout << std::to_string( index.unknown[0] )<< " " << std::to_string( index.unknown[1] )<< " " << std::to_string( index.unknown[2]) << std::endl;
|
||||||
}
|
}
|
||||||
max_index += entry.data.vertices.size() + entry.data.vertices_i16.size();
|
max_index += entry.data.vertices.size() + entry.data.vertices_i16.size();
|
||||||
|
@ -342,54 +338,50 @@ int main( int argc, char* argv[] )
|
||||||
totalGroups++;
|
totalGroups++;
|
||||||
for( const auto& pEntry : group.entries )
|
for( const auto& pEntry : group.entries )
|
||||||
{
|
{
|
||||||
LGB_GIMMICK_ENTRY* pGimmick = nullptr;
|
LGB_GIMMICK_ENTRY* pGimmick = dynamic_cast<LGB_GIMMICK_ENTRY*>( pEntry.get() );
|
||||||
auto pBgParts = dynamic_cast<LGB_BGPARTS_ENTRY*>( pEntry.get() );
|
auto pBgParts = dynamic_cast<LGB_BGPARTS_ENTRY*>( pEntry.get() );
|
||||||
if( pBgParts && pBgParts->header.type != LgbEntryType::BgParts )
|
|
||||||
pBgParts = nullptr;
|
|
||||||
|
|
||||||
std::string fileName;
|
std::string fileName( "" );
|
||||||
fileName.resize( 256 );
|
fileName.resize( 256 );
|
||||||
if( pBgParts )
|
totalGroupEntries++;
|
||||||
{
|
|
||||||
fileName = pBgParts->collisionFileName;
|
|
||||||
if( fileName.empty() )
|
|
||||||
{
|
|
||||||
//fileName = pBgParts->modelFileName;
|
|
||||||
//boost::replace_all( fileName, "bgparts", "collision" );
|
|
||||||
//boost::replace_all( fileName, ".mdl", ".pcb" );
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
// write files
|
// write files
|
||||||
auto writeOutput = [&]()
|
auto writeOutput = [&]( const std::string& fileName, const vec3* scale, const vec3* rotation, const vec3* translation ) -> bool
|
||||||
{
|
{
|
||||||
{
|
{
|
||||||
const auto& it = pcbFiles.find( fileName );
|
const auto& it = pcbFiles.find( fileName );
|
||||||
if( it == pcbFiles.end() )
|
if( it == pcbFiles.end() )
|
||||||
{
|
{
|
||||||
if( !fileName.empty() )
|
if( fileName.empty() || !loadPcbFile( fileName ) )
|
||||||
loadPcbFile( fileName );
|
return false;
|
||||||
//std::cout << "\t\tLoaded PCB File " << pBgParts->collisionFileName << "\n";
|
//std::cout << "\t\tLoaded PCB File " << pBgParts->collisionFileName << "\n";
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
const auto& it = pcbFiles.find( fileName );
|
const auto& it = pcbFiles.find( fileName );
|
||||||
if( it != pcbFiles.end() )
|
if( it != pcbFiles.end() )
|
||||||
{
|
{
|
||||||
totalGroupEntries++;
|
|
||||||
|
|
||||||
const auto* scale = pBgParts ? &pBgParts->header.scale : &pGimmick->header.scale;
|
|
||||||
const auto* rotation = pBgParts ? &pBgParts->header.rotation : &pGimmick->header.rotation;
|
|
||||||
const auto* translation = pBgParts ? &pBgParts->header.translation : &pGimmick->header.translation;
|
|
||||||
|
|
||||||
const auto& pcb_file = it->second;
|
const auto& pcb_file = it->second;
|
||||||
pushVerts( pcb_file, fileName, scale, rotation, translation );
|
pushVerts( pcb_file, fileName, scale, rotation, translation );
|
||||||
}
|
}
|
||||||
|
return true;
|
||||||
};
|
};
|
||||||
|
|
||||||
// gimmick entry
|
if( pBgParts )
|
||||||
if( !pBgParts )
|
{
|
||||||
|
fileName = pBgParts->collisionFileName;
|
||||||
|
|
||||||
|
if( !writeOutput( fileName, &pBgParts->header.scale, &pBgParts->header.rotation, &pBgParts->header.translation ) )
|
||||||
|
{
|
||||||
|
fileName = pBgParts->modelFileName;
|
||||||
|
boost::replace_all( fileName, "bgparts", "collision" );
|
||||||
|
boost::replace_all( fileName, ".mdl", ".pcb" );
|
||||||
|
writeOutput( fileName, &pBgParts->header.scale, &pBgParts->header.rotation, &pBgParts->header.translation );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// gimmick entry
|
||||||
|
if( pGimmick )
|
||||||
{
|
{
|
||||||
pGimmick = dynamic_cast<LGB_GIMMICK_ENTRY*>( pEntry.get() );
|
|
||||||
{
|
{
|
||||||
const auto& it = sgbFiles.find( pGimmick->gimmickFileName );
|
const auto& it = sgbFiles.find( pGimmick->gimmickFileName );
|
||||||
if( it == sgbFiles.end() )
|
if( it == sgbFiles.end() )
|
||||||
|
@ -401,7 +393,6 @@ int main( int argc, char* argv[] )
|
||||||
const auto& it = sgbFiles.find( pGimmick->gimmickFileName );
|
const auto& it = sgbFiles.find( pGimmick->gimmickFileName );
|
||||||
if( it != sgbFiles.end() )
|
if( it != sgbFiles.end() )
|
||||||
{
|
{
|
||||||
totalGroupEntries++;
|
|
||||||
const auto& sgbFile = it->second;
|
const auto& sgbFile = it->second;
|
||||||
|
|
||||||
for( const auto& group : sgbFile.entries )
|
for( const auto& group : sgbFile.entries )
|
||||||
|
@ -410,20 +401,17 @@ int main( int argc, char* argv[] )
|
||||||
{
|
{
|
||||||
auto pModel = dynamic_cast<SGB_MODEL_ENTRY*>( pEntry.get() );
|
auto pModel = dynamic_cast<SGB_MODEL_ENTRY*>( pEntry.get() );
|
||||||
fileName = pModel->collisionFileName;
|
fileName = pModel->collisionFileName;
|
||||||
if( fileName.empty() )
|
if( !writeOutput( fileName, &pGimmick->header.scale, &pGimmick->header.rotation, &pGimmick->header.translation ) )
|
||||||
{
|
{
|
||||||
//fileName = pModel->modelFileName;
|
fileName = pModel->modelFileName;
|
||||||
//boost::replace_all( fileName, "bgparts", "collision" );
|
boost::replace_all( fileName, "bgparts", "collision" );
|
||||||
//boost::replace_all( fileName, ".mdl", ".pcb" );
|
boost::replace_all( fileName, ".mdl", ".pcb" );
|
||||||
|
writeOutput( fileName, &pGimmick->header.scale, &pGimmick->header.rotation, &pGimmick->header.translation );
|
||||||
}
|
}
|
||||||
writeOutput();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
continue;
|
|
||||||
}
|
}
|
||||||
// bgparts
|
|
||||||
writeOutput();
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
std::cout << "\n\nLoaded " << pcbFiles.size() << " PCB Files \n";
|
std::cout << "\n\nLoaded " << pcbFiles.size() << " PCB Files \n";
|
||||||
|
|
|
@ -172,6 +172,10 @@ struct SGB_FILE
|
||||||
SGB_HEADER header;
|
SGB_HEADER header;
|
||||||
std::vector<SGB_GROUP> entries;
|
std::vector<SGB_GROUP> entries;
|
||||||
|
|
||||||
|
SGB_FILE()
|
||||||
|
{
|
||||||
|
memset( &header, 0, sizeof( header ) );
|
||||||
|
}
|
||||||
SGB_FILE( char* buf )
|
SGB_FILE( char* buf )
|
||||||
{
|
{
|
||||||
constexpr int baseOffset = 0x14;
|
constexpr int baseOffset = 0x14;
|
||||||
|
@ -180,10 +184,17 @@ struct SGB_FILE
|
||||||
if( strncmp( &header.magic[0], "SGB1", 4 ) != 0 || strncmp( &header.magic2[0], "SCN1", 4 ) != 0 )
|
if( strncmp( &header.magic[0], "SGB1", 4 ) != 0 || strncmp( &header.magic2[0], "SCN1", 4 ) != 0 )
|
||||||
throw std::runtime_error( "Unable to load SGB File!" );
|
throw std::runtime_error( "Unable to load SGB File!" );
|
||||||
|
|
||||||
auto group = SGB_GROUP( buf, this, header.fileSize, baseOffset + header.sharedOffset );
|
try
|
||||||
auto group2 = SGB_GROUP( buf, this, header.fileSize, baseOffset + header.offset1C );
|
{
|
||||||
entries.push_back( group );
|
auto group = SGB_GROUP( buf, this, header.fileSize, baseOffset + header.sharedOffset );
|
||||||
entries.push_back( group2 );
|
entries.push_back( group );
|
||||||
|
auto group2 = SGB_GROUP( buf, this, header.fileSize, baseOffset + header.offset1C );
|
||||||
|
entries.push_back( group2 );
|
||||||
|
}
|
||||||
|
catch( std::exception& e )
|
||||||
|
{
|
||||||
|
std::cout << e.what() << "\n";
|
||||||
|
}
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
Loading…
Add table
Reference in a new issue