diff options
Diffstat (limited to 'tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.cpp')
-rw-r--r-- | tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.cpp | 509 |
1 files changed, 509 insertions, 0 deletions
diff --git a/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.cpp b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.cpp new file mode 100644 index 0000000..eb88194 --- /dev/null +++ b/tools/statepropbuilder/apps/spbuilder/code/sp/engine/statepropdata.cpp @@ -0,0 +1,509 @@ +#include <string.h> +#include <p3d/utility.hpp> +#include <p3d/anim/animatedobject.hpp> +#include <constants/chunkids.hpp> +#include <p3d/chunkfile.hpp> + +#include "statepropdata.hpp" + +//============================================================================= +// Class Declarations +// Prop +//============================================================================= + +CStatePropData::CStatePropData( tAnimatedObjectFactory* factory ) : + tEntity(), + m_NumStates(1) +{ + P3DASSERT ( factory ); + m_ObjectFactory = factory; + m_ObjectFactory->AddRef(); + SetName( m_ObjectFactory->GetName() ); + + ResetData(); +} + +CStatePropData::CStatePropData( ) : + tEntity(), + m_NumStates(1), + m_ObjectFactory( NULL ) +{ + ResetData(); +} + +CStatePropData::~CStatePropData() +{ + m_ObjectFactory->Release(); +} + +//============================================================================= +//State Data +//============================================================================= + +//Get +unsigned int CStatePropData::GetNumberOfStates() +{ + return m_NumStates; +} +StateData CStatePropData::GetStateData( unsigned int state ) +{ + return m_StateData[ state ]; +} + +//Set +void CStatePropData::InsertState( unsigned int state ) +{ + if ( m_NumStates >= MAX_STATES - 1) + return; + + //increase the number of states and copy all the data up a state + m_NumStates++; + + unsigned int i , j; + for ( i = m_NumStates - 1; i > state + 1; i-- ) + { + //transition data for each state + m_StateData[i].transitionData.autoTransition = m_StateData[i-1].transitionData.autoTransition; + m_StateData[i].transitionData.onFrame = m_StateData[i-1].transitionData.onFrame; + m_StateData[i].transitionData.toState = m_StateData[i-1].transitionData.toState; + + //visibility data for each drawable in each state + for (j = 0; j < MAX_VISIBILITIES; j++ ) + { + m_StateData[i].visibilityData[j].isVisible = m_StateData[i-1].visibilityData[j].isVisible; + } + + //framecontroller data in each state + for (j = 0; j < MAX_FRAMECONTROLLERS; j++ ) + { + m_StateData[i].frameControllerData[j].isCyclic = m_StateData[i-1].frameControllerData[j].isCyclic; + m_StateData[i].frameControllerData[j].maxFrame = m_StateData[i-1].frameControllerData[j].maxFrame; + m_StateData[i].frameControllerData[j].minFrame = m_StateData[i-1].frameControllerData[j].minFrame; + m_StateData[i].frameControllerData[j].relativeSpeed = m_StateData[i-1].frameControllerData[j].relativeSpeed; + m_StateData[i].frameControllerData[j].holdFrame = m_StateData[i-1].frameControllerData[j].holdFrame; + m_StateData[i].frameControllerData[j].numberOfCycles = m_StateData[i-1].frameControllerData[j].numberOfCycles; + } + + //event data for each state + m_StateData[i].numEvents = m_StateData[i-1].numEvents; + m_StateData[i].numCallbacks = m_StateData[i-1].numCallbacks; + for (j = 0; j < MAX_EVENTS; j++ ) + { + strcpy( m_StateData[i].eventData[j].eventName , m_StateData[i-1].eventData[j].eventName ); + m_StateData[i].eventData[j].toState = m_StateData[i-1].eventData[j].toState; + m_StateData[i].eventData[j].eventID = m_StateData[i-1].eventData[j].eventID; + + strcpy( m_StateData[i].callbackData[j].callbackName , m_StateData[i-1].callbackData[j].callbackName ); + m_StateData[i].callbackData[j].onFrame = m_StateData[i-1].callbackData[j].onFrame; + m_StateData[i].callbackData[j].callbackID = m_StateData[i-1].callbackData[j].callbackID; + } + } + + //Initialize the newly added state + + //transition data for each state + m_StateData[state + 1].transitionData.autoTransition = 0; + m_StateData[state + 1].transitionData.onFrame = 0.f; + m_StateData[state + 1].transitionData.toState = 0; + + //visibility data for each drawable in each state + for (j = 0; j < MAX_VISIBILITIES; j++ ) + { + m_StateData[state + 1].visibilityData[j].isVisible = 1; + } + + //framecontroller data in each state + for (j = 0; j < MAX_FRAMECONTROLLERS; j++ ) + { + m_StateData[state + 1].frameControllerData[j].isCyclic = 0; + m_StateData[state + 1].frameControllerData[j].maxFrame = 0.f; + m_StateData[state + 1].frameControllerData[j].minFrame = 0.f; + m_StateData[state + 1].frameControllerData[j].relativeSpeed = 1.f; + m_StateData[state + 1].frameControllerData[j].holdFrame = 0; + m_StateData[state + 1].frameControllerData[j].numberOfCycles = 0; + } + + //event data for each state + m_StateData[state + 1].numEvents = 0; + m_StateData[state + 1].numCallbacks = 0; +} + +void CStatePropData::DeleteState( unsigned int state ) +{ + if ( m_NumStates == 1 ) + { + ResetData(); + return; + } + + int i; + int j; + + for ( i = state; i < m_NumStates - 1; i++ ) + { + //transition data for each state + m_StateData[i].transitionData.autoTransition = m_StateData[i+1].transitionData.autoTransition; + m_StateData[i].transitionData.onFrame = m_StateData[i+1].transitionData.onFrame; + m_StateData[i].transitionData.toState = m_StateData[i+1].transitionData.toState; + + //visibility data for each drawable in each state + for (j = 0; j < MAX_VISIBILITIES; j++ ) + { + m_StateData[i].visibilityData[j].isVisible = m_StateData[i+1].visibilityData[j].isVisible; + } + + //framecontroller data in each state + for (j = 0; j < MAX_FRAMECONTROLLERS; j++ ) + { + m_StateData[i].frameControllerData[j].isCyclic = m_StateData[i+1].frameControllerData[j].isCyclic; + m_StateData[i].frameControllerData[j].maxFrame = m_StateData[i+1].frameControllerData[j].maxFrame; + m_StateData[i].frameControllerData[j].minFrame = m_StateData[i+1].frameControllerData[j].minFrame; + m_StateData[i].frameControllerData[j].relativeSpeed = m_StateData[i+1].frameControllerData[j].relativeSpeed; + m_StateData[i].frameControllerData[j].holdFrame = m_StateData[i+1].frameControllerData[j].holdFrame; + m_StateData[i].frameControllerData[j].numberOfCycles = m_StateData[i+1].frameControllerData[j].numberOfCycles; + } + + //event data for each state + m_StateData[i].numEvents = m_StateData[i+1].numEvents; + m_StateData[i].numCallbacks = m_StateData[i+1].numCallbacks; + for (j = 0; j < MAX_EVENTS; j++ ) + { + strcpy( m_StateData[i].eventData[j].eventName , m_StateData[i+1].eventData[j].eventName ); + m_StateData[i].eventData[j].toState = m_StateData[i+1].eventData[j].toState; + m_StateData[i].eventData[j].eventID = m_StateData[i+1].eventData[j].eventID; + + strcpy( m_StateData[i].callbackData[j].callbackName , m_StateData[i+1].callbackData[j].callbackName ); + m_StateData[i].callbackData[j].onFrame = m_StateData[i+1].callbackData[j].onFrame; + m_StateData[i].callbackData[j].callbackID = m_StateData[i+1].callbackData[j].callbackID; + } + } + + m_NumStates--; +} + +//============================================================================= +//Transition Data +//============================================================================= + +//Get +TransitionData CStatePropData::GetTransitionData( int state ) +{ + return m_StateData[state].transitionData; +} + +//Set +void CStatePropData::SetAutoTransition( int state, bool b ) +{ + m_StateData[state].transitionData.autoTransition = b; +} +void CStatePropData::SetAutoTransitionOnFrame( int state, float onFrame ) +{ + m_StateData[state].transitionData.onFrame = onFrame; +} +void CStatePropData::SetAutoTransitionToState( int state, int toState ) +{ + m_StateData[state].transitionData.toState = toState; +} + +//============================================================================= +//Visibility Data +//============================================================================= + +//Get +VisibilityData CStatePropData::GetVisibilityData( int state , int index) +{ + return ( m_StateData[state].visibilityData[index] ); +} + +//Set +void CStatePropData::SetVisible( int state , int index , bool b ) +{ + m_StateData[state].visibilityData[index].isVisible = b; +} +void CStatePropData::SetAllVisibilities( int state , bool b ) +{ + for ( int i = 0; i < MAX_VISIBILITIES; i++ ) + { + m_StateData[state].visibilityData[i].isVisible = b; + } +} +void CStatePropData::ShowAll(int state) +{ + SetAllVisibilities( state , true ); +} +void CStatePropData::HideAll(int state) +{ + SetAllVisibilities( state , false ); +} + +//============================================================================= +//Frame controller data +//============================================================================= + +//Get +FrameControllerData CStatePropData::GetFrameControllerData( int state, int fc ) +{ + return m_StateData[state].frameControllerData[fc]; +} + +//Set +void CStatePropData::SetCyclic( int state ,int fc, bool isCyclic ) +{ + m_StateData[state].frameControllerData[fc].isCyclic = isCyclic; +} +void CStatePropData::SetRelativeSpeed( int state ,int fc, float speed ) +{ + m_StateData[state].frameControllerData[fc].relativeSpeed = speed; +} +void CStatePropData::SetFrameRange( int state , int fc, float min, float max ) +{ + m_StateData[state].frameControllerData[fc].minFrame = min; + m_StateData[state].frameControllerData[fc].maxFrame = max; +} +void CStatePropData::SetHoldFrame( int state , int fc , bool holdFrame ) +{ + m_StateData[state].frameControllerData[fc].holdFrame = holdFrame; +} +void CStatePropData::SetNumberOfCycles( int state , int fc , unsigned int numberOfCycles ) +{ + m_StateData[state].frameControllerData[fc].numberOfCycles = numberOfCycles; +} + + +//============================================================================= +//Event data +//============================================================================= + +//Get +unsigned int CStatePropData::GetNumberOfEvents( int state ) +{ + return m_StateData[state].numEvents; +} +EventData CStatePropData::GetEventData( int state , int eventindex ) +{ + return m_StateData[state].eventData[eventindex]; +} + +//Set +void CStatePropData::AddEvent( const char* event , int eventEnum , int toState , int fromState ) +{ + int n_events = m_StateData[fromState].numEvents; + + strcpy( m_StateData[fromState].eventData[n_events].eventName , event ); + m_StateData[fromState].eventData[n_events].toState = toState; + m_StateData[fromState].eventData[n_events].eventID = eventEnum; + + m_StateData[fromState].numEvents = n_events + 1; +} +void CStatePropData::EditEvent( int state, int EventIndex, char* eventName, int eventID , int toState ) +{ + strcpy( m_StateData[state].eventData[EventIndex].eventName , eventName ); + m_StateData[state].eventData[EventIndex].toState = toState; + m_StateData[state].eventData[EventIndex].eventID = eventID; +} +void CStatePropData::DeleteEvent( int state , int index ) +{ + int numEvents = m_StateData[state].numEvents; + for ( int i = index; i < numEvents - 1; i++ ) + { + strcpy( m_StateData[state].eventData[i].eventName , m_StateData[state].eventData[i+1].eventName ); + m_StateData[state].eventData[i].toState = m_StateData[state].eventData[i+1].toState; + m_StateData[state].eventData[i].eventID = m_StateData[state].eventData[i+1].eventID; + } + + strcpy( m_StateData[state].eventData[numEvents - 1].eventName , "" ); + m_StateData[state].eventData[numEvents - 1].toState = 0; + m_StateData[state].eventData[numEvents - 1].eventID = 0; + + m_StateData[state].numEvents = numEvents - 1; +} + +//============================================================================= +//Callback Data +//============================================================================= + +//Get +unsigned int CStatePropData::GetNumberOfCallbacks( int state ) +{ + return m_StateData[state].numCallbacks; +} +CallbackData CStatePropData::GetCallbackData( int state , int eventindex ) +{ + return m_StateData[state].callbackData[eventindex]; +} + +//Set +void CStatePropData::AddCallback( int state , const char* callback , int callbackID , float onFrame ) +{ + int n_callbacks = m_StateData[state].numCallbacks; + + strcpy( m_StateData[state].callbackData[n_callbacks].callbackName , callback ); + m_StateData[state].callbackData[n_callbacks].onFrame = onFrame; + m_StateData[state].callbackData[n_callbacks].callbackID = callbackID; + + m_StateData[state].numCallbacks = n_callbacks + 1; +} +void CStatePropData::EditCallback( int state, int CBIndex, char* callbackname, int callbackID , float onFrame ) +{ + strcpy( m_StateData[state].callbackData[CBIndex].callbackName , callbackname ); + m_StateData[state].callbackData[CBIndex].onFrame = onFrame; + m_StateData[state].callbackData[CBIndex].callbackID = callbackID; +} +void CStatePropData::DeleteCallback( int state , int index ) +{ + int numCallbacks = m_StateData[state].numCallbacks; + for ( int i = index; i < numCallbacks - 1; i++ ) + { + strcpy( m_StateData[state].callbackData[i].callbackName , m_StateData[state].callbackData[i+1].callbackName ); + m_StateData[state].callbackData[i].onFrame = m_StateData[state].callbackData[i+1].onFrame; + m_StateData[state].callbackData[i].callbackID = m_StateData[state].callbackData[i+1].callbackID; + } + + strcpy( m_StateData[state].callbackData[numCallbacks - 1].callbackName , "" ); + m_StateData[state].callbackData[numCallbacks - 1].onFrame = 0.f; + m_StateData[state].callbackData[numCallbacks - 1].callbackID = 0; + + m_StateData[state].numCallbacks = numCallbacks - 1; +} + + + +//============================================================================= +//Utility +//============================================================================= +void CStatePropData::ResetData() +{ + unsigned int state; + unsigned int j; + + for ( state = 0; state < MAX_STATES; state++ ) + { + //transition data + m_StateData[state].transitionData.autoTransition = 0; + m_StateData[state].transitionData.onFrame = 0.f; + m_StateData[state].transitionData.toState = 0; + + //framecontrollers + for ( j = 0; j < MAX_FRAMECONTROLLERS; j++ ) + { + m_StateData[state].frameControllerData[j].isCyclic = false; + m_StateData[state].frameControllerData[j].minFrame = 0.f; + m_StateData[state].frameControllerData[j].maxFrame = 0.f; + m_StateData[state].frameControllerData[j].relativeSpeed = 1.f; + m_StateData[state].frameControllerData[j].holdFrame = 0; + m_StateData[state].frameControllerData[j].numberOfCycles = 0; + + } + + //visibilites + for ( j = 0; j < MAX_VISIBILITIES; j++ ) + { + m_StateData[state].visibilityData[j].isVisible = true; + } + + //events && callbacks + m_StateData[state].numEvents = 0; + m_StateData[state].numCallbacks = 0; + for ( j = 0; j < MAX_EVENTS; j++ ) + { + strcpy( m_StateData[state].eventData[j].eventName , "" ); + m_StateData[state].eventData[j].toState = 0; + m_StateData[state].eventData[j].eventID = 0; + + strcpy( m_StateData[state].callbackData[j].callbackName , "" ); + m_StateData[state].callbackData[j].onFrame = 0.f; + m_StateData[state].callbackData[j].callbackID = 0; + } + } +} + + + +//============================================================================= +// Class Declarations +// PropLoader +//============================================================================= +CStatePropDataLoader::CStatePropDataLoader() : + tSimpleChunkHandler(StateProp::STATEPROP) +{ +} + +//------------------------------------------------------------------------- +tEntity* CStatePropDataLoader::LoadObject(tChunkFile* f, tEntityStore* store) +{ + unsigned int version = f->GetLong(); + + CStatePropData* statePropData = new CStatePropData(); + statePropData->ResetData(); + + char buf[256]; + + f->GetPString(buf); + statePropData->SetName(buf); + + strcpy( statePropData->m_FactoryName , f->GetPString(buf) ); + statePropData->m_ObjectFactory = p3d::find<tAnimatedObjectFactory>(store, statePropData->m_FactoryName); + if ( statePropData->m_ObjectFactory ) + { + statePropData->m_ObjectFactory->AddRef(); + } + + statePropData->m_NumStates = f->GetLong(); + + for ( int currState = 0; currState < statePropData->m_NumStates; currState++ ) + { + f->BeginChunk(); + + f->GetPString(buf); + statePropData->m_StateData[currState].transitionData.autoTransition = ( f->GetLong() != 0 ); + statePropData->m_StateData[currState].transitionData.toState = f->GetLong(); + int numDrawables = f->GetLong(); + int numFrameControllers = f->GetLong(); + statePropData->m_StateData[currState].numEvents = f->GetLong(); + statePropData->m_StateData[currState].numCallbacks = f->GetLong(); + statePropData->m_StateData[currState].transitionData.onFrame = f->GetFloat(); + + for ( int currDrawable=0; currDrawable < numDrawables; currDrawable++ ) + { + f->BeginChunk(); + f->GetPString(buf); + statePropData->m_StateData[currState].visibilityData[currDrawable].isVisible = ( f->GetLong() != 0 ); + f->EndChunk(); + } + + for ( int currFrameController=0; currFrameController < numFrameControllers; currFrameController++ ) + { + f->BeginChunk(); + f->GetPString(buf); + statePropData->m_StateData[currState].frameControllerData[currFrameController].isCyclic = ( f->GetLong() != 0 ); + statePropData->m_StateData[currState].frameControllerData[currFrameController].numberOfCycles = f->GetLong(); + statePropData->m_StateData[currState].frameControllerData[currFrameController].holdFrame = ( f->GetLong() != 0 ); + statePropData->m_StateData[currState].frameControllerData[currFrameController].minFrame = f->GetFloat(); + statePropData->m_StateData[currState].frameControllerData[currFrameController].maxFrame = f->GetFloat(); + statePropData->m_StateData[currState].frameControllerData[currFrameController].relativeSpeed = f->GetFloat(); + f->EndChunk(); + } + + for ( unsigned int currEvent=0; currEvent < statePropData->m_StateData[currState].numEvents; currEvent++ ) + { + f->BeginChunk(); + strcpy( statePropData->m_StateData[currState].eventData[currEvent].eventName , f->GetPString(buf) ); + statePropData->m_StateData[currState].eventData[currEvent].toState = f->GetLong(); + statePropData->m_StateData[currState].eventData[currEvent].eventID = f->GetLong(); + f->EndChunk(); + } + + for ( unsigned int currCallback=0; currCallback < statePropData->m_StateData[currState].numCallbacks; currCallback++ ) + { + f->BeginChunk(); + strcpy( statePropData->m_StateData[currState].callbackData[currCallback].callbackName , f->GetPString(buf) ); + statePropData->m_StateData[currState].callbackData[currCallback].callbackID = f->GetLong(); + statePropData->m_StateData[currState].callbackData[currCallback].onFrame = f->GetFloat(); + f->EndChunk(); + } + + f->EndChunk(); + } + + return statePropData; +}
\ No newline at end of file |