Files
minecraft-pe-0.6.1/src/client/model/geom/Cube.cpp
2026-03-13 16:26:19 +01:00

75 lines
2.5 KiB
C++
Executable File

#include "Cube.h"
#include "ModelPart.h"
#include "../../renderer/Tesselator.h"
#include "../../renderer/gles.h"
#include "../../../util/Mth.h"
Cube::Cube(ModelPart* modelPart, int xTexOffs, int yTexOffs, float x0, float y0, float z0, int w, int h, int d, float g)
: x0(x0),
y0(y0),
z0(z0),
x1(x0 + w),
y1(y0 + h),
z1(z0 + d)
{
float x1 = this->x1;
float y1 = this->y1;
float z1 = this->z1;
x0 -= g;
y0 -= g;
z0 -= g;
x1 += g;
y1 += g;
z1 += g;
if (modelPart->mirror) {
float tmp = x1;
x1 = x0;
x0 = tmp;
}
vertices[0] = VertexPT(x0, y0, z0, 0, 0);
vertices[1] = VertexPT(x1, y0, z0, 0, 8);
vertices[2] = VertexPT(x1, y1, z0, 8, 8);
vertices[3] = VertexPT(x0, y1, z0, 8, 0);
vertices[4] = VertexPT(x0, y0, z1, 0, 0);
vertices[5] = VertexPT(x1, y0, z1, 0, 8);
vertices[6] = VertexPT(x1, y1, z1, 8, 8);
vertices[7] = VertexPT(x0, y1, z1, 8, 0);
VertexPT* ptr = vertices - 1;
VertexPT* u0 = ++ptr;
VertexPT* u1 = ++ptr;
VertexPT* u2 = ++ptr;
VertexPT* u3 = ++ptr;
VertexPT* l0 = ++ptr;
VertexPT* l1 = ++ptr;
VertexPT* l2 = ++ptr;
VertexPT* l3 = ++ptr;
polygons[0] = PolygonQuad(l1, u1, u2, l2, xTexOffs + d + w, yTexOffs + d, xTexOffs + d + w + d, yTexOffs + d + h, modelPart->xTexSize, modelPart->yTexSize); // Right
polygons[1] = PolygonQuad(u0, l0, l3, u3, xTexOffs + 0, yTexOffs + d, xTexOffs + d, yTexOffs + d + h, modelPart->xTexSize, modelPart->yTexSize); // Left
polygons[2] = PolygonQuad(l1, l0, u0, u1, xTexOffs + d, yTexOffs + 0, xTexOffs + d + w, yTexOffs + d, modelPart->xTexSize, modelPart->yTexSize); // Up
polygons[3] = PolygonQuad(u2, u3, l3, l2, xTexOffs + d + w, yTexOffs + d, xTexOffs + d + w + w, yTexOffs, modelPart->xTexSize, modelPart->yTexSize); // Down
polygons[4] = PolygonQuad(u1, u0, u3, u2, xTexOffs + d, yTexOffs + d, xTexOffs + d + w, yTexOffs + d + h, modelPart->xTexSize, modelPart->yTexSize); // Front
polygons[5] = PolygonQuad(l0, l1, l2, l3, xTexOffs + d + w + d, yTexOffs + d, xTexOffs + d + w + d + w, yTexOffs + d + h, modelPart->xTexSize, modelPart->yTexSize); // Back
if (modelPart->mirror) {
for (int i = 0; i < 6; i++)
polygons[i].mirror();
}
}
void Cube::compile(Tesselator& t, float scale) {
for (int i = 0; i < 6; i++) {
polygons[i].render(t, scale);
}
}
Cube* Cube::setId(const std::string& id) {
this->id = id;
return this;
}