BsTextureManager.cpp 3.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106
  1. #include "BsTextureManager.h"
  2. #include "BsException.h"
  3. #include "BsPixelUtil.h"
  4. #include "BsMultiRenderTexture.h"
  5. #include "BsRenderSystem.h"
  6. namespace BansheeEngine
  7. {
  8. TexturePtr TextureManager::createTexture(TextureType texType, UINT32 width, UINT32 height, UINT32 depth, int numMipmaps,
  9. PixelFormat format, int usage, bool hwGamma, UINT32 multisampleCount)
  10. {
  11. TexturePtr ret = createTextureImpl();
  12. ret->_setThisPtr(ret);
  13. ret->initialize(texType, width, height, depth, static_cast<size_t>(numMipmaps), format, usage, hwGamma, multisampleCount);
  14. return ret;
  15. }
  16. TexturePtr TextureManager::_createEmpty()
  17. {
  18. TexturePtr texture = createTextureImpl();
  19. texture->_setThisPtr(texture);
  20. return texture;
  21. }
  22. RenderTexturePtr TextureManager::createRenderTexture(TextureType textureType, UINT32 width, UINT32 height,
  23. PixelFormat format, bool hwGamma, UINT32 multisampleCount,
  24. bool createDepth, PixelFormat depthStencilFormat)
  25. {
  26. TexturePtr texture = createTexture(textureType, width, height, 0, format, TU_RENDERTARGET, hwGamma, multisampleCount);
  27. TexturePtr depthStencil = nullptr;
  28. if(createDepth)
  29. {
  30. depthStencil = createTexture(TEX_TYPE_2D, width, height, 0, depthStencilFormat, TU_DEPTHSTENCIL, false, multisampleCount);
  31. }
  32. RENDER_TEXTURE_DESC desc;
  33. desc.colorSurface.texture = texture;
  34. desc.colorSurface.face = 0;
  35. desc.colorSurface.mipLevel = 0;
  36. desc.depthStencilSurface.texture = depthStencil;
  37. desc.depthStencilSurface.face = 0;
  38. desc.depthStencilSurface.mipLevel = 0;
  39. RenderTexturePtr newRT = createRenderTexture(desc);
  40. return newRT;
  41. }
  42. RenderTexturePtr TextureManager::createRenderTexture(const RENDER_TEXTURE_DESC& desc)
  43. {
  44. RenderTexturePtr newRT = createRenderTextureImpl(desc);
  45. newRT->_setThisPtr(newRT);
  46. newRT->initialize();
  47. return newRT;
  48. }
  49. MultiRenderTexturePtr TextureManager::createMultiRenderTexture(const MULTI_RENDER_TEXTURE_DESC& desc)
  50. {
  51. MultiRenderTexturePtr newRT = createMultiRenderTextureImpl(desc);
  52. newRT->_setThisPtr(newRT);
  53. newRT->initialize();
  54. return newRT;
  55. }
  56. SPtr<RenderTextureCore> TextureCoreManager::createRenderTexture(const RENDER_TEXTURE_DESC& desc)
  57. {
  58. SPtr<RenderTextureCore> newRT = createRenderTextureInternal(desc);
  59. newRT->initialize();
  60. return newRT;
  61. }
  62. SPtr<MultiRenderTextureCore> TextureCoreManager::createMultiRenderTexture(const MULTI_RENDER_TEXTURE_DESC& desc)
  63. {
  64. SPtr<MultiRenderTextureCore> newRT = createMultiRenderTextureInternal(desc);
  65. newRT->initialize();
  66. return newRT;
  67. }
  68. void TextureCoreManager::onStartUp()
  69. {
  70. // Internally this will call our createTextureImpl virtual method. But since this is guaranteed
  71. // to be the last class in the hierarchy, we can call a virtual method from constructor.
  72. mDummyTexture = Texture::create(TEX_TYPE_2D, 2, 2, 0, PF_R8G8B8A8);
  73. UINT32 subresourceIdx = mDummyTexture->mapToSubresourceIdx(0, 0);
  74. PixelDataPtr data = mDummyTexture->allocateSubresourceBuffer(subresourceIdx);
  75. data->setColorAt(Color::Red, 0, 0);
  76. data->setColorAt(Color::Red, 0, 1);
  77. data->setColorAt(Color::Red, 1, 0);
  78. data->setColorAt(Color::Red, 1, 1);
  79. AsyncOp op;
  80. data->_lock();
  81. RenderSystem::instance().writeSubresource(mDummyTexture.getInternalPtr(), mDummyTexture->mapToSubresourceIdx(0, 0), data, false, op);
  82. }
  83. }