//////////////////////////////////////////// // // All CallBacks used by TPG // //////////////////////////////////////////// #include "StdAfx.h" #define D_MSPrtSrc_StructureDefine #include "ErO.h" #include "MTH.h" #include "TPG_ClBk.hpp" #include "_Minterf.hpp" #include "Tpg_Strg.hpp" #include "TPG_Spri.hpp" #ifdef _DEBUG #define new DEBUG_NEW #undef THIS_FILE static char THIS_FILE[] = __FILE__; #endif /* ======================================================================================= General function ======================================================================================= */ /* ---------------------------------------------------------------------------------------- Description : Get a PrtSrc owner data in Editor data Returns (PRT_tdstParticlesSource ) ---------------------------------------------------------------------------------------- */ PRT_tdstParticlesSource *fn_CB_p_stGetOwnerPrtSrc( CTL_Editor_Data *_p_clData ) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ CTL_OwnerData *p_clOwnerData; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Function to get ParticlesSource Owner data", "fn_CB_p_stGetOwnerPrtSrc", E_ERROR_GRAVITY_FATAL, "Ownerdata (PrtSrc) is NULL" ); p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "PrtSrc" ); ERROR_ASSERT( p_clOwnerData != NULL ); return (PRT_tdstParticlesSource *) p_clOwnerData->m_pub_fn_pvGetDataPtr(); } /* ---------------------------------------------------------------------------------------- Description : Check data passed to some call back Returns (PRT_tdstParticlesSource ) ---------------------------------------------------------------------------------------- */ void fn_CB_vCheckData( CTL_Editor_Data *_p_clData ) { ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Function to check data", "fn_CB_p_oCheckData", E_ERROR_GRAVITY_FATAL, "Data is NULL" ); ERROR_ASSERT( _p_clData != NULL ); } /* ---------------------------------------------------------------------------------------- Description : get and check current enum value of an enum data ---------------------------------------------------------------------------------------- */ CTL_Editor_EnumElement *fn_CB_p_oGetCurrentEnumElement( CTL_Editor_Data *_p_clData ) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ CTL_Editor_EnumElement *p_clEnumElement; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Function to retrieve current enum value", "fn_CB_p_oGetCurrentEnumElement", E_ERROR_GRAVITY_FATAL, "Enum current value is NULL" ); p_clEnumElement = ((CTL_Editor_EnumData*)_p_clData)->m_pclCurrentValue; ERROR_ASSERT( p_clEnumElement != NULL ); return p_clEnumElement; } ////////////////////////////////////////////////// // Can Be Displayed CallBacks ////////////////////////////////////////////////// //*** Probability for source generation mode ***** BOOL g_fn_bCallBackCanBeDisplayedSourceProbability( CTL_Editor_Control *_p_clControl ) { CTL_OwnerData *p_clOwnerData; unsigned char *p_ucGenerationMode; ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Is source generation probability displayed ?", "g_fn_bCallBackCanBeDisplayedSourceProbability", E_ERROR_GRAVITY_FATAL, "OwnerData to get generation mode is NULL" ); p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "GenerationMode" ); ERROR_ASSERT( p_clOwnerData != NULL ); p_ucGenerationMode = (unsigned char*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); return (*p_ucGenerationMode == PRT_C_ucProbabilistGeneration); } //*** Nb Frames For source generation mode **** BOOL g_fn_bCallBackCanBeDisplayedSourceNbFrames( CTL_Editor_Control *_p_clControl ) { CTL_OwnerData *p_clOwnerData; unsigned char *p_ucGenerationMode; ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Is source nb frames generation displayed ?", "g_fn_bCallBackCanBeDisplayedSourceNbFrames", E_ERROR_GRAVITY_FATAL, "OwnerData to get generation mode is NULL" ); p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "GenerationMode" ); ERROR_ASSERT( p_clOwnerData != NULL ); p_ucGenerationMode = (unsigned char*) p_clOwnerData->m_pub_fn_pvGetDataPtr(); return (*p_ucGenerationMode == PRT_C_ucCrenelGeneration); } //*** Nb Particles For source nb particles to generate mode BOOL g_fn_bCallBackCanBeDisplayedSourceNbParticles( CTL_Editor_Control *_p_clControl ) { CTL_OwnerData *p_clOwnerData; unsigned char *p_ucNbParticlesMode; ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Is source nb particles constant displayed ?", "g_fn_bCallBackCanBeDisplayedSourceNbParticles", E_ERROR_GRAVITY_FATAL, "OwnerData to get nb particles to generate mode is NULL" ); p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "NbParticlesMode" ); ERROR_ASSERT( p_clOwnerData != NULL ); p_ucNbParticlesMode = (unsigned char*) p_clOwnerData->m_pub_fn_pvGetDataPtr(); return (*p_ucNbParticlesMode == PRT_C_ucConstantNb); } //*** Nb Particles Min/Max For source nb particles to generate mode BOOL g_fn_bCallBackCanBeDisplayedSourceNbParticlesMinMax( CTL_Editor_Control *_p_clControl ) { CTL_OwnerData *p_clOwnerData; unsigned char *p_ucNbParticlesMode; ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Is source nb particles min/max displayed ?", "g_fn_bCallBackCanBeDisplayedSourceNbParticles", E_ERROR_GRAVITY_FATAL, "OwnerData to get nb particles to generate mode is NULL" ); p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "NbParticlesMode" ); ERROR_ASSERT( p_clOwnerData != NULL ); p_ucNbParticlesMode = (unsigned char*) p_clOwnerData->m_pub_fn_pvGetDataPtr(); return (*p_ucNbParticlesMode == PRT_C_ucProbabilistNb); } //*** Quad geometry for source ******************** BOOL g_fn_bCallBackCanBeDisplayedSourceGeometryQuad( CTL_Editor_Control *_p_clControl ) { CTL_OwnerData *p_clOwnerData; unsigned char *p_ucNbParticlesMode; ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Is points 1 and 2 displayed ?", "g_fn_bCallBackCanBeDisplayedSourceGeometryQuad", E_ERROR_GRAVITY_FATAL, "OwnerData to get geometry mode is NULL" ); p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "GeometryMode" ); ERROR_ASSERT( p_clOwnerData != NULL ); p_ucNbParticlesMode = (unsigned char*) p_clOwnerData->m_pub_fn_pvGetDataPtr(); return (*p_ucNbParticlesMode == PRT_C_ucQuad); } //*** Constant Life time ******************** BOOL g_fn_bCallBackCanBeDisplayedSourceConstantLifeTime( CTL_Editor_Control *_p_clControl ) { CTL_OwnerData *p_clOwnerData; unsigned char *p_ucMode; ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Is constant life time displayed ?", "g_fn_bCallBackCanBeDisplayedSourceConstantLifeTime", E_ERROR_GRAVITY_FATAL, "OwnerData to get geometry mode is NULL" ); p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "LifeMode" ); ERROR_ASSERT( p_clOwnerData != NULL ); p_ucMode = (unsigned char*) p_clOwnerData->m_pub_fn_pvGetDataPtr(); return (*p_ucMode == PRT_C_ucConstantLifeTime); } //*** Probabilist Life time ******************** BOOL g_fn_bCallBackCanBeDisplayedSourceProbabilistLifeTime( CTL_Editor_Control *_p_clControl ) { CTL_OwnerData *p_clOwnerData; unsigned char *p_ucMode; ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Are min/max life time displayed ?", "g_fn_bCallBackCanBeDisplayedSourceProbabilistLifeTime", E_ERROR_GRAVITY_FATAL, "OwnerData to get geometry mode is NULL" ); p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "LifeMode" ); ERROR_ASSERT( p_clOwnerData != NULL ); p_ucMode = (unsigned char*) p_clOwnerData->m_pub_fn_pvGetDataPtr(); return (*p_ucMode == PRT_C_ucProbabilistLifeTime); } //*** GameMaterials for system ********************* BOOL g_fn_bCallBackCanBeDisplayedSystemGameMaterials( CTL_Editor_Control * _p_clControl) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Is GameMaterials displayed ?", "g_fn_bCallBackCanBeDisplayedSystemGameMaterials", E_ERROR_GRAVITY_FATAL, "OwnerData to get objects type is NULL"); CTL_OwnerData *p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "ObjectsType" ); ERROR_ASSERT( p_clOwnerData != NULL ); ACP_tdxIndex *p_xType = (ACP_tdxIndex*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); return( (*p_xType == PRT_C_xPointParticles) || (*p_xType == PRT_C_xSegmentParticles) ); } //*** Sprites for system BOOL g_fn_bCallBackCanBeDisplayedSystemSprites( CTL_Editor_Control * _p_clControl) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Is sprites displayed ?", "g_fn_bCallBackCanBeDisplayedSystemSprites", E_ERROR_GRAVITY_FATAL, "OwnerData to get objects type is NULL"); CTL_OwnerData *p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "ObjectsType" ); ERROR_ASSERT( p_clOwnerData != NULL ); ACP_tdxIndex *p_xType = (ACP_tdxIndex*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); return( *p_xType == PRT_C_xSpriteParticles ); } //*** Min Max points for environment box with generator not linked BOOL g_fn_bCallBackCanBeDisplayedEnvBox( CTL_Editor_Control * _p_clControl) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Are min and max points for box displayed ?", "g_fn_bCallBackCanBeDisplayedEnvBox", E_ERROR_GRAVITY_FATAL, "OwnerData to get environment type is NULL"); CTL_OwnerData *p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "EnvType" ); ERROR_ASSERT( p_clOwnerData != NULL ); unsigned long *p_ulType = (unsigned long*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); return( *p_ulType == PRT_C_ulAlignedBoxEnv ); } //*** Sphere center for environment box with generator not linked BOOL g_fn_bCallBackCanBeDisplayedEnvSphere( CTL_Editor_Control * _p_clControl) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Is center for sphere displayed ?", "g_fn_bCallBackCanBeDisplayedEnvSphere", E_ERROR_GRAVITY_FATAL, "OwnerData to get environment type is NULL"); CTL_OwnerData *p_clOwnerData = _p_clControl->m_fn_pclGetEditedData()->m_pub_fn_pclGetOwnerDataWithName( "EnvType" ); ERROR_ASSERT( p_clOwnerData != NULL ); unsigned long *p_ulType = (unsigned long*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); return( *p_ulType == PRT_C_ulSphereEnv ); } //////////////////////////////////////// // Data Changed CallBacks //////////////////////////////////////// //*** data changed for generator ****** void g_fn_vCallBackDataChangedGenerator( CTL_Editor_Data *_p_clData, CTL_eUpdateReason _eReason, long _lUserReason ) { CTL_OwnerData *p_clOwnerData; CPA_PartGen_Generator *p_clGenerator; ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "CallBack to notify generator data has changed", "g_fn_vCallBackDataChangedGenerator", E_ERROR_GRAVITY_FATAL, "OwnerData to get edited generator is NULL" ); p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "EditedGenerator" ); ERROR_ASSERT( p_clOwnerData != NULL ); ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "CallBack to notify generator data has changed", "g_fn_vCallBackDataChangedGenerator", E_ERROR_GRAVITY_FATAL, "Edited generator is NULL" ); p_clGenerator = (CPA_PartGen_Generator*) p_clOwnerData->m_pub_fn_pvGetDataPtr(); ERROR_ASSERT( p_clGenerator != NULL ); p_clGenerator->fn_vNotifySave(); } //*** data changed for Particle source ****** void fn_vCBPrtSrcDataChanged( CTL_Editor_Data *_p_clData, CTL_eUpdateReason _eReason, long _lUserReason ) { CTL_OwnerData *p_clOwnerData; CPA_PartGen_Source *p_oPrtSrc; ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "CallBack to notify Particle source data has changed", "fn_vCBPrtSrcDataChanged", E_ERROR_GRAVITY_FATAL, "OwnerData to get edited source is NULL" ); p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "EditedSource" ); ERROR_ASSERT( p_clOwnerData != NULL ); ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "CallBack to notify Particle source data has changed", "fn_vCBPrtSrcDataChanged", E_ERROR_GRAVITY_FATAL, "Edited particle source is NULL" ); p_oPrtSrc = (CPA_PartGen_Source *) p_clOwnerData->m_pub_fn_pvGetDataPtr(); ERROR_ASSERT( p_oPrtSrc != NULL ); p_oPrtSrc->fn_vNotifySave(); } //*** data changed for Particle system ****** void g_fn_vCallBackDataChangedSystem( CTL_Editor_Data *_p_clData, CTL_eUpdateReason _eReason, long _lUserReason ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "CallBack to notify system data has changed", "g_fn_vCallBackDataChangedSystem", E_ERROR_GRAVITY_FATAL, "OwnerData to get edited system is NULL"); CTL_OwnerData *p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "EditedSystem" ); ERROR_ASSERT( p_clOwnerData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "CallBack to notify system data has changed", "g_fn_vCallBackDataChangedSystem", E_ERROR_GRAVITY_FATAL, "Edited system is NULL"); CPA_PartGen_System *p_clSystem = (CPA_PartGen_System*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); ERROR_ASSERT( p_clSystem != NULL ); p_clSystem->fn_vNotifySave(); } //*** data changed for Particle environment ****** void g_fn_vCallBackDataChangedEnv( CTL_Editor_Data *_p_clData, CTL_eUpdateReason _eReason, long _lUserReason ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "CallBack to notify environment data has changed", "g_fn_vCallBackDataChangedEnv", E_ERROR_GRAVITY_FATAL, "OwnerData to get edited environment is NULL"); CTL_OwnerData *p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "EditedEnv" ); ERROR_ASSERT( p_clOwnerData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "CallBack to notify environment data has changed", "g_fn_vCallBackDataChangedEnv", E_ERROR_GRAVITY_FATAL, "Edited environment is NULL"); CPA_PartGen_Environment *p_clEnv = (CPA_PartGen_Environment*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); ERROR_ASSERT( p_clEnv != NULL ); p_clEnv->fn_vNotifySave(); } ///////////////////////////////////////////////////// // Data Changed Special CallBacks ///////////////////////////////////////////////////// //*** Display generator for combo changed *********** void g_fn_vCallBackDataChangedSpecialDisplayGenerator( CTL_Editor_Data *_p_clData, CTL_eUpdateReason _eReason, long _lUserReason ) { if( _eReason == CTL_UPDATE_REASON__DATA_MODIFIED_BY_USER ) g_pclInterface->m_pub_fn_p_clGetDocument()->m_pub_fn_vDisplayCurrentGenerator(); } void g_fn_vCallBackDataChangedSpecialDisplayAll( CTL_Editor_Data *_p_clData, CTL_eUpdateReason _eReason, long _lUserReason ) { if( _eReason == CTL_UPDATE_REASON__DATA_MODIFIED_BY_USER ) g_pclInterface->m_pub_fn_p_clGetDocument()->m_pub_fn_vUpdateGenerator(g_pclInterface->m_pub_fn_p_clGetDocument()->m_pub_p_clCurrentGenerator ); } /////////////////////////////////////////////////// // Read/Write Modification CallBacks /////////////////////////////////////////////////// ///// Check if source is loaded before it is used by generator ///////////// void g_fn_vModificationWriteGeneratorSource( CTL_Editor_Data *_p_clData ) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ CTL_Editor_EnumElement *p_clEnumElement; CPA_PartGen_Source *p_oPrtSrc; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ fn_CB_vCheckData( _p_clData ); p_clEnumElement = fn_CB_p_oGetCurrentEnumElement(_p_clData); if( p_clEnumElement->m_pub_fn_lGetValue() == (long)0 ) { ERROR_PREPARE_M ( g_c_csPartGenModuleNameForErrors, "Function to modify system associated to generator", "g_fn_vModificationWriteGeneratorSystem", E_ERROR_GRAVITY_WARNING, "Set a NULL System" ); p_oPrtSrc = (CPA_PartGen_Source *)p_clEnumElement->m_pub_fn_pvGetAdditionnalPointer(); ERROR_ASSERT( p_oPrtSrc != NULL ); if( p_oPrtSrc != NULL ) { p_oPrtSrc->m_pub_fn_vLoadIfUnloaded(); p_clEnumElement->m_pub_fn_vSetValue( ((long) p_oPrtSrc->GetData()) ); } } } ///// Check system is loaded before it is used by generator ///////////// void g_fn_vModificationWriteGeneratorSystem( CTL_Editor_Data *_p_clData ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to modify system associated to generator", "g_fn_vModificationWriteGeneratorSystem", E_ERROR_GRAVITY_FATAL, "Data is NULL"); ERROR_ASSERT( _p_clData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to modify system associated to generator", "g_fn_vModificationWriteGeneratorSystem", E_ERROR_GRAVITY_FATAL, "Enum current value is NULL"); CTL_Editor_EnumElement *p_clEnumElement = ((CTL_Editor_EnumData*)_p_clData)->m_pclCurrentValue; ERROR_ASSERT( p_clEnumElement != NULL ); if( p_clEnumElement->m_pub_fn_lGetValue() == (long)0 ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to modify system associated to generator", "g_fn_vModificationWriteGeneratorSystem", E_ERROR_GRAVITY_WARNING, "Set a NULL System"); CPA_PartGen_System *p_clSystem = (CPA_PartGen_System*)p_clEnumElement->m_pub_fn_pvGetAdditionnalPointer(); ERROR_ASSERT( p_clSystem != NULL ); if( p_clSystem != NULL ) { p_clSystem->m_pub_fn_vLoadIfUnloaded(); p_clEnumElement->m_pub_fn_vSetValue( ((long)p_clSystem->GetData()) ); } } } ///// Check environment is loaded before it is used by generator ///////////// void g_fn_vModificationWriteGeneratorEnvironment( CTL_Editor_Data *_p_clData ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to modify environment associated to generator", "g_fn_vModificationWriteGeneratorEnvironment", E_ERROR_GRAVITY_FATAL, "Data is NULL"); ERROR_ASSERT( _p_clData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to modify environment associated to generator", "g_fn_vModificationWriteGeneratorEnvironment", E_ERROR_GRAVITY_FATAL, "Enum current value is NULL"); CTL_Editor_EnumElement *p_clEnumElement = ((CTL_Editor_EnumData*)_p_clData)->m_pclCurrentValue; ERROR_ASSERT( p_clEnumElement != NULL ); if( p_clEnumElement->m_pub_fn_lGetValue() == (long)0 ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to modify environment associated to generator", "g_fn_vModificationWriteGeneratorEnvironment", E_ERROR_GRAVITY_WARNING, "Set a NULL environment"); CPA_PartGen_Environment *p_clEnv = (CPA_PartGen_Environment*)p_clEnumElement->m_pub_fn_pvGetAdditionnalPointer(); ERROR_ASSERT( p_clEnv != NULL ); if( p_clEnv != NULL ) { p_clEnv->m_pub_fn_vLoadIfUnloaded(); p_clEnumElement->m_pub_fn_vSetValue( (long)(p_clEnv->GetData()) ); } } } ///// Check environment is loaded before it is used by generator ///////////// void g_fn_vModificationWriteGeneratorLinkedGenerator( CTL_Editor_Data *_p_clData ) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ CTL_Editor_EnumElement *p_clEnumElement; CPA_PartGen_Generator *p_oLinkedGen; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ fn_CB_vCheckData( _p_clData ); p_clEnumElement = fn_CB_p_oGetCurrentEnumElement(_p_clData); if( p_clEnumElement->m_pub_fn_lGetValue() == (long)0 ) { p_oLinkedGen = (CPA_PartGen_Generator *) p_clEnumElement->m_pub_fn_pvGetAdditionnalPointer(); if( p_oLinkedGen != NULL ) { //p_oLinkedGen->m_pub_fn_vLoadIfUnloaded(); g_pclInterface->fn_bLoadBaseObject( p_oLinkedGen ); p_clEnumElement->m_pub_fn_vSetValue( (long)(p_oLinkedGen->GetData()) ); /* * todo : check for loop */ } } } ///// Read Nb frames generation using Nb frames total /////////////////////////// void g_fn_vModificationReadSourceNbFramesGeneration( CTL_Editor_Data *_p_clData ) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ PRT_tdstParticlesSource *p_stPrtSrc; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ fn_CB_vCheckData( _p_clData ); p_stPrtSrc = fn_CB_p_stGetOwnerPrtSrc( _p_clData ); ((CTL_Editor_IntegerData *) _p_clData)->m_lCurrentValue -= (long) p_stPrtSrc->xNbFramesNoGeneration; } ///// write nb frames total using nb frames generation /////////////////////////// void g_fn_vModificationWriteSourceNbFramesGeneration( CTL_Editor_Data *_p_clData ) { /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ PRT_tdstParticlesSource *p_stPrtSrc; /*~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~*/ fn_CB_vCheckData( _p_clData ); p_stPrtSrc = fn_CB_p_stGetOwnerPrtSrc( _p_clData ); ((CTL_Editor_IntegerData *) _p_clData)->m_lCurrentValue += (long) p_stPrtSrc->xNbFramesNoGeneration; } //*** Get GameMaterial used by system with point or segment void g_fn_vModificationReadSystemGameMaterials( CTL_Editor_Data *_p_clData ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to get GameMaterial from Point or Segment", "g_fn_vModificationReadSystemGameMaterials", E_ERROR_GRAVITY_FATAL, "Data is NULL"); ERROR_ASSERT( _p_clData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to get GameMaterial from Point or Segment", "g_fn_vModificationReadSystemGameMaterials", E_ERROR_GRAVITY_FATAL, "EnumElement is NULL"); CTL_Editor_EnumElement *p_clEnumElement = ((CTL_Editor_EnumData*)_p_clData)->m_pclCurrentValue; ERROR_ASSERT( p_clEnumElement != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to get GameMaterial from Point or Segment", "g_fn_vModificationReadSystemGameMaterials", E_ERROR_GRAVITY_FATAL, "OwnerData to get objects type is NULL"); CTL_OwnerData *p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "ObjectsType" ); ERROR_ASSERT( p_clOwnerData != NULL ); ACP_tdxIndex *p_xType = (ACP_tdxIndex*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to get GameMaterial from Point or Segment", "g_fn_vModificationReadSystemGameMaterials", E_ERROR_GRAVITY_FATAL, "OwnerData to get edited system is NULL"); p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "EditedSystem" ); ERROR_ASSERT( p_clOwnerData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to get GameMaterial from Point or Segment", "g_fn_vModificationReadSystemGameMaterials", E_ERROR_GRAVITY_FATAL, "Edited system is NULL"); CPA_PartGen_System *p_clSystem = (CPA_PartGen_System*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); ERROR_ASSERT( p_clSystem != NULL ); if( *p_xType == PRT_C_xPointParticles ) p_clEnumElement->m_pub_fn_vSetValue( (long)p_clSystem->m_pub_fn_hGetPointGameMaterial() ); if( *p_xType == PRT_C_xSegmentParticles ) p_clEnumElement->m_pub_fn_vSetValue( (long)p_clSystem->m_pub_fn_hGetSegmentGameMaterial() ); } ///// Create Point, Segment or Sprite for system ////////////////////// void g_fn_vModificationWriteSystemObjects( CTL_Editor_Data *_p_clData ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to create Point, Segment or Sprite", "g_fn_vModificationWriteSystemObjects", E_ERROR_GRAVITY_FATAL, "Data is NULL"); ERROR_ASSERT( _p_clData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to create Point, Segment or Sprite", "g_fn_vModificationWriteSystemObjects", E_ERROR_GRAVITY_FATAL, "EnumElement is NULL"); CTL_Editor_EnumElement *p_clEnumElement = ((CTL_Editor_EnumData*)_p_clData)->m_pclCurrentValue; ERROR_ASSERT( p_clEnumElement != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to create Point, Segment or Sprite", "g_fn_vModificationWriteSystemObjects", E_ERROR_GRAVITY_FATAL, "OwnerData to get objects type is NULL"); CTL_OwnerData *p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "ObjectsType" ); ERROR_ASSERT( p_clOwnerData != NULL ); ACP_tdxIndex *p_xType = (ACP_tdxIndex*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to create Point, Segment or Sprite", "g_fn_vModificationWriteSystemObjects", E_ERROR_GRAVITY_FATAL, "OwnerData to get edited system is NULL"); p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "EditedSystem" ); ERROR_ASSERT( p_clOwnerData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to create Point, Segment or Sprite", "g_fn_vModificationWriteSystemObjects", E_ERROR_GRAVITY_FATAL, "Edited system is NULL"); CPA_PartGen_System *p_clSystem = (CPA_PartGen_System*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); ERROR_ASSERT( p_clSystem != NULL ); if( *p_xType == PRT_C_xPointParticles ) p_clSystem->m_pub_fn_vSetObjectPoint( (GMT_tdxHandleToGameMaterial)p_clEnumElement->m_pub_fn_lGetValue() ); if( *p_xType == PRT_C_xSegmentParticles ) p_clSystem->m_pub_fn_vSetObjectSegment( (GMT_tdxHandleToGameMaterial)p_clEnumElement->m_pub_fn_lGetValue() ); if( *p_xType == PRT_C_xSpriteParticles ) { if( p_clEnumElement->m_pub_fn_lGetValue() == 0 ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Function to create Point, Segment or Sprite", "g_fn_vModificationWriteSystemObjects", E_ERROR_GRAVITY_WARNING, "Set a NULL Sprite !"); TPG_Sprite *p_clSprite = (TPG_Sprite*)p_clEnumElement->m_pub_fn_pvGetAdditionnalPointer(); ERROR_ASSERT( p_clSprite != NULL ); if( p_clSprite != NULL ) { p_clSprite->m_pub_fn_vLoadSprite(); p_clEnumElement->m_pub_fn_vSetValue( (long)p_clSprite->m_pub_fn_hGetSprite() ); } } p_clSystem->m_pub_fn_vSetObjectSprite( (ACP_tdxHandleOfSprite)p_clEnumElement->m_pub_fn_lGetValue() ); } } ///// Save min max point in environment or in generator linked // void g_fn_vModificationWriteEnvBox( CTL_Editor_Data *_p_clData ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Update engine data min max points for environment", "g_fn_vModificationWriteEnvBox", E_ERROR_GRAVITY_FATAL, "Data is NULL"); ERROR_ASSERT( _p_clData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Update engine data min max points for environment", "g_fn_vModificationWriteEnvBox", E_ERROR_GRAVITY_FATAL, "OwnerData to get edited environment is NULL"); CTL_OwnerData *p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "EditedEnv" ); ERROR_ASSERT( p_clOwnerData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Update engine data min max points for environment", "g_fn_vModificationWriteEnvBox", E_ERROR_GRAVITY_FATAL, "Edited environment is NULL"); CPA_PartGen_Environment *p_clEnv = (CPA_PartGen_Environment*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); ERROR_ASSERT( p_clEnv != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Update engine data min max points for environment", "g_fn_vModificationWriteEnvBox", E_ERROR_GRAVITY_FATAL, "Edited engine environment is NULL"); ERROR_ASSERT( p_clEnv->m_pri_p_stEnv != NULL ); if( p_clEnv->m_pri_p_clGenerator == NULL ) { MTH3D_M_vCopyVector( (&(p_clEnv->m_pri_p_stEnv->stMinPoint)), (&(p_clEnv->m_pri_stMinPoint)) ); MTH3D_M_vCopyVector( (&(p_clEnv->m_pri_p_stEnv->stMaxPoint)), (&(p_clEnv->m_pri_stMaxPoint)) ); } else { if( p_clEnv->m_pri_p_clGenerator->m_pub_fn_bGetLinkToEnv() ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Update engine data min max points for environment", "g_fn_vModificationWriteEnvBox", E_ERROR_GRAVITY_FATAL, "Engine generator using edited environment is NULL"); ERROR_ASSERT( p_clEnv->m_pri_p_clGenerator->m_pri_hGenerator != NULL ); MTH3D_M_vCopyVector( (&(p_clEnv->m_pri_p_clGenerator->m_pri_hGenerator->stMinPoint)), (&(p_clEnv->m_pri_stMinPoint)) ); MTH3D_M_vCopyVector( (&(p_clEnv->m_pri_p_clGenerator->m_pri_hGenerator->stMaxPoint)), (&(p_clEnv->m_pri_stMaxPoint)) ); } else { MTH3D_M_vCopyVector( (&(p_clEnv->m_pri_p_stEnv->stMinPoint)), (&(p_clEnv->m_pri_stMinPoint)) ); MTH3D_M_vCopyVector( (&(p_clEnv->m_pri_p_stEnv->stMaxPoint)), (&(p_clEnv->m_pri_stMaxPoint)) ); } } } ///// Save sphere center in environment or in generator linked //// void g_fn_vModificationWriteEnvSphere( CTL_Editor_Data *_p_clData ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Update engine data center of sphere for environment", "g_fn_vModificationWriteEnvSphere", E_ERROR_GRAVITY_FATAL, "Data is NULL"); ERROR_ASSERT( _p_clData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Update engine data center of sphere for environment", "g_fn_vModificationWriteEnvSphere", E_ERROR_GRAVITY_FATAL, "OwnerData to get edited environment is NULL"); CTL_OwnerData *p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "EditedEnv" ); ERROR_ASSERT( p_clOwnerData != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Update engine data center of sphere for environment", "g_fn_vModificationWriteEnvSphere", E_ERROR_GRAVITY_FATAL, "Edited environment is NULL"); CPA_PartGen_Environment *p_clEnv = (CPA_PartGen_Environment*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); ERROR_ASSERT( p_clEnv != NULL ); ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Update engine data center of sphere for environment", "g_fn_vModificationWriteEnvSphere", E_ERROR_GRAVITY_FATAL, "Edited engine environment is NULL"); ERROR_ASSERT( p_clEnv->m_pri_p_stEnv != NULL ); if( p_clEnv->m_pri_p_clGenerator == NULL ) { MTH3D_M_vCopyVector( (&(p_clEnv->m_pri_p_stEnv->stSphereCenter)), (&(p_clEnv->m_pri_stSphereCenter)) ); } else { if( p_clEnv->m_pri_p_clGenerator->m_pub_fn_bGetLinkToEnv() ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Update engine data center of sphere for environment", "g_fn_vModificationWriteEnvSphere", E_ERROR_GRAVITY_FATAL, "Engine generator using edited environment is NULL"); ERROR_ASSERT( p_clEnv->m_pri_p_clGenerator->m_pri_hGenerator != NULL ); MTH3D_M_vCopyVector( (&(p_clEnv->m_pri_p_clGenerator->m_pri_hGenerator->stMinPoint)), (&(p_clEnv->m_pri_stSphereCenter)) ); } else { MTH3D_M_vCopyVector( (&(p_clEnv->m_pri_p_stEnv->stSphereCenter)), (&(p_clEnv->m_pri_stSphereCenter)) ); } } } /////////////////////////////////////////////////////////////////////////////////// // Must be read_written CallBacks /////////////////////////////////////////////////////////////////////////////////// //*** Is GameMaterial data of system is taken into account ************************ BOOL g_fn_bCallBackMustBeReadWrittenSystemGameMaterial( CTL_Editor_Data * _p_clData ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Is GameMaterial data taken into account ?", "g_fn_bCallBackMustBeReadWrittenSystemGameMaterial", E_ERROR_GRAVITY_FATAL, "OwnerData to get objects type is NULL"); CTL_OwnerData *p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "ObjectsType" ); ERROR_ASSERT( p_clOwnerData != NULL ); ACP_tdxIndex *p_xType = (ACP_tdxIndex*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); return( (*p_xType == PRT_C_xPointParticles) || (*p_xType == PRT_C_xSegmentParticles) ); } //*** Is Sprite data of system is taken into account BOOL g_fn_bCallBackMustBeReadWrittenSystemSprite( CTL_Editor_Data * _p_clData ) { ERROR_PREPARE_M(g_c_csPartGenModuleNameForErrors, "Is sprite data taken into account ?", "g_fn_bCallBackMustBeReadWrittenSystemSprite", E_ERROR_GRAVITY_FATAL, "OwnerData to get objects type is NULL"); CTL_OwnerData *p_clOwnerData = _p_clData->m_pub_fn_pclGetOwnerDataWithName( "ObjectsType" ); ERROR_ASSERT( p_clOwnerData != NULL ); ACP_tdxIndex *p_xType = (ACP_tdxIndex*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); return( *p_xType == PRT_C_xSpriteParticles ); } //ROMTEAM Bugs Correction (Cristian Stegaru 24/03/98) ////////////////////////////////////////////////////////////////////////////////////////////////////// // Method : g_fnCanISelectThisItemCallBack // Date : 98-03 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Description : this function is called from a combobox when a selection is changed // if the selected item is valid approve the selection // Author : Stegaru Cristian - CPA2 ////////////////////////////////////////////////////////////////////////////////////////////////////// // Modification : // Date : // By : ////////////////////////////////////////////////////////////////////////////////////////////////////// int g_fnCanISelectThisItemCallBack (CTL_Editor_Data * p_clData, CTL_Editor_EnumElement *pNewElement) { ASSERT (pNewElement); CString csSelectedString = pNewElement->m_pub_fn_csGetElementName(); if ("No Element" == csSelectedString) return 1; ASSERT (p_clData); CString csDataName = p_clData->m_pub_fn_csGetDataName (); if ("Environment" != csDataName) return 1; //get the current generator CTL_OwnerData *p_clOwnerData = p_clData->m_pub_fn_pclGetOwnerDataWithName( "EditedGenerator" ); ASSERT( p_clOwnerData != NULL ); CPA_PartGen_Generator *p_clGenerator = (CPA_PartGen_Generator*)( p_clOwnerData->m_pub_fn_pvGetDataPtr() ); ASSERT (p_clGenerator); ASSERT (g_pclInterface->m_clDocument.m_pub_p_clCurrentGenerator == p_clGenerator); CString csCurrentGeneratorName = p_clGenerator->GetName (); CPA_PartGen_Environment *pSelectedEnv = (CPA_PartGen_Environment*)pNewElement->m_pub_fn_pvGetAdditionnalPointer(); ASSERT (pSelectedEnv); PRT_tdstParticlesEnvironment *pSelectedEngEnv = pSelectedEnv->m_pub_fn_p_stGetEnv(); //check every generator to see if the environment is already used CPA_BaseObjectList * p_clList = g_pclInterface->GetMainWorld()->fn_p_oGetOriginalObjectList(C_szPartGenGeneratorName); CPA_PartGen_Generator *p_Generator = NULL; Position pos = p_clList->GetHeadPosition(); while (pos != NULL) { p_Generator = (CPA_PartGen_Generator *)p_clList->GetNext (pos); ASSERT (p_Generator); if (p_Generator->GetName() == csCurrentGeneratorName) //don't count the current generator continue; tdxHandleToParticleGenerator pEngGenerator = p_Generator->m_pub_fn_hGetGenerator(); if (NULL == pEngGenerator) continue; PRT_tdstParticlesEnvironment *pEngEnv = pEngGenerator->p_stPrtEnv; if (NULL == pEngEnv) continue; if (pSelectedEngEnv == pEngEnv) { AfxMessageBox ("This environment is already used.\nPlease, select another one."); return 0; } } return 1; } //ENDROMTEAM Bugs Correction (Cristian Stegaru)