Block.cpp 8.1 KB

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