228 lines
6.8 KiB
C
228 lines
6.8 KiB
C
/*
|
|
=======================================================================================
|
|
Name : TexName.c
|
|
Author : GLIGLOU corporation
|
|
Description : Fonction for texture name analysis / storage
|
|
=======================================================================================
|
|
*/
|
|
|
|
#define MTH_LOW
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
#include "PvObj_st.h"
|
|
#include "texture.h"
|
|
#include "TEX.h"
|
|
#include "dpt.h"
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Analyse name of texture
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : find on the name of texture if it cycling on X,Y or XY
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long TEX_fnl_GetCyclingTextNameKey( char *d_ucFileName, char **_ppc_BeforeAnalysed )
|
|
{
|
|
long lReturnValue = 0;
|
|
|
|
if ( *((*_ppc_BeforeAnalysed) - 2) == 't' )
|
|
{
|
|
if ( *((*_ppc_BeforeAnalysed) - 1) == 'x' )
|
|
{
|
|
lReturnValue = GLI_C_lCylingU;
|
|
*_ppc_BeforeAnalysed -= 2;
|
|
}
|
|
else if ( *((*_ppc_BeforeAnalysed) - 1) == 'y' )
|
|
{
|
|
lReturnValue = GLI_C_lCylingV;
|
|
*_ppc_BeforeAnalysed -= 2;
|
|
}
|
|
}
|
|
else if ( *((*_ppc_BeforeAnalysed) - 3) == 't' )
|
|
{
|
|
if ( strncmp( ((*_ppc_BeforeAnalysed) - 2), "xy", 2) == 0)
|
|
{
|
|
lReturnValue = GLI_C_lCylingUV;
|
|
*_ppc_BeforeAnalysed -= 3;
|
|
}
|
|
}
|
|
|
|
if (lReturnValue == 0)
|
|
{
|
|
if (strstr( d_ucFileName, "_txy") != NULL) lReturnValue = GLI_C_lCylingUV;
|
|
if (strstr( d_ucFileName, "_tx" ) != NULL) lReturnValue = GLI_C_lCylingU;
|
|
if (strstr( d_ucFileName, "_ty" ) != NULL) lReturnValue = GLI_C_lCylingV;
|
|
}
|
|
|
|
if (strstr( d_ucFileName, "_mxy" ) != NULL ) lReturnValue |= GLI_C_lMirrorUV;
|
|
if (strstr( d_ucFileName, "_mx" ) != NULL ) lReturnValue |= GLI_C_lMirrorV;
|
|
if (strstr( d_ucFileName, "_my" ) != NULL ) lReturnValue |= GLI_C_lMirrorU;
|
|
|
|
return lReturnValue;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : find a key in texture name. return 1 if Yes
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long TEX_fnl_GetTextureKey( char *_szFileName, char *_szKey )
|
|
{
|
|
return (strstr(_szFileName, _szKey) != NULL) ? 1 : 0;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : find "NZW" key in texture name. return 1 if Yes
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long TEX_fnl_NoZWriteTextNameKey( char *d_ucFileName, char **_ppc_BeforeAnalysed )
|
|
{
|
|
if (strncmp((*_ppc_BeforeAnalysed - 3),"_ad", 3) == 0)
|
|
{
|
|
*_ppc_BeforeAnalysed -= 3;
|
|
}
|
|
|
|
if (strncmp( (*_ppc_BeforeAnalysed - 3), "nzw", 3) == 0)
|
|
{
|
|
*_ppc_BeforeAnalysed -= 3;
|
|
return 1;
|
|
}
|
|
|
|
if (strstr(d_ucFileName,"_nzw") != NULL)
|
|
return 1;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Test if there's NZ code in texture name
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
ACP_tdxBool TEX_fnb_TestIfNonZero(char *d_ucFileName)
|
|
{
|
|
char *cRes;
|
|
|
|
cRes = strstr(d_ucFileName, "_nz" );
|
|
if (cRes == NULL)
|
|
return FALSE;
|
|
|
|
if ( cRes[3] != 'w' )
|
|
return TRUE;
|
|
|
|
if ( strstr( (cRes + 3), "_nz" ) == NULL)
|
|
return FALSE;
|
|
|
|
return TRUE;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Main function : analyse name and set some data
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_fn_lAnalyseTextureName( char *_szFileName, long *_p_lTextureCaps, unsigned char *_p_ucCyclingMode )
|
|
{
|
|
char *pc_BeforeAnalysed;
|
|
char *pc_ShortFileName;
|
|
|
|
/* swap dir names to analyse only texture name */
|
|
pc_ShortFileName = strrchr( _szFileName, '\\' );
|
|
if (pc_ShortFileName == NULL)
|
|
pc_ShortFileName = _szFileName;
|
|
else
|
|
pc_ShortFileName++;
|
|
|
|
/* search dos extension */
|
|
pc_BeforeAnalysed = strrchr( pc_ShortFileName, '.' );
|
|
if (pc_BeforeAnalysed == NULL)
|
|
return 0;
|
|
|
|
if (strcmp(pc_BeforeAnalysed + 1, "bmp" ) == 0)
|
|
*_p_lTextureCaps |= GLI_C_lBMPTexture;
|
|
else if (strcmp(pc_BeforeAnalysed + 1, "tga" ) == 0)
|
|
*_p_lTextureCaps |= GLI_C_lTGATexture;
|
|
else
|
|
return 0;
|
|
|
|
/* search nz key */
|
|
if ( strncmp(pc_BeforeAnalysed - 2, "nz", 2) == 0 )
|
|
{
|
|
pc_BeforeAnalysed -= 2;
|
|
*_p_lTextureCaps |= GLI_C_lNZTexture + GLI_C_lNZFilteredTexture;
|
|
}
|
|
else if ( TEX_fnb_TestIfNonZero( _szFileName ) )
|
|
{
|
|
*_p_lTextureCaps |= GLI_C_lNZTexture + GLI_C_lNZFilteredTexture;
|
|
}
|
|
|
|
*_p_ucCyclingMode = (unsigned char ) TEX_fnl_GetCyclingTextNameKey( pc_ShortFileName, &pc_BeforeAnalysed );
|
|
|
|
if ( TEX_fnl_GetTextureKey( pc_ShortFileName, "_ad" ) )
|
|
*_p_lTextureCaps |= GLI_C_lAddTransparencyTexture;
|
|
|
|
if ( TEX_fnl_GetTextureKey( pc_ShortFileName, "_aaa" ) )
|
|
*_p_lTextureCaps |= GLI_C_lAAATexture;
|
|
|
|
if ( TEX_fnl_GetTextureKey( pc_ShortFileName, "_maa" ) )
|
|
*_p_lTextureCaps |= GLI_C_lMAATexture;
|
|
|
|
if ( TEX_fnl_NoZWriteTextNameKey( pc_ShortFileName, &pc_BeforeAnalysed ) )
|
|
*_p_lTextureCaps |= GLI_C_lNoZBufferWriteTexture;
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Manage list of textures
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : harmonize texture name
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void TEX_fnv_FixTextureName(char *_pszOut, char *_pszIn)
|
|
{
|
|
/*remove the base path if it does not start from the game data's directory*/
|
|
char *pszGameDataPath = fn_szGetGameDataPath();
|
|
char *pszBase = strstr(_pszIn, pszGameDataPath);
|
|
short wOffset = 0;
|
|
|
|
if ( pszBase != NULL )
|
|
wOffset = strlen(pszGameDataPath) + (pszBase - _pszIn) + 1;
|
|
|
|
/*copy the file name, not including the game data path*/
|
|
strcpy(_pszOut, _pszIn + wOffset);
|
|
/*now replace '/' by '\'*/
|
|
do
|
|
{
|
|
if ( *_pszOut == '/' )
|
|
*_pszOut = '\\';
|
|
else
|
|
*_pszOut = tolower(*_pszOut);
|
|
} while ( *(++ _pszOut) );
|
|
}
|
|
|
|
#ifdef __cplusplus
|
|
}
|
|
#endif
|
|
|
|
|