engine: add bsp v21 support, add StaticPropLump_t v7-v11 support

This commit is contained in:
nillerusr
2022-11-30 15:58:19 +03:00
parent 20f5783225
commit 729ac111af
4 changed files with 239 additions and 70 deletions
+49 -3
View File
@@ -1143,9 +1143,55 @@ void Mod_LoadWorldlights( CMapLoadHelper &lh, bool bIsHDR )
lh.GetMap()->worldlights = NULL;
return;
}
lh.GetMap()->numworldlights = lh.LumpSize() / sizeof( dworldlight_t );
lh.GetMap()->worldlights = (dworldlight_t *)Hunk_AllocName( lh.LumpSize(), va( "%s [%s]", lh.GetLoadName(), "worldlights" ) );
memcpy (lh.GetMap()->worldlights, lh.LumpBase(), lh.LumpSize());
switch ( lh.LumpVersion() )
{
case LUMP_WORLDLIGHTS_VERSION:
{
lh.GetMap()->numworldlights = lh.LumpSize() / sizeof( dworldlight_t );
lh.GetMap()->worldlights = (dworldlight_t *)Hunk_AllocName( lh.LumpSize(), va( "%s [%s]", lh.GetLoadName(), "worldlights" ) );
memcpy( lh.GetMap()->worldlights, lh.LumpBase(), lh.LumpSize() );
break;
}
case 0:
{
int nNumWorldLights = lh.LumpSize() / sizeof( dworldlight_version0_t );
lh.GetMap()->numworldlights = nNumWorldLights;
lh.GetMap()->worldlights = (dworldlight_t *)Hunk_AllocName( nNumWorldLights * sizeof( dworldlight_t ), va( "%s [%s]", lh.GetLoadName(), "worldlights" ) );
dworldlight_version0_t* RESTRICT pOldWorldLight = reinterpret_cast<dworldlight_version0_t*>( lh.LumpBase() );
dworldlight_t* RESTRICT pNewWorldLight = lh.GetMap()->worldlights;
for ( int i = 0; i < nNumWorldLights; i++ )
{
pNewWorldLight->origin = pOldWorldLight->origin;
pNewWorldLight->intensity = pOldWorldLight->intensity;
pNewWorldLight->normal = pOldWorldLight->normal;
pNewWorldLight->shadow_cast_offset.Init( 0.0f, 0.0f, 0.0f );
pNewWorldLight->cluster = pOldWorldLight->cluster;
pNewWorldLight->type = pOldWorldLight->type;
pNewWorldLight->style = pOldWorldLight->style;
pNewWorldLight->stopdot = pOldWorldLight->stopdot;
pNewWorldLight->stopdot2 = pOldWorldLight->stopdot2;
pNewWorldLight->exponent = pOldWorldLight->exponent;
pNewWorldLight->radius = pOldWorldLight->radius;
pNewWorldLight->constant_attn = pOldWorldLight->constant_attn;
pNewWorldLight->linear_attn = pOldWorldLight->linear_attn;
pNewWorldLight->quadratic_attn = pOldWorldLight->quadratic_attn;
pNewWorldLight->flags = pOldWorldLight->flags;
pNewWorldLight->texinfo = pOldWorldLight->texinfo;
pNewWorldLight->owner = pOldWorldLight->owner;
pNewWorldLight++;
pOldWorldLight++;
}
break;
}
default:
Host_Error( "Invalid worldlight lump version!\n" );
break;
}
#if !defined( SWDS )
if ( r_lightcache_zbuffercache.GetInt() )
{
+58 -12
View File
@@ -535,12 +535,12 @@ bool CStaticProp::Init( int index, StaticPropLump_t &lump, model_t *pModel )
m_Flags = ( lump.m_Flags & (STATIC_PROP_SCREEN_SPACE_FADE | STATIC_PROP_FLAG_FADES | STATIC_PROP_NO_PER_VERTEX_LIGHTING) );
int nCurrentDXLevel = g_pMaterialSystemHardwareConfig->GetDXSupportLevel();
bool bNoDraw = ( lump.m_nMinDXLevel && lump.m_nMinDXLevel > nCurrentDXLevel );
/* bool bNoDraw = ( lump.m_nMinDXLevel && lump.m_nMinDXLevel > nCurrentDXLevel );
bNoDraw = bNoDraw || ( lump.m_nMaxDXLevel && lump.m_nMaxDXLevel < nCurrentDXLevel );
if ( bNoDraw )
{
m_Flags |= STATIC_PROP_NO_DRAW;
}
}*/
// Cache the model to world matrix since it never changes.
AngleMatrix( lump.m_Angles, lump.m_Origin, m_ModelToWorld );
@@ -1328,24 +1328,70 @@ void CStaticPropMgr::UnserializeModels( CUtlBuffer& buf )
// Gotta preallocate the static props here so no rellocations take place
// the leaf list stores pointers to these tricky little guys.
m_StaticProps.AddMultipleToTail(count);
bool bSkip = false;
m_StaticProps.EnsureCapacity(count);
for ( int i = 0; i < count; ++i )
{
// Reset every loop.
bSkip = false;
StaticPropLump_t lump;
switch ( nLumpVersion )
{
case 4: UnserializeLump<StaticPropLumpV4_t>(&lump, buf); break;
case 5: UnserializeLump<StaticPropLumpV5_t>(&lump, buf); break;
case 6: UnserializeLump<StaticPropLumpV6_t>(&lump, buf); break;
case 7: // Falls down to version 10. We promoted TF to version 10 to deal with SFM.
case 10: UnserializeLump<StaticPropLump_t>(&lump, buf); break;
case 4:
buf.Get( &lump, sizeof(StaticPropLumpV4_t) );
lump.m_flForcedFadeScale = 1.0f;
lump.m_nMinCPULevel = lump.m_nMaxCPULevel = lump.m_nMinGPULevel = lump.m_nMaxGPULevel = 0;
lump.m_DiffuseModulation.r = lump.m_DiffuseModulation.g = lump.m_DiffuseModulation.b = lump.m_DiffuseModulation.a = 255; // default color/alpha modulation to identity
lump.m_bDisableX360 = false;
lump.m_FlagsEx = 0;
break;
break;
default:
Assert("Unexpected version while deserializing lumps.");
case 5:
buf.Get( &lump, sizeof(StaticPropLumpV5_t) );
lump.m_nMinCPULevel = lump.m_nMaxCPULevel = lump.m_nMinGPULevel = lump.m_nMaxGPULevel = 0;
lump.m_DiffuseModulation.r = lump.m_DiffuseModulation.g = lump.m_DiffuseModulation.b = lump.m_DiffuseModulation.a = 255; // default color/alpha modulation to identity
lump.m_bDisableX360 = false;
lump.m_FlagsEx = 0;
break;
case 6:
buf.Get( &lump, sizeof( StaticPropLumpV6_t ) );
lump.m_nMinCPULevel = lump.m_nMaxCPULevel = lump.m_nMinGPULevel = lump.m_nMaxGPULevel = 0;
lump.m_DiffuseModulation.r = lump.m_DiffuseModulation.g = lump.m_DiffuseModulation.b = lump.m_DiffuseModulation.a = 255; // default color/alpha modulation to identity
lump.m_bDisableX360 = false;
lump.m_FlagsEx = 0;
break;
case 7:
buf.Get( &lump, sizeof( StaticPropLumpV7_t ) );
lump.m_nMinCPULevel = lump.m_nMaxCPULevel = lump.m_nMinGPULevel = lump.m_nMaxGPULevel = 0;
lump.m_bDisableX360 = false;
lump.m_FlagsEx = 0;
break;
case 8:
buf.Get( &lump, sizeof( StaticPropLumpV8_t ) );
lump.m_bDisableX360 = false;
lump.m_FlagsEx = 0;
break;
case 9:
buf.Get( &lump, sizeof( StaticPropLumpV9_t ) );
lump.m_FlagsEx = 0;
break;
case 10:
buf.Get( &lump, sizeof( StaticPropLumpV10_t ) );
break;
case 11:
buf.Get( &lump, sizeof( StaticPropLump_t ) );
break;
}
m_StaticProps[i].Init( i, lump, m_StaticPropDict[lump.m_PropType].m_pModel );
int j = m_StaticProps.AddToTail();
m_StaticProps[j].Init( j, lump, m_StaticPropDict[lump.m_PropType].m_pModel );
// For distance-based fading, keep a list of the things that need
// to be faded out. Not sure if this is the optimal way of doing it