Changeset 7756

Show
Ignore:
Timestamp:
01/04/08 12:26:21 (6 years ago)
Author:
robert
Message:

From Brede Johansen, support for contiuation records.

Location:
OpenSceneGraph/trunk/src/osgPlugins/OpenFlight
Files:
9 modified

Legend:

Unmodified
Added
Removed
  • OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/ControlRecords.cpp

    r7748 r7756  
    3939        META_Record(PushLevel) 
    4040 
     41        virtual void readRecord(RecordInputStream& /*in*/, Document& document) 
     42        { 
     43            document.pushLevel(); 
     44        } 
     45 
     46    protected: 
     47 
     48        virtual ~PushLevel() {} 
     49}; 
     50 
     51RegisterRecordProxy<PushLevel> g_PushLevel(PUSH_LEVEL_OP); 
     52 
     53 
     54/** PophLevel 
     55*/ 
     56class PopLevel : public Record 
     57{ 
     58    public: 
     59 
     60        PopLevel() {} 
     61 
     62        META_Record(PopLevel) 
     63 
    4164        virtual void read(RecordInputStream& /*in*/, Document& document) 
    4265        { 
    43             document.pushLevel(); 
    44         } 
    45  
    46     protected: 
    47  
    48         virtual ~PushLevel() {} 
    49 }; 
    50  
    51 RegisterRecordProxy<PushLevel> g_PushLevel(PUSH_LEVEL_OP); 
    52  
    53  
    54 /** PophLevel 
    55 */ 
    56 class PopLevel : public Record 
    57 { 
    58     public: 
    59  
    60         PopLevel() {} 
    61  
    62         META_Record(PopLevel) 
     66            // Finally call dispose() for primary with push, pop level pair.  
     67            PrimaryRecord* primary = document.getTopOfLevelStack(); 
     68            if (primary) 
     69            { 
     70                primary->dispose(document); 
     71            } 
     72 
     73            document.popLevel(); 
     74        } 
     75 
     76    protected: 
     77 
     78        virtual ~PopLevel() {} 
     79}; 
     80 
     81RegisterRecordProxy<PopLevel> g_PopLevel(POP_LEVEL_OP); 
     82 
     83 
     84/** PushSubface 
     85*/ 
     86class PushSubface : public Record 
     87{ 
     88    public: 
     89 
     90        PushSubface() {} 
     91 
     92        META_Record(PushSubface) 
    6393 
    6494        virtual void read(RecordInputStream& /*in*/, Document& document) 
    6595        { 
    66             document.popLevel(); 
    67         } 
    68  
    69     protected: 
    70  
    71         virtual ~PopLevel() {} 
    72 }; 
    73  
    74 RegisterRecordProxy<PopLevel> g_PopLevel(POP_LEVEL_OP); 
    75  
    76  
    77 /** PushSubface 
    78 */ 
    79 class PushSubface : public Record 
    80 { 
    81     public: 
    82  
    83         PushSubface() {} 
    84  
    85         META_Record(PushSubface) 
     96            document.pushSubface(); 
     97        } 
     98 
     99    protected: 
     100 
     101        virtual ~PushSubface() {} 
     102}; 
     103 
     104RegisterRecordProxy<PushSubface> g_PushSubface(PUSH_SUBFACE_OP); 
     105 
     106 
     107/** PopSubface 
     108*/ 
     109class PopSubface : public Record 
     110{ 
     111    public: 
     112 
     113        PopSubface() {} 
     114 
     115        META_Record(PopSubface) 
    86116 
    87117        virtual void read(RecordInputStream& /*in*/, Document& document) 
    88118        { 
    89             document.pushSubface(); 
    90         } 
    91  
    92     protected: 
    93  
    94         virtual ~PushSubface() {} 
    95 }; 
    96  
    97 RegisterRecordProxy<PushSubface> g_PushSubface(PUSH_SUBFACE_OP); 
    98  
    99  
    100 /** PopSubface 
    101 */ 
    102 class PopSubface : public Record 
    103 { 
    104     public: 
    105  
    106         PopSubface() {} 
    107  
    108         META_Record(PopSubface) 
    109  
    110         virtual void read(RecordInputStream& /*in*/, Document& document) 
    111         { 
    112119            document.popSubface(); 
    113120        } 
     
    182189        { 
    183190            readRecord(in,document); 
    184     //      in().seekg(in.getEndOfRecord(), std::ios_base::beg); 
    185             // loop until PopAttribute 
    186  
    187191        } 
    188192 
  • OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/Document.cpp

    r7748 r7756  
    4747} 
    4848 
    49  
    5049Document::~Document() 
    5150{ 
    5251} 
    5352 
    54  
    5553void Document::pushLevel() 
    5654{ 
    5755    _levelStack.push_back(_currentPrimaryRecord.get()); 
    58     _levelStack.back()->pushLevel(*this); 
    5956    _level++; 
    6057} 
    6158 
    62  
    6359void Document::popLevel() 
    6460{ 
    65     _levelStack.back()->popLevel(*this); 
    6661    _levelStack.pop_back(); 
    6762 
    6863    if (!_levelStack.empty()) 
    69         _currentPrimaryRecord = _levelStack.back().get(); 
     64        _currentPrimaryRecord = _levelStack.back(); 
    7065 
    7166    if (--_level<=0) 
    7267        _done = true; 
    7368} 
    74  
    7569 
    7670void Document::pushSubface() 
     
    7973} 
    8074 
    81  
    8275void Document::popSubface() 
    8376{ 
    8477    _subfaceLevel--; 
    8578} 
    86  
    8779 
    8880void Document::pushExtension() 
     
    9688    _extensionStack.push_back(_currentPrimaryRecord.get()); 
    9789} 
    98  
    9990 
    10091void Document::popExtension() 
     
    110101} 
    111102 
    112  
    113103osg::Node* Document::getInstanceDefinition(int no) 
    114104{ 
     
    119109    return NULL; 
    120110} 
    121  
    122111 
    123112double flt::unitsToMeters(CoordUnits unit) 
  • OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/Document.h

    r7748 r7756  
    9797 
    9898        // Current primar record 
    99         void setCurrentPrimaryRecord(PrimaryRecord* record) {_currentPrimaryRecord=record; } 
     99        void setCurrentPrimaryRecord(PrimaryRecord* record) { _currentPrimaryRecord=record; } 
    100100        PrimaryRecord* getCurrentPrimaryRecord() { return _currentPrimaryRecord.get(); } 
    101101        const PrimaryRecord* getCurrentPrimaryRecord() const { return _currentPrimaryRecord.get(); } 
     
    113113        void pushExtension(); 
    114114        void popExtension(); 
    115  
    116115 
    117116        void setHeaderNode(osg::Node* node) { _osgHeader = node; } 
  • OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/GeometryRecords.cpp

    r7748 r7756  
    7373    META_setID(_geode) 
    7474    META_setComment(_geode) 
    75     META_setMatrix(_geode) 
    7675    META_setMultitexture(_geode) 
    7776 
     
    435434    } 
    436435 
    437     virtual void popLevel(Document& document) 
     436    virtual void dispose(Document& document) 
    438437    { 
    439438        if (_geode.valid()) 
    440439        { 
     440            // Insert transform(s) 
     441            if (_matrix.valid()) 
     442            { 
     443                insertMatrixTransform(*_geode,*_matrix,_numberOfReplications); 
     444            } 
     445 
     446            // Add primitives, set bindings etc. 
    441447            for (unsigned int i=0; i<_geode->getNumDrawables(); ++i) 
    442448            { 
     
    729735    META_setID(_geode) 
    730736    META_setComment(_geode) 
    731     META_setMatrix(_geode) 
    732737    META_setMultitexture(_geode) 
    733738 
     
    965970    } 
    966971 
    967     virtual void popLevel(Document& document) 
     972    virtual void dispose(Document& document) 
    968973    { 
    969974        if (_geode.valid()) 
    970975        { 
     976            // Insert transform(s) 
     977            if (_matrix.valid()) 
     978            { 
     979                insertMatrixTransform(*_geode,*_matrix,_numberOfReplications); 
     980            } 
     981 
    971982            osg::StateSet* stateset =  _geode->getOrCreateStateSet(); 
    972983 
  • OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/LightPointRecords.cpp

    r7748 r7756  
    114114    META_setID(_lpn) 
    115115    META_setComment(_lpn) 
    116     META_setMatrix(_lpn) 
     116    META_dispose(_lpn) 
    117117 
    118118    // Add lightpoint, add two if bidirectional. 
     
    264264    META_setID(_lpn) 
    265265    META_setComment(_lpn) 
    266     META_setMatrix(_lpn) 
     266    META_dispose(_lpn) 
    267267 
    268268    // Add lightpoint, add two if bidirectional. 
     
    482482    } 
    483483 
    484     virtual void popLevel(Document& document) 
    485     { 
     484    virtual void dispose(Document& document) 
     485    { 
     486        if (!_switch.valid()) return; 
     487 
     488        // Insert transform(s) 
     489        if (_matrix.valid()) 
     490        { 
     491            insertMatrixTransform(*_switch,*_matrix,_numberOfReplications); 
     492        } 
     493 
    486494        // Set default sets: 0 for all off, 1 for all on 
    487495        _switch->setAllChildrenOff( 0 ); 
  • OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/PrimaryRecords.cpp

    r7748 r7756  
    5555    META_setID(_header) 
    5656    META_setComment(_header) 
    57 //  META_setMatrix(_header) 
    5857    META_setMultitexture(_header) 
    5958    META_addChild(_header) 
     
    133132    } 
    134133 
    135     virtual void popLevel(Document& document) 
     134    virtual void dispose(Document& document) 
    136135    { 
    137136        if (_header.valid()) 
     
    187186    META_setID(_group) 
    188187    META_setComment(_group) 
    189     META_setMatrix(_group) 
    190188    META_setMultitexture(_group) 
    191189    META_addChild(_group) 
     
    237235    } 
    238236 
    239     virtual void popLevel(Document& document) 
    240     { 
     237    virtual void dispose(Document& document) 
     238    { 
     239        if (!_group.valid()) return; 
     240 
     241        // Insert transform(s) 
     242        if (_matrix.valid()) 
     243        { 
     244            insertMatrixTransform(*_group,*_matrix,_numberOfReplications); 
     245        } 
     246 
    241247        // Children are added! 
    242248        osg::Sequence* sequence = dynamic_cast<osg::Sequence*>(_group.get()); 
     
    319325    META_setID(_dof) 
    320326    META_setComment(_dof) 
    321     META_setMatrix(_dof) 
    322327    META_setMultitexture(_dof) 
    323328    META_addChild(_dof) 
     329    META_dispose(_dof) 
    324330 
    325331protected: 
    326332 
    327333    virtual ~DegreeOfFreedom() {} 
    328  
    329334    virtual void readRecord(RecordInputStream& in, Document& document) 
    330335    { 
     
    454459    META_setID(_lod) 
    455460    META_setComment(_lod) 
    456     META_setMatrix(_lod) 
    457461    META_setMultitexture(_lod) 
    458462    META_addChild(_impChild0) 
     463    META_dispose(_lod) 
    459464 
    460465protected: 
    461466 
    462467    virtual ~LevelOfDetail() {} 
    463  
    464468    virtual void readRecord(RecordInputStream& in, Document& document) 
    465469    { 
     
    510514    META_setID(_lod) 
    511515    META_setComment(_lod) 
    512     META_setMatrix(_lod) 
    513516    META_setMultitexture(_lod) 
    514517    META_addChild(_impChild0) 
     518    META_dispose(_lod) 
    515519 
    516520protected: 
    517521 
    518522    virtual ~OldLevelOfDetail() {} 
    519  
    520523    virtual void readRecord(RecordInputStream& in, Document& document) 
    521524    { 
     
    571574    META_setID(_multiSwitch) 
    572575    META_setComment(_multiSwitch) 
    573     META_setMatrix(_multiSwitch) 
    574576    META_setMultitexture(_multiSwitch) 
     577    META_dispose(_multiSwitch) 
    575578 
    576579    virtual void addChild(osg::Node& child) 
     
    594597 
    595598    virtual ~Switch() {} 
    596  
    597599    virtual void readRecord(RecordInputStream& in, Document& /*document*/) 
    598600    { 
     
    653655    META_setID(_external) 
    654656    META_setComment(_external) 
    655     META_setMatrix(_external) 
    656657    META_setMultitexture(_external) 
    657658    META_addChild(_external) 
     659    META_dispose(_external) 
    658660 
    659661protected: 
    660662 
    661663    virtual ~ExternalReference() {} 
    662  
    663664    virtual void readRecord(RecordInputStream& in, Document& document) 
    664665    { 
     
    718719class InstanceDefinition : public PrimaryRecord 
    719720{ 
     721    int _number; 
    720722    osg::ref_ptr<osg::Group> _instanceDefinition; 
    721723 
    722724public: 
    723725 
    724     InstanceDefinition() {} 
     726    InstanceDefinition():_number(0) {} 
    725727 
    726728    META_Record(InstanceDefinition) 
     
    731733    META_addChild(_instanceDefinition) 
    732734 
    733     virtual void setMatrix(osg::Matrix& matrix) 
    734     { 
    735         osg::ref_ptr<osg::MatrixTransform> transform = new osg::MatrixTransform(matrix); 
    736         transform->setDataVariance(osg::Object::STATIC); 
    737         transform->addChild(_instanceDefinition.get()); 
    738         _instanceDefinition = transform.get(); 
    739     } 
    740  
    741735protected: 
    742736 
    743737    virtual ~InstanceDefinition() {} 
    744  
    745738    virtual void readRecord(RecordInputStream& in, Document& document) 
    746739    { 
    747740        in.forward(2); 
    748         uint16 number = in.readUInt16(); 
     741        _number = (int)in.readUInt16(); 
    749742 
    750743        _instanceDefinition = new osg::Group; 
     744    } 
     745 
     746    virtual void dispose(Document& document) 
     747    { 
     748        // Insert transform(s) 
     749        if (_matrix.valid()) 
     750        { 
     751            osg::ref_ptr<osg::MatrixTransform> transform = new osg::MatrixTransform(*_matrix); 
     752            transform->setDataVariance(osg::Object::STATIC); 
     753            transform->addChild(_instanceDefinition.get()); 
     754            _instanceDefinition = transform.get(); 
     755        } 
    751756 
    752757        //  Add to instance definition table. 
    753         document.setInstanceDefinition(number,_instanceDefinition.get()); 
    754     } 
     758        document.setInstanceDefinition(_number,_instanceDefinition.get()); 
     759    } 
     760 
    755761}; 
    756762 
     
    772778 
    773779    virtual ~InstanceReference() {} 
    774  
    775780    virtual void readRecord(RecordInputStream& in, Document& document) 
    776781    { 
     
    782787 
    783788        // Add this implementation to parent implementation. 
    784         if (_parent.valid()) 
     789        if (_parent.valid() && instance) 
    785790            _parent->addChild(*instance); 
    786791    } 
     
    804809    META_setID(_extension) 
    805810    META_setComment(_extension) 
    806     META_setMatrix(_extension) 
    807811    META_setMultitexture(_extension) 
    808812    META_addChild(_extension) 
     813    META_dispose(_extension) 
    809814 
    810815protected: 
    811816 
    812817    virtual ~Extension() {} 
    813  
    814818    virtual void readRecord(RecordInputStream& in, Document& /*document*/) 
    815819    { 
     
    851855    META_setID(_object) 
    852856    META_setComment(_object) 
    853  
    854     virtual void setMatrix(osg::Matrix& matrix) 
    855     { 
    856         if (_object.valid()) 
    857             insertMatrixTransform(*_object,matrix); 
     857    META_addChild(_object) 
     858 
     859protected: 
     860 
     861    virtual void readRecord(RecordInputStream& in, Document& document) 
     862    { 
     863        std::string id = in.readString(8); 
     864        /*uint32 flags =*/ in.readUInt32(); 
     865 
     866        _object = new osg::Group; 
     867        _object->setName(id); 
     868 
     869        // Postpone add-to-parent until we know a bit more. 
     870    } 
     871 
     872    virtual void dispose(Document& document) 
     873    { 
     874        if (!_parent.valid() || !_object.valid()) return; 
     875 
     876        // Is it safe to remove _object? 
     877        if (!document.getPreserveObject() && isSafeToRemoveObject() && !_matrix.valid()) 
     878        { 
     879            // Add children of _object to parent. 
     880            // _object will not be added to graph. 
     881            for (unsigned int i=0; i<_object->getNumChildren(); ++i) 
     882            { 
     883                _parent->addChild(*(_object->getChild(i))); 
     884            } 
     885        } 
    858886        else 
    859887        { 
    860             _object = new osg::MatrixTransform(matrix); 
    861             _object->setDataVariance(osg::Object::STATIC); 
    862  
    863             if (_parent.valid()) 
    864                 _parent->addChild(*_object); 
    865         } 
    866     } 
    867  
    868     virtual void addChild(osg::Node& child) 
    869     { 
    870         // If object excists it means it is preserved. 
    871         if (_object.valid()) 
    872             _object->addChild(&child); 
    873         // If no object add child to parent. 
    874         else if (_parent.valid()) 
    875             _parent->addChild(child); 
    876     } 
    877  
    878 protected: 
    879  
    880     virtual ~Object() {} 
    881  
    882     virtual void readRecord(RecordInputStream& in, Document& document) 
    883     { 
    884         // Is it safe to remove the object? 
    885         if (!document.getPreserveObject()) 
    886         { 
    887             // The following tests need a valid parent. 
    888             if (!_parent.valid()) 
    889                 return; 
    890  
     888            _parent->addChild(*_object); 
     889        } 
     890 
     891        // Insert transform(s) 
     892        if (_matrix.valid()) 
     893        { 
     894            insertMatrixTransform(*_object,*_matrix,_numberOfReplications); 
     895        } 
     896    } 
     897 
     898    bool isSafeToRemoveObject() const 
     899    { 
     900        // The following tests need a valid parent. 
     901        if (_parent.valid()) 
     902        { 
    891903            // LODs adds an empty child group so it is safe to remove this object record. 
    892904            if (typeid(*_parent)==typeid(flt::LevelOfDetail)) 
    893                 return; 
     905                return true; 
    894906 
    895907            if (typeid(*_parent)==typeid(flt::OldLevelOfDetail)) 
    896                 return; 
     908                return true; 
    897909 
    898910            // If parent is a Group record we have to check for animation. 
    899911            Group* parentGroup = dynamic_cast<flt::Group*>(_parent.get()); 
    900912            if (parentGroup && !parentGroup->hasAnimation()) 
    901                 return; 
    902         } 
    903  
    904         std::string id = in.readString(8); 
    905         _object = new osg::Group; 
    906         _object->setName(id); 
    907  
    908  
    909 #if 1 
    910         /*uint32 flags =*/ in.readUInt32(); 
    911 #else 
    912  
    913         // The Object "Flat Shaded" checkbox in Creator is used by the "Calculate Shading" operation, 
    914         // it is not a flat shaded state attribute. 
    915          
    916         uint32 flags = in.readUInt32(); 
    917         // Flat shaded? 
    918         if (flags & FLAT_SHADED) 
    919         { 
    920             static osg::ref_ptr<osg::ShadeModel> shademodel; 
    921             if (!shademodel.valid()) 
    922             { 
    923                 shademodel = new osg::ShadeModel; 
    924                 shademodel->setMode(osg::ShadeModel::FLAT); 
    925             } 
    926             _object->getOrCreateStateSet()->setAttribute(shademodel.get()); 
    927         } 
    928 #endif 
    929         if (_parent.valid()) 
    930             _parent->addChild(*_object); 
    931     } 
     913                return true; 
     914        } 
     915 
     916        return false; 
     917    } 
     918 
    932919}; 
    933920 
     
    953940    META_setID(_lightSource) 
    954941    META_setComment(_lightSource) 
    955     META_setMatrix(_lightSource) 
     942    META_dispose(_lightSource) 
    956943 
    957944protected: 
    958945 
    959946    virtual ~LightSource() {} 
    960  
    961947    virtual void readRecord(RecordInputStream& in, Document& document) 
    962948    { 
  • OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/Record.cpp

    r7748 r7756  
    3131} 
    3232 
    33 Record::~Record() 
    34 { 
    35 } 
    36  
    37 void Record::setParent(PrimaryRecord* parent) 
    38 { 
    39     _parent = parent; 
    40 } 
    41  
    42 //PrimaryRecord& Record::parent() 
    43 //{ 
    44 //    if (!_parent) 
    45 //        throw std::runtime_error("Record::parent(): invalid pointer to parent exception."); 
    46 // 
    47 //    return *_parent; 
    48 //} 
    49  
    50  
    5133void Record::read(RecordInputStream& in, Document& document) 
    5234{ 
    53     setParent(document.getCurrentPrimaryRecord()); 
     35    _parent = document.getCurrentPrimaryRecord(); 
    5436 
    5537    // Read record body. 
     
    5739} 
    5840 
    59  
    6041void Record::readRecord(RecordInputStream& /*in*/, Document& /*document*/) 
    6142{ 
    6243} 
    63  
    6444 
    6545PrimaryRecord::PrimaryRecord() : 
     
    6848} 
    6949 
    70  
    7150void PrimaryRecord::read(RecordInputStream& in, Document& document) 
    7251{ 
    73     setParent(document.getTopOfLevelStack()); 
     52    PrimaryRecord* parentPrimary = document.getTopOfLevelStack(); 
     53    PrimaryRecord* currentPrimary = document.getCurrentPrimaryRecord(); 
    7454 
    75     // Update primary record. 
     55    // Finally call dispose() for primary without push, pop level pair.  
     56    if (currentPrimary && currentPrimary!=parentPrimary) 
     57    { 
     58        currentPrimary->dispose(document); 
     59    } 
     60 
     61   // Update current primary record. 
    7662    document.setCurrentPrimaryRecord(this); 
     63 
     64     _parent = parentPrimary; 
    7765 
    7866    // Read record body. 
     
    8371// Helper methods 
    8472 
    85 // Insert matrix-tranform above node. 
    86 // Return transform. 
    87 osg::ref_ptr<osg::MatrixTransform> flt::insertMatrixTransform(osg::Node& node, const osg::Matrix& matrix) 
     73// Insert matrix-tranform(s) 
     74// 
     75// node: node to apply transform 
     76// matrix: transformation matrix 
     77// numberOfReplications: zero for regular transform, number of copies if replication is used. 
     78void flt::insertMatrixTransform(osg::Node& node, const osg::Matrix& matrix, int numberOfReplications) 
    8879{ 
    8980    osg::ref_ptr<osg::Node> ref = &node; 
    90     osg::ref_ptr<osg::MatrixTransform> transform = new osg::MatrixTransform(matrix); 
    91     transform->setDataVariance(osg::Object::STATIC); 
     81    osg::Node::ParentList parents = node.getParents(); 
    9282 
    93     // Replace parent 
    94     osg::Node::ParentList parents = node.getParents(); 
     83    // Disconnect node from parents. 
    9584    for (osg::Node::ParentList::iterator itr=parents.begin(); 
    9685        itr!=parents.end(); 
    9786        ++itr) 
    9887    { 
    99         (*itr)->replaceChild(&node,transform.get()); 
     88        (*itr)->removeChild(&node); 
    10089    } 
    10190 
    102     // Make primary a child of matrix transform. 
    103     transform->addChild(&node); 
     91    // Start without transformation if replication. 
     92    osg::Matrix accumulatedMatrix = (numberOfReplications > 0)? osg::Matrix::identity() : matrix; 
    10493 
    105     return transform; 
     94    for (int n=0; n<=numberOfReplications; n++) 
     95    { 
     96        // Accumulate transformation for each replication. 
     97        osg::ref_ptr<osg::MatrixTransform> transform = new osg::MatrixTransform(accumulatedMatrix); 
     98        transform->setDataVariance(osg::Object::STATIC); 
     99 
     100        // Add transform to parents 
     101        for (osg::Node::ParentList::iterator itr=parents.begin(); 
     102            itr!=parents.end(); 
     103            ++itr) 
     104        { 
     105            (*itr)->addChild(transform.get()); 
     106        } 
     107 
     108        // Make primary a child of matrix transform. 
     109        transform->addChild(&node); 
     110 
     111        // Accumulate transform if multiple replications. 
     112        accumulatedMatrix *= matrix; 
     113    } 
    106114} 
    107115 
  • OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/Record.h

    r7748 r7756  
    4343#define META_setID(imp) virtual void setID(const std::string& id) { if (imp.valid()) imp->setName(id); } 
    4444#define META_setComment(imp) virtual void setComment(const std::string& id) { if (imp.valid()) imp->addDescription(id); } 
    45 #define META_setMatrix(imp) virtual void setMatrix(osg::Matrix& matrix) { if (imp.valid()) insertMatrixTransform(*imp,matrix); } 
    4645#define META_setMultitexture(imp) virtual void setMultitexture(osg::StateSet& multitexture) { if (imp.valid()) imp->getOrCreateStateSet()->merge(multitexture); } 
    4746#define META_addChild(imp) virtual void addChild(osg::Node& child) { if (imp.valid()) imp->addChild(&child); } 
    48  
     47#define META_dispose(imp) virtual void dispose(Document&) { if (imp.valid() && _matrix.valid()) insertMatrixTransform(*imp,*_matrix,_numberOfReplications); } 
    4948 
    5049// pure virtual base class 
     
    6362protected: 
    6463 
    65     virtual ~Record(); 
     64    virtual ~Record() {} 
    6665 
    6766    virtual void readRecord(RecordInputStream& in, Document& document); 
     
    7877 
    7978    virtual void read(RecordInputStream& in, Document& document); 
    80     virtual void pushLevel(Document& /*document*/) {} 
    81     virtual void popLevel(Document& /*document*/) {} 
     79    virtual void dispose(Document& /*document*/) {} 
    8280 
    8381    // Ancillary operations 
    8482    virtual void setID(const std::string& /*id*/) {} 
    8583    virtual void setComment(const std::string& /*comment*/) {} 
    86     virtual void setMatrix(osg::Matrix& /*matrix*/) {} 
    8784    virtual void setMultitexture(osg::StateSet& /*multitexture*/) {} 
    8885    virtual void addChild(osg::Node& /*child*/) {} 
     
    9289 
    9390    void setNumberOfReplications(int num) { _numberOfReplications = num; } 
     91    void setMatrix(const osg::Matrix& matrix) { _matrix = new osg::RefMatrix(matrix); } 
    9492 
    9593    void setLocalVertexPool(VertexList* pool) { _localVertexPool = pool; } 
     
    10199 
    102100    int _numberOfReplications; 
     101    osg::ref_ptr<osg::RefMatrix> _matrix; 
    103102    osg::ref_ptr<VertexList> _localVertexPool; 
    104103}; 
     
    121120 
    122121 
    123 osg::ref_ptr<osg::MatrixTransform> insertMatrixTransform(osg::Node& node, const osg::Matrix& matrix); 
     122void insertMatrixTransform(osg::Node& node, const osg::Matrix& matrix, int numberOfReplications); 
    124123 
    125124osg::Vec3Array* getOrCreateVertexArray(osg::Geometry& geometry); 
  • OpenSceneGraph/trunk/src/osgPlugins/OpenFlight/RoadRecords.cpp

    r7748 r7756  
    4141        META_setID(_roadSegment) 
    4242        META_setComment(_roadSegment) 
    43         META_setMatrix(_roadSegment) 
    4443        META_setMultitexture(_roadSegment) 
    4544        META_addChild(_roadSegment) 
     45        META_dispose(_roadSegment) 
    4646 
    4747    protected: 
    4848 
    4949        virtual ~RoadSegment() {} 
    50  
    5150        virtual void readRecord(RecordInputStream& in, Document& /*document*/) 
    5251        { 
     
    7978        META_setID(_roadConstruction) 
    8079        META_setComment(_roadConstruction) 
    81         META_setMatrix(_roadConstruction) 
    8280        META_setMultitexture(_roadConstruction) 
    8381        META_addChild(_roadConstruction) 
     82        META_dispose(_roadConstruction) 
    8483 
    8584    protected: 
    8685 
    8786        virtual ~RoadConstruction() {} 
    88  
    8987        virtual void readRecord(RecordInputStream& in, Document& /*document*/) 
    9088        { 
     
    118116        META_setID(_roadPath) 
    119117        META_setComment(_roadPath) 
    120         META_setMatrix(_roadPath) 
    121118        META_setMultitexture(_roadPath) 
    122119        META_addChild(_roadPath) 
     120        META_dispose(_roadPath) 
    123121 
    124122    protected: 
    125123 
    126124        virtual ~RoadPath() {} 
    127  
    128125        virtual void readRecord(RecordInputStream& /*in*/, Document& /*document*/) 
    129126        {