/* =================== 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 ] ); } }
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; }