Hi again,
This is the last one for today ;-).
osgSim::BlinkSequence has sequenceGroup unitialized by default (=NULL ref_ptr).
By looking at the code I figured out that unset sequenceGroup is completely
correct and thus allowed.
But writing BlinkSequence with empty sequence group caused a crash when IVE was
accessing baseTime from NULL address.
Atttached is a fix for this situation.
I also thought about fixing BlinkSequence::read to be symmetrical to modifed
BlinkSequence::write. This change would not create sequenceGroup when
readDouble returned basetime equal 0.0. It would only create sequenceGroup when
base time was not zero. But decided to leave this for your decision.
Cheers,
Wojtek
/**********************************************************************
*
* FILE: BlinkSequence.cpp
*
* DESCRIPTION: Read/Write osgSim::BlinkSequence in binary format to disk.
*
* CREATED BY: Auto generated by iveGenerator
* and later modified by Rune Schmidt Jensen.
*
* HISTORY: Created 5.9.2003
*
**********************************************************************/
#include "Exception.h"
#include "BlinkSequence.h"
#include "Object.h"
using namespace ive;
void BlinkSequence::write(DataOutputStream* out){
// Write BlinkSequence's identification.
out->writeInt(IVEBLINKSEQUENCE);
// If the osgSim class is inherited by any other class we should also write
this to file.
osg::Object* obj = dynamic_cast<osg::Object*>(this);
if(obj){
((ive::Object*)(obj))->write(out);
}
else
throw Exception("BlinkSequence::write(): Could not cast this
osgSim::BlinkSequence to an osg::Object.");
// Write BlinkSequence's properties.
// Write out pulse data.
unsigned int size = getNumPulses();
out->writeInt(size);
for(unsigned int i=0; i<size; i++){
double length;
osg::Vec4 color;
getPulse(i, length, color);
out->writeDouble(length);
out->writeVec4(color);
}
// Write out phase shift.
out->writeDouble(getPhaseShift());
// Write out SequenceGroup.
if( getSequenceGroup() )
out->writeDouble(getSequenceGroup()->_baseTime);
else
out->writeDouble( 0.0 );
}
void BlinkSequence::read(DataInputStream* in){
// Peek on BlinkSequence's identification.
int id = in->peekInt();
if(id == IVEBLINKSEQUENCE){
// Read BlinkSequence's identification.
id = in->readInt();
// If the osgSim class is inherited by any other class we should also
read this from file.
osg::Object* obj = dynamic_cast<osg::Object*>(this);
if(obj){
((ive::Object*)(obj))->read(in);
}
else
throw Exception("BlinkSequence::read(): Could not cast this
osgSim::BlinkSequence to an osg::Object.");
// Read BlinkSequence's properties
// Read in pulse data.
unsigned int size = in->readInt();
for(unsigned int i=0; i<size; i++){
double length = in->readDouble();
osg::Vec4 color = in->readVec4();
addPulse(length,color);
}
// Read in phase shift.
setPhaseShift(in->readDouble());
// Read in SequenceGroup
setSequenceGroup(new osgSim::SequenceGroup(in->readDouble()));
}
else{
throw Exception("BlinkSequence::read(): Expected BlinkSequence
identification.");
}
}
_______________________________________________
osg-submissions mailing list
[email protected]
http://lists.openscenegraph.org/listinfo.cgi/osg-submissions-openscenegraph.org