Textur.cpp 4.1 KB

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