From fd2a735be814d8edcb5787159af4dd90646ffdd5 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Thu, 27 Nov 2003 22:53:40 +0000 Subject: [PATCH] From Rune Schmidt Jensen, support for osgSim::VisibilityGroup in the .ive loader and support for node masks. --- VisualStudio/osgPlugins/ive/ive.dsp | 8 ++++ src/osgPlugins/ive/DataInputStream.cpp | 5 +++ src/osgPlugins/ive/DataOutputStream.cpp | 4 ++ src/osgPlugins/ive/GNUmakefile | 1 + src/osgPlugins/ive/LightPoint.h | 1 + src/osgPlugins/ive/Node.cpp | 6 ++- src/osgPlugins/ive/ReadWrite.h | 1 + src/osgPlugins/ive/VisibilityGroup.cpp | 58 +++++++++++++++++++++++++ src/osgPlugins/ive/VisibilityGroup.h | 15 +++++++ 9 files changed, 98 insertions(+), 1 deletion(-) create mode 100644 src/osgPlugins/ive/VisibilityGroup.cpp create mode 100644 src/osgPlugins/ive/VisibilityGroup.h diff --git a/VisualStudio/osgPlugins/ive/ive.dsp b/VisualStudio/osgPlugins/ive/ive.dsp index 9ed2b4d81..e8ea4ff14 100755 --- a/VisualStudio/osgPlugins/ive/ive.dsp +++ b/VisualStudio/osgPlugins/ive/ive.dsp @@ -320,6 +320,10 @@ SOURCE=..\..\..\src\osgPlugins\ive\LightPoint.cpp SOURCE=..\..\..\src\osgPlugins\ive\LightPointNode.cpp # End Source File +# Begin Source File + +SOURCE=..\..\..\src\osgPlugins\ive\VisibilityGroup.cpp +# End Source File # End Group # Begin Group "Header Files" @@ -556,6 +560,10 @@ SOURCE=..\..\..\src\osgPlugins\ive\LightPoint.h SOURCE=..\..\..\src\osgPlugins\ive\LightPointNode.h # End Source File +# Begin Source File + +SOURCE=..\..\..\src\osgPlugins\ive\VisibilityGroup.h +# End Source File # End Group # Begin Group "Resource Files" diff --git a/src/osgPlugins/ive/DataInputStream.cpp b/src/osgPlugins/ive/DataInputStream.cpp index 6dafb6be4..fb19834b9 100644 --- a/src/osgPlugins/ive/DataInputStream.cpp +++ b/src/osgPlugins/ive/DataInputStream.cpp @@ -44,6 +44,7 @@ #include "LightPointNode.h" #include "MultiSwitch.h" +#include "VisibilityGroup.h" #include "Geometry.h" @@ -682,6 +683,10 @@ osg::Node* DataInputStream::readNode() node = new osg::OccluderNode(); ((ive::OccluderNode*)(node))->read(this); } + else if(nodeTypeID== IVEVISIBILITYGROUP){ + node = new osgSim::VisibilityGroup(); + ((ive::VisibilityGroup*)(node))->read(this); + } else if(nodeTypeID== IVEGROUP){ node = new osg::Group(); ((ive::Group*)(node))->read(this); diff --git a/src/osgPlugins/ive/DataOutputStream.cpp b/src/osgPlugins/ive/DataOutputStream.cpp index 03b52bd85..fc70a228a 100644 --- a/src/osgPlugins/ive/DataOutputStream.cpp +++ b/src/osgPlugins/ive/DataOutputStream.cpp @@ -46,6 +46,7 @@ #include "LightPointNode.h" #include "MultiSwitch.h" +#include "VisibilityGroup.h" #include "Geometry.h" @@ -544,6 +545,9 @@ void DataOutputStream::writeNode(const osg::Node* node) else if(dynamic_cast(node)){ ((ive::Transform*)(node))->write(this); } + else if(dynamic_cast(node)){ + ((ive::VisibilityGroup*)(node))->write(this); + } else if(dynamic_cast(node)){ ((ive::Group*)(node))->write(this); } diff --git a/src/osgPlugins/ive/GNUmakefile b/src/osgPlugins/ive/GNUmakefile index 3df6f0c00..6469b6513 100644 --- a/src/osgPlugins/ive/GNUmakefile +++ b/src/osgPlugins/ive/GNUmakefile @@ -59,6 +59,7 @@ CXXFILES =\ ElevationSector.cpp\ LightPoint.cpp\ LightPointNode.cpp\ + VisibilityGroup.cpp\ LIBS += -losgSim -losgText $(OSG_LIBS) $(OTHER_LIBS) diff --git a/src/osgPlugins/ive/LightPoint.h b/src/osgPlugins/ive/LightPoint.h index bbfc021de..8382a0e59 100644 --- a/src/osgPlugins/ive/LightPoint.h +++ b/src/osgPlugins/ive/LightPoint.h @@ -9,6 +9,7 @@ class LightPoint : public osgSim::LightPoint, public ReadWrite { public: void write(DataOutputStream* out); void read(DataInputStream* in); + virtual ~LightPoint() {} }; } diff --git a/src/osgPlugins/ive/Node.cpp b/src/osgPlugins/ive/Node.cpp index 38b827805..6614ebb99 100644 --- a/src/osgPlugins/ive/Node.cpp +++ b/src/osgPlugins/ive/Node.cpp @@ -55,7 +55,6 @@ void Node::write(DataOutputStream* out){ if(getStateSet()) out->writeStateSet(getStateSet()); - // Write UpdateCallback if any osg::AnimationPathCallback* nc = dynamic_cast(getUpdateCallback()); out->writeBool(nc!=0); @@ -63,6 +62,9 @@ void Node::write(DataOutputStream* out){ { ((ive::AnimationPathCallback*)(nc))->write(out); } + + // Write NodeMask + out->writeUInt(getNodeMask()); } @@ -100,6 +102,8 @@ void Node::read(DataInputStream* in){ ((ive::AnimationPathCallback*)(nc))->read(in); setUpdateCallback(nc); } + // Read NodeMask + setNodeMask(in->readUInt()); } else{ throw Exception("Node::read(): Expected Node identification"); diff --git a/src/osgPlugins/ive/ReadWrite.h b/src/osgPlugins/ive/ReadWrite.h index 49251631a..d3c898a86 100644 --- a/src/osgPlugins/ive/ReadWrite.h +++ b/src/osgPlugins/ive/ReadWrite.h @@ -76,6 +76,7 @@ namespace ive { #define IVELIGHTPOINTNODE 0x00100007 #define IVEMULTISWITCH 0x00100008 +#define IVEVISIBILITYGROUP 0x00100009 class ReadWrite{ diff --git a/src/osgPlugins/ive/VisibilityGroup.cpp b/src/osgPlugins/ive/VisibilityGroup.cpp new file mode 100644 index 000000000..65592f7bd --- /dev/null +++ b/src/osgPlugins/ive/VisibilityGroup.cpp @@ -0,0 +1,58 @@ +/********************************************************************** + * + * FILE: VisibilityGroup.cpp + * + * DESCRIPTION: Read/Write osgSim::VisibilityGroup in binary format to disk. + * + * CREATED BY: Auto generated by iveGenerator.exe + * and later modified by Rune Schmidt Jensen. + * + * HISTORY: Created 27.11.2003 + * + **********************************************************************/ + +#include "Exception.h" +#include "VisibilityGroup.h" +#include "Group.h" + +using namespace ive; + +void VisibilityGroup::write(DataOutputStream* out){ + // Write VisibilityGroup's identification. + out->writeInt(IVEVISIBILITYGROUP); + // If the osgSim class is inherited by any other class we should also write this to file. + osg::Group* group = dynamic_cast(this); + if(group){ + ((ive::Group*)(group))->write(out); + } + else + throw Exception("VisibilityGroup::write(): Could not cast this osgSim::VisibilityGroup to an osg::Group."); + + // Write VisibilityGroup's properties. + out->writeNode(getVisibilityVolume()); + out->writeUInt(getVolumeIntersectionMask()); + out->writeFloat(getSegmentLength()); +} + +void VisibilityGroup::read(DataInputStream* in){ + // Peek on VisibilityGroup's identification. + int id = in->peekInt(); + if(id == IVEVISIBILITYGROUP){ + // Read VisibilityGroup's identification. + id = in->readInt(); + // If the osgSim class is inherited by any other class we should also read this from file. + osg::Group* group = dynamic_cast(this); + if(group){ + ((ive::Group*)(group))->read(in); + } + else + throw Exception("VisibilityGroup::read(): Could not cast this osgSim::VisibilityGroup to an osg::Group."); + // Read VisibilityGroup's properties + setVisibilityVolume(in->readNode()); + setVolumeIntersectionMask(in->readUInt()); + setSegmentLength(in->readFloat()); + } + else{ + throw Exception("VisibilityGroup::read(): Expected VisibilityGroup identification."); + } +} diff --git a/src/osgPlugins/ive/VisibilityGroup.h b/src/osgPlugins/ive/VisibilityGroup.h new file mode 100644 index 000000000..4c467e54d --- /dev/null +++ b/src/osgPlugins/ive/VisibilityGroup.h @@ -0,0 +1,15 @@ +#ifndef IVE_VISIBILITYGROUP +#define IVE_VISIBILITYGROUP 1 + +#include +#include "ReadWrite.h" + +namespace ive{ +class VisibilityGroup : public osgSim::VisibilityGroup, public ReadWrite { +public: + void write(DataOutputStream* out); + void read(DataInputStream* in); +}; +} + +#endif