Support added for OpenFlight switch nodes, submission from Brede Johansen.

This commit is contained in:
Robert Osfield
2002-05-07 11:12:01 +00:00
parent c47e082fa8
commit 8d48cc8dd7
3 changed files with 35 additions and 23 deletions

View File

@@ -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] );
}
}

View File

@@ -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:

View File

@@ -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; nChild<rec->getNumChildren(); 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;
}