FactoryCraftModel.cpp 3.9 KB

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