123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471 |
- //===========================================================================//
- // Copyright (C) Microsoft Corporation. All rights reserved. //
- //===========================================================================//
- #include "MLRHeaders.hpp"
- MLRTexturePool *MLRTexturePool::Instance;
- MLRTexturePool::ClassData*
- MLRTexturePool::DefaultData = NULL;
- //#############################################################################
- //############################ MLRTexture ###############################
- //#############################################################################
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLRTexturePool::InitializeClass()
- {
- Verify(!DefaultData);
- Verify(gos_GetCurrentHeap() == StaticHeap);
- DefaultData =
- new ClassData(
- MLRTexturePoolClassID,
- "MidLevelRenderer::MLRTexturePool",
- RegisteredClass::DefaultData
- );
- Register_Object(DefaultData);
- MLRTexturePool::Instance = NULL;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLRTexturePool::TerminateClass()
- {
- if (MLRTexturePool::Instance)
- {
- Unregister_Object(MLRTexturePool::Instance);
- delete MLRTexturePool::Instance;
- }
- Unregister_Object(DefaultData);
- delete DefaultData;
- DefaultData = NULL;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRTexturePool::MLRTexturePool(MemoryStream *stream):
- RegisteredClass(DefaultData)
- {
- Verify(gos_GetCurrentHeap() == Heap);
- unLoadedImages = false;
- STOP(("Not implemented"));
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void MLRTexturePool::Stop (void)
- {
- Verify(gos_GetCurrentHeap() == Heap);
- int i;
- for(i=0;i<MLRState::TextureMask;i++)
- {
- if(textureArray[i] != NULL)
- {
- Unregister_Object(textureArray[i]);
- delete textureArray[i];
- textureArray[i] = NULL;
- }
- }
- Unregister_Pointer(freeHandle);
- delete [] freeHandle;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void MLRTexturePool::Restart (void)
- {
- Verify(gos_GetCurrentHeap() == Heap);
- freeHandle = new int [handleMax];
- Register_Pointer(freeHandle);
- lastHandle = 0;
- firstFreeHandle = 0;
- lastFreeHandle = 0;
- storedTextures = 0;
- for(int i=0;i<MLRState::TextureMask+1;i++)
- {
- textureArray[i] = NULL;
- }
- unLoadedImages = false;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRTexturePool::MLRTexturePool(GOSImagePool *image_pool, int insDep):
- RegisteredClass(DefaultData)
- {
- Check_Object(image_pool);
- Verify(gos_GetCurrentHeap() == Heap);
- instanceDepth = insDep;
- instanceMax = 1<<insDep;
- handleDepth = MLRState::TextureNumberBits - insDep;
- handleMax = 1<<handleDepth;
- freeHandle = new int [handleMax];
- Register_Pointer(freeHandle);
- lastHandle = 0;
- firstFreeHandle = 0;
- lastFreeHandle = 0;
- storedTextures = 0;
- imagePool = image_pool;
- for(int i=0;i<MLRState::TextureMask+1;i++)
- {
- textureArray[i] = NULL;
- }
- unLoadedImages = false;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRTexturePool::~MLRTexturePool()
- {
- int i;
- for(i=0;i<MLRState::TextureMask;i++)
- {
- if(textureArray[i] != NULL)
- {
- Unregister_Object(textureArray[i]);
- delete textureArray[i];
- textureArray[i] = NULL;
- }
- }
- Unregister_Object(imagePool);
- delete imagePool;
- Unregister_Pointer(freeHandle);
- delete [] freeHandle;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRTexturePool*
- MLRTexturePool::Make(MemoryStream *stream)
- {
- Check_Object(stream);
- gos_PushCurrentHeap(Heap);
- MLRTexturePool *pool = new MLRTexturePool(stream);
- gos_PopCurrentHeap();
- return pool;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLRTexturePool::Save(MemoryStream *stream)
- {
- STOP(("Not implemented"));
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRTexture*
- MLRTexturePool::Add(const char *tn, int instance)
- {
- MString textureName(tn);
- int i, j, textureNameHashValue = textureName.GetHashValue();
- for(i=0;i<lastHandle;i++)
- {
- int first = i<<instanceDepth;
- bool yo = false;
- for(j=first;j<first+instanceMax;j++)
- {
- if( textureArray[j] &&
- textureArray[j]->textureNameHashValue == textureNameHashValue )
- {
- yo = 1;
- }
- }
- if(yo == false)
- {
- continue;
- }
- for(j=first;j<first+instanceMax;j++)
- {
- if( textureArray[j] &&
- textureArray[j]->instance == instance)
- {
- return textureArray[j];
- }
- }
- for(j=first;j<first+instanceMax;j++)
- {
- if(!textureArray[j])
- {
- gos_PushCurrentHeap(Heap);
- textureArray[j] =
- new MLRTexture(
- this,
- textureName,
- instance,
- j+1
- );
- Register_Object(textureArray[j]);
- gos_PopCurrentHeap();
- storedTextures++;
- unLoadedImages = true;
- return textureArray[j];
- }
- }
- STOP(("Asked for too much image instances !"));
- }
- int newHandle;
- gos_PushCurrentHeap(Heap);
- if(firstFreeHandle < lastFreeHandle)
- {
- newHandle = (freeHandle[firstFreeHandle&(handleMax-1)])<<instanceDepth;
- textureArray[newHandle] =
- new MLRTexture(
- this,
- textureName,
- instance,
- newHandle+1
- );
- storedTextures++;
- firstFreeHandle++;
- }
- else
- {
- Verify( ((lastHandle<<instanceDepth)+1) < MLRState::TextureMask );
- newHandle = lastHandle<<instanceDepth;
- textureArray[newHandle] =
- new MLRTexture(
- this,
- textureName,
- instance,
- newHandle+1
- );
-
- storedTextures++;
- lastHandle++;
- }
- Register_Object(textureArray[newHandle]);
- gos_PopCurrentHeap();
- unLoadedImages = true;
- return textureArray[newHandle];
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRTexture*
- MLRTexturePool::Add(GOSImage *image)
- {
- MString textureName;
- textureName = image->GetName();
- int i, j, textureNameHashValue = textureName.GetHashValue();
- for(i=0;i<lastHandle;i++)
- {
- int first = i<<instanceDepth;
- for(j=first;j<first+instanceMax;j++)
- {
- if( textureArray[j] &&
- textureArray[j]->textureNameHashValue == textureNameHashValue )
- {
- Verify(image == textureArray[j]->GetImage());
- return textureArray[j];
- // STOP(("Image allready in texture pool !"));
- }
- }
- }
- int newHandle;
- gos_PushCurrentHeap(Heap);
- if(firstFreeHandle < lastFreeHandle)
- {
- newHandle = (freeHandle[firstFreeHandle&(handleMax-1)])<<instanceDepth;
- textureArray[newHandle] =
- new MLRTexture(
- this,
- image,
- newHandle+1
- );
- storedTextures++;
- firstFreeHandle++;
- }
- else
- {
- Verify( ((lastHandle<<instanceDepth)+1) < MLRState::TextureMask );
- newHandle = lastHandle<<instanceDepth;
- textureArray[newHandle] =
- new MLRTexture(
- this,
- image,
- newHandle+1
- );
-
- storedTextures++;
- lastHandle++;
- }
- Register_Object(textureArray[newHandle]);
- gos_PopCurrentHeap();
- return textureArray[newHandle];
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- void
- MLRTexturePool::Remove(MLRTexture *tex)
- {
- textureArray[tex->textureHandle-1] = NULL;
- storedTextures--;
- int i, first = (tex->textureHandle-1) & ~(instanceMax-1);
- for(i=first;i<first+instanceMax;i++)
- {
- if(textureArray[i] != NULL)
- {
- break;
- }
- }
- if(i >= first+instanceMax)
- {
- imagePool->RemoveImage(tex->image);
- tex->image = NULL;
- freeHandle[lastFreeHandle&(handleMax-1)] = (tex->textureHandle-1) >> instanceDepth;
- lastFreeHandle++;
- }
- tex->textureHandle = 0;
- unLoadedImages = true;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- MLRTexture*
- MLRTexturePool::operator()(const char *tn, int instance)
- {
- Check_Object(this);
- MString textureName = tn;
- int i, j, textureNameHashValue = textureName.GetHashValue();
- for(i=0;i<lastHandle;i++)
- {
- int first = i<<instanceDepth;
- for(j=first;j<first+instanceMax;j++)
- {
- if( textureArray[j] )
- {
- if( textureArray[j]->textureNameHashValue == textureNameHashValue )
- {
- if (textureArray[j]->instance == instance )
- {
- return textureArray[j];
- }
- }
- else
- {
- break;
- }
- }
- }
- }
- return NULL;
- }
- //~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
- //
- unsigned
- MLRTexturePool::LoadImages()
- {
- Check_Object(imagePool);
- if(unLoadedImages == false)
- {
- return lastHandle;
- }
- //
- // Statistic timing function
- //
- for (unsigned i=0;i<MLRState::TextureMask+1;i++)
- {
- if(textureArray[i])
- {
- int hint;
- GOSImage *image = textureArray[i]->GetImage(&hint);
- if (image && !image->IsLoaded())
- {
- Check_Object(image);
- if (!imagePool->LoadImage(image, hint))
- {
- STOP(("Cannot load texture: %s!", textureArray[i]->textureName));
- }
- }
- }
- }
- //
- // End timing function
- //
- unLoadedImages = false;
- return lastHandle;
- }
|