RenderDevice.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168
  1. #include "RenderDevice.h"
  2. #include "BFApp.h"
  3. #include "Shader.h"
  4. #include "Texture.h"
  5. #include "gfx/DrawLayer.h"
  6. #include "img/TGAData.h"
  7. #include "img/PNGData.h"
  8. #include "img/PVRData.h"
  9. #include "img/BFIData.h"
  10. #include "img/JPEGData.h"
  11. #include "util/PerfTimer.h"
  12. #include "util/AllocDebug.h"
  13. USING_NS_BF;
  14. RenderState::RenderState()
  15. {
  16. mWriteDepthBuffer = false;
  17. mCullMode = CullMode_None;
  18. mDepthFunc = DepthFunc_Always;
  19. mShader = NULL;
  20. mClipped = false;
  21. mTexWrap = false;
  22. }
  23. RenderTarget::RenderTarget()
  24. {
  25. mWidth = 0;
  26. mHeight = 0;
  27. mHasBeenDrawnTo = false;
  28. mHasBeenTargeted = false;
  29. mResizeNum = 0;
  30. }
  31. RenderWindow::RenderWindow()
  32. {
  33. mCurDrawLayer = NULL;
  34. mRenderDevice = NULL;
  35. mWindow = NULL;
  36. }
  37. RenderWindow::~RenderWindow()
  38. {
  39. for (auto drawLayer : mDrawLayerList)
  40. delete drawLayer;
  41. }
  42. ///
  43. RenderDevice::RenderDevice() :
  44. mPooledIndexBuffers(DRAWBUFFER_IDXBUFFER_SIZE),
  45. mPooledVertexBuffers(DRAWBUFFER_VTXBUFFER_SIZE),
  46. mPooledRenderCmdBuffers(DRAWBUFFER_CMDBUFFER_SIZE)
  47. {
  48. mCurRenderState = NULL;
  49. mDefaultRenderState = NULL;
  50. mPhysRenderState = mDefaultRenderState;
  51. mResizeCount = 0;
  52. mCurRenderTarget = NULL;
  53. mCurDrawLayer = NULL;
  54. mPhysRenderWindow = NULL;
  55. }
  56. RenderDevice::~RenderDevice()
  57. {
  58. for (auto batch : mDrawBatchPool)
  59. delete batch;
  60. }
  61. void RenderDevice::AddRenderWindow(RenderWindow* renderWindow)
  62. {
  63. mRenderWindowList.push_back(renderWindow);
  64. }
  65. void RenderDevice::RemoveRenderWindow(RenderWindow* renderWindow)
  66. {
  67. mRenderWindowList.erase(std::find(mRenderWindowList.begin(), mRenderWindowList.end(), renderWindow));
  68. }
  69. void RenderDevice::FrameEnd()
  70. {
  71. }
  72. RenderState* RenderDevice::CreateRenderState(RenderState* srcRenderState)
  73. {
  74. RenderState* renderState = new RenderState();
  75. if (srcRenderState != NULL)
  76. *renderState = *srcRenderState;
  77. return renderState;
  78. }
  79. VertexDefinition* Beefy::RenderDevice::CreateVertexDefinition(VertexDefData* elementData, int numElements)
  80. {
  81. VertexDefinition* vertexDefinition = new VertexDefinition();
  82. vertexDefinition->mElementData = new VertexDefData[numElements];
  83. vertexDefinition->mNumElements = numElements;
  84. memcpy(vertexDefinition->mElementData, elementData, numElements * sizeof(VertexDefData));
  85. return vertexDefinition;
  86. }
  87. Texture* RenderDevice::LoadTexture(const StringImpl& fileName, int flags)
  88. {
  89. int dotPos = (int)fileName.LastIndexOf('.');
  90. String ext;
  91. if (dotPos != -1)
  92. ext = fileName.Substring(dotPos);
  93. ImageData* imageData = NULL;
  94. bool handled = false;
  95. bool failed = false;
  96. if (fileName == "!white")
  97. {
  98. imageData = new ImageData();
  99. imageData->CreateNew(1, 1, true);
  100. imageData->mBits[0] = 0xFFFFFFFF;
  101. handled = true;
  102. }
  103. else if (ext == ".tga")
  104. imageData = new TGAData();
  105. else if (ext == ".png")
  106. imageData = new PNGData();
  107. else if (ext == ".jpg")
  108. imageData = new JPEGData();
  109. else if (ext == ".pvr")
  110. imageData = new PVRData();
  111. else
  112. {
  113. BF_FATAL("Unknown texture format");
  114. return NULL; // Unknown format
  115. }
  116. if (!handled)
  117. {
  118. imageData->mWantsAlphaPremultiplied = (flags & TextureFlag_NoPremult) == 0;
  119. if (fileName.StartsWith("@"))
  120. {
  121. int colon = (int)fileName.IndexOf(':');
  122. String addrStr = fileName.Substring(1, colon - 1);
  123. String lenStr = fileName.Substring(colon + 1);
  124. void* addr = (void*)(intptr)strtoll(addrStr.c_str(), NULL, 16);
  125. int len = (int)strtol(lenStr.c_str(), NULL, 10);
  126. if (!imageData->LoadFromMemory(addr, len))
  127. {
  128. failed = true;
  129. BF_FATAL("Failed to load image");
  130. }
  131. }
  132. else
  133. {
  134. if (!imageData->LoadFromFile(fileName))
  135. {
  136. failed = true;
  137. BF_FATAL("Failed to load image");
  138. }
  139. }
  140. }
  141. Texture* aTexture = NULL;
  142. if (!failed)
  143. aTexture = LoadTexture(imageData, flags);
  144. delete imageData;
  145. return aTexture;
  146. }