#include "MLRHeaders.hpp" #include "MLRMovieTexture.hpp" MLRTexturePool *MLRTexturePool::Instance; MLRTexturePool::ClassData* MLRTexturePool::DefaultData = NULL; DECLARE_TIMER(static, Texture_Loading); //############################################################################# //############################ MLRTexture ############################### //############################################################################# //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLRTexturePool::InitializeClass() { Verify(!DefaultData); Verify(gos_GetCurrentHeap() == StaticHeap); DefaultData = new ClassData( MLRTexturePoolClassID, "MidLevelRenderer::MLRTexturePool", RegisteredClass::DefaultData ); Register_Object(DefaultData); Initialize_Timer(Texture_Loading, "Texture Loading"); MLRTexturePool::Instance = NULL; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLRTexturePool::TerminateClass() { if (MLRTexturePool::Instance) { Unregister_Object(MLRTexturePool::Instance); delete MLRTexturePool::Instance; MLRTexturePool::Instance = NULL; } Unregister_Object(DefaultData); delete DefaultData; DefaultData = NULL; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLRTexturePool::MLRTexturePool(MemoryStream *stream): RegisteredClass(DefaultData), unloadedTextures(NULL) { Verify(gos_GetCurrentHeap() == TexturePoolHeap); theSkinner = NULL; STOP(("Not implemented")); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLRTexturePool::MLRTexturePool(GOSImagePool *image_pool, int insDep): RegisteredClass(DefaultData), unloadedTextures(NULL) { Check_Object(image_pool); Verify(gos_GetCurrentHeap() == TexturePoolHeap); instanceDepth = insDep; instanceMax = 1<textureNameHashValue == textureNameHashValue ) { yo = 1; } } if(yo == false) { continue; } for(j=first;jinstance == instance) { return textureArray[j]; } } for(j=first;jtextureNameHashValue == textureNameHashValue ) { return textureArray[j]; } } } int newHandle; gos_PushCurrentHeap(TexturePoolHeap); if(firstFreeHandle < lastFreeHandle) { newHandle = (freeHandle[firstFreeHandle&(handleMax-1)])<GetName(); int i, j, textureNameHashValue = textureName.GetHashValue(); for(i=0;itextureNameHashValue == textureNameHashValue ) { Verify(image == textureArray[j]->GetImage()); return textureArray[j]; // STOP(("Image allready in texture pool !")); } } } int newHandle; gos_PushCurrentHeap(TexturePoolHeap); if(firstFreeHandle < lastFreeHandle) { newHandle = (freeHandle[firstFreeHandle&(handleMax-1)])<GetImage(imageName, format, size, hints) ); } return Add(imagePool->GetImage((*theSkinner)(imageName), format, size, hints) ); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLRTexturePool::Remove(MLRTexture *tex) { textureArray[tex->textureHandle-1] = NULL; storedTextures--; #if defined(TEXTURE_HUNT) && defined(LAB_ONLY) SPEWALWAYS(("micgaert", "Texture \"%s\" removed: 0x%x", (const char *)tex->textureName, tex->textureHandle)); #endif int i, first = (tex->textureHandle-1) & ~(instanceMax-1); for(i=first;i= first+instanceMax) { if(tex->image!=NULL) { imagePool->RemoveImage(tex->image); tex->image = NULL; } freeHandle[lastFreeHandle&(handleMax-1)] = (tex->textureHandle-1) >> instanceDepth; lastFreeHandle++; } tex->textureHandle = 0; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // MLRTexture* MLRTexturePool::operator()(const char *tn, int instance) { Check_Object(this); MString textureName = tn; int i, j, textureNameHashValue = textureName.GetHashValue(); for(i=0;itextureNameHashValue == textureNameHashValue ) { if (textureArray[j]->instance == instance ) { return textureArray[j]; } } else { break; } } } } #if defined(TEXTURE_HUNT) && defined(LAB_ONLY) SPEWALWAYS(("micgaert", "Couldnt find Texture \"%s\"", tn)); #endif return NULL; } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // void MLRTexturePool::LoadImageGOS(MLRTexture *texture) { Check_Object(texture); texture->LoadImageGOS(imagePool); } //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // unsigned MLRTexturePool::LoadImages() { Check_Object(imagePool); gos_PushCurrentHeap(TexturePoolHeap); ChainIteratorOf textures(&unloadedTextures); MLRTexture *texture; while ((texture = textures.GetCurrent()) != NULL) { Check_Object(texture); LoadImageGOS(texture); textures.Remove(); } gos_PopCurrentHeap(); // // End timing function // return lastHandle; }