134 lines
4.4 KiB
JavaScript
134 lines
4.4 KiB
JavaScript
import Point from "../render/isometric/Point.js";
|
|
import IsometricRenderer from "../render/isometric/IsometricRenderer.js";
|
|
import EnumBlockFace from "../../util/EnumBlockFace.js";
|
|
|
|
export default class Gui {
|
|
|
|
constructor(minecraft = null) {
|
|
this.minecraft = minecraft;
|
|
}
|
|
|
|
getTexture(id) {
|
|
return this.minecraft.resources[id];
|
|
}
|
|
|
|
drawCenteredString(stack, string, x, y, color = -1) {
|
|
this.minecraft.fontRenderer.drawString(stack, string, x - this.getStringWidth(stack, string) / 2, y, color);
|
|
}
|
|
|
|
drawString(stack, string, x, y, color = -1) {
|
|
this.minecraft.fontRenderer.drawString(stack, string, x, y, color);
|
|
}
|
|
|
|
getStringWidth(stack, string) {
|
|
return this.minecraft.fontRenderer.getStringWidth(string);
|
|
}
|
|
|
|
drawRect(stack, left, top, right, bottom, color, alpha = 1) {
|
|
stack.save();
|
|
stack.fillStyle = color;
|
|
stack.globalAlpha = alpha;
|
|
stack.fillRect(Math.floor(left), Math.floor(top), Math.floor(right - left), Math.floor(bottom - top));
|
|
stack.restore();
|
|
}
|
|
|
|
drawTexture(stack, texture, x, y, width, height, alpha = 1.0) {
|
|
Gui.drawSprite(stack, texture, 0, 0, 256, 256, x, y, width, height, alpha);
|
|
}
|
|
|
|
drawSprite(stack, texture, spriteX, spriteY, spriteWidth, spriteHeight, x, y, width, height, alpha = 1.0) {
|
|
Gui.drawSprite(stack, texture, spriteX, spriteY, spriteWidth, spriteHeight, x, y, width, height, alpha);
|
|
}
|
|
|
|
drawBackground(stack, texture, width, height, scale = 2) {
|
|
let pattern = stack.createPattern(texture, "repeat");
|
|
stack.save();
|
|
stack.filter = "brightness(50%)";
|
|
stack.scale(scale, scale);
|
|
stack.rect(0, 0, width / scale, height / scale);
|
|
stack.fillStyle = pattern;
|
|
stack.fill();
|
|
stack.restore();
|
|
}
|
|
|
|
renderBlock(stack, texture, block, x, y) {
|
|
let scale = 0.18;
|
|
|
|
let blockWidth = 32 * scale;
|
|
|
|
let sideY = 16 * scale;
|
|
let sideHeight = 40 * scale;
|
|
let middleTopHeight = 32 * scale;
|
|
let middleBottomHeight = 40 * scale;
|
|
|
|
let topTip = new Point(0, -middleTopHeight);
|
|
let center = new Point(0, 0);
|
|
let bottomTip = new Point(0, middleBottomHeight);
|
|
|
|
let topLeft = new Point(-blockWidth, -middleTopHeight + sideY);
|
|
let bottomLeft = new Point(-blockWidth, -middleTopHeight + sideY + sideHeight);
|
|
|
|
let topRight = new Point(blockWidth, -middleTopHeight + sideY);
|
|
let bottomRight = new Point(blockWidth, -middleTopHeight + sideY + sideHeight);
|
|
|
|
let trianglesLeft = IsometricRenderer.createTriangles(
|
|
texture,
|
|
topLeft,
|
|
center,
|
|
bottomTip,
|
|
bottomLeft
|
|
);
|
|
|
|
let trianglesRight = IsometricRenderer.createTriangles(
|
|
texture,
|
|
center,
|
|
topRight,
|
|
bottomRight,
|
|
bottomTip
|
|
);
|
|
|
|
let trianglesTop = IsometricRenderer.createTriangles(
|
|
texture,
|
|
topLeft,
|
|
topTip,
|
|
topRight,
|
|
center
|
|
);
|
|
|
|
stack.save();
|
|
stack.translate(x + 0.5, y + 0.5);
|
|
stack.imageSmoothingEnabled = true;
|
|
this.renderBlockFace(stack, texture, block, trianglesLeft, EnumBlockFace.NORTH);
|
|
this.renderBlockFace(stack, texture, block, trianglesRight, EnumBlockFace.EAST);
|
|
this.renderBlockFace(stack, texture, block, trianglesTop, EnumBlockFace.TOP);
|
|
stack.restore();
|
|
}
|
|
|
|
renderBlockFace(stack, texture, block, triangles, face) {
|
|
// UV Mapping
|
|
let textureIndex = block.getTextureForFace(face);
|
|
let minU = (textureIndex % 16) / 16.0;
|
|
let minV = Math.floor(textureIndex / 16) / 16.0;
|
|
|
|
stack.save();
|
|
IsometricRenderer.render(stack, triangles, _ => this.drawSprite(stack, texture, minU * 256, minV, 16, 16, 0, 0, 256, 256));
|
|
stack.restore();
|
|
}
|
|
|
|
static drawSprite(stack, texture, spriteX, spriteY, spriteWidth, spriteHeight, x, y, width, height, alpha = 1.0) {
|
|
stack.save();
|
|
stack.globalAlpha = alpha;
|
|
stack.drawImage(
|
|
texture,
|
|
Math.floor(spriteX),
|
|
Math.floor(spriteY),
|
|
Math.floor(spriteWidth),
|
|
Math.floor(spriteHeight),
|
|
Math.floor(x),
|
|
Math.floor(y),
|
|
Math.floor(width),
|
|
Math.floor(height)
|
|
);
|
|
stack.restore();
|
|
}
|
|
} |