reman3/Rayman_X/cpa/tempgrp/GliGlou/MultiDRV/Src/TexArray.c

205 lines
7.9 KiB
C

/*
=======================================================================================
Name : TexArray.c
Author : Gliglou corporation
Description : manage array of texture data
=======================================================================================
*/
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
#include "PvObj_st.h"
#include "texture.h"
#include "TEX.h"
#include "DLLInter.h"
#include "TexArray.h"
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
/*
=======================================================================================
Globals
=======================================================================================
*/
/*
* memory
*/
extern unsigned long GLI_gsCurrentMemoryChannel;
/*
* array of texture / texture state
*/
GLI_tdstTexture * gs_aDEFTableOfTextureAlreadyRead [ GLI_C_lNBMaxOfTextures ];
long gs_aDEFTableOfTextureMemoryChannels[ GLI_C_lNBMaxOfTextures ];
unsigned long GLI_g_ulNumberOfLoadedTexture;
long gs_lNumberOfTextureToCreate;
/*
=======================================================================================
functions
=======================================================================================
*/
/*
----------------------------------------------------------------------------------------
Description : set all texture in given channel as unallocated
(called when memory block is freed )
----------------------------------------------------------------------------------------
*/
void GLI_fn_vUnallocTextureInChannel( unsigned char _ucChannel )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
long lTextureCounter;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
for (lTextureCounter=0;lTextureCounter<GLI_C_lNBMaxOfTextures;lTextureCounter++)
{
if (gs_aDEFTableOfTextureMemoryChannels[lTextureCounter] == (long)_ucChannel )
{
gs_aDEFTableOfTextureMemoryChannels[lTextureCounter] = GLI_TEXIsUnallocated;
gs_aDEFTableOfTextureAlreadyRead[lTextureCounter] = NULL;
}
}
}
/*
----------------------------------------------------------------------------------------
Description : set all texture as unallocated
----------------------------------------------------------------------------------------
*/
void GLI_fn_vUnallocAllTextures( void )
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
long lTextureCounter;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
for (lTextureCounter=0;lTextureCounter<GLI_C_lNBMaxOfTextures;lTextureCounter++)
{
gs_aDEFTableOfTextureMemoryChannels[lTextureCounter] = GLI_TEXIsUnallocated;
gs_aDEFTableOfTextureAlreadyRead[lTextureCounter] = NULL;
}
}
/*
----------------------------------------------------------------------------------------
Description : compute total of memory taken by texture allocated in array
----------------------------------------------------------------------------------------
*/
long GLI_lComputeTexturesSize()
{
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
long lTotalSize,lTextureCounter;
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
lTotalSize = 0;
for (lTextureCounter = 0 ; lTextureCounter < GLI_C_lNBMaxOfTextures ; lTextureCounter ++ )
{
if ((gs_aDEFTableOfTextureMemoryChannels[lTextureCounter] != GLI_TEXIsUnallocated) && (gs_aDEFTableOfTextureAlreadyRead[lTextureCounter] != NULL))
/*lTotalSize += GLI_lGetSizeOfTexture (gs_aDEFTableOfTextureAlreadyRead [lTextureCounter]);*/
lTotalSize += GLI_DRV_lGetTextureSize( gs_aDEFTableOfTextureAlreadyRead [lTextureCounter] );
}
return lTotalSize ;
}
/*
----------------------------------------------------------------------------------------
Description : Get larger texture
----------------------------------------------------------------------------------------
*/
long GLI_lGetBigestSizeOfTexture()
{
long lBigestSize,lSizeLocal;
long lTextureCounter;
for (lTextureCounter=0,lBigestSize = 0; lTextureCounter < GLI_C_lNBMaxOfTextures; lTextureCounter++)
{
if ( (gs_aDEFTableOfTextureMemoryChannels[lTextureCounter] != GLI_TEXIsUnallocated) && (gs_aDEFTableOfTextureAlreadyRead [lTextureCounter]) )
{
lSizeLocal = gs_aDEFTableOfTextureAlreadyRead [lTextureCounter] -> lRealHeight * gs_aDEFTableOfTextureAlreadyRead [lTextureCounter] -> lRealWidth * 6L;
/* Special for texture maa: they have double height */
if( gs_aDEFTableOfTextureAlreadyRead [lTextureCounter] -> lTextureCaps & GLI_C_lMAATexture )
lSizeLocal *= 2;
if (lBigestSize < lSizeLocal) lBigestSize = lSizeLocal;
}
}
return (lBigestSize);
}
/*
----------------------------------------------------------------------------------------
Description : uncompress textures
void ->
Returns (void )
----------------------------------------------------------------------------------------
*/
void GLI_vUnCompressExistantTexture(void)
{
long lTextureCounter ;
for (lTextureCounter =0 ; lTextureCounter < GLI_C_lNBMaxOfTextures ; lTextureCounter ++)
{
if ( (gs_aDEFTableOfTextureMemoryChannels[lTextureCounter] != GLI_TEXIsUnallocated) && (gs_aDEFTableOfTextureAlreadyRead[lTextureCounter] != NULL))
{
gs_aDEFTableOfTextureAlreadyRead [ lTextureCounter ] -> lHeight = gs_aDEFTableOfTextureAlreadyRead [ lTextureCounter ] -> lRealHeight ;
gs_aDEFTableOfTextureAlreadyRead [ lTextureCounter ] -> lWidth = gs_aDEFTableOfTextureAlreadyRead [ lTextureCounter ] -> lRealWidth ;
gs_aDEFTableOfTextureAlreadyRead [ lTextureCounter ] -> lCompressionCounter = 0;
}
}
}
/*
----------------------------------------------------------------------------------------
Description : look throught the table to know if a texture alreqdy exist
----------------------------------------------------------------------------------------
*/
GLI_tdstTexture *TEX_fnpst_DoesTextureExist( char *_szFileName )
{
long lTextureCounter;
GLI_tdstTexture *pst_Texture;
for (lTextureCounter =0 ; lTextureCounter < GLI_C_lNBMaxOfTextures; lTextureCounter ++)
{
if (gs_aDEFTableOfTextureMemoryChannels[ lTextureCounter ] != GLI_TEXIsUnallocated)
{
pst_Texture = gs_aDEFTableOfTextureAlreadyRead [lTextureCounter];
if (strcmp( pst_Texture->a255_cFileName, _szFileName ) == 0)
return pst_Texture;
}
}
return NULL;
};
/*
----------------------------------------------------------------------------------------
Description : add the picture name in the tree
----------------------------------------------------------------------------------------
*/
void TEX_fnv_MakeItExisting( GLI_tdstTexture *_pst_TextureCreated )
{
/* add texture in array */
gs_aDEFTableOfTextureAlreadyRead [ gs_lNumberOfTextureToCreate ] = _pst_TextureCreated;
gs_aDEFTableOfTextureMemoryChannels[ gs_lNumberOfTextureToCreate ] = GLI_gsCurrentMemoryChannel;
gs_lNumberOfTextureToCreate++;
while (
(gs_aDEFTableOfTextureMemoryChannels[gs_lNumberOfTextureToCreate] != GLI_TEXIsUnallocated) &&
(gs_lNumberOfTextureToCreate < GLI_C_lNBMaxOfTextures -1 )
)
gs_lNumberOfTextureToCreate++;
/* we are in the end of arrays, come back to beginning to fill hole */
if (gs_lNumberOfTextureToCreate == GLI_C_lNBMaxOfTextures -1 )
{
gs_lNumberOfTextureToCreate = 0;
while (
( gs_aDEFTableOfTextureMemoryChannels[gs_lNumberOfTextureToCreate] != GLI_TEXIsUnallocated) &&
( gs_lNumberOfTextureToCreate < GLI_C_lNBMaxOfTextures - 1 )
)
gs_lNumberOfTextureToCreate++;
}
}