mirror of
				https://github.com/halpz/re3.git
				synced 2025-11-04 10:34:52 +00:00 
			
		
		
		
	make game load all platform dffs
This commit is contained in:
		
							parent
							
								
									d0f5464200
								
							
						
					
					
						commit
						4e3e1d0b87
					
				| 
						 | 
					@ -393,6 +393,16 @@ CFileLoader::FindRelatedModelInfoCB(RpAtomic *atomic, void *data)
 | 
				
			||||||
	return atomic;
 | 
						return atomic;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LIBRW
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					InitClump(RpClump *clump)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						RpClumpForAllAtomics(clump, ConvertPlatformAtomic, nil);
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#else
 | 
				
			||||||
 | 
					#define InitClump(clump)
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
void
 | 
					void
 | 
				
			||||||
CFileLoader::LoadModelFile(const char *filename)
 | 
					CFileLoader::LoadModelFile(const char *filename)
 | 
				
			||||||
{
 | 
					{
 | 
				
			||||||
| 
						 | 
					@ -404,6 +414,7 @@ CFileLoader::LoadModelFile(const char *filename)
 | 
				
			||||||
	if(RwStreamFindChunk(stream, rwID_CLUMP, nil, nil)){
 | 
						if(RwStreamFindChunk(stream, rwID_CLUMP, nil, nil)){
 | 
				
			||||||
		clump = RpClumpStreamRead(stream);
 | 
							clump = RpClumpStreamRead(stream);
 | 
				
			||||||
		if(clump){
 | 
							if(clump){
 | 
				
			||||||
 | 
								InitClump(clump);
 | 
				
			||||||
			RpClumpForAllAtomics(clump, FindRelatedModelInfoCB, clump);
 | 
								RpClumpForAllAtomics(clump, FindRelatedModelInfoCB, clump);
 | 
				
			||||||
			RpClumpDestroy(clump);
 | 
								RpClumpDestroy(clump);
 | 
				
			||||||
		}
 | 
							}
 | 
				
			||||||
| 
						 | 
					@ -429,6 +440,7 @@ CFileLoader::LoadClumpFile(const char *filename)
 | 
				
			||||||
			GetNameAndLOD(nodename, name, &n);
 | 
								GetNameAndLOD(nodename, name, &n);
 | 
				
			||||||
			mi = (CClumpModelInfo*)CModelInfo::GetModelInfo(name, nil);
 | 
								mi = (CClumpModelInfo*)CModelInfo::GetModelInfo(name, nil);
 | 
				
			||||||
			if(mi){
 | 
								if(mi){
 | 
				
			||||||
 | 
									InitClump(clump);
 | 
				
			||||||
				assert(mi->IsClump());
 | 
									assert(mi->IsClump());
 | 
				
			||||||
				mi->SetClump(clump);
 | 
									mi->SetClump(clump);
 | 
				
			||||||
			}else
 | 
								}else
 | 
				
			||||||
| 
						 | 
					@ -449,6 +461,7 @@ CFileLoader::LoadClumpFile(RwStream *stream, uint32 id)
 | 
				
			||||||
	clump = RpClumpStreamRead(stream);
 | 
						clump = RpClumpStreamRead(stream);
 | 
				
			||||||
	if(clump == nil)
 | 
						if(clump == nil)
 | 
				
			||||||
		return false;
 | 
							return false;
 | 
				
			||||||
 | 
						InitClump(clump);
 | 
				
			||||||
	mi = (CClumpModelInfo*)CModelInfo::GetModelInfo(id);
 | 
						mi = (CClumpModelInfo*)CModelInfo::GetModelInfo(id);
 | 
				
			||||||
	mi->SetClump(clump);
 | 
						mi->SetClump(clump);
 | 
				
			||||||
	return true;
 | 
						return true;
 | 
				
			||||||
| 
						 | 
					@ -476,6 +489,7 @@ CFileLoader::FinishLoadClumpFile(RwStream *stream, uint32 id)
 | 
				
			||||||
	clump = RpClumpGtaStreamRead2(stream);
 | 
						clump = RpClumpGtaStreamRead2(stream);
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	if(clump){
 | 
						if(clump){
 | 
				
			||||||
 | 
							InitClump(clump);
 | 
				
			||||||
		mi = (CClumpModelInfo*)CModelInfo::GetModelInfo(id);
 | 
							mi = (CClumpModelInfo*)CModelInfo::GetModelInfo(id);
 | 
				
			||||||
		mi->SetClump(clump);
 | 
							mi->SetClump(clump);
 | 
				
			||||||
		return true;
 | 
							return true;
 | 
				
			||||||
| 
						 | 
					@ -496,6 +510,7 @@ CFileLoader::LoadAtomicFile(RwStream *stream, uint32 id)
 | 
				
			||||||
		clump = RpClumpStreamRead(stream);
 | 
							clump = RpClumpStreamRead(stream);
 | 
				
			||||||
		if(clump == nil)
 | 
							if(clump == nil)
 | 
				
			||||||
			return false;
 | 
								return false;
 | 
				
			||||||
 | 
							InitClump(clump);
 | 
				
			||||||
		gpRelatedModelInfo = (CSimpleModelInfo*)CModelInfo::GetModelInfo(id);
 | 
							gpRelatedModelInfo = (CSimpleModelInfo*)CModelInfo::GetModelInfo(id);
 | 
				
			||||||
		RpClumpForAllAtomics(clump, SetRelatedModelInfoCB, clump);
 | 
							RpClumpForAllAtomics(clump, SetRelatedModelInfoCB, clump);
 | 
				
			||||||
		RpClumpDestroy(clump);
 | 
							RpClumpDestroy(clump);
 | 
				
			||||||
| 
						 | 
					@ -531,6 +546,8 @@ CFileLoader::LoadAtomicFile2Return(const char *filename)
 | 
				
			||||||
	stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, filename);
 | 
						stream = RwStreamOpen(rwSTREAMFILENAME, rwSTREAMREAD, filename);
 | 
				
			||||||
	if(RwStreamFindChunk(stream, rwID_CLUMP, nil, nil))
 | 
						if(RwStreamFindChunk(stream, rwID_CLUMP, nil, nil))
 | 
				
			||||||
		clump = RpClumpStreamRead(stream);
 | 
							clump = RpClumpStreamRead(stream);
 | 
				
			||||||
 | 
						if(clump)
 | 
				
			||||||
 | 
							InitClump(clump);
 | 
				
			||||||
	RwStreamClose(stream, nil);
 | 
						RwStreamClose(stream, nil);
 | 
				
			||||||
	return clump;
 | 
						return clump;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -1091,7 +1091,7 @@ CVehicleModelInfo::SetEnvironmentMapCB(RpAtomic *atomic, void *data)
 | 
				
			||||||
	RpGeometry *geo;
 | 
						RpGeometry *geo;
 | 
				
			||||||
 | 
					
 | 
				
			||||||
	geo = RpAtomicGetGeometry(atomic);
 | 
						geo = RpAtomicGetGeometry(atomic);
 | 
				
			||||||
	fx = 0;
 | 
						fx = rpMATFXEFFECTNULL;
 | 
				
			||||||
	RpGeometryForAllMaterials(geo, GetMatFXEffectMaterialCB, &fx);
 | 
						RpGeometryForAllMaterials(geo, GetMatFXEffectMaterialCB, &fx);
 | 
				
			||||||
	if(fx != rpMATFXEFFECTNULL){
 | 
						if(fx != rpMATFXEFFECTNULL){
 | 
				
			||||||
		RpMatFXAtomicEnableEffects(atomic);
 | 
							RpMatFXAtomicEnableEffects(atomic);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -212,7 +212,7 @@ isSkinnedCb(RpAtomic *atomic, void *data)
 | 
				
			||||||
	RpAtomic **pAtomic = (RpAtomic**)data;
 | 
						RpAtomic **pAtomic = (RpAtomic**)data;
 | 
				
			||||||
	if(*pAtomic)
 | 
						if(*pAtomic)
 | 
				
			||||||
		return nil;	// already found one
 | 
							return nil;	// already found one
 | 
				
			||||||
	if(RpSkinGeometryGetSkin(atomic->geometry))
 | 
						if(RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic)))
 | 
				
			||||||
		*pAtomic = atomic;	// we could just return nil here directly...
 | 
							*pAtomic = atomic;	// we could just return nil here directly...
 | 
				
			||||||
	return atomic;
 | 
						return atomic;
 | 
				
			||||||
}
 | 
					}
 | 
				
			||||||
| 
						 | 
					@ -621,3 +621,70 @@ CameraCreate(RwInt32 width, RwInt32 height, RwBool zBuffer)
 | 
				
			||||||
WRAPPER void _TexturePoolsInitialise() { EAXJMP(0x598B10); }
 | 
					WRAPPER void _TexturePoolsInitialise() { EAXJMP(0x598B10); }
 | 
				
			||||||
WRAPPER void _TexturePoolsShutdown() { EAXJMP(0x598B30); }
 | 
					WRAPPER void _TexturePoolsShutdown() { EAXJMP(0x598B30); }
 | 
				
			||||||
#endif
 | 
					#endif
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					#ifdef LIBRW
 | 
				
			||||||
 | 
					#include <rpmatfx.h>
 | 
				
			||||||
 | 
					#include "VehicleModelInfo.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					int32
 | 
				
			||||||
 | 
					findPlatform(rw::Atomic *a)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						rw::Geometry *g = a->geometry;
 | 
				
			||||||
 | 
						if(g->instData)
 | 
				
			||||||
 | 
							return g->instData->platform;
 | 
				
			||||||
 | 
						return 0;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Game doesn't read atomic extensions so we never get any other than the default pipe,
 | 
				
			||||||
 | 
					// but we need it for uninstancing
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					attachPipe(rw::Atomic *atomic)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if(RpSkinGeometryGetSkin(RpAtomicGetGeometry(atomic)))
 | 
				
			||||||
 | 
							atomic->pipeline = rw::skinGlobals.pipelines[rw::platform];
 | 
				
			||||||
 | 
						else{
 | 
				
			||||||
 | 
							int fx = rpMATFXEFFECTNULL;
 | 
				
			||||||
 | 
							RpGeometryForAllMaterials(RpAtomicGetGeometry(atomic), CVehicleModelInfo::GetMatFXEffectMaterialCB, &fx);
 | 
				
			||||||
 | 
							if(fx != rpMATFXEFFECTNULL)
 | 
				
			||||||
 | 
								RpMatFXAtomicEnableEffects(atomic);
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					// Attach pipes for the platform we have native data for so we can uninstance
 | 
				
			||||||
 | 
					void
 | 
				
			||||||
 | 
					switchPipes(rw::Atomic *a, int32 platform)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						if(a->pipeline && a->pipeline->platform != platform){
 | 
				
			||||||
 | 
							uint32 plgid = a->pipeline->pluginID;
 | 
				
			||||||
 | 
							switch(plgid){
 | 
				
			||||||
 | 
							// assume default pipe won't be attached explicitly
 | 
				
			||||||
 | 
							case rw::ID_SKIN:
 | 
				
			||||||
 | 
								a->pipeline = rw::skinGlobals.pipelines[platform];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							case rw::ID_MATFX:
 | 
				
			||||||
 | 
								a->pipeline = rw::matFXGlobals.pipelines[platform];
 | 
				
			||||||
 | 
								break;
 | 
				
			||||||
 | 
							}
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RpAtomic*
 | 
				
			||||||
 | 
					ConvertPlatformAtomic(RpAtomic *atomic, void *data)
 | 
				
			||||||
 | 
					{
 | 
				
			||||||
 | 
						int32 driver = rw::platform;
 | 
				
			||||||
 | 
						int32 platform = findPlatform(atomic);
 | 
				
			||||||
 | 
						if(platform != 0 && platform != driver){
 | 
				
			||||||
 | 
							attachPipe(atomic);	// kludge
 | 
				
			||||||
 | 
							rw::ObjPipeline *origPipe = atomic->pipeline;
 | 
				
			||||||
 | 
							rw::platform = platform;
 | 
				
			||||||
 | 
							switchPipes(atomic, rw::platform);
 | 
				
			||||||
 | 
							if(atomic->geometry->flags & rw::Geometry::NATIVE)
 | 
				
			||||||
 | 
								atomic->uninstance();
 | 
				
			||||||
 | 
							// no ADC in this game
 | 
				
			||||||
 | 
							//rw::ps2::unconvertADC(atomic->geometry);
 | 
				
			||||||
 | 
							rw::platform = driver;
 | 
				
			||||||
 | 
							atomic->pipeline = origPipe;
 | 
				
			||||||
 | 
						}
 | 
				
			||||||
 | 
						return atomic;
 | 
				
			||||||
 | 
					}
 | 
				
			||||||
 | 
					#endif
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
| 
						 | 
					@ -55,3 +55,5 @@ RwCamera *CameraCreate(RwInt32 width,
 | 
				
			||||||
					   
 | 
										   
 | 
				
			||||||
void _TexturePoolsInitialise();
 | 
					void _TexturePoolsInitialise();
 | 
				
			||||||
void _TexturePoolsShutdown();
 | 
					void _TexturePoolsShutdown();
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					RpAtomic *ConvertPlatformAtomic(RpAtomic *atomic, void *data);
 | 
				
			||||||
| 
						 | 
					
 | 
				
			||||||
		Loading…
	
		Reference in a new issue