2014-08-03 15:38:53 +02:00
|
|
|
#include "StdAfxSA.h"
|
2014-05-30 20:14:47 +02:00
|
|
|
#include "ModelInfoSA.h"
|
|
|
|
|
2017-04-10 13:02:50 +02:00
|
|
|
#include <iterator>
|
|
|
|
|
2014-08-22 00:10:23 +02:00
|
|
|
static void* BaseModelInfoShutdown = AddressByVersion<void*>(0x4C4D50, 0x4C4DD0, 0x4CF590);
|
2014-08-04 14:30:16 +02:00
|
|
|
WRAPPER void CBaseModelInfo::Shutdown() { VARJMP(BaseModelInfoShutdown); }
|
2014-06-23 02:37:03 +02:00
|
|
|
|
2018-02-10 20:04:12 +01:00
|
|
|
static void* varSetVehicleColour = AddressByVersion<void*>( 0x4C84B0, 0x4C86B0, 0x4D2DB0 );
|
2017-09-07 21:27:47 +02:00
|
|
|
WRAPPER void CVehicleModelInfo::SetVehicleColour( int32_t color1, int32_t color2, int32_t color3, int32_t color4 ) { VARJMP(varSetVehicleColour); }
|
|
|
|
|
2014-08-22 00:10:23 +02:00
|
|
|
RwTexture* (*CCustomCarPlateMgr::CreatePlateTexture)(const char* pText, signed char nDesign) = AddressByVersion<RwTexture*(*)(const char*,signed char)>(0x6FDEA0, 0x6FE6D0, 0x736AC0);
|
|
|
|
signed char (*CCustomCarPlateMgr::GetMapRegionPlateDesign)() = AddressByVersion<signed char(*)()>(0x6FD7A0, 0x6FDFD0, 0x7363E0);
|
|
|
|
void (*CCustomCarPlateMgr::SetupMaterialPlatebackTexture)(RpMaterial* pMaterial, signed char nDesign) = AddressByVersion<void(*)(RpMaterial*,signed char)>(0x6FDE50, 0x6FE680, 0x736A80);
|
2014-06-23 02:37:03 +02:00
|
|
|
|
2017-04-27 16:17:38 +02:00
|
|
|
bool (*CCustomCarPlateMgr::GeneratePlateText)(char* pBuf, int nLen); // Read from InjectDelayedPatches
|
|
|
|
|
2014-08-22 00:10:23 +02:00
|
|
|
CBaseModelInfo** const ms_modelInfoPtrs = *AddressByVersion<CBaseModelInfo***>(0x509CB1, 0x4C0C96, 0x403DB7);
|
2014-08-12 22:30:37 +02:00
|
|
|
|
2017-04-10 13:02:50 +02:00
|
|
|
|
2017-04-10 13:23:39 +02:00
|
|
|
static RwTexture** const ms_aDirtTextures = *AddressByVersion<RwTexture***>( 0x5D5DCC + 3, 0, 0x5F259C + 3 );
|
2017-04-10 13:02:50 +02:00
|
|
|
void RemapDirt( CVehicleModelInfo* modelInfo, uint32_t dirtID )
|
|
|
|
{
|
|
|
|
RpMaterial** materials = modelInfo->m_numDirtMaterials > CVehicleModelInfo::IN_PLACE_BUFFER_DIRT_SIZE ? modelInfo->m_dirtMaterials : modelInfo->m_staticDirtMaterials;
|
|
|
|
|
|
|
|
for ( size_t i = 0; i < modelInfo->m_numDirtMaterials; i++ )
|
|
|
|
{
|
|
|
|
RpMaterialSetTexture( materials[i], ms_aDirtTextures[dirtID] );
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
2014-06-23 02:37:03 +02:00
|
|
|
void CVehicleModelInfo::Shutdown()
|
|
|
|
{
|
|
|
|
CBaseModelInfo::Shutdown();
|
|
|
|
|
2018-10-19 18:56:37 +02:00
|
|
|
delete[] m_dirtMaterials;
|
2017-04-10 13:02:50 +02:00
|
|
|
m_dirtMaterials = nullptr;
|
|
|
|
|
2014-06-23 02:37:03 +02:00
|
|
|
delete m_apPlateMaterials;
|
2017-03-27 21:17:43 +02:00
|
|
|
m_apPlateMaterials = nullptr;
|
2014-06-23 02:37:03 +02:00
|
|
|
}
|
|
|
|
|
2014-05-30 20:14:47 +02:00
|
|
|
void CVehicleModelInfo::FindEditableMaterialList()
|
|
|
|
{
|
2017-04-10 13:02:50 +02:00
|
|
|
std::vector<RpMaterial*> editableMaterials;
|
2014-05-30 20:14:47 +02:00
|
|
|
|
2017-03-27 21:17:43 +02:00
|
|
|
auto GetEditableMaterialListCB = [&]( RpAtomic* atomic ) -> RpAtomic* {
|
|
|
|
RpGeometryForAllMaterials( RpAtomicGetGeometry(atomic), [&]( RpMaterial* material ) -> RpMaterial* {
|
|
|
|
if ( RwTexture* texture = RpMaterialGetTexture(material) )
|
|
|
|
{
|
|
|
|
if ( const char* texName = RwTextureGetName(texture) )
|
|
|
|
{
|
2018-12-03 22:09:14 +01:00
|
|
|
if ( strcmp(texName, "vehiclegrunge256") == 0 )
|
2017-03-27 21:17:43 +02:00
|
|
|
{
|
2017-04-10 13:02:50 +02:00
|
|
|
editableMaterials.push_back( material );
|
2017-03-27 21:17:43 +02:00
|
|
|
}
|
|
|
|
}
|
|
|
|
}
|
|
|
|
return material;
|
|
|
|
} );
|
|
|
|
return atomic;
|
|
|
|
};
|
|
|
|
|
|
|
|
RpClumpForAllAtomics(reinterpret_cast<RpClump*>(pRwObject), GetEditableMaterialListCB);
|
2014-05-30 20:14:47 +02:00
|
|
|
|
2017-04-09 23:17:31 +02:00
|
|
|
for ( uint32_t i = 0; i < m_pVehicleStruct->m_nNumExtras; i++ )
|
|
|
|
GetEditableMaterialListCB(m_pVehicleStruct->m_apExtras[i]);
|
2014-05-30 20:14:47 +02:00
|
|
|
|
2017-04-10 13:02:50 +02:00
|
|
|
m_numDirtMaterials = editableMaterials.size();
|
|
|
|
if ( m_numDirtMaterials > IN_PLACE_BUFFER_DIRT_SIZE )
|
|
|
|
{
|
|
|
|
m_dirtMaterials = new RpMaterial* [m_numDirtMaterials];
|
2017-12-23 14:14:21 +01:00
|
|
|
std::copy( editableMaterials.begin(), editableMaterials.end(), stdext::make_checked_array_iterator(m_dirtMaterials, m_numDirtMaterials) );
|
2017-04-10 13:02:50 +02:00
|
|
|
}
|
|
|
|
else
|
|
|
|
{
|
|
|
|
m_dirtMaterials = nullptr;
|
|
|
|
|
|
|
|
// Use existing space instead of allocating new space
|
|
|
|
std::copy( editableMaterials.begin(), editableMaterials.end(), m_staticDirtMaterials );
|
|
|
|
}
|
|
|
|
|
2014-05-30 20:14:47 +02:00
|
|
|
m_nPrimaryColor = -1;
|
|
|
|
m_nSecondaryColor = -1;
|
|
|
|
m_nTertiaryColor = -1;
|
|
|
|
m_nQuaternaryColor = -1;
|
|
|
|
}
|
|
|
|
|
2014-06-23 02:37:03 +02:00
|
|
|
void CVehicleModelInfo::SetCarCustomPlate()
|
|
|
|
{
|
|
|
|
m_plateText[0] = '\0';
|
|
|
|
m_nPlateType = -1;
|
|
|
|
|
2017-04-10 13:18:23 +02:00
|
|
|
m_apPlateMaterials = new PlateMaterialsData;
|
2014-06-23 02:37:03 +02:00
|
|
|
|
2014-06-29 22:21:18 +02:00
|
|
|
CCustomCarPlateMgr::SetupClump(reinterpret_cast<RpClump*>(pRwObject), m_apPlateMaterials);
|
2014-06-23 02:37:03 +02:00
|
|
|
}
|
|
|
|
|
2017-04-10 13:18:23 +02:00
|
|
|
void CCustomCarPlateMgr::PollPlates( RpClump* clump, PlateMaterialsData* materials )
|
2014-05-30 20:14:47 +02:00
|
|
|
{
|
2017-04-10 13:18:23 +02:00
|
|
|
std::vector<RpMaterial*> carplates;
|
|
|
|
std::vector<RpMaterial*> carpbacks;
|
2014-05-30 20:14:47 +02:00
|
|
|
|
2017-04-10 13:18:23 +02:00
|
|
|
RpClumpForAllAtomics( clump, [&] ( RpAtomic* atomic ) -> RpAtomic* {
|
2017-03-27 21:17:43 +02:00
|
|
|
RpGeometryForAllMaterials( RpAtomicGetGeometry(atomic), [&] ( RpMaterial* material ) -> RpMaterial* {
|
|
|
|
if ( RwTexture* texture = RpMaterialGetTexture(material) )
|
2014-06-23 02:37:03 +02:00
|
|
|
{
|
2017-03-27 21:17:43 +02:00
|
|
|
if ( const char* texName = RwTextureGetName(texture) )
|
2014-06-29 22:21:18 +02:00
|
|
|
{
|
2018-12-03 22:09:14 +01:00
|
|
|
if ( strcmp( texName, "carplate" ) == 0 )
|
2014-06-29 22:21:18 +02:00
|
|
|
{
|
2017-04-10 13:18:23 +02:00
|
|
|
carplates.push_back( material );
|
2014-06-29 22:21:18 +02:00
|
|
|
}
|
2018-12-03 22:09:14 +01:00
|
|
|
else if ( strcmp( texName, "carpback" ) == 0 )
|
2014-06-29 22:21:18 +02:00
|
|
|
{
|
2017-04-10 13:18:23 +02:00
|
|
|
carpbacks.push_back( material );
|
2014-06-29 22:21:18 +02:00
|
|
|
}
|
|
|
|
}
|
2014-06-23 02:37:03 +02:00
|
|
|
}
|
2014-06-29 22:21:18 +02:00
|
|
|
|
2017-03-27 21:17:43 +02:00
|
|
|
return material;
|
|
|
|
} );
|
|
|
|
return atomic;
|
|
|
|
} );
|
2017-04-10 13:18:23 +02:00
|
|
|
|
|
|
|
materials->m_numPlates = carplates.size();
|
|
|
|
materials->m_numPlatebacks = carpbacks.size();
|
|
|
|
|
|
|
|
if ( materials->m_numPlates > 0 )
|
|
|
|
{
|
|
|
|
materials->m_plates = new RpMaterial* [materials->m_numPlates];
|
2017-12-23 14:14:21 +01:00
|
|
|
std::copy( carplates.begin(), carplates.end(), stdext::make_checked_array_iterator(materials->m_plates, materials->m_numPlates) );
|
2017-04-10 13:18:23 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
if ( materials->m_numPlatebacks > 0 )
|
|
|
|
{
|
|
|
|
materials->m_platebacks = new RpMaterial* [materials->m_numPlatebacks];
|
2017-12-23 14:14:21 +01:00
|
|
|
std::copy( carpbacks.begin(), carpbacks.end(), stdext::make_checked_array_iterator(materials->m_platebacks, materials->m_numPlatebacks) );
|
2017-04-10 13:18:23 +02:00
|
|
|
}
|
2014-06-29 22:21:18 +02:00
|
|
|
}
|
|
|
|
|
2017-04-10 13:18:23 +02:00
|
|
|
void CCustomCarPlateMgr::SetupClump(RpClump* pClump, PlateMaterialsData* pMatsArray)
|
2014-06-23 02:37:03 +02:00
|
|
|
{
|
2017-03-27 21:17:43 +02:00
|
|
|
PollPlates( pClump, pMatsArray );
|
2014-06-29 22:21:18 +02:00
|
|
|
}
|
|
|
|
|
2017-04-10 13:18:23 +02:00
|
|
|
void CCustomCarPlateMgr::SetupClumpAfterVehicleUpgrade(RpClump* pClump, PlateMaterialsData* pMatsArray, signed char nDesign)
|
2014-06-29 22:21:18 +02:00
|
|
|
{
|
|
|
|
UNREFERENCED_PARAMETER(nDesign);
|
2017-03-27 21:17:43 +02:00
|
|
|
if ( pMatsArray != nullptr )
|
2014-06-29 22:21:18 +02:00
|
|
|
{
|
2017-03-27 21:17:43 +02:00
|
|
|
PollPlates( pClump, pMatsArray );
|
2014-06-29 22:21:18 +02:00
|
|
|
}
|
2014-05-30 20:14:47 +02:00
|
|
|
}
|