bool COMotion::Load(IReader& F) { CCustomMotion::Load(F); u16 vers = F.r_u16(); if (vers==0x0003){ Clear (); for (int ch=0; ch<ctMaxChannel; ch++){ envs[ch] = xr_new<CEnvelope> (); envs[ch]->Load_1(F); } }else if (vers==0x0004){ Clear (); envs[ctPositionX] = xr_new<CEnvelope>(); envs[ctPositionX]->Load_2(F); envs[ctPositionY] = xr_new<CEnvelope>(); envs[ctPositionY]->Load_2(F); envs[ctPositionZ] = xr_new<CEnvelope>(); envs[ctPositionZ]->Load_2(F); envs[ctRotationP] = xr_new<CEnvelope>(); envs[ctRotationP]->Load_2(F); envs[ctRotationH] = xr_new<CEnvelope>(); envs[ctRotationH]->Load_2(F); envs[ctRotationB] = xr_new<CEnvelope>(); envs[ctRotationB]->Load_2(F); }else{ if (vers!=EOBJ_OMOTION_VERSION) return false; Clear (); for (int ch=0; ch<ctMaxChannel; ch++){ envs[ch] = xr_new<CEnvelope> (); envs[ch]->Load_2(F); } } return true; }
bool CGlow::Load(IReader& F) { u32 version = 0; R_ASSERT(F.r_chunk(GLOW_CHUNK_VERSION,&version)); if((version!=0x0011)&&(version!=GLOW_VERSION)){ ELog.DlgMsg( mtError, "CGlow: Unsupported version."); return false; } CCustomObject::Load(F); if (F.find_chunk(GLOW_CHUNK_SHADER)){ F.r_stringZ (m_ShaderName); } R_ASSERT(F.find_chunk(GLOW_CHUNK_TEXTURE)); F.r_stringZ (m_TexName); R_ASSERT(F.find_chunk(GLOW_CHUNK_PARAMS)); m_fRadius = F.r_float(); if (version==0x0011){ F.r_fvector3 (FPosition); UpdateTransform(); } if (F.find_chunk(GLOW_CHUNK_FLAGS)) m_Flags.assign (F.r_u16()); return true; }
bool CClip::Load(IReader& F) { R_ASSERT (F.find_chunk(EOBJ_CLIP_VERSION_CHUNK)); u16 ver = F.r_u16(); if (ver!=EOBJ_CLIP_VERSION) return false; R_ASSERT(F.find_chunk(EOBJ_CLIP_DATA_CHUNK)); F.r_stringZ (name); for (int k=0; k<4; k++){ F.r_stringZ (cycles[k].name); cycles[k].slot = F.r_u16(); } F.r_stringZ (fx.name); fx.slot = F.r_u16(); fx_power = F.r_float(); length = F.r_float(); return true; }
void CMapLocation::load(IReader &stream) { u16 c = stream.r_u16(); xr_string hint; stream.r_stringZ(hint); SetHint (hint.c_str()); SetRefCount (c); m_flags.flags = stream.r_u32 (); }
//------------------------------------------------------------------------------ // I/O part //------------------------------------------------------------------------------ BOOL CPGDef::Load(IReader& F) { R_ASSERT (F.find_chunk(PGD_CHUNK_VERSION)); u16 version = F.r_u16(); if (version!=PGD_VERSION){ Log ("!Unsupported PG version. Load failed."); return FALSE; } R_ASSERT (F.find_chunk(PGD_CHUNK_NAME)); F.r_stringZ (m_Name); F.r_chunk (PGD_CHUNK_FLAGS,&m_Flags); if (F.find_chunk(PGD_CHUNK_EFFECTS)){ m_Effects.resize(F.r_u32()); for (EffectIt it=m_Effects.begin(); it!=m_Effects.end(); it++){ *it = xr_new<SEffect>(); F.r_stringZ ((*it)->m_EffectName); F.r_stringZ ((*it)->m_OnPlayChildName); F.r_stringZ ((*it)->m_OnBirthChildName); F.r_stringZ ((*it)->m_OnDeadChildName); (*it)->m_Time0 = F.r_float(); (*it)->m_Time1 = F.r_float(); (*it)->m_Flags.assign (F.r_u32()); } }else{ //.??? убрать через некоторое время R_ASSERT (F.find_chunk(PGD_CHUNK_EFFECTS2)); m_Effects.resize(F.r_u32()); for (EffectIt it=m_Effects.begin(); it!=m_Effects.end(); it++){ *it = xr_new<SEffect>(); F.r_stringZ ((*it)->m_EffectName); F.r_stringZ ((*it)->m_OnPlayChildName); (*it)->m_Time0 = F.r_float(); (*it)->m_Time1 = F.r_float(); (*it)->m_Flags.assign (F.r_u32()); } } if (F.find_chunk(PGD_CHUNK_TIME_LIMIT)){ m_fTimeLimit= F.r_float(); } #ifdef _EDITOR if (F.find_chunk(PGD_CHUNK_OWNER)){ F.r_stringZ (m_OwnerName); F.r_stringZ (m_ModifName); F.r (&m_CreateTime,sizeof(m_CreateTime)); F.r (&m_ModifTime,sizeof(m_ModifTime)); } #endif return TRUE; }
void st_LevelOptions::Read(IReader& F) { R_ASSERT(F.find_chunk(CHUNK_LO_VERSION)); DWORD vers = F.r_u32( ); if( vers < 0x00000008 ) { ELog.DlgMsg( mtError, "Skipping bad version of level options." ); return; } R_ASSERT(F.find_chunk(CHUNK_LO_NAMES)); F.r_stringZ (m_FNLevelPath); if (F.find_chunk(CHUNK_LO_PREFIX)) F.r_stringZ (m_LevelPrefix); R_ASSERT(F.find_chunk(CHUNK_LO_BOP)); F.r_stringZ (m_BOPText); if (F.find_chunk(CHUNK_LO_MAP_VER)) F.r_stringZ (m_map_version); vers = 0; if (F.find_chunk(CHUNK_LO_BP_VERSION)) vers = F.r_u32( ); if (CURRENT_LEVELOP_BP_VERSION==vers){ if (F.find_chunk(CHUNK_BUILD_PARAMS)) F.r(&m_BuildParams, sizeof(m_BuildParams)); }else{ ELog.DlgMsg (mtError, "Skipping bad version of build params."); m_BuildParams.Init(); } if (F.find_chunk(CHUNK_LIGHT_QUALITY)) { m_LightHemiQuality = F.r_u8(); m_LightSunQuality = F.r_u8(); } if (F.find_chunk(CHUNK_MAP_USAGE)) { if(vers > 0x00000008) { m_mapUsage.m_GameType.assign (F.r_u16()); }else { m_mapUsage.m_GameType.zero (); m_mapUsage.m_GameType.set (eGameIDDeathmatch , F.r_s32()); m_mapUsage.m_GameType.set (eGameIDTeamDeathmatch, F.r_s32()); m_mapUsage.m_GameType.set (eGameIDArtefactHunt, F.r_s32()); } } }
void SAINode::LoadStream(IReader& F, ESceneAIMapTool* tools) { u32 id; u16 pl; NodePosition np; F.r (&id,3); n1 = (SAINode*)tools->UnpackLink(id); F.r (&id,3); n2 = (SAINode*)tools->UnpackLink(id); F.r (&id,3); n3 = (SAINode*)tools->UnpackLink(id); F.r (&id,3); n4 = (SAINode*)tools->UnpackLink(id); pl = F.r_u16(); pvDecompress(Plane.n,pl); F.r (&np,sizeof(np)); tools->UnpackPosition(Pos,np,tools->m_AIBBox,tools->m_Params); Plane.build (Pos,Plane.n); flags.assign (F.r_u8()); }
bool CEditShape::LoadStream(IReader& F) { R_ASSERT(F.find_chunk(SHAPE_CHUNK_VERSION)); u16 vers = F.r_u16(); inherited::LoadStream (F); R_ASSERT(F.find_chunk(SHAPE_CHUNK_SHAPES)); shapes.resize (F.r_u32()); F.r (shapes.begin(),shapes.size()*sizeof(shape_def)); if(F.find_chunk(SHAPE_CHUNK_DATA)) m_shape_type = F.r_u8(); ComputeBounds(); return true; }
bool CEditShape::Load(IReader& F) { R_ASSERT(F.find_chunk(SHAPE_CHUNK_VERSION)); u16 vers = F.r_u16(); if (SHAPE_CURRENT_VERSION!=vers){ ELog.DlgMsg( mtError, "CEditShape: unsupported version. Object can't load."); return false; } inherited::Load (F); R_ASSERT(F.find_chunk(SHAPE_CHUNK_SHAPES)); shapes.resize (F.r_u32()); F.r (shapes.begin(),shapes.size()*sizeof(shape_def)); ComputeBounds(); return true; }
bool CPSLibrary::Load(const char* nm) { IReader* F = FS.r_open(nm); bool bRes = true; R_ASSERT(F->find_chunk(PS_CHUNK_VERSION)); u16 ver = F->r_u16(); if (ver!=PS_VERSION) return false; // second generation IReader* OBJ; OBJ = F->open_chunk(PS_CHUNK_SECONDGEN); if (OBJ){ IReader* O = OBJ->open_chunk(0); for (int count=1; O; count++) { PS::CPEDef* def = xr_new<PS::CPEDef>(); if (def->Load(*O)) m_PEDs.push_back(def); else{ bRes = false; xr_delete(def); } O->close(); if (!bRes) break; O = OBJ->open_chunk(count); } OBJ->close(); } // second generation OBJ = F->open_chunk(PS_CHUNK_THIRDGEN); if (OBJ){ IReader* O = OBJ->open_chunk(0); for (int count=1; O; count++) { PS::CPGDef* def = xr_new<PS::CPGDef>(); if (def->Load(*O)) m_PGDs.push_back(def); else{ bRes = false; xr_delete(def); } O->close(); if (!bRes) break; O = OBJ->open_chunk(count); } OBJ->close(); } // final FS.r_close (F); std::sort (m_PEDs.begin(),m_PEDs.end(),ped_sort_pred); std::sort (m_PGDs.begin(),m_PGDs.end(),pgd_sort_pred); return bRes; }
void CInventoryItem::load(IReader &packet) { m_eItemPlace = (EItemPlace)packet.r_u8 () ; u16 tmp = packet.r_u16 (); if(CSE_ALifeInventoryItem::FLAG_NO_POSITION==tmp) { return; } if(!object().PPhysicsShell()) { //. object().processing_activate(); object().setup_physic_shell (); object().PPhysicsShell()->Disable(); } object().PHLoadState(packet); object().PPhysicsShell()->Disable(); }
void CInventoryItem::load(IReader &packet) { m_ItemCurrPlace.value = packet.r_u16(); m_fCondition = packet.r_float(); //-- load_data( m_upgrades, packet ); //-- install_loaded_upgrades(); u8 tmp = packet.r_u8(); if (!tmp) return; if (!object().PPhysicsShell()) { object().setup_physic_shell (); object().PPhysicsShell()->Disable(); } object().PHLoadState(packet); object().PPhysicsShell()->Disable(); }
void CSector::load (IReader& fs) { // Assign portal polygons u32 size = fs.find_chunk(fsP_Portals); R_ASSERT(0==(size&1)); u32 count = size/2; m_portals.reserve (count); while (count) { u16 ID = fs.r_u16(); CPortal* P = (CPortal*)RImplementation.getPortal (ID); m_portals.push_back(P); count--; } if (g_dedicated_server) m_root = 0; else { // Assign visual size = fs.find_chunk(fsP_Root); R_ASSERT(size==4); m_root = (dxRender_Visual*)RImplementation.getVisual (fs.r_u32()); } }
void CBone::Load_1(IReader& F) { R_ASSERT(F.find_chunk(BONE_CHUNK_VERSION)); u16 ver = F.r_u16(); if ((ver!=0x0001)&&(ver!=BONE_VERSION)) return; R_ASSERT(F.find_chunk(BONE_CHUNK_DEF)); F.r_stringZ (name); xr_strlwr(name); F.r_stringZ (parent_name); xr_strlwr(parent_name); F.r_stringZ (wmap); R_ASSERT(F.find_chunk(BONE_CHUNK_BIND_POSE)); F.r_fvector3 (rest_offset); F.r_fvector3 (rest_rotate); rest_length = F.r_float(); if (ver==0x0001) std::swap (rest_rotate.x,rest_rotate.y); LoadData (F); }
void CRender::Load3DFluid() { //if (strstr(Core.Params,"-no_volumetric_fog")) if (!RImplementation.o.volumetricfog) return; string_path fn_game; if ( FS.exist( fn_game, "$level$", "level.fog_vol" ) ) { IReader *F = FS.r_open( fn_game ); u16 version = F->r_u16(); if(version == 3) { u32 cnt = F->r_u32(); for(u32 i=0; i<cnt; ++i) { dx103DFluidVolume *pVolume = xr_new<dx103DFluidVolume>(); pVolume->Load("", F, 0); // Attach to sector's static geometry CSector *pSector = (CSector*)detectSector(pVolume->getVisData().sphere.P); // 3DFluid volume must be in render sector VERIFY(pSector); dxRender_Visual* pRoot = pSector->root(); // Sector must have root VERIFY(pRoot); VERIFY(pRoot->getType() == MT_HIERRARHY); ((FHierrarhyVisual*)pRoot)->children.push_back(pVolume); } } FS.r_close(F); } }
void CHitMemoryManager::load (IReader &packet) { if (!m_object->g_Alive()) return; typedef CClientSpawnManager::CALLBACK_TYPE CALLBACK_TYPE; CALLBACK_TYPE callback; callback.bind (&m_object->memory(),&CMemoryManager::on_requested_spawn); int count = packet.r_u8(); for (int i=0; i<count; ++i) { CDelayedHitObject delayed_object; delayed_object.m_object_id = packet.r_u16(); CHitObject &object = delayed_object.m_hit_object; object.m_object = smart_cast<CEntityAlive*>(Level().Objects.net_Find(delayed_object.m_object_id)); // object params object.m_object_params.m_level_vertex_id = packet.r_u32(); packet.r_fvector3 (object.m_object_params.m_position); #ifdef USE_ORIENTATION packet.r_float (object.m_object_params.m_orientation.yaw); packet.r_float (object.m_object_params.m_orientation.pitch); packet.r_float (object.m_object_params.m_orientation.roll); #endif // self params object.m_self_params.m_level_vertex_id = packet.r_u32(); packet.r_fvector3 (object.m_self_params.m_position); #ifdef USE_ORIENTATION packet.r_float (object.m_self_params.m_orientation.yaw); packet.r_float (object.m_self_params.m_orientation.pitch); packet.r_float (object.m_self_params.m_orientation.roll); #endif #ifdef USE_LEVEL_TIME VERIFY (Device.dwTimeGlobal >= object.m_level_time); object.m_level_time = packet.r_u32(); object.m_level_time += Device.dwTimeGlobal; #endif // USE_LEVEL_TIME #ifdef USE_LAST_LEVEL_TIME VERIFY (Device.dwTimeGlobal >= object.m_last_level_time); object.m_last_level_time = packet.r_u32(); object.m_last_level_time += Device.dwTimeGlobal; #endif // USE_LAST_LEVEL_TIME #ifdef USE_FIRST_LEVEL_TIME VERIFY (Device.dwTimeGlobal >= (*I).m_first_level_time); object.m_first_level_time = packet.r_u32(); object.m_first_level_time += Device.dwTimeGlobal; #endif // USE_FIRST_LEVEL_TIME packet.r_fvector3 (object.m_direction); object.m_bone_index = packet.r_u16(); object.m_amount = packet.r_float(); if (object.m_object) { add (object); continue; } m_delayed_objects.push_back (delayed_object); const CClientSpawnManager::CSpawnCallback *spawn_callback = Level().client_spawn_manager().callback(delayed_object.m_object_id,m_object->ID()); if (!spawn_callback || !spawn_callback->m_object_callback) if(!g_dedicated_server) Level().client_spawn_manager().add (delayed_object.m_object_id,m_object->ID(),callback); #ifdef DEBUG else { if (spawn_callback && spawn_callback->m_object_callback) { VERIFY (spawn_callback->m_object_callback == callback); } } #endif // DEBUG } }
bool CSMotion::Load(IReader& F) { CCustomMotion::Load(F); u16 vers = F.r_u16(); if (vers==0x0004){ m_BoneOrPart= u16(F.r_u32()&0xffff); m_Flags.set (esmFX,F.r_u8()); m_Flags.set (esmStopAtEnd,F.r_u8()); fSpeed = F.r_float(); fAccrue = F.r_float(); fFalloff = F.r_float(); fPower = F.r_float(); bone_mots.resize(F.r_u32()); string64 temp_buf; for(BoneMotionIt bm_it=bone_mots.begin(); bm_it!=bone_mots.end(); bm_it++){ bm_it->SetName (itoa(int(bm_it-bone_mots.begin()),temp_buf,10)); bm_it->m_Flags.assign((u8)F.r_u32()); for (int ch=0; ch<ctMaxChannel; ch++){ bm_it->envs[ch] = xr_new<CEnvelope> (); bm_it->envs[ch]->Load_1(F); } } }else{ if (vers==0x0005){ m_Flags.assign ((u8)F.r_u32()); m_BoneOrPart= u16(F.r_u32()&0xffff); fSpeed = F.r_float(); fAccrue = F.r_float(); fFalloff = F.r_float(); fPower = F.r_float(); bone_mots.resize(F.r_u32()); string64 buf; for(BoneMotionIt bm_it=bone_mots.begin(); bm_it!=bone_mots.end(); bm_it++){ F.r_stringZ (buf,sizeof(buf)); bm_it->SetName (buf); bm_it->m_Flags.assign((u8)F.r_u32()); for (int ch=0; ch<ctMaxChannel; ch++){ bm_it->envs[ch] = xr_new<CEnvelope> (); bm_it->envs[ch]->Load_1(F); } } }else{ if (vers!=EOBJ_SMOTION_VERSION) return false; m_Flags.assign (F.r_u8()); m_BoneOrPart= F.r_u16(); fSpeed = F.r_float(); fAccrue = F.r_float(); fFalloff = F.r_float(); fPower = F.r_float(); bone_mots.resize(F.r_u16()); string64 buf; for(BoneMotionIt bm_it=bone_mots.begin(); bm_it!=bone_mots.end(); bm_it++){ F.r_stringZ (buf,sizeof(buf)); bm_it->SetName (buf); bm_it->m_Flags.assign(F.r_u8()); for (int ch=0; ch<ctMaxChannel; ch++){ bm_it->envs[ch] = xr_new<CEnvelope> (); bm_it->envs[ch]->Load_2(F); } } } } for(BoneMotionIt bm_it=bone_mots.begin(); bm_it!=bone_mots.end(); bm_it++) xr_strlwr (bm_it->name); return true; }
bool CEditableMesh::LoadMesh(IReader& F){ u32 version=0; R_ASSERT(F.r_chunk(EMESH_CHUNK_VERSION,&version)); if (version!=EMESH_CURRENT_VERSION){ ELog.DlgMsg( mtError, "CEditableMesh: unsuported file version. Mesh can't load."); return false; } R_ASSERT(F.find_chunk(EMESH_CHUNK_MESHNAME)); F.r_stringZ (m_Name); R_ASSERT(F.r_chunk(EMESH_CHUNK_BBOX,&m_Box)); R_ASSERT(F.r_chunk(EMESH_CHUNK_FLAGS,&m_Flags)); F.r_chunk(EMESH_CHUNK_BOP,&m_Ops); R_ASSERT(F.find_chunk(EMESH_CHUNK_VERTS)); m_VertCount = F.r_u32(); if (m_VertCount<3){ Log ("!CEditableMesh: Vertices<3."); return false; } m_Verts = xr_alloc<Fvector>(m_VertCount); F.r (m_Verts, m_VertCount*sizeof(Fvector)); R_ASSERT(F.find_chunk(EMESH_CHUNK_FACES)); m_FaceCount = F.r_u32(); m_Faces = xr_alloc<st_Face>(m_FaceCount); if (m_FaceCount==0){ Log ("!CEditableMesh: Faces==0."); return false; } F.r (m_Faces, m_FaceCount*sizeof(st_Face)); m_SGs = xr_alloc<u32>(m_FaceCount); Memory.mem_fill32 (m_SGs,m_Flags.is(flSGMask)?0:u32(-1),m_FaceCount); u32 sg_chunk_size = F.find_chunk(EMESH_CHUNK_SG); if (sg_chunk_size){ VERIFY (m_FaceCount*sizeof(u32)==sg_chunk_size); F.r (m_SGs, m_FaceCount*sizeof(u32)); } R_ASSERT(F.find_chunk(EMESH_CHUNK_VMREFS)); m_VMRefs.resize (F.r_u32()); int sz_vmpt = sizeof(st_VMapPt); for (VMRefsIt r_it=m_VMRefs.begin(); r_it!=m_VMRefs.end(); r_it++){ r_it->count = F.r_u8(); r_it->pts = xr_alloc<st_VMapPt>(r_it->count); F.r (r_it->pts, sz_vmpt*r_it->count); } R_ASSERT(F.find_chunk(EMESH_CHUNK_SFACE)); string128 surf_name; u32 sface_cnt = F.r_u16(); // surface-face count for (u32 sp_i=0; sp_i<sface_cnt; sp_i++){ F.r_stringZ (surf_name,sizeof(surf_name)); int surf_id; CSurface* surf = m_Parent->FindSurfaceByName(surf_name, &surf_id); VERIFY(surf); IntVec& face_lst = m_SurfFaces[surf]; face_lst.resize (F.r_u32()); if (face_lst.empty()){ Log ("!Empty surface found: %s",surf->_Name()); return false; } F.r (&*face_lst.begin(), face_lst.size()*sizeof(int)); std::sort (face_lst.begin(),face_lst.end()); } if(F.find_chunk(EMESH_CHUNK_VMAPS_2)){ m_VMaps.resize (F.r_u32()); for (VMapIt vm_it=m_VMaps.begin(); vm_it!=m_VMaps.end(); vm_it++){ *vm_it = xr_new<st_VMap>(); F.r_stringZ ((*vm_it)->name); (*vm_it)->dim = F.r_u8(); (*vm_it)->polymap=F.r_u8(); (*vm_it)->type = F.r_u8(); (*vm_it)->resize(F.r_u32()); F.r ((*vm_it)->getVMdata(), (*vm_it)->VMdatasize()); F.r ((*vm_it)->getVIdata(), (*vm_it)->VIdatasize()); if ((*vm_it)->polymap) F.r ((*vm_it)->getPIdata(), (*vm_it)->PIdatasize()); } }else{ if(F.find_chunk(EMESH_CHUNK_VMAPS_1)){ m_VMaps.resize (F.r_u32()); for (VMapIt vm_it=m_VMaps.begin(); vm_it!=m_VMaps.end(); vm_it++){ *vm_it = xr_new<st_VMap>(); F.r_stringZ ((*vm_it)->name); (*vm_it)->dim = F.r_u8(); (*vm_it)->type = F.r_u8(); (*vm_it)->resize(F.r_u32()); F.r ((*vm_it)->getVMdata(), (*vm_it)->VMdatasize() ); } }else{ R_ASSERT(F.find_chunk(EMESH_CHUNK_VMAPS_0)); m_VMaps.resize (F.r_u32()); for (VMapIt vm_it=m_VMaps.begin(); vm_it!=m_VMaps.end(); vm_it++){ *vm_it = xr_new<st_VMap>(); F.r_stringZ ((*vm_it)->name); (*vm_it)->dim = 2; (*vm_it)->type = vmtUV; (*vm_it)->resize(F.r_u32()); F.r ((*vm_it)->getVMdata(), (*vm_it)->VMdatasize() ); } } // update vmaps RebuildVMaps(); } #ifdef _EDITOR if (!EPrefs->object_flags.is(epoDeffLoadRB)){ GenerateFNormals (); GenerateAdjacency (); GenerateVNormals (); GenerateRenderBuffers(); UnloadFNormals (); UnloadAdjacency (); UnloadVNormals (); } if (!EPrefs->object_flags.is(epoDeffLoadCF)) GenerateCFModel(); #endif Optimize(false); RebuildVMaps(); return true; }
void xrLoad(LPCSTR name, bool draft_mode) { FS.get_path ("$level$")->_set ((LPSTR)name); string256 N; if (!draft_mode) { // shaders string_path N; FS.update_path (N,"$game_data$","shaders_xrlc.xr"); g_shaders_xrlc = xr_new<Shader_xrLC_LIB> (); g_shaders_xrlc->Load (N); // Load CFORM { strconcat (sizeof(N),N,name,"build.cform"); IReader* fs = FS.r_open(N); R_ASSERT (fs->find_chunk(0)); hdrCFORM H; fs->r (&H,sizeof(hdrCFORM)); R_ASSERT (CFORM_CURRENT_VERSION==H.version); Fvector* verts = (Fvector*)fs->pointer(); CDB::TRI* tris = (CDB::TRI*)(verts+H.vertcount); Level.build ( verts, H.vertcount, tris, H.facecount ); Level.syncronize (); Msg("* Level CFORM: %dK",Level.memory()/1024); g_rc_faces.resize (H.facecount); R_ASSERT(fs->find_chunk(1)); fs->r (&*g_rc_faces.begin(),g_rc_faces.size()*sizeof(b_rc_face)); LevelBB.set (H.aabb); FS.r_close (fs); } // Load level data { strconcat (sizeof(N),N,name,"build.prj"); IReader* fs = FS.r_open (N); IReader* F; // Version u32 version; fs->r_chunk (EB_Version,&version); R_ASSERT (XRCL_CURRENT_VERSION >= 17); R_ASSERT (XRCL_CURRENT_VERSION <= 18); // Header b_params Params; fs->r_chunk (EB_Parameters,&Params); // Load level data transfer("materials", g_materials, *fs, EB_Materials); transfer("shaders_xrlc",g_shader_compile, *fs, EB_Shaders_Compile); // process textures Status ("Processing textures..."); { Surface_Init (); F = fs->open_chunk (EB_Textures); u32 tex_count = F->length()/sizeof(b_texture); for (u32 t=0; t<tex_count; t++) { Progress (float(t)/float(tex_count)); b_texture TEX; F->r (&TEX,sizeof(TEX)); b_BuildTexture BT; CopyMemory (&BT,&TEX,sizeof(TEX)); // load thumbnail string128 &N = BT.name; LPSTR extension = strext(N); if (extension) *extension = 0; xr_strlwr (N); if (0==xr_strcmp(N,"level_lods")) { // HACK for merged lod textures BT.dwWidth = 1024; BT.dwHeight = 1024; BT.bHasAlpha= TRUE; BT.pSurface = 0; } else { xr_strcat (N,".thm"); IReader* THM = FS.r_open("$game_textures$",N); // if (!THM) continue; R_ASSERT2 (THM, N); // version u32 version = 0; R_ASSERT (THM->r_chunk(THM_CHUNK_VERSION,&version)); // if( version!=THM_CURRENT_VERSION ) FATAL ("Unsupported version of THM file."); // analyze thumbnail information R_ASSERT(THM->find_chunk(THM_CHUNK_TEXTUREPARAM)); THM->r (&BT.THM.fmt,sizeof(STextureParams::ETFormat)); BT.THM.flags.assign (THM->r_u32()); BT.THM.border_color = THM->r_u32(); BT.THM.fade_color = THM->r_u32(); BT.THM.fade_amount = THM->r_u32(); BT.THM.mip_filter = THM->r_u32(); BT.THM.width = THM->r_u32(); BT.THM.height = THM->r_u32(); BOOL bLOD=FALSE; if (N[0]=='l' && N[1]=='o' && N[2]=='d' && N[3]=='\\') bLOD = TRUE; // load surface if it has an alpha channel or has "implicit lighting" flag BT.dwWidth = BT.THM.width; BT.dwHeight = BT.THM.height; BT.bHasAlpha = BT.THM.HasAlphaChannel(); BT.pSurface = 0; if (!bLOD) { if (BT.bHasAlpha || BT.THM.flags.test(STextureParams::flImplicitLighted)) { clMsg ("- loading: %s",N); u32 w=0, h=0; BT.pSurface = Surface_Load(N,w,h); R_ASSERT2 (BT.pSurface,"Can't load surface"); if ((w != BT.dwWidth) || (h != BT.dwHeight)) Msg ("! THM doesn't correspond to the texture: %dx%d -> %dx%d", BT.dwWidth, BT.dwHeight, w, h); BT.Vflip (); } else { // Free surface memory } } } // save all the stuff we've created g_textures.push_back (BT); } } } } // // Load emitters // { // strconcat (N,name,"level.game"); // IReader *F = FS.r_open(N); // IReader *O = 0; // if (0!=(O = F->open_chunk (AIPOINT_CHUNK))) { // for (int id=0; O->find_chunk(id); id++) { // Emitters.push_back(Fvector()); // O->r_fvector3 (Emitters.back()); // } // O->close(); // } // } // // Load lights { strconcat (sizeof(N),N,name,"build.prj"); IReader* F = FS.r_open(N); R_ASSERT2 (F,"There is no file 'build.prj'!"); IReader &fs= *F; // Version u32 version; fs.r_chunk (EB_Version,&version); R_ASSERT (XRCL_CURRENT_VERSION >= 17); R_ASSERT (XRCL_CURRENT_VERSION <= 18); // Header b_params Params; fs.r_chunk (EB_Parameters,&Params); // Lights (Static) { F = fs.open_chunk(EB_Light_static); b_light_static temp; u32 cnt = F->length()/sizeof(temp); for (u32 i=0; i<cnt; i++) { R_Light RL; F->r (&temp,sizeof(temp)); Flight& L = temp.data; if (_abs(L.range) > 10000.f) { Msg ("! BAD light range : %f",L.range); L.range = L.range > 0.f ? 10000.f : -10000.f; } // type if (L.type == D3DLIGHT_DIRECTIONAL) RL.type = LT_DIRECT; else RL.type = LT_POINT; // generic properties RL.position.set (L.position); RL.direction.normalize_safe (L.direction); RL.range = L.range*1.1f; RL.range2 = RL.range*RL.range; RL.attenuation0 = L.attenuation0; RL.attenuation1 = L.attenuation1; RL.attenuation2 = L.attenuation2; RL.amount = L.diffuse.magnitude_rgb (); RL.tri[0].set (0,0,0); RL.tri[1].set (0,0,0); RL.tri[2].set (0,0,0); // place into layer if (0==temp.controller_ID) g_lights.push_back (RL); } F->close (); } } // Init params // g_params.Init (); // Load initial map from the Level Editor { string_path file_name; strconcat (sizeof(file_name),file_name,name,"build.aimap"); IReader *F = FS.r_open(file_name); R_ASSERT2 (F, file_name); R_ASSERT (F->open_chunk(E_AIMAP_CHUNK_VERSION)); R_ASSERT (F->r_u16() == E_AIMAP_VERSION); R_ASSERT (F->open_chunk(E_AIMAP_CHUNK_BOX)); F->r (&LevelBB,sizeof(LevelBB)); R_ASSERT (F->open_chunk(E_AIMAP_CHUNK_PARAMS)); F->r (&g_params,sizeof(g_params)); R_ASSERT (F->open_chunk(E_AIMAP_CHUNK_NODES)); u32 N = F->r_u32(); R_ASSERT2 (N < ((u32(1) << u32(MAX_NODE_BIT_COUNT)) - 2),"Too many nodes!"); g_nodes.resize (N); hdrNODES H; H.version = XRAI_CURRENT_VERSION; H.count = N+1; H.size = g_params.fPatchSize; H.size_y = 1.f; H.aabb = LevelBB; typedef BYTE NodeLink[3]; for (u32 i=0; i<N; i++) { NodeLink id; u16 pl; SNodePositionOld _np; NodePosition np; for (int j=0; j<4; ++j) { F->r (&id,3); g_nodes[i].n[j] = (*LPDWORD(&id)) & 0x00ffffff; } pl = F->r_u16(); pvDecompress (g_nodes[i].Plane.n,pl); F->r (&_np,sizeof(_np)); CNodePositionConverter(_np,H,np); g_nodes[i].Pos = vertex_position(np,LevelBB,g_params); g_nodes[i].Plane.build(g_nodes[i].Pos,g_nodes[i].Plane.n); } F->close (); if (!strstr(Core.Params,"-keep_temp_files")) DeleteFile (file_name); } }
void game_sv_GameState::Create (shared_str &options) { string_path fn_game; m_item_respawner.clear_respawns(); if (FS.exist(fn_game, "$level$", "level.game")) { IReader *F = FS.r_open (fn_game); IReader *O = 0; // Load RPoints if (0!=(O = F->open_chunk (RPOINT_CHUNK))) { for (int id=0; O->find_chunk(id); ++id) { RPoint R; u8 team; u8 type; u16 GameType; shared_str rp_profile; O->r_fvector3 (R.P); O->r_fvector3 (R.A); team = O->r_u8 (); type = O->r_u8 (); GameType = O->r_u16 (); if(type==rptItemSpawn) O->r_stringZ (rp_profile); if (GameType != EGameIDs(u16(-1))) { if ((Type() == eGameIDCaptureTheArtefact) && (GameType & eGameIDCaptureTheArtefact)) { team = team - 1; R_ASSERT2( ((team >= 0) && (team < 4)) || (type != rptActorSpawn), "Problem with CTA Team indexes. Propably you have added rpoint of team 0 for cta game type."); } if ((!(GameType & eGameIDDeathmatch) && (Type() == eGameIDDeathmatch)) || (!(GameType & eGameIDTeamDeathmatch) && (Type() == eGameIDTeamDeathmatch)) || (!(GameType & eGameIDArtefactHunt) && (Type() == eGameIDArtefactHunt)) || (!(GameType & eGameIDCaptureTheArtefact) && (Type() == eGameIDCaptureTheArtefact)) ) { continue; }; }; switch (type) { case rptActorSpawn: { rpoints[team].push_back (R); for (int i=0; i<int(rpoints[team].size())-1; i++) { RPoint rp = rpoints[team][i]; float dist = R.P.distance_to_xz(rp.P)/2; if (dist<rpoints_MinDist[team]) rpoints_MinDist[team] = dist; dist = R.P.distance_to(rp.P)/2; if (dist<rpoints_Dist[team]) rpoints_Dist[team] = dist; }; }break; case rptItemSpawn: { m_item_respawner.add_new_rpoint(rp_profile, R); } }; }; O->close(); } FS.r_close (F); } if (!g_dedicated_server) { // loading scripts ai().script_engine().remove_script_process(ScriptEngine::eScriptProcessorGame); string_path S; FS.update_path (S,"$game_config$","script.ltx"); CInifile *l_tpIniFile = xr_new<CInifile>(S); R_ASSERT (l_tpIniFile); if( l_tpIniFile->section_exist( type_name() ) ) if (l_tpIniFile->r_string(type_name(),"script")) ai().script_engine().add_script_process(ScriptEngine::eScriptProcessorGame,xr_new<CScriptProcess>("game",l_tpIniFile->r_string(type_name(),"script"))); else ai().script_engine().add_script_process(ScriptEngine::eScriptProcessorGame,xr_new<CScriptProcess>("game","")); xr_delete (l_tpIniFile); } //--------------------------------------------------------------------- ConsoleCommands_Create(); //--------------------------------------------------------------------- // CCC_LoadCFG_custom* pTmp = xr_new<CCC_LoadCFG_custom>("sv_"); // pTmp->Execute (Console->ConfigFile); // xr_delete (pTmp); //--------------------------------------------------------------------- LPCSTR svcfg_ltx_name = "-svcfg "; if (strstr(Core.Params, svcfg_ltx_name)) { string_path svcfg_name = ""; int sz = xr_strlen(svcfg_ltx_name); sscanf (strstr(Core.Params,svcfg_ltx_name)+sz,"%[^ ] ",svcfg_name); // if (FS.exist(svcfg_name)) { Console->ExecuteScript(svcfg_name); } }; //--------------------------------------------------------------------- ReadOptions(options); }
//----------------------------------------------------------------------- BOOL motions_value::load (LPCSTR N, IReader *data, vecBones* bones) { m_id = N; bool bRes = true; // Load definitions U16Vec rm_bones (bones->size(),BI_NONE); IReader* MP = data->open_chunk(OGF_S_SMPARAMS); if (MP) { u16 vers = MP->r_u16(); u16 part_bone_cnt = 0; string128 buf; R_ASSERT3 (vers<=xrOGF_SMParamsVersion,"Invalid OGF/OMF version:",N); // partitions u16 part_count; part_count = MP->r_u16(); for (u16 part_i=0; part_i<part_count; part_i++) { CPartDef& PART = m_partition[part_i]; MP->r_stringZ (buf,sizeof(buf)); PART.Name = _strlwr(buf); PART.bones.resize (MP->r_u16()); for (xr_vector<u32>::iterator b_it=PART.bones.begin(); b_it<PART.bones.end(); b_it++) { MP->r_stringZ (buf,sizeof(buf)); u16 m_idx = u16 (MP->r_u32()); *b_it = find_bone_id (bones,buf); #ifdef _EDITOR if (*b_it==BI_NONE ) { bRes = false; Msg ("! Can't find bone: '%s'", buf); } if (rm_bones.size() <= m_idx) { bRes = false; Msg ("! Can't load: '%s' invalid bones count", N); } #else VERIFY3 (*b_it!=BI_NONE,"Can't find bone:", buf); #endif if (bRes) rm_bones[m_idx] = u16(*b_it); } part_bone_cnt = u16(part_bone_cnt + (u16)PART.bones.size()); } #ifdef _EDITOR if (part_bone_cnt!=(u16)bones->size()){ bRes = false; Msg("! Different bone count[%s] [Object: '%d' <-> Motions: '%d']", N, bones->size(),part_bone_cnt); } #else VERIFY3(part_bone_cnt==(u16)bones->size(),"Different bone count '%s'",N); #endif if (bRes) { // motion defs (cycle&fx) u16 mot_count = MP->r_u16(); m_mdefs.resize (mot_count); for (u16 mot_i=0; mot_i<mot_count; mot_i++) { MP->r_stringZ (buf,sizeof(buf)); shared_str nm = _strlwr (buf); u32 dwFlags = MP->r_u32 (); CMotionDef& D = m_mdefs[mot_i]; D.Load (MP,dwFlags,vers); //. m_mdefs.push_back (D); if (dwFlags&esmFX) m_fx.insert (mk_pair(nm,mot_i)); else m_cycle.insert (mk_pair(nm,mot_i)); m_motion_map.insert (mk_pair(nm,mot_i)); } } MP->close(); }else { xrDebug::Fatal (DEBUG_INFO,"Old skinned model version unsupported! (%s)",N); } if (!bRes) return false; // Load animation IReader* MS = data->open_chunk(OGF_S_MOTIONS); if (!MS) return false; u32 dwCNT = 0; MS->r_chunk_safe (0,&dwCNT,sizeof(dwCNT)); VERIFY (dwCNT<0x3FFF); // MotionID 2 bit - slot, 14 bit - motion index // set per bone motion size for (u32 i=0; i<bones->size(); i++) m_motions[bones->at(i)->name].resize(dwCNT); // load motions for (u16 m_idx=0; m_idx<(u16)dwCNT; m_idx++){ string128 mname; R_ASSERT (MS->find_chunk(m_idx+1)); MS->r_stringZ (mname,sizeof(mname)); #ifdef _DEBUG // sanity check xr_strlwr (mname); accel_map::iterator I= m_motion_map.find(mname); VERIFY3 (I!=m_motion_map.end(),"Can't find motion:",mname); VERIFY3 (I->second==m_idx,"Invalid motion index:",mname); #endif u32 dwLen = MS->r_u32(); for (u32 i=0; i<bones->size(); i++){ u16 bone_id = rm_bones[i]; VERIFY2 (bone_id!=BI_NONE,"Invalid remap index."); CMotion& M = m_motions[bones->at(bone_id)->name][m_idx]; M.set_count (dwLen); M.set_flags (MS->r_u8()); if (M.test_flag(flRKeyAbsent)) { CKeyQR* r = (CKeyQR*)MS->pointer(); u32 crc_q = crc32(r,sizeof(CKeyQR)); M._keysR.create (crc_q,1,r); MS->advance (1 * sizeof(CKeyQR)); }else{ u32 crc_q = MS->r_u32 (); M._keysR.create (crc_q,dwLen,(CKeyQR*)MS->pointer()); MS->advance (dwLen * sizeof(CKeyQR)); } if (M.test_flag(flTKeyPresent)) { u32 crc_t = MS->r_u32 (); if(M.test_flag(flTKey16IsBit)) { M._keysT16.create (crc_t,dwLen,(CKeyQT16*)MS->pointer()); MS->advance (dwLen * sizeof(CKeyQT16)); }else { M._keysT8.create (crc_t,dwLen,(CKeyQT8*)MS->pointer()); MS->advance (dwLen * sizeof(CKeyQT8)); }; MS->r_fvector3 (M._sizeT); MS->r_fvector3 (M._initT); }else { MS->r_fvector3 (M._initT); } } } // Msg("Motions %d/%d %4d/%4d/%d, %s",p_cnt,m_cnt, m_load,m_total,m_r,N); MS->close(); return bRes; }