std::vector<bspBrushSide_t> bspBrushSides

This commit is contained in:
Garux 2021-09-25 10:17:51 +03:00
parent 9f63742fda
commit f5c1a11a66
8 changed files with 34 additions and 89 deletions

View File

@ -228,41 +228,35 @@ static void SetCloneModelNumbers( void ){
*/
static void FixBrushSides( entity_t *e ){
int i;
mapDrawSurface_t *ds;
sideRef_t *sideRef;
bspBrushSide_t *side;
/* note it */
Sys_FPrintf( SYS_VRB, "--- FixBrushSides ---\n" );
/* walk list of drawsurfaces */
for ( i = e->firstDrawSurf; i < numMapDrawSurfs; i++ )
for ( int i = e->firstDrawSurf; i < numMapDrawSurfs; i++ )
{
/* get surface and try to early out */
ds = &mapDrawSurfs[ i ];
if ( ds->outputNum < 0 ) {
const mapDrawSurface_t& ds = mapDrawSurfs[ i ];
if ( ds.outputNum < 0 ) {
continue;
}
/* walk sideref list */
for ( sideRef = ds->sideRef; sideRef != NULL; sideRef = sideRef->next )
for ( const sideRef_t *sideRef = ds.sideRef; sideRef != NULL; sideRef = sideRef->next )
{
/* get bsp brush side */
if ( sideRef->side == NULL || sideRef->side->outputNum < 0 ) {
continue;
}
side = &bspBrushSides[ sideRef->side->outputNum ];
bspBrushSide_t& side = bspBrushSides[ sideRef->side->outputNum ];
/* set drawsurface */
side->surfaceNum = ds->outputNum;
//% Sys_FPrintf( SYS_VRB, "DS: %7d Side: %7d ", ds->outputNum, sideRef->side->outputNum );
side.surfaceNum = ds.outputNum;
//% Sys_FPrintf( SYS_VRB, "DS: %7d Side: %7d ", ds.outputNum, sideRef->side->outputNum );
/* set shader */
if ( !strEqual( bspShaders[ side->shaderNum ].shader, ds->shaderInfo->shader ) ) {
//% Sys_FPrintf( SYS_VRB, "Remapping %s to %s\n", bspShaders[ side->shaderNum ].shader, ds->shaderInfo->shader );
side->shaderNum = EmitShader( ds->shaderInfo->shader, &ds->shaderInfo->contentFlags, &ds->shaderInfo->surfaceFlags );
if ( !strEqual( bspShaders[ side.shaderNum ].shader, ds.shaderInfo->shader ) ) {
//% Sys_FPrintf( SYS_VRB, "Remapping %s to %s\n", bspShaders[ side.shaderNum ].shader, ds.shaderInfo->shader );
side.shaderNum = EmitShader( ds.shaderInfo->shader, &ds.shaderInfo->contentFlags, &ds.shaderInfo->surfaceFlags );
}
}
}

View File

@ -202,7 +202,7 @@ void SwapBSPFile( void ){
SwapBlock( bspBrushes );
// brushsides
SwapBlock( (int*) bspBrushSides, numBSPBrushSides * sizeof( bspBrushSides[ 0 ] ) );
SwapBlock( bspBrushSides );
// vis
( (int*) &bspVisBytes )[ 0 ] = LittleLong( ( (int*) &bspVisBytes )[ 0 ] );
@ -468,8 +468,8 @@ void PrintBSPFileSizes( void ){
bspShaders.size(), bspShaders.size() * sizeof( bspShaders[0] ) );
Sys_Printf( "%9zu brushes %9zu\n",
bspBrushes.size(), bspBrushes.size() * sizeof( bspBrushes[0] ) );
Sys_Printf( "%9d brushsides %9d *\n",
numBSPBrushSides, (int) ( numBSPBrushSides * sizeof( bspBrushSide_t ) ) );
Sys_Printf( "%9zu brushsides %9zu *\n",
bspBrushSides.size(), bspBrushSides.size() * sizeof( bspBrushSides[0] ) );
Sys_Printf( "%9d fogs %9d\n",
numBSPFogs, (int) ( numBSPFogs * sizeof( bspFog_t ) ) );
Sys_Printf( "%9zu planes %9zu\n",

View File

@ -55,18 +55,17 @@ void AddLump( FILE *file, bspLump_t& lump, const std::vector<T>& data ){
CopyLump()
copies a bsp file lump into a destination buffer
*/
template<typename T>
void CopyLump( bspHeader_t *header, int lump, std::vector<T>& data ){
template<typename DstT, typename SrcT = DstT>
void CopyLump( bspHeader_t *header, int lump, std::vector<DstT>& data ){
/* get lump length and offset */
const int length = header->lumps[ lump ].length;
const int offset = header->lumps[ lump ].offset;
const int size = sizeof( T );
/* handle erroneous cases */
if ( length == 0 ) {
return;
}
if ( length % size ) {
if ( length % sizeof( SrcT ) ) {
if ( force ) {
Sys_Warning( "CopyLump: odd lump size (%d) in lump %d\n", length, lump );
return;
@ -77,5 +76,5 @@ void CopyLump( bspHeader_t *header, int lump, std::vector<T>& data ){
}
/* copy block of memory and return */
data = { ( T* )( (byte*) header + offset ), ( T* )( (byte*) header + offset + length ) };
data = { ( SrcT* )( (byte*) header + offset ), ( SrcT* )( (byte*) header + offset + length ) };
}

View File

@ -80,54 +80,15 @@ struct ibspBrushSide_t
{
int planeNum;
int shaderNum;
ibspBrushSide_t( const bspBrushSide_t& other ) :
planeNum( other.planeNum ),
shaderNum( other.shaderNum ){}
operator bspBrushSide_t() const {
return { planeNum, shaderNum, -1 };
}
};
static void CopyBrushSidesLump( ibspHeader_t *header ){
const ibspBrushSide_t *in = GetLump( (bspHeader_t*) header, LUMP_BRUSHSIDES );
/* get count */
numBSPBrushSides = GetLumpElements( (bspHeader_t*) header, LUMP_BRUSHSIDES, sizeof( *in ) );
/* copy */
AUTOEXPAND_BY_REALLOC_BSP( BrushSides, 1024 );
for ( int i = 0; i < numBSPBrushSides; ++i, ++in )
{
bspBrushSide_t *out = &bspBrushSides[i];
out->planeNum = in->planeNum;
out->shaderNum = in->shaderNum;
out->surfaceNum = -1;
}
}
static void AddBrushSidesLump( FILE *file, ibspHeader_t *header ){
int i, size;
bspBrushSide_t *in;
ibspBrushSide_t *buffer, *out;
/* allocate output buffer */
size = numBSPBrushSides * sizeof( *buffer );
buffer = safe_calloc( size );
/* convert */
in = bspBrushSides;
out = buffer;
for ( i = 0; i < numBSPBrushSides; i++ )
{
out->planeNum = in->planeNum;
out->shaderNum = in->shaderNum;
in++;
out++;
}
/* write lump */
AddLump( file, (bspHeader_t*) header, LUMP_BRUSHSIDES, buffer, size );
/* free buffer */
free( buffer );
}
/* drawsurfaces */
struct ibspDrawSurface_t
@ -449,7 +410,7 @@ void LoadIBSPFile( const char *filename ){
CopyLump( (bspHeader_t*) header, LUMP_BRUSHES, bspBrushes );
CopyBrushSidesLump( header );
CopyLump<bspBrushSide_t, ibspBrushSide_t>( (bspHeader_t*) header, LUMP_BRUSHSIDES, bspBrushSides );
CopyDrawVertsLump( header );
@ -556,7 +517,7 @@ void WriteIBSPFile( const char *filename ){
AddLump( file, header->lumps[LUMP_LEAFS], bspLeafs );
AddLump( file, header->lumps[LUMP_NODES], bspNodes );
AddLump( file, header->lumps[LUMP_BRUSHES], bspBrushes );
AddBrushSidesLump( file, header );
AddLump( file, header->lumps[LUMP_BRUSHSIDES], std::vector<ibspBrushSide_t>( bspBrushSides.begin(), bspBrushSides.end() ) );
AddLump( file, header->lumps[LUMP_LEAFSURFACES], bspLeafSurfaces );
AddLump( file, header->lumps[LUMP_LEAFBRUSHES], bspLeafBrushes );
AddLump( file, header->lumps[LUMP_MODELS], bspModels );

View File

@ -240,7 +240,7 @@ void LoadRBSPFile( const char *filename ){
CopyLump( (bspHeader_t*) header, LUMP_BRUSHES, bspBrushes );
numBSPBrushSides = CopyLump_Allocate( (bspHeader_t*) header, LUMP_BRUSHSIDES, (void **) &bspBrushSides, sizeof( bspBrushSide_t ), &allocatedBSPBrushSides );
CopyLump( (bspHeader_t*) header, LUMP_BRUSHSIDES, bspBrushSides );
numBSPDrawVerts = GetLumpElements( (bspHeader_t*) header, LUMP_DRAWVERTS, sizeof( bspDrawVerts[ 0 ] ) );
SetDrawVerts( numBSPDrawVerts );
@ -309,7 +309,7 @@ void WriteRBSPFile( const char *filename ){
AddLump( file, header->lumps[LUMP_LEAFS], bspLeafs );
AddLump( file, header->lumps[LUMP_NODES], bspNodes );
AddLump( file, header->lumps[LUMP_BRUSHES], bspBrushes );
AddLump( file, (bspHeader_t*) header, LUMP_BRUSHSIDES, bspBrushSides, numBSPBrushSides * sizeof( bspBrushSides[ 0 ] ) );
AddLump( file, header->lumps[LUMP_BRUSHSIDES], bspBrushSides );
AddLump( file, header->lumps[LUMP_LEAFSURFACES], bspLeafSurfaces );
AddLump( file, header->lumps[LUMP_LEAFBRUSHES], bspLeafBrushes );
AddLump( file, header->lumps[LUMP_MODELS], bspModels );

View File

@ -250,7 +250,7 @@ static void write_json( const char *directory ){
}
{
doc.RemoveAllMembers();
for_indexed( auto&& side : Span( bspBrushSides, numBSPBrushSides ) ){
for_indexed( const auto& side : bspBrushSides ){
rapidjson::Value value( rapidjson::kObjectType );
value.AddMember( "planeNum", side.planeNum, all );
value.AddMember( "shaderNum", side.shaderNum, all );
@ -457,15 +457,12 @@ static void read_json( const char *directory ){
}
{
const auto doc = load_json( StringOutputStream( 256 )( directory, "BrushSides.json" ) );
static std::vector<bspBrushSide_t> items;
for( auto&& obj : doc.GetObj() ){
auto&& item = items.emplace_back();
auto&& item = bspBrushSides.emplace_back();
item.planeNum = obj.value["planeNum"].GetInt();
item.shaderNum = obj.value["shaderNum"].GetInt();
item.surfaceNum = obj.value["surfaceNum"].GetInt();
}
bspBrushSides = items.data();
numBSPBrushSides = items.size();
}
{
const auto doc = load_json( StringOutputStream( 256 )( directory, "DrawVert.json" ) );

View File

@ -2352,9 +2352,7 @@ Q_EXTERN std::vector<int> bspLeafBrushes;
Q_EXTERN std::vector<bspBrush_t> bspBrushes;
Q_EXTERN int numBSPBrushSides Q_ASSIGN( 0 );
Q_EXTERN int allocatedBSPBrushSides Q_ASSIGN( 0 );
Q_EXTERN bspBrushSide_t* bspBrushSides Q_ASSIGN( NULL );
Q_EXTERN std::vector<bspBrushSide_t> bspBrushSides;
Q_EXTERN int numBSPLightBytes Q_ASSIGN( 0 );
Q_EXTERN byte *bspLightBytes Q_ASSIGN( NULL );

View File

@ -310,7 +310,7 @@ void BeginBSPFile( void ){
/* these values may actually be initialized if the file existed when loaded, so clear them explicitly */
bspModels.clear();
bspNodes.clear();
numBSPBrushSides = 0;
bspBrushSides.clear();
bspLeafSurfaces.clear();
bspLeafBrushes.clear();
@ -382,7 +382,7 @@ void EmitBrushes( brushlist_t& brushes, int *firstBrush, int *numBrushes ){
}
db.shaderNum = EmitShader( b.contentShader->shader, &b.contentShader->contentFlags, &b.contentShader->surfaceFlags );
db.firstSide = numBSPBrushSides;
db.firstSide = bspBrushSides.size();
/* walk sides */
db.numSides = 0;
@ -391,14 +391,10 @@ void EmitBrushes( brushlist_t& brushes, int *firstBrush, int *numBrushes ){
/* set output number to bogus initially */
side.outputNum = -1;
/* check count */
AUTOEXPAND_BY_REALLOC_BSP( BrushSides, 1024 );
/* emit side */
side.outputNum = numBSPBrushSides;
bspBrushSide_t& cp = bspBrushSides[ numBSPBrushSides ];
side.outputNum = bspBrushSides.size();
bspBrushSide_t& cp = bspBrushSides.emplace_back();
db.numSides++;
numBSPBrushSides++;
cp.planeNum = side.planenum;
/* emit shader */