DXBuffer.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188
  1. #include "DXBuffer.h"
  2. #include <iostream>
  3. #ifdef WIN32
  4. #include "Render3D.h"
  5. #include <d3d11.h>
  6. #endif
  7. using namespace Framework;
  8. // Inhalt der DXBuffer Klasse
  9. // Konstruktor
  10. // bind: Der verwendungszweck des Buffers. Beispiel: D3D11_BIND_INDEX_BUFFER, D3D11_BIND_VERTEX_BUFFER.
  11. // eLän: Länge eines einzelnen Elements in Bytes
  12. DXBuffer::DXBuffer( D3D11_BIND_FLAG bind, int eLen )
  13. {
  14. #ifdef WIN32
  15. buffer = 0;
  16. bf = bind;
  17. #endif
  18. data = 0;
  19. changed = 0;
  20. len = 0;
  21. altLen = 0;
  22. elLem = eLen;
  23. ref = 1;
  24. }
  25. // Destruktor
  26. DXBuffer::~DXBuffer()
  27. {
  28. #ifdef WIN32
  29. if( buffer )
  30. buffer->Release();
  31. #endif
  32. }
  33. // Setzt den geändert fläg, so das beim nächsten auruf von 'kopieren' die daten neu kopiert werden
  34. void DXBuffer::setChanged()
  35. {
  36. changed = 1;
  37. }
  38. // Ändert die länge des Buffers beim nächsten aufruf von 'kopieren'
  39. // län: Die Länge in Bytes
  40. void DXBuffer::setLength( int len )
  41. {
  42. this->len = len;
  43. changed = 1;
  44. }
  45. // Legt fest, was beim nächsten aufruf von 'kopieren' kopiert wird
  46. // data: Ein zeiger auf die Daten
  47. void DXBuffer::setData( void *data )
  48. {
  49. this->data = data;
  50. changed = 1;
  51. }
  52. // Kopiert die Daten in den Buffer, fals sie sich verändert haben
  53. // zRObj: Das Objekt, mit dem die Grafikkarte angesprochen wird
  54. void DXBuffer::copieren( Render3D *zRObj )
  55. {
  56. #ifdef WIN32
  57. if( !changed || !len || !data )
  58. return;
  59. if( len != altLen )
  60. {
  61. if( buffer )
  62. buffer->Release();
  63. buffer = 0;
  64. }
  65. if( !buffer )
  66. {
  67. D3D11_BUFFER_DESC desk;
  68. memset( &desk, 0, sizeof( desk ) );
  69. desk.Usage = D3D11_USAGE_DYNAMIC;
  70. desk.ByteWidth = len;
  71. desk.BindFlags = bf;
  72. desk.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
  73. D3D11_SUBRESOURCE_DATA ini;
  74. memset( &ini, 0, sizeof( ini ) );
  75. ini.pSysMem = data;
  76. zRObj->zDevice()->CreateBuffer( &desk, &ini, &buffer );
  77. altLen = len;
  78. }
  79. else if( changed )
  80. {
  81. D3D11_MAPPED_SUBRESOURCE map;
  82. zRObj->zContext()->Map( buffer, 0, D3D11_MAP::D3D11_MAP_WRITE_DISCARD, 0, &map );
  83. memcpy( map.pData, data, len );
  84. zRObj->zContext()->Unmap( buffer, 0 );
  85. changed = 0;
  86. }
  87. #endif
  88. }
  89. // Gibt die Länge eines Elementes in bytes zurück
  90. int DXBuffer::getElementLength() const
  91. {
  92. return elLem;
  93. }
  94. #ifdef WIN32
  95. // Gibt den Buffer zurück
  96. ID3D11Buffer *DXBuffer::zBuffer() const
  97. {
  98. return buffer;
  99. }
  100. #endif
  101. // Gibt die Anzahl der Elemente im Buffer zurück
  102. int DXBuffer::getElementAnzahl() const
  103. {
  104. return altLen / elLem;
  105. }
  106. // Erhöht den Reference Counting Zähler.
  107. // return: this.
  108. DXBuffer *DXBuffer::getThis()
  109. {
  110. ref++;
  111. return this;
  112. }
  113. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  114. // return: 0.
  115. DXBuffer *DXBuffer::release()
  116. {
  117. ref--;
  118. if( !ref )
  119. delete this;
  120. return 0;
  121. }
  122. // Inhalt der DXVertexBuffer Klasse
  123. // Konstruktor
  124. // eSize: Die Länge eines Elementes in Bytes
  125. DXVertexBuffer::DXVertexBuffer( int eSize )
  126. #ifdef WIN32
  127. : DXBuffer( D3D11_BIND_VERTEX_BUFFER, eSize )
  128. #else
  129. : DXBuffer( 0, eSize )
  130. #endif
  131. {}
  132. // Destruktor
  133. DXVertexBuffer::~DXVertexBuffer()
  134. {}
  135. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  136. // return: 0.
  137. DXBuffer *DXVertexBuffer::release()
  138. {
  139. ref--;
  140. if( !ref )
  141. delete this;
  142. return 0;
  143. }
  144. // Inhalt der DXIndexBuffer Klasse
  145. // Konstruktor
  146. // eSize: Die Länge eines Elementes in Bytes
  147. DXIndexBuffer::DXIndexBuffer( int eSize )
  148. #ifdef WIN32
  149. : DXBuffer( D3D11_BIND_INDEX_BUFFER, eSize )
  150. #else
  151. : DXBuffer( 0, eSize )
  152. #endif
  153. {}
  154. // Destruktor
  155. DXIndexBuffer::~DXIndexBuffer()
  156. {}
  157. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  158. // return: 0.
  159. DXBuffer *DXIndexBuffer::release()
  160. {
  161. ref--;
  162. if( !ref )
  163. delete this;
  164. return 0;
  165. }