Support added for OpenFlight switch nodes, submission from Brede Johansen.
This commit is contained in:
@@ -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] );
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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:
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||
|
||||
Reference in New Issue
Block a user