BsTransientMesh.cpp 2.4 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798
  1. #include "BsTransientMesh.h"
  2. #include "BsVertexData.h"
  3. #include "BsBounds.h"
  4. #include "BsMeshHeap.h"
  5. namespace BansheeEngine
  6. {
  7. TransientMesh::TransientMesh(const MeshHeapPtr& parentHeap, UINT32 id, UINT32 numVertices, UINT32 numIndices, DrawOperationType drawOp)
  8. :MeshBase(numVertices, numIndices, drawOp), mParentHeap(parentHeap), mId(id), mIsDestroyed(false)
  9. {
  10. }
  11. TransientMesh::~TransientMesh()
  12. {
  13. if(!mIsDestroyed)
  14. {
  15. TransientMeshPtr meshPtr = std::static_pointer_cast<TransientMesh>(getThisPtr());
  16. MeshHeapPtr parentHeap = mParentHeap.lock();
  17. if (parentHeap != nullptr)
  18. parentHeap->dealloc(meshPtr);
  19. }
  20. }
  21. void TransientMesh::writeSubresource(UINT32 subresourceIdx, const GpuResourceData& data, bool discardEntireBuffer)
  22. {
  23. BS_EXCEPT(InvalidStateException, "Updating is not supported on a transient mesh.");
  24. }
  25. void TransientMesh::readSubresource(UINT32 subresourceIdx, GpuResourceData& data)
  26. {
  27. BS_EXCEPT(InvalidStateException, "Reading is not supported on a transient mesh.");
  28. }
  29. std::shared_ptr<VertexData> TransientMesh::_getVertexData() const
  30. {
  31. MeshHeapPtr parentHeap = mParentHeap.lock();
  32. if (parentHeap != nullptr)
  33. return parentHeap->_getVertexData();
  34. else
  35. return nullptr;
  36. }
  37. IndexBufferPtr TransientMesh::_getIndexBuffer() const
  38. {
  39. MeshHeapPtr parentHeap = mParentHeap.lock();
  40. if (parentHeap != nullptr)
  41. return parentHeap->_getIndexBuffer();
  42. else
  43. return nullptr;
  44. }
  45. UINT32 TransientMesh::_getVertexOffset() const
  46. {
  47. MeshHeapPtr parentHeap = mParentHeap.lock();
  48. if (parentHeap != nullptr)
  49. return parentHeap->getVertexOffset(mId);
  50. else
  51. return 0;
  52. }
  53. UINT32 TransientMesh::_getIndexOffset() const
  54. {
  55. MeshHeapPtr parentHeap = mParentHeap.lock();
  56. if (parentHeap != nullptr)
  57. return parentHeap->getIndexOffset(mId);
  58. else
  59. return 0;
  60. }
  61. void TransientMesh::_notifyUsedOnGPU()
  62. {
  63. MeshHeapPtr parentHeap = mParentHeap.lock();
  64. if (parentHeap != nullptr)
  65. parentHeap->notifyUsedOnGPU(mId);
  66. }
  67. MeshProxyPtr TransientMesh::_createProxy(UINT32 subMeshIdx)
  68. {
  69. MeshProxyPtr coreProxy = bs_shared_ptr<MeshProxy>();
  70. coreProxy->mesh = std::static_pointer_cast<MeshBase>(getThisPtr());
  71. coreProxy->subMesh = mSubMeshes[0];
  72. coreProxy->submeshIdx = subMeshIdx;
  73. // Note: Not calculating bounds for transient meshes yet
  74. // (No particular reason, I just didn't bother)
  75. coreProxy->bounds = Bounds();
  76. return coreProxy;
  77. }
  78. }