reman3/Rayman_X/cpa/tempgrp/GAM/Actions/3dData.c

986 lines
34 KiB
C

/*=========================================================================
* 3dData.cpp : 3dData's functions
*
*
*
* 3dData MUST BE REPLACE BY THE C FILENAME
*
*
* Version 1.0
* Creation date 01/10/96
* Revision date
*
* That file needs to be compatible for all platforms.
*
* (c) Ubi Studios 1996
*=======================================================================*/
/*******************************************************/
/**** For the structures and variables declarations ****/
/*******************************************************/
#define D_3dData_StructureDefine
#define D_3dData_VariableDefine
#include "ToolsCPA.h"
#include "Options/Options.h"
#include "Macros.h"
#include "Structur/StdObjSt.h"
#include "Actions/AllActs.h"
#include "Structur/3DOSLkTb.h"
#include "Structur/MemGame.h"
#include "Structur/ErrGame.h"
#include "Structur/GameScpt.h"
#include "Structur/EngMode.h"
#include "Structur/Objects.h"
#include "Structur/State.h"
#include "Structur/Anim_s.h"
#include "Structur/objstbls.h"
#include "PlayAnim/PlayAnim.h"
#include "GameEng.h"
#include "Basic.h"
#include "ChanList.h"
#include "ObjInit.h"
#include "ObjType.h"
#include "ZdxStuff.h"
#include "ZeMem.h"
#include "Family.h"
#include "TBLLoad.h"
/*-----------------------------------------------------------------------------
* Description : 3dData object action script callback
*-----------------------------------------------------------------------------
* Input : Object pointer
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
#if defined(GAM_USE_SCRIPT)
SCR_tde_Anl_ReturnValue fn_e3dDataScriptCallBack(SCR_tdst_File_Description *_p_stFile,char *_p_szName,char *_ap_szParams[],SCR_tde_Anl_Action _eAction)
{
SCR_tde_Anl_ReturnValue eReturnValue = SCR_ERV_Anl_NormalReturn;
MS_tdxHandleTo3dData h_3dData;
struct tdstEngineObject_ *p_stEngineObject;
GLD_tdstDeviceAttributes stDevAttrib;
_p_stFile=_p_stFile;
SCR_M_RdL0_GetSectionLong(C_ParentSection,0,struct tdstEngineObject_ *, p_stEngineObject);
if (M_IsTitle)
{
MMG_fn_vBeginMemoryInfo (MMG_C_lTypeMiniStructure , MMG_C_lSubType3dData , p_stEngineObject);
h_3dData = fn_h_3dDataRealAlloc();
MMG_fn_vEndMemoryInfo ();
p_stEngineObject->h_3dData = h_3dData;
SCR_M_RdL0_SetContextLong(C_ParentContext,0,NULL);
SCR_M_RdL0_SetSectionLong(C_ThisSection,0,h_3dData);
}
else if (M_IsEntry)
{
SCR_M_RdL0_GetSectionLong(C_ThisSection,0,MS_tdxHandleTo3dData,h_3dData);
if (M_ActionIs(C_Entry3dDataInitialState))
{
char szCompletFileName[_MAX_PATH];
tdxHandleToState h_InitialState;
strcpy(szCompletFileName,fn_szGetFamiliesDataPath());
strcat(szCompletFileName,"\\");
strcat(szCompletFileName,_ap_szParams[0]);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeMiniStructure , MMG_C_lSubType3dData , p_stEngineObject);
h_InitialState = (tdxHandleToState) TMP_M_p_Malloc(strlen(szCompletFileName)+1);
strcpy((char *)h_InitialState,szCompletFileName);
fn_v3dDataSetInitialState(h_3dData,h_InitialState);
}
else if (M_ActionIs(C_Entry3dDataInitialObjectsTable))
{
/*char szFileName[_MAX_PATH];*/
/*SCR_tdst_Link_Value * _p_stLinkValue;*/
/* SCR_tdst_Cxt_Values *p_stVal;*/
/*p_stFamily = fn_h3dDataGetFamily(h_3dData);*/
// Shaitan => module list in the level
char * p_szInitialObjectTable;
// End Shaitan => module list in the level
/*sprintf(szFileName,"%s\\%s.tbl",fn_szFindFamilyTypeNameOfFamilyType(p_stFamily->otObjectFamilyType),_ap_szParams[0]);*/
if (SCR_fn_c_RdL0_IsSectionExists(_ap_szParams[0]))
{
// Shaitan => module list in the level
p_szInitialObjectTable = (char *) malloc (strlen(_ap_szParams[0]) * sizeof (char));
strcpy(p_szInitialObjectTable, _ap_szParams[0]);
SCR_M_RdL0_SetContextLong(C_ParentContext,0,(long)p_szInitialObjectTable);
/*
p_stVal = SCR_fnp_st_RdL0_AnalyseSection(_ap_szParams[0], SCR_CDF_uw_Anl_Normal);
SCR_M_RdL0_SetContextLong(C_ParentContext,0,SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0));
*/
// End Shaitan => module list in level
}
}
else if( M_ActionIs(C_Entry3dDataShadowTexture) )
{
M_CheckScriptParamNumber(3);
GLD_bGetDeviceAttributes(
g_stEngineStructure.hGLDDevice,&stDevAttrib);
GLI_xLoadTexture( &h_3dData->p_stShadowTexture,&stDevAttrib,
_ap_szParams[0],
fn_lAToI(_ap_szParams[1]),
fn_lAToI(_ap_szParams[2]) );
}
else if( M_ActionIs(C_Entry3dDataShadowMaterial) )
{
SCR_tdst_Cxt_Values *p_stVal;
M_CheckScriptParamNumber(1);
p_stVal = SCR_fnp_st_RdL0_AnalyseSection(_ap_szParams[0],
SCR_CDF_uw_Anl_Normal);
h_3dData->p_stShadowMaterial = (GMT_tdxHandleToGameMaterial) SCR_M_ul_RdL0_ExtractLongValue(p_stVal,0);
/*
* VL : to manage with mirrored shadow texture
*/
{
ACP_tdxHandleOfMaterial hVisualMat;
GLI_tdstTexture *p_stTexture;
unsigned char ucCyclingMode;
hVisualMat = GMT_fn_hGetVisualMaterial( h_3dData->p_stShadowMaterial );
if (hVisualMat)
{
GLI_xGetMaterialTexture( hVisualMat, &p_stTexture );
if (p_stTexture)
{
ucCyclingMode = TEX_ucGetTextureCyclingMode( p_stTexture );
ucCyclingMode |= GLI_C_lSpecialMirrorForShadow;
TEX_vSetTextureCyclingMode( p_stTexture, ucCyclingMode );
}
}
}
}
else if( M_ActionIs(C_Entry3dDataShadowScale) )
{
M_CheckScriptParamNumber(2);
fn_v3dDataSetShadowScaleX(h_3dData, fn_fAToF(_ap_szParams[0]));
fn_v3dDataSetShadowScaleY(h_3dData, fn_fAToF(_ap_szParams[1]));
}
else if( M_ActionIs(C_Entry3dDataShadowHeight) )
{
M_CheckScriptParamNumber(1);
h_3dData->xSHWHeight = fn_fAToF(_ap_szParams[0]);
}
else if( M_ActionIs(C_Entry3dDataDrawMask) )
{
M_CheckScriptParamNumber(1);
h_3dData->lDrawMaskInit = h_3dData->lDrawMask = fn_lAToI(_ap_szParams[0]);
}
/* ANNECY MT - 09/11/98 {
else if( M_ActionIs(C_Entry3dDataBrainComputationFrequency))
{
M_CheckScriptParamNumber(1);
fn_v3dDataSetBrainComputationFrequency(h_3dData,(unsigned char)fn_lAToI(_ap_szParams[0]));
}
END ANNECY MT } */
else if( M_ActionIs(C_Entry3dDataLightComputationFrequency))
{
M_CheckScriptParamNumber(1);
fn_v3dDataSetLightComputationFrequency(h_3dData,(unsigned char)fn_lAToI(_ap_szParams[0]));
}
}
return(eReturnValue);
}
#endif /* GAM_USE_SCRIPT */
/*-----------------------------------------------------------------------------
* Description : 3dData's mini-structure sizeof
*-----------------------------------------------------------------------------
* Input : None
* Output : Size of
*-----------------------------------------------------------------------------
* Creation date : 14/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
/*-----------------------------------------------------------------------------
* Description : 3dData object action allocation
*-----------------------------------------------------------------------------
* Input : Object pointer
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_v3dDataAlloc(struct tdstEngineObject_ *p_stObject)
{
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
if (p_stObject->h_3dData!=NULL)
M_GameFatalError(E_uwGameMiniStructAllocAlreadyAlloc);
MMG_fn_vBeginMemoryInfo (MMG_C_lTypeMiniStructure , MMG_C_lSubType3dData , p_stObject);
p_stObject->h_3dData = fn_h_3dDataRealAlloc();
MMG_fn_vEndMemoryInfo ();
fn_v3dDataInitValueSAI(p_stObject->h_3dData);
}
/*HP 271098*/
#ifdef U64
static unsigned short uwBrainMainCounter=0;
#endif
/*----------------------------------------------------*/
MS_tdxHandleTo3dData fn_h_3dDataRealAlloc()
{
MS_tdxHandleTo3dData h_3dData;
h_3dData = (MS_tdxHandleTo3dData)M_p_GameMallocInHLM(fn_ul3dDataSizeOf());
POS_fn_vSetIdentityMatrix(fn_p_st3dDataGetMatrix(h_3dData));
fn_v3dDataSetFlagEndState(h_3dData,FALSE);
fn_v3dDataSetFlagEndOfAnim(h_3dData,FALSE);
fn_v3dDataSetFlagModifState(h_3dData,FALSE);
fn_v3dDataSetForcedFrame(h_3dData,0);
/* ANNECY MT - 22/09/98 {*/
fn_p_st3dDataGetCurrentFrame (h_3dData) -> p_stArrayOfElts3d = NULL;
fn_v3dDataSetSizeOfArrayOfElts3d (h_3dData , 0);
h_3dData->hMorphChannelList = NULL;
/* END ANNECY MT }*/
fn_v3dDataSetStateInLastFrame(h_3dData,NULL);
fn_v3dDataSetWantedState(h_3dData,NULL);
fn_v3dDataSetCurrentState(h_3dData,NULL);
fn_v3dDataSetCurrentObjectsTable(h_3dData,NULL);
fn_v3dDataSetInitialObjectsTable(h_3dData,NULL);
h_3dData->ulStartTime=g_stEngineStructure.stEngineTimer.ulCurrentTimerCount;
h_3dData->bSkipCurrentFrame=FALSE;
h_3dData->ulTimeDelay=0;
h_3dData->sLastFrame=-1;
h_3dData->bStateJustModified=FALSE;
h_3dData->uwNbEngineFrameSinceLastMechEvent=LME_INVALID;
h_3dData->ucFrameRate=0;
/* Zdx drawing management */
#if defined (_DEBUG)
h_3dData->lZdxMask = C_lAllZdxAreOn;
#endif
/* Draw mask initialisation */
h_3dData->lDrawMask = GLI_C_lAllIsEnable;
h_3dData->lDrawMaskInit = GLI_C_lAllIsEnable;
#ifdef D_USE_LIPSYNC
h_3dData->hLipsTable=NULL;
#endif
fn_v3dDataSetShadowScaleX(h_3dData, 1.0f);
fn_v3dDataSetShadowScaleY(h_3dData, 1.0f);
/*XB unused field in U64 engine*/
#ifndef U64
fn_v3dDataSetShadowQuality(h_3dData, 2);
fn_v3dDataSetShadowTexture(h_3dData, NULL);
fn_v3dDataSetShadowMaterial(h_3dData, NULL);
#endif /* U64 */
/*End XB*/
#if !defined(U64)
MTH3D_M_vNullVector(fn_p_st3dDataGetSHWDeformationVector(h_3dData));
*fn_p_x3dDataGetSHWHeight(h_3dData) = MTH_M_xFloatToReal(0.2f);
#endif /* U64*/
/* ANNECY MT - 12/06/98 {*/
fn_v3dDataSetBrainComputationFrequency(h_3dData,1);
h_3dData->cBrainCounter = -1;
#ifdef U64
uwBrainMainCounter=uwBrainMainCounter%16;
h_3dData->uwBrainMainCounter = ++uwBrainMainCounter;
#else
h_3dData->uwBrainMainCounter = (unsigned short) RND_fn_lGetLongRandomValue(0,1,(long) 17);
#endif
#if !defined(U64)
fn_v3dDataSetLightComputationFrequency(h_3dData,1);
h_3dData->cLightCounter = -1;
#endif /* U64*/
/* END ANNECY MT }*/
h_3dData->ucTransparency = 255;
return(h_3dData);
}
/*-----------------------------------------------------------------------------
* Description : 3dData object action free
*-----------------------------------------------------------------------------
* Input : Object pointer
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_v3dDataFree(struct tdstEngineObject_ *p_stObject)
{
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
if (p_stObject->h_3dData==NULL)
M_GameFatalError(E_uwGameMiniStructNull);
fn_v3dDataFreeInitValueSAI(p_stObject->h_3dData);
PLA_fn_vDesInitAllChildOfCharacter(NULL,p_stObject);
fn_vFreeMorphList(&(p_stObject->h_3dData->hMorphChannelList));
MMG_fn_vAddMemoryInfo( MMG_C_lTypeMiniStructure , MMG_C_lSubType3dData , p_stObject );
M_GameFreeInHLM(p_stObject->h_3dData);
}
/*-----------------------------------------------------------------------------
* Description : 3dData object action initialisation
*-----------------------------------------------------------------------------
* Input : When this function's called (see ObjInit.h)
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications : 24/05/98 break link with a Father-Perso Carlos Torres
* Modifications : 28/08/98 Destroy hierarchy module when reinit the map - Carlos Torres
*---------------------------------------------------------------------------*/
void fn_v3dDataInit(struct tdstEngineObject_ *p_stObject,enum tdeObjectTreeInit_ eObjectInit)
{
tdxHandleToObjectsTablesList hOTLE; /* MR0707*/
/* tdstAChannel *p_stChannel, *p_stChannelStop;*/
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
if (p_stObject->h_3dData==NULL)
M_GameFatalError(E_uwGameMiniStructNull);
/*stdgame uses the global matrix to initialize itself, so reinit it as well, is possible*/
if ( (eObjectInit == OTI_LoadSavedGame) || (eObjectInit == OTI_Always) )
{
HIE_tdxHandleToSuperObject hFather,hCharacter;
/*reset the local matrix*/
fn_v3dDataSetMatrix(p_stObject->h_3dData,fn_p_st3dDataGetMatrixInit(p_stObject->h_3dData));
hCharacter = fn_h_StandardGameGetSuperObject(p_stObject->h_StandardGame);
/*we have to test for this because Always dont have a back pointer to their superobjects...*/
if ( hCharacter && (hFather = HIE_fn_hGetSuperObjectFather(hCharacter)) != NULL ) /*VOLUNTARY ASSIGNMENT!!!*/
{
/*compute the global matrix from the local matrix and the position of the actor's father*/
POS_fn_vMulMatrixMatrix(
fn_p_st3dDataGetAbsoluteMatrix(p_stObject->h_3dData),
HIE_fn_hGetSuperObjectGlobalMatrix(hFather),
fn_p_st3dDataGetMatrix(p_stObject->h_3dData)
);
/*
// prevent link with another charcter disturbing position init
if (HIE_fn_ulGetSuperObjectType(hFather)==C_ucCharacter)
fn_vReputCharacterSuperObjectAtTheWorld(hCharacter);
*/
}
}
/**** Reinit the initial transparency ****/
{
HIE_tdxHandleToSuperObject h_SupObject;
h_SupObject = M_GetSuperObject(p_stObject);
if (h_SupObject)
{
h_SupObject->fTransparenceLevel = (float)p_stObject->h_3dData->ucTransparency;
}
}
switch(eObjectInit)
{
case OTI_WhenGameStart:
break;
case OTI_MapLoaded:
fn_v3dDataInitValueSAI(p_stObject->h_3dData);
fn_v3dDataSavedValueSAI(p_stObject->h_3dData);
p_stObject->h_3dData->hArrayOfChannels = NULL;
p_stObject->h_3dData->ulNumberOfChannels = p_stObject->h_3dData->h_Family->ulNumberOfChannels;
case OTI_LoadSavedGame:
case OTI_PlayerDead:
case OTI_ReinitTheMap:
p_stObject->h_3dData->bAnimMatrixChanged = TRUE;
fn_vTakeControlOfChannel(p_stObject, (unsigned short) -1, FALSE); /*ANNECY BBB*/
fn_v3dDataSetStartTime(p_stObject->h_3dData,0);
fn_v3dDataSetTimeDelay(p_stObject->h_3dData,0);
fn_v3dDataSetTimePreviousFrame(p_stObject->h_3dData,0);
/* remove all hierarchy links*/
PLA_fn_vDesInitAllChildOfCharacter(M_GetSuperObject(p_stObject),p_stObject);
#ifdef U64
/*HP 301098*/
uwBrainMainCounter=0;
#endif
memset(&p_stObject->h_3dData->stFrame3d,0,sizeof(struct tdstFrame3d_));
fn_v3dDataSetCurrentHieCouples(p_stObject->h_3dData,NULL);
fn_v3dDataSetCurrentHieNbCouples(p_stObject->h_3dData,0);
fn_v3dDataSetSizeOfArrayOfElts3d(p_stObject->h_3dData,0);
p_stObject->h_3dData->lLastComputeFrame=0;
p_stObject->h_3dData->bStateJustModified=FALSE;
fn_v3dDataSetFrameRate(p_stObject->h_3dData,0);
#ifdef D_USE_LIPSYNC
fn_v3dDataSetLipsTable(p_stObject->h_3dData,NULL);
#endif
fn_v3dDataSetCurrentState(p_stObject->h_3dData,NULL);
p_stObject->h_3dData->stFrame3d.p_stArrayOfElts3d = NULL;
p_stObject->h_3dData->stFrame3d.p_stAnim = NULL;
p_stObject->h_3dData->lDrawMask = p_stObject->h_3dData->lDrawMaskInit;
p_stObject->h_3dData->cBrainCounter = -1;
p_stObject->h_3dData->bSkipCurrentFrame = FALSE;
#if !defined(U64)
p_stObject->h_3dData->cLightCounter = -1;
#endif /* U64*/
case OTI_AlwaysCreated:
fn_vInitMorphList(&(p_stObject->h_3dData->hMorphChannelList));
hOTLE=fn_h3dDataGetInitialObjectsTable(p_stObject->h_3dData);
#if !defined(U64)
if (hOTLE&&fn_d_hGetInitObjectsTable(hOTLE)) fn_vReInitObjectTable(hOTLE);
#endif /* U64*/
#ifdef U64
uwBrainMainCounter=uwBrainMainCounter%16;
p_stObject->h_3dData->uwBrainMainCounter = ++uwBrainMainCounter;
#else
p_stObject->h_3dData->uwBrainMainCounter = (unsigned short) RND_fn_lGetLongRandomValue(0,1,(long) 17);
#endif
/* ANNECY MT - 09/11/98 {*/
fn_v3dDataSetBrainComputationFrequency(p_stObject->h_3dData,1);
/* END ANNECY MT }*/
break;
}
if (M_GetSuperObject(p_stObject)!=NULL)
{
PLA_fn_vInitNewState(M_GetSuperObject(p_stObject),fn_h3dDataGetInitialState(p_stObject->h_3dData));
HIE_fn_vSetSuperObjectDrawMask(M_GetSuperObject(p_stObject),p_stObject->h_3dData->lDrawMask);
}
}
/*-----------------------------------------------------------------------------
* Description : 3dData object action desinitialisation
*-----------------------------------------------------------------------------
* Input : When this function's called (see ObjInit.h)
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_v3dDataDesinit(struct tdstEngineObject_ *p_stObject,enum tdeObjectTreeInit_ eObjectInit)
{
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
if (p_stObject->h_3dData==NULL)
M_GameFatalError(E_uwGameMiniStructNull);
/* if (p_stObject->h_3dData->stFrame3d.p_stArrayOfElts3d)
{
//MMG_fn_vAddMemoryInfo( MMG_C_lTypeFamily , MMG_C_lSubTypeAnimation , p_stObject->h_3dData->h_Family);
//TMP_M_Free(p_stObject->h_3dData->stFrame3d.p_stArrayOfElts3d);
//fn_v3dDataSetSizeOfArrayOfElts3d(p_stObject->h_3dData,0);
//p_stObject->h_3dData->stFrame3d.p_stArrayOfElts3d = NULL;
p_stObject->h_3dData->stFrame3d.p_stAnim = NULL;
fn_vFreeArrayOfElts3d(p_stObject -> h_3dData);
}
*/
/* Olivier Didelot le 1 juillet 1998*/
/* PLA_fn_vDesInitAllChildOfCharacterByEngineobject(p_stObject);*/
switch(eObjectInit)
{
case OTI_ReinitTheMap:
break;
case OTI_MapLoaded:
PLA_fn_vDesInitAllChildOfCharacter(M_GetSuperObject(p_stObject),p_stObject);
fn_vFreeMorphList(&(p_stObject->h_3dData->hMorphChannelList));
break;
case OTI_PlayerDead:
break;
default:
break;
}
}
unsigned long fn_ul3dDataSizeOf()
{
return(sizeof(struct tdst3dData_));
}
/*************************************************************************/
/*#define M_3dData_SAIFlags (SAI_eInitWhenPlayerDead|SAI_eInitWhenReinitTheMap|SAI_eInitWhenMapLoaded|SAI_eInitWhenPlayerGameSavedLoaded)*/
void fn_v3dDataInitValueSAI(MS_tdxHandleTo3dData h_3dData)
{
SAI_fn_bInsertArrayInTable((void*)&h_3dData->stGLIObjectMatrix,sizeof(POS_tdstCompletePosition),M_3dData_SAIFlags);
/* ANNECY AV {*/
/* We don't need to save these variables
// ANNECY MT - 12/06/98 {
SAI_fn_bInsertCharInTable((void*)&h_3dData->ucBrainComputationFrequency,M_3dData_SAIFlags);
SAI_fn_bInsertCharInTable((void*)&h_3dData->ucLightComputationFrequency,M_3dData_SAIFlags);
// END ANNECY MT }
*/
/* END ANNECY AV }*/
}
/*************************************************************************/
void fn_v3dDataSavedValueSAI(MS_tdxHandleTo3dData h_3dData)
{
}
/*************************************************************************/
void fn_v3dDataFreeInitValueSAI(MS_tdxHandleTo3dData h_3dData)
{
SAI_fn_bRemoveValueFromTable((void*)&h_3dData->stGLIObjectMatrix,M_3dData_SAIFlags);
/* ANNECY AV {*/
/* We don't need to save these variables
// ANNECY MT - 12/06/98 {
SAI_fn_bRemoveValueFromTable((void*)&h_3dData->ucBrainComputationFrequency,M_3dData_SAIFlags);
SAI_fn_bRemoveValueFromTable((void*)&h_3dData->ucLightComputationFrequency,M_3dData_SAIFlags);
// END ANNECY MT }
*/
/* END ANNECY AV }*/
}
/*************************************************************************/
/*************************************/
/**** Access functions for Editor ****/
/*************************************/
/*************************************************************************/
/* END ANNECY MT }*/
/*#undef M_3dData_SAIFlags*/
/*************************************************************************/
/*-----------------------------------------------------------------------------
* Description : 3dData copy clone action
*-----------------------------------------------------------------------------
* Input : Handle to destination, handle to source
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 30/06/97 Author : Olivier Jourdan
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_v3dDataCopyClone(struct tdstEngineObject_ * _p_stObjectDest,struct tdstEngineObject_ * _p_stObjectSrc)
{
void * pv_tmp1 = _p_stObjectDest->h_3dData->hArrayOfChannels;
void * pv_tmp2 = _p_stObjectDest->h_3dData->stFrame3d.p_stArrayOfElts3d;
void * pv_tmp3 = _p_stObjectDest->h_3dData->hFirstActiveChannel;
void * pv_tmp4 = _p_stObjectDest->h_3dData->hMorphChannelList;
unsigned short wSize = fn_w3dDataGetSizeOfArrayOfElts3d(_p_stObjectDest->h_3dData);
/* If 3dData doesn't contains pointers to structure that may be*/
/* changed during the game, this function must only be a :*/
memcpy(_p_stObjectDest->h_3dData,_p_stObjectSrc->h_3dData,fn_ul3dDataSizeOf());
/* to hold these values...*/
_p_stObjectDest->h_3dData->hArrayOfChannels = pv_tmp1;
_p_stObjectDest->h_3dData->stFrame3d.p_stArrayOfElts3d = pv_tmp2;
_p_stObjectDest->h_3dData->hFirstActiveChannel = pv_tmp3;
_p_stObjectDest->h_3dData->hMorphChannelList = pv_tmp4;
fn_v3dDataSetSizeOfArrayOfElts3d(_p_stObjectDest->h_3dData,wSize);
}
/*-----------------------------------------------------------------------------
* Description : 3dData access functions
*-----------------------------------------------------------------------------
* Input : MS_tdxHandleTo3dData + (value)
* Output : (value or pointer)
*-----------------------------------------------------------------------------
* Creation date : 29/01/97 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
/****************************/
#if defined (ACTIVE_EDITOR)
MTH_tdxReal fn_v3dDataGetMatrixElement(MS_tdxHandleTo3dData h_3dData,unsigned char ucInitOrLocalOrAbsolute,unsigned char ucWhichMatrix,unsigned char ucWhichVector,unsigned char ucWhichElement)
{
MTH_tdxReal xReturn = 0.0;
MTH3D_tdstVector stI;
MTH3D_tdstVector stJ;
MTH3D_tdstVector stK;
if (ucWhichMatrix==0) /* Translation*/
{
if (ucInitOrLocalOrAbsolute==0) /*Init*/
{
POS_fn_vGetTranslationVector(fn_p_st3dDataGetMatrixInit(h_3dData),&stI);
POS_fn_vGetTranslationVector(fn_p_st3dDataGetMatrixInit(h_3dData),&stJ);
POS_fn_vGetTranslationVector(fn_p_st3dDataGetMatrixInit(h_3dData),&stK);
}
else if (ucInitOrLocalOrAbsolute==1) /*Local*/
{
POS_fn_vGetTranslationVector(&(h_3dData->stGLIObjectMatrix),&stI);
POS_fn_vGetTranslationVector(&(h_3dData->stGLIObjectMatrix),&stJ);
POS_fn_vGetTranslationVector(&(h_3dData->stGLIObjectMatrix),&stK);
}
else if (ucInitOrLocalOrAbsolute==2) /*Absolute*/
{
POS_fn_vGetTranslationVector((h_3dData->p_stGLIObjectAbsoluteMatrix),&stI);
POS_fn_vGetTranslationVector((h_3dData->p_stGLIObjectAbsoluteMatrix),&stJ);
POS_fn_vGetTranslationVector((h_3dData->p_stGLIObjectAbsoluteMatrix),&stK);
}
}
else if (ucWhichMatrix==1) /* Rotation*/
{
if (ucInitOrLocalOrAbsolute==0) /*Init*/
{
POS_fn_vGetRotationMatrix(fn_p_st3dDataGetMatrixInit(h_3dData),&stI,&stJ,&stK);
}
else if (ucInitOrLocalOrAbsolute==1) /*Local*/
{
POS_fn_vGetRotationMatrix(&(h_3dData->stGLIObjectMatrix),&stI,&stJ,&stK);
}
else if (ucInitOrLocalOrAbsolute==2) /*Absolute*/
{
POS_fn_vGetRotationMatrix((h_3dData->p_stGLIObjectAbsoluteMatrix),&stI,&stJ,&stK);
}
}
else if (ucWhichMatrix==2) /* Scale*/
{
if (ucInitOrLocalOrAbsolute==0) /*Init*/
{
POS_fn_vGetScaleMatrix(fn_p_st3dDataGetMatrixInit(h_3dData),&stI,&stJ,&stK);
}
else if (ucInitOrLocalOrAbsolute==1) /*Local*/
{
POS_fn_vGetScaleMatrix(&(h_3dData->stGLIObjectMatrix),&stI,&stJ,&stK);
}
else if (ucInitOrLocalOrAbsolute==2) /*Absolute*/
{
POS_fn_vGetScaleMatrix((h_3dData->p_stGLIObjectAbsoluteMatrix),&stI,&stJ,&stK);
}
if (MTH_M_bEqualWithEpsilon(stI.xX,MTH_C_ONE,MTH_M_xFloatToReal(0.001f)))
MTH3D_M_vSetBaseIVector(&stI);
if (MTH_M_bEqualWithEpsilon(stJ.xY,MTH_C_ONE,MTH_M_xFloatToReal(0.001f)))
MTH3D_M_vSetBaseJVector(&stJ);
if (MTH_M_bEqualWithEpsilon(stK.xZ,MTH_C_ONE,MTH_M_xFloatToReal(0.001f)))
MTH3D_M_vSetBaseKVector(&stK);
}
if (ucWhichVector==0) /* I*/
{
if (ucWhichElement==0) /* X*/
xReturn=MTH3D_M_xGetXofVector(&stI);
else if (ucWhichElement==1) /* Y*/
xReturn=MTH3D_M_xGetYofVector(&stI);
else if (ucWhichElement==2) /* Z*/
xReturn=MTH3D_M_xGetZofVector(&stI);
}
else if (ucWhichVector==1) /* J*/
{
if (ucWhichElement==0) /* X*/
xReturn=MTH3D_M_xGetXofVector(&stJ);
else if (ucWhichElement==1) /* Y*/
xReturn=MTH3D_M_xGetYofVector(&stJ);
else if (ucWhichElement==2) /* Z*/
xReturn=MTH3D_M_xGetZofVector(&stJ);
}
else if (ucWhichVector==2) /* K*/
{
if (ucWhichElement==0) /* X*/
xReturn=MTH3D_M_xGetXofVector(&stK);
else if (ucWhichElement==1) /* Y*/
xReturn=MTH3D_M_xGetYofVector(&stK);
else if (ucWhichElement==2) /* Z*/
xReturn=MTH3D_M_xGetZofVector(&stK);
}
return(xReturn);
}
#endif /*ACTIVE_EDITOR*/
#if defined (ACTIVE_EDITOR)
/*void fn_v3dDataSetChannelActivationList(MS_tdxHandleTo3dData h_3dData,CHN_tdxHandleToCASList hCASList)
{
h_3dData->hChannelActivationList=hCASList;
}
*/#endif /*ACTIVE_EDITOR*/
void fn_v3dDataSetFrameRate(MS_tdxHandleTo3dData h_3dData,unsigned char ucFrameRate)
{
unsigned long ulNbFrames;
if (ucFrameRate>1) /* Change the Start Time of the anim in order to preserve the current frame*/
{
ulNbFrames=(g_stEngineStructure.stEngineTimer.ulCurrentTimerCount-h_3dData->ulStartTime)*h_3dData->ucFrameRate;
h_3dData->ulStartTime=g_stEngineStructure.stEngineTimer.ulCurrentTimerCount-ulNbFrames/ucFrameRate;
}
h_3dData->ucFrameRate=ucFrameRate;
}
void fn_v3dDataFactorFrameRate(MS_tdxHandleTo3dData _h3dData,unsigned long _ulFactor100)
{
unsigned long ulNbFrames;
unsigned char ucFrameRate = (unsigned char) (fn_scGetSpeedInState(fn_h3dDataGetCurrentState(_h3dData))*_ulFactor100/100L);
if (ucFrameRate > 1) /* Change the Start Time of the anim in order to preserve the current frame*/
{
ulNbFrames = (g_stEngineStructure.stEngineTimer.ulCurrentTimerCount-_h3dData->ulStartTime)*_h3dData->ucFrameRate;
_h3dData->ulStartTime = g_stEngineStructure.stEngineTimer.ulCurrentTimerCount-ulNbFrames/ucFrameRate;
_h3dData->ucFrameRate = ucFrameRate;
}
}
/* The following function is only used in OAC*/
#if defined (ACTIVE_EDITOR)
GMT_tdxHandleToGameMaterial fn_p_st3dDataGetShadowMaterial(MS_tdxHandleTo3dData _h3dData)
{
return _h3dData->p_stShadowMaterial;
}
#endif
#if defined (ACTIVE_EDITOR)
/****************************/
long fn_l3dDataGetDrawMaskInit(MS_tdxHandleTo3dData _h3dData)
{
return _h3dData->lDrawMaskInit;
}
#endif /*ACTIVE_EDITOR*/
/****************************/
/****************************/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vSetCharacterInvisible(HIE_tdxHandleToSuperObject _hCharacter)
{
if( !M_GetMSHandle(_hCharacter,3dData) )
return;
M_GetMSHandle(_hCharacter,3dData)->lDrawMask =
M_GetMSHandle(_hCharacter,3dData)->lDrawMask &
(GLI_C_lAllIsEnable-GLI_C_lDrawNothing);
HIE_fn_vSetSuperObjectDrawMask(_hCharacter,
M_GetMSHandle(_hCharacter,3dData)->lDrawMask);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/****************************/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vSetCharacterVisible(HIE_tdxHandleToSuperObject _hCharacter)
{
if( !M_GetMSHandle(_hCharacter,3dData) )
return;
M_GetMSHandle(_hCharacter,3dData)->lDrawMask =
M_GetMSHandle(_hCharacter,3dData)->lDrawMask | GLI_C_lDrawNothing;
HIE_fn_vSetSuperObjectDrawMask(_hCharacter,
M_GetMSHandle(_hCharacter,3dData)->lDrawMask);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/* ANNECY MT - 12/06/98 {*/
/****************************/
void fn_v3dDataSetBrainComputationFrequency(MS_tdxHandleTo3dData h_3dData,unsigned char _ucFrequency)
{
h_3dData->ucBrainComputationFrequency = _ucFrequency;
if(h_3dData->cBrainCounter >= h_3dData->ucBrainComputationFrequency)
h_3dData->cBrainCounter = 0;
}
/****************************/
/****************************/
void fn_v3dDataUpdateBrainCounter(HIE_tdxHandleToSuperObject _hCharacter)
{
if(_hCharacter && M_GetMSHandle(_hCharacter,3dData))
{
MS_tdxHandleTo3dData h_3dData = M_GetMSHandle(_hCharacter,3dData);
h_3dData->cBrainCounter ++;
if (h_3dData->cBrainCounter >= h_3dData->ucBrainComputationFrequency)
h_3dData->cBrainCounter = 0;
}
}
/****************************/
ACP_tdxBool fn_b3dDataCanComputeBrain(HIE_tdxHandleToSuperObject _hCharacter)
{
if(_hCharacter && M_GetMSHandle(_hCharacter,3dData))
{
MS_tdxHandleTo3dData h_3dData = M_GetMSHandle(_hCharacter,3dData);
return (ACP_tdxBool)(h_3dData->cBrainCounter==0);
}
return TRUE; /* default*/
}
/****************************/
/****************************/
#if !defined(U64) /* MT {*/
void fn_v3dDataSetLightComputationFrequency(MS_tdxHandleTo3dData h_3dData,unsigned char _ucFrequency)
{
h_3dData->ucLightComputationFrequency = _ucFrequency;
if(h_3dData->cLightCounter >= h_3dData->ucLightComputationFrequency)
h_3dData->cLightCounter = 0;
}
/****************************/
void fn_v3dDataUpdateLightCounter(HIE_tdxHandleToSuperObject _hCharacter)
{
if(_hCharacter && M_GetMSHandle(_hCharacter,3dData))
{
MS_tdxHandleTo3dData h_3dData = M_GetMSHandle(_hCharacter,3dData);
h_3dData->cLightCounter ++;
if (h_3dData->cLightCounter == h_3dData->ucLightComputationFrequency)
h_3dData->cLightCounter = 0;
}
}
/****************************/
ACP_tdxBool fn_b3dDataCanComputeLight(HIE_tdxHandleToSuperObject _hCharacter)
{
/*
if(_hCharacter && M_GetMSHandle(_hCharacter,3dData))
{
MS_tdxHandleTo3dData h_3dData = M_GetMSHandle(_hCharacter,3dData);
return (ACP_tdxBool)(h_3dData->cLightCounter==0);
}
return TRUE; // default
*/
return TRUE;
}
#endif /* U64 - MT }*/
/* END ANNECY MT }*/
/****************************/
BOOL fn_b3dDataGetUserEventFlag(MS_tdxHandleTo3dData h_3dData, unsigned char _ucFlagIndex, MTH3D_tdstVector *_p_stPosition )
{
unsigned char ucMask = (unsigned char) (1 << _ucFlagIndex);
if ( _p_stPosition )
*_p_stPosition = h_3dData->stLastEventGlobalPosition;
return (h_3dData->ucUserEventFlags & ucMask);
}
void fn_v3dDataSetUserEventFlag( MS_tdxHandleTo3dData h_3dData,unsigned char _ucFlagIndex, BOOL _bSet, MTH3D_tdstVector *_p_stPosition )
{
unsigned char ucMask = (unsigned char) (1 << _ucFlagIndex);
if (_bSet)
h_3dData->ucUserEventFlags |= ucMask;
else
h_3dData->ucUserEventFlags &= ~ucMask;
if ( _p_stPosition )
h_3dData->stLastEventGlobalPosition = *_p_stPosition;
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
unsigned long fn_ul3dDataSetNumberOfChannels(MS_tdxHandleTo3dData h_3dData, unsigned long ulNumberOfChannels)
{
return (h_3dData->ulNumberOfChannels = ulNumberOfChannels);
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/* Oliv' - remove wNumRom - 22/06/1999 */
/*
#if defined (U64)
#ifndef RETAIL
short fn_wGet3dDataNumRom(tdstEngineObject * p_stEngineObject)
{
if (p_stEngineObject == NULL)
return -1;
if (((struct tdst3dData_*)((p_stEngineObject)->h_3dData)) == NULL)
return -2;
return (((struct tdst3dData_*)((p_stEngineObject)->h_3dData))->wNumRom);
}
void fn_wSet3dDataNumRom(tdstEngineObject * p_stEngineObject, short wNum)
{
if (p_stEngineObject == NULL)
return;
if (((struct tdst3dData_*)((p_stEngineObject)->h_3dData)) == NULL)
return;
(((struct tdst3dData_*)((p_stEngineObject)->h_3dData))->wNumRom) = wNum;
}
#endif *//* !RETAIL *//*
#endif *//* U64*//*
*/
/* EndOfOliv' */
/****************************/
/* ANNECY MT - 22/09/98 {*/
void fn_vAllocArrayOfElts3d(MS_tdxHandleTo3dData h_3dData, unsigned short _wNumberOfElts3d)
{
unsigned short wCurrentSize = fn_w3dDataGetSizeOfArrayOfElts3d (h_3dData);
if(_wNumberOfElts3d > wCurrentSize)
{
if(fn_p_st3dDataGetCurrentFrame (h_3dData) -> p_stArrayOfElts3d)
{
MMG_fn_vAddMemoryInfo (MMG_C_lTypeFamily , MMG_C_lSubTypeAnimation , h_3dData -> h_Family);
TMP_M_Free (fn_p_st3dDataGetCurrentFrame (h_3dData) -> p_stArrayOfElts3d);
}
MMG_fn_vAddMemoryInfo (MMG_C_lTypeFamily , MMG_C_lSubTypeAnimation , h_3dData -> h_Family);
fn_p_st3dDataGetCurrentFrame (h_3dData) -> p_stArrayOfElts3d = (tdstElement3d*)TMP_M_p_Malloc (sizeof (tdstElement3d) * _wNumberOfElts3d);
/* memset (fn_p_st3dDataGetCurrentFrame (h_3dData) -> p_stArrayOfElts3d , 0 , sizeof (tdstElement3d) * _wNumberOfElts3d); AR9904 Already done in the alloc function */
fn_v3dDataSetSizeOfArrayOfElts3d (h_3dData , _wNumberOfElts3d);
}
}
void fn_vFreeArrayOfElts3d(MS_tdxHandleTo3dData h_3dData)
{
tdstElement3d* p_stElts3d = fn_p_st3dDataGetCurrentFrame (h_3dData) -> p_stArrayOfElts3d;
if (p_stElts3d)
{
MMG_fn_vAddMemoryInfo (MMG_C_lTypeFamily , MMG_C_lSubTypeAnimation , h_3dData -> h_Family);
TMP_M_Free (p_stElts3d);
}
fn_p_st3dDataGetCurrentFrame (h_3dData) -> p_stArrayOfElts3d = NULL;
fn_v3dDataSetSizeOfArrayOfElts3d (h_3dData , 0);
}
/* END ANNECY MT }*/
/****************************/