/*! Reads a MFFieldContainerPtr (or a more specific pointer type) from the stream. It has the given \a fieldId in the container it belongs to. \param[in] fieldId Id of the field in the container it belongs to. \param[in] fieldSize field size \return Iterator that points to the PtrFieldInfo structure that was created for this field. */ OSBCommonElement::PtrFieldListIt OSBCommonElement::readPtrMultiField( const UInt32 fieldId, const UInt32 fieldSize) { OSG_OSB_LOG(("OSBCommonElement::readPtrMultiField: " "fieldId: [%u]\n", fieldId)); UInt32 ptrId; UInt32 numElements; OSBRootElement *root = editRoot(); BinaryReadHandler *rh = editRoot()->getReadHandler(); root->editPtrFieldList().push_back(PtrFieldInfo(getContainer(), fieldId)); PtrFieldInfo &pfi = root->editPtrFieldList().back(); rh->getValue(numElements); OSG_OSB_LOG(("OSBCommonElement::readPtrMultiField: ptrIds [")); for(UInt32 i = 0; i < numElements; ++i) { rh->getValue(ptrId); pfi.editIdStore().push_back(ptrId); OSG_OSB_PLOG(("%u ", ptrId)); } OSG_OSB_PLOG(("]\n")); return --(root->editPtrFieldList().end()); }
/*! Reads a SFFieldContainerPtr (or a more specific pointer type) from the stream. It has the given \a fieldId in the container it belongs to. \param[in] fieldId Id of the field in the container it belongs to. \return Iterator that points to the PtrFieldInfo structure that was created for this field. */ OSBCommonElement::PtrFieldListIt OSBCommonElement::readPtrSingleField(const UInt32 fieldId) { OSG_OSB_LOG(("OSBCommonElement::readPtrSingleField: " "fieldId: [%u]\n", fieldId)); OSBRootElement *root = editRoot(); UInt32 ptrId; root->getReadHandler()->getValue(ptrId); OSG_OSB_LOG(("OSBCommonElement::readPtrSingleField: ptrId [%u]\n", ptrId)); root->editPtrFieldList().push_back(PtrFieldInfo(getContainer(), fieldId)); root->editPtrFieldList().back().editIdStore().push_back(ptrId); return --(root->editPtrFieldList().end()); }
void OSBGeometryElement::postReadV100(void) { OSG_OSB_LOG(("OSBGeometryElement::postReadV100\n")); OSBRootElement *root = editRoot(); Geometry *geo = dynamic_cast<Geometry*>(getContainer()); UInt32 indexMappingSize = UInt32(_indexMapping.size()); if(indexMappingSize <= 1) { OSG_OSB_LOG(("OSBGeometryElement::postReadV100: " "Converting single index.\n" )); if(_indicesPacked) { OSG_OSB_LOG(("OSBGeometryElement::postReadV100: " "Converting packed indices.\n" )); geo->setIndices(_indices); } else { OSG_OSB_LOG(("OSBGeometryElement::postReadV100: " "Converting non-packed indices.\n" )); // indices stored in container with id _indicesId // create PtrFieldInfo structure to set all entries of field // "propIndices" to the container with id _indicesId FieldDescriptionBase *indFieldDesc = geo->getFieldDescription("propIndices"); UInt32 indFieldId = indFieldDesc->getFieldId(); root->editPtrFieldList().push_back(PtrFieldInfo(geo, indFieldId)); PtrFieldInfo &indFieldPFI = root->editPtrFieldList().back(); for(UInt32 i = 0; i < Geometry::MaxAttribs; ++i) { indFieldPFI.editIdStore().push_back(_indicesId); } } } else { OSG_OSB_LOG(("OSBGeometryElement::postReadV100: " "Converting multi index.\n" )); OSBGeometryHelper gh; if(_indicesPacked) { OSG_OSB_LOG(("OSBGeometryElement::postReadV100: " "Converting packed indices.\n" )); // create 16 bit or 32 bit indices if(_indices16Bit) { GeoUInt16Property *ui16Indices = dynamic_pointer_cast<GeoUInt16Property>(_indices); gh.splitMultiIndex<GeoUInt16Property *>( _indexMapping, ui16Indices, geo); } else { GeoUInt32Property *ui32Indices = dynamic_pointer_cast<GeoUInt32Property>(_indices); gh.splitMultiIndex<GeoUInt32Property *>( _indexMapping, ui32Indices, geo); } } else { OSG_OSB_LOG(("OSBGeometryElement::postReadV100: " "Converting non-packed indices.\n" )); FieldContainerIdMapConstIt mapIt = root->getIdMap().find(_indicesId); if(mapIt != root->getIdMap().end()) { _indices = dynamic_cast<GeoIntegralProperty *>( FieldContainerFactory::the()->getContainer(mapIt->second)); } else { FWARNING(("OSBGeometryElement::postReadV100: " "Could not find indices property.\n")); return; } if(_indices->getFormatSize() == sizeof(UInt16)) { GeoUInt16Property *ui16Indices = dynamic_pointer_cast<GeoUInt16Property>(_indices); gh.splitMultiIndex<GeoUInt16Property *>( _indexMapping, ui16Indices, geo); } else if(_indices->getFormatSize() == sizeof(UInt32)) { GeoUInt32Property *ui32Indices = dynamic_pointer_cast<GeoUInt32Property>(_indices); gh.splitMultiIndex<GeoUInt32Property *>( _indexMapping, ui32Indices, geo); } } } }
void OSBGeometryElement::readV100(void) { OSG_OSB_LOG(("OSBGeometryElement::readV100:\n")); OSBRootElement *root = editRoot(); BinaryReadHandler *rh = editRoot()->getReadHandler(); OSBGeometryHelper gh; GeometryUnrecPtr geo = Geometry::create(); setContainer(geo); // The "properties" mfield can be thought of the unification of the // "positions", "normals", etc sfields of the 1.x Geometry. // For the conversion the PtrFieldInfo structure for the "properties" // mfield is filled with the corresponding ids of the sfields from the // file. The remapping after postRead will fill in the right pointers. FieldDescriptionBase *propFieldDesc = geo->getFieldDescription("properties"); UInt32 propFieldId = propFieldDesc->getFieldId(); root->editPtrFieldList().push_back(PtrFieldInfo(geo, propFieldId)); PtrFieldInfo &propFieldPFI = root->editPtrFieldList().back(); propFieldPFI.editIdStore().resize(Geometry::MaxAttribs); while(true) { std::string fieldName; std::string fieldTypeName; UInt32 fieldSize; PtrFieldListIt ptrFieldIt; if(!readFieldHeader("", fieldName, fieldTypeName, fieldSize)) { OSG_OSB_LOG(("OSBGeometryElement::readV100: " "Reading stopped at field: [%s].\n", fieldName.c_str())); break; } if(fieldName == "indexMapping") { // read into temporary field MField<UInt16> indexMappingField; indexMappingField.copyFromBin(*rh); // copy to member for use in postRead indexMappingField.getValues().swap(_indexMapping); } else if(fieldName == "indices") { // read container id of indices property // postRead will handle the conversion of multi indices rh->getValue(_indicesId); } else if(fieldName == "positions") { UInt32 positionsId; rh->getValue(positionsId); propFieldPFI.editIdStore()[Geometry::PositionsIndex] = positionsId; } else if(fieldName == "normals") { UInt32 normalsId; rh->getValue(normalsId); propFieldPFI.editIdStore()[Geometry::NormalsIndex] = normalsId; } else if(fieldName == "colors") { UInt32 colorsId; rh->getValue(colorsId); propFieldPFI.editIdStore()[Geometry::ColorsIndex] = colorsId; } else if(fieldName == "secondaryColors") { UInt32 secondaryColorsId; rh->getValue(secondaryColorsId); propFieldPFI.editIdStore()[Geometry::SecondaryColorsIndex] = secondaryColorsId; } else if(fieldName == "texCoords") { UInt32 texCoordsId; rh->getValue(texCoordsId); propFieldPFI.editIdStore()[Geometry::TexCoordsIndex] = texCoordsId; } else if(fieldName == "texCoords1") { UInt32 texCoordsId1; rh->getValue(texCoordsId1); propFieldPFI.editIdStore()[Geometry::TexCoords1Index] = texCoordsId1; } else if(fieldName == "texCoords2") { UInt32 texCoordsId2; rh->getValue(texCoordsId2); propFieldPFI.editIdStore()[Geometry::TexCoords2Index] = texCoordsId2; } else if(fieldName == "texCoords3") { UInt32 texCoordsId3; rh->getValue(texCoordsId3); propFieldPFI.editIdStore()[Geometry::TexCoords3Index] = texCoordsId3; } else if(fieldName == "texCoords4") { UInt32 texCoordsId4; rh->getValue(texCoordsId4); propFieldPFI.editIdStore()[Geometry::TexCoords4Index] = texCoordsId4; } else if(fieldName == "texCoords5") { UInt32 texCoordsId5; rh->getValue(texCoordsId5); propFieldPFI.editIdStore()[Geometry::TexCoords5Index] = texCoordsId5; } else if(fieldName == "texCoords6") { UInt32 texCoordsId6; rh->getValue(texCoordsId6); propFieldPFI.editIdStore()[Geometry::TexCoords6Index] = texCoordsId6; } else if(fieldName == "texCoords7") { UInt32 texCoordsId7; rh->getValue(texCoordsId7); propFieldPFI.editIdStore()[Geometry::TexCoords7Index] = texCoordsId7; } else if(fieldName == "pindices") { UInt32 maxValue; UInt32 propSize; UInt32 byteSize; _indicesPacked = true; gh.readPackedIntegralPropertyHeader(rh, maxValue, propSize, byteSize); if(root->getOptions().unpack16BitIndices()) { if(maxValue > TypeTraits<UInt16>::getMax()) { GeoUInt32PropertyUnrecPtr ui32Indices = GeoUInt32Property::create(); gh.readPackedIntegralProperty(rh, ui32Indices, maxValue, propSize, byteSize ); _indices16Bit = false; _indices = ui32Indices; } else { GeoUInt16PropertyUnrecPtr ui16Indices = GeoUInt16Property::create(); gh.readPackedIntegralProperty(rh, ui16Indices, maxValue, propSize, byteSize ); _indices16Bit = true; _indices = ui16Indices; } } else { GeoUInt32PropertyUnrecPtr ui32Indices = GeoUInt32Property::create(); gh.readPackedIntegralProperty(rh, ui32Indices, maxValue, propSize, byteSize ); _indices16Bit = false; _indices = ui32Indices; } } else if(fieldName == "qpositions") { // Quantized positions are stored inside the geometry object, not // in the geo-property. They are always of type Pnt3f. GeoPnt3fPropertyUnrecPtr propPos = GeoPnt3fProperty::create(); UInt8 resolution; Real32 minValue; Real32 maxValue; UInt32 propSize; gh.readQuantizedVectorPropertyHeader(rh, resolution, minValue, maxValue, propSize ); gh.readQuantizedVectorProperty(rh, propPos, fieldSize, resolution, minValue, maxValue, propSize ); geo->setProperty(propPos, Geometry::PositionsIndex); } else if(fieldName == "qnormals") { // Quantized normals are stored inside the geometry object, not // in the geo-property. They are always of type Vec3f. GeoVec3fPropertyUnrecPtr propNorm = GeoVec3fProperty::create(); UInt8 resolution; Real32 minValue; Real32 maxValue; UInt32 propSize; gh.readQuantizedVectorPropertyHeader( rh, resolution, minValue, maxValue, propSize); gh.readQuantizedVectorProperty( rh, propNorm, fieldSize, resolution, minValue, maxValue, propSize ); geo->setProperty(propNorm, Geometry::NormalsIndex); } else if(fieldName == "qtexCoords") { // Quantized texCoords are stored inside the geometry object, not // in the geo-property. They are always of type Vec2f. GeoVec2fPropertyUnrecPtr propTexCoords = GeoVec2fProperty::create(); UInt8 resolution; Real32 minValue; Real32 maxValue; UInt32 propSize; gh.readQuantizedVectorPropertyHeader( rh, resolution, minValue, maxValue, propSize); gh.readQuantizedVectorProperty( rh, propTexCoords, fieldSize, resolution, minValue, maxValue, propSize ); geo->setProperty(propTexCoords, Geometry::NormalsIndex); } else { // 1.x Geometry has _sfVbo, it can be skipped readFieldContent(fieldName, fieldTypeName, fieldSize, "'vbo'", ptrFieldIt ); } } }
/*! Reads a SFFieldContainerAttachmentPtrMap from the stream. It has the given \a fieldId in the container it belongs to and size \a fieldSize. \param[in] fieldId Id of the field in the container it belongs to. \param[in] fieldSize Size in byte of the field. \return Iterator that points to the PtrFieldInfo structure that was created for this field. */ OSBCommonElement::PtrFieldListIt OSBCommonElement::readAttachmentMapField( const UInt32 fieldId, const UInt32 fieldSize) { OSG_OSB_LOG(("OSBCommonElement::readAttachmentMapField: " "fieldId: [%u]\n", fieldId)); bool hasBindingInfo = false; UInt32 ptrId; UInt32 numElements; OSBRootElement *root = editRoot(); BinaryReadHandler *rh = editRoot()->getReadHandler(); root->editPtrFieldList().push_back(PtrFieldInfo(getContainer(), fieldId)); PtrFieldInfo &pfi = root->editPtrFieldList().back(); rh->getValue(numElements); // keep these ordered from highest to lowest version if(root->getHeaderVersion() >= OSGOSBHeaderVersion200) { if(root->getHeaderVersion() > OSGOSBHeaderVersion200) { FINFO(("OSBCommonElement::readAttachmentMapField: " "Unknown header version, trying to read as latest.\n")); } hasBindingInfo = true; } else if(root->getHeaderVersion() >= OSGOSBHeaderVersion100) { // distinguish format with or without binding info if(fieldSize == (sizeof(UInt32) + numElements * sizeof(UInt32))) { hasBindingInfo = false; } else { hasBindingInfo = true; } } if(hasBindingInfo == true) { OSG_OSB_LOG(("OSBCommonElement::readAttachmentMapField: " "reading [%u] attachments with binding info.\n", numElements)); EditMapFieldHandlePtr sfMapField = boost::dynamic_pointer_cast<EditMapFieldHandle>( getContainer()->editField(fieldId)); if(sfMapField == NULL || sfMapField->isValid() == false) return --(root->editPtrFieldList().end()); pfi.setHandledField(sfMapField->loadFromBin(rh, numElements, hasBindingInfo, pfi.editBindingStore(), pfi.editIdStore ())); #if 0 for(UInt32 i = 0; i < numElements; ++i) { rh->getValue(binding); rh->getValue(ptrId ); OSG_OSB_LOG(("OSBCommonElement::readAttachmentMapField: " "attachment [%u], binding [%u], id [%u].\n", i, binding, ptrId)); pfi.editBindingStore().push_back(binding); pfi.editIdStore ().push_back(ptrId ); } #endif } else { OSG_OSB_LOG(("OSBCommonElement::readAttachmentMapField: " "reading [%u] attachments without binding info.\n", numElements)); for(UInt32 i = 0; i < numElements; ++i) { rh->getValue(ptrId); OSG_OSB_LOG(("OSBCommonElement::readAttachmentMapField: " "attachment [%u], id [%u].\n", i, ptrId)); pfi.editBindingStore().push_back(0 ); pfi.editIdStore ().push_back(ptrId); } } return --(root->editPtrFieldList().end()); }