#include #include #include "Block.h" #include "Globals.h" #include "CustomDX11API.h" Block::Block(const BlockType* zType, Framework::Vec3 pos, Model3DData* model, Model3DTextur* texture, int maxHP) : Model3D(), zType(zType), location(pos), maxHP((float)maxHP) { transparent = 0; hp = (float)maxHP; memset(sideVisible, 1, 6); Model3D::setPosition((Framework::Vec3)pos + Framework::Vec3{0.5f, 0.5f, 0.5f}); setModelDaten(model); setModelTextur(texture); breakTextur = uiFactory.initParam.bildschirm->zGraphicsApi()->createOrGetTextur("blocks.ltdb/crack.png", 0); memset(lightData, 0, 6 * 6); } Block::~Block() { breakTextur->release(); } void Block::beforeRender(GraphicsApi* api, Shader* zVertexShader, Shader* zPixelShader) { CustomDX11API* cApi = dynamic_cast(api); if (cApi && model->getVertexAnzahl() == 24) { int count = 24; zVertexShader->füllConstBuffer((char*)&count, cApi->getVertexShaderLightBufferIndex(), 4); zVertexShader->füllConstBuffer(lightBuffer, cApi->getVertexShaderLightBufferIndex() + 1, 24 * 4); } } void Block::afterRender(GraphicsApi* api, Shader* zVertexShader, Shader* zPixelShader) { CustomDX11API* cApi = dynamic_cast(api); if (cApi && model->getVertexAnzahl() == 24) { int count = 0; zVertexShader->füllConstBuffer((char*)&count, cApi->getVertexShaderLightBufferIndex(), 4); } } void Block::api(char* message) { // TODO: implement api switch (message[0]) { case 0: // hp change hp = *(float*)(message + 1); break; } } bool Block::isTransparent() const { return transparent; } void Block::setSideVisible(Direction dir, bool visible) { sideVisible[getDirectionIndex(dir)] = visible; } void Block::setLightData(Direction dir, unsigned char* data) { memcpy(lightData + getDirectionIndex(dir) * 6, data, 6); if (model->getVertexAnzahl() == 24) { float dayLightFactor = 1.0; // TODO: day (1.f) - night (0.1f) adjustment const Vertex3D* verticies = model->zVertexBuffer(); for (int i = 0; i < 24; i++) { // TODO: calculate rotations Directions dirs = getDirectionsFromVector(verticies[i].pos); Vec3 light(0, 0, 0); for (int d = 0; d < 6; d++) { if ((dirs | getDirectionFromIndex(d)) == dirs) { light = Vec3(max((unsigned char)((float)lightData[d * 6] * dayLightFactor), light.x), max((unsigned char)((float)lightData[d * 6 + 1] * dayLightFactor), light.y), max((unsigned char)((float)lightData[d * 6 + 2] * dayLightFactor), light.z)); light = Vec3(max(lightData[d * 6 + 3], light.x), max(lightData[d * 6 + 4], light.y), max(lightData[d * 6 + 5], light.z)); } } int l = ((((light.x << 8) | light.y) << 8) | light.z) << 8; *(int*)(lightBuffer + i * 4) = l; } } } Vec3 Block::getLocation() const { return location; } const BlockType* Block::zBlockType() const { return zType; } Textur* Block::zEffectTextur() { if (hp < maxHP) return breakTextur; return 0; } float Block::getEffectPercentage() { return 1 - hp / maxHP; } Text Block::printLightInfo() { Text result = "NORTH[0;-1;0]("; result += (int)lightData[0]; result += ","; result += (int)lightData[1]; result += ","; result += (int)lightData[2]; result += ")\n"; result += "EAST[1;0;0]("; result += (int)lightData[6]; result += ","; result += (int)lightData[7]; result += ","; result += (int)lightData[8]; result += ")\n"; result += "SOUTH[0;1;0]("; result += (int)lightData[12]; result += ","; result += (int)lightData[13]; result += ","; result += (int)lightData[14]; result += ")\n"; result += "WEST[-1;0;0]("; result += (int)lightData[18]; result += ","; result += (int)lightData[19]; result += ","; result += (int)lightData[20]; result += ")\n"; result += "TOP[0;0;1]("; result += (int)lightData[24]; result += ","; result += (int)lightData[25]; result += ","; result += (int)lightData[26]; result += ")\n"; result += "BOTTOM[0;0;-1]("; result += (int)lightData[30]; result += ","; result += (int)lightData[31]; result += ","; result += (int)lightData[32]; result += ")\n"; return result; }