DXBuffer.cpp 3.6 KB

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