Block.cpp 7.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  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. bool Block::tick(double time)
  50. {
  51. if (needRequestModelInfo)
  52. {
  53. needRequestModelInfo = 0;
  54. World::INSTANCE->zClient()->blockAPIRequest(location, "\0", 1);
  55. }
  56. return FactoryCraftModel::tick(time);
  57. }
  58. void Block::setFlow(char flowOptions, char distanceToSource)
  59. {
  60. this->flowOptions = flowOptions;
  61. this->distanceToSource = distanceToSource;
  62. }
  63. void Block::api(char* message)
  64. {
  65. switch (message[0])
  66. {
  67. case 0: // hp change
  68. {
  69. hp = *(float*)(message + 1);
  70. setDestroyedState(1 - hp / maxHP);
  71. Model3D* mdl = World::INSTANCE->getCurrentTarget();
  72. if (mdl == this)
  73. {
  74. World::INSTANCE->zSelectedEffectModel()->setDestroyedState(
  75. 1 - hp / maxHP);
  76. }
  77. if (mdl) mdl->release();
  78. break;
  79. }
  80. case 1: // model change
  81. {
  82. ModelInfo* old = currentModelInfo;
  83. ByteArrayReader reader(message + 1, 10000, 0);
  84. currentModelInfo = new ModelInfo(&reader);
  85. setModelData(currentModelInfo->getModel());
  86. setSize(currentModelInfo->getSize());
  87. setModelTextur(currentModelInfo->getTexture());
  88. if (old)
  89. {
  90. delete old;
  91. }
  92. // TODO: update chunk gpu data
  93. break;
  94. }
  95. case 2: // update fluid state
  96. {
  97. flowOptions = message[1];
  98. distanceToSource = message[2];
  99. // TODO: update fluid gpu data
  100. break;
  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 sum[6];
  127. memset(sum, 0, 6 * sizeof(int));
  128. int count = 0;
  129. for (int i = 0; i < 6; i++)
  130. {
  131. bool notZero = 0;
  132. for (int j = 0; j < 6; j++)
  133. {
  134. sum[j] += *(lightData + i * 6 + j);
  135. notZero |= *(lightData + i * 6 + j) > 0;
  136. }
  137. if (notZero)
  138. {
  139. ++count;
  140. }
  141. }
  142. unsigned char average[6];
  143. for (int i = 0; i < 6; i++)
  144. {
  145. sum[i] = count > 0 ? sum[i] / count : 0;
  146. }
  147. setLightBuffer(average);
  148. }
  149. const unsigned char* Block::getLightData(Direction dir) const
  150. {
  151. return lightData + getDirectionIndex(dir) * 6;
  152. }
  153. __int64 Block::getMaxLight() const
  154. {
  155. unsigned char max[6];
  156. max[0] = max[1] = max[2] = max[3] = max[4] = max[5] = 0;
  157. for (int i = 0; i < 6; i++)
  158. {
  159. for (int j = 0; j < 6; j++)
  160. {
  161. if (lightData[i * 6 + j] > max[j]) max[j] = lightData[i * 6 + j];
  162. }
  163. }
  164. return ((__int64)max[0] << 24) | ((__int64)max[1] << 16)
  165. | ((__int64)max[2] << 8) | ((__int64)max[3] << 56)
  166. | ((__int64)max[4] << 48) | ((__int64)max[5] << 40);
  167. }
  168. bool Block::isVisible() const
  169. {
  170. return true;
  171. // return sideVisible[0] || sideVisible[1] || sideVisible[2] ||
  172. // sideVisible[3]
  173. // || sideVisible[4] || sideVisible[5];
  174. }
  175. Direction Block::getFrontDirection() const
  176. {
  177. return frontDirection;
  178. }
  179. Vec3<int> Block::getLocation() const
  180. {
  181. return location;
  182. }
  183. const BlockType* Block::zBlockType() const
  184. {
  185. return zType;
  186. }
  187. Skeleton* Block::zSkeleton() const
  188. {
  189. return skelett;
  190. }
  191. Text Block::printLightInfo()
  192. {
  193. Text result = "NORTH[0;-1;0](";
  194. result.append() << (int)lightData[0] << "," << (int)lightData[1] << ","
  195. << (int)lightData[2] << ";" << (int)lightData[3] << ","
  196. << (int)lightData[4] << "," << (int)lightData[5] << ")\n"
  197. << "EAST[1;0;0](" << (int)lightData[6] << ","
  198. << (int)lightData[7] << "," << (int)lightData[8] << ";"
  199. << (int)lightData[9] << "," << (int)lightData[10] << ","
  200. << (int)lightData[11] << ")\n"
  201. << "SOUTH[0;1;0](" << (int)lightData[12] << ","
  202. << (int)lightData[13] << "," << (int)lightData[14] << ";"
  203. << (int)lightData[15] << "," << (int)lightData[16] << ","
  204. << (int)lightData[17] << ")\n"
  205. << "WEST[-1;0;0](" << (int)lightData[18] << ","
  206. << (int)lightData[19] << "," << (int)lightData[20] << ";"
  207. << (int)lightData[21] << "," << (int)lightData[22] << ","
  208. << (int)lightData[23] << ")\n"
  209. << "TOP[0;0;1](" << (int)lightData[24] << ","
  210. << (int)lightData[25] << "," << (int)lightData[26] << ";"
  211. << (int)lightData[27] << "," << (int)lightData[28] << ","
  212. << (int)lightData[29] << ")\n"
  213. << "BOTTOM[0;0;-1](" << (int)lightData[30] << ","
  214. << (int)lightData[31] << "," << (int)lightData[32] << ";"
  215. << (int)lightData[33] << "," << (int)lightData[34] << ","
  216. << (int)lightData[35] << ")\n";
  217. switch (frontDirection)
  218. {
  219. case NORTH:
  220. result += "Front: NORTH\n";
  221. break;
  222. case EAST:
  223. result += "Front: EAST\n";
  224. break;
  225. case SOUTH:
  226. result += "Front: SOUTH\n";
  227. break;
  228. case WEST:
  229. result += "Front: WEST\n";
  230. break;
  231. case TOP:
  232. result += "Front: TOP\n";
  233. break;
  234. case BOTTOM:
  235. result += "Front: BOTTOM\n";
  236. break;
  237. }
  238. return result;
  239. }
  240. char Block::getFlowOptions() const
  241. {
  242. return flowOptions;
  243. }
  244. char Block::getDistanceToSource() const
  245. {
  246. return distanceToSource;
  247. }
  248. const ModelInfo& Block::getCurrentModelInfo() const
  249. {
  250. return currentModelInfo ? *currentModelInfo : zType->getModelInfo();
  251. }