void UnloadTextures (void) { int i, bD1; CBitmap *bmP; #if TRACE console.printf (CON_VERBOSE, "Unloading textures\n"); #endif gameData.pig.tex.bPageFlushed++; TexMergeClose (); RLECacheFlush (); for (bD1 = 0; bD1 < 2; bD1++) { bitmapCacheNext [bD1] = 0; for (i = 0, bmP = gameData.pig.tex.bitmaps [bD1].Buffer (); i < gameData.pig.tex.nBitmaps [bD1]; i++, bmP++) { #if DBG if (i == nDbgTexture) nDbgTexture = nDbgTexture; #endif if (bitmapOffsets [bD1][i] > 0) { // only page out bitmaps read from disk bmP->AddFlags (BM_FLAG_PAGED_OUT); gameData.pig.tex.bitmaps [bD1][i].Unload (i, bD1); } } } for (i = 0; i < MAX_ADDON_BITMAP_FILES; i++) gameData.pig.tex.addonBitmaps [i].Unload (i, 0); }
int OglCacheLevelTextures (void) { int i, j, bD1; tEffectClip* ecP; int max_efx = 0, ef; int nSegment, nSide; short nBaseTex, nOvlTex; CBitmap* bmBot,* bmTop, * bmm; CSegment* segP; CSide* sideP; CObject* objP; CStaticArray< bool, MAX_POLYGON_MODELS > bModelLoaded; if (gameStates.render.bBriefing) return 0; PrintLog ("caching level textures\n"); TexMergeClose (); TexMergeInit (-1); PrintLog (" caching effect textures\n"); for (bD1 = 0; bD1 <= gameStates.app.bD1Data; bD1++) { for (i = 0, ecP = gameData.eff.effects [bD1].Buffer (); i < gameData.eff.nEffects [bD1]; i++, ecP++) { if ((ecP->changingWallTexture == -1) && (ecP->changingObjectTexture == -1)) continue; if (ecP->vClipInfo.nFrameCount > max_efx) max_efx = ecP->vClipInfo.nFrameCount; } for (ef = 0; ef < max_efx; ef++) for (i = 0, ecP = gameData.eff.effects [bD1].Buffer (); i < gameData.eff.nEffects [bD1]; i++, ecP++) { if ((ecP->changingWallTexture == -1) && (ecP->changingObjectTexture == -1)) continue; ecP->xTimeLeft = -1; } } PrintLog (" caching geometry textures\n"); bLoadTextures = (ogl.m_states.nPreloadTextures > 0); for (segP = SEGMENTS.Buffer (), nSegment = 0; nSegment < gameData.segs.nSegments; nSegment++, segP++) { for (nSide = 0, sideP = segP->m_sides; nSide < MAX_SIDES_PER_SEGMENT; nSide++, sideP++) { nBaseTex = sideP->m_nBaseTex; if ((nBaseTex < 0) || (nBaseTex >= gameData.pig.tex.nTextures [gameStates.app.bD1Data])) continue; #if DBG if ((nSegment == nDbgSeg) && ((nDbgSide < 0) || (nSide == nDbgSide))) nDbgSeg = nDbgSeg; #endif bmBot = LoadFaceBitmap (nBaseTex, sideP->m_nFrame, bLoadTextures); if ((nOvlTex = sideP->m_nOvlTex)) { bmTop = LoadFaceBitmap (nOvlTex, sideP->m_nFrame, bLoadTextures); bmTop->SetTranspType (3); if (gameOpts->ogl.bGlTexMerge) // || !(bmTop->Flags () & BM_FLAG_SUPER_TRANSPARENT)) bmTop->SetupTexture (1, bLoadTextures); else if ((bmm = TexMergeGetCachedBitmap (nBaseTex, nOvlTex, sideP->m_nOvlOrient))) bmBot = bmm; else bmTop->SetupTexture (1, bLoadTextures); } bmBot->SetTranspType (3); bmBot->SetupTexture (1, bLoadTextures); } } PrintLog (" caching addon textures\n"); CacheAddonTextures (); PrintLog (" caching model textures\n"); bLoadTextures = (ogl.m_states.nPreloadTextures > 1); bModelLoaded.Clear (); bVClipLoaded.Clear (); FORALL_OBJS (objP, i) { if (objP->info.renderType != RT_POLYOBJ) continue; if (bModelLoaded [objP->rType.polyObjInfo.nModel]) continue; bModelLoaded [objP->rType.polyObjInfo.nModel] = true; OglCachePolyModelTextures (objP->rType.polyObjInfo.nModel); } PrintLog (" caching hostage sprites\n"); bLoadTextures = (ogl.m_states.nPreloadTextures > 3); OglCacheVClipTextures (33, 3); PrintLog (" caching weapon sprites\n"); bLoadTextures = (ogl.m_states.nPreloadTextures > 5); for (i = 0; i < EXTRA_OBJ_IDS; i++) OglCacheWeaponTextures (gameData.weapons.info + i); PrintLog (" caching powerup sprites\n"); bLoadTextures = (ogl.m_states.nPreloadTextures > 4); for (i = 0; i < MAX_POWERUP_TYPES; i++) if (i != 9) OglCacheVClipTextures (gameData.objs.pwrUp.info [i].nClipIndex, 3); PrintLog (" caching effect textures\n"); CacheObjectEffects (); bLoadTextures = (ogl.m_states.nPreloadTextures > 2); for (i = 0; i < gameData.eff.nClips [0]; i++) OglCacheVClipTextures (i, 1); PrintLog (" caching cockpit textures\n"); for (i = 0; i < 2; i++) for (j = 0; j < MAX_GAUGE_BMS; j++) if (gameData.cockpit.gauges [i][j].index != 0xffff) LoadBitmap (gameData.cockpit.gauges [i][j].index, 0); ResetSpecialEffects (); InitSpecialEffects (); DoSpecialEffects (true); return 0; }