Block.cpp 7.5 KB

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