DepthStencilTarget.cpp 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182
  1. #include "Base.h"
  2. #include "DepthStencilTarget.h"
  3. namespace gameplay
  4. {
  5. static std::vector<DepthStencilTarget*> __depthStencilTargets;
  6. DepthStencilTarget::DepthStencilTarget(const char* id, Format format, unsigned int width, unsigned int height)
  7. : _id(id ? id : ""), _format(format), _renderBuffer(0), _width(width), _height(height)
  8. {
  9. }
  10. DepthStencilTarget::~DepthStencilTarget()
  11. {
  12. // Destroy GL resources.
  13. if (_renderBuffer)
  14. GL_ASSERT( glDeleteTextures(1, &_renderBuffer) );
  15. // Remove from vector.
  16. std::vector<DepthStencilTarget*>::iterator it = std::find(__depthStencilTargets.begin(), __depthStencilTargets.end(), this);
  17. if (it != __depthStencilTargets.end())
  18. {
  19. __depthStencilTargets.erase(it);
  20. }
  21. }
  22. DepthStencilTarget* DepthStencilTarget::create(const char* id, Format format, unsigned int width, unsigned int height)
  23. {
  24. // Create the depth stencil target.
  25. DepthStencilTarget* depthStencilTarget = new DepthStencilTarget(id, format, width, height);
  26. // Create a render buffer for this new depth stencil target
  27. GL_ASSERT( glGenRenderbuffers(1, &depthStencilTarget->_renderBuffer) );
  28. GL_ASSERT( glBindRenderbuffer(GL_RENDERBUFFER, depthStencilTarget->_renderBuffer) );
  29. GL_ASSERT( glRenderbufferStorage(GL_RENDERBUFFER, GL_DEPTH24_STENCIL8, width, height) );
  30. // Add it to the cache.
  31. __depthStencilTargets.push_back(depthStencilTarget);
  32. return depthStencilTarget;
  33. }
  34. DepthStencilTarget* DepthStencilTarget::getDepthStencilTarget(const char* id)
  35. {
  36. GP_ASSERT(id);
  37. // Search the vector for a matching ID.
  38. std::vector<DepthStencilTarget*>::const_iterator it;
  39. for (it = __depthStencilTargets.begin(); it < __depthStencilTargets.end(); it++)
  40. {
  41. DepthStencilTarget* dst = *it;
  42. GP_ASSERT(dst);
  43. if (strcmp(id, dst->getId()) == 0)
  44. {
  45. return dst;
  46. }
  47. }
  48. return NULL;
  49. }
  50. const char* DepthStencilTarget::getId() const
  51. {
  52. return _id.c_str();
  53. }
  54. DepthStencilTarget::Format DepthStencilTarget::getFormat() const
  55. {
  56. return _format;
  57. }
  58. unsigned int DepthStencilTarget::getWidth() const
  59. {
  60. return _width;
  61. }
  62. unsigned int DepthStencilTarget::getHeight() const
  63. {
  64. return _height;
  65. }
  66. }