From 152c7c452cc4aeb54c66377c104bfa89bf4d01da Mon Sep 17 00:00:00 2001
From: aap <aap@papnet.eu>
Date: Thu, 7 May 2020 12:48:09 +0200
Subject: [PATCH] few changes for vehicle model info

---
 librw                              |  2 +-
 src/fakerw/fake.cpp                | 20 +++++-
 src/modelinfo/VehicleModelInfo.cpp | 97 +++++++++---------------------
 src/modelinfo/VehicleModelInfo.h   |  6 +-
 4 files changed, 50 insertions(+), 75 deletions(-)

diff --git a/librw b/librw
index bdbc92d8..661feeab 160000
--- a/librw
+++ b/librw
@@ -1 +1 @@
-Subproject commit bdbc92d86eef28344e01c992d55a9c4f43629f84
+Subproject commit 661feeabf4a4f0a8b0bee23b53ba557a14352d00
diff --git a/src/fakerw/fake.cpp b/src/fakerw/fake.cpp
index e569dea9..f1531490 100644
--- a/src/fakerw/fake.cpp
+++ b/src/fakerw/fake.cpp
@@ -756,6 +756,7 @@ RwCamera *RwCameraForAllClumpsNotInFrustum(RwCamera *camera, RwInt32 numClumps,
 
 RwBool RpMatFXPluginAttach( void ) { registerMatFXPlugin(); return true; }
 RpAtomic *RpMatFXAtomicEnableEffects( RpAtomic *atomic ) { MatFX::enableEffects(atomic); return atomic; }
+RpMatFXMaterialFlags RpMatFXMaterialGetEffects( const RpMaterial *material ){ return (RpMatFXMaterialFlags)MatFX::getEffects(material); }
 RpMaterial *RpMatFXMaterialSetEffects( RpMaterial *material, RpMatFXMaterialFlags flags ) { MatFX::setEffects(material, (uint32)flags); return material; }
 RpMaterial *RpMatFXMaterialSetupEnvMap( RpMaterial *material, RwTexture *texture, RwFrame *frame, RwBool useFrameBufferAlpha, RwReal coef ) {
 	MatFX *mfx = MatFX::get(material);
@@ -764,8 +765,23 @@ RpMaterial *RpMatFXMaterialSetupEnvMap( RpMaterial *material, RwTexture *texture
 	mfx->setEnvCoefficient(coef);
 	return material;
 }
-
-
+RpMaterial *RpMatFXMaterialSetEnvMapFrame( RpMaterial *material, RwFrame *frame )
+{
+	MatFX *mfx = MatFX::get(material);
+	mfx->setEnvFrame(frame);
+	return material;
+}
+RpMaterial *RpMatFXMaterialSetEnvMapCoefficient( RpMaterial *material, RwReal coef )
+{
+	MatFX *mfx = MatFX::get(material);
+	mfx->setEnvCoefficient(coef);
+	return material;
+}
+RwReal RpMatFXMaterialGetEnvMapCoefficient( const RpMaterial *material )
+{
+	MatFX *mfx = MatFX::get(material);
+	return mfx->getEnvCoefficient();
+}
 
 
 
diff --git a/src/modelinfo/VehicleModelInfo.cpp b/src/modelinfo/VehicleModelInfo.cpp
index 098400cc..97add380 100644
--- a/src/modelinfo/VehicleModelInfo.cpp
+++ b/src/modelinfo/VehicleModelInfo.cpp
@@ -21,7 +21,6 @@
 
 int8 CVehicleModelInfo::ms_compsToUse[2] = { -2, -2 };
 int8 CVehicleModelInfo::ms_compsUsed[2];
-RwTexture *CVehicleModelInfo::ms_pEnvironmentMaps[NUM_VEHICLE_ENVMAPS];
 RwRGBA CVehicleModelInfo::ms_vehicleColourTable[256];
 RwTexture *CVehicleModelInfo::ms_colourTextureTable[256];
 
@@ -752,35 +751,26 @@ void
 CVehicleModelInfo::SetVehicleColour(uint8 c1, uint8 c2)
 {
 	RwRGBA col, *colp;
-	RwTexture *coltex;
 	RpMaterial **matp;
 
 	if(c1 != m_currentColour1){
 		col = ms_vehicleColourTable[c1];
-		coltex = ms_colourTextureTable[c1];
 		for(matp = m_materials1; *matp; matp++){
-			if(RpMaterialGetTexture(*matp) && RwTextureGetName(RpMaterialGetTexture(*matp))[0] != '@'){
-				colp = (RwRGBA*)RpMaterialGetColor(*matp);	// get rid of const
-				colp->red = col.red;
-				colp->green = col.green;
-				colp->blue = col.blue;
-			}else
-				RpMaterialSetTexture(*matp, coltex);
+			colp = (RwRGBA*)RpMaterialGetColor(*matp);	// get rid of const
+			colp->red = col.red;
+			colp->green = col.green;
+			colp->blue = col.blue;
 		}
 		m_currentColour1 = c1;
 	}
 
 	if(c2 != m_currentColour2){
 		col = ms_vehicleColourTable[c2];
-		coltex = ms_colourTextureTable[c2];
 		for(matp = m_materials2; *matp; matp++){
-			if(RpMaterialGetTexture(*matp) && RwTextureGetName(RpMaterialGetTexture(*matp))[0] != '@'){
-				colp = (RwRGBA*)RpMaterialGetColor(*matp);	// get rid of const
-				colp->red = col.red;
-				colp->green = col.green;
-				colp->blue = col.blue;
-			}else
-				RpMaterialSetTexture(*matp, coltex);
+			colp = (RwRGBA*)RpMaterialGetColor(*matp);	// get rid of const
+			colp->red = col.red;
+			colp->green = col.green;
+			colp->blue = col.blue;
 		}
 		m_currentColour2 = c2;
 	}
@@ -925,7 +915,6 @@ CVehicleModelInfo::LoadVehicleColours(void)
 			ms_vehicleColourTable[numCols].green = g;
 			ms_vehicleColourTable[numCols].blue = b;
 			ms_vehicleColourTable[numCols].alpha = 0xFF;
-			ms_colourTextureTable[numCols] = CreateCarColourTexture(r, g, b);
 			numCols++;
 		}else if(section == CARS){
 			n = sscanf(&line[start],	// BUG: games doesn't add start
@@ -960,38 +949,33 @@ CVehicleModelInfo::DeleteVehicleColourTextures(void)
 	for(i = 0; i < 256; i++){
 		if(ms_colourTextureTable[i]){
 			RwTextureDestroy(ms_colourTextureTable[i]);
-#ifdef GTA3_1_1_PATCH
 			ms_colourTextureTable[i] = nil;
-#endif
 		}
 	}
 }
 
 RpMaterial*
-CVehicleModelInfo::HasSpecularMaterialCB(RpMaterial *material, void *data)
+CVehicleModelInfo::GetMatFXEffectMaterialCB(RpMaterial *material, void *data)
 {
-	if(RpMaterialGetSurfaceProperties(material)->specular <= 0.0f)
+	if(RpMatFXMaterialGetEffects(material) == rpMATFXEFFECTNULL)
 		return material;
-	*(bool*)data = true;
+	*(int*)data = RpMatFXMaterialGetEffects(material);
 	return nil;
 }
 
 RpMaterial*
-CVehicleModelInfo::SetEnvironmentMapCB(RpMaterial *material, void *data)
+CVehicleModelInfo::SetDefaultEnvironmentMapCB(RpMaterial *material, void *data)
 {
-	float spec;
-
-	spec = RpMaterialGetSurfaceProperties(material)->specular;
-	if(spec <= 0.0f)
-		RpMatFXMaterialSetEffects(material, rpMATFXEFFECTNULL);
-	else{
+	if(RpMatFXMaterialGetEffects(material) == rpMATFXEFFECTENVMAP){
+		RpMatFXMaterialSetEnvMapFrame(material, pMatFxIdentityFrame);
 		if(RpMaterialGetTexture(material) == nil)
 			RpMaterialSetTexture(material, gpWhiteTexture);
 		RpMatFXMaterialSetEffects(material, rpMATFXEFFECTENVMAP);
 #ifndef PS2_MATFX
-		spec *= 0.5f;	// Tone down a bit for PC
+		float coef = RpMatFXMaterialGetEnvMapCoefficient(material);
+		coef *= 0.25f;	// Tone down a bit for PC
+		RpMatFXMaterialSetEnvMapCoefficient(material, coef);
 #endif
-		RpMatFXMaterialSetupEnvMap(material, (RwTexture*)data, pMatFxIdentityFrame, false, spec);
 	}
 	return material;
 }
@@ -999,17 +983,15 @@ CVehicleModelInfo::SetEnvironmentMapCB(RpMaterial *material, void *data)
 RpAtomic*
 CVehicleModelInfo::SetEnvironmentMapCB(RpAtomic *atomic, void *data)
 {
-	bool hasSpec;
+	int fx;
 	RpGeometry *geo;
 
 	geo = RpAtomicGetGeometry(atomic);
-	hasSpec = 0;
-	RpGeometryForAllMaterials(geo, HasSpecularMaterialCB, &hasSpec);
-	if(hasSpec){
-		RpGeometryForAllMaterials(geo, SetEnvironmentMapCB, data);
-		RpGeometrySetFlags(geo, RpGeometryGetFlags(geo) | rpGEOMETRYMODULATEMATERIALCOLOR);
+	fx = 0;
+	RpGeometryForAllMaterials(geo, GetMatFXEffectMaterialCB, &fx);
+	if(fx != rpMATFXEFFECTNULL){
 		RpMatFXAtomicEnableEffects(atomic);
-		// PS2 sets of PS2Manager lighting CB here
+		RpGeometryForAllMaterials(geo, SetDefaultEnvironmentMapCB, data);
 	}
 	return atomic;
 }
@@ -1021,44 +1003,29 @@ CVehicleModelInfo::SetEnvironmentMap(void)
 	int32 i;
 
 	if(pMatFxIdentityFrame == nil){
+		RwV3d axis = { 1.0f, 0.0f, 0.0f };
 		pMatFxIdentityFrame = RwFrameCreate();
-		RwMatrixSetIdentity(RwFrameGetMatrix(pMatFxIdentityFrame));
+		RwMatrixRotate(RwFrameGetMatrix(pMatFxIdentityFrame), &axis, 60.0f, rwCOMBINEREPLACE);
 		RwFrameUpdateObjects(pMatFxIdentityFrame);
 		RwFrameGetLTM(pMatFxIdentityFrame);
 	}
 
-	if(m_envMap != ms_pEnvironmentMaps[0]){
-		m_envMap = ms_pEnvironmentMaps[0];
-		RpClumpForAllAtomics(m_clump, SetEnvironmentMapCB, m_envMap);
-		if(m_wheelId != -1){
-			wheelmi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(m_wheelId);
-			for(i = 0; i < wheelmi->m_numAtomics; i++)
-				SetEnvironmentMapCB(wheelmi->m_atomics[i], m_envMap);
-		}
+	RpClumpForAllAtomics(m_clump, SetEnvironmentMapCB, nil);
+	if(m_wheelId != -1){
+		wheelmi = (CSimpleModelInfo*)CModelInfo::GetModelInfo(m_wheelId);
+		for(i = 0; i < wheelmi->m_numAtomics; i++)
+			SetEnvironmentMapCB(wheelmi->m_atomics[i], nil);
 	}
 }
 
 void
 CVehicleModelInfo::LoadEnvironmentMaps(void)
 {
-	const char *texnames[] = {
-		"reflection01",		// only one used
-		"reflection02",
-		"reflection03",
-		"reflection04",
-		"reflection05",
-		"reflection06",
-	};
 	int32 txdslot;
-	int32 i;
 
 	txdslot = CTxdStore::FindTxdSlot("particle");
 	CTxdStore::PushCurrentTxd();
 	CTxdStore::SetCurrentTxd(txdslot);
-	for(i = 0; i < NUM_VEHICLE_ENVMAPS; i++){
-		ms_pEnvironmentMaps[i] = RwTextureRead(texnames[i], nil);
-		RwTextureSetFilterMode(ms_pEnvironmentMaps[i], rwFILTERLINEAR);
-	}
 	if(gpWhiteTexture == nil){
 		gpWhiteTexture = RwTextureRead("white", nil);
 		RwTextureGetName(gpWhiteTexture)[0] = '@';
@@ -1070,14 +1037,8 @@ CVehicleModelInfo::LoadEnvironmentMaps(void)
 void
 CVehicleModelInfo::ShutdownEnvironmentMaps(void)
 {
-	int32 i;
-
-	// ignoring "initialised" as that's a PS2 thing only
 	RwTextureDestroy(gpWhiteTexture);
 	gpWhiteTexture = nil;
-	for(i = 0; i < NUM_VEHICLE_ENVMAPS; i++)
-		if(ms_pEnvironmentMaps[i])
-			RwTextureDestroy(ms_pEnvironmentMaps[i]);
 	RwFrameDestroy(pMatFxIdentityFrame);
 	pMatFxIdentityFrame = nil;
 }
diff --git a/src/modelinfo/VehicleModelInfo.h b/src/modelinfo/VehicleModelInfo.h
index 6946c5c1..3ce92d78 100644
--- a/src/modelinfo/VehicleModelInfo.h
+++ b/src/modelinfo/VehicleModelInfo.h
@@ -6,7 +6,6 @@ enum {
 	NUM_FIRST_MATERIALS = 26,
 	NUM_SECOND_MATERIALS = 26,
 	NUM_VEHICLE_COLOURS = 8,
-	NUM_VEHICLE_ENVMAPS = 1
 };
 
 enum {
@@ -72,7 +71,6 @@ public:
 
 	static int8 ms_compsToUse[2];
 	static int8 ms_compsUsed[2];
-	static RwTexture *ms_pEnvironmentMaps[NUM_VEHICLE_ENVMAPS];
 	static RwRGBA ms_vehicleColourTable[256];
 	static RwTexture *ms_colourTextureTable[256];
 	static RwObjectNameIdAssocation *ms_vehicleDescs[NUM_VEHICLE_TYPES];
@@ -114,8 +112,8 @@ public:
 	static void DeleteVehicleColourTextures(void);
 
 	static RpAtomic *SetEnvironmentMapCB(RpAtomic *atomic, void *data);
-	static RpMaterial *SetEnvironmentMapCB(RpMaterial *material, void *data);
-	static RpMaterial *HasSpecularMaterialCB(RpMaterial *material, void *data);
+	static RpMaterial *SetDefaultEnvironmentMapCB(RpMaterial *material, void *data);
+	static RpMaterial *GetMatFXEffectMaterialCB(RpMaterial *material, void *data);
 	void SetEnvironmentMap(void);
 	static void LoadEnvironmentMaps(void);
 	static void ShutdownEnvironmentMaps(void);