FactoryCraftModel.cpp 3.8 KB

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