1 /* 2 Copyright (c) 2009 NetAllied Systems GmbH 3 4 This file is part of dae23ds. 5 6 Licensed under the MIT Open Source License, 7 for details please see LICENSE file or the website 8 http://www.opensource.org/licenses/mit-license.php 9 */ 10 11 #include "DAE23dsStableHeaders.h" 12 #include "DAE23dsBaseWriter.h" 13 14 #include "DAE23dsWriter.h" 15 #include "DAE23dsChunkIDs.h" 16 17 18 namespace DAE23ds 19 { 20 21 static const size_t MAX_NODE_NAME_LENGTH = 10; 22 getNodeNameLength(const COLLADAFW::Node * node)23 ChunkLength getNodeNameLength( const COLLADAFW::Node* node ) 24 { 25 return (ChunkLength)(min(node->getName().length(), MAX_NODE_NAME_LENGTH) + 1); 26 } 27 28 //------------------------------ BaseWriter(Writer * writer3ds)29 BaseWriter::BaseWriter( Writer* writer3ds ) 30 : mWriter(writer3ds) 31 { 32 } 33 34 //------------------------------ ~BaseWriter()35 BaseWriter::~BaseWriter() 36 { 37 } 38 39 //------------------------------ reportError(const String & method,const String & message,Writer::Severity severity)40 void BaseWriter::reportError( const String& method, const String& message, Writer::Severity severity ) 41 { 42 Writer::reportError(method, message, severity); 43 } 44 45 //------------------------------ getGeometryUniqueIdInstanceGeometryInfoMap()46 const Writer::GeometryUniqueIdInstanceGeometryInfoMap& BaseWriter::getGeometryUniqueIdInstanceGeometryInfoMap() 47 { 48 return mWriter->getGeometryUniqueIdInstanceGeometryInfoMap(); 49 } 50 51 //------------------------------ addInstanceGeometryInstanceGeometryInfoPair(const COLLADAFW::UniqueId & geoId,const Writer::InstanceGeometryInfo & instanceGeoInfo)52 void BaseWriter::addInstanceGeometryInstanceGeometryInfoPair( const COLLADAFW::UniqueId& geoId, const Writer::InstanceGeometryInfo& instanceGeoInfo ) 53 { 54 if ( !getApplyTransformationsToMeshes() ) 55 { 56 // if we apply transformations to meshes, we need each instance as often as it occurs 57 Writer::InstanceGeometryInfoSet& set = mWriter->getInstanceGeometryInfoSet(); 58 if ( set.count(instanceGeoInfo) != 0 ) 59 { 60 return; 61 } 62 else 63 { 64 set.insert( instanceGeoInfo ); 65 } 66 } 67 68 Writer::GeometryUniqueIdInstanceGeometryInfoMap& map = mWriter->getGeometryUniqueIdInstanceGeometryInfoMap(); 69 map.insert(std::make_pair(geoId, instanceGeoInfo)); 70 } 71 72 //------------------------------ addInstanceGeometryObjectId(const Writer::InstanceGeometryIdentifier & instanceGeometryIdentifier,const Writer::ObjectId & objectId)73 void BaseWriter::addInstanceGeometryObjectId( const Writer::InstanceGeometryIdentifier& instanceGeometryIdentifier, const Writer::ObjectId& objectId ) 74 { 75 mWriter->getInstanceGeometryObjectIdMap()[instanceGeometryIdentifier].push_back( objectId ); 76 } 77 78 //------------------------------ getInstanceGeometryObjectIds(const Writer::InstanceGeometryIdentifier & instanceGeometryIdentifier)79 const Writer::ObjectIdList& BaseWriter::getInstanceGeometryObjectIds( const Writer::InstanceGeometryIdentifier& instanceGeometryIdentifier ) 80 { 81 return mWriter->getInstanceGeometryObjectIdMap()[instanceGeometryIdentifier]; 82 } 83 84 //------------------------------ getFWMaterialByUniqueId(const COLLADAFW::UniqueId & materialUniqueId)85 const COLLADAFW::Material* BaseWriter::getFWMaterialByUniqueId(const COLLADAFW::UniqueId& materialUniqueId) 86 { 87 const Writer::UniqueIdFWMaterialMap& map = mWriter->getUniqueIdFWMaterialMap(); 88 Writer::UniqueIdFWMaterialMap::const_iterator it = map.find(materialUniqueId); 89 if ( it == map.end() ) 90 { 91 return 0; 92 } 93 else 94 { 95 return &it->second; 96 } 97 } 98 99 //------------------------------ getFWEffectByUniqueId(const COLLADAFW::UniqueId & effectUniqueId)100 const COLLADAFW::Effect* BaseWriter::getFWEffectByUniqueId( const COLLADAFW::UniqueId& effectUniqueId ) 101 { 102 const Writer::UniqueIdFWEffectMap& map = mWriter->getUniqueIdFWEffectMap(); 103 Writer::UniqueIdFWEffectMap::const_iterator it = map.find(effectUniqueId); 104 if ( it == map.end() ) 105 { 106 return 0; 107 } 108 else 109 { 110 return &it->second; 111 } 112 } 113 114 //------------------------------ getFileNameByGeometryMaterialBinding(const Writer::GeometryMaterialBinding & binding) const115 const String& BaseWriter::getFileNameByGeometryMaterialBinding( const Writer::GeometryMaterialBinding& binding ) const 116 { 117 const Writer::GeometryMaterialBindingFileNameMap& map = mWriter->getGeometryMaterialBindingFileNameMap(); 118 Writer::GeometryMaterialBindingFileNameMap::const_iterator it = map.find(binding); 119 if ( it == map.end()) 120 { 121 //binding not found 122 return COLLADABU::Utils::EMPTY_STRING; 123 } 124 else 125 { 126 // binding is in map. return the file name 127 return it->second; 128 } 129 130 } 131 132 //------------------------------ addGeometryMaterialBindingFileNamePair(const Writer::GeometryMaterialBinding & binding,const String & fileName)133 void BaseWriter::addGeometryMaterialBindingFileNamePair( const Writer::GeometryMaterialBinding& binding, const String& fileName ) 134 { 135 Writer::GeometryMaterialBindingFileNameMap& map = mWriter->getGeometryMaterialBindingFileNameMap(); 136 map.insert(std::make_pair(binding, fileName)); 137 } 138 139 //------------------------------ getAndIncreaseMeshOccurence(const COLLADAFW::UniqueId & meshUniqueId)140 size_t BaseWriter::getAndIncreaseMeshOccurence( const COLLADAFW::UniqueId& meshUniqueId) 141 { 142 Writer::MeshOccurencesMap& map = mWriter->getMeshOccurencesMap(); 143 Writer::MeshOccurencesMap::iterator it = map.find(meshUniqueId); 144 if ( it == map.end() ) 145 { 146 // mesh has no occurrences. Add to map 147 map.insert(std::make_pair(meshUniqueId, 1)); 148 return 0; 149 } 150 else 151 { 152 size_t oldOcurrence = it->second; 153 it->second++; 154 return oldOcurrence; 155 } 156 157 } 158 159 //------------------------------ addToObjectAndMaterialBlockLength(ChunkLength val)160 void BaseWriter::addToObjectAndMaterialBlockLength( ChunkLength val ) 161 { 162 mWriter->setObjectAndMaterialBlockLength( mWriter->getObjectAndMaterialBlockLength() + val ); 163 } 164 165 //------------------------------ addMeshData(const Writer::MeshData & meshData)166 void BaseWriter::addMeshData( const Writer::MeshData& meshData ) 167 { 168 mWriter->getMeshDataMap().insert( std::make_pair( meshData.meshUniqueId, meshData ) ); 169 } 170 171 //------------------------------ getMeshData(const COLLADAFW::UniqueId & meshUniqueId) const172 const Writer::MeshData& BaseWriter::getMeshData( const COLLADAFW::UniqueId& meshUniqueId ) const 173 { 174 return mWriter->getMeshDataMap()[meshUniqueId]; 175 } 176 177 //------------------------------ getAndIncreaseNextObjectId() const178 Writer::ObjectId BaseWriter::getAndIncreaseNextObjectId() const 179 { 180 Writer::ObjectId nextObjectId = mWriter->getNextObjectId(); 181 mWriter->setNextObjectId( nextObjectId + 1); 182 return nextObjectId; 183 } 184 185 //------------------------------ getAndIncreaseNextMaterialNumber() const186 MaterialNumber BaseWriter::getAndIncreaseNextMaterialNumber() const 187 { 188 MaterialNumber nextMaterialNumber = mWriter->getNextMaterialNumber(); 189 mWriter->setNextMaterialNumber( nextMaterialNumber + 1); 190 return nextMaterialNumber; 191 } 192 193 //------------------------------ addUniqueIdMaterialNumberPair(const COLLADAFW::UniqueId & materialUniqueId,MaterialNumber materialNumber)194 void BaseWriter::addUniqueIdMaterialNumberPair( const COLLADAFW::UniqueId& materialUniqueId, MaterialNumber materialNumber ) 195 { 196 mWriter->getUniqueMaterialNumberMap().insert(std::make_pair(materialUniqueId, materialNumber)); 197 } 198 199 //------------------------------ getMaterialNumberByUniqueId(const COLLADAFW::UniqueId & materialUniqueId)200 DAE23ds::MaterialNumber BaseWriter::getMaterialNumberByUniqueId( const COLLADAFW::UniqueId& materialUniqueId ) 201 { 202 const Writer::UniqueMaterialNumberMap& map = mWriter->getUniqueMaterialNumberMap(); 203 Writer::UniqueMaterialNumberMap::const_iterator it = map.find(materialUniqueId); 204 if ( it == map.end() ) 205 { 206 return 0; 207 } 208 else 209 { 210 return it->second; 211 } 212 } 213 214 } // namespace DAE23ds 215