Model.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440
  1. //
  2. // Urho3D Engine
  3. // Copyright (c) 2008-2011 Lasse Öörni
  4. //
  5. // Permission is hereby granted, free of charge, to any person obtaining a copy
  6. // of this software and associated documentation files (the "Software"), to deal
  7. // in the Software without restriction, including without limitation the rights
  8. // to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
  9. // copies of the Software, and to permit persons to whom the Software is
  10. // furnished to do so, subject to the following conditions:
  11. //
  12. // The above copyright notice and this permission notice shall be included in
  13. // all copies or substantial portions of the Software.
  14. //
  15. // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
  16. // IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
  17. // FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
  18. // AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
  19. // LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
  20. // OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
  21. // THE SOFTWARE.
  22. //
  23. #include "Precompiled.h"
  24. #include "Deserializer.h"
  25. #include "Geometry.h"
  26. #include "IndexBuffer.h"
  27. #include "Log.h"
  28. #include "Model.h"
  29. #include "Profiler.h"
  30. #include "Renderer.h"
  31. #include "Serializer.h"
  32. #include "VertexBuffer.h"
  33. #include <cstring>
  34. #include "DebugNew.h"
  35. unsigned storeOrLookupVertexBuffer(VertexBuffer* buffer, std::vector<VertexBuffer*>& dest)
  36. {
  37. for (unsigned i = 0; i < dest.size(); ++i)
  38. {
  39. if (dest[i] == buffer)
  40. return i;
  41. }
  42. dest.push_back(buffer);
  43. return dest.size() - 1;
  44. }
  45. unsigned storeOrLookupIndexBuffer(IndexBuffer* buffer, std::vector<IndexBuffer*>& dest)
  46. {
  47. for (unsigned i = 0; i < dest.size(); ++i)
  48. {
  49. if (dest[i] == buffer)
  50. return i;
  51. }
  52. dest.push_back(buffer);
  53. return dest.size() - 1;
  54. }
  55. Model::Model(Renderer* renderer, const std::string& name) :
  56. Resource(name),
  57. mRenderer(renderer),
  58. mCollisionLodLevel(M_MAX_UNSIGNED),
  59. mRaycastLodLevel(M_MAX_UNSIGNED),
  60. mOcclusionLodLevel(M_MAX_UNSIGNED)
  61. {
  62. }
  63. Model::~Model()
  64. {
  65. }
  66. void Model::load(Deserializer& source, ResourceCache* cache)
  67. {
  68. PROFILE(Model_Load);
  69. // Check ID
  70. if (source.readID() != "UMDL")
  71. EXCEPTION(source.getName() + " is not a valid model file");
  72. mGeometries.clear();
  73. mGeometryBoneMappings.clear();
  74. mMorphs.clear();
  75. mVertexBuffers.clear();
  76. mIndexBuffers.clear();
  77. setMemoryUse(source.getSize());
  78. // Read vertex buffers
  79. unsigned numVertexBuffers = source.readUInt();
  80. for (unsigned i = 0; i < numVertexBuffers; ++i)
  81. {
  82. unsigned vertexCount = source.readUInt();
  83. unsigned elementMask = source.readUInt();
  84. unsigned morphStart = source.readUInt();
  85. unsigned morphCount = source.readUInt();
  86. SharedPtr<VertexBuffer> buffer(new VertexBuffer(mRenderer, false));
  87. buffer->setSize(vertexCount, elementMask);
  88. buffer->setMorphRange(morphStart, morphCount);
  89. unsigned vertexSize = buffer->getVertexSize();
  90. SharedArrayPtr<unsigned char> data(new unsigned char[vertexCount * vertexSize]);
  91. source.read(data.getPtr(), vertexCount * buffer->getVertexSize());
  92. buffer->setData(data.getPtr());
  93. // If there is a morph range, make a copy of the data so that the morph range can be reset
  94. if (morphCount)
  95. {
  96. SharedArrayPtr<unsigned char> morphResetData(new unsigned char[morphCount * vertexSize]);
  97. memcpy(morphResetData.getPtr(), &data[morphStart * vertexSize], morphCount * vertexSize);
  98. buffer->setMorphRangeResetData(morphResetData);
  99. }
  100. mVertexBuffers.push_back(buffer);
  101. }
  102. // Read index buffers
  103. unsigned numIndexBuffers = source.readUInt();
  104. for (unsigned i = 0; i < numIndexBuffers; ++i)
  105. {
  106. unsigned indexCount = source.readUInt();
  107. unsigned indexSize = source.readUInt();
  108. SharedPtr<IndexBuffer> buffer(new IndexBuffer(mRenderer, false));
  109. buffer->setSize(indexCount, indexSize);
  110. SharedArrayPtr<unsigned char> data(new unsigned char[indexCount * indexSize]);
  111. source.read(data.getPtr(), indexCount * indexSize);
  112. buffer->setData(data.getPtr());
  113. mIndexBuffers.push_back(buffer);
  114. }
  115. // Read geometries
  116. unsigned numGeometries = source.readUInt();
  117. for (unsigned i = 0; i < numGeometries; ++i)
  118. {
  119. // Read bone mappings
  120. unsigned boneMappingCount = source.readUInt();
  121. std::vector<unsigned> boneMapping;
  122. for (unsigned j = 0; j < boneMappingCount; ++j)
  123. boneMapping.push_back(source.readUInt());
  124. mGeometryBoneMappings.push_back(boneMapping);
  125. unsigned numLodLevels = source.readUInt();
  126. std::vector<SharedPtr<Geometry> > geometryLodLevels;
  127. for (unsigned j = 0; j < numLodLevels; ++j)
  128. {
  129. float distance = source.readFloat();
  130. PrimitiveType type = (PrimitiveType)source.readUInt();
  131. unsigned vertexBufferRef = source.readUInt();
  132. unsigned indexBufferRef = source.readUInt();
  133. unsigned indexStart = source.readUInt();
  134. unsigned indexCount = source.readUInt();
  135. if (vertexBufferRef >= mVertexBuffers.size())
  136. EXCEPTION("Illegal vertex buffer index");
  137. if (indexBufferRef >= mIndexBuffers.size())
  138. EXCEPTION("Illegal index buffer index");
  139. SharedPtr<Geometry> geometry(new Geometry());
  140. geometry->setNumVertexBuffers(1);
  141. geometry->setVertexBuffer(0, mVertexBuffers[vertexBufferRef]);
  142. geometry->setIndexBuffer(mIndexBuffers[indexBufferRef]);
  143. geometry->setDrawRange(type, indexStart, indexCount);
  144. geometry->setLodDistance(distance);
  145. geometryLodLevels.push_back(geometry);
  146. }
  147. mGeometries.push_back(geometryLodLevels);
  148. }
  149. // Read morphs
  150. unsigned numMorphs = source.readUInt();
  151. for (unsigned i = 0; i < numMorphs; ++i)
  152. {
  153. ModelMorph newMorph;
  154. newMorph.mName = source.readString();
  155. newMorph.mNameHash = StringHash(newMorph.mName);
  156. newMorph.mWeight = 0.0f;
  157. unsigned numBuffers = source.readUInt();
  158. for (unsigned j = 0; j < numBuffers; ++j)
  159. {
  160. VertexBufferMorph newBuffer;
  161. unsigned bufferIndex = source.readUInt();
  162. newBuffer.mElementMask = source.readUInt();
  163. newBuffer.mVertexCount = source.readUInt();
  164. // Base size: size of each vertex index
  165. unsigned vertexSize = sizeof(unsigned);
  166. // Add size of individual elements
  167. if (newBuffer.mElementMask & MASK_POSITION)
  168. vertexSize += sizeof(Vector3);
  169. if (newBuffer.mElementMask & MASK_NORMAL)
  170. vertexSize += sizeof(Vector3);
  171. if (newBuffer.mElementMask & MASK_TANGENT)
  172. vertexSize += sizeof(Vector3);
  173. newBuffer.mMorphData = new unsigned char[newBuffer.mVertexCount * vertexSize];
  174. source.read(&newBuffer.mMorphData[0], newBuffer.mVertexCount * vertexSize);
  175. newMorph.mBuffers[bufferIndex] = newBuffer;
  176. }
  177. mMorphs.push_back(newMorph);
  178. }
  179. // Read skeleton
  180. mSkeleton.load(source);
  181. // Read bounding box
  182. mBoundingBox = source.readBoundingBox();
  183. // Read collision/raycast/occlusion LOD levels
  184. mCollisionLodLevel = source.readUInt();
  185. mRaycastLodLevel = source.readUInt();
  186. mOcclusionLodLevel = source.readUInt();
  187. }
  188. void Model::save(Serializer& dest)
  189. {
  190. // Build lists of vertex and index buffers used by the geometries
  191. std::vector<VertexBuffer*> vertexBuffers;
  192. std::vector<IndexBuffer*> indexBuffers;
  193. for (unsigned i = 0; i < mGeometries.size(); ++i)
  194. {
  195. for (unsigned j = 0; j < mGeometries[i].size(); ++j)
  196. {
  197. storeOrLookupVertexBuffer(mGeometries[i][j]->getVertexBuffer(0), vertexBuffers);
  198. storeOrLookupIndexBuffer(mGeometries[i][j]->getIndexBuffer(), indexBuffers);
  199. }
  200. }
  201. // Write ID
  202. dest.writeID("UMDL");
  203. // Write vertex buffers
  204. dest.writeUInt(vertexBuffers.size());
  205. for (unsigned i = 0; i < vertexBuffers.size(); ++i)
  206. {
  207. VertexBuffer* buffer = vertexBuffers[i];
  208. dest.writeUInt(buffer->getVertexCount());
  209. dest.writeUInt(buffer->getElementMask());
  210. dest.writeUInt(buffer->getMorphRangeStart());
  211. dest.writeUInt(buffer->getMorphRangeCount());
  212. void* data = buffer->lock(0, buffer->getVertexCount(), LOCK_READONLY);
  213. dest.write(data, buffer->getVertexCount() * buffer->getVertexSize());
  214. buffer->unlock();
  215. }
  216. // Write index buffers
  217. dest.writeUInt(indexBuffers.size());
  218. for (unsigned i = 0; i < indexBuffers.size(); ++i)
  219. {
  220. IndexBuffer* buffer = indexBuffers[i];
  221. dest.writeUInt(buffer->getIndexCount());
  222. dest.writeUInt(buffer->getIndexSize());
  223. void* data = buffer->lock(0, buffer->getIndexCount(), LOCK_READONLY);
  224. dest.write(data, buffer->getIndexCount() * buffer->getIndexSize());
  225. buffer->unlock();
  226. }
  227. // Write geometries
  228. dest.writeUInt(mGeometries.size());
  229. for (unsigned i = 0; i < mGeometries.size(); ++i)
  230. {
  231. // Write bone mappings
  232. dest.writeUInt(mGeometryBoneMappings[i].size());
  233. for (unsigned j = 0; j < mGeometryBoneMappings[i].size(); ++j)
  234. dest.writeUInt(mGeometryBoneMappings[i][j]);;
  235. // Write the LOD levels
  236. dest.writeUInt(mGeometries[i].size());
  237. for (unsigned j = 0; j < mGeometries[i].size(); ++j)
  238. {
  239. Geometry* geometry = mGeometries[i][j];
  240. dest.writeFloat(geometry->getLodDistance());
  241. dest.writeUInt(geometry->getPrimitiveType());
  242. dest.writeUInt(storeOrLookupVertexBuffer(geometry->getVertexBuffer(0), vertexBuffers));
  243. dest.writeUInt(storeOrLookupIndexBuffer(geometry->getIndexBuffer(), indexBuffers));
  244. dest.writeUInt(geometry->getIndexStart());
  245. dest.writeUInt(geometry->getIndexCount());
  246. }
  247. }
  248. // Write morphs
  249. dest.writeUInt(mMorphs.size());
  250. for (unsigned i = 0; i < mMorphs.size(); ++i)
  251. {
  252. dest.writeString(mMorphs[i].mName);
  253. dest.writeUInt(mMorphs[i].mBuffers.size());
  254. // Write morph vertex buffers
  255. for (std::map<unsigned int, VertexBufferMorph>::const_iterator j = mMorphs[i].mBuffers.begin();
  256. j != mMorphs[i].mBuffers.end(); ++j)
  257. {
  258. dest.writeUInt(j->first);
  259. dest.writeUInt(j->second.mElementMask);
  260. dest.writeUInt(j->second.mVertexCount);
  261. // Base size: size of each vertex index
  262. unsigned vertexSize = sizeof(unsigned);
  263. // Add size of individual elements
  264. if (j->second.mElementMask & MASK_POSITION)
  265. vertexSize += sizeof(Vector3);
  266. if (j->second.mElementMask & MASK_NORMAL)
  267. vertexSize += sizeof(Vector3);
  268. if (j->second.mElementMask & MASK_TANGENT)
  269. vertexSize += sizeof(Vector3);
  270. dest.write(j->second.mMorphData.getPtr(), vertexSize * j->second.mVertexCount);
  271. }
  272. }
  273. // Write skeleton
  274. mSkeleton.save(dest);
  275. // Write bounding box
  276. dest.writeBoundingBox(mBoundingBox);
  277. // Write collision/raycast/occlusion LOD levels
  278. dest.writeUInt(mCollisionLodLevel);
  279. dest.writeUInt(mRaycastLodLevel);
  280. dest.writeUInt(mOcclusionLodLevel);
  281. }
  282. void Model::setBoundingBox(const BoundingBox& box)
  283. {
  284. mBoundingBox = box;
  285. }
  286. void Model::setNumGeometries(unsigned num)
  287. {
  288. mGeometries.resize(num);
  289. mGeometryBoneMappings.resize(num);
  290. }
  291. bool Model::setNumGeometryLodLevels(unsigned index, unsigned num)
  292. {
  293. if (index >= mGeometries.size())
  294. {
  295. LOGERROR("Illegal geometry index");
  296. return false;
  297. }
  298. if (!num)
  299. {
  300. LOGERROR("Zero LOD levels not allowed");
  301. return false;
  302. }
  303. mGeometries[index].resize(num);
  304. return true;
  305. }
  306. bool Model::setGeometry(unsigned index, unsigned lodLevel, Geometry* geometry)
  307. {
  308. if (index >= mGeometries.size())
  309. {
  310. LOGERROR("Illegal geometry index");
  311. return false;
  312. }
  313. if (lodLevel >= mGeometries[index].size())
  314. {
  315. LOGERROR("Illegal LOD level index");
  316. return false;
  317. }
  318. mGeometries[index][lodLevel] = geometry;
  319. return true;
  320. }
  321. void Model::setSkeleton(const Skeleton& skeleton)
  322. {
  323. mSkeleton.define(skeleton.getBones());
  324. }
  325. void Model::setGeometryBoneMappings(const std::vector<std::vector<unsigned> >& geometryBoneMappings)
  326. {
  327. mGeometryBoneMappings = geometryBoneMappings;
  328. }
  329. void Model::setMorphs(const std::vector<ModelMorph>& morphs)
  330. {
  331. mMorphs = morphs;
  332. }
  333. void Model::setCollisionLodLevel(unsigned lodLevel)
  334. {
  335. mCollisionLodLevel = lodLevel;
  336. }
  337. void Model::setRaycastLodLevel(unsigned lodLevel)
  338. {
  339. mRaycastLodLevel = lodLevel;
  340. }
  341. void Model::setOcclusionLodLevel(unsigned lodLevel)
  342. {
  343. mOcclusionLodLevel = lodLevel;
  344. }
  345. unsigned Model::getNumGeometryLodLevels(unsigned index) const
  346. {
  347. return index < mGeometries.size() ? mGeometries[index].size() : 0;
  348. }
  349. Geometry* Model::getGeometry(unsigned index, unsigned lodLevel) const
  350. {
  351. if ((index >= mGeometries.size()) || (lodLevel >= mGeometries[index].size()))
  352. return 0;
  353. return mGeometries[index][lodLevel];
  354. }
  355. const ModelMorph* Model::getMorph(unsigned index) const
  356. {
  357. return index < mMorphs.size() ? &mMorphs[index] : 0;
  358. }
  359. const ModelMorph* Model::getMorph(const std::string& name) const
  360. {
  361. return getMorph(StringHash(name));
  362. }
  363. const ModelMorph* Model::getMorph(StringHash nameHash) const
  364. {
  365. for (std::vector<ModelMorph>::const_iterator i = mMorphs.begin(); i != mMorphs.end(); ++i)
  366. {
  367. if (i->mNameHash == nameHash)
  368. return &(*i);
  369. }
  370. return 0;
  371. }