/*
===================
idRestoreGame::ReadTrace
===================
*/
void idRestoreGame::ReadTrace( trace_t& trace )
{
	ReadFloat( trace.fraction );
	ReadVec3( trace.endpos );
	ReadMat3( trace.endAxis );
	ReadContactInfo( trace.c );
}
/*
================
idRestoreGame::ReadRenderLight
================
*/
void idRestoreGame::ReadRenderLight( renderLight_t &renderLight ) {
	int index;
	int i;
	ReadMat3( renderLight.axis );
	ReadVec3( renderLight.origin );
	ReadInt( renderLight.suppressLightInViewID );
	ReadInt( renderLight.allowLightInViewID );
	ReadBool( renderLight.noShadows );
	ReadBool( renderLight.noSpecular );
	ReadBool( renderLight.pointLight );
	ReadBool( renderLight.parallel );
	ReadVec3( renderLight.lightRadius );
	ReadVec3( renderLight.lightCenter );
	ReadVec3( renderLight.target );
	ReadVec3( renderLight.right );
	ReadVec3( renderLight.up );
	ReadVec3( renderLight.start );
	ReadVec3( renderLight.end );
	// only idLight has a prelightModel and it's always based on the entityname, so we'll restore it there
	// ReadModel( renderLight.prelightModel );
	renderLight.prelightModel = NULL;
	ReadInt( renderLight.lightId );
	ReadMaterial( renderLight.shader );
	for( i = 0; i < MAX_ENTITY_SHADER_PARMS; i++ ) {
		ReadFloat( renderLight.shaderParms[ i ] );
	}
	ReadInt( index );
	renderLight.referenceSound = gameSoundWorld->EmitterForIndex( index );
}
/*
================
idRestoreGame::ReadRenderEntity
================
*/
void idRestoreGame::ReadRenderEntity( renderEntity_t& renderEntity )
{
	int i;
	int index;
	
	ReadModel( renderEntity.hModel );
	
	ReadInt( renderEntity.entityNum );
	ReadInt( renderEntity.bodyId );
	
	ReadBounds( renderEntity.bounds );
	
	// callback is set by class's Restore function
	renderEntity.callback = NULL;
	renderEntity.callbackData = NULL;
	
	ReadInt( renderEntity.suppressSurfaceInViewID );
	ReadInt( renderEntity.suppressShadowInViewID );
	ReadInt( renderEntity.suppressShadowInLightID );
	ReadInt( renderEntity.allowSurfaceInViewID );
	
	ReadVec3( renderEntity.origin );
	ReadMat3( renderEntity.axis );
	
	ReadMaterial( renderEntity.customShader );
	ReadMaterial( renderEntity.referenceShader );
	ReadSkin( renderEntity.customSkin );
	
	ReadInt( index );
	renderEntity.referenceSound = gameSoundWorld->EmitterForIndex( index );
	
	for( i = 0; i < MAX_ENTITY_SHADER_PARMS; i++ )
	{
		ReadFloat( renderEntity.shaderParms[ i ] );
	}
	
	for( i = 0; i < MAX_RENDERENTITY_GUI; i++ )
	{
		ReadUserInterface( renderEntity.gui[ i ] );
	}
	
	// idEntity will restore "cameraTarget", which will be used in idEntity::Present to restore the remoteRenderView
	renderEntity.remoteRenderView = NULL;
	
	renderEntity.joints = NULL;
	renderEntity.numJoints = 0;
	
	ReadFloat( renderEntity.modelDepthHack );
	
	ReadBool( renderEntity.noSelfShadow );
	ReadBool( renderEntity.noShadow );
	ReadBool( renderEntity.noDynamicInteractions );
	ReadBool( renderEntity.weaponDepthHack );
	
	ReadInt( renderEntity.forceUpdate );
	
	ReadInt( renderEntity.timeGroup );
	ReadInt( renderEntity.xrayIndex );
}
void idRestoreGame::ReadBox( idBox &box ) {
	idVec3 center, extents;
	idMat3 axis;
	ReadVec3( center );
	ReadVec3( extents );
	ReadMat3( axis );
	box = idBox( center, extents, axis );
}
/*
================
idRestoreGame::ReadRenderView
================
*/
void idRestoreGame::ReadRenderView( renderView_t &view ) {
	int i;
	ReadInt( view.viewID );
	ReadInt( view.x );
	ReadInt( view.y );
	ReadInt( view.width );
	ReadInt( view.height );
	ReadFloat( view.fov_x );
	ReadFloat( view.fov_y );
	ReadVec3( view.vieworg );
	ReadMat3( view.viewaxis );
	ReadBool( view.cramZNear );
	ReadInt( view.time );
	for( i = 0; i < MAX_GLOBAL_SHADER_PARMS; i++ ) {
		ReadFloat( view.shaderParms[ i ] );
	}
}
Exemple #6
0
bool MaxScene::Load(const char *filename)
{
	this->meshes.clear();
	this->mins = vec3::bogus_max;
	this->maxs = vec3::bogus_min;
	this->origin = vec3::zero;

	FILE *fp = fopen(filename, "rb");
	if (!fp)
		return false;
	
	U32 id, version;

	fread(&id, sizeof(U32), 1, fp);
	fread(&version, sizeof(U32), 1, fp);

	if (id != Id || (version < Version2 || version > Version))
	{
		fclose(fp);
		return false;
	}

	MatVec mats;
	U32 n;

	// materials.
	std::vector<std::string> matnames;

	fread(&n, sizeof(U32), 1, fp);

	for (U32 i = 0; i < n; ++i)
	{
		Material m;
		m.name = ReadString(fp);
		fread(&m.flags, sizeof(U32), 1, fp);
		
		if (m.flags & 1) // multisub
		{
			U32 z;
			fread(&z, sizeof(U32), 1, fp);
			for (U32 j = 0; j < z; ++j)
			{
				Material::Sub s;
				fread(&s.id, sizeof(U32), 1, fp);
				s.name = ReadString(fp);
				s.emitId = (UReg)matnames.size();
				matnames.push_back(s.name);
				m.subs.insert(Material::SubHash::value_type(s.id, s));
			}
		}
		else
		{
			m.emitId = (UReg)matnames.size();
			matnames.push_back(m.name);
		}
		
		mats.push_back(m);
	}

	if (version > Version2) // load cameras (tread discards all this)
	{
		fread(&n, sizeof(U32), 1, fp);
		for (U32 i = 0; i < n; ++i)
		{
			U32 unused, z;
			ReadString(fp);
			fread(&unused, sizeof(U32), 1, fp);
			fread(&unused, sizeof(U32), 1, fp);

			fread(&z, sizeof(U32), 1, fp);
			fread(&unused, sizeof(U32), 1, fp);

			for (U32 k = 0; k < z; ++k)
			{
				ReadString(fp);
				fread(&unused, sizeof(U32), 1, fp);
				fread(&unused, sizeof(U32), 1, fp);
				U32 numFrames;
				fread(&numFrames, sizeof(U32), 1, fp);
				for (U32 j = 0; j < numFrames; ++j)
				{
					fread(&unused, sizeof(U32), 1, fp);
					ReadBoneTM(fp);
					ReadString(fp);
				}
			}
		}
	}

	// entities

	fread(&n, sizeof(U32), 1, fp);

	TriModel mdl;
	
	for (U32 i = 0; i < n; ++i)
	{
		ReadString(fp);
		U32 unused;
		fread(&unused, sizeof(U32), 1, fp);
		origin += ReadVec3(fp);

		U32 z;
		fread(&z, sizeof(U32), 1, fp);

		std::vector<int> skelBoneCounts;
		skelBoneCounts.reserve(z);

		// skels.
		for (U32 j = 0; j < z; ++j)
		{
			U32 numBones;
			fread(&numBones, sizeof(U32), 1, fp);
			skelBoneCounts.push_back(numBones);

			for (U32 b = 0; b < numBones; ++b)
			{
				ReadString(fp);
				fread(&unused, sizeof(U32), 1, fp);
				ReadMat3(fp);
			}
		}

		fread(&z, sizeof(U32), 1, fp);

		for (U32 j = 0; j < z; ++j)
		{
			Material *m = 0;
			U32 flags;
			S32 skel;

			fread(&mdl.id, sizeof(int), 1, fp);
			fread(&flags, sizeof(U32), 1, fp);
			fread(&skel, sizeof(S32), 1, fp);

			if (flags & HasMaterialFlag) // has material
			{
				U32 idx;
				fread(&idx, sizeof(U32), 1, fp);
				m = &mats[idx];
			}

			/*if (flags & 0x40000000)
			{
				mdl.contents = Map::ContentsDetail;
			}
			else if (flags & 0x20000000)
			{
				mdl.contents = Map::ContentsAreaportal;
			}
			else
			{
				mdl.contents = Map::ContentsSolid;
			}

			if (!(flags & 0x00800000))
			{
				mdl.contents |= Map::ContentsNoClip;
			}

			if (!(flags & 0x00400000))
			{
				mdl.contents |= Map::ContentsNoDraw;
			}*/

			if (flags&(HasMeshFlag|HasAnimsFlag))
				ReadTriModel(fp, version, mdl, flags, skel >= 0 ? skelBoneCounts[skel] : 0);

			if (!mdl.tris.empty())
			{
				for (TriFaceVec::iterator it = mdl.tris.begin(); it != mdl.tris.end(); ++it)
				{
					if (m)
					{
						Material::SubHash::iterator sub = m->subs.find((U32)it->mat);
						if (sub != m->subs.end())
						{
							it->mat = (int)sub->second.emitId;
						}
						else
						{
							it->mat = m->emitId;
						}
					}
					else
					{
						it->mat = -1;
					}
				}

				Build(matnames, mdl, this->meshes, this->mins, this->maxs);
			}
		}
	}

	this->origin /= (float)n;

	fclose(fp);

	return true;
}