Textur.cpp 4.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167
  1. #include "Textur.h"
  2. #include "Bild.h"
  3. #ifdef WIN32
  4. #include <d3d11.h>
  5. #endif
  6. using namespace Framework;
  7. // Inhalt der Textur Klasse
  8. // Konstruktor
  9. Textur::Textur()
  10. {
  11. bild = 0;
  12. lastGr = Punkt( 0, 0 );
  13. id = -1;
  14. ref = 1;
  15. }
  16. // Destruktor
  17. Textur::~Textur()
  18. {
  19. if( bild )
  20. bild->release();
  21. }
  22. // Setzt einen Zeiger auf das Bild, welches die Textur enthält
  23. // b: Der Zeiger auf das Bild
  24. void Textur::setBildZ( Bild *b )
  25. {
  26. if( bild )
  27. bild->release();
  28. bild = b;
  29. }
  30. // Setzt das Bild welches die Textur enthält, indem es kopiert wird
  31. // b: Das Bild, was kopiert werden soll
  32. void Textur::setBild( Bild *b )
  33. {
  34. if( !b )
  35. return;
  36. if( !bild || bild->getBreite() != b->getBreite() || bild->getHeight() != b->getHeight() )
  37. {
  38. if( !bild )
  39. bild = new Bild();
  40. bild->neuBild( b->getBreite(), b->getHeight(), 0 );
  41. }
  42. bild->drawBild( 0, 0, bild->getBreite(), bild->getHeight(), *b );
  43. b->release();
  44. }
  45. // Gibt einen Zeiger auf das Bild zurück
  46. Bild *Textur::getBild() const
  47. {
  48. return bild ? bild->getThis() : 0;
  49. }
  50. // Gibt einen Zeiger auf das Bild ohne erhöhten Reference Counter zurück
  51. Bild *Textur::zBild() const
  52. {
  53. return bild;
  54. }
  55. // Gibt die Id der Textur zurück, wenn sie in einer TexturList registriert wurde. (siehe Framework::zTexturRegister())
  56. int Textur::getId() const
  57. {
  58. return id;
  59. }
  60. // Erhöht den Reference Counting Zähler.
  61. // return: this.
  62. Textur *Textur::getThis()
  63. {
  64. ref++;
  65. return this;
  66. }
  67. // Verringert den Reference Counting Zähler. Wenn der Zähler 0 erreicht, wird das Zeichnung automatisch gelöscht.
  68. // return: 0.
  69. Textur *Textur::release()
  70. {
  71. ref--;
  72. if( !ref )
  73. delete this;
  74. return 0;
  75. }
  76. DX11Textur::DX11Textur( ID3D11Device *device, ID3D11DeviceContext *context )
  77. : Textur(),
  78. txt( 0 ),
  79. view( 0 ),
  80. device( device ),
  81. context( context )
  82. {}
  83. DX11Textur::~DX11Textur()
  84. {
  85. if( txt )
  86. txt->Release();
  87. if( view )
  88. view->Release();
  89. }
  90. // Aktualisiert die Textur. Die Pixel des aktuellen Bildes werden in den Graphikspeicher kopiert
  91. bool DX11Textur::updateTextur()
  92. {
  93. if( !bild )
  94. return 0;
  95. #ifdef WIN32
  96. if( !txt || lastGr != bild->getSize() )
  97. {
  98. if( txt )
  99. txt->Release();
  100. txt = 0;
  101. D3D11_TEXTURE2D_DESC bufferDesc;
  102. memset( &bufferDesc, 0, sizeof( D3D11_TEXTURE2D_DESC ) );
  103. bufferDesc.ArraySize = 1;
  104. bufferDesc.Width = bild->getBreite();
  105. bufferDesc.Height = bild->getHeight();
  106. bufferDesc.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
  107. bufferDesc.BindFlags = D3D11_BIND_SHADER_RESOURCE;
  108. bufferDesc.CPUAccessFlags = D3D11_CPU_ACCESS_WRITE;
  109. bufferDesc.SampleDesc.Count = 1;
  110. bufferDesc.MipLevels = 1;
  111. bufferDesc.Usage = D3D11_USAGE_DYNAMIC;
  112. HRESULT r = device->CreateTexture2D( &bufferDesc, 0, &txt );
  113. if( r != S_OK )
  114. return 0;
  115. }
  116. D3D11_MAPPED_SUBRESOURCE buffer;
  117. context->Map( txt, 0, D3D11_MAP::D3D11_MAP_WRITE_DISCARD, 0, &buffer );
  118. int *bgBuff = bild->getBuffer();
  119. int tmpBr = 4 * bild->getBreite();
  120. for( int y = 0, pitch = 0, bry = 0; y < bild->getHeight(); ++y, pitch += buffer.RowPitch, bry += bild->getBreite() )
  121. memcpy( &( (BYTE *)buffer.pData )[ pitch ], ( void * ) & ( bgBuff[ bry ] ), tmpBr );
  122. context->Unmap( txt, 0 );
  123. if( !view || lastGr != bild->getSize() )
  124. {
  125. if( view )
  126. view->Release();
  127. view = 0;
  128. D3D11_SHADER_RESOURCE_VIEW_DESC resourceDesk;
  129. memset( &resourceDesk, 0, sizeof( D3D11_SHADER_RESOURCE_VIEW_DESC ) );
  130. resourceDesk.Format = DXGI_FORMAT_B8G8R8A8_UNORM;
  131. resourceDesk.ViewDimension = D3D11_SRV_DIMENSION_TEXTURE2D;
  132. resourceDesk.Texture2D.MipLevels = 1;
  133. HRESULT r = device->CreateShaderResourceView( txt, &resourceDesk, &view );
  134. if( r != S_OK )
  135. return 0;
  136. }
  137. lastGr = bild->getSize();
  138. #endif
  139. return 1;
  140. }
  141. // Gibt true zurük, wenn updateTextur aufgerufen werden muss
  142. bool DX11Textur::brauchtUpdate() const
  143. {
  144. return !view;
  145. }
  146. // Gibt die verwendtete Shader Resource View zurück
  147. DX11Textur::operator ID3D11ShaderResourceView *( ) const
  148. {
  149. return view;
  150. }