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