reman3/Rayman_X/cpa/tempgrp/GAM/ChanList.c

703 lines
26 KiB
C

#define PO_FRIEND
#define HieFriend
#define ENV_FRIEND
#define D_State_Define
#include "ToolsCPA.h"
#include "Mor.h" /* AR980213*/
#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 "structur/anim_s.h"
#include "Structur/State.h"
#include "Basic.h"
#include "GameEng.h"
#include "ObjInit.h"
#include "ZeMem.h"
#include "ToolMatr.h"
/* anim interpolated*/
#include "ChanList.h"
#include "PlayAnim/Interpol/a3x_intn.h"
#include "playanim\playanim.h"
#include "prf.h"
#if defined (ACTIVE_EDITOR) || defined (RETAIL)
#define ENGassert(param)
#else
#define ENGassert(param) assert(param)
#endif
/*-----------------------------------------------------------------------------
* Description : Return the channel which contains a SO
*-----------------------------------------------------------------------------
* Input : Handle to the list
Handle to the SO
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 25/03/97 Author : Michaël
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC */
unsigned short fn_uwGetChannelOfSuperObject(CHN_tdxHandleToChannelArray hChannelArray, HIE_tdxHandleToSuperObject hSO, unsigned long ulNumberOfChannels)
{
unsigned short i;
for (i=0; i < ulNumberOfChannels; i++)
{
if (hChannelArray[i].hSupObject == hSO)
return i;
}
/* The SO isn't found*/
return C_ucUnknownChannel;
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC */
/*-----------------------------------------------------------------------------
* Description : Init a CHN_tdxHandleToCSOList list.
*-----------------------------------------------------------------------------
* Input : Pointer on the handle to the list
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 25/03/97 Author : Michaël
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vInitCSOList(CHN_tdxHandleToChannelArray *p_hChannelArray, unsigned long ulNumberOfChannels)
{
unsigned long ulI;
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeCSO , 0 );
*p_hChannelArray = (CHN_tdxHandleToChannelArray)TMP_M_p_Malloc(sizeof(tdstAChannel) * ulNumberOfChannels);
/* memset(*p_hChannelArray,0,sizeof(tdstAChannel) * ulNumberOfChannels); AR9904 Already done in the alloc function */
for ( ulI = 0 ; ulI < ulNumberOfChannels ; ulI ++ )
( * p_hChannelArray ) [ ulI ] . bActiveChannel = TRUE ;
#if defined(USE_PROFILER) && !defined(PRESS_DEMO)
if (PRF_fn_lIncIndependantVariable(PRF_C_ulIdpNbAllocCHA,ulNumberOfChannels) > PRF_fn_lGetIndependantVariable(PRF_C_ulIdpNbMaxAllocCHA))
{
PRF_fn_vSetIndependantVariable(PRF_C_ulIdpNbMaxAllocCHA,PRF_fn_lGetIndependantVariable(PRF_C_ulIdpNbAllocCHA));
}
#endif
}
/*-----------------------------------------------------------------------------
* Description : Free a CHN_tdxHandleToCSOList list.
*-----------------------------------------------------------------------------
* Input : Pointer on the handle to the list
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 16/08/97 Author : Sebastien DAVID (Gizmo)
*---------------------------------------------------------------------------*/
void fn_vFreeCSOList(CHN_tdxHandleToChannelArray *p_hChannelArray/*, unsigned long ulNumberOfChannels*/)
{
/* unsigned long i;*/
CHN_tdxHandleToChannelArray hArray;
#ifndef RETAIL
long lSize;
#endif
hArray = *p_hChannelArray;
if (hArray == NULL)
return;
#ifndef RETAIL
lSize = *(((long*)hArray)-1);
lSize *= 4;
lSize /= sizeof(tdstAChannel);
#endif RETAIL
/* if(hArray == NULL) return; AR9903 Already done ! */
/* for (i=0; i<ulNumberOfChannels; i++)
{
// clean the channels control matrix
if (hArray[i].hControlMatrix)
{
TMP_M_Free(hArray[i].hControlMatrix);
hArray[i].hControlMatrix = NULL;
}
}
*/ /* and delete the array*/
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeCSO , 0 );
TMP_M_Free(hArray);
hArray = NULL;
PRF_fn_lIncIndependantVariable(PRF_C_ulIdpNbAllocCHA,-lSize);
}
/*-----------------------------------------------------------------------------
* Description : Take the control of a channel. There are 2 types of controls:
* The modifications could added to the local matrix, or they could overloaded it
*-----------------------------------------------------------------------------
* Input : The SO of the character
* The channel number
* The type of control
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 27/03/97 Author : Michaël
*-----------------------------------------------------------------------------
* Modification date : 02 Apr 98 Modification Author : B. Bermain ANNECY BBB
* Modifications : the UCCList no longer exists: a channel is controlled when the CSO element has a valid handle on an additional matrix
*---------------------------------------------------------------------------*/
void fn_vTakeControlOfChannel(struct tdstEngineObject_ *_hActor, unsigned short _uwChannel, ACP_tdxBool _bControlled)
{
/* Recover the CSO list of the character*/
unsigned long ulNbChannels ;
MS_tdxHandleTo3dData hCurrent3dData = _hActor->h_3dData;
CHN_tdxHandleToChannelArray hChannelArray = fn_h3dDataGetChannelSOList(hCurrent3dData);
if (hChannelArray == NULL)
{
return;
}
ulNbChannels = fn_ul3dDataGetNumberOfChannels(hCurrent3dData) ;
if (_uwChannel != 0xffff)
{
ENGassert(_uwChannel >= 0 && _uwChannel < ulNbChannels );
/* loose control of one channel*/
hChannelArray[_uwChannel].bControlledChannel = _bControlled;
}
else
{
/* loose control of all channels*/
tdstAChannel *p_stChannel ;
unsigned long ulI ;
for ( ulI = 0 , p_stChannel = hChannelArray ; ulI < ulNbChannels ; ulI ++ , p_stChannel ++ )
{
p_stChannel->bControlledChannel = _bControlled;
}
}
}
/*-----------------------------------------------------------------------------
* Description : activate a channel
*-----------------------------------------------------------------------------
* Input : The SO of the character
* The channel number
* Output : None
*---------------------------------------------------------------------------*/
void fn_vUpdateSPOFlagsOfChannelForActivation(HIE_tdxHandleToSuperObject _hSOChannel, ACP_tdxBool _bActivate)
{
unsigned long ulSpoFlags ;
if ( _hSOChannel )
{
ulSpoFlags = HIE_M_xGetSuperObjectMember(_hSOChannel , ulFlags);
if ( _bActivate )
{
/* it becomes pickable, visible and shadowable */
HIE_M_vSetSuperObjectMember(_hSOChannel , ulFlags, ulSpoFlags & ~ ( HIE_C_Flag_ulNotPickable | HIE_C_Flag_ulHidden | HIE_C_Flag_ulNoShadowOnMe ) ) ;
}
else
{
/* it becomes not pickable, visible or shadowable */
HIE_M_vSetSuperObjectMember(_hSOChannel , ulFlags, ulSpoFlags | HIE_C_Flag_ulNotPickable | HIE_C_Flag_ulHidden | HIE_C_Flag_ulNoShadowOnMe ) ;
}
}
}
void fn_vActivateChannel(HIE_tdxHandleToSuperObject _hPerso , unsigned short _uwChannel , ACP_tdxBool _bActivate )
{
MS_tdxHandleTo3dData h_3dData = M_GetMSHandle(_hPerso,3dData);
tdstAChannel *p_stChannel ;
HIE_tdxHandleToSuperObject hModule ;
/* Recover the CSO list of the character*/
unsigned long ulNbChannels ;
CHN_tdxHandleToChannelArray hChannelArray = fn_h3dDataGetChannelSOList(h_3dData);
if (hChannelArray == NULL)
{
return;
}
ulNbChannels = fn_ul3dDataGetNumberOfChannels(h_3dData) ;
if (_uwChannel != 0xffff)
{
ENGassert(_uwChannel >= 0 && _uwChannel < ulNbChannels );
/* loose control of one channel*/
p_stChannel = & hChannelArray [ _uwChannel ] ;
p_stChannel -> bActiveChannel = _bActivate ;
hModule = p_stChannel -> hZoomSupObject ? p_stChannel -> hZoomSupObject : p_stChannel -> hSupObject ;
fn_vUpdateSPOFlagsOfChannelForActivation ( hModule , _bActivate ) ;
#ifndef U64
#ifndef RETAIL
DEMO_fn_vSaveCanalActivationDesactivation ( _hPerso , ( unsigned char ) _uwChannel , _bActivate ) ;
#endif /* RETAIL */
#endif
}
else
{
/* loose control of all channels*/
unsigned long ulI ;
for ( ulI = 0 , p_stChannel = hChannelArray ; ulI < ulNbChannels ; ulI ++ , p_stChannel ++ )
{
p_stChannel = & hChannelArray [ ulI ] ;
p_stChannel -> bActiveChannel = _bActivate ;
hModule = p_stChannel -> hZoomSupObject ? p_stChannel -> hZoomSupObject : p_stChannel -> hSupObject ;
fn_vUpdateSPOFlagsOfChannelForActivation ( hModule , _bActivate ) ;
#ifndef U64
#ifndef RETAIL
DEMO_fn_vSaveCanalActivationDesactivation ( _hPerso , ( unsigned char ) _uwChannel , _bActivate ) ;
#endif /* RETAIL */
#endif
}
}
}
/*-----------------------------------------------------------------------------
* Description : deactivate a channel
*-----------------------------------------------------------------------------
* Input : The SO of the character
* The channel number
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 27/03/97 Author : Michaël
*-----------------------------------------------------------------------------
* Modification date : 02 Apr 98 Modification Author : B. Germain ANNECY BBB
* Modifications : - the UCC list no longer exists, it is replaced by a handle to the control matrix in the CSO element
- if uwChannel == 0xFFF, all controlled channels are released
*---------------------------------------------------------------------------*/
#ifndef _FIRE_DEADCODE_U64_ /* Added by RUC 04/06/99 */
void fn_vDeactivateChannel(struct tdstEngineObject_ *_hActor, unsigned short _uwChannel)
{
/* Recover the CSO list of the character*/
unsigned long ulNbChannels ;
MS_tdxHandleTo3dData hCurrent3dData = _hActor->h_3dData;
CHN_tdxHandleToChannelArray hChannelArray = fn_h3dDataGetChannelSOList(hCurrent3dData);
if (hChannelArray == NULL)
{
return;
}
ulNbChannels = fn_ul3dDataGetNumberOfChannels(hCurrent3dData) ;
if (_uwChannel != 0xffff)
{
ENGassert(_uwChannel >= 0 && _uwChannel < ulNbChannels );
/* loose control of one channel*/
hChannelArray[_uwChannel].bActiveChannel = FALSE;
}
else
{
/* loose control of all channels*/
tdstAChannel *p_stChannel ;
unsigned long ulI ;
for ( ulI = 0 , p_stChannel = hChannelArray ; ulI < ulNbChannels ; ulI ++ , p_stChannel ++ )
{
p_stChannel->bActiveChannel = FALSE;
}
}
}
#endif /* _FIRE_DEADCODE_U64_ */ /* Added by RUC 04/06/99 */
/*
if (_uwChannel != 0xffff && hChannelArray[_uwChannel].hControlMatrix)
{
// only one channel is requested
// and it is controled, so loose control
if (hChannelArray[_uwChannel].hSupObject)
{
// update the matrix if we release an active channel !!
// if the channel is not active, its matrix is NULL anyway...
// find and give back the animation element matrix to the superobject
// (that would otherwise reference a nonexistent matrix, ARGH!!!
tdstState *p_stCurrentState = fn_h3dDataGetCurrentState(hCurrent3dData);
if ( p_stCurrentState )
{
struct tdstAnim3d_ *p_stCurrentAnim = p_stCurrentState->p_stAnim;
if ( p_stCurrentAnim )
{
struct tdstFrame3d_ *p_stCurrentFrame3d = fn_p_GetFramesAddress(p_stCurrentAnim,fn_uw3dDataGetCurrentFrame(hCurrent3dData),g_stEngineStructure.stEngineTimer.ulTrameNumber,(void*)fn_h_StandardGameGetSuperObject(_hActor->h_StandardGame));
if ( p_stCurrentFrame3d )
{
struct tdstElement3d_ *p_stCurrentElement3d, *p_stStopElt3d;
p_stCurrentElement3d = p_stCurrentFrame3d->p_stArrayOfElts3d;
p_stStopElt3d = p_stCurrentElement3d + p_stCurrentAnim->ucMaxNumberOfElements;
// look for the 3d element that correspond to the channel that must be released
while (p_stCurrentElement3d != p_stStopElt3d)
{
if (p_stCurrentElement3d->ucChannelNumber == _uwChannel)
{
HIE_fn_vSetSuperObjectMatrix(hChannelArray[_uwChannel].hSupObject, p_stCurrentElement3d->stMatrix);
break;
}
p_stCurrentElement3d++;
}
}
}
}
}
//destroy the control matrix
TMP_M_Free(hChannelArray[_uwChannel].hControlMatrix);
//clear the handle in the CSO element
hChannelArray[_uwChannel].hControlMatrix = NULL;
}
else if (_uwChannel == 0xffff)
{
// loose control of all channels
tdstState *p_stCurrentState = fn_h3dDataGetCurrentState(hCurrent3dData);
//and give back the animation element matrix to the superobject (that would otherwise reference a nonexistent matrix, ARGH!!!
if ( p_stCurrentState )
{
struct tdstAnim3d_ *p_stCurrentAnim = p_stCurrentState->p_stAnim;
if ( p_stCurrentAnim )
{
struct tdstFrame3d_ *p_stCurrentFrame3d = fn_p_GetFramesAddress(p_stCurrentAnim,fn_uw3dDataGetCurrentFrame(hCurrent3dData),g_stEngineStructure.stEngineTimer.ulTrameNumber,(void*)fn_h_StandardGameGetSuperObject(_hActor->h_StandardGame));
if ( p_stCurrentFrame3d )
{
struct tdstElement3d_ *p_stCurrentElement3d, *p_stStopElt3d;
p_stCurrentElement3d = p_stCurrentFrame3d->p_stArrayOfElts3d;
p_stStopElt3d = p_stCurrentElement3d + p_stCurrentAnim->ucMaxNumberOfElements;
// look for the 3d element that correspond to the channel that must be released
while (p_stCurrentElement3d != p_stStopElt3d)
{
if (p_stCurrentElement3d->ucChannelNumber != C_ucUnknownChannel)
{
if (hChannelArray[p_stCurrentElement3d->ucChannelNumber].hControlMatrix)
{
if (hChannelArray[p_stCurrentElement3d->ucChannelNumber].hSupObject )
{
HIE_fn_vSetSuperObjectMatrix(hChannelArray[p_stCurrentElement3d->ucChannelNumber].hSupObject, p_stCurrentElement3d->stMatrix);
}
//destroy the control matrix
TMP_M_Free(hChannelArray[p_stCurrentElement3d->ucChannelNumber].hControlMatrix);
//clear the handle in the CSO element
hChannelArray[p_stCurrentElement3d->ucChannelNumber].hControlMatrix = NULL;
}
}
p_stCurrentElement3d++;
}
}
}
}
}
}
*/
#include "ChanLis1.cxx"
/*-----------------------------------------------------------------------------
* Description : Update the matrix of the controled channels of a character
*-----------------------------------------------------------------------------
* Input : The SO of the character
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 27/03/97 Author : Michaël
*-----------------------------------------------------------------------------
* Modification date : 08/07/97 Modification Author : CGHT
* Modifications : Bug correction for absolute mode.
*---------------------------------------------------------------------------*/
/*void fn_vUpdateMatrixOfControledChannels(struct tdstEngineObject_ *_hActor)
{
// tdstAChannel *p_stChannel;
// this function is not of any use now, because matrix, controlled or not, are automatically updated...
// Recover the CSO list of the character
MS_tdxHandleTo3dData hCurrent3dData;
CHN_tdxHandleToChannelArray hChannelArray;
// some variables to scan the CSO list
unsigned long i;
POS_tdstCompletePosition *hSource, *hDest;
MS_tdxHandleToAnimEffect hAnimEffect;
hCurrent3dData = _hActor->h_3dData;
hChannelArray = fn_h3dDataGetChannelSOList(hCurrent3dData);
if (!hChannelArray)
return;
hAnimEffect = _hActor->h_AnimEffect;
p_stChannel = fn_h3dDataGetFirstActiveChannel(hCurrent3dData);
i=0;
while (p_stChannel)
{
if (p_stChannel->hControlMatrix)
{
hDest = p_stChannel->hControlMatrix;
hSource = HIE_fn_hGetSuperObjectMatrix(p_stChannel->hSupObject);
if ( hSource != hDest ) //if we did not already do it
{
//copy the current matrix in the control matrix
POS_fn_vCopyMatrix(hDest, hSource);
// and give the control matrix to the superobject
HIE_fn_vSetSuperObjectMatrix(p_stChannel->hSupObject, hDest);
}
// if there is an animeffect structure
if ( hAnimEffect )
{
//perform the effects on the controlled channel
fn_vDoAnimEffect(hAnimEffect, M_GetSuperObject(_hActor), i, p_stChannel->hSupObject);
}
}
i++;
p_stChannel = p_stChannel->p_stNextActiveChannel;
}
}*/
/*-----------------------------------------------------------------------------
* Description : Create a Morph element
*-----------------------------------------------------------------------------
* Input : None
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 12/2/97 Author : alexander
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
tdstMorphChannelList* fn_p_stCreateMorphListElement()
{
tdstMorphChannelList * p_stMorphList;
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeMorphChannelList , 0 );
p_stMorphList= (tdstMorphChannelList *) TMP_M_p_Malloc (sizeof (tdstMorphChannelList));
LST2_M_DynamicInitElement (p_stMorphList);
return p_stMorphList;
}
/*-----------------------------------------------------------------------------
* Description : Free a Morph Channel element
*-----------------------------------------------------------------------------
* Input : None
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 12/1/97 Author : alexander
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vFreeMorphListElement(tdstMorphChannelList * p_stMorphList)
{
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeMorphChannelList , 0 );
TMP_M_Free(p_stMorphList);
}
/*-----------------------------------------------------------------------------
* Description : Init a CHN_tdxHandleToMorphList list.
*-----------------------------------------------------------------------------
* Input : Pointer on the handle to the list
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 12/2/97 Author : alexander
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vInitMorphList(CHN_tdxHandleToMorphList *p_hMorphList)
{
if( *p_hMorphList != NULL )
return;
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeMorphList , 0 );
* p_hMorphList = (CHN_tdxHandleToMorphList) TMP_M_p_Malloc (sizeof (LST2_M_DynamicAnchorDeclaration(CHN_tdxHandleToMorphElement)));
LST2_M_DynamicInitAnchor(*p_hMorphList);
}
/*-----------------------------------------------------------------------------
* Description : Free a CHN_tdxHandleToMorphList list.
*-----------------------------------------------------------------------------
* Input : Pointer on the handle to the list
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 12/1/97 Author : alexander
*---------------------------------------------------------------------------*/
void fn_vFreeMorphList(CHN_tdxHandleToMorphList *p_hMorphList)
{
if( *p_hMorphList == NULL ) return;
while( LST2_M_DynamicGetNumberOfElements(*p_hMorphList) > 0 )
{
/* get head*/
tdstMorphChannelList *p_hMorphElt = LST2_M_DynamicGetFirstElement(*p_hMorphList);
/* isolate*/
LST2_M_DynamicIsolate(p_hMorphElt);
/* free*/
fn_vFreeMorphListElement(p_hMorphElt);
}
MMG_fn_vAddMemoryInfo( MMG_C_lTypeGAM , MMG_C_lSubTypeMorphList , 0 );
TMP_M_Free(*p_hMorphList);
*p_hMorphList = NULL;
}
/*-----------------------------------------------------------------------------
* Description : Add/change the Morphelement to/of a channel
*-----------------------------------------------------------------------------
* Input : Handle to the list
Channel number
Handle to the physical object
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 12/1/97 Author : Alexander
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vPutMorphElementInChannel(CHN_tdxHandleToMorphList hMorphList,unsigned short uwChannel,ACP_tdxIndex IndexOfMorphList)
{
tdstMorphChannelList *p_stMorph,*p_stMorph2;
unsigned short uwIndex,uwNumOfElts;
/*FB190898 */
if (!hMorphList) return;
/*ENDFB*/
uwNumOfElts=(unsigned short)LST2_M_DynamicGetNumberOfElements(hMorphList);
LST2_M_DynamicForEachElementOf(hMorphList,p_stMorph2,uwIndex)
{
if (p_stMorph2->uwChannelNumber==uwChannel)
/* If the channel is already active*/
{ p_stMorph2->MorphListIndex=IndexOfMorphList;
break;
}
if (p_stMorph2->uwChannelNumber>uwChannel)
/* The channel will be included before the current channel*/
{ break;
}
}
if (!p_stMorph2)
/* If the channel doesn't already active (and end of the list reached)*/
{
p_stMorph=fn_p_stCreateMorphListElement();
p_stMorph->uwChannelNumber=uwChannel;
p_stMorph->MorphListIndex=IndexOfMorphList;
LST2_M_DynamicAddTail(hMorphList,p_stMorph);
}
else
{
if (p_stMorph2->uwChannelNumber!=uwChannel)
/* If the channel doesn't already active*/
{
p_stMorph=fn_p_stCreateMorphListElement();
p_stMorph->uwChannelNumber=uwChannel;
p_stMorph->MorphListIndex=IndexOfMorphList;
LST2_M_DynamicInsertBetween(p_stMorph,LST2_M_DynamicGetPrevElement(p_stMorph2),p_stMorph2);
}
}
}
/*-----------------------------------------------------------------------------
* Description : Remove a channel from the list
*-----------------------------------------------------------------------------
* Input : Handle to the list
Channel number
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 12/2/97 Author : Alexander
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
void fn_vRemoveChannelFromMorphList(CHN_tdxHandleToMorphList hMorphList,unsigned short uwChannel)
{
tdstMorphChannelList *p_stMorph,*p_stMorph_Next;
unsigned short uwIndex;
/*FB190898 */
if (!hMorphList) return;
/*ENDFB*/
LST2_M_DynamicForEachMovingElementOf(hMorphList,p_stMorph,p_stMorph_Next,uwIndex)
{
if (p_stMorph->uwChannelNumber==uwChannel)
{
if (!LST2_M_DynamicGetNumberOfElements(hMorphList)) break;
LST2_M_DynamicIsolate(p_stMorph);
fn_vFreeMorphListElement(p_stMorph);
break;
}
}
}
/*-----------------------------------------------------------------------------
* Description : Return the MorphListIndex corresponding to a channel
*-----------------------------------------------------------------------------
* Input : Handle to the list
Channel number
* Output : None
*-----------------------------------------------------------------------------
* Creation date : 03/25/97 Author : Alexander
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
ACP_tdxIndex fn_hMorphListIndex(CHN_tdxHandleToMorphList hMorphList,unsigned short uwChannel)
{
tdstMorphChannelList *p_stMorph;
unsigned short uwIndex;
/*FB190898 */
if (!hMorphList) return -1;
/*ENDFB*/
LST2_M_DynamicForEachElementOf(hMorphList,p_stMorph,uwIndex)
{
if (p_stMorph->uwChannelNumber==uwChannel)
/* If the channel is found*/
{ return p_stMorph->MorphListIndex;
}
if (p_stMorph->uwChannelNumber>uwChannel)
/* The channel doesn't exist*/
{ return -1;
}
}
/* The channel doesn't exist*/
return -1;
}
/*-----------------------------------------------------------------------------
* Description : Return the PO currently morphed in a specific channel, NULL if none
*-----------------------------------------------------------------------------
* Input : Handle to the list
Channel number
* Output : PO
*-----------------------------------------------------------------------------
* Creation date : 01/27/98 Author : Alexis Vaisse
*-----------------------------------------------------------------------------
* Modification date : Modification Author :
* Modifications :
*---------------------------------------------------------------------------*/
PO_tdxHandleToPhysicalObject fn_hGetMorphedObjectInChannel (CHN_tdxHandleToMorphList hMorphList,unsigned short uwChannel)
{
ACP_tdxIndex xIndex = fn_hMorphListIndex(hMorphList, uwChannel);
return xIndex != -1 ? MOR_fn_hGetMorphedObject (xIndex) : NULL;
}