From Paul Martz, files for adding ObjectRecordData support into OpenFlight

This commit is contained in:
Robert Osfield 2008-03-13 15:21:34 +00:00
parent e19dbe8daa
commit a9740118db
2 changed files with 179 additions and 0 deletions

View File

@ -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 <osg/Object>
#include <ostream>
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

View File

@ -0,0 +1,107 @@
#include <osgSim/ObjectRecordData>
#include <osg/io_utils>
#include <iostream>
#include <string>
#include <osgDB/Registry>
#include <osgDB/Input>
#include <osgDB/Output>
#include <osgDB/ParameterOutput>
//#include <map>
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<osgSim::ObjectRecordData&>(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<const osgSim::ObjectRecordData&>(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;
}