⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 mlrtexturepool.cpp

📁 机甲指挥官2源代码
💻 CPP
字号:
//===========================================================================//
// 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;
}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -