Textur.cpp 4.1 KB

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