830 lines
33 KiB
C++
830 lines
33 KiB
C++
// implementation of special world class for the 3DTool Dll
|
||
|
||
|
||
//// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
||
//// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
||
//// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
||
//// WARNING WARNING
|
||
//// WARNING WARNING
|
||
//// WARNING SuperObjects are not destroyed !!!!! WARNING
|
||
//// WARNING WARNING
|
||
//// WARNING WARNING
|
||
//// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
||
//// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
||
//// WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING WARNING
|
||
|
||
#ifdef ACTIVE_EDITOR
|
||
|
||
#include "stdafx.h"
|
||
|
||
#define D_State_Define
|
||
#define HieFriend
|
||
|
||
#include "ACP_Base.h"
|
||
#include "incGam.h"
|
||
#include "Itf.h"
|
||
//#include "HIE.h"
|
||
|
||
#include "T3DWorld.hpp"
|
||
|
||
inline POS_tdxHandleToPosition M_AllocMatrix()
|
||
{
|
||
POS_tdxHandleToPosition hPos = (POS_tdxHandleToPosition) malloc (sizeof (POS_tdstCompletePosition) );
|
||
POS_fn_vSetIdentityMatrix(hPos);
|
||
|
||
return hPos;
|
||
}
|
||
|
||
//#define M_AllocMatrix() ((POS_tdxHandleToPosition) malloc (sizeof (POS_tdstCompletePosition)))
|
||
|
||
//#define M_AllocMatrix() POS_fn_hCreateMatrix(POS_C_xCompletePosition);
|
||
|
||
#define M_GetCopyOfSuperObject(p_oSprObj) (p_oSprObj) -> GetMainWorld() -> GetInterface() -> GetCopyOfSuperObject(p_oSprObj)
|
||
|
||
#define M_ForEachSuperObjectChild( p_oSprObjFather, p_oSprObjChild ) \
|
||
for( p_oSprObjChild = p_oSprObjFather -> GetSuperObjectFirstChild() ; \
|
||
p_oSprObjChild ; \
|
||
p_oSprObjChild = p_oSprObjFather -> GetSuperObjectNextChild( p_oSprObjChild ) )
|
||
|
||
#define M_T3DDeleteSuperObject( p_oSO, bWithEngine )\
|
||
{ \
|
||
if( p_oSO ) \
|
||
{ \
|
||
if( p_oSO -> GetStruct() ) \
|
||
p_oSO -> SetObject( NULL ); \
|
||
if( ! bWithEngine ) \
|
||
p_oSO -> SetSuperObjectStruct( NULL ); \
|
||
p_oSO -> fn_bUnValidate(); \
|
||
/*delete p_oSO;*/ \
|
||
} \
|
||
}
|
||
|
||
#define M_T3DStepSize 10
|
||
#define M_T3DInitSize 50
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
|
||
|
||
//--------------------------------------------------------------------------------
|
||
// constructor :
|
||
//--------------------------------------------------------------------------------
|
||
Tool3D_World::Tool3D_World(CPA_MainWorld *_p_oMainWorld)
|
||
:CPA_World(_p_oMainWorld, TRUE)
|
||
|
||
{
|
||
CPA_SuperObject *p_Root = _p_oMainWorld -> GetInterface() -> GetCopyOfSuperObject( _p_oMainWorld -> GetWorld() -> GetRoot() );
|
||
POS_tdxHandleToPosition hMatrix;
|
||
// fbolefeysot - 01/07/98{
|
||
// CHN_tdxHandleToChannelArray hChannelArray;
|
||
//END fbolefeysot}
|
||
//CHN_tdxHandleToCASList hCAList;
|
||
//CHN_tdxHandleToUCCList hUCCList;
|
||
|
||
p_Root -> SetObject(_p_oMainWorld -> GetWorld() -> GetRoot() -> GetObject());
|
||
hMatrix = HIE_fn_hGetSuperObjectMatrix(p_Root -> GetStruct());
|
||
POS_fn_vSetIdentityMatrix(hMatrix);
|
||
|
||
p_Root -> SetEditProtected( TRUE );
|
||
fn_vSetRoot(p_Root);
|
||
|
||
// init values
|
||
m_eWorldType = C_eNone;
|
||
m_p_oRootFromAnim = NULL;
|
||
//
|
||
m_oListOfSO . RemoveAll();
|
||
m_xLastSOUsedPosition = NULL;
|
||
|
||
m_p_oBaseFromAnim = NULL;
|
||
m_p_oDLLPO = NULL;
|
||
m_p_oInterface = NULL;
|
||
|
||
m_p_stEngineObject = (tdstEngineObject *) malloc( sizeof( struct tdstEngineObject_ ) );
|
||
memset( m_p_stEngineObject, 0, sizeof(struct tdstEngineObject_) );
|
||
fn_v3dDataAlloc( m_p_stEngineObject );
|
||
//
|
||
// fbolefeysot - 01/07/98{
|
||
// fn_vInitCSOList( & hCSOList, );
|
||
//END fbolefeysot}
|
||
// fn_vInitCASList( & hCAList );
|
||
//fn_vInitUCCList( & hUCCList );
|
||
//
|
||
// fbolefeysot - 01/07/98{
|
||
fn_v3dDataSetChannelSOList( m_p_stEngineObject -> h_3dData, NULL );
|
||
fn_v3dDataSetFirstActiveChannel(m_p_stEngineObject -> h_3dData, NULL );
|
||
m_stState.p_stAnim = NULL;
|
||
//END fbolefeysot}
|
||
// fn_v3dDataSetChannelActivationList( m_p_stEngineObject -> h_3dData, hCAList );
|
||
//fn_v3dDataSetChannelUnderControlList( m_p_stEngineObject -> h_3dData, hUCCList );
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------
|
||
// Destructor :
|
||
//--------------------------------------------------------------------------------
|
||
Tool3D_World::~Tool3D_World()
|
||
{
|
||
CPA_SuperObject *p_oSO;
|
||
|
||
M_T3DDeleteSuperObject( GetRoot(), TRUE );
|
||
|
||
fn_vSetRoot( NULL );
|
||
while( ! m_oListOfSO . IsEmpty() )
|
||
{
|
||
p_oSO = m_oListOfSO . RemoveHead();
|
||
if( p_oSO )
|
||
M_T3DDeleteSuperObject( p_oSO, FALSE );
|
||
}
|
||
|
||
free(m_p_stEngineObject);
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------
|
||
// Description :
|
||
//--------------------------------------------------------------------------------
|
||
BOOL Tool3D_World::mfn_bAcceptModif(CPA_ObjectDLLBase *pDLLBase)
|
||
{
|
||
if( (m_eWorldType == C_eGridActor) || (m_eWorldType == C_eGridList) )
|
||
return ( pDLLBase && ( ( pDLLBase -> GetName() == C_szDLLZDxName ) ||
|
||
( pDLLBase -> GetName() == C_szDLLGeometryName )
|
||
)
|
||
);
|
||
else
|
||
return ( pDLLBase && pDLLBase -> GetName() == C_szDLLZDxName );
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------
|
||
// Description : create a new hierarchy from an actor
|
||
//--------------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vCreateHierarchyFromActor(CPA_SuperObject *_p_oSprObj)
|
||
{
|
||
ASSERT(0);
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------
|
||
// Description : create a new hierarchy from a superobject
|
||
//--------------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vCreateHierarchyFromSuperObject(CPA_SuperObject *_p_oSprObj)
|
||
{
|
||
mfn_vCreateHierarchyFromObject( _p_oSprObj -> GetObject() );
|
||
//
|
||
m_eWorldType = C_eSuperObject;
|
||
m_p_oRootFromAnim = NULL;
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------
|
||
// Description : create a new hierarchy from an object
|
||
//--------------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vCreateHierarchyFromObject(CPA_BaseObject *_p_oObject)
|
||
{
|
||
POS_tdxHandleToPosition hMatrix;
|
||
MTH3D_tdstVector stCenter;
|
||
|
||
m_eWorldType = C_eObject;
|
||
m_p_oRootFromAnim = NULL;
|
||
// create new SuperObject
|
||
CPA_SuperObject *p_oNewSprObj = M_GetCopyOfSuperObject( GetRoot() );
|
||
// set object of new SuperObject
|
||
p_oNewSprObj -> SetObject( _p_oObject );
|
||
//
|
||
p_oNewSprObj -> SetEditProtected( FALSE );
|
||
// add new SuperObject to Hierarchy
|
||
fn_vInsertSuperObjectInNewWorld( p_oNewSprObj, GetRoot(), FALSE );
|
||
// center object
|
||
hMatrix = HIE_fn_hGetSuperObjectMatrix(p_oNewSprObj -> GetStruct());
|
||
POS_fn_vSetIdentityMatrix(hMatrix);
|
||
if( mfn_bComputeCenterAndRadiusBoundingBox( p_oNewSprObj, &stCenter ) )
|
||
{
|
||
MTH3D_tdstVector stTranslation;
|
||
|
||
POS_fn_vGetTranslationVector( hMatrix, &stTranslation );
|
||
MTH3D_M_vSubVector(&stTranslation, &stTranslation, &stCenter);
|
||
POS_fn_vSetTranslationVector( hMatrix, &stTranslation );
|
||
}
|
||
POS_fn_vNormalizeMatrix(hMatrix);
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------
|
||
// Description : create a new hierarchy from an actor to a grid view
|
||
//--------------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vCreateGridHierarchyFromActor(CPA_SuperObject *_p_oSprObj)
|
||
{
|
||
m_eWorldType = C_eGridActor;
|
||
m_p_oRootFromAnim = NULL;
|
||
// create new hierarchy
|
||
mfn_vLinearizeHierarchy( GetRoot(), _p_oSprObj);
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------
|
||
// Description : create a new hierarchy from a list of objects to a grid view
|
||
//--------------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vCreateGridHierarchyFromList(CPA_List<CPA_BaseObject> *_p_oList, CPA_MainWorld *_p_oMainWorld)
|
||
{
|
||
m_eWorldType = C_eGridList;
|
||
m_p_oRootFromAnim = NULL;
|
||
// create new hierarchy
|
||
POSITION stPos = _p_oList -> GetHeadPosition();
|
||
while(stPos)
|
||
{
|
||
CPA_BaseObject *p_Object = _p_oList -> GetNext( stPos );
|
||
//??? CPA_SuperObject *pLastSprObj = p_Object -> GetSuperObject();
|
||
CPA_SuperObject *pSuper_Object = _p_oMainWorld -> GetInterface() -> GetNewSuperObject(E_ss_NoSave);
|
||
// save link
|
||
// create the matrix of the super object
|
||
POS_tdstCompletePosition *p_stPos;
|
||
|
||
p_stPos = M_AllocMatrix();
|
||
POS_fn_vSetIdentityMatrix(p_stPos);
|
||
HIE_fn_vSetSuperObjectMatrix(pSuper_Object -> GetStruct () , p_stPos);
|
||
|
||
p_stPos = M_AllocMatrix();
|
||
POS_fn_vSetIdentityMatrix(p_stPos);
|
||
pSuper_Object -> GetStruct () -> hGlobalMatrix = p_stPos;
|
||
|
||
POS_fn_vSetIdentityMatrix(HIE_fn_hGetSuperObjectMatrix (pSuper_Object -> GetStruct ()));
|
||
POS_fn_vSetIdentityMatrix(HIE_fn_hGetSuperObjectGlobalMatrix (pSuper_Object -> GetStruct ()));
|
||
//
|
||
pSuper_Object->SetObject(p_Object);
|
||
// add superobject to new world
|
||
fn_vInsertSuperObjectInNewWorld( pSuper_Object, GetRoot(), FALSE );
|
||
}
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------
|
||
// Description : create a new hierarchy from an objects Table
|
||
//--------------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vCreateGridHierarchyFromTable(CPA_BaseObject *_p_oTable, CPA_MainWorld *_p_oMainWorld)
|
||
{
|
||
CPA_List<CPA_BaseObject> oList;
|
||
long lNbObjects;
|
||
|
||
lNbObjects = _p_oMainWorld -> fn_lFindObjects( &oList, "", C_szPhysicalObjectTypeName, _p_oTable );
|
||
if( lNbObjects )
|
||
mfn_vCreateGridHierarchyFromList( &oList, _p_oMainWorld );
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Description : Fill world with VWOI (NEW)
|
||
// ----------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vCreateViewerHierarchyFromVWOIList(CPA_List<tdst_VW_ObjInfo> *_p_oListOfVWOI, CPA_MainWorld *_p_oMainWorld)
|
||
{
|
||
m_p_oRootFromAnim = NULL;
|
||
m_eWorldType = C_eViewer;
|
||
// create new hierarchy
|
||
POSITION stPos = _p_oListOfVWOI -> GetHeadPosition();
|
||
while(stPos)
|
||
{
|
||
CPA_SuperObject *p_oLastFather = _p_oListOfVWOI -> GetNext(stPos) -> m_p_oSuperObject;
|
||
CPA_BaseObject *p_oObject = p_oLastFather -> GetObject();
|
||
CPA_SuperObject *p_oNewFather = _p_oMainWorld -> GetInterface() -> GetNewSuperObject(E_ss_NoSave);
|
||
// add super object
|
||
// create the matrix of the super object
|
||
|
||
POS_tdstCompletePosition *p_stPos;
|
||
|
||
p_stPos = M_AllocMatrix();
|
||
POS_fn_vSetIdentityMatrix(p_stPos);
|
||
HIE_fn_vSetSuperObjectMatrix(p_oNewFather -> GetStruct () , p_stPos);
|
||
|
||
p_stPos = M_AllocMatrix();
|
||
POS_fn_vSetIdentityMatrix(p_stPos);
|
||
p_oNewFather -> GetStruct () -> hGlobalMatrix = p_stPos;
|
||
|
||
POS_fn_vSetIdentityMatrix(HIE_fn_hGetSuperObjectMatrix (p_oNewFather -> GetStruct ()));
|
||
POS_fn_vSetIdentityMatrix(HIE_fn_hGetSuperObjectGlobalMatrix (p_oNewFather -> GetStruct ()));
|
||
p_oNewFather -> SetObject(p_oObject);
|
||
// add SuperObject to new hierarchy
|
||
fn_vInsertSuperObjectInNewWorld( p_oNewFather, GetRoot(), FALSE );
|
||
// duplicate child hierarchy
|
||
mfn_vDuplicateHierarchy( p_oNewFather, p_oLastFather);
|
||
}
|
||
// compute position of objects
|
||
mfn_vComputeSuperObjectPosFromViewer();
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// ----------------------------------------------------------------------------
|
||
// ----------------------------------------------------------------------------
|
||
// ----------------------------------------------------------------------------
|
||
// ----------------------------------------------------------------------------
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : create hierarchy (SO+O) using anim, frame and objects table
|
||
*---------------------------------------------------------------------------*/
|
||
CPA_SuperObject *Tool3D_World::mfn_p_oCreateHierarchyFromAnim(CPA_SuperObject *_p_oSprObjActor)
|
||
{
|
||
HIE_tdxHandleToSuperObject hSO = _p_oSprObjActor -> GetStruct();
|
||
MS_tdxHandleTo3dData h3dData = M_GetMSHandle( hSO, 3dData );
|
||
MS_tdxHandleTo3dData h3dDataCopy = m_p_stEngineObject -> h_3dData;
|
||
tdxHandleToState hState = fn_h3dDataGetCurrentState( h3dData ) ? fn_h3dDataGetCurrentState( h3dData )
|
||
: fn_h3dDataGetInitialState( h3dData );
|
||
struct tdstAnim3d_ *p_stAnim = hState ? fn_p_stGetAnimInState( hState ) : NULL;
|
||
unsigned short uwFrame = fn_uw3dDataGetCurrentFrame( h3dData );
|
||
POS_tdxHandleToPosition hMatrix;
|
||
MTH3D_tdstVector stCenter;
|
||
// fbolefeysot - 01/07/98{
|
||
CHN_tdxHandleToChannelArray hChannelArray;
|
||
//END fbolefeysot}
|
||
//CHN_tdxHandleToCASList hCAList;
|
||
//CHN_tdxHandleToUCCList hUCCList;
|
||
|
||
//Stefan Dumitrean 1-06-98
|
||
if( !p_stAnim )
|
||
return NULL;
|
||
//End Stefan Dumitrean 1-06-98
|
||
|
||
m_eWorldType = C_eAnimOK;
|
||
|
||
// create new SuperObject that will be put in T3D world
|
||
CPA_SuperObject *p_oNewSprObj = M_GetCopyOfSuperObject( _p_oSprObjActor );
|
||
// T3D world actor object is the same as the main world actor object
|
||
p_oNewSprObj -> SetObject( _p_oSprObjActor -> GetObject() );
|
||
// duplicate 3dData structure in a safe variable
|
||
memcpy(h3dDataCopy,h3dData,fn_ul3dDataSizeOf());
|
||
// fn_v3dDataCopyClone( m_p_stEngineObject, (tdstEngineObject *)HIE_fn_hGetSuperObjectObject( hSO ) );
|
||
|
||
// clear channel array
|
||
// fn_vInitCSOList(&hChannelArray,fn_ul3dDataGetNumberOfChannels(h3dData));
|
||
// copy the original channel array and first active channel in the safe structure
|
||
// fn_v3dDataSetChannelSOList( h3dDataCopy, fn_h3dDataGetChannelSOList(h3dData) );
|
||
// fn_v3dDataSetFirstActiveChannel(h3dDataCopy,fn_h3dDataGetFirstActiveChannel(h3dData));
|
||
// fn_p_st3dDataGetCurrentFrame(h3dDataCopy)->p_stArrayOfElts3d = fn_p_st3dDataGetCurrentFrame(h3dData)->p_stArrayOfElts3d;
|
||
|
||
// reset dynamic datas
|
||
fn_v3dDataSetChannelSOList(h3dData,NULL);
|
||
fn_v3dDataSetFirstActiveChannel(h3dData,NULL);
|
||
fn_p_st3dDataGetCurrentFrame(h3dData)->p_stArrayOfElts3d = NULL;
|
||
fn_p_st3dDataGetCurrentFrame(h3dData)->stHierarchy.ulNbOfCouples = 0;
|
||
fn_p_st3dDataGetCurrentFrame(h3dData)->stHierarchy.d_stCouples= NULL;
|
||
fn_v3dDataSetSizeOfArrayOfElts3d(h3dData,0);
|
||
fn_v3dDataSetCurrentState(h3dData,&m_stState);
|
||
|
||
// put the new SuperObject into T3D world
|
||
fn_vInsertSuperObjectInNewWorld( p_oNewSprObj, GetRoot(), FALSE );
|
||
|
||
// save SO tht is in the T3D world
|
||
m_p_oRootFromAnim = p_oNewSprObj;
|
||
// save SO that is in the real world
|
||
m_p_oBaseFromAnim = _p_oSprObjActor;
|
||
// init used values
|
||
m_p_oDLLPO = GetRoot() -> GetMainWorld() -> GetObjectDLLWithName( C_szDLLPhysicalObjectName );
|
||
m_p_oInterface = GetRoot() -> GetMainWorld() -> GetInterface();
|
||
|
||
// center object
|
||
hMatrix = HIE_fn_hGetSuperObjectMatrix(p_oNewSprObj -> GetStruct());
|
||
POS_fn_vSetIdentityMatrix(hMatrix);
|
||
if( mfn_bComputeCenterAndRadiusBoundingBox( p_oNewSprObj, &stCenter ) )
|
||
{
|
||
MTH3D_tdstVector stTranslation;
|
||
|
||
POS_fn_vGetTranslationVector( hMatrix, &stTranslation );
|
||
MTH3D_M_vSubVector(&stTranslation, &stTranslation, &stCenter);
|
||
POS_fn_vSetTranslationVector( hMatrix, &stTranslation );
|
||
}
|
||
POS_fn_vNormalizeMatrix(hMatrix);
|
||
|
||
// uwFrame %= p_stAnim -> uwNumberOfFrames;
|
||
// fn_v3dDataSetCurrentFrame( h3dData, uwFrame );
|
||
|
||
mfn_vUpdateHierarchyFromAnim(p_stAnim,fn_uw3dDataGetCurrentFrame(M_GetMSHandle(hSO,3dData)));
|
||
|
||
return p_oNewSprObj;
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : update hierarchy (SO+O) using anim, frame and objects table
|
||
*---------------------------------------------------------------------------*/
|
||
void Tool3D_World::mfn_vUpdateHierarchyFromAnim(struct tdstAnim3d_* _p_stAnim, unsigned short _uwFrame)
|
||
{
|
||
//
|
||
HIE_tdxHandleToSuperObject hSO = m_p_oRootFromAnim -> GetStruct();
|
||
|
||
m_eWorldType = C_eAnimTemp;
|
||
// clear editor hierarchy
|
||
mfn_vClearHierarchy( m_p_oRootFromAnim );
|
||
// construct engine hierarchy
|
||
fn_v3dDataSetCurrentFrame( M_GetMSHandle( hSO, 3dData ), _uwFrame );
|
||
fn_p_st3dDataGetCurrentFrame(M_GetMSHandle(hSO,3dData))->p_stAnim = NULL;
|
||
fn_v3dDataSetFlagModifState(M_GetMSHandle(hSO,3dData),TRUE);
|
||
if (fn_h3dDataGetCurrentState(M_GetMSHandle(hSO,3dData))->p_stAnim == NULL)
|
||
fn_h3dDataGetCurrentState(M_GetMSHandle(hSO,3dData))->p_stAnim = _p_stAnim;
|
||
PLA_fn_bDoFirstInitOfAnimPlayerForCharacter(hSO, _p_stAnim);
|
||
// encapsulate with editor object
|
||
mfn_vFillHierarchyWithEngineAnim( m_p_oRootFromAnim, TRUE );
|
||
//
|
||
m_p_oInterface -> fn_vChangeWorld();
|
||
}
|
||
|
||
/*-----------------------------------------------------------------------------
|
||
* Description : update hierarchy (SO) using anim, frame and objects table
|
||
*---------------------------------------------------------------------------*/
|
||
void Tool3D_World::mfn_vPlayAnim(struct tdstAnim3d_* _p_stAnim, unsigned short _uwFrame)
|
||
{
|
||
HIE_tdxHandleToSuperObject hSO = m_p_oRootFromAnim -> GetStruct();
|
||
//
|
||
m_eWorldType = C_eAnimTemp;
|
||
// clear editor hierarchy
|
||
mfn_vClearHierarchy( m_p_oRootFromAnim );
|
||
// construct engine hierarchy
|
||
fn_v3dDataSetCurrentFrame( M_GetMSHandle( hSO, 3dData ), _uwFrame );
|
||
fn_p_st3dDataGetCurrentFrame(M_GetMSHandle(hSO,3dData))->p_stAnim = NULL;
|
||
PLA_fn_vInitAllChildInHeapNewAnim( hSO, _p_stAnim, _uwFrame );
|
||
PLA_fn_vDoFrame( _p_stAnim, _uwFrame, hSO );
|
||
// encapsulate with editor object
|
||
mfn_vFillHierarchyWithEngineAnim( m_p_oRootFromAnim, FALSE );
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// ----------------------------------------------------------------------------
|
||
// ----------------------------------------------------------------------------
|
||
// ----------------------------------------------------------------------------
|
||
// ----------------------------------------------------------------------------
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Description : Remove world and delete all SuperObjects created
|
||
// ----------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vResetWorld(void)
|
||
{
|
||
if( (m_eWorldType == C_eAnimTemp) || (m_eWorldType == C_eAnimOK) )
|
||
{
|
||
//
|
||
HIE_tdxHandleToSuperObject hSO = m_p_oRootFromAnim -> GetStruct();
|
||
MS_tdxHandleTo3dData h3dData = M_GetMSHandle( hSO, 3dData );
|
||
MS_tdxHandleTo3dData h3dDataCopy = m_p_stEngineObject -> h_3dData;
|
||
// fbolefeysot - 01/07/98{
|
||
CHN_tdxHandleToChannelArray hChannelArray;
|
||
//END fbolefeysot}
|
||
//CHN_tdxHandleToCASList hCAList;
|
||
//CHN_tdxHandleToUCCList hUCCList;
|
||
// PLA_fn_vDesInitAllChildOfCharacter(hSO,(struct tdstEngineObject_*)HIE_fn_hGetSuperObjectObject(hSO));
|
||
|
||
// hChannelArray = fn_h3dDataGetChannelSOList( h3dData );
|
||
// fn_vFreeCSOList( & hChannelArray/*, fn_ul3dDataGetNumberOfChannels(h3dData)*/);
|
||
|
||
// fn_v3dDataSetChannelSOList( h3dData, NULL );
|
||
// fn_v3dDataSetFirstActiveChannel( h3dData, NULL );
|
||
|
||
fn_v3dDataCopyClone( (tdstEngineObject *)HIE_fn_hGetSuperObjectObject( hSO ), m_p_stEngineObject );
|
||
memcpy(h3dData,h3dDataCopy,fn_ul3dDataSizeOf());
|
||
|
||
// fbolefeysot - 01/07/98{
|
||
//END fbolefeysot}
|
||
// hCAList = fn_h3dDataGetChannelActivationList(h3dData);
|
||
//hUCCList = fn_h3dDataGetChannelUnderControlList(h3dData);
|
||
// restore list on Real Actor
|
||
// fn_v3dDataSetChannelSOList( h3dData, fn_h3dDataGetChannelSOList(h3dDataCopy) );
|
||
// fn_v3dDataSetFirstActiveChannel(h3dData,fn_h3dDataGetFirstActiveChannel(h3dDataCopy ));
|
||
// fn_p_st3dDataGetCurrentFrame(h3dData)->p_stArrayOfElts3d = fn_p_st3dDataGetCurrentFrame(h3dDataCopy)->p_stArrayOfElts3d;
|
||
//fn_v3dDataSetChannelActivationList( h3dData, fn_h3dDataGetChannelActivationList(h3dDataCopy) );
|
||
//fn_v3dDataSetChannelUnderControlList( h3dData, fn_h3dDataGetChannelUnderControlList(h3dDataCopy) );
|
||
// reinit list on local backup structure
|
||
// fbolefeysot - 01/07/98{
|
||
//END fbolefeysot}
|
||
// fn_vFreeCASList( & hCAList );
|
||
//fn_vFreeUCCList( & hUCCList );
|
||
//
|
||
// fbolefeysot - 01/07/98{
|
||
// fn_vInitCSOList( & hCSOList );
|
||
//END fbolefeysot}
|
||
// fn_vInitCASList( & hCAList );
|
||
//fn_vInitUCCList( & hUCCList );
|
||
//
|
||
// fbolefeysot - 01/07/98{
|
||
// fn_v3dDataSetChannelSOList( h3dDataCopy, NULL );
|
||
// fn_v3dDataSetFirstActiveChannel( h3dDataCopy, NULL );
|
||
// fn_p_st3dDataGetCurrentFrame(h3dDataCopy)->p_stArrayOfElts3d = NULL;
|
||
//END fbolefeysot}
|
||
// fn_v3dDataSetChannelActivationList( h3dDataCopy, hCAList );
|
||
//fn_v3dDataSetChannelUnderControlList( h3dDataCopy, hUCCList );
|
||
//
|
||
|
||
mfn_vClearHierarchy( m_p_oRootFromAnim, TRUE );
|
||
m_p_oRootFromAnim -> Isolate( FALSE );
|
||
fn_vUpdateListObjects(m_p_oRootFromAnim, E_lum_Delete, FALSE);
|
||
}
|
||
else
|
||
{
|
||
// delete New Hierarchy
|
||
mfn_vResetHierarchy( GetRoot() );
|
||
}
|
||
m_p_oRootFromAnim = NULL;
|
||
m_eWorldType = C_eNone;
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------
|
||
// protected functions
|
||
//--------------------------------------------------------------------------------
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Description : Duplicate Hierarchy from _p_oPreviousFather to _p_oNewFather
|
||
// ----------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vDuplicateHierarchy(CPA_SuperObject *_p_oNewFather, CPA_SuperObject *_p_oPreviousFather)
|
||
{
|
||
CPA_SuperObject *p_oEdChild;
|
||
|
||
M_ForEachSuperObjectChild( _p_oPreviousFather, p_oEdChild )
|
||
{
|
||
// create new SuperObject
|
||
CPA_SuperObject *p_oNewSprObj = M_GetCopyOfSuperObject(p_oEdChild);
|
||
// set object of new SuperObject
|
||
p_oNewSprObj -> SetObject( p_oEdChild -> GetObject() );
|
||
// add new SuperObject to Hierarchy
|
||
fn_vInsertSuperObjectInNewWorld( p_oNewSprObj, _p_oNewFather, FALSE );
|
||
// Duplicate child Hierarchy
|
||
mfn_vDuplicateHierarchy( p_oNewSprObj, p_oEdChild );
|
||
}
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Description : Duplicate Hierarchy from _p_oPreviousFather to _p_oNewFather
|
||
// ----------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vLinearizeHierarchy(CPA_SuperObject *_p_oNewFather, CPA_SuperObject *_p_oPreviousFather)
|
||
{
|
||
CPA_SuperObject *p_oEdChild;
|
||
|
||
M_ForEachSuperObjectChild( _p_oPreviousFather, p_oEdChild )
|
||
{
|
||
|
||
// jt 19/8/97
|
||
// Pour <20>viter de traiter les super-objets correspondant <20> des canaux
|
||
// J'ai un cas ou les matrices du super objet ne sont pas correctement allou<6F>es -> plantage
|
||
// Il y a surement mieux <20> faire.
|
||
if (p_oEdChild->GetObject())
|
||
{
|
||
// end jt 19/8/97
|
||
|
||
// create new SuperObject
|
||
CPA_SuperObject *p_oNewSprObj = M_GetCopyOfSuperObject(p_oEdChild);
|
||
// unprotect SuperObject
|
||
p_oNewSprObj -> SetEditProtected( FALSE );
|
||
// set object of new SuperObject
|
||
p_oNewSprObj -> SetObject( p_oEdChild -> GetObject() );
|
||
// add new SuperObject to Hierarchy
|
||
fn_vInsertSuperObjectInNewWorld( p_oNewSprObj, _p_oNewFather, FALSE );
|
||
// Duplicate child Hierarchy
|
||
mfn_vLinearizeHierarchy( _p_oNewFather, p_oEdChild );
|
||
|
||
|
||
// jt 19/8/97
|
||
}
|
||
// end jt 19/8/97
|
||
|
||
}
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Description : Delete all SuperObjects from hierarchy
|
||
// ----------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vDeleteHierarchy( CPA_SuperObject *_p_oFather )
|
||
{
|
||
// delete child
|
||
CPA_SuperObject *p_oEdChild = _p_oFather -> GetSuperObjectFirstChild();
|
||
while ( p_oEdChild )
|
||
{
|
||
CPA_SuperObject *p_oChild = p_oEdChild;
|
||
// next child
|
||
p_oEdChild = _p_oFather -> GetSuperObjectNextChild( p_oEdChild );
|
||
// delete
|
||
mfn_vDeleteHierarchy( p_oChild );
|
||
}
|
||
// remove from hierarchy
|
||
fn_vDeleteSuperObjectInNewWorld( _p_oFather, FALSE ) ;
|
||
// delete father
|
||
M_T3DDeleteSuperObject( _p_oFather, TRUE );
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Description : compute max sphere box
|
||
// ----------------------------------------------------------------------------
|
||
MTH_tdxReal Tool3D_World::m_fn_vComputeMaxSphereBoxRadius(void)
|
||
{
|
||
MTH_tdxReal xMaxSphereBoxRadius = 0;
|
||
|
||
CPA_SuperObject *p_oEdChild;
|
||
M_ForEachSuperObjectChild( GetRoot(), p_oEdChild )
|
||
{
|
||
MTH_tdxReal xRadius = m_fn_xGetSphereBoxRadius( p_oEdChild );
|
||
xMaxSphereBoxRadius = MTH_M_xMax( xMaxSphereBoxRadius, xRadius );
|
||
}
|
||
|
||
return xMaxSphereBoxRadius;
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Description : compute radius of object sphere box (with his child)
|
||
// ----------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vComputeSuperObjectPosFromViewer(void)
|
||
{
|
||
// compute max sphere box radius
|
||
MTH_tdxReal xRadius = MTH_M_xMul(m_fn_vComputeMaxSphereBoxRadius() , 100 );
|
||
short wIndex = 0;
|
||
|
||
CPA_SuperObject *p_oEdChild;
|
||
M_ForEachSuperObjectChild( GetRoot(), p_oEdChild )
|
||
{
|
||
POS_tdxHandleToPosition hMatrix;
|
||
MTH3D_tdstVector st3DCenter,st3DPosition;
|
||
MTH3D_tdstVector stTranslation;
|
||
|
||
MTH3D_M_vSetVectorElements(&st3DPosition, MTH_M_xMul(xRadius,wIndex) , 0 , 0 );
|
||
hMatrix = HIE_fn_hGetSuperObjectMatrix(p_oEdChild->GetStruct());
|
||
POS_fn_vSetIdentityMatrix(hMatrix);
|
||
|
||
// get translation vector
|
||
POS_fn_vGetTranslationVector( hMatrix, &stTranslation );
|
||
|
||
// First, centred with sphere box center
|
||
if( m_fn_bGetSphereBoxCenter( p_oEdChild, &st3DCenter ) )
|
||
{
|
||
MTH3D_M_vSubVector(&stTranslation, &stTranslation, &st3DCenter);
|
||
}
|
||
// Second, place the object
|
||
MTH3D_M_vAddVector(&stTranslation, &stTranslation, &st3DPosition);
|
||
|
||
// set translation vector
|
||
POS_fn_vSetTranslationVector( hMatrix, &stTranslation );
|
||
|
||
// Force the absolute matrix to be recalculated
|
||
POS_fn_vNormalizeMatrix(hMatrix);
|
||
|
||
wIndex++;
|
||
}
|
||
HIE_fn_vInvalidateAllGlobalMatrices();
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------------
|
||
// Compute the sphere box radius of an object
|
||
//--------------------------------------------------------------------------------------
|
||
MTH_tdxReal Tool3D_World::m_fn_xGetSphereBoxRadius(CPA_SuperObject *_p_oSprObj)
|
||
{
|
||
MTH_tdxReal xResult;
|
||
|
||
if( mfn_bComputeCenterAndRadiusBoundingBox( _p_oSprObj, NULL, &xResult ) )
|
||
return xResult;
|
||
else
|
||
return 0;
|
||
}
|
||
|
||
//--------------------------------------------------------------------------------------
|
||
// Compute the sphere box center of an object
|
||
//--------------------------------------------------------------------------------------
|
||
BOOL Tool3D_World::m_fn_bGetSphereBoxCenter(CPA_SuperObject *_p_oSprObj, MTH3D_tdstVector *_p_stCenter)
|
||
{
|
||
CPA_BaseObject *p_oObject = _p_oSprObj -> GetObject();
|
||
|
||
if( p_oObject )
|
||
{
|
||
MTH_tdxReal xResult;
|
||
|
||
ACP_tdxHandleOfObject hObj = ((CPA_ObjectDLLBase*)p_oObject -> GetEditor()) -> fn_hGetBoundingVolume( p_oObject );
|
||
if( hObj )
|
||
{
|
||
GEO_fn_vGetInfoFromGeometricSphere( _p_stCenter, &xResult, hObj );
|
||
return TRUE;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Compute center of Bounding Box from geometric object
|
||
// ----------------------------------------------------------------------------
|
||
|
||
BOOL Tool3D_World::mfn_bComputeCenterAndRadiusBoundingBox(CPA_SuperObject *_p_oSprObj, MTH3D_tdstVector *_p_stCenter /*=NULL*/, MTH_tdxReal *_xRadius /*=NULL*/)
|
||
{
|
||
CPA_BaseObject *p_oObject = (_p_oSprObj) ? _p_oSprObj -> GetObject() : NULL;
|
||
|
||
|
||
|
||
if( p_oObject )
|
||
{
|
||
MTH_tdxReal xResult;
|
||
MTH3D_tdstVector stCenter;
|
||
|
||
ACP_tdxHandleOfObject hObj = ((CPA_ObjectDLLBase*)p_oObject -> GetEditor()) -> fn_hGetBoundingVolume( p_oObject );
|
||
if( hObj )
|
||
{
|
||
GEO_fn_vGetInfoFromGeometricSphere( &stCenter, &xResult, hObj );
|
||
|
||
if( _p_stCenter )
|
||
{
|
||
POS_tdxHandleToPosition hMatrix;
|
||
MTH3D_M_vNullVector( _p_stCenter );
|
||
hMatrix = HIE_fn_hGetSuperObjectMatrix(_p_oSprObj->GetStruct());
|
||
POS_fn_vMulMatrixVertex( _p_stCenter, hMatrix, &stCenter );
|
||
}
|
||
if( _xRadius )
|
||
*_xRadius = xResult;
|
||
return TRUE;
|
||
}
|
||
}
|
||
return FALSE;
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Author : MT
|
||
// Creation : 20/08/97
|
||
//
|
||
// Description : reset hierarchy from given root
|
||
// ----------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vResetHierarchy(CPA_SuperObject *_p_oRootSO)
|
||
{
|
||
// delete New Hierarchy
|
||
CPA_SuperObject *p_oEdChild = _p_oRootSO -> GetSuperObjectFirstChild();
|
||
while ( p_oEdChild )
|
||
{
|
||
CPA_SuperObject *_p_oChild = p_oEdChild;
|
||
p_oEdChild = _p_oRootSO -> GetSuperObjectNextChild( p_oEdChild );
|
||
// delete child hierarchy
|
||
mfn_vDeleteHierarchy( _p_oChild );
|
||
}
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Author : MT
|
||
// Creation : 20/08/97
|
||
//
|
||
// Description :
|
||
// ----------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vFillHierarchyWithEngineAnim( CPA_SuperObject *_p_oRootSO, BOOL _bWithObject /*=TRUE*/ )
|
||
{
|
||
m_xLastSOUsedPosition = m_oListOfSO . GetHeadPosition();
|
||
//
|
||
if( _p_oRootSO && _p_oRootSO -> GetStruct() )
|
||
mfn_vFillHierarchy( _p_oRootSO, _bWithObject );
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Author : MT
|
||
// Creation : 20/08/97
|
||
//
|
||
// Description :
|
||
// ----------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vFillHierarchy( CPA_SuperObject *_p_oRootSO, BOOL _bWithObject /*=TRUE*/ )
|
||
{
|
||
HIE_tdxHandleToSuperObject hSO;
|
||
HIE_tdxHandleToSuperObject hSOChild;
|
||
long lIndex;
|
||
tdxHandleToVoid hObject;
|
||
CPA_BaseObject *p_oObject;
|
||
CPA_SuperObject *p_oSO;
|
||
|
||
ASSERT( _p_oRootSO && _p_oRootSO -> GetStruct() );
|
||
|
||
hSO = _p_oRootSO -> GetStruct();
|
||
lIndex = 0;
|
||
HIE_M_ForEachChildOf( hSO, hSOChild, lIndex )
|
||
{
|
||
// SO
|
||
if( m_xLastSOUsedPosition )
|
||
{
|
||
p_oSO = m_oListOfSO . GetNext( m_xLastSOUsedPosition );
|
||
p_oSO -> SetSuperObjectStruct( hSOChild );
|
||
}
|
||
else
|
||
{
|
||
p_oSO = m_p_oInterface -> GetNewSuperObject( hSOChild, E_ss_NoSave );
|
||
m_oListOfSO . AddTail( p_oSO );
|
||
}
|
||
ASSERT( p_oSO );
|
||
_p_oRootSO -> AddANewChild( p_oSO, FALSE );
|
||
fn_vUpdateListObjects( p_oSO, E_lum_Insert, FALSE);
|
||
// Object
|
||
if ( _bWithObject )
|
||
{
|
||
if( HIE_fn_ulGetSuperObjectType( hSOChild ) == HIE_C_ulPO )
|
||
{
|
||
hObject = HIE_fn_hGetSuperObjectObject( hSOChild );
|
||
p_oObject = hObject ? m_p_oDLLPO -> GetBaseObject( hObject, C_szPhysicalObjectTypeName ) : NULL;
|
||
p_oSO -> SetObject( p_oObject );
|
||
}
|
||
}
|
||
// hierarchy
|
||
if( p_oSO && p_oSO -> GetStruct() )
|
||
mfn_vFillHierarchy( p_oSO, _bWithObject );
|
||
}
|
||
}
|
||
|
||
// ----------------------------------------------------------------------------
|
||
// Author : MT
|
||
// Creation : 21/08/97
|
||
//
|
||
// Description :
|
||
// ----------------------------------------------------------------------------
|
||
void Tool3D_World::mfn_vClearHierarchy( CPA_SuperObject *_p_oRootSO, BOOL _bDelete /*=FALSE*/ )
|
||
{
|
||
CPA_SuperObject *p_oSO;
|
||
POSITION xPos;
|
||
|
||
xPos = m_oListOfSO . GetHeadPosition();
|
||
while( xPos )
|
||
{
|
||
p_oSO = m_oListOfSO . GetNext( xPos );
|
||
p_oSO -> Isolate( FALSE );
|
||
fn_vUpdateListObjects( p_oSO, E_lum_Delete, FALSE);
|
||
if( _bDelete )
|
||
{
|
||
M_T3DDeleteSuperObject( p_oSO , FALSE );
|
||
}
|
||
}
|
||
m_xLastSOUsedPosition = m_oListOfSO . GetHeadPosition();
|
||
}
|
||
|
||
#endif //ACTIVE_EDITOR
|