DX9GraphicsApi.cpp 6.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213
  1. #include "DX9GraphicsApi.h"
  2. #include <d3d9.h>
  3. #include "Camera3D.h"
  4. #include "DLLRegister.h"
  5. #include "DX9Texture.h"
  6. #include "Globals.h"
  7. #include "Image.h"
  8. #include "Screen.h"
  9. #include "Timer.h"
  10. #include "Window.h"
  11. #include "World3D.h"
  12. using namespace Framework;
  13. DirectX9::DirectX9()
  14. : GraphicsApi(DIRECTX9),
  15. pDirect3D(0),
  16. pDevice(0),
  17. pBackBuffer(0),
  18. backRect(new D3DLOCKED_RECT())
  19. {
  20. uiImage = new Image(1);
  21. }
  22. DirectX9::~DirectX9()
  23. {
  24. backRect->pBits = NULL;
  25. delete backRect;
  26. if (pBackBuffer)
  27. {
  28. pBackBuffer->Release();
  29. pBackBuffer = NULL;
  30. }
  31. if (pDevice)
  32. {
  33. pDevice->Release();
  34. pDevice = NULL;
  35. }
  36. if (pDirect3D)
  37. {
  38. pDirect3D->Release();
  39. pDirect3D = NULL;
  40. getDLLRegister()->releaseDLL("d3d9.dll");
  41. }
  42. uiImage->release();
  43. }
  44. typedef IDirect3D9*(__stdcall* D3D9CreateFunction)(UINT);
  45. void DirectX9::initialize(
  46. NativeWindow* fenster, Vec2<int> backBufferSize, bool fullScreen)
  47. {
  48. GraphicsApi::initialize(fenster, backBufferSize, fullScreen);
  49. HINSTANCE dll = getDLLRegister()->loadDLL("d3d9.dll", "d3d9.dll");
  50. if (!dll)
  51. {
  52. WMessageBox(fenster ? fenster->getWindowHandle() : 0,
  53. new Text("Fehler"),
  54. new Text("DirectX 9 konnte nicht gefunden werden."),
  55. MB_ICONERROR);
  56. return;
  57. }
  58. D3D9CreateFunction direct3DCreate9
  59. = (D3D9CreateFunction)GetProcAddress(dll, "Direct3DCreate9");
  60. if (!direct3DCreate9)
  61. {
  62. getDLLRegister()->releaseDLL("d3d9.dll");
  63. WMessageBox(fenster ? fenster->getWindowHandle() : 0,
  64. new Text("Fehler"),
  65. new Text("Der Einstiegspunkt Direct3DCreate9 fon DirectX 9 konnte "
  66. "nicht gefunden werden."),
  67. MB_ICONERROR);
  68. return;
  69. }
  70. pDirect3D = direct3DCreate9(D3D_SDK_VERSION);
  71. D3DPRESENT_PARAMETERS d3dpp;
  72. ZeroMemory(&d3dpp, sizeof(d3dpp));
  73. d3dpp.Windowed = !fullScreen;
  74. d3dpp.hDeviceWindow = fenster ? fenster->getWindowHandle() : 0;
  75. d3dpp.SwapEffect = D3DSWAPEFFECT_DISCARD;
  76. d3dpp.BackBufferFormat = D3DFMT_X8R8G8B8;
  77. d3dpp.PresentationInterval = D3DPRESENT_INTERVAL_ONE;
  78. d3dpp.Flags = D3DPRESENTFLAG_LOCKABLE_BACKBUFFER;
  79. d3dpp.BackBufferHeight = this->backBufferSize.y;
  80. d3dpp.BackBufferWidth = this->backBufferSize.x;
  81. uiImage->newImage(
  82. this->backBufferSize.x, this->backBufferSize.y, 0xFF000000);
  83. HRESULT result = pDirect3D->CreateDevice(D3DADAPTER_DEFAULT,
  84. D3DDEVTYPE_HAL,
  85. fenster->getWindowHandle(),
  86. D3DCREATE_HARDWARE_VERTEXPROCESSING | D3DCREATE_PUREDEVICE,
  87. &d3dpp,
  88. &pDevice);
  89. if (result != S_OK)
  90. WMessageBox(fenster ? fenster->getWindowHandle() : 0,
  91. new Text("Fehler"),
  92. new Text("DirectX 9 konnte nicht initialisiert werden."),
  93. MB_ICONERROR);
  94. if (pDevice)
  95. result = pDevice->GetBackBuffer(
  96. 0, 0, D3DBACKBUFFER_TYPE_MONO, &pBackBuffer);
  97. if (result != S_OK)
  98. WMessageBox(fenster ? fenster->getWindowHandle() : 0,
  99. new Text("Fehler"),
  100. new Text("DirectX 9 konnte nicht initialisiert werden."),
  101. MB_ICONERROR);
  102. }
  103. void DirectX9::beginFrame(bool fill2D, bool fill3D, int fillColor)
  104. {
  105. if (fill2D) uiImage->setColor(fillColor);
  106. }
  107. void DirectX9::renderKamera(Cam3D* zKamera)
  108. {
  109. Mat4<float> mat = zKamera->getProjectionMatrix();
  110. Mat4<float> inv = zKamera->getViewMatrix().getInverse();
  111. World3D* welt = zKamera->zWorld();
  112. Timer zm = Timer();
  113. zm.measureStart();
  114. for (int x = 0; x < zKamera->zViewPort()->width; x++)
  115. {
  116. for (int y = 0; y < zKamera->zViewPort()->height; y++)
  117. {
  118. Vec3<float> wPoint
  119. = Vec3<float>(x / (0.5f * zKamera->zViewPort()->width) - 1,
  120. y / (0.5f * zKamera->zViewPort()->height) - 1,
  121. 0.1f);
  122. Vec3<float> wPoint2 = Vec3<float>(wPoint.x, wPoint.y, 1.f);
  123. wPoint.x = (wPoint.x * 0.1f) / mat.elements[0][0];
  124. wPoint.y = (wPoint.y * 0.1f) / mat.elements[1][1];
  125. wPoint2.x = wPoint2.x / mat.elements[0][0];
  126. wPoint2.y = wPoint2.y / mat.elements[1][1];
  127. wPoint = inv * wPoint;
  128. wPoint2 = inv * wPoint2;
  129. Vec3<float> wDir = wPoint2 - wPoint;
  130. uiImage->setPixelDP(x + (int)zKamera->zViewPort()->x,
  131. y + (int)zKamera->zViewPort()->y,
  132. welt->traceRay(wPoint, wDir));
  133. }
  134. }
  135. zm.measureEnd();
  136. Logging::error() << zm.getSekunden() << "\n";
  137. }
  138. void DirectX9::presentFrame()
  139. {
  140. if (!uiImage->getBuffer()) return;
  141. HRESULT result;
  142. result = pBackBuffer->LockRect(backRect, 0, 0);
  143. if (result != S_OK)
  144. {
  145. WMessageBox(fenster ? fenster->getWindowHandle() : 0,
  146. new Text("Fehler"),
  147. new Text("Es ist ein Fehler beim rendern aufgetreten."),
  148. MB_ICONERROR);
  149. }
  150. // kopieren zum Screen
  151. int* bgBuff = uiImage->getBuffer();
  152. int tmpBr = sizeof(D3DCOLOR) * uiImage->getWidth();
  153. for (int y = 0, pitch = 0, bry = 0; y < uiImage->getHeight();
  154. ++y, pitch += backRect->Pitch, bry += uiImage->getWidth())
  155. memcpy(&((BYTE*)backRect->pBits)[pitch], (void*)&(bgBuff[bry]), tmpBr);
  156. // Beende Image
  157. result = pBackBuffer->UnlockRect();
  158. if (result != S_OK)
  159. {
  160. WMessageBox(fenster ? fenster->getWindowHandle() : 0,
  161. new Text("Fehler"),
  162. new Text("Es ist ein Fehler beim rendern aufgetreten."),
  163. MB_ICONERROR);
  164. }
  165. if (result != S_OK)
  166. {
  167. WMessageBox(fenster ? fenster->getWindowHandle() : 0,
  168. new Text("Fehler"),
  169. new Text("Es ist ein Fehler beim rendern aufgetreten."),
  170. MB_ICONERROR);
  171. }
  172. result = pDevice->Present(0, 0, 0, 0);
  173. if (result != S_OK)
  174. {
  175. WMessageBox(fenster ? fenster->getWindowHandle() : 0,
  176. new Text("Fehler"),
  177. new Text("Es ist ein Fehler beim rendern aufgetreten."),
  178. MB_ICONERROR);
  179. }
  180. }
  181. Texture* DirectX9::createOrGetTexture(
  182. const char* name, Image* b, TextureDirection dir)
  183. {
  184. Texture* ret = new DX9Texture(dir);
  185. ret->setImageZ(b);
  186. return ret;
  187. }
  188. Image* DirectX9::zUIRenderImage() const
  189. {
  190. return uiImage;
  191. }
  192. DXBuffer* DirectX9::createStructuredBuffer(int eSize)
  193. {
  194. throw "Unsupported Operation for DirectX9 Graphics API. Use DirectX11 or "
  195. "12";
  196. }