RenderDevice.cpp 3.7 KB

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