reman3/Rayman_X/cpa/tempgrp/GAM/Actions/MS_Micro.c

1009 lines
38 KiB
C

/*=========================================================================
* MS_Micro.cpp : MS_Micro's functions
*
*
*
* MS_Micro 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_Micro_StructureDefine
#define D_Micro_VariableDefine
#include "ToolsCPA.h"
#include "SND.h"
#include "Options/Options.h"
#include "Macros.h"
#include "Actions/AllActs.h"
#include "Structur/MemGame.h"
#include "Structur/ErrGame.h"
#include "Structur/Objects.h"
#include "Structur/GameScpt.h"
#include "Structur/StdObjSt.h"
#include "Structur/EngMode.h"
#include "Basic.h"
#include "ObjInit.h"
#include "ZeMem.h"
/*-----------------------------------------------------------------------------
* Description : MS_Micro's 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_eMicroScriptCallback(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_tdxHandleToMicro h_MS_Micro;
struct tdstEngineObject_ *p_stEngineObject;
MTH3D_tdstVector stX,stY,stZ;
_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_lSubTypeMicro , p_stEngineObject);
h_MS_Micro = fn_h_MicroRealAlloc();
MMG_fn_vEndMemoryInfo ();
p_stEngineObject->h_Micro = h_MS_Micro;
SCR_M_RdL0_SetSectionLong(C_ThisSection,0,h_MS_Micro);
/*h_MS_Micro->hMicroMatrix = GEO_fn_hCreateMatrix();*/
h_MS_Micro->bIsActive = 0;
POS_fn_vSetIdentityMatrix( h_MS_Micro->hMicroMatrix );
/*fn_vAddMicro(p_stEngineObject);*/
}
else if (M_IsEntry)
{
if( M_ActionIs( C_EntryMicroRotationMatrix ) )
{
SCR_M_RdL0_GetSectionLong(C_ThisSection,0,MS_tdxHandleToMicro,h_MS_Micro);
M_CheckScriptParamNumber(9);
MTH3D_M_vSetVectorElements(&stX,fn_fAToF(_ap_szParams[0]),
fn_fAToF(_ap_szParams[1]),fn_fAToF(_ap_szParams[2]));
MTH3D_M_vSetVectorElements(&stY,fn_fAToF(_ap_szParams[3]),
fn_fAToF(_ap_szParams[4]),fn_fAToF(_ap_szParams[5]));
MTH3D_M_vSetVectorElements(&stZ,fn_fAToF(_ap_szParams[6]),
fn_fAToF(_ap_szParams[7]),fn_fAToF(_ap_szParams[8]));
POS_fn_vSetRotationMatrix(h_MS_Micro->hMicroMatrix,&stX,&stY,&stZ);
}
else if( M_ActionIs( C_EntryMicroTranslationMatrix ) )
{
SCR_M_RdL0_GetSectionLong(C_ThisSection,0,MS_tdxHandleToMicro,h_MS_Micro);
M_CheckScriptParamNumber(3);
MTH3D_M_vSetVectorElements(&stX,fn_fAToF(_ap_szParams[0]),
fn_fAToF(_ap_szParams[1]),fn_fAToF(_ap_szParams[2]));
POS_fn_vSetTranslationVector(h_MS_Micro->hMicroMatrix,&stX);
}
else if( M_ActionIs( C_EntryMicroActivation ) )
{
SCR_M_RdL0_GetSectionLong(C_ThisSection,0,MS_tdxHandleToMicro,h_MS_Micro);
h_MS_Micro->bIsActive = 1;
/* fn_vAddMicro( p_stEngineObject );*/
}
else if( M_ActionIs( C_EntryMicroUnactivation ) )
{/* Default option*/
SCR_M_RdL0_GetSectionLong(C_ThisSection,0,MS_tdxHandleToMicro,h_MS_Micro);
h_MS_Micro->bIsActive = 0;
}
}
return(eReturnValue);
}
#endif /* GAM_USE_SCRIPT */
/*-----------------------------------------------------------------------------
* Description : MS_Micro's save structure
*-----------------------------------------------------------------------------
* Input : SCR_tdst_File_Description *, struct tdstEngineObject_ *
* Output : Void
*-----------------------------------------------------------------------------
* Creation date : 28/02/97 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
/*
void fn_vMicroSaveMiniStructure(SCR_tdst_File_Description *p_stFile,struct tdstEngineObject_ *p_stObject)
{
char szSection[SCR_CV_ui_Cfg_MaxLenName];
MS_tdxHandleToMicro h_MS_Micro = p_stObject->h_Micro;
MTH3D_tdstVector stX,stY,stZ;
SCR_M_SvL0_SaveBlankLine(p_stFile);
SCR_M_SvL0_SaveComment(p_stFile, "**** MS_Micro mini-structure definition ****");
sprintf(szSection,"%s:",C_SectionMicroDescription);
SCR_M_SvL0_SaveBeginSection(p_stFile,szSection,SCR_CC_C_Cfg_EOL);
// ** Put here the saving script functions **
POS_fn_vGetRotationMatrix( h_MS_Micro->hMicroMatrix,&stX,&stY,&stZ );
SCR_M_SvL0_SaveEntry(p_stFile,C_EntryMicroRotationMatrix,SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf,9,
"%f,%f,%f,%f,%f,%f,%f,%f,%f",
stX.xX,stX.xY,stX.xZ,
stY.xX,stY.xY,stY.xZ,
stZ.xX,stZ.xY,stZ.xZ);
POS_fn_vGetTranslationVector( h_MS_Micro->hMicroMatrix,&stX );
SCR_M_SvL0_SaveEntry(p_stFile,C_EntryMicroTranslationMatrix,SCR_CC_C_Cfg_NoChar);
SCR_fn_v_SvL0_SaveParameters_MP(p_stFile, SCR_EF_SvL0_Scanf,3,"%f,%f,%f",stX.xX,stX.xY,stX.xZ);
SCR_M_SvL0_SaveEndSection(p_stFile, SCR_CC_C_Cfg_EOL)
}
*/
/*-----------------------------------------------------------------------------
* Description : MS_Micro's mini-structure sizeof
*-----------------------------------------------------------------------------
* Input : None
* Output : Size of
*-----------------------------------------------------------------------------
* Creation date : 14/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
unsigned long fn_ulMicroSizeOf()
{
return(sizeof(struct tdstMicro_));
}
/*-----------------------------------------------------------------------------
* Description : MS_Micro's object action allocation
*-----------------------------------------------------------------------------
* Input : Object pointer
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vMicroAlloc(struct tdstEngineObject_ *p_stObject)
{
MTH3D_tdstVector stI, stJ, stK;
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
if (p_stObject->h_Micro!=NULL)
M_GameFatalError(E_uwGameMiniStructAllocAlreadyAlloc);
MMG_fn_vBeginMemoryInfo (MMG_C_lTypeMiniStructure , MMG_C_lSubTypeMicro , p_stObject);
p_stObject->h_Micro = fn_h_MicroRealAlloc();
MMG_fn_vEndMemoryInfo ();
/* ANNECY MT - 15/03/99 { */
/* init matrix */
MTH3D_M_vSetVectorElements(&stJ, MTH_C_MinusONE, MTH_C_ZERO, MTH_C_ZERO);
MTH3D_M_vSetBaseKVector(&stK);
if (p_stObject -> h_Cineinfo != NULL)
{
/* actor is a camera */
MTH3D_M_vSetVectorElements(&stI, MTH_C_ZERO, MTH_C_MinusONE, MTH_C_ZERO);
}
else
{
/* actor isn't a camera */
MTH3D_M_vSetVectorElements(&stI, MTH_C_ZERO, MTH_C_ONE, MTH_C_ZERO);
}
POS_fn_vSetRotationMatrix(p_stObject->h_Micro->hMicroMatrix, &stI, &stJ, &stK);
/* END ANNECY MT } */
}
MS_tdxHandleToMicro fn_h_MicroRealAlloc()
{
MS_tdxHandleToMicro h_MS_Micro;
h_MS_Micro = (MS_tdxHandleToMicro)M_p_GameMallocInHLM(fn_ulMicroSizeOf());
h_MS_Micro->hMicroMatrix = GEO_fn_hCreateMatrix();
return(h_MS_Micro);
}
/*-----------------------------------------------------------------------------
* Description : MS_Micro's object action free
*-----------------------------------------------------------------------------
* Input : Object pointer
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 01/10/96 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vMicroFree(struct tdstEngineObject_ *p_stObject)
{
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
if (p_stObject->h_Micro==NULL)
M_GameFatalError(E_uwGameMiniStructNull);
MMG_fn_vAddMemoryInfo( MMG_C_lTypeMiniStructure , MMG_C_lSubTypeMicro , p_stObject );
M_GameFreeInHLM(p_stObject->h_Micro);
}
/*-----------------------------------------------------------------------------
* Description : MS_Micro's 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 :
*---------------------------------------------------------------------------*/
void fn_vMicroInit(struct tdstEngineObject_ *p_stObject,enum tdeObjectTreeInit_ eObjectInit)
{
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
if (p_stObject->h_Micro==NULL)
M_GameFatalError(E_uwGameMiniStructNull);
switch(eObjectInit)
{
case OTI_WhenGameStart:
break;
case OTI_MapLoaded:
if (fn_bMicroGetActivationFlag(p_stObject->h_Micro))
fn_vAddMicro(p_stObject);
break;
case OTI_ReinitTheMap:
case OTI_AlwaysCreated:
case OTI_PlayerDead:
case OTI_LoadSavedGame:
break;
}
}
/*-----------------------------------------------------------------------------
* Description : MS_Micro's 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_vMicroDesinit(struct tdstEngineObject_ *p_stObject,enum tdeObjectTreeInit_ eObjectInit)
{
if (p_stObject==NULL)
M_GameFatalError(E_uwGameMiniStructObjectNull);
if (p_stObject->h_Micro==NULL)
M_GameFatalError(E_uwGameMiniStructNull);
switch(eObjectInit)
{
case OTI_ReinitTheMap:
break;
case OTI_MapLoaded:
break;
case OTI_AlwaysCreated:
case OTI_PlayerDead:
break;
default:
break;
}
}
/*-----------------------------------------------------------------------------
* Description : Micro's object 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_vMicroCopyClone(struct tdstEngineObject_ * _p_stObjectDest,struct tdstEngineObject_ * _p_stObjectSrc)
{
/* If Micro doesn't contains pointers to structure that may be*/
/* changed during the game, this function must only be a :*/
/* Should be changed*/
memcpy(_p_stObjectDest->h_Micro,_p_stObjectSrc->h_Micro,fn_ulMicroSizeOf());
}
/*-----------------------------------------------------------------------------
* Description : MS_Micro access functions
*-----------------------------------------------------------------------------
* Input : MS_tdxHandleToMicro + (value)
* Output : (value or pointer)
*-----------------------------------------------------------------------------
* Creation date : 29/01/97 Author : Francois
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
/*------------------------------------------------------------------
* Accessors to matrix
*-----------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
GEO_tdxHandleToMatrix fn_xMicroGetMatrix(MS_tdxHandleToMicro h_MS_Micro)
{
return( h_MS_Micro->hMicroMatrix );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vMicroSetMatrix(MS_tdxHandleToMicro h_MS_Micro,GEO_tdxHandleToMatrix hMatrix)
{
h_MS_Micro->hMicroMatrix = hMatrix;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*------------------------------------------------------------------
* Accessors to activation flag
*-----------------------------------------------------------------*/
ACP_tdxBool fn_bMicroGetActivationFlag(MS_tdxHandleToMicro h_MS_Micro)
{
return( h_MS_Micro->bIsActive );
}
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vMicroSetActivationFlag(MS_tdxHandleToMicro h_MS_Micro,ACP_tdxBool bFlag)
{
h_MS_Micro->bIsActive = bFlag;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*------------------------------------------------------------------
* Management of micros/characters list
*-----------------------------------------------------------------*/
struct tdstEngineObject_ * fn_hReturnHandleMicroFromIndex(long lIndex)
{
MIC_tdxHandleToMicro hMicro;
int i;
LST2_M_DynamicForEachElementOf(&(g_stIndexMicrosList.hMicrosList),hMicro,i)
{
if( ((tdstIndexMicros*)hMicro)->lIndex == lIndex )
return( ((tdstIndexMicros*)hMicro)->hMicroObj );
}
return NULL;
}
/*------------------------------------------------------------------
* Get the X component of micro position
*-----------------------------------------------------------------*/
long RetMicroSonoreX(long indice)
{
MTH3D_tdstVector stVertex;
HIE_tdxHandleToSuperObject hSuperObj;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
POS_fn_vGetTranslationVector( HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj),&stVertex );
/*POS_fn_vMulMatrixVertex( &stVertex,M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix,&stVertex );*/
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(stVertex.xX));
}
/*------------------------------------------------------------------
* Get the Y component of micro position
*-----------------------------------------------------------------*/
long RetMicroSonoreY(long indice)
{
MTH3D_tdstVector stVertex;
HIE_tdxHandleToSuperObject hSuperObj;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
POS_fn_vGetTranslationVector( HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj),&stVertex );
/*POS_fn_vMulMatrixVertex( &stVertex,M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix,&stVertex );*/
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(stVertex.xY));
}
/*------------------------------------------------------------------
* Get the Z component of micro position
*-----------------------------------------------------------------*/
long RetMicroSonoreZ(long indice)
{
MTH3D_tdstVector stVertex;
HIE_tdxHandleToSuperObject hSuperObj;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
POS_fn_vGetTranslationVector( HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj),&stVertex );
/*POS_fn_vMulMatrixVertex( &stVertex,M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix,&stVertex );*/
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(stVertex.xZ));
}
/*------------------------------------------------------------------
* Get the X component of micro speed
*-----------------------------------------------------------------*/
long RetMicroSonoreVX(long indice)
{
struct tdstEngineObject_ *p_Object;
HIE_tdxHandleToSuperObject hSuperObj;
DNM_tdstDynamics *p_stDynamics;
MTH_tdxReal xResult = MTH_C_ZERO;
p_Object = fn_hReturnHandleMicroFromIndex(indice);
if (p_Object)
{
hSuperObj = M_GetSuperObject( p_Object );
if( !M_GetMSHandle(hSuperObj,Dynam) )
return 0;
if( (p_stDynamics = fn_p_stDynamGetDynamics(M_GetMSHandle(hSuperObj,Dynam))) == NULL )
return 0;
/* camera object special case */
if (DNM_M_lDynamicsGetObjectType(p_stDynamics)==DNM_eCamera)
{
MTH_tdxReal xInvDTInSecond;
xInvDTInSecond = MTH_M_xDiv(MTH_M_xFloatToReal(1000.f),MTH_M_xLongToReal(g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime));
xResult = MTH_M_xMul(MTH3D_M_xGetXofVector(DNM_M_p_stReportGetLastMove(DNM_M_p_stDynamicsGetReport(p_stDynamics))),xInvDTInSecond);
}
else
{
xResult = MTH3D_M_xGetXofVector(DNM_M_pDynamicsGetPreviousSpeed(p_stDynamics));
}
}
if(xResult>32000.0f)
xResult=32000.0f; //AR9908 Against overflow...
if(xResult<-32000.0f)
xResult=-32000.0f; //AR9908 Against overflow...
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(xResult));
}
/*------------------------------------------------------------------
* Get the Y component of micro speed
*-----------------------------------------------------------------*/
long RetMicroSonoreVY(long indice)
{
struct tdstEngineObject_ *p_Object;
HIE_tdxHandleToSuperObject hSuperObj;
DNM_tdstDynamics *p_stDynamics;
MTH_tdxReal xResult = MTH_C_ZERO;
p_Object = fn_hReturnHandleMicroFromIndex(indice);
if (p_Object)
{
hSuperObj = M_GetSuperObject( p_Object );
if( !M_GetMSHandle(hSuperObj,Dynam) )
return 0;
if( (p_stDynamics = fn_p_stDynamGetDynamics(M_GetMSHandle(hSuperObj,Dynam))) == NULL )
return 0;
/* camera object special case */
if (DNM_M_lDynamicsGetObjectType(p_stDynamics)==DNM_eCamera)
{
MTH_tdxReal xInvDTInSecond;
xInvDTInSecond = MTH_M_xDiv(MTH_M_xFloatToReal(1000.f),MTH_M_xLongToReal(g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime));
xResult = MTH_M_xMul(MTH3D_M_xGetYofVector(DNM_M_p_stReportGetLastMove(DNM_M_p_stDynamicsGetReport(p_stDynamics))),xInvDTInSecond);
}
else
{
xResult = MTH3D_M_xGetYofVector(DNM_M_pDynamicsGetPreviousSpeed(p_stDynamics));
}
}
if(xResult>32000.0f)
xResult=32000.0f; //AR9908 Against overflow...
if(xResult<-32000.0f)
xResult=-32000.0f; //AR9908 Against overflow...
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(xResult));
}
/*------------------------------------------------------------------
* Get the Z component of micro speed
*-----------------------------------------------------------------*/
long RetMicroSonoreVZ(long indice)
{
struct tdstEngineObject_ *p_Object;
HIE_tdxHandleToSuperObject hSuperObj;
DNM_tdstDynamics *p_stDynamics;
MTH_tdxReal xResult = MTH_C_ZERO;
p_Object = fn_hReturnHandleMicroFromIndex(indice);
if (p_Object)
{
hSuperObj = M_GetSuperObject( p_Object );
if( !M_GetMSHandle(hSuperObj,Dynam) )
return 0;
if( (p_stDynamics = fn_p_stDynamGetDynamics(M_GetMSHandle(hSuperObj,Dynam))) == NULL )
return 0;
/* camera object special case */
if (DNM_M_lDynamicsGetObjectType(p_stDynamics)==DNM_eCamera)
{
MTH_tdxReal xInvDTInSecond;
xInvDTInSecond = MTH_M_xDiv(MTH_M_xFloatToReal(1000.f),MTH_M_xLongToReal(g_stEngineStructure.stEngineTimer.ulUsefulDeltaTime));
xResult = MTH_M_xMul(MTH3D_M_xGetZofVector(DNM_M_p_stReportGetLastMove(DNM_M_p_stDynamicsGetReport(p_stDynamics))),xInvDTInSecond);
}
else
{
xResult = MTH3D_M_xGetZofVector(DNM_M_pDynamicsGetPreviousSpeed(p_stDynamics));
}
}
if(xResult>32000.0f)
xResult=32000.0f; //AR9908 Against overflow...
if(xResult<-32000.0f)
xResult=-32000.0f; //AR9908 Against overflow...
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(xResult));
}
/*------------------------------------------------------------------
* Get the X component of micro normal
*-----------------------------------------------------------------*/
long RetMicroSonoreDNX(long indice)
{
/*
//This the exact code, but needs 27 multiplication
MTH3D_tdstVector stI,stJ,stK;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition stMatrix;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
POS_fn_vSetIdentityMatrix(&stMatrix);
POS_fn_vMulMatrixMatrix( &stMatrix,HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj),M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix );
POS_fn_vGetRotationMatrix(&stMatrix,&stI,&stJ,&stK);
//POS_fn_vMulMatrixVertex( &stI,M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix,&stI );
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(stI.xX));
*/
/*need only 3 multiplications*/
MTH3D_tdstVector stV1,stV2,stV3,stW1,stW2,stW3;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition *pMatrix1,*pMatrix2;
MTH_tdxReal xN;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
pMatrix1=HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj);
pMatrix2=M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix;
POS_fn_vGetRotationMatrix(pMatrix1,&stV1,&stV2,&stV3);
POS_fn_vGetRotationMatrix(pMatrix2,&stW1,&stW2,&stW3);
xN=MTH_M_xAdd(
MTH_M_xAdd(
MTH_M_xMul(stV1.xX,stW1.xX),MTH_M_xMul(stV2.xX,stW1.xY)),
MTH_M_xMul(stV3.xX,stW1.xZ));
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(xN));
}
/*------------------------------------------------------------------
* Get the Y component of micro normal
*-----------------------------------------------------------------*/
long RetMicroSonoreDNY(long indice)
{
/*
MTH3D_tdstVector stI,stJ,stK;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition stMatrix;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
POS_fn_vSetIdentityMatrix(&stMatrix);
POS_fn_vMulMatrixMatrix( &stMatrix,HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj),M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix );
POS_fn_vGetRotationMatrix(&stMatrix,&stI,&stJ,&stK);
//POS_fn_vMulMatrixVertex( &stI,M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix,&stI );
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(stI.xY));
*/
MTH3D_tdstVector stV1,stV2,stV3,stW1,stW2,stW3;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition *pMatrix1,*pMatrix2;
MTH_tdxReal xN;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
pMatrix1=HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj);
pMatrix2=M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix;
POS_fn_vGetRotationMatrix(pMatrix1,&stV1,&stV2,&stV3);
POS_fn_vGetRotationMatrix(pMatrix2,&stW1,&stW2,&stW3);
xN=MTH_M_xAdd(
MTH_M_xAdd(
MTH_M_xMul(stV1.xY,stW1.xX),MTH_M_xMul(stV2.xY,stW1.xY)),
MTH_M_xMul(stV3.xY,stW1.xZ));
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(xN));
}
/*------------------------------------------------------------------
* Get the Z component of micro normal
*-----------------------------------------------------------------*/
long RetMicroSonoreDNZ(long indice)
{
/*
MTH3D_tdstVector stI,stJ,stK;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition stMatrix;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
POS_fn_vSetIdentityMatrix(&stMatrix);
POS_fn_vMulMatrixMatrix( &stMatrix,HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj),M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix );
POS_fn_vGetRotationMatrix(&stMatrix,&stI,&stJ,&stK);
//POS_fn_vMulMatrixVertex( &stI,M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix,&stI );
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(stI.xZ));
*/
MTH3D_tdstVector stV1,stV2,stV3,stW1,stW2,stW3;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition *pMatrix1,*pMatrix2;
MTH_tdxReal xN;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
pMatrix1=HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj);
pMatrix2=M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix;
POS_fn_vGetRotationMatrix(pMatrix1,&stV1,&stV2,&stV3);
POS_fn_vGetRotationMatrix(pMatrix2,&stW1,&stW2,&stW3);
xN=MTH_M_xAdd(
MTH_M_xAdd(
MTH_M_xMul(stV1.xZ,stW1.xX),MTH_M_xMul(stV2.xZ,stW1.xY)),
MTH_M_xMul(stV3.xZ,stW1.xZ));
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(xN));
}
/*------------------------------------------------------------------
* Get the X component of micro tangent
*-----------------------------------------------------------------*/
long RetMicroSonoreDTX(long indice)
{
/*
MTH3D_tdstVector stI,stJ,stK;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition stMatrix;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
POS_fn_vSetIdentityMatrix(&stMatrix);
POS_fn_vMulMatrixMatrix( &stMatrix,HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj),M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix );
POS_fn_vGetRotationMatrix(&stMatrix,&stI,&stJ,&stK);
//POS_fn_vMulMatrixVertex( &stI,M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix,&stI );
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(stJ.xX));
*/
/*need only 3 multiplications*/
MTH3D_tdstVector stV1,stV2,stV3,stW1,stW2,stW3;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition *pMatrix1,*pMatrix2;
MTH_tdxReal xN;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
pMatrix1=HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj);
pMatrix2=M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix;
POS_fn_vGetRotationMatrix(pMatrix1,&stV1,&stV2,&stV3);
POS_fn_vGetRotationMatrix(pMatrix2,&stW1,&stW2,&stW3);
xN=MTH_M_xAdd(
MTH_M_xAdd(
MTH_M_xMul(stV1.xX,stW2.xX),MTH_M_xMul(stV2.xX,stW2.xY)),
MTH_M_xMul(stV3.xX,stW2.xZ));
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(xN));
}
/*------------------------------------------------------------------
* Get the Y component of micro tangent
*-----------------------------------------------------------------*/
long RetMicroSonoreDTY(long indice)
{
/*
MTH3D_tdstVector stI,stJ,stK;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition stMatrix;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
POS_fn_vSetIdentityMatrix(&stMatrix);
POS_fn_vMulMatrixMatrix( &stMatrix,HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj),M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix );
POS_fn_vGetRotationMatrix(&stMatrix,&stI,&stJ,&stK);
//POS_fn_vMulMatrixVertex( &stI,M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix,&stI );
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(stJ.xY));
*/
/*need only 3 multiplications*/
MTH3D_tdstVector stV1,stV2,stV3,stW1,stW2,stW3;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition *pMatrix1,*pMatrix2;
MTH_tdxReal xN;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
pMatrix1=HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj);
pMatrix2=M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix;
POS_fn_vGetRotationMatrix(pMatrix1,&stV1,&stV2,&stV3);
POS_fn_vGetRotationMatrix(pMatrix2,&stW1,&stW2,&stW3);
xN=MTH_M_xAdd(
MTH_M_xAdd(
MTH_M_xMul(stV1.xY,stW2.xX),MTH_M_xMul(stV2.xY,stW2.xY)),
MTH_M_xMul(stV3.xY,stW2.xZ));
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(xN));
}
/*------------------------------------------------------------------
* Get the Z component of micro tangent
*-----------------------------------------------------------------*/
long RetMicroSonoreDTZ(long indice)
{
/*
MTH3D_tdstVector stI,stJ,stK;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition stMatrix;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
POS_fn_vSetIdentityMatrix(&stMatrix);
POS_fn_vMulMatrixMatrix( &stMatrix,HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj) ,M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix);
POS_fn_vGetRotationMatrix(&stMatrix,&stI,&stJ,&stK);
//POS_fn_vMulMatrixVertex( &stI,M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix,&stI );
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(stJ.xZ));
*/
/*need only 3 multiplications*/
MTH3D_tdstVector stV1,stV2,stV3,stW1,stW2,stW3;
HIE_tdxHandleToSuperObject hSuperObj;
POS_tdstCompletePosition *pMatrix1,*pMatrix2;
MTH_tdxReal xN;
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(indice) );
pMatrix1=HIE_fn_hGetSuperObjectGlobalMatrix(hSuperObj);
pMatrix2=M_GetMSHandle(hSuperObj,Micro)->hMicroMatrix;
POS_fn_vGetRotationMatrix(pMatrix1,&stV1,&stV2,&stV3);
POS_fn_vGetRotationMatrix(pMatrix2,&stW1,&stW2,&stW3);
xN=MTH_M_xAdd(
MTH_M_xAdd(
MTH_M_xMul(stV1.xZ,stW2.xX),MTH_M_xMul(stV2.xZ,stW2.xY)),
MTH_M_xMul(stV3.xZ,stW2.xZ));
return (long)M_Fixed1616ToRealSnd(MTH_M_xRealToFixed16_16(xN));
}
/*------------------------------------------------------------------
* Return value of micro filter
*-----------------------------------------------------------------*/
long RetMicroSonoreFILTRE(long indice)
{
return 0;
}
/*------------------------------------------------------------------
* Activate the Micro attached to character
* Caution: hEngObj must have a Micro MiniStructure
*-----------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vActivateMicroForObject(struct tdstEngineObject_ * hEngObj)
{
hEngObj->h_Micro->bIsActive = TRUE;
fn_vAddMicro( hEngObj );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*------------------------------------------------------------------
* Add an active micro in sound engine
*-----------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vUnactivateMicroForObject(struct tdstEngineObject_ * hEngObj)
{
hEngObj->h_Micro->bIsActive = FALSE;
fn_vRemoveMicro( hEngObj );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*------------------------------------------------------------------
* Add an active micro in sound engine
*-----------------------------------------------------------------*/
void fn_vAddMicro(struct tdstEngineObject_ * hEngObj)
{
MIC_tdxHandleToMicro hMicro;
MMG_fn_vAddMemoryInfo( MMG_C_lTypeMiniStructure , MMG_C_lSubTypeMicro , hEngObj );
hMicro = (MIC_tdxHandleToMicro)M_p_GameMallocInHLM(sizeof(tdstIndexMicros));
LST2_M_DynamicInitElement(hMicro);
((tdstIndexMicros *)hMicro)->lIndex = SND_fn_lCreateMicroSound();
((tdstIndexMicros *)hMicro)->hMicroObj = hEngObj;
LST2_M_DynamicAddTail(&g_stIndexMicrosList.hMicrosList,hMicro);
hEngObj->h_Micro->bIsActive = TRUE;
}
/*------------------------------------------------------------------
* Remove an active micro from the sound engine
*-----------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vRemoveMicro(struct tdstEngineObject_ * hEngObj)
{
MIC_tdxHandleToMicro hMicro,hNextElement;
long lI;
LST2_M_DynamicForEachMovingElementOf( &g_stIndexMicrosList.hMicrosList,hMicro,hNextElement,lI )
{
if( ((tdstIndexMicros *)hMicro)->hMicroObj == hEngObj )
{
SND_fn_vDestroyMicroSound( hMicro->lIndex );
LST2_M_DynamicIsolate( hMicro );
MMG_fn_vAddMemoryInfo( MMG_C_lTypeMiniStructure , MMG_C_lSubTypeMicro , hEngObj );
M_GameFreeInHLM( hMicro );
}
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*------------------------------------------------------------------
* Remove all active micros in sound engine (not in 3DOS)
*-----------------------------------------------------------------*/
void fn_vRemoveAllMicros()
{
MIC_tdxHandleToMicro hMicro,hNextElement;
long lI;
LST2_M_DynamicForEachMovingElementOf( &g_stIndexMicrosList.hMicrosList,hMicro,hNextElement,lI )
{
SND_fn_vDestroyMicroSound( hMicro->lIndex );
LST2_M_DynamicIsolate( hMicro );
/* M_GameFreeInHLM( hMicro );*/
}
LST2_M_DynamicInitAnchor( &g_stIndexMicrosList.hMicrosList );
}
/*------------------------------------------------------------------
* Return TRUE if objet is audible from micro position
*-----------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
BOOL td_fn_bRetObjetSoundLinkWithMicro(long objet,long micro)
{
HIE_tdxHandleToSuperObject hObjectSector,hMicroSector,hSuperObj;
unsigned long ulI;
SECT_tdxHandleOfElementLstSoundInteraction hSoundList;
hObjectSector=fn_h_SectInfoGetCurrentSector( M_GetMSHandle(((HIE_tdxHandleToSuperObject)objet),SectInfo) );
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(micro) );
hMicroSector=fn_h_SectInfoGetCurrentSector( M_GetMSHandle(hSuperObj,SectInfo) );
if( hObjectSector==hMicroSector )
return TRUE;
SECT_M_ForEachSoundNodeInSoundInteractionList(hMicroSector,hSoundList,ulI)
{
if( SECT_GetSectorInSoundList(hSoundList)==hObjectSector )
return FALSE;
}
return TRUE;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*------------------------------------------------------------------
* Return Value of audibility of object from micro position
*-----------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
long fn_lRetObjectSoundLinkVolumeWithMicro(long objet,long micro)
{
HIE_tdxHandleToSuperObject hObjectSector,hMicroSector,hSuperObj;
unsigned long ulI;
SECT_tdxHandleOfElementLstSoundInteraction hSoundList;
hObjectSector=fn_h_SectInfoGetCurrentSector( M_GetMSHandle(((HIE_tdxHandleToSuperObject)objet),SectInfo) );
hSuperObj = M_GetSuperObject( fn_hReturnHandleMicroFromIndex(micro) );
hMicroSector=fn_h_SectInfoGetCurrentSector( M_GetMSHandle(hSuperObj,SectInfo) );
if( hObjectSector==hMicroSector )
return C_MSMicro_MaxVolume;
SECT_M_ForEachSoundNodeInSoundInteractionList(hMicroSector,hSoundList,ulI)
{
if( SECT_GetSectorInSoundList(hSoundList)==hObjectSector )
return SCT_fn_lGetVolumeInSoundList(hSoundList);
}
return C_MSMicro_MinVolume;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*------------------------------------------------------------------
* Init pointers of functions for sound engine
*-----------------------------------------------------------------*/
void fn_vInitMicrosFunction()
{
tdstAllRetMicroSound st_pfnRetMicroSound;
memset(&st_pfnRetMicroSound,0,sizeof(st_pfnRetMicroSound));
st_pfnRetMicroSound.X=RetMicroSonoreX;
st_pfnRetMicroSound.Y=RetMicroSonoreY;
st_pfnRetMicroSound.Z=RetMicroSonoreZ;
st_pfnRetMicroSound.VX=RetMicroSonoreVX;
st_pfnRetMicroSound.VY=RetMicroSonoreVY;
st_pfnRetMicroSound.VZ=RetMicroSonoreVZ;
st_pfnRetMicroSound.DNX=RetMicroSonoreDNX;
st_pfnRetMicroSound.DNY=RetMicroSonoreDNY;
st_pfnRetMicroSound.DNZ=RetMicroSonoreDNZ;
st_pfnRetMicroSound.DTX=RetMicroSonoreDTX;
st_pfnRetMicroSound.DTY=RetMicroSonoreDTY;
st_pfnRetMicroSound.DTZ=RetMicroSonoreDTZ;
st_pfnRetMicroSound.Filtre=RetMicroSonoreFILTRE;
SND_fn_vSetRetMicroSound(&st_pfnRetMicroSound);
LST2_M_DynamicInitAnchor(&g_stIndexMicrosList.hMicrosList);
}
/*------------------------------------------------------------------
* Access functions to Micro List Element fields
*-----------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
long fn_lGetMicroIndiceInMicroListElement(MIC_tdxHandleToMicro _hMicroListElement)
{
return( _hMicroListElement->lIndex );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
struct tdstEngineObject_ * fn_p_stGetEngineObjectInMicroListElement(MIC_tdxHandleToMicro _hMicroListElement)
{
return( _hMicroListElement->hMicroObj );
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
struct tdstEngineObject_ * fn_p_stGetFirstEngineObjectInMicroList(void)
{
MIC_tdxHandleToMicro hMicroElement;
hMicroElement = LST2_M_DynamicGetFirstElement(&g_stIndexMicrosList.hMicrosList);
if( hMicroElement )
return( hMicroElement->hMicroObj );
else
return NULL;
}
/*------------------------------------------------------------------
*------------------------------------------------------------------
* WARNING : these functions are to use only with the ONE micro
* version of the GamLib
*------------------------------------------------------------------
*-----------------------------------------------------------------*/
/*------------------------------------------------------------------
* Put micro on another character
*-----------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
void fn_vChangeCharacterForMicro(struct tdstEngineObject_ * _p_stEngineCharacter)
{
LST2_M_DynamicGetFirstElement(&g_stIndexMicrosList.hMicrosList)->hMicroObj = _p_stEngineCharacter;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*------------------------------------------------------------------
* Put micro on another character (AI version)
*-----------------------------------------------------------------*/
void GAM_fn_vChangeCharacterForMicro(HIE_tdxHandleToSuperObject _hCharacter)
{
LST2_M_DynamicGetFirstElement(&g_stIndexMicrosList.hMicrosList)->hMicroObj = (struct tdstEngineObject_ *)HIE_fn_hGetSuperObjectObject(_hCharacter);
}
/*------------------------------------------------------------------
*------------------------------------------------------------------
* End of functions for the ONE micro specific version of the GamLib
*------------------------------------------------------------------
*-----------------------------------------------------------------*/