Files
OpenSceneGraph/src/osgPlugins/osg/Sequence.cpp
Robert Osfield 6468905e42 From John Kelso, Added support for new Sequence options.
From Robert Osfield, updated the above changes to the .ive loader so that the new addition were tested against the IVE version number
2007-05-15 14:55:02 +00:00

241 lines
5.5 KiB
C++

#include "osg/Sequence"
#include "osgDB/Registry"
#include "osgDB/Input"
#include "osgDB/Output"
using namespace osg;
using namespace osgDB;
// forward declare functions to use later.
bool Sequence_readLocalData(Object& obj, Input& fr);
bool Sequence_writeLocalData(const Object& obj, Output& fw);
// register the read and write functions with the osgDB::Registry.
RegisterDotOsgWrapperProxy g_SequenceProxy
(
new osg::Sequence,
"Sequence",
"Object Node Sequence Group",
&Sequence_readLocalData,
&Sequence_writeLocalData
);
static bool Sequence_matchLoopMode(const char* str,
Sequence::LoopMode& mode)
{
if (strcmp(str, "LOOP") == 0)
{
mode = Sequence::LOOP;
}
else if (strcmp(str, "SWING") == 0)
{
mode = Sequence::SWING;
}
else
{
return false;
}
return true;
}
static const char* Sequence_getLoopMode(Sequence::LoopMode mode)
{
switch (mode) {
case Sequence::SWING:
return "SWING";
case Sequence::LOOP:
default:
return "LOOP";
}
}
// only storing 'START' and 'STOP' since 'PAUSE' doesn't make sense to me
static bool Sequence_matchSeqMode(const char* str,
Sequence::SequenceMode& mode)
{
if (strcmp(str, "START") == 0)
{
mode = Sequence::START;
}
else if (strcmp(str, "STOP") == 0)
{
mode = Sequence::STOP;
}
else
{
return false;
}
return true;
}
static const char* Sequence_getSeqMode(Sequence::SequenceMode mode)
{
switch (mode) {
case Sequence::START:
return "START";
default:
return "STOP";
}
}
bool Sequence_readLocalData(Object& obj, Input& fr)
{
bool iteratorAdvanced = false;
Sequence& sw = static_cast<Sequence&>(obj);
if (fr.matchSequence("defaultTime"))
{
if (fr[1].isFloat())
{
float t;
fr[1].getFloat(t) ;
sw.setDefaultTime(t) ;
iteratorAdvanced = true;
fr += 2;
}
}
else if (fr.matchSequence("frameTime {"))
{
int entry = fr[0].getNoNestedBrackets();
fr += 2;
int i = 0;
while (!fr.eof() && fr[0].getNoNestedBrackets() > entry)
{
float t;
if (fr[0].getFloat(t))
{
sw.setTime(i, t);
++fr;
i++;
}
}
iteratorAdvanced = true;
++fr;
}
else if (fr.matchSequence("lastFrameTime"))
{
if (fr[1].isFloat())
{
float t;
fr[1].getFloat(t) ;
sw.setLastFrameTime(t) ;
iteratorAdvanced = true;
fr += 2;
}
}
else if (fr.matchSequence("interval"))
{
Sequence::LoopMode mode;
int begin, end;
if (Sequence_matchLoopMode(fr[1].getStr(), mode) &&
fr[2].getInt(begin) && fr[3].getInt(end))
{
sw.setInterval(mode, begin, end);
iteratorAdvanced = true;
fr += 4;
}
}
else if (fr.matchSequence("duration"))
{
if (fr[1].isFloat() && fr[2].isInt())
{
float speed;
int nreps;
fr[1].getFloat(speed);
fr[2].getInt(nreps);
sw.setDuration(speed, nreps);
iteratorAdvanced = true;
fr += 3;
}
}
else if (fr.matchSequence("mode"))
{
Sequence::SequenceMode mode;
if (Sequence_matchSeqMode(fr[1].getStr(), mode))
{
sw.setMode(mode);
iteratorAdvanced = true;
fr += 2;
}
}
else if (fr.matchSequence("sync"))
{
if (fr[1].isInt())
{
int sync ;
fr[1].getInt(sync) ;
sw.setSync((bool)sync) ;
iteratorAdvanced = true;
fr += 2;
}
}
else if (fr.matchSequence("clearOnStop"))
{
if (fr[1].isInt())
{
int clearOnStop ;
fr[1].getInt(clearOnStop) ;
sw.setClearOnStop((bool)clearOnStop) ;
iteratorAdvanced = true;
fr += 2;
}
}
return iteratorAdvanced;
}
bool Sequence_writeLocalData(const Object& obj, Output& fw)
{
const Sequence& sw = static_cast<const Sequence&>(obj);
// default frame time
fw.indent() << "defaultTime " << sw.getDefaultTime() << std::endl;
// frame times
fw.indent() << "frameTime {" << std::endl;
fw.moveIn();
for (unsigned int i = 0; i < sw.getNumChildren(); i++)
{
fw.indent() << sw.getTime(i) << std::endl;
}
fw.moveOut();
fw.indent() << "}" << std::endl;
// last frame time
fw.indent() << "lastFrameTime " << sw.getLastFrameTime() << std::endl;
// loop mode & interval
Sequence::LoopMode mode;
int begin, end;
sw.getInterval(mode, begin, end);
fw.indent() << "interval " << Sequence_getLoopMode(mode) << " " << begin << " " << end << std::endl;
// duration
float speed;
int nreps;
sw.getDuration(speed, nreps);
fw.indent() << "duration " << speed << " " << nreps << std::endl;
// sequence mode
fw.indent() << "mode " << Sequence_getSeqMode(sw.getMode()) << std::endl;
// sync
bool sync ;
sw.getSync(sync);
fw.indent() << "sync " << (int) sync << std::endl;
// clearOnStop
bool clearOnStop ;
sw.getClearOnStop(clearOnStop);
fw.indent() << "clearOnStop " << (int) clearOnStop << std::endl;
return true;
}