264 lines
9.2 KiB
C
264 lines
9.2 KiB
C
/*
|
|
=======================================================================================
|
|
Name : TexProcedural.c
|
|
Author : vincent lhullier Date :01/02/99
|
|
Description : implementation of function for procedural texture
|
|
=======================================================================================
|
|
*/
|
|
|
|
#ifdef PROCEDURAL_TEXTURE
|
|
|
|
#include "cpa_expt.h"
|
|
#include "GLD.h"
|
|
|
|
#include "DllCaps.h"
|
|
#include "DLLInter.h"
|
|
|
|
#include "TexProcedural.h"
|
|
#include "Texture.h"
|
|
#include "TexName.h"
|
|
|
|
/*
|
|
=======================================================================================
|
|
Internal function to compute procedural texture surface
|
|
=======================================================================================
|
|
*/
|
|
#define FREQ 0.2f
|
|
#define AMPL 200.f
|
|
|
|
void TEXPRO_fnv_DisruptSurface_Water( GLI_tdstTexture *_pst_Texture )
|
|
{
|
|
unsigned char *S1, *S2, N;
|
|
static long sl_K;
|
|
unsigned long ul_X, ul_Y , ul_Add;
|
|
static long lRate = 10;
|
|
static long lCount = 0;
|
|
static long lNRate = 2;
|
|
|
|
if (lCount)
|
|
{
|
|
lCount--;
|
|
return;
|
|
}
|
|
lCount = lRate;
|
|
|
|
sl_K++;
|
|
S1 = ((unsigned char *) _pst_Texture->p_vBitMap);
|
|
S2 = ((unsigned char *) _pst_Texture->pv_Bitmap2);
|
|
N = lNRate;
|
|
|
|
while (N--)
|
|
{
|
|
ul_X = rand() % (_pst_Texture->lWidth - 8) + 4;
|
|
ul_Y = rand() % (_pst_Texture->lHeight - 8) + 4;
|
|
ul_Add = (unsigned long) (fabs(sin(sl_K * FREQ)) * AMPL);
|
|
|
|
*(S1 + ul_X + ( (ul_Y + 1) *_pst_Texture->lWidth )) += (unsigned char) ul_Add;
|
|
*(S1 + ul_X + 1 + ( ul_Y *_pst_Texture->lWidth )) += (unsigned char) ul_Add;
|
|
*(S1 + ul_X + 1 + ( (ul_Y + 1) *_pst_Texture->lWidth )) += (unsigned char) ul_Add;
|
|
*(S1 + ul_X + ( ul_Y *_pst_Texture->lWidth )) += (unsigned char) ul_Add;
|
|
*(S2 + ul_X + ( (ul_Y + 1) *_pst_Texture->lWidth )) += (unsigned char) ul_Add;
|
|
*(S2 + ul_X + 1 + ( ul_Y *_pst_Texture->lWidth )) += (unsigned char) ul_Add;
|
|
*(S2 + ul_X + 1 + ( (ul_Y + 1) *_pst_Texture->lWidth )) += (unsigned char) ul_Add;
|
|
*(S2 + ul_X + ( ul_Y *_pst_Texture->lWidth )) += (unsigned char) ul_Add;
|
|
}
|
|
}
|
|
|
|
void TEXPRO_fnv_ComputeSurface_Water( GLI_tdstTexture *_pst_Texture )
|
|
{
|
|
char *S1, *S2;
|
|
unsigned long Size;
|
|
unsigned long X, Y, DX;
|
|
unsigned long ulValue;
|
|
|
|
DX = _pst_Texture->lWidth;
|
|
|
|
S1 = ((char *) _pst_Texture->p_vBitMap) + _pst_Texture->lWidth + 1;
|
|
S2 = ((char *) _pst_Texture->pv_Bitmap2) + _pst_Texture->lWidth + 1;
|
|
|
|
Y = _pst_Texture->lHeight - 2;
|
|
while (Y--)
|
|
{
|
|
X = _pst_Texture->lWidth - 2;
|
|
while (X--)
|
|
{
|
|
ulValue = ((((unsigned long) *(S2 + 1)) + ((unsigned long) *(S2 - 1)) + ((unsigned long) *(S2 + DX)) + ((unsigned long) *(S2 - DX)))>> 1) - ((unsigned long) *(S1));
|
|
/*ulValue = ( (
|
|
((unsigned long) *(S2 + 1)) +
|
|
((unsigned long) *(S2 - 1)) +
|
|
((unsigned long) *(S2 + DX)) +
|
|
((unsigned long) *(S2 - DX)) +
|
|
((unsigned long) *(S2 + 1 + DX)) +
|
|
((unsigned long) *(S2 - 1 + DX)) +
|
|
((unsigned long) *(S2 - DX + 1)) +
|
|
((unsigned long) *(S2 - DX -1 ))
|
|
) >> 2 ) - ((unsigned long) *(S1));
|
|
*/
|
|
|
|
*S1 = (char) (ulValue - (ulValue>>5) );
|
|
S1++;
|
|
S2++;
|
|
}
|
|
S1 += 2;
|
|
S2 += 2;
|
|
}
|
|
|
|
S1 = ((char *) _pst_Texture->p_vBitMap) + DX;
|
|
S2 = ((char *) _pst_Texture->pv_Bitmap2) + DX;
|
|
|
|
Y = _pst_Texture->lHeight - 2;
|
|
while (Y--)
|
|
{
|
|
ulValue = ((((unsigned long) *(S2 + 1)) + ((unsigned long) *(S2 + DX - 1)) + ((unsigned long) *(S2 + DX)) + ((unsigned long) *(S2 - DX))) >> 1) - ((unsigned long) *(S1));
|
|
*S1 = (char) (ulValue - (ulValue>>5) );
|
|
S1 += DX - 1;
|
|
S2 += DX - 1;
|
|
|
|
ulValue = ((((unsigned long) *(S2 - DX + 1)) + ((unsigned long) *(S2 - 1)) + ((unsigned long) *(S2 + DX)) + ((unsigned long) *(S2 - DX))) >> 1) - ((unsigned long) *(S1));
|
|
*S1 = (char) (ulValue - (ulValue>>5) );
|
|
S1++;
|
|
S2++;
|
|
}
|
|
|
|
S1 = ((char *) _pst_Texture->p_vBitMap) + 1;
|
|
S2 = ((char *) _pst_Texture->pv_Bitmap2) + 1;
|
|
X = DX - 2;
|
|
Size = DX * (_pst_Texture->lHeight - 1) ;
|
|
while (X--)
|
|
{
|
|
ulValue = ((((unsigned long) *(S2 + 1)) + ((unsigned long) *(S2 - 1)) + ((unsigned long) *(S2 + DX)) + ((unsigned long) *(S2 + Size))) >> 1) - ((unsigned long) *(S1));
|
|
*S1 = (char) (ulValue - (ulValue>>5) );
|
|
S1 += Size;
|
|
S2 += Size;
|
|
ulValue = ((((unsigned long) *(S2 + 1)) + ((unsigned long) *(S2 - 1)) + ((unsigned long) *(S2 - Size)) + ((unsigned long) *(S2 - DX))) >> 1) - ((unsigned long) *(S1));
|
|
*S1 = (char) (ulValue - (ulValue>>5) );
|
|
S1 -= Size - 1;
|
|
S2 -= Size - 1;
|
|
}
|
|
|
|
S1 = (char *) _pst_Texture->p_vBitMap;
|
|
_pst_Texture->p_vBitMap = _pst_Texture->pv_Bitmap2;
|
|
_pst_Texture->pv_Bitmap2 = (void *) S1;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : init texture structure for procedural texture
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long TEXPRO_fnl_InitProceduralTexture( GLI_tdstTexture *_pst_Texture, long _l_Type, long _l_Width, long _l_Height, long _l_RefreshRate )
|
|
{
|
|
long i, j;
|
|
unsigned short *puw_Palette;
|
|
|
|
_pst_Texture->lTextureCaps |= GLI_C_lProceduralTexture;
|
|
_pst_Texture->lHeight = _pst_Texture->lRealHeight = (unsigned short) _l_Height;
|
|
_pst_Texture->lWidth = _pst_Texture->lRealWidth = (unsigned short) _l_Width;
|
|
_pst_Texture->lTextureCaps |= GLI_C_lAlphaTexture;
|
|
_pst_Texture->l_Type = _l_Type;
|
|
_pst_Texture->l_RefreshRate = _pst_Texture->l_RefreshCounter = _l_RefreshRate;
|
|
_pst_Texture->l_RenderingCounter = 0;
|
|
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeGLI , MMG_C_lSubTypeTexture , NULL);
|
|
GEO_M_CPAMalloc(_pst_Texture->p_vBitMap, void *, _l_Width * _l_Height, E_uwGEONotEnoughtMemory );
|
|
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeGLI , MMG_C_lSubTypeTexture , NULL);
|
|
GEO_M_CPAMalloc(_pst_Texture->pv_Bitmap2, void *, _l_Width * _l_Height, E_uwGEONotEnoughtMemory );
|
|
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeGLI , MMG_C_lSubTypeTexture , NULL);
|
|
GEO_M_CPAMalloc(_pst_Texture->p_vColorTable, void *, 512, E_uwGEONotEnoughtMemory );
|
|
|
|
puw_Palette = (unsigned short *) _pst_Texture->p_vColorTable;
|
|
|
|
for (i = 0; i < 256; i++, puw_Palette++ )
|
|
{
|
|
/**pul_Palette = i | (i<<8) | (i<<16) | ((i < 128) ? (i<<25) : 0xFF000000);*/
|
|
j = i>>4;
|
|
*puw_Palette = j | (j<<4) | (j<<8) | ((i < 128) ? (j<<13) : 0xF000);
|
|
}
|
|
|
|
strcpy( _pst_Texture->a255_cFileName, "Proc" );
|
|
TEX_fnv_MakeItExisting( _pst_Texture );
|
|
|
|
return 1;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : init texture structure for procedural texture
|
|
(texture type is given by its name, used by script callback)
|
|
Returns (long ) 0 if failed
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long TEXPRO_fnl_InitProceduralTextureWithName( GLI_tdstTexture *_pst_Texture, char *_sz_ProcName, long _l_Width, long _l_Height, long _l_RefreshRate )
|
|
{
|
|
long l_Type;
|
|
|
|
if (stricmp( _sz_ProcName, "Water") == 0)
|
|
l_Type = TEXPRO_C_lWater;
|
|
else if (stricmp( _sz_ProcName, "Fire") == 0)
|
|
l_Type = TEXPRO_C_lFire;
|
|
else
|
|
return 0;
|
|
|
|
return TEXPRO_fnl_InitProceduralTexture( _pst_Texture, l_Type, _l_Width, _l_Height, _l_RefreshRate );
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : refresh procedural texture
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void TEXPRO_fnv_RefreshProceduralTexture( GLI_tdstTexture *_pst_Texture, long _l_ActualRefreshNumber )
|
|
{
|
|
if (!( _pst_Texture->lTextureCaps & GLI_C_lProceduralTexture))
|
|
return;
|
|
if ( _pst_Texture->l_RenderingCounter == _l_ActualRefreshNumber )
|
|
return;
|
|
|
|
_pst_Texture->l_RenderingCounter = _l_ActualRefreshNumber;
|
|
|
|
_pst_Texture->l_RefreshCounter--;
|
|
if (_pst_Texture->l_RefreshCounter >= 0 )
|
|
return;
|
|
|
|
_pst_Texture->l_RefreshCounter = _pst_Texture->l_RefreshRate;
|
|
|
|
switch (_pst_Texture->l_Type)
|
|
{
|
|
case TEXPRO_C_lWater:
|
|
TEXPRO_fnv_DisruptSurface_Water( _pst_Texture );
|
|
TEXPRO_fnv_ComputeSurface_Water( _pst_Texture );
|
|
break;
|
|
case TEXPRO_C_lFire:
|
|
break;
|
|
}
|
|
|
|
/*
|
|
{
|
|
static file = 0;
|
|
FILE *hpFile;
|
|
char szFile[64];
|
|
|
|
if (file < 100)
|
|
{
|
|
sprintf(szFile, "snapshot/proc%04d.raw", file++ );
|
|
hpFile = fopen( szFile, "wb" );
|
|
fwrite( _pst_Texture->p_vBitMap, 128*128,1, hpFile);
|
|
fclose( hpFile );
|
|
}
|
|
|
|
|
|
}
|
|
*/
|
|
|
|
|
|
|
|
GLI_DRV_lRequest( GLIDLL_Request_ReloadTexture, (long) _pst_Texture, 0 );
|
|
}
|
|
|
|
#endif /*PROCEDURAL_TEXTURE*/
|
|
|