FactoryCraftModel.cpp 3.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158
  1. #include "FactoryCraftModel.h"
  2. #include <Shader.h>
  3. #include "CustomDX11API.h"
  4. #include "Globals.h"
  5. #include "World.h"
  6. FactoryCraftModel::FactoryCraftModel()
  7. : Model3D()
  8. {
  9. vertexLightBuffer = 0;
  10. lightBuffer = 0;
  11. vertexLightBufferCount = 0;
  12. visible = 1;
  13. destroyedState = 0;
  14. breakTextur
  15. = uiFactory.initParam.bildschirm->zGraphicsApi()->createOrGetTextur(
  16. "blocks.ltdb/crack.png", 0);
  17. effectAlpha = 0;
  18. memset(averageLight, 0, 8);
  19. }
  20. FactoryCraftModel::~FactoryCraftModel()
  21. {
  22. breakTextur->release();
  23. if (vertexLightBuffer) vertexLightBuffer->release();
  24. delete[] lightBuffer;
  25. }
  26. struct TexturEffect
  27. {
  28. bool enabled;
  29. float percentage;
  30. };
  31. void FactoryCraftModel::beforeRender(Framework::GraphicsApi* api,
  32. Framework::Shader* zVertexShader,
  33. Framework::Shader* zPixelShader)
  34. {
  35. if (!World::INSTANCE) return;
  36. CustomDX11API* cApi = dynamic_cast<CustomDX11API*>(api);
  37. if (cApi)
  38. {
  39. char buffer[8];
  40. *(int*)buffer
  41. = vertexLightBufferCount == 0 ? 1 : vertexLightBufferCount;
  42. *(float*)(buffer + 4) = World::INSTANCE->getDayLightFactor();
  43. zVertexShader->füllConstBuffer(
  44. buffer, cApi->getVertexShaderLightBufferIndex(), 8);
  45. if (vertexLightBuffer)
  46. {
  47. cApi->setVertexLightBuffer(vertexLightBuffer);
  48. }
  49. else
  50. {
  51. World::INSTANCE->zFallbackVertexLightBuffer()->setData(
  52. averageLight);
  53. World::INSTANCE->zFallbackVertexLightBuffer()->setChanged();
  54. World::INSTANCE->zFallbackVertexLightBuffer()->copieren(8);
  55. cApi->setVertexLightBuffer(
  56. World::INSTANCE->zFallbackVertexLightBuffer());
  57. }
  58. if (destroyedState > 0 && effectAlpha)
  59. {
  60. TexturEffect e = {1, 1.f + destroyedState};
  61. zPixelShader->füllConstBuffer((char*)&e, 3, sizeof(TexturEffect));
  62. }
  63. }
  64. }
  65. void FactoryCraftModel::afterRender(Framework::GraphicsApi* api,
  66. Framework::Shader* zVertexShader,
  67. Framework::Shader* zPixelShader)
  68. {
  69. if (!World::INSTANCE) return;
  70. CustomDX11API* cApi = dynamic_cast<CustomDX11API*>(api);
  71. if (cApi)
  72. {
  73. char buffer[8];
  74. *(int*)buffer = 0;
  75. *(float*)(buffer + 4) = World::INSTANCE->getDayLightFactor();
  76. zVertexShader->füllConstBuffer(
  77. buffer, cApi->getVertexShaderLightBufferIndex(), 8);
  78. }
  79. }
  80. void FactoryCraftModel::setVertexLightBuffer(__int64* data, int vertexCount)
  81. {
  82. if (!vertexLightBuffer)
  83. {
  84. vertexLightBuffer = uiFactory.initParam.bildschirm->zGraphicsApi()
  85. ->createStructuredBuffer(16);
  86. }
  87. if (lightBuffer)
  88. {
  89. delete[] lightBuffer;
  90. }
  91. lightBuffer = data;
  92. vertexLightBufferCount = vertexCount;
  93. vertexLightBuffer->setData(data);
  94. vertexLightBuffer->setLength(vertexCount * 8);
  95. vertexLightBuffer->copieren();
  96. }
  97. __int64* FactoryCraftModel::zLightBuffer()
  98. {
  99. if (vertexLightBuffer)
  100. {
  101. vertexLightBuffer->setChanged();
  102. }
  103. return lightBuffer;
  104. }
  105. void FactoryCraftModel::copyLightToGPU()
  106. {
  107. if (vertexLightBuffer)
  108. {
  109. vertexLightBuffer->copieren();
  110. }
  111. }
  112. void FactoryCraftModel::setVisible(bool visible)
  113. {
  114. this->visible = visible;
  115. }
  116. void FactoryCraftModel::setDestroyedState(float percentage)
  117. {
  118. destroyedState = percentage;
  119. }
  120. void FactoryCraftModel::setUseEffectAlpha(bool useAlpha)
  121. {
  122. effectAlpha = useAlpha;
  123. }
  124. bool FactoryCraftModel::needRenderPolygon(int index)
  125. {
  126. return visible;
  127. }
  128. Textur* FactoryCraftModel::zEffectTextur()
  129. {
  130. return destroyedState > 0 ? breakTextur : 0;
  131. }
  132. float FactoryCraftModel::getEffectPercentage()
  133. {
  134. return destroyedState;
  135. }
  136. void FactoryCraftModel::setAverageLight(unsigned char light[3])
  137. {
  138. *(averageLight + 5) = light[2];
  139. *(averageLight + 6) = light[1];
  140. *(averageLight + 7) = light[0];
  141. }