Model.cpp 14 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436
  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. mGeometries.clear();
  70. mGeometryBoneMappings.clear();
  71. mMorphs.clear();
  72. mVertexBuffers.clear();
  73. mIndexBuffers.clear();
  74. setMemoryUse(source.getSize());
  75. // Read vertex buffers
  76. unsigned numVertexBuffers = source.readUInt();
  77. for (unsigned i = 0; i < numVertexBuffers; ++i)
  78. {
  79. unsigned vertexCount = source.readUInt();
  80. unsigned elementMask = source.readUInt();
  81. unsigned morphStart = source.readUInt();
  82. unsigned morphCount = source.readUInt();
  83. SharedPtr<VertexBuffer> buffer(new VertexBuffer(mRenderer, false));
  84. buffer->setSize(vertexCount, elementMask);
  85. buffer->setMorphRange(morphStart, morphCount);
  86. unsigned vertexSize = buffer->getVertexSize();
  87. SharedArrayPtr<unsigned char> data(new unsigned char[vertexCount * vertexSize]);
  88. source.read(data.getPtr(), vertexCount * buffer->getVertexSize());
  89. buffer->setData(data.getPtr());
  90. // If there is a morph range, make a copy of the data so that the morph range can be reset
  91. if (morphCount)
  92. {
  93. SharedArrayPtr<unsigned char> morphResetData(new unsigned char[morphCount * vertexSize]);
  94. memcpy(morphResetData.getPtr(), &data[morphStart * vertexSize], morphCount * vertexSize);
  95. buffer->setMorphRangeResetData(morphResetData);
  96. }
  97. mVertexBuffers.push_back(buffer);
  98. }
  99. // Read index buffers
  100. unsigned numIndexBuffers = source.readUInt();
  101. for (unsigned i = 0; i < numIndexBuffers; ++i)
  102. {
  103. unsigned indexCount = source.readUInt();
  104. unsigned indexSize = source.readUInt();
  105. SharedPtr<IndexBuffer> buffer(new IndexBuffer(mRenderer, false));
  106. buffer->setSize(indexCount, indexSize);
  107. SharedArrayPtr<unsigned char> data(new unsigned char[indexCount * indexSize]);
  108. source.read(data.getPtr(), indexCount * indexSize);
  109. buffer->setData(data.getPtr());
  110. mIndexBuffers.push_back(buffer);
  111. }
  112. // Read geometries
  113. unsigned numGeometries = source.readUInt();
  114. for (unsigned i = 0; i < numGeometries; ++i)
  115. {
  116. // Read bone mappings
  117. unsigned boneMappingCount = source.readUInt();
  118. std::vector<unsigned> boneMapping;
  119. for (unsigned j = 0; j < boneMappingCount; ++j)
  120. boneMapping.push_back(source.readUInt());
  121. mGeometryBoneMappings.push_back(boneMapping);
  122. unsigned numLodLevels = source.readUInt();
  123. std::vector<SharedPtr<Geometry> > geometryLodLevels;
  124. for (unsigned j = 0; j < numLodLevels; ++j)
  125. {
  126. float distance = source.readFloat();
  127. PrimitiveType type = (PrimitiveType)source.readUInt();
  128. unsigned vertexBufferRef = source.readUInt();
  129. unsigned indexBufferRef = source.readUInt();
  130. unsigned indexStart = source.readUInt();
  131. unsigned indexCount = source.readUInt();
  132. if (vertexBufferRef >= mVertexBuffers.size())
  133. EXCEPTION("Illegal vertex buffer index");
  134. if (indexBufferRef >= mIndexBuffers.size())
  135. EXCEPTION("Illegal index buffer index");
  136. SharedPtr<Geometry> geometry(new Geometry());
  137. geometry->setNumVertexBuffers(1);
  138. geometry->setVertexBuffer(0, mVertexBuffers[vertexBufferRef]);
  139. geometry->setIndexBuffer(mIndexBuffers[indexBufferRef]);
  140. geometry->setDrawRange(type, indexStart, indexCount);
  141. geometry->setLodDistance(distance);
  142. geometryLodLevels.push_back(geometry);
  143. }
  144. mGeometries.push_back(geometryLodLevels);
  145. }
  146. // Read morphs
  147. unsigned numMorphs = source.readUInt();
  148. for (unsigned i = 0; i < numMorphs; ++i)
  149. {
  150. ModelMorph newMorph;
  151. newMorph.mName = source.readString();
  152. newMorph.mNameHash = StringHash(newMorph.mName);
  153. newMorph.mWeight = 0.0f;
  154. unsigned numBuffers = source.readUInt();
  155. for (unsigned j = 0; j < numBuffers; ++j)
  156. {
  157. VertexBufferMorph newBuffer;
  158. unsigned bufferIndex = source.readUInt();
  159. newBuffer.mElementMask = source.readUInt();
  160. newBuffer.mVertexCount = source.readUInt();
  161. // Base size: size of each vertex index
  162. unsigned vertexSize = sizeof(unsigned);
  163. // Add size of individual elements
  164. if (newBuffer.mElementMask & MASK_POSITION)
  165. vertexSize += sizeof(Vector3);
  166. if (newBuffer.mElementMask & MASK_NORMAL)
  167. vertexSize += sizeof(Vector3);
  168. if (newBuffer.mElementMask & MASK_TANGENT)
  169. vertexSize += sizeof(Vector3);
  170. newBuffer.mMorphData = new unsigned char[newBuffer.mVertexCount * vertexSize];
  171. source.read(&newBuffer.mMorphData[0], newBuffer.mVertexCount * vertexSize);
  172. newMorph.mBuffers[bufferIndex] = newBuffer;
  173. }
  174. mMorphs.push_back(newMorph);
  175. }
  176. // Read skeleton
  177. mSkeleton.load(source);
  178. // Read bounding box
  179. mBoundingBox = source.readBoundingBox();
  180. // Read collision/raycast/occlusion LOD levels
  181. mCollisionLodLevel = source.readUInt();
  182. mRaycastLodLevel = source.readUInt();
  183. mOcclusionLodLevel = source.readUInt();
  184. }
  185. void Model::save(Serializer& dest)
  186. {
  187. // Build lists of vertex and index buffers used by the geometries
  188. std::vector<VertexBuffer*> vertexBuffers;
  189. std::vector<IndexBuffer*> indexBuffers;
  190. for (unsigned i = 0; i < mGeometries.size(); ++i)
  191. {
  192. for (unsigned j = 0; j < mGeometries[i].size(); ++j)
  193. {
  194. storeOrLookupVertexBuffer(mGeometries[i][j]->getVertexBuffer(0), vertexBuffers);
  195. storeOrLookupIndexBuffer(mGeometries[i][j]->getIndexBuffer(), indexBuffers);
  196. }
  197. }
  198. // Write vertex buffers
  199. dest.writeUInt(vertexBuffers.size());
  200. for (unsigned i = 0; i < vertexBuffers.size(); ++i)
  201. {
  202. VertexBuffer* buffer = vertexBuffers[i];
  203. dest.writeUInt(buffer->getVertexCount());
  204. dest.writeUInt(buffer->getElementMask());
  205. dest.writeUInt(buffer->getMorphRangeStart());
  206. dest.writeUInt(buffer->getMorphRangeCount());
  207. void* data = buffer->lock(0, buffer->getVertexCount(), LOCK_READONLY);
  208. dest.write(data, buffer->getVertexCount() * buffer->getVertexSize());
  209. buffer->unlock();
  210. }
  211. // Write index buffers
  212. dest.writeUInt(indexBuffers.size());
  213. for (unsigned i = 0; i < indexBuffers.size(); ++i)
  214. {
  215. IndexBuffer* buffer = indexBuffers[i];
  216. dest.writeUInt(buffer->getIndexCount());
  217. dest.writeUInt(buffer->getIndexSize());
  218. void* data = buffer->lock(0, buffer->getIndexCount(), LOCK_READONLY);
  219. dest.write(data, buffer->getIndexCount() * buffer->getIndexSize());
  220. buffer->unlock();
  221. }
  222. // Write geometries
  223. dest.writeUInt(mGeometries.size());
  224. for (unsigned i = 0; i < mGeometries.size(); ++i)
  225. {
  226. // Write bone mappings
  227. dest.writeUInt(mGeometryBoneMappings[i].size());
  228. for (unsigned j = 0; j < mGeometryBoneMappings[i].size(); ++j)
  229. dest.writeUInt(mGeometryBoneMappings[i][j]);;
  230. // Write the LOD levels
  231. dest.writeUInt(mGeometries[i].size());
  232. for (unsigned j = 0; j < mGeometries[i].size(); ++j)
  233. {
  234. Geometry* geometry = mGeometries[i][j];
  235. dest.writeFloat(geometry->getLodDistance());
  236. dest.writeUInt(geometry->getPrimitiveType());
  237. dest.writeUInt(storeOrLookupVertexBuffer(geometry->getVertexBuffer(0), vertexBuffers));
  238. dest.writeUInt(storeOrLookupIndexBuffer(geometry->getIndexBuffer(), indexBuffers));
  239. dest.writeUInt(geometry->getIndexStart());
  240. dest.writeUInt(geometry->getIndexCount());
  241. }
  242. }
  243. // Write morphs
  244. dest.writeUInt(mMorphs.size());
  245. for (unsigned i = 0; i < mMorphs.size(); ++i)
  246. {
  247. dest.writeString(mMorphs[i].mName);
  248. dest.writeUInt(mMorphs[i].mBuffers.size());
  249. // Write morph vertex buffers
  250. for (std::map<unsigned int, VertexBufferMorph>::const_iterator j = mMorphs[i].mBuffers.begin();
  251. j != mMorphs[i].mBuffers.end(); ++j)
  252. {
  253. dest.writeUInt(j->first);
  254. dest.writeUInt(j->second.mElementMask);
  255. dest.writeUInt(j->second.mVertexCount);
  256. // Base size: size of each vertex index
  257. unsigned vertexSize = sizeof(unsigned);
  258. // Add size of individual elements
  259. if (j->second.mElementMask & MASK_POSITION)
  260. vertexSize += sizeof(Vector3);
  261. if (j->second.mElementMask & MASK_NORMAL)
  262. vertexSize += sizeof(Vector3);
  263. if (j->second.mElementMask & MASK_TANGENT)
  264. vertexSize += sizeof(Vector3);
  265. dest.write(j->second.mMorphData.getPtr(), vertexSize * j->second.mVertexCount);
  266. }
  267. }
  268. // Write skeleton
  269. mSkeleton.save(dest);
  270. // Write bounding box
  271. dest.writeBoundingBox(mBoundingBox);
  272. // Write collision/raycast/occlusion LOD levels
  273. dest.writeUInt(mCollisionLodLevel);
  274. dest.writeUInt(mRaycastLodLevel);
  275. dest.writeUInt(mOcclusionLodLevel);
  276. }
  277. void Model::setBoundingBox(const BoundingBox& box)
  278. {
  279. mBoundingBox = box;
  280. }
  281. void Model::setNumGeometries(unsigned num)
  282. {
  283. mGeometries.resize(num);
  284. }
  285. bool Model::setNumGeometryLodLevels(unsigned index, unsigned num)
  286. {
  287. if (index >= mGeometries.size())
  288. {
  289. LOGERROR("Illegal geometry index");
  290. return false;
  291. }
  292. if (!num)
  293. {
  294. LOGERROR("Zero LOD levels not allowed");
  295. return false;
  296. }
  297. mGeometries[index].resize(num);
  298. return true;
  299. }
  300. bool Model::setGeometry(unsigned index, unsigned lodLevel, Geometry* geometry)
  301. {
  302. if (index >= mGeometries.size())
  303. {
  304. LOGERROR("Illegal geometry index");
  305. return false;
  306. }
  307. if (lodLevel >= mGeometries[index].size())
  308. {
  309. LOGERROR("Illegal LOD level index");
  310. return false;
  311. }
  312. mGeometries[index][lodLevel] = geometry;
  313. return true;
  314. }
  315. void Model::setSkeleton(const Skeleton& skeleton)
  316. {
  317. mSkeleton.define(skeleton.getBones());
  318. }
  319. void Model::setGeometryBoneMappings(const std::vector<std::vector<unsigned> >& geometryBoneMappings)
  320. {
  321. mGeometryBoneMappings = geometryBoneMappings;
  322. }
  323. void Model::setMorphs(const std::vector<ModelMorph>& morphs)
  324. {
  325. mMorphs = morphs;
  326. }
  327. void Model::setCollisionLodLevel(unsigned lodLevel)
  328. {
  329. mCollisionLodLevel = lodLevel;
  330. }
  331. void Model::setRaycastLodLevel(unsigned lodLevel)
  332. {
  333. mRaycastLodLevel = lodLevel;
  334. }
  335. void Model::setOcclusionLodLevel(unsigned lodLevel)
  336. {
  337. mOcclusionLodLevel = lodLevel;
  338. }
  339. unsigned Model::getNumGeometryLodLevels(unsigned index) const
  340. {
  341. if (index >= mGeometries.size())
  342. return 0;
  343. return mGeometries[index].size();
  344. }
  345. Geometry* Model::getGeometry(unsigned index, unsigned lodLevel) const
  346. {
  347. if ((index >= mGeometries.size()) || (lodLevel >= mGeometries[index].size()))
  348. return 0;
  349. return mGeometries[index][lodLevel];
  350. }
  351. const ModelMorph* Model::getMorph(unsigned index) const
  352. {
  353. if (index >= mMorphs.size())
  354. return 0;
  355. return &mMorphs[index];
  356. }
  357. const ModelMorph* Model::getMorph(const std::string& name) const
  358. {
  359. return getMorph(StringHash(name));
  360. }
  361. const ModelMorph* Model::getMorph(StringHash nameHash) const
  362. {
  363. for (std::vector<ModelMorph>::const_iterator i = mMorphs.begin(); i != mMorphs.end(); ++i)
  364. {
  365. if (i->mNameHash == nameHash)
  366. return &(*i);
  367. }
  368. return 0;
  369. }