RenderDevice.cpp 4.0 KB

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