/*! Skips all fields in the stream, until the field end marker "" is encountered. */ void OSBCommonElement::skipFields(void) { BinaryReadHandler *rh = editRoot()->getReadHandler(); while(true) { std::string fieldName; std::string fieldTypeName; UInt32 fieldSize; rh->getValue(fieldName); if(fieldName.empty()) { OSG_OSB_LOG(("OSBCommonElement::skipFields: " "Found field end marker.\n" )); break; } rh->getValue(fieldTypeName); rh->getValue(fieldSize ); rh->skip (fieldSize ); OSG_OSB_LOG(("OSBCommonElement::skipFields: fieldTypeName [%s] fieldSize [%u]\n", fieldTypeName.c_str(), fieldSize)); } }
void OSBShaderParameterMIntElement::read(const std::string &typeName) { OSG_OSB_LOG(("OSBShaderParameterMIntElement::read: [%s]\n", typeName.c_str())); BinaryReadHandler *rh = editRoot()->getReadHandler(); UInt8 ptrTypeId; UInt16 version; rh->getValue(ptrTypeId); rh->getValue(version ); OSG_OSB_LOG(("OSBShaderParameterMIntElement::read: version: [%u]\n", version)); std::string fieldName; std::string fieldTypeName; UInt32 fieldSize; PtrFieldListIt ptrFieldIt; while(readFieldHeader("", fieldName, fieldTypeName, fieldSize)) { if(fieldName == "name") { _name.copyFromBin(*rh); } else if(fieldName == "value") { _value.copyFromBin(*rh); } else { OSG_OSB_LOG(("Skipping [%d] bytes for field [%s]\n", fieldSize, fieldName.c_str())); rh->skip(fieldSize); } } // no container is created for this element, which means the root does // not automatically insert it into the IdElemMap - do it manually editRoot()->editIdElemMap().insert( OSBRootElement::IdElemMap::value_type(getFCIdFile(), this)); }
void OSBTextureChunkElement::read(const std::string &typeName) { OSG_OSB_LOG(("OSBTextureChunkElement::read: [%s]\n", typeName.c_str())); BinaryReadHandler *rh = editRoot()->getReadHandler(); UInt8 ptrTypeId; UInt16 version; rh->getValue(ptrTypeId); rh->getValue(version ); OSG_OSB_LOG(("OSBTextureChunkElement::read: version: [%u]\n", version)); // create the two replacement chunks _pTexObj = TextureObjChunk::create(); _pTexEnv = TextureEnvChunk::create(); std::string fieldName; std::string fieldTypeName; UInt32 fieldSize; PtrFieldListIt ptrFieldIt; while(readFieldHeader("", fieldName, fieldTypeName, fieldSize)) { // some fields need to be duplicated for the two replacement chunks if(fieldName == "parents") { // parent fields are ignored rh->skip(fieldSize); } else if(fieldName == "internal") { bool fieldValue; rh->getValue(fieldValue); _pTexObj->setInternal(fieldValue); _pTexEnv->setInternal(fieldValue); } else if(fieldName == "ignore") { bool fieldValue; rh->getValue(fieldValue); _pTexObj->setIgnore(fieldValue); _pTexEnv->setIgnore(fieldValue); } else if(isTexObjField(fieldName)) { // set TexObj as container for reading the field setContainer(_pTexObj); readFieldContent(fieldName, fieldTypeName, fieldSize, "", ptrFieldIt); } else if(isTexEnvField(fieldName)) { // set TexEnv as container for reading the field setContainer(_pTexEnv); readFieldContent(fieldName, fieldTypeName, fieldSize, "", ptrFieldIt); } else { FWARNING(("OSBTextureChunkElement::read: Skipping unrecognized " "field [%s].\n", fieldName.c_str())); rh->skip(fieldSize); } } // set TexObj as "the" container setContainer(_pTexObj); }
/*! Reads the contents of a field from the stream. It is intended to be used in conjunction with readFieldHeader and uses the information obtained by it (\a fieldName, \a fieldTypeName, \a fieldSize ). If a field is not to be read, but skipped instead, its name can be passed in the \a excludeFields argument. The string has the format: "'name1' 'name2' 'name3'", the spaces between the "'" are mandatory. \param[in] fieldName Name of the field. \param[in] fieldTypeName Type of the field. \param[in] fieldSize Size in bytes of the field. \param[in] excludeFields \param[out] ptrFieldIt Iterator that points to the PtrFieldInfo structure that was created, if this is a "pointer field" - only valid if true is returned. \return True, if the field is a "pointer field", i.e. a field holding pointers to other FieldContainers, false otherwise. */ bool OSBCommonElement::readFieldContent( const std::string &fieldName, const std::string &fieldTypeName, const UInt32 fieldSize, const std::string &excludeFields, PtrFieldListIt &ptrFieldIt ) { OSG_OSB_LOG(("OSBCommonElement::readFieldContent: [%s] [%s] [%u]\n", fieldName.c_str(), fieldTypeName.c_str(), fieldSize)); BinaryReadHandler *rh = editRoot()->getReadHandler(); bool isPtrField = false; FieldDescriptionBase *fieldDesc = getContainer()->getFieldDescription(fieldName.c_str()); if((!excludeFields.empty() ) && (excludeFields.find("'" + fieldName + "'") != std::string::npos) ) { OSG_OSB_LOG(("OSBCommonElement::readFieldContent: " "Skipping excluded field [%s] [%s]\n", fieldName.c_str(), fieldTypeName.c_str())); rh->skip(fieldSize); return false; } if(fieldDesc == 0) { DynFieldContainerInterface *pIf = dynamic_cast<DynFieldContainerInterface *>(getContainer()); if(pIf != NULL) { pIf->addField(fieldTypeName.c_str(), fieldName.c_str()); fieldDesc = getContainer()->getFieldDescription(fieldName.c_str()); } } if(fieldDesc == 0) { FWARNING(("OSBCommonElement::readFieldContent: " "Skipping unknown field [%s] [%s].\n", fieldName.c_str(), fieldTypeName.c_str())); rh->skip(fieldSize); return false; } const FieldType &fieldType = fieldDesc->getFieldType(); UInt32 fieldId = fieldDesc->getFieldId (); BitVector fieldMask = fieldDesc->getFieldMask(); if(fieldType.getContentType().isDerivedFrom( FieldTraits<FieldContainer *>::getMapType()) == true) { ptrFieldIt = readAttachmentMapField(fieldId, fieldSize); isPtrField = true; } else if(fieldType.getContentType().isDerivedFrom( FieldTraits<FieldContainer *>::getType()) == true) { if(fieldType.getClass() == FieldType::ParentPtrField) { rh->skip(fieldSize); isPtrField = false; } else { if(fieldType.getCardinality() == FieldType::SingleField) { ptrFieldIt = readPtrSingleField(fieldId); isPtrField = true; } else if(fieldType.getCardinality() == FieldType::MultiField) { ptrFieldIt = readPtrMultiField(fieldId, fieldSize); isPtrField = true; } } } else { getContainer()->copyFromBin(*rh, fieldMask); isPtrField = false; } return isPtrField; }