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

Reply via email to