diff --git a/include/osgSim/ObjectRecordData b/include/osgSim/ObjectRecordData new file mode 100644 index 000000000..975367bf5 --- /dev/null +++ b/include/osgSim/ObjectRecordData @@ -0,0 +1,72 @@ +/* -*-c++-*- OpenSceneGraph - Copyright (C) 1998-2004 Robert Osfield + * + * This library is open source and may be redistributed and/or modified under + * the terms of the OpenSceneGraph Public License (OSGPL) version 0.0 or + * (at your option) any later version. The full license is in LICENSE file + * included with this distribution, and on the openscenegraph.org website. + * + * This library is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * OpenSceneGraph Public License for more details. +*/ + +#ifndef OSGSIM_OBJECTRECORDDATA +#define OSGSIM_OBJECTRECORDDATA 1 + +#include + +#include + +namespace osgSim { + +/** When the OpenFlight importer encounters an Object record, it stores + the data in one of these classes, and attaches the instance of the + class as UserData to the corresponding osgLLGroup node. +*/ + +class ObjectRecordData : public osg::Object +{ + public: + + ObjectRecordData() + : _flags( 0 ), + _relativePriority( 0 ), + _transparency( 0 ), + _effectID1( 0 ), + _effectID2( 0 ), + + _significance( 0 ) + {} + ObjectRecordData( const ObjectRecordData& copy, const osg::CopyOp& copyop = osg::CopyOp::SHALLOW_COPY ) + { + _flags = copy._flags; + _relativePriority = copy._relativePriority; + _transparency = copy._transparency; + _effectID1 = copy._effectID1; + _effectID2 = copy._effectID2; + _significance = copy._significance; + } + + META_Object( osgSim, ObjectRecordData ); + + // Flags bits + static const unsigned int DONT_DISPLAY_IN_DAYLIGHT = 0x80000000u >> 0; + static const unsigned int DONT_DISPLAY_AT_DUSK = 0x80000000u >> 1; + static const unsigned int DONT_DISPLAY_AT_NIGHT = 0x80000000u >> 2; + static const unsigned int DONT_ILLUMINATE = 0x80000000u >> 3; + static const unsigned int FLAT_SHADED = 0x80000000u >> 4; + static const unsigned int GROUPS_SHADOW_OBJECT = 0x80000000u >> 5; + + unsigned int _flags; + short _relativePriority; + unsigned short _transparency; // 0=opaque, 65535=totally clear + short _effectID1; + short _effectID2; + short _significance; + +}; // end of class ObjectRecordData + +} // end of namespace osgSim + +#endif diff --git a/src/osgPlugins/osgSim/IO_ObjectRecordData.cpp b/src/osgPlugins/osgSim/IO_ObjectRecordData.cpp new file mode 100644 index 000000000..029ecaeb5 --- /dev/null +++ b/src/osgPlugins/osgSim/IO_ObjectRecordData.cpp @@ -0,0 +1,107 @@ +#include +#include + +#include +#include + +#include +#include +#include +#include + +//#include + +bool ObjectRecordData_readLocalData( osg::Object &obj, osgDB::Input &fr ); +bool ObjectRecordData_writeLocalData( const osg::Object &obj, osgDB::Output &fw ); + +osgDB::RegisterDotOsgWrapperProxy ObjectRecordData_Proxy +( + new osgSim::ObjectRecordData, + "ObjectRecordData", + "Object ObjectRecordData", + &ObjectRecordData_readLocalData, + &ObjectRecordData_writeLocalData, + osgDB::DotOsgWrapper::READ_AND_WRITE +); + +static const int numBits( 6 ); +typedef std::pair< std::string,unsigned int> FlagBits; +static FlagBits flagBits[numBits] = { + FlagBits( std::string("DONT_DISPLAY_IN_DAYLIGHT"), osgSim::ObjectRecordData::DONT_DISPLAY_IN_DAYLIGHT ), + FlagBits( "DONT_DISPLAY_AT_DUSK", osgSim::ObjectRecordData::DONT_DISPLAY_AT_DUSK ), + FlagBits( "DONT_DISPLAY_AT_NIGHT", osgSim::ObjectRecordData::DONT_DISPLAY_AT_NIGHT ), + FlagBits( "DONT_ILLUMINATE", osgSim::ObjectRecordData::DONT_ILLUMINATE ), + FlagBits( "FLAT_SHADED", osgSim::ObjectRecordData::FLAT_SHADED ), + FlagBits( "GROUPS_SHADOW_OBJECT", osgSim::ObjectRecordData::GROUPS_SHADOW_OBJECT ) +}; + +bool ObjectRecordData_readLocalData(osg::Object &obj, osgDB::Input &fr) +{ + bool iteratorAdvanced = false; + osgSim::ObjectRecordData &ord = static_cast(obj); + + if (fr.matchSequence("flags %i")) + { + unsigned int flags; + fr[1].getUInt( flags ); + ord._flags = flags; + fr += 2; + iteratorAdvanced = true; + } + if (fr.matchSequence("relativePriority %i")) + { + int relativePriority; + fr[1].getInt( relativePriority ); + ord._relativePriority = (short) relativePriority; + fr += 2; + iteratorAdvanced = true; + } + if (fr.matchSequence("transparency %i")) + { + int transparency; + fr[1].getInt( transparency ); + ord._transparency = (unsigned short) transparency; + fr += 2; + iteratorAdvanced = true; + } + if (fr.matchSequence("effectID1 %i")) + { + int effectID1; + fr[1].getInt( effectID1 ); + ord._effectID1 = (short) effectID1; + fr += 2; + iteratorAdvanced = true; + } + if (fr.matchSequence("effectID2 %i")) + { + int effectID2; + fr[1].getInt( effectID2 ); + ord._effectID2 = (short) effectID2; + fr += 2; + iteratorAdvanced = true; + } + if (fr.matchSequence("significance %i")) + { + int significance; + fr[1].getInt( significance ); + ord._significance = (short) significance; + fr += 2; + iteratorAdvanced = true; + } + + return iteratorAdvanced; +} + +bool ObjectRecordData_writeLocalData(const osg::Object &obj, osgDB::Output &fw) +{ + const osgSim::ObjectRecordData &ord = static_cast(obj); + + fw.indent() << "flags " << ord._flags << std::endl; + fw.indent() << "relativePriority " << ord._relativePriority << std::endl; + fw.indent() << "transparency " << ord._transparency << std::endl; + fw.indent() << "effectID1 " << ord._effectID1 << std::endl; + fw.indent() << "effectID2 " << ord._effectID2 << std::endl; + fw.indent() << "significance " << ord._significance << std::endl; + + return true; +}