int ETextureThumbnail::MemoryUsage() { int mem_usage = _Width()*_Height()*4; switch (m_TexParams.fmt){ case STextureParams::tfDXT1: case STextureParams::tfADXT1: mem_usage/=6; break; case STextureParams::tfDXT3: case STextureParams::tfDXT5: mem_usage/=4; break; case STextureParams::tf4444: case STextureParams::tf1555: case STextureParams::tf565: mem_usage/=2; break; case STextureParams::tfRGBA: break; } string_path fn; FS.update_path (fn,_game_textures_,EFS.ChangeFileExt(m_Name.c_str(),".seq").c_str()); if (FS.exist(fn)) { string128 buffer; IReader* F = FS.r_open(0,fn); F->r_string (buffer,sizeof(buffer)); int cnt = 0; while (!F->eof()){ F->r_string(buffer,sizeof(buffer)); cnt++; } FS.r_close (F); mem_usage *= cnt?cnt:1; } return mem_usage; }
u32 STextureParams::MemoryUsage(LPCSTR base_name) { u32 mem_usage = width*height*4; if (flags.test(flGenerateMipMaps)) { mem_usage*=3ul; mem_usage/=2ul; } switch (fmt){ case STextureParams::tfDXT1: case STextureParams::tfADXT1: mem_usage/=6; break; case STextureParams::tfDXT3: case STextureParams::tfDXT5: mem_usage/=4; break; case STextureParams::tf4444: case STextureParams::tf1555: case STextureParams::tf565: mem_usage/=2; break; case STextureParams::tfRGBA: break; } xr_string fn; FS.update_path (fn,_game_textures_,EFS.ChangeFileExt(base_name,".seq").c_str()); if (FS.exist(fn.c_str())){ string128 buffer; IReader* F = FS.r_open(0,fn.c_str()); F->r_string (buffer,sizeof(buffer)); int cnt = 0; while (!F->eof()){ F->r_string(buffer,sizeof(buffer)); cnt++; } FS.r_close (F); mem_usage *= cnt?cnt:1; } return mem_usage; }
void CCC_LoadCFG::Execute(LPCSTR args) { Msg("Executing config-script \"%s\"...", args); string_path cfg_name; xr_strcpy(cfg_name, args); if (strext(cfg_name)) *strext(cfg_name) = 0; xr_strcat(cfg_name, ".ltx"); string_path cfg_full_name; FS.update_path(cfg_full_name, "$app_data_root$", cfg_name); if (NULL == FS.exist(cfg_full_name)) FS.update_path(cfg_full_name, "$fs_root$", cfg_name); if (NULL == FS.exist(cfg_full_name)) xr_strcpy(cfg_full_name, cfg_name); IReader* F = FS.r_open(cfg_full_name); string1024 str; if (F != NULL) { while (!F->eof()) { F->r_string(str, sizeof(str)); if (allow(str)) Console->Execute(str); } FS.r_close(F); Msg("[%s] successfully loaded.", cfg_full_name); } else { Msg("! Cannot open script file [%s]", cfg_full_name); } }
void CKinematics::Load(const char* N, IReader *data, u32 dwFlags) { //Msg ("skeleton: %s",N); inherited::Load (N, data, dwFlags); pUserData = NULL; m_lod = NULL; // loading lods IReader* LD = data->open_chunk(OGF_S_LODS); if (LD) { string_path short_name; strcpy_s (short_name,sizeof(short_name),N); if (strext(short_name)) *strext(short_name)=0; // From stream { string_path lod_name; LD->r_string (lod_name, sizeof(lod_name)); //. strconcat (sizeof(name_load),name_load, short_name, ":lod:", lod_name.c_str()); m_lod = ::Render->model_CreateChild(lod_name, NULL); VERIFY3(m_lod,"Cant create LOD model for", N); //. VERIFY2 (m_lod->Type==MT_HIERRARHY || m_lod->Type==MT_PROGRESSIVE || m_lod->Type==MT_NORMAL,lod_name.c_str()); /* strconcat (name_load, short_name, ":lod:1"); m_lod = ::Render->model_CreateChild(name_load,LD); VERIFY (m_lod->Type==MT_SKELETON_GEOMDEF_PM || m_lod->Type==MT_SKELETON_GEOMDEF_ST); */ } LD->close (); } #ifndef _EDITOR // User data IReader* UD = data->open_chunk(OGF_S_USERDATA); pUserData = UD?xr_new<CInifile>(UD,FS.get_path("$game_config$")->m_Path):0; if (UD) UD->close(); #endif // Globals bone_map_N = xr_new<accel> (); bone_map_P = xr_new<accel> (); bones = xr_new<vecBones> (); bone_instances = NULL; // Load bones #pragma todo("container is created in stack!") xr_vector<shared_str> L_parents; R_ASSERT (data->find_chunk(OGF_S_BONE_NAMES)); visimask.zero (); int dwCount = data->r_u32(); // Msg ("!!! %d bones",dwCount); // if (dwCount >= 64) Msg ("!!! More than 64 bones is a crazy thing! (%d), %s",dwCount,N); VERIFY3 (dwCount < 64, "More than 64 bones is a crazy thing!",N); for (; dwCount; dwCount--) { string256 buf; // Bone u16 ID = u16(bones->size()); data->r_stringZ (buf,sizeof(buf)); strlwr(buf); CBoneData* pBone = CreateBoneData(ID); pBone->name = shared_str(buf); pBone->child_faces.resize (children.size()); bones->push_back (pBone); bone_map_N->push_back (mk_pair(pBone->name,ID)); bone_map_P->push_back (mk_pair(pBone->name,ID)); // It's parent data->r_stringZ (buf,sizeof(buf)); strlwr(buf); L_parents.push_back (buf); data->r (&pBone->obb,sizeof(Fobb)); visimask.set (u64(1)<<ID,TRUE); } std::sort (bone_map_N->begin(),bone_map_N->end(),pred_sort_N); std::sort (bone_map_P->begin(),bone_map_P->end(),pred_sort_P); // Attach bones to their parents iRoot = BI_NONE; for (u32 i=0; i<bones->size(); i++) { shared_str P = L_parents[i]; CBoneData* B = (*bones)[i]; if (!P||!P[0]) { // no parent - this is root bone R_ASSERT (BI_NONE==iRoot); iRoot = u16(i); B->SetParentID(BI_NONE); continue; } else { u16 ID = LL_BoneID(P); R_ASSERT (ID!=BI_NONE); (*bones)[ID]->children.push_back(B); B->SetParentID(ID); } } R_ASSERT (BI_NONE != iRoot); // Free parents L_parents.clear(); // IK data IReader* IKD = data->open_chunk(OGF_S_IKDATA); if (IKD){ for (u32 i=0; i<bones->size(); i++) { CBoneData* B = (*bones)[i]; u16 vers = (u16)IKD->r_u32(); IKD->r_stringZ (B->game_mtl_name); IKD->r (&B->shape,sizeof(SBoneShape)); B->IK_data.Import(*IKD,vers); Fvector vXYZ,vT; IKD->r_fvector3 (vXYZ); IKD->r_fvector3 (vT); B->bind_transform.setXYZi(vXYZ); B->bind_transform.translate_over(vT); B->mass = IKD->r_float(); IKD->r_fvector3 (B->center_of_mass); } // calculate model to bone converting matrix (*bones)[LL_GetBoneRoot()]->CalculateM2B(Fidentity); IKD->close(); } // after load process { for (u16 child_idx=0; child_idx<(u16)children.size(); child_idx++) LL_GetChild(child_idx)->AfterLoad (this,child_idx); } // unique bone faces { for (u32 bone_idx=0; bone_idx<bones->size(); bone_idx++) { CBoneData* B = (*bones)[bone_idx]; for (u32 child_idx=0; child_idx<children.size(); child_idx++){ CBoneData::FacesVec faces = B->child_faces[child_idx]; std::sort (faces.begin(),faces.end()); CBoneData::FacesVecIt new_end = std::unique(faces.begin(),faces.end()); faces.erase (new_end,faces.end()); B->child_faces[child_idx].clear_and_free(); B->child_faces[child_idx] = faces; } } } // reset update_callback Update_Callback = NULL; // reset update frame wm_frame = u32(-1); LL_Validate (); }