BsQueryManager.cpp 2.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  1. #include "BsQueryManager.h"
  2. #include "BsEventQuery.h"
  3. #include "BsTimerQuery.h"
  4. #include "BsOcclusionQuery.h"
  5. namespace BansheeEngine
  6. {
  7. QueryManager::QueryManager()
  8. {
  9. }
  10. QueryManager::~QueryManager()
  11. {
  12. // Trigger all remaining queries, whether they completed or not
  13. for (auto& query : mEventQueries)
  14. {
  15. if (query->isActive())
  16. query->onTriggered();
  17. }
  18. for (auto& query : mTimerQueries)
  19. {
  20. if (query->isActive())
  21. query->onTriggered(query->getTimeMs());
  22. }
  23. for (auto& query : mOcclusionQueries)
  24. {
  25. if (query->isActive())
  26. query->onComplete(query->getNumSamples());
  27. }
  28. processDeletedQueue();
  29. }
  30. void QueryManager::_update()
  31. {
  32. for(auto& query : mEventQueries)
  33. {
  34. if(query->isActive() && query->isReady())
  35. {
  36. query->onTriggered();
  37. query->setActive(false);
  38. }
  39. }
  40. for(auto& query : mTimerQueries)
  41. {
  42. if(query->isActive() && query->isReady())
  43. {
  44. query->onTriggered(query->getTimeMs());
  45. query->setActive(false);
  46. }
  47. }
  48. for (auto& query : mOcclusionQueries)
  49. {
  50. if (query->isActive() && query->isReady())
  51. {
  52. query->onComplete(query->getNumSamples());
  53. query->setActive(false);
  54. }
  55. }
  56. processDeletedQueue();
  57. }
  58. void QueryManager::deleteEventQuery(EventQuery* query)
  59. {
  60. instance().mDeletedEventQueries.push_back(query);
  61. }
  62. void QueryManager::deleteTimerQuery(TimerQuery* query)
  63. {
  64. instance().mDeletedTimerQueries.push_back(query);
  65. }
  66. void QueryManager::deleteOcclusionQuery(OcclusionQuery* query)
  67. {
  68. instance().mDeletedOcclusionQueries.push_back(query);
  69. }
  70. void QueryManager::processDeletedQueue()
  71. {
  72. for (auto& query : mDeletedEventQueries)
  73. {
  74. auto iterFind = std::find(mEventQueries.begin(), mEventQueries.end(), query);
  75. if (iterFind != mEventQueries.end())
  76. mEventQueries.erase(iterFind);
  77. bs_delete(query);
  78. }
  79. mDeletedEventQueries.clear();
  80. for (auto& query : mDeletedTimerQueries)
  81. {
  82. auto iterFind = std::find(mTimerQueries.begin(), mTimerQueries.end(), query);
  83. if (iterFind != mTimerQueries.end())
  84. mTimerQueries.erase(iterFind);
  85. bs_delete(query);
  86. }
  87. mDeletedTimerQueries.clear();
  88. for (auto& query : mDeletedOcclusionQueries)
  89. {
  90. auto iterFind = std::find(mOcclusionQueries.begin(), mOcclusionQueries.end(), query);
  91. if (iterFind != mOcclusionQueries.end())
  92. mOcclusionQueries.erase(iterFind);
  93. bs_delete(query);
  94. }
  95. mDeletedOcclusionQueries.clear();
  96. }
  97. }