RenderDevice.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193
  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/BMPData.h"
  10. #include "img/BFIData.h"
  11. #include "img/JPEGData.h"
  12. #include "util/PerfTimer.h"
  13. #include "util/AllocDebug.h"
  14. USING_NS_BF;
  15. RenderState::RenderState()
  16. {
  17. mWriteDepthBuffer = false;
  18. mCullMode = CullMode_None;
  19. mDepthFunc = DepthFunc_Always;
  20. mTopology = Topology3D_TriangleList;
  21. mShader = NULL;
  22. mClipped = false;
  23. mTexWrap = false;
  24. mWireframe = false;
  25. }
  26. RenderTarget::RenderTarget()
  27. {
  28. mWidth = 0;
  29. mHeight = 0;
  30. mHasBeenDrawnTo = false;
  31. mHasBeenTargeted = false;
  32. mResizeNum = 0;
  33. mWantsClear = true;
  34. mResetClear = false;
  35. }
  36. RenderWindow::RenderWindow()
  37. {
  38. mCurDrawLayer = NULL;
  39. mRenderDevice = NULL;
  40. mWindow = NULL;
  41. }
  42. RenderWindow::~RenderWindow()
  43. {
  44. for (auto drawLayer : mDrawLayerList)
  45. delete drawLayer;
  46. }
  47. ///
  48. RenderDevice::RenderDevice() :
  49. mPooledIndexBuffers(DRAWBUFFER_IDXBUFFER_SIZE),
  50. mPooledVertexBuffers(DRAWBUFFER_VTXBUFFER_SIZE),
  51. mPooledRenderCmdBuffers(DRAWBUFFER_CMDBUFFER_SIZE)
  52. {
  53. mCurRenderState = NULL;
  54. mDefaultRenderState = NULL;
  55. mPhysRenderState = mDefaultRenderState;
  56. mResizeCount = 0;
  57. mCurRenderTarget = NULL;
  58. mCurDrawLayer = NULL;
  59. mPhysRenderWindow = NULL;
  60. mApp = NULL;
  61. }
  62. RenderDevice::~RenderDevice()
  63. {
  64. for (auto batch : mDrawBatchPool)
  65. delete batch;
  66. }
  67. void RenderDevice::AddRenderWindow(RenderWindow* renderWindow)
  68. {
  69. mRenderWindowList.push_back(renderWindow);
  70. }
  71. void RenderDevice::RemoveRenderWindow(RenderWindow* renderWindow)
  72. {
  73. mRenderWindowList.erase(std::find(mRenderWindowList.begin(), mRenderWindowList.end(), renderWindow));
  74. }
  75. void RenderDevice::FrameEnd()
  76. {
  77. }
  78. RenderState* RenderDevice::CreateRenderState(RenderState* srcRenderState)
  79. {
  80. RenderState* renderState = new RenderState();
  81. if (srcRenderState != NULL)
  82. *renderState = *srcRenderState;
  83. return renderState;
  84. }
  85. VertexDefinition* Beefy::RenderDevice::CreateVertexDefinition(VertexDefData* elementData, int numElements)
  86. {
  87. VertexDefinition* vertexDefinition = new VertexDefinition();
  88. vertexDefinition->mElementData = new VertexDefData[numElements];
  89. vertexDefinition->mNumElements = numElements;
  90. memcpy(vertexDefinition->mElementData, elementData, numElements * sizeof(VertexDefData));
  91. return vertexDefinition;
  92. }
  93. Texture* RenderDevice::LoadTexture(const StringImpl& fileName, int flags)
  94. {
  95. int dotPos = (int)fileName.LastIndexOf('.');
  96. String ext;
  97. if (dotPos != -1)
  98. ext = fileName.Substring(dotPos);
  99. ImageData* imageData = NULL;
  100. bool handled = false;
  101. bool failed = false;
  102. if (fileName == "!white")
  103. {
  104. imageData = new ImageData();
  105. imageData->CreateNew(1, 1, true);
  106. imageData->mBits[0] = 0xFFFFFFFF;
  107. handled = true;
  108. }
  109. else if (fileName.StartsWith("!square"))
  110. {
  111. int squareSize = atoi(fileName.c_str() + 7);
  112. imageData = new ImageData();
  113. imageData->CreateNew(squareSize + 2, squareSize + 2, true);
  114. for (int y = 0; y < squareSize; y++)
  115. {
  116. for (int x = 0; x < squareSize; x++)
  117. {
  118. imageData->mBits[(y + 1) * (squareSize + 2) + x + 1] = 0xFFFFFFFF;
  119. }
  120. }
  121. handled = true;
  122. }
  123. else if (ext == ".tga")
  124. imageData = new TGAData();
  125. else if (ext == ".png")
  126. imageData = new PNGData();
  127. else if (ext == ".jpg")
  128. imageData = new JPEGData();
  129. else if (ext == ".pvr")
  130. imageData = new PVRData();
  131. else if (ext == ".bmp")
  132. {
  133. BMPData* bmpData = new BMPData();
  134. bmpData->mHasTransFollowing = (flags & TextureFlag_HasTransFollowing) == 0;;
  135. imageData = bmpData;
  136. }
  137. else
  138. {
  139. return NULL; // Unknown format
  140. }
  141. if (!handled)
  142. {
  143. imageData->mWantsAlphaPremultiplied = (flags & TextureFlag_NoPremult) == 0;
  144. void* memPtr = NULL;
  145. int memLen = 0;
  146. if (ParseMemorySpan(fileName, memPtr, memLen))
  147. {
  148. if (!imageData->LoadFromMemory(memPtr, memLen))
  149. {
  150. failed = true;
  151. delete imageData;
  152. return NULL;
  153. }
  154. }
  155. else
  156. {
  157. if (!imageData->LoadFromFile(fileName))
  158. {
  159. failed = true;
  160. delete imageData;
  161. return NULL;
  162. }
  163. }
  164. }
  165. Texture* aTexture = NULL;
  166. if (!failed)
  167. aTexture = LoadTexture(imageData, flags);
  168. imageData->Deref();
  169. return aTexture;
  170. }