Block.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. #include "Block.h"
  2. #include <Shader.h>
  3. #include <Texture.h>
  4. #include "CustomDX12API.h"
  5. #include "Globals.h"
  6. Block::Block(const BlockType* zType,
  7. Framework::Vec3<int> pos,
  8. Model3DData* model,
  9. Model3DTexture* texture,
  10. int maxHP,
  11. bool transparent,
  12. bool needRequestModelInfo,
  13. float size,
  14. bool passable,
  15. float speedModifier,
  16. Direction frontDirection)
  17. : FactoryCraftModel(),
  18. zType(zType),
  19. location(pos),
  20. maxHP((float)maxHP),
  21. needRequestModelInfo(needRequestModelInfo),
  22. flowOptions(0),
  23. distanceToSource(0),
  24. passable(passable),
  25. speedModifier(speedModifier),
  26. currentModelInfo(0),
  27. frontDirection(frontDirection)
  28. {
  29. hp = (float)maxHP;
  30. memset(sideVisible, 0, 6);
  31. // Model3D::setAlpha(transparent);
  32. Model3D::setPosition(
  33. (Framework::Vec3<float>)pos + Framework::Vec3<float>{0.5f, 0.5f, 0.5f});
  34. setModelData(model);
  35. setModelTextur(texture);
  36. memset(lightData, 0, 6 * 6);
  37. setSize(size);
  38. Model3D::setRotation(::getRotation(NORTH, frontDirection));
  39. }
  40. Block::~Block()
  41. {
  42. if (currentModelInfo)
  43. {
  44. delete currentModelInfo;
  45. }
  46. }
  47. void Block::beforeRender(
  48. GraphicsApi* api, Shader* zVertexShader, Shader* zPixelShader)
  49. {
  50. if (needRequestModelInfo)
  51. {
  52. needRequestModelInfo = 0;
  53. World::INSTANCE->zClient()->blockAPIRequest(location, "\0", 1);
  54. }
  55. FactoryCraftModel::beforeRender(api, zVertexShader, zPixelShader);
  56. }
  57. void Block::setFlow(char flowOptions, char distanceToSource)
  58. {
  59. this->flowOptions = flowOptions;
  60. this->distanceToSource = distanceToSource;
  61. }
  62. void Block::api(char* message)
  63. {
  64. switch (message[0])
  65. {
  66. case 0: // hp change
  67. {
  68. hp = *(float*)(message + 1);
  69. setDestroyedState(1 - hp / maxHP);
  70. Model3D* mdl = World::INSTANCE->getCurrentTarget();
  71. if (mdl == this)
  72. {
  73. World::INSTANCE->zSelectedEffectModel()->setDestroyedState(
  74. 1 - hp / maxHP);
  75. }
  76. if (mdl) mdl->release();
  77. break;
  78. }
  79. case 1: // model change
  80. {
  81. ModelInfo* old = currentModelInfo;
  82. ByteArrayReader reader(message + 1, 10000, 0);
  83. currentModelInfo = new ModelInfo(&reader);
  84. setModelData(currentModelInfo->getModel());
  85. setSize(currentModelInfo->getSize());
  86. setModelTextur(currentModelInfo->getTexture());
  87. if (old)
  88. {
  89. delete old;
  90. }
  91. // TODO: update chunk gpu data
  92. break;
  93. }
  94. case 2: // update fluid state
  95. {
  96. flowOptions = message[1];
  97. distanceToSource = message[2];
  98. // TODO: update fluid gpu data
  99. }
  100. case 3: // update passable and speed modifier
  101. {
  102. passable = message[1];
  103. speedModifier = *(float*)(message + 2);
  104. break;
  105. }
  106. }
  107. }
  108. void Block::copyLightTo(Block* zB)
  109. {
  110. memcpy(zB->lightData, lightData, 6 * 6);
  111. memcpy(zB->sideVisible, sideVisible, 6);
  112. }
  113. void Block::setLightData(Direction dir, unsigned char* data, Chunk* zC)
  114. {
  115. memcpy(lightData + getDirectionIndex(dir) * 6, data, 6);
  116. if (data[0] | data[1] | data[2] | data[3] | data[4] | data[5])
  117. sideVisible[getDirectionIndex(dir)] = 1;
  118. else
  119. sideVisible[getDirectionIndex(dir)] = 0;
  120. // TODO: update chunk gpu data
  121. int sum1 = 0;
  122. int sum2 = 0;
  123. int sum3 = 0;
  124. for (int i = 0; i < 6; i++)
  125. {
  126. sum1 += *(lightData + i * 6 + 3);
  127. sum2 += *(lightData + i * 6 + 4);
  128. sum3 += *(lightData + i * 6 + 5);
  129. }
  130. unsigned char average[3];
  131. average[0] = (unsigned char)(sum1 / 6);
  132. average[1] = (unsigned char)(sum2 / 6);
  133. average[2] = (unsigned char)(sum3 / 6);
  134. setAverageLight(average);
  135. }
  136. const unsigned char* Block::getLightData(Direction dir) const
  137. {
  138. return lightData + getDirectionIndex(dir) * 6;
  139. }
  140. __int64 Block::getMaxLight() const
  141. {
  142. unsigned char max[6];
  143. max[0] = max[1] = max[2] = max[3] = max[4] = max[5] = 0;
  144. for (int i = 0; i < 6; i++)
  145. {
  146. for (int j = 0; j < 6; j++)
  147. {
  148. if (lightData[i * 6 + j] > max[j]) max[j] = lightData[i * 6 + j];
  149. }
  150. }
  151. return ((__int64)max[0] << 24) | ((__int64)max[1] << 16)
  152. | ((__int64)max[2] << 8) | ((__int64)max[3] << 56)
  153. | ((__int64)max[4] << 48) | ((__int64)max[5] << 40);
  154. }
  155. bool Block::isVisible() const
  156. {
  157. return true;
  158. // return sideVisible[0] || sideVisible[1] || sideVisible[2] ||
  159. // sideVisible[3]
  160. // || sideVisible[4] || sideVisible[5];
  161. }
  162. Direction Block::getFrontDirection() const
  163. {
  164. return frontDirection;
  165. }
  166. Vec3<int> Block::getLocation() const
  167. {
  168. return location;
  169. }
  170. const BlockType* Block::zBlockType() const
  171. {
  172. return zType;
  173. }
  174. Skeleton* Block::zSkeleton() const
  175. {
  176. return skelett;
  177. }
  178. Text Block::printLightInfo()
  179. {
  180. Text result = "NORTH[0;-1;0](";
  181. result.append() << (int)lightData[0] << "," << (int)lightData[1] << ","
  182. << (int)lightData[2] << ";" << (int)lightData[3] << ","
  183. << (int)lightData[4] << "," << (int)lightData[5] << ")\n"
  184. << "EAST[1;0;0](" << (int)lightData[6] << ","
  185. << (int)lightData[7] << "," << (int)lightData[8] << ";"
  186. << (int)lightData[9] << "," << (int)lightData[10] << ","
  187. << (int)lightData[11] << ")\n"
  188. << "SOUTH[0;1;0](" << (int)lightData[12] << ","
  189. << (int)lightData[13] << "," << (int)lightData[14] << ";"
  190. << (int)lightData[15] << "," << (int)lightData[16] << ","
  191. << (int)lightData[17] << ")\n"
  192. << "WEST[-1;0;0](" << (int)lightData[18] << ","
  193. << (int)lightData[19] << "," << (int)lightData[20] << ";"
  194. << (int)lightData[21] << "," << (int)lightData[22] << ","
  195. << (int)lightData[23] << ")\n"
  196. << "TOP[0;0;1](" << (int)lightData[24] << ","
  197. << (int)lightData[25] << "," << (int)lightData[26] << ";"
  198. << (int)lightData[27] << "," << (int)lightData[28] << ","
  199. << (int)lightData[29] << ")\n"
  200. << "BOTTOM[0;0;-1](" << (int)lightData[30] << ","
  201. << (int)lightData[31] << "," << (int)lightData[32] << ";"
  202. << (int)lightData[33] << "," << (int)lightData[34] << ","
  203. << (int)lightData[35] << ")\n";
  204. switch (frontDirection)
  205. {
  206. case NORTH:
  207. result += "Front: NORTH\n";
  208. break;
  209. case EAST:
  210. result += "Front: EAST\n";
  211. break;
  212. case SOUTH:
  213. result += "Front: SOUTH\n";
  214. break;
  215. case WEST:
  216. result += "Front: WEST\n";
  217. break;
  218. case TOP:
  219. result += "Front: TOP\n";
  220. break;
  221. case BOTTOM:
  222. result += "Front: BOTTOM\n";
  223. break;
  224. }
  225. return result;
  226. }
  227. char Block::getFlowOptions() const
  228. {
  229. return flowOptions;
  230. }
  231. char Block::getDistanceToSource() const
  232. {
  233. return distanceToSource;
  234. }
  235. const ModelInfo& Block::getCurrentModelInfo() const
  236. {
  237. return currentModelInfo ? *currentModelInfo : zType->getModelInfo();
  238. }