1073 lines
39 KiB
C
1073 lines
39 KiB
C
/*
|
|
=======================================================================================
|
|
Name : Material.c
|
|
Description : manage with material structure
|
|
=======================================================================================
|
|
*/
|
|
|
|
#include "GLD.h"
|
|
#include "gli_st.h"
|
|
#include "GLI_Defn.h"
|
|
#include "mater_st.h"
|
|
#include "material.h"
|
|
#include "texture.h"
|
|
#include "MatBench.h"
|
|
#include "TexProcedural.h"
|
|
#include "DLLCaps.h"
|
|
|
|
/* for GLI_pGetVisualMaterialForLetter */
|
|
#include "Gli.h"
|
|
#include "VisuS_st.h"
|
|
#include "pcs.h"
|
|
#include "PO\POStruc.h"
|
|
#define D_ObjsTbls_Define
|
|
#include "incGAM.h"
|
|
|
|
/*
|
|
=======================================================================================
|
|
Constants
|
|
=======================================================================================
|
|
*/
|
|
|
|
/* Cst replaced with GLI_g_stCaps.fRefreshRate */
|
|
/* #define GLI_C_fTransformSecondsInFramesRate 60.0f */
|
|
|
|
/*
|
|
=======================================================================================
|
|
Globals
|
|
=======================================================================================
|
|
*/
|
|
MTH_tdxReal gs_fCoefOfMultiplicationForScolledTextures;
|
|
MTH_tdxReal gs_fCoefOfMultiplicationForAnimatedTexture = 0.0f;
|
|
unsigned long gs_lActualRefreshNumberForScolledTextures = 0;
|
|
|
|
/*
|
|
* for AGO
|
|
*/
|
|
MTH_tdxReal g_BaseTimeForParticleAnimation ;
|
|
unsigned char g_bHasTextureAnimationFinished = 0 ;
|
|
unsigned char g_bTakeCareOfAnimationCoordination = 0 ;
|
|
unsigned char g_bOneShotAnim = 0;
|
|
|
|
#ifdef MULTI_TEXTURE
|
|
void GLI_vRefreshMultiTexturePart( GLI_tdstMaterial *_pst_Material );
|
|
#else
|
|
#define GLI_vRefreshMultiTexturePart(a)
|
|
#endif /*MULTI_TEXTURE*/
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
#ifdef __cplusplus
|
|
extern "C"
|
|
{
|
|
#endif
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
=======================================================================================
|
|
Material structure function (create/delete/duplicate)
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : create a new material
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_xCreateMaterial( ACP_tdxHandleOfMaterial *hMaterial )
|
|
{
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeGLI , MMG_C_lSubTypeMaterial , NULL);
|
|
GEO_M_CPAMalloc( *hMaterial, GLI_tdstMaterial *, sizeof ( GLI_tdstMaterial ), E_uwGEONotEnoughtMemory );
|
|
|
|
(*hMaterial)->stAmbient.xR = 0.0f ;
|
|
(*hMaterial)->stAmbient.xG = 0.1f ;
|
|
(*hMaterial)->stAmbient.xB = 0.1f ;
|
|
|
|
(*hMaterial)->stDiffuse.xR = 0.8f ;
|
|
(*hMaterial)->stDiffuse.xG = 0.8f ;
|
|
(*hMaterial)->stDiffuse.xB = 0.8f ;
|
|
|
|
(*hMaterial)->stColor.xR = 1.0f;
|
|
(*hMaterial)->stColor.xG = 0.0f;
|
|
(*hMaterial)->stColor.xB = 1.0f;
|
|
|
|
(*hMaterial)->p_stTexture = NULL;
|
|
(*hMaterial)->xMaterialType = 0xFFFFFFFF;
|
|
(*hMaterial)->lIncrementIsEnable = 0;
|
|
|
|
(*hMaterial)->p_stFistAnimatedTExtureNode = NULL;
|
|
(*hMaterial)->p_stActualAnimatedTExtureNode = NULL;
|
|
(*hMaterial)->lNumberOfDisplayNode = 0;
|
|
(*hMaterial)->xActualDisplayTimeSinceStartOfLastTexture = gs_fCoefOfMultiplicationForAnimatedTexture;
|
|
(*hMaterial)->lActualRefreshNumber = gs_lActualRefreshNumberForScolledTextures ;
|
|
GLI_vUnLockAnimatedTexture(*hMaterial);
|
|
|
|
GLI_Material_fn_vInitMultiTexturePart( *hMaterial );
|
|
|
|
MATBENCH_fn_vAddMaterialRef( *hMaterial );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : create a new material
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_xDeleteMaterial( ACP_tdxHandleOfMaterial hMaterial )
|
|
{
|
|
GEO_M_CPAFree( hMaterial);
|
|
MATBENCH_fn_vDeleteMaterialRef( hMaterial );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : duplicate a material
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_xDuplicateMaterial ( ACP_tdxHandleOfMaterial *_p_hDest, ACP_tdxHandleOfMaterial _hSource )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
struct GEO_tdstColor_ stColor;
|
|
GLI_tdstTexture *p_stTexture;
|
|
unsigned long xMType;
|
|
long lSpecularExponent;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
GLI_xCreateMaterial(_p_hDest);
|
|
|
|
**_p_hDest = *_hSource;
|
|
|
|
GLI_xGetMaterialAmbientCoef(_hSource,&stColor);
|
|
GLI_xSetMaterialAmbientCoef(*_p_hDest,&stColor);
|
|
|
|
GLI_xGetMaterialDiffuseCoef(_hSource,&stColor);
|
|
GLI_xSetMaterialDiffuseCoef(*_p_hDest,&stColor);
|
|
|
|
GLI_xGetMaterialColor(_hSource,&stColor);
|
|
GLI_xSetMaterialColor(*_p_hDest,&stColor);
|
|
|
|
GLI_xGetMaterialTexture (_hSource,&p_stTexture);
|
|
GLI_xSetMaterialTexture (*_p_hDest,p_stTexture);
|
|
|
|
GLI_xGetMaterialType (_hSource,&xMType);
|
|
GLI_xSetMaterialType (*_p_hDest,xMType);
|
|
|
|
GLI_xGetMaterialSpecularCoef (_hSource,&lSpecularExponent,&stColor);
|
|
GLI_xSetMaterialSpecularCoef (*_p_hDest,lSpecularExponent,&stColor);
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
function to access member of material structure
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
* material ambient color
|
|
*/
|
|
void GLI_xSetMaterialAmbientCoef( ACP_tdxHandleOfMaterial hMaterial, struct GEO_tdstColor_ *p_stColor )
|
|
{
|
|
hMaterial->stAmbient = *p_stColor ;
|
|
}
|
|
|
|
void GLI_xGetMaterialAmbientCoef( ACP_tdxHandleOfMaterial hMaterial, struct GEO_tdstColor_ *p_stColor )
|
|
{
|
|
*p_stColor = hMaterial->stAmbient ;
|
|
|
|
}
|
|
|
|
/*
|
|
* material color
|
|
*/
|
|
void GLI_xSetMaterialColor( ACP_tdxHandleOfMaterial hMaterial, struct GEO_tdstColor_ *p_stColor )
|
|
{
|
|
hMaterial -> stColor = *p_stColor ;
|
|
}
|
|
|
|
void GLI_xGetMaterialColor( ACP_tdxHandleOfMaterial hMaterial, struct GEO_tdstColor_ *p_stColor )
|
|
{
|
|
*p_stColor = hMaterial->stColor;
|
|
}
|
|
|
|
/*
|
|
* material diffuse color
|
|
*/
|
|
void GLI_xSetMaterialDiffuseCoef( ACP_tdxHandleOfMaterial hMaterial, struct GEO_tdstColor_ *p_stColor )
|
|
{
|
|
hMaterial->stDiffuse = *p_stColor ;
|
|
}
|
|
|
|
void GLI_xGetMaterialDiffuseCoef( ACP_tdxHandleOfMaterial hMaterial, struct GEO_tdstColor_ *p_stColor )
|
|
{
|
|
*p_stColor = hMaterial->stDiffuse ;
|
|
}
|
|
|
|
/*
|
|
* material specular color
|
|
*/
|
|
void GLI_xSetMaterialSpecularCoef( ACP_tdxHandleOfMaterial hMaterial, long lSpecularExponent, struct GEO_tdstColor_ *p_stColor )
|
|
{
|
|
hMaterial->stSpecular = *p_stColor ;
|
|
hMaterial->lSpecularExponent = lSpecularExponent ;
|
|
}
|
|
|
|
void GLI_xGetMaterialSpecularCoef( ACP_tdxHandleOfMaterial hMaterial, long *p_lSpecularExponent, struct GEO_tdstColor_ *p_stColor )
|
|
{
|
|
*p_stColor = hMaterial->stSpecular ;
|
|
*p_lSpecularExponent = hMaterial->lSpecularExponent ;
|
|
}
|
|
|
|
/*
|
|
* material type
|
|
*/
|
|
void GLI_xGetMaterialType ( ACP_tdxHandleOfMaterial hMaterial, unsigned long *xMType )
|
|
{
|
|
*xMType = hMaterial->xMaterialType;
|
|
}
|
|
|
|
void GLI_xSetMaterialType ( ACP_tdxHandleOfMaterial hMaterial, unsigned long xMType )
|
|
{
|
|
hMaterial->xMaterialType = xMType ;
|
|
}
|
|
|
|
void GLI_vSetMaterialAsChromed ( ACP_tdxHandleOfMaterial hMaterial, long lNumberOfTexture )
|
|
{
|
|
if ( lNumberOfTexture )
|
|
hMaterial->xMaterialType &= GLI_C_lAllIsEnable - GLI_C_lIsNotChromed ;
|
|
else
|
|
hMaterial->xMaterialType |= GLI_C_lIsNotChromed ;
|
|
}
|
|
|
|
long GLI_bIsMaterialChromed ( ACP_tdxHandleOfMaterial hMaterial )
|
|
{
|
|
return ((hMaterial->xMaterialType & GLI_C_lIsNotChromed) == 0);
|
|
}
|
|
|
|
long GLI_bIsMaterialBackface ( ACP_tdxHandleOfMaterial hMaterial )
|
|
{
|
|
return ((hMaterial->xMaterialType & GLI_C_lIsTestingBackface) == 0);
|
|
}
|
|
|
|
long GLI_xIsMaterialTransparent( ACP_tdxHandleOfMaterial hMaterial )
|
|
{
|
|
if ( ( hMaterial->xMaterialType & GLI_C_lIsNotGrided ) == 0 )
|
|
return (1);
|
|
if (hMaterial->p_stTexture != NULL)
|
|
if ((hMaterial->p_stTexture->lTextureCaps & (GLI_C_lAlphaTexture + GLI_C_lNZTexture)) != 0)
|
|
return (1);
|
|
|
|
return 0;
|
|
}
|
|
|
|
|
|
/*
|
|
* material texture
|
|
*/
|
|
void GLI_xSetMaterialTexture ( ACP_tdxHandleOfMaterial hMaterial, GLI_tdstTexture *p_stTexture )
|
|
{
|
|
hMaterial->p_stTexture = p_stTexture ;
|
|
|
|
if (p_stTexture != NULL)
|
|
{
|
|
if (p_stTexture->lTextureCaps & GLI_C_lAlphaTexture)
|
|
hMaterial -> xMaterialType &= 0xffffffff - GLI_C_lIsTestingBackface;
|
|
|
|
if (p_stTexture->lTextureCaps & GLI_C_lNoZBufferWriteTexture)
|
|
hMaterial -> xMaterialType &= 0xffffffff - GLI_C_lIsWriteZBuffer;
|
|
else
|
|
hMaterial -> xMaterialType |= GLI_C_lIsWriteZBuffer;
|
|
}
|
|
else
|
|
hMaterial -> xMaterialType |= GLI_C_lIsWriteZBuffer;
|
|
}
|
|
|
|
void GLI_xGetMaterialTexture ( ACP_tdxHandleOfMaterial hMaterial, GLI_tdstTexture **p_stTexture )
|
|
{
|
|
*p_stTexture = hMaterial->p_stTexture;
|
|
}
|
|
|
|
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions for scrolling textures
|
|
=======================================================================================
|
|
*/
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Set scrolling coefficient (On/off, speed on u and v)
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_xSetMaterialTextureScrollingCoef( ACP_tdxHandleOfMaterial hMaterial, long lNumberOfTexture, long bSwitch, float fUSpeed, float fVSpeed )
|
|
{
|
|
hMaterial->fAddU = hMaterial->fConstantAddU = fUSpeed;
|
|
hMaterial->fAddV = hMaterial->fConstantAddV = fVSpeed;
|
|
hMaterial->lIncrementIsEnable = bSwitch ;
|
|
if ( ( fUSpeed == 0.0f ) && ( fVSpeed == 0.0f ) )
|
|
hMaterial->lIncrementIsEnable = 0;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Set shifting coefficient (On/off, position on u and v)
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_xSetMaterialTextureDecalage( ACP_tdxHandleOfMaterial hMaterial, long lNumberOfTexture, long bSwitch, float fUSpeed, float fVSpeed )
|
|
{
|
|
hMaterial->fAddU = fUSpeed ;
|
|
hMaterial->fAddV = fVSpeed ;
|
|
hMaterial->lIncrementIsEnable = bSwitch ;
|
|
if ( ( fUSpeed == 0.0f ) && ( fVSpeed == 0.0f ) )
|
|
hMaterial->lIncrementIsEnable = 0;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : retrieve scrolling coefficient (On/off, speed on u and v)
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_xGetMaterialTextureScrollingCoef( ACP_tdxHandleOfMaterial hMaterial, long lNumberOfTexture, long *p_bSwitch, float *p_fUSpeed, float *p_fVSpeed )
|
|
{
|
|
*p_fUSpeed = hMaterial->fConstantAddU ;
|
|
*p_fVSpeed = hMaterial->fConstantAddV ;
|
|
*p_bSwitch = hMaterial->lIncrementIsEnable;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : set state of scroll (on/off)
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_xSetMaterialTextureScrollingOnOff( ACP_tdxHandleOfMaterial hMaterial,long bSwitch)
|
|
{
|
|
if (bSwitch && (hMaterial->fConstantAddU == 0.0f) && (hMaterial -> fConstantAddV == 0.0f))
|
|
return;
|
|
hMaterial->lIncrementIsEnable = bSwitch;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
Functions for animated textures
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Create a structure to store a stage of texture animation
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_xCreateAnimatedTextureNode( GLI_tdstAnimatedTextureNode **h_AnimatedTextureNodeToCreate )
|
|
{
|
|
MMG_fn_vAddMemoryInfo (MMG_C_lTypeGLI , MMG_C_lSubTypeAnimatedTexture , NULL);
|
|
GEO_M_CPAMalloc( *h_AnimatedTextureNodeToCreate, GLI_tdstAnimatedTextureNode *, sizeof ( GLI_tdstAnimatedTextureNode ), E_uwGEONotEnoughtMemory );
|
|
(*h_AnimatedTextureNodeToCreate)->p_stTexture = NULL;
|
|
(*h_AnimatedTextureNodeToCreate)->xDisplayTime = 0;
|
|
(*h_AnimatedTextureNodeToCreate)->p_stNextDisplayNode = NULL;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Add an animated texture to material
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_vAddMaterialAnimatedTexture( ACP_tdxHandleOfMaterial hMaterial, long lNumberOfAnimatedTexture, GLI_tdstTexture *p_stTexture ,float fExpositionTimeInSeconds)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
GLI_tdstAnimatedTextureNode *p_NodeToCreate,*p_LastNode,*p_BeforeLastNode;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
hMaterial->lNumberOfDisplayNode++;
|
|
GLI_xCreateAnimatedTextureNode(&p_NodeToCreate);
|
|
p_NodeToCreate->p_stTexture = p_stTexture ;
|
|
p_NodeToCreate->xDisplayTime = fExpositionTimeInSeconds /* * GLI_g_stCaps.fRefreshRate */;
|
|
|
|
if ((hMaterial -> lNumberOfDisplayNode == 1) || (lNumberOfAnimatedTexture == 0))
|
|
{
|
|
GLI_xSetMaterialTexture ( hMaterial , p_stTexture );
|
|
p_NodeToCreate->p_stNextDisplayNode = hMaterial -> p_stFistAnimatedTExtureNode;
|
|
hMaterial->p_stFistAnimatedTExtureNode = p_NodeToCreate;
|
|
hMaterial->p_stActualAnimatedTExtureNode = p_NodeToCreate;
|
|
}
|
|
else
|
|
{
|
|
p_BeforeLastNode = p_LastNode = hMaterial -> p_stFistAnimatedTExtureNode ;
|
|
while ((p_LastNode != NULL) && (lNumberOfAnimatedTexture-- !=0 ))
|
|
{
|
|
p_BeforeLastNode = p_LastNode;
|
|
p_LastNode = p_LastNode -> p_stNextDisplayNode ;
|
|
}
|
|
p_NodeToCreate->p_stNextDisplayNode = p_LastNode ;
|
|
p_BeforeLastNode->p_stNextDisplayNode = p_NodeToCreate;
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : return number of texture in animation
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_lGetMaterialNumberOfAnimatedTexture( ACP_tdxHandleOfMaterial hMaterial )
|
|
{
|
|
return ( hMaterial->lNumberOfDisplayNode );
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : get parameters of a node of texture animation
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_vGetMaterialAnimatedTexture( ACP_tdxHandleOfMaterial hMaterial, long lNumberOfAnimatedTexture, GLI_tdstTexture **h_stTexture, float *p_fDisplayTime )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
GLI_tdstAnimatedTextureNode *p_Node;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
p_Node = hMaterial->p_stFistAnimatedTExtureNode;
|
|
|
|
while (lNumberOfAnimatedTexture != 0)
|
|
{
|
|
lNumberOfAnimatedTexture--;
|
|
p_Node = p_Node->p_stNextDisplayNode ;
|
|
}
|
|
|
|
*p_fDisplayTime = p_Node->xDisplayTime /* * 1.0f / GLI_g_stCaps.fRefreshRate */;
|
|
*h_stTexture = p_Node->p_stTexture;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : return index of current node in texture animation
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_lGetCurrentAnimatedTextureNumber( ACP_tdxHandleOfMaterial hMaterial )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
GLI_tdstAnimatedTextureNode *p_Node;
|
|
long lNumber=1;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
p_Node = hMaterial->p_stFistAnimatedTExtureNode;
|
|
while (p_Node != hMaterial->p_stActualAnimatedTExtureNode)
|
|
{
|
|
lNumber ++;
|
|
p_Node = p_Node->p_stNextDisplayNode ;
|
|
}
|
|
|
|
if(p_Node == hMaterial->p_stActualAnimatedTExtureNode)
|
|
return lNumber;
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : change current node in texture animation
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_vSetCurrentAnimatedTextureNumber( ACP_tdxHandleOfMaterial hMaterial, long lTextureNumber )
|
|
{
|
|
GLI_tdstAnimatedTextureNode *p_Node;
|
|
long lNumber = 1;
|
|
|
|
p_Node = hMaterial->p_stFistAnimatedTExtureNode ;
|
|
while ( p_Node && lNumber != lTextureNumber )
|
|
{
|
|
lNumber ++;
|
|
p_Node = p_Node -> p_stNextDisplayNode ;
|
|
}
|
|
hMaterial -> p_stActualAnimatedTExtureNode = p_Node ? p_Node : hMaterial->p_stFistAnimatedTExtureNode ;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : change parameters of a node in texture animation
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_vModifyMaterialAnimatedTexture( ACP_tdxHandleOfMaterial hMaterial, long lNumberOfAnimatedTexture, GLI_tdstTexture *p_stTexture, float fDisplayTime)
|
|
{
|
|
GLI_tdstAnimatedTextureNode *p_Node;
|
|
|
|
p_Node = hMaterial->p_stFistAnimatedTExtureNode;
|
|
while (lNumberOfAnimatedTexture != 0)
|
|
{
|
|
lNumberOfAnimatedTexture--;
|
|
p_Node = p_Node->p_stNextDisplayNode ;
|
|
}
|
|
p_Node->xDisplayTime = fDisplayTime /* * GLI_g_stCaps.fRefreshRate */ ;
|
|
p_Node->p_stTexture = p_stTexture ;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : delete a node in texture animation
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_vDeleteMaterialAnimatedTexture( ACP_tdxHandleOfMaterial hMaterial, long lNumberOfAnimatedTexture)
|
|
{
|
|
GLI_tdstAnimatedTextureNode *p_Node,*p_BeforeLastNode ;
|
|
|
|
if (hMaterial -> lNumberOfDisplayNode == 0)
|
|
return;
|
|
|
|
if (hMaterial -> lNumberOfDisplayNode == 1)
|
|
{
|
|
hMaterial -> lNumberOfDisplayNode = 0;
|
|
hMaterial -> p_stActualAnimatedTExtureNode = hMaterial -> p_stFistAnimatedTExtureNode = NULL;
|
|
}
|
|
|
|
else
|
|
{
|
|
p_BeforeLastNode = p_Node = hMaterial -> p_stFistAnimatedTExtureNode;
|
|
|
|
if (lNumberOfAnimatedTexture == 0)
|
|
{
|
|
hMaterial -> p_stFistAnimatedTExtureNode = hMaterial -> p_stFistAnimatedTExtureNode -> p_stNextDisplayNode ;
|
|
}
|
|
else
|
|
{
|
|
while ((lNumberOfAnimatedTexture != 0) && (p_Node != NULL))
|
|
{
|
|
lNumberOfAnimatedTexture --;
|
|
p_BeforeLastNode = p_Node ;
|
|
p_Node = p_Node -> p_stNextDisplayNode ;
|
|
}
|
|
p_BeforeLastNode -> p_stNextDisplayNode = p_Node ;
|
|
}
|
|
hMaterial -> lNumberOfDisplayNode--;
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Lock/Unlock animation
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_vLockAnimatedTexture(ACP_tdxHandleOfMaterial _hMaterial)
|
|
{
|
|
_hMaterial->xIsLocked=TRUE;
|
|
}
|
|
|
|
void GLI_vUnLockAnimatedTexture(ACP_tdxHandleOfMaterial _hMaterial)
|
|
{
|
|
_hMaterial->xIsLocked=FALSE;
|
|
}
|
|
|
|
|
|
/*
|
|
=======================================================================================
|
|
Other functions
|
|
=======================================================================================
|
|
*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Set global parameters that are used to scroll and animate texture
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_vRefreshAllCyclingTextures( float fCoefOfMultiplication )
|
|
{
|
|
gs_fCoefOfMultiplicationForScolledTextures = fCoefOfMultiplication;
|
|
gs_fCoefOfMultiplicationForAnimatedTexture += fCoefOfMultiplication;
|
|
gs_lActualRefreshNumberForScolledTextures++;
|
|
}
|
|
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : refresh scrolled and animated textures
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_xRefreshAnimatedTexture( ACP_tdxHandleOfMaterial hMaterial )
|
|
{
|
|
float fNbFramesToDisplay;
|
|
/*if ( (hMaterial->p_stTexture != NULL) && (hMaterial->lActualRefreshNumber != gs_lActualRefreshNumberForScolledTextures) )*/
|
|
|
|
/*
|
|
* multitexture
|
|
*/
|
|
if (hMaterial->lActualRefreshNumber != gs_lActualRefreshNumberForScolledTextures)
|
|
GLI_vRefreshMultiTexturePart( hMaterial );
|
|
|
|
if ( hMaterial->p_stTexture != NULL )
|
|
{
|
|
/*
|
|
* scrolled textures
|
|
*/
|
|
if (hMaterial->lIncrementIsEnable != 0)
|
|
{
|
|
hMaterial->p_stTexture->lIncrementIsEnable = 1;
|
|
|
|
/*if ( hMaterial->lIncrementIsEnable == 1 )*/
|
|
if ( (hMaterial->lIncrementIsEnable == 1) && (hMaterial->lActualRefreshNumber != gs_lActualRefreshNumberForScolledTextures) )
|
|
{
|
|
hMaterial->fAddU += hMaterial->fConstantAddU * gs_fCoefOfMultiplicationForScolledTextures;
|
|
hMaterial->fAddV += hMaterial->fConstantAddV * gs_fCoefOfMultiplicationForScolledTextures;
|
|
/*hMaterial->p_stTexture->fAddU = hMaterial->fAddU;*/
|
|
/*hMaterial->p_stTexture->fAddV = hMaterial->fAddV;*/
|
|
|
|
if (hMaterial->fAddU >= 0.0f)
|
|
hMaterial->fAddU = hMaterial->fAddU - MTH_M_xRealToLong(hMaterial->fAddU);
|
|
else
|
|
hMaterial->fAddU = -((-hMaterial->fAddU) - MTH_M_xRealToLong((-hMaterial->fAddU)));
|
|
|
|
if (hMaterial->fAddV >= 0.0f)
|
|
hMaterial->fAddV = hMaterial->fAddV - MTH_M_xRealToLong(hMaterial->fAddV);
|
|
else
|
|
hMaterial->fAddV = -((-hMaterial->fAddV) - MTH_M_xRealToLong((-hMaterial->fAddV)));
|
|
}
|
|
/*else if (hMaterial->lIncrementIsEnable == 2)*/
|
|
/*{*/
|
|
hMaterial->p_stTexture->fAddU = hMaterial->fAddU ;
|
|
hMaterial->p_stTexture->fAddV = hMaterial->fAddV ;
|
|
/*}*/
|
|
}
|
|
else
|
|
hMaterial->p_stTexture->lIncrementIsEnable = 0;
|
|
|
|
/*
|
|
* animated textures
|
|
*/
|
|
if ( ( hMaterial->lNumberOfDisplayNode > 1 ) && ( hMaterial->xIsLocked == FALSE ) && (hMaterial->lActualRefreshNumber != gs_lActualRefreshNumberForScolledTextures) )
|
|
{
|
|
//long lAntiBug; /* Could bug for example if display time = 0 or if the material has not been displayed since a long time...*/
|
|
long lSaveType;
|
|
|
|
//lAntiBug = 10;
|
|
g_bHasTextureAnimationFinished = 0;
|
|
|
|
if ( g_bTakeCareOfAnimationCoordination )
|
|
{
|
|
hMaterial->p_stActualAnimatedTExtureNode = hMaterial->p_stFistAnimatedTExtureNode ;
|
|
|
|
fNbFramesToDisplay = hMaterial->p_stActualAnimatedTExtureNode->xDisplayTime * GLI_g_stCaps.fRefreshRate;
|
|
while ( (gs_fCoefOfMultiplicationForAnimatedTexture - g_BaseTimeForParticleAnimation > fNbFramesToDisplay ) )
|
|
{
|
|
g_BaseTimeForParticleAnimation += fNbFramesToDisplay;
|
|
if ( hMaterial->p_stActualAnimatedTExtureNode->p_stNextDisplayNode != NULL )
|
|
{
|
|
hMaterial->p_stActualAnimatedTExtureNode = hMaterial->p_stActualAnimatedTExtureNode->p_stNextDisplayNode;
|
|
}
|
|
else
|
|
{
|
|
if ( g_bOneShotAnim )
|
|
g_bHasTextureAnimationFinished = 1;
|
|
else
|
|
hMaterial->p_stActualAnimatedTExtureNode = hMaterial->p_stFistAnimatedTExtureNode;
|
|
break;
|
|
}
|
|
fNbFramesToDisplay = hMaterial->p_stActualAnimatedTExtureNode->xDisplayTime * GLI_g_stCaps.fRefreshRate;
|
|
}
|
|
}
|
|
else
|
|
{
|
|
|
|
if ( MTH_M_bGreaterZero(hMaterial -> p_stActualAnimatedTExtureNode -> xDisplayTime) )
|
|
{
|
|
fNbFramesToDisplay = hMaterial->p_stActualAnimatedTExtureNode->xDisplayTime * GLI_g_stCaps.fRefreshRate;
|
|
//while (((gs_fCoefOfMultiplicationForAnimatedTexture - hMaterial -> xActualDisplayTimeSinceStartOfLastTexture) > hMaterial -> p_stActualAnimatedTExtureNode -> xDisplayTime) && (lAntiBug>0))
|
|
while (((gs_fCoefOfMultiplicationForAnimatedTexture - hMaterial -> xActualDisplayTimeSinceStartOfLastTexture) > fNbFramesToDisplay) )
|
|
{
|
|
//lAntiBug--;
|
|
hMaterial -> xActualDisplayTimeSinceStartOfLastTexture += fNbFramesToDisplay;
|
|
if (hMaterial -> p_stActualAnimatedTExtureNode -> p_stNextDisplayNode != NULL)
|
|
hMaterial -> p_stActualAnimatedTExtureNode = hMaterial -> p_stActualAnimatedTExtureNode -> p_stNextDisplayNode;
|
|
else
|
|
hMaterial -> p_stActualAnimatedTExtureNode = hMaterial -> p_stFistAnimatedTExtureNode;
|
|
fNbFramesToDisplay = hMaterial->p_stActualAnimatedTExtureNode->xDisplayTime * GLI_g_stCaps.fRefreshRate;
|
|
}
|
|
}
|
|
}
|
|
/*
|
|
if (!lAntiBug)
|
|
{
|
|
hMaterial->xActualDisplayTimeSinceStartOfLastTexture = gs_fCoefOfMultiplicationForAnimatedTexture;
|
|
hMaterial->p_stActualAnimatedTExtureNode = hMaterial -> p_stFistAnimatedTExtureNode;
|
|
}
|
|
*/
|
|
if ((hMaterial->p_stActualAnimatedTExtureNode -> p_stTexture != NULL) && (hMaterial -> p_stTexture != NULL))
|
|
{
|
|
hMaterial->p_stActualAnimatedTExtureNode->p_stTexture->fAddU = hMaterial->p_stTexture->fAddU;
|
|
hMaterial->p_stActualAnimatedTExtureNode->p_stTexture->fAddV = hMaterial->p_stTexture->fAddV;
|
|
hMaterial->p_stActualAnimatedTExtureNode->p_stTexture->lIncrementIsEnable = hMaterial->p_stTexture->lIncrementIsEnable;
|
|
}
|
|
|
|
GLI_xGetMaterialType ( hMaterial , &lSaveType );
|
|
GLI_xSetMaterialTexture ( hMaterial , hMaterial -> p_stActualAnimatedTExtureNode -> p_stTexture );
|
|
GLI_xSetMaterialType ( hMaterial , lSaveType );
|
|
}
|
|
|
|
/*
|
|
* Procedural Texture
|
|
*/
|
|
TEXPRO_fnv_RefreshProceduralTexture( hMaterial->p_stTexture, gs_lActualRefreshNumberForScolledTextures );
|
|
}
|
|
|
|
if ( !g_bTakeCareOfAnimationCoordination )
|
|
hMaterial->lActualRefreshNumber = gs_lActualRefreshNumberForScolledTextures;
|
|
}
|
|
|
|
/*
|
|
=======================================================================================
|
|
functions to manage with multitexturing
|
|
=======================================================================================
|
|
*/
|
|
|
|
#ifdef MULTI_TEXTURE
|
|
|
|
#ifndef RETAIL
|
|
|
|
#define C_lNumberOfColorOp 10
|
|
static char *gas_szColorOpDesc[ C_lNumberOfColorOp ] =
|
|
{
|
|
"Disable",
|
|
"Specular",
|
|
"Diffuse",
|
|
"Constant",
|
|
"SpecularAlpha",
|
|
"DiffuseAlpha",
|
|
"ConstantAlpha",
|
|
"SpecularColor",
|
|
"DiffuseColor",
|
|
"ConstantColor"
|
|
};
|
|
|
|
#define C_lNumberOfOp 8
|
|
static char *gas_szOpDesc[ C_lNumberOfOp ] =
|
|
{
|
|
"Mul",
|
|
"Add",
|
|
"Copy",
|
|
"AlphaTrans",
|
|
"AlphaPremult",
|
|
"Mul2X",
|
|
"Invert",
|
|
"AddSmooth"
|
|
};
|
|
|
|
#define C_lNumberOfUVSource 7
|
|
static char *gas_szUVSourceDesc[ C_lNumberOfUVSource ] =
|
|
{
|
|
"NoSource",
|
|
"Object1",
|
|
"Object2",
|
|
"Chrome",
|
|
"Screen",
|
|
"Cartoon",
|
|
"SolarPhong"
|
|
};
|
|
|
|
#endif /*RETAIL*/
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Init Multi texture part of a material
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_Material_fn_vInitMultiTexturePart( ACP_tdxHandleOfMaterial _hVisualMat )
|
|
{
|
|
GLI_tdstMultiTextureMaterial *pst_MTM, *pst_LastMTM;
|
|
|
|
memset( _hVisualMat->a_stMultiMaterial, 0, 8 * sizeof( GLI_tdstMultiTextureMaterial ) );
|
|
pst_MTM = _hVisualMat->a_stMultiMaterial;
|
|
pst_LastMTM = pst_MTM + 8;
|
|
for ( ; pst_MTM < pst_LastMTM; pst_MTM++ )
|
|
{
|
|
pst_MTM->st_UVStaticPos.stMat[0][0] = 1.0f;
|
|
pst_MTM->st_UVStaticPos.stMat[1][1] = 1.0f;
|
|
pst_MTM->st_UVDynamicPos.stMat[0][0] = 1.0f;
|
|
pst_MTM->st_UVDynamicPos.stMat[1][1] = 1.0f;
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : update UV computing matrice of multimaterial
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
void GLI_vRefreshMultiTexturePart( GLI_tdstMaterial *_pst_Material )
|
|
{
|
|
GLI_tdstMultiTextureMaterial *pst_MTM;
|
|
|
|
pst_MTM = _pst_Material->a_stMultiMaterial;
|
|
while( pst_MTM->c_Flags & C_MTMF_cIsNotLastTexture)
|
|
{
|
|
pst_MTM++;
|
|
|
|
TEXPRO_fnv_RefreshProceduralTexture( pst_MTM->pst_Texture, gs_lActualRefreshNumberForScolledTextures);
|
|
|
|
/*
|
|
{
|
|
char *szName;
|
|
|
|
szName = pst_MTM->pst_Texture->a255_cFileName + strlen(pst_MTM->pst_Texture->a255_cFileName);
|
|
|
|
if ( stricmp( szName - 11, "bumpinv.tga") == 0 )
|
|
{
|
|
static float alpha = 0;
|
|
static float dalpha = 0.05f;
|
|
static float amplitude = 0.02f;
|
|
|
|
alpha += dalpha;
|
|
pst_MTM->st_UVStaticPos.stTrans[0] = (float) (amplitude * cos(alpha ));
|
|
pst_MTM->st_UVStaticPos.stTrans[1] = (float) (amplitude * sin(alpha ));
|
|
}
|
|
else if ( stricmp( szName - 9, "light.tga") == 0 )
|
|
{
|
|
static float alpha = 0;
|
|
static float dalpha = 0.02f;
|
|
static float amplitude = 0.3f;
|
|
|
|
alpha += dalpha;
|
|
pst_MTM->st_UVStaticPos.stTrans[0] = (float)( amplitude * cos(alpha ) );
|
|
pst_MTM->st_UVStaticPos.stTrans[1] = (float)( amplitude * sin(alpha ) );
|
|
}
|
|
}
|
|
*/
|
|
|
|
if ( pst_MTM->c_Flags & C_MTMF_cUVDynamicTransEnable )
|
|
{
|
|
pst_MTM->st_UVStaticPos.stTrans[0] += pst_MTM->st_UVDynamicPos.stTrans[0];
|
|
if ( *(long *) &pst_MTM->st_UVStaticPos.stTrans[0] & 0x80000000 )
|
|
pst_MTM->st_UVStaticPos.stTrans[0] = -((-pst_MTM->st_UVStaticPos.stTrans[0]) - MTH_M_xRealToLong((-pst_MTM->st_UVStaticPos.stTrans[0])));
|
|
else
|
|
pst_MTM->st_UVStaticPos.stTrans[0] = pst_MTM->st_UVStaticPos.stTrans[0] - MTH_M_xRealToLong(pst_MTM->st_UVStaticPos.stTrans[0]);
|
|
|
|
pst_MTM->st_UVStaticPos.stTrans[1] += pst_MTM->st_UVDynamicPos.stTrans[1];
|
|
if ( *(long *) &pst_MTM->st_UVStaticPos.stTrans[1] & 0x80000000 )
|
|
pst_MTM->st_UVStaticPos.stTrans[1] = -((-pst_MTM->st_UVStaticPos.stTrans[1]) - MTH_M_xRealToLong((-pst_MTM->st_UVStaticPos.stTrans[1])));
|
|
else
|
|
pst_MTM->st_UVStaticPos.stTrans[1] = pst_MTM->st_UVStaticPos.stTrans[1] - MTH_M_xRealToLong(pst_MTM->st_UVStaticPos.stTrans[1]);
|
|
}
|
|
|
|
if ( pst_MTM->c_Flags & C_MTMF_cUVDynamicMatEnable )
|
|
{
|
|
float fSave;
|
|
|
|
fSave = pst_MTM->st_UVStaticPos.stMat[0][0];
|
|
pst_MTM->st_UVStaticPos.stMat[0][0] = fSave * pst_MTM->st_UVDynamicPos.stMat[0][0] + pst_MTM->st_UVStaticPos.stMat[0][1] * pst_MTM->st_UVDynamicPos.stMat[1][0];
|
|
pst_MTM->st_UVStaticPos.stMat[0][1] = fSave * pst_MTM->st_UVDynamicPos.stMat[0][1] + pst_MTM->st_UVStaticPos.stMat[0][1] * pst_MTM->st_UVDynamicPos.stMat[1][1];
|
|
|
|
fSave = pst_MTM->st_UVStaticPos.stMat[1][0];
|
|
pst_MTM->st_UVStaticPos.stMat[1][0] = fSave * pst_MTM->st_UVDynamicPos.stMat[0][0] + pst_MTM->st_UVStaticPos.stMat[1][1] * pst_MTM->st_UVDynamicPos.stMat[1][0];
|
|
pst_MTM->st_UVStaticPos.stMat[1][1] = fSave * pst_MTM->st_UVDynamicPos.stMat[0][1] + pst_MTM->st_UVStaticPos.stMat[1][1] * pst_MTM->st_UVDynamicPos.stMat[1][1];
|
|
}
|
|
}
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Set texture for a given stage
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_Material_fn_lSetTexture( ACP_tdxHandleOfMaterial _hVisualMat, long _lIndex, struct GLI_tdstTexture_ *_p_stTexture )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
long i;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
if ( (_lIndex < 0) || (_lIndex >= 8) )
|
|
return 0;
|
|
|
|
_hVisualMat->a_stMultiMaterial[_lIndex].pst_Texture = _p_stTexture;
|
|
for (i = 7; i >= 0; i-- )
|
|
{
|
|
_hVisualMat->a_stMultiMaterial[i].c_Flags = 0;
|
|
if (_hVisualMat->a_stMultiMaterial[i].pst_Texture != NULL )
|
|
break;
|
|
}
|
|
for ( --i ; i >= 0; i-- )
|
|
_hVisualMat->a_stMultiMaterial[i].c_Flags |= C_MTMF_cIsNotLastTexture;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Set texture operation between stage _lIndex and stage _lIndex + 1
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_Material_fn_lSetTextureOp( ACP_tdxHandleOfMaterial _hVisualMat, long _lIndex, long _lTextureOp )
|
|
{
|
|
if ( (_lIndex < 0) || (_lIndex >= 8) )
|
|
return 0;
|
|
_hVisualMat->a_stMultiMaterial[ _lIndex ].c_Operator = (char) _lTextureOp;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Set texture operation between stage _lIndex and stage _lIndex + 1
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_Material_fn_lSetUVFunction
|
|
(
|
|
ACP_tdxHandleOfMaterial _hVisualMat, long _lCanal, long _lFunc,
|
|
float _fScaleU, float _fScaleV,
|
|
float _fAlphaSpeed, float _fAlpha,
|
|
float _fSpeedU, float _fSpeedV,
|
|
float _fOffsetU, float _fOffsetV
|
|
)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
GLI_tdstMultiTextureMaterial *pst_MTM;
|
|
float fCos, fSin;
|
|
float fMat[2][2];
|
|
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
if ( (_lCanal < 0) || (_lCanal >= 8) )
|
|
return 0;
|
|
|
|
pst_MTM = _hVisualMat->a_stMultiMaterial + _lCanal;
|
|
pst_MTM->c_UVSource = (char) _lFunc;
|
|
|
|
pst_MTM->st_UVStaticPos.stMat[0][0] = _fScaleU;
|
|
pst_MTM->st_UVStaticPos.stMat[1][1] = _fScaleV;
|
|
if ( (_fScaleU != 1.0f) && (_fScaleV != 1.0f) )
|
|
pst_MTM->c_Flags |= C_MTMF_cUVStaticMatEnable;
|
|
|
|
if ( _fAlpha != 0.0f )
|
|
{
|
|
fCos = (float) cos( _fAlpha );
|
|
fSin = (float) sin( _fAlpha );
|
|
|
|
memcpy( fMat, &pst_MTM->st_UVStaticPos, 4 * sizeof( float ) );
|
|
|
|
pst_MTM->st_UVStaticPos.stMat[0][0] = fMat[0][0] * fCos;
|
|
pst_MTM->st_UVStaticPos.stMat[0][1] = fMat[0][0] * fSin;
|
|
pst_MTM->st_UVStaticPos.stMat[1][0] = -fMat[1][1] * fSin;
|
|
pst_MTM->st_UVStaticPos.stMat[1][1] = fMat[1][1] * fCos;
|
|
|
|
pst_MTM->c_Flags |= C_MTMF_cUVStaticMatEnable;
|
|
}
|
|
|
|
if ( _fAlphaSpeed != 0.0f )
|
|
{
|
|
fCos = (float) cos( _fAlphaSpeed );
|
|
fSin = (float) sin( _fAlphaSpeed );
|
|
|
|
memcpy( fMat, &pst_MTM->st_UVDynamicPos, 4 * sizeof( float ) );
|
|
|
|
pst_MTM->st_UVDynamicPos.stMat[0][0] = fMat[0][0] * fCos;
|
|
pst_MTM->st_UVDynamicPos.stMat[0][1] = fMat[0][0] * fSin;
|
|
pst_MTM->st_UVDynamicPos.stMat[1][0] = - fMat[1][1] * fSin;
|
|
pst_MTM->st_UVDynamicPos.stMat[1][1] = fMat[1][1] * fCos;
|
|
|
|
pst_MTM->c_Flags |= C_MTMF_cUVDynamicMatEnable;
|
|
}
|
|
|
|
if ( (_fOffsetU != 0.0f) || (_fOffsetV != 0.0f ) )
|
|
{
|
|
pst_MTM->st_UVStaticPos.stTrans[0] = _fOffsetU;
|
|
pst_MTM->st_UVStaticPos.stTrans[1] = _fOffsetV;
|
|
pst_MTM->c_Flags |= C_MTMF_cUVStaticTransEnable;
|
|
}
|
|
|
|
if ( (_fSpeedU != 0.0f) || (_fSpeedV != 0.0f ) )
|
|
{
|
|
pst_MTM->st_UVDynamicPos.stTrans[0] = _fSpeedU;
|
|
pst_MTM->st_UVDynamicPos.stTrans[1] = _fSpeedV;
|
|
pst_MTM->c_Flags |= C_MTMF_cUVDynamicTransEnable;
|
|
}
|
|
}
|
|
|
|
#ifndef RETAIL
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Set texture operation between stage _lIndex and stage _lIndex + 1
|
|
The operation is given by string
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_Material_fn_lSetTextureOpWithString( ACP_tdxHandleOfMaterial _hVisualMat, long _lIndex, char *_szOpString )
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
long i;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
/*
|
|
* find UVFunc
|
|
*/
|
|
for (i = 0; i < C_lNumberOfOp; i++ )
|
|
{
|
|
if ( stricmp( _szOpString, gas_szOpDesc[ i ] ) == 0 )
|
|
return GLI_Material_fn_lSetTextureOp( _hVisualMat, _lIndex, i );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
/*
|
|
----------------------------------------------------------------------------------------
|
|
Description : Set UV computation for stage _lCanal. the function is given by a string
|
|
----------------------------------------------------------------------------------------
|
|
*/
|
|
long GLI_Material_fn_lSetUVFuncWithString
|
|
(
|
|
ACP_tdxHandleOfMaterial _hVisualMat, long _lCanal, char *_szFuncString,
|
|
float _fScaleU, float _fScaleV,
|
|
float _fAlphaSpeed, float _fAlpha,
|
|
float _fSpeedU, float _fSpeedV,
|
|
float _fOffsetU, float _fOffsetV
|
|
)
|
|
{
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
long i;
|
|
/*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/
|
|
|
|
|
|
/*
|
|
* find UVFunc
|
|
*/
|
|
for (i = 0; i < C_lNumberOfUVSource; i++ )
|
|
{
|
|
if ( stricmp( _szFuncString, gas_szUVSourceDesc[i] ) == 0 )
|
|
return GLI_Material_fn_lSetUVFunction( _hVisualMat, _lCanal, i, _fScaleU, _fScaleV, _fAlphaSpeed, _fAlpha, _fSpeedU, _fSpeedV, _fOffsetU, _fOffsetV );
|
|
}
|
|
|
|
return 0;
|
|
}
|
|
|
|
#endif /*RETAIL*/
|
|
|
|
#endif /*MULTI_TEXTURE*/
|
|
|
|
|
|
tdstEngineObject *g_AlphabetCharacterPointer = NULL;
|
|
|
|
/* ACP_tdxHandleOfMaterial GLI_pGetVisualMaterialForLetter( int c ) */
|
|
void *GLI_pGetVisualMaterialForLetter( int c )
|
|
{
|
|
|
|
PO_tdstPhysicalObject *Po;
|
|
tdxHandleToObjectsTablesList d_stObjectsTable;
|
|
GEO_tdstGeometricObject *pObj;
|
|
GEO_tdstElementIndexedTriangles *pIT;
|
|
|
|
if( ! g_AlphabetCharacterPointer ) return NULL;
|
|
|
|
d_stObjectsTable = g_AlphabetCharacterPointer->h_3dData->h_CurrentObjectsTable;
|
|
|
|
if( c > d_stObjectsTable->wNumberOfElement ) return NULL;
|
|
|
|
Po = (PO_tdstPhysicalObject *) (d_stObjectsTable->d_stObjectsTable[c].h_Target);
|
|
if (Po==NULL) return NULL;
|
|
pObj=Po->_hVisualSet->d_p_stLodDefinitions[0];
|
|
|
|
if (pObj==NULL) return NULL;
|
|
|
|
if (pObj->xNbElements==1)
|
|
{
|
|
if (pObj->d_xListOfElementsTypes[0]==GEO_C_xElementIndexedTriangles)
|
|
{
|
|
pIT=(GEO_tdstElementIndexedTriangles *)pObj->d_stListOfElements[0];
|
|
return pIT->hMaterial->hVisualMaterial;
|
|
}
|
|
}
|
|
return NULL;
|
|
}
|
|
|
|
|
|
#ifdef __cplusplus
|
|
} /*extern "C"*/
|
|
#endif
|
|
|