BsRenderTargetManager.cpp 1.5 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374
  1. #include "BsRenderTargetManager.h"
  2. #include "BsRenderTarget.h"
  3. #include "BsRenderWindow.h"
  4. namespace BansheeEngine
  5. {
  6. RenderTargetManager::~RenderTargetManager()
  7. {
  8. assert(mRenderTargets.size() == 0 && "All render targets must be released before render target manager can be shut down.");
  9. }
  10. void RenderTargetManager::registerRenderTarget(RenderTarget* rt)
  11. {
  12. BS_LOCK_MUTEX(mMutex);
  13. RenderTargetData rtData;
  14. rtData.properties = rt->createProperties();
  15. rtData.dirty = true;
  16. mRenderTargets.insert(std::make_pair(rt, rtData));
  17. }
  18. void RenderTargetManager::unregisterRenderTarget(RenderTarget* rt)
  19. {
  20. BS_LOCK_MUTEX(mMutex);
  21. auto findIter = mRenderTargets.find(rt);
  22. if (findIter == mRenderTargets.end())
  23. return;
  24. RenderTargetData& rtData = findIter->second;
  25. bs_delete(rtData.properties);
  26. mRenderTargets.erase(findIter);
  27. }
  28. void RenderTargetManager::updateCore()
  29. {
  30. BS_LOCK_MUTEX(mMutex);
  31. for (auto& rtPair : mRenderTargets)
  32. {
  33. RenderTarget* rt = rtPair.first;
  34. RenderTargetData& rtData = rtPair.second;
  35. if (rt->getCore()->_isCoreDirty())
  36. {
  37. rtData.properties->copyFrom(rt->getCore()->getProperties());
  38. rtData.dirty = true;
  39. rt->getCore()->_markCoreClean();
  40. }
  41. }
  42. }
  43. void RenderTargetManager::update()
  44. {
  45. BS_LOCK_MUTEX(mMutex);
  46. for (auto& rtPair : mRenderTargets)
  47. {
  48. RenderTarget* rt = rtPair.first;
  49. RenderTargetData& rtData = rtPair.second;
  50. if (rtData.dirty)
  51. {
  52. rt->mProperties->copyFrom(*rtData.properties);
  53. rtData.dirty = false;
  54. }
  55. }
  56. }
  57. }