// Write non-standard node data as extra of type "Node" with "OpenSceneGraph" technique void daeWriter::writeNodeExtra(osg::Node &node) { unsigned int numDesc = node.getDescriptions().size(); // Only create extra if descriptions are filled in if (writeExtras && (numDesc > 0)) { // Adds the following to a node //<extra type="Node"> // <technique profile="OpenSceneGraph"> // <Descriptions> // <Description>Some info</Description> // </Descriptions> // </technique> //</extra> domExtra *extra = daeSafeCast<domExtra>(currentNode->add( COLLADA_ELEMENT_EXTRA )); extra->setType("Node"); domTechnique *teq = daeSafeCast<domTechnique>(extra->add( COLLADA_ELEMENT_TECHNIQUE ) ); teq->setProfile( "OpenSceneGraph" ); domAny *descriptions = (domAny*)teq->add( "Descriptions" ); for (unsigned int currDesc = 0; currDesc < numDesc; currDesc++) { std::string value = node.getDescription(currDesc); if (!value.empty()) { domAny *description = (domAny*)descriptions->add( "Description" ); description->setValue(value.c_str()); } } } }
/** If the DataOutputStream parameter is NULL, write to the _records member variable. Otherwise, write to the specified DataOutputStream. */ void FltExportVisitor::writeComment( const osg::Node& node, DataOutputStream* dos ) { if (dos==NULL) dos = _records; // Write all descriptions as Comment records. unsigned int nd = node.getNumDescriptions(); unsigned int idx=0; while( idx < nd ) { const std::string& com = node.getDescription( idx ); unsigned int iLen = com.length() + 5; if (iLen > 0xffff) { // short overrun std::string warning( "fltexp: writeComment: Descriptions too long, resorts in short overrun. Skipping." ); _fltOpt->getWriteResult().warn( warning ); OSG_WARN << warning << std::endl; continue; } uint16 length( (uint16)iLen ); dos->writeInt16( (int16) COMMENT_OP ); dos->writeInt16( length ); dos->writeString( com ); idx++; } }