From 8d48cc8dd7b0809db9e0182d4a7bacd4b5795de1 Mon Sep 17 00:00:00 2001 From: Robert Osfield Date: Tue, 7 May 2002 11:12:01 +0000 Subject: [PATCH] Support added for OpenFlight switch nodes, submission from Brede Johansen. --- src/osgPlugins/flt/SwitchRecord.cpp | 11 ++++++++--- src/osgPlugins/flt/SwitchRecord.h | 17 ++++++++-------- src/osgPlugins/flt/flt2osg.cpp | 30 +++++++++++++++++------------ 3 files changed, 35 insertions(+), 23 deletions(-) diff --git a/src/osgPlugins/flt/SwitchRecord.cpp b/src/osgPlugins/flt/SwitchRecord.cpp index a44d50ff2..ff1f1e01d 100644 --- a/src/osgPlugins/flt/SwitchRecord.cpp +++ b/src/osgPlugins/flt/SwitchRecord.cpp @@ -29,7 +29,12 @@ void SwitchRecord::endian() { SSwitch *pSSwitch = (SSwitch*)getData(); - ENDIAN( pSSwitch->dwCurrentMask ); - ENDIAN( pSSwitch->diWordsInMask ); - ENDIAN( pSSwitch->diMasks ); + ENDIAN( pSSwitch->nCurrentMask ); + ENDIAN( pSSwitch->nMasks ); + ENDIAN( pSSwitch->nWordsInMask ); + + for (int m=0; m < pSSwitch->nMasks*pSSwitch->nWordsInMask; m++) + { + ENDIAN( pSSwitch->aMask[m] ); + } } diff --git a/src/osgPlugins/flt/SwitchRecord.h b/src/osgPlugins/flt/SwitchRecord.h index d7bdb3951..3aac9bdc7 100644 --- a/src/osgPlugins/flt/SwitchRecord.h +++ b/src/osgPlugins/flt/SwitchRecord.h @@ -14,17 +14,18 @@ namespace flt { struct SSwitch { SRecHeader RecHeader; - char szIdent[8]; // // 7 char ASCII ID; 0 terminates - uint8 reserved[4]; // Reserved - uint32 dwCurrentMask; // Current mask - int32 diWordsInMask; // Number of 32 bit words required for each mask - // (number of children / 32 + number of children modulo 32) - int32 diMasks; // Number of masks -// ??? Mask[1]; // Variable Mask words - // (length = number of words per mask * number of masks * 4 bytes) + char szIdent[8]; // 7 char ASCII ID; 0 terminates + uint8 reserved[4]; // Reserved + uint32 nCurrentMask; // Current mask + int32 nMasks; // Number of masks + int32 nWordsInMask; // Number of 32 bit words required for each mask + // (number of children / 32 + number of children modulo 32) + uint32 aMask[1]; // Variable Mask words + // (length = number of words per mask * number of masks * 4 bytes) }; + class SwitchRecord : public PrimNodeRecord { public: diff --git a/src/osgPlugins/flt/flt2osg.cpp b/src/osgPlugins/flt/flt2osg.cpp index 1dc9b5b7b..2029f2741 100644 --- a/src/osgPlugins/flt/flt2osg.cpp +++ b/src/osgPlugins/flt/flt2osg.cpp @@ -626,21 +626,27 @@ osg::Group* ConvertFromFLT::visitDOF(osg::Group& osgParent, DofRecord* rec) osg::Group* ConvertFromFLT::visitSwitch(osg::Group& osgParent, SwitchRecord* rec) { - osg::Switch* switc = new osg::Switch; + SSwitch *pSSwitch = (SSwitch*)rec->getData(); + osg::Group* group = new osg::Group; - switc->setName(rec->getData()->szIdent); - switc->setValue(rec->getData()->dwCurrentMask); - visitAncillary(osgParent, *switc, rec)->addChild( switc ); - visitPrimaryNode(*switc, (PrimNodeRecord*)rec); + group->setName(pSSwitch->szIdent); + visitAncillary(osgParent, *group, rec)->addChild( group ); + visitPrimaryNode(*group, (PrimNodeRecord*)rec); - /* - TODO: - mask_bit = 1 << (child_num % 32) - mask_word = mask_words [mask_num * num_words + child_num / 32] - child_selected = mask_word & mask_bit - */ + for(int nChild=0; nChildgetNumChildren(); nChild++) + { + int nMaskBit = nChild % 32; + int nMaskWord = pSSwitch->nCurrentMask * pSSwitch->nWordsInMask + nChild / 32; - return switc; + if (!(pSSwitch->aMask[nMaskWord] & (uint32(1) << nMaskBit))) + { + osg::Node* node = group->getChild(nChild); + if (node) + node->setNodeMask(0); + } + } + + return group; }