summaryrefslogtreecommitdiffstats
path: root/tools/statepropbuilder/src/statepropdata.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'tools/statepropbuilder/src/statepropdata.cpp')
-rw-r--r--tools/statepropbuilder/src/statepropdata.cpp249
1 files changed, 249 insertions, 0 deletions
diff --git a/tools/statepropbuilder/src/statepropdata.cpp b/tools/statepropbuilder/src/statepropdata.cpp
new file mode 100644
index 0000000..d5f93e9
--- /dev/null
+++ b/tools/statepropbuilder/src/statepropdata.cpp
@@ -0,0 +1,249 @@
+#include <string.h>
+#include <p3d/utility.hpp>
+#include <p3d/anim/animatedobject.hpp>
+#include <constants/chunkids.hpp>
+#include <p3d/chunkfile.hpp>
+
+#include "stateprop/statepropdata.hpp"
+
+//=============================================================================
+// Class Declarations
+// Prop
+//=============================================================================
+CStatePropData::CStatePropData( ) :
+ m_ObjectFactory( NULL ),
+ m_NumStates(0),
+ m_StateData(NULL)
+{
+}
+
+CStatePropData::~CStatePropData()
+{
+ if (m_ObjectFactory)
+ {
+ m_ObjectFactory->Release();
+ }
+
+ unsigned int i = 0;
+ for( i; i < m_NumStates; i++ )
+ {
+ delete m_StateData[i];
+ }
+ delete m_StateData;
+}
+
+//=============================================================================
+//State Data
+//=============================================================================
+
+//Get
+unsigned int CStatePropData::GetNumberOfStates()
+{
+ return m_NumStates;
+}
+StateData CStatePropData::GetStateData( unsigned int state )
+{
+ return ( * (m_StateData[ state ]) ) ;
+}
+
+//=============================================================================
+//Transition Data
+//=============================================================================
+
+//Get
+TransitionData CStatePropData::GetTransitionData( int state )
+{
+ return m_StateData[state]->transitionData;
+}
+
+//=============================================================================
+//Visibility Data
+//=============================================================================
+
+//Get
+VisibilityData CStatePropData::GetVisibilityData( int state , int index)
+{
+ return ( m_StateData[state]->visibilityData[index] );
+}
+
+//=============================================================================
+//Frame controller data
+//=============================================================================
+
+//Get
+FrameControllerData CStatePropData::GetFrameControllerData( int state, int fc )
+{
+ return m_StateData[state]->frameControllerData[fc];
+}
+
+//=============================================================================
+//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];
+}
+
+//=============================================================================
+//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];
+}
+
+//=============================================================================
+// Class Declarations
+// PropLoader
+//=============================================================================
+CStatePropDataLoader::CStatePropDataLoader() :
+ tSimpleChunkHandler(StateProp::STATEPROP)
+{
+}
+
+//-------------------------------------------------------------------------
+tEntity* CStatePropDataLoader::LoadObject(tChunkFile* f, tEntityStore* store)
+{
+
+ CStatePropData* statePropData = new CStatePropData();
+
+ unsigned int version = f->GetLong();
+
+ //get the name
+ char buf[256];
+ f->GetPString(buf);
+ statePropData->SetName(buf);
+
+
+ //get the object factory
+ f->GetPString(buf);
+ statePropData->m_ObjectFactory = p3d::find<tAnimatedObjectFactory>(store, buf);
+ if ( statePropData->m_ObjectFactory )
+ {
+ statePropData->m_ObjectFactory->AddRef();
+ }
+
+ //get the num states
+ statePropData->m_NumStates = f->GetLong();
+
+ statePropData->m_StateData = new StateData*[statePropData->m_NumStates];
+ memset(statePropData->m_StateData,0,statePropData->m_NumStates*sizeof(StateData*));
+
+ unsigned int currState;
+ unsigned int i;
+ for ( currState = 0; currState < statePropData->m_NumStates; currState++ )
+ {
+ f->BeginChunk();
+
+ //get name
+ f->GetPString(buf);
+
+ bool autoTransition = ( f->GetLong() != 0 );
+ unsigned int toState = f->GetLong();
+ unsigned int numDrawables = f->GetLong();
+ unsigned int numFrameControllers = f->GetLong();
+ unsigned int numEvents = f->GetLong();
+ unsigned int numCallbacks = f->GetLong();
+ float onFrame = f->GetFloat();
+
+ //give me memory dammit
+ int memsize = ( sizeof(StateData) ) +
+ ( sizeof(VisibilityData) * numDrawables ) +
+ ( sizeof(FrameControllerData) * numFrameControllers ) +
+ ( sizeof(EventData) * numEvents ) +
+ ( sizeof(CallbackData) * numCallbacks );
+
+ unsigned char* memptr = new unsigned char[ memsize ];
+
+ memset( memptr,0, memsize );
+
+ statePropData->m_StateData[currState] = (StateData*)memptr;
+
+ statePropData->m_StateData[currState]->numEvents = numEvents;
+ statePropData->m_StateData[currState]->numCallbacks = numCallbacks;
+
+ //Transition data
+ statePropData->m_StateData[currState]->transitionData.autoTransition = autoTransition;
+ statePropData->m_StateData[currState]->transitionData.onFrame = onFrame;
+ statePropData->m_StateData[currState]->transitionData.toState = toState;
+
+ //Visibility data
+ statePropData->m_StateData[currState]->visibilityData = (VisibilityData*) ( memptr + sizeof(StateData) );
+ for ( i=0; i < numDrawables; i++ )
+ {
+ f->BeginChunk();
+ f->GetPString(buf);
+ VisibilityData *p = &(statePropData->m_StateData[currState]->visibilityData[i]);
+ p->isVisible = (f->GetLong() != 0);
+ f->EndChunk();
+ }
+
+ //FrameController data
+ statePropData->m_StateData[currState]->frameControllerData = (FrameControllerData*)
+ ( memptr + sizeof(StateData) +
+ ( sizeof(VisibilityData) * numDrawables ) );
+
+ for ( i=0; i < numFrameControllers; i++ )
+ {
+ f->BeginChunk();
+ f->GetPString(buf);
+ FrameControllerData* p = &(statePropData->m_StateData[currState]->frameControllerData[i]);
+ p->isCyclic = ( f->GetLong() != 0 );
+ p->numberOfCycles = f->GetLong();
+ p->holdFrame = ( f->GetLong() != 0 );
+ p->minFrame = f->GetFloat();
+ p->maxFrame = f->GetFloat();
+ p->relativeSpeed = f->GetFloat();
+ f->EndChunk();
+ }
+
+ //Event data
+ statePropData->m_StateData[currState]->eventData = (EventData*)
+ ( memptr + sizeof(StateData) +
+ ( sizeof(VisibilityData) * numDrawables ) +
+ ( sizeof(FrameControllerData) * numFrameControllers ) );
+
+ for ( i=0; i < numEvents; i++ )
+ {
+ f->BeginChunk();
+ EventData* p = &(statePropData->m_StateData[currState]->eventData[i]);
+ memcpy( p->eventName , f->GetPString(buf) , 64 );
+ p->toState = f->GetLong();
+ p->eventID = f->GetLong();
+ f->EndChunk();
+ }
+
+ //Callback data
+ statePropData->m_StateData[currState]->callbackData = (CallbackData*)
+ ( memptr + sizeof(StateData) +
+ ( sizeof(VisibilityData) * numDrawables ) +
+ ( sizeof(FrameControllerData) * numFrameControllers ) +
+ ( sizeof(EventData) * numEvents ) );
+
+ for ( i=0; i < numCallbacks; i++ )
+ {
+ f->BeginChunk();
+ CallbackData* p = &(statePropData->m_StateData[currState]->callbackData[i]);
+ memcpy( p->callbackName , f->GetPString(buf) , 64 );
+ p->callbackID = f->GetLong();
+ p->onFrame = f->GetFloat();
+ f->EndChunk();
+ }
+
+ f->EndChunk();
+ }
+
+ return statePropData;
+}