Files
Construct-CN/packs/BP/scripts/classes/Render/VerificationStyle.js
T
wed150 136d5ffa3b
/ build (push) Has been cancelled
Start working at 1.2.0
2026-08-26 09:54:39 +08:00

75 lines
3.1 KiB
JavaScript

import { BlockVerificationLevel } from "../Enums/BlockVerificationLevel";
export const MaterialType = Object.freeze({
OPAQUE: "opaque",
BLEND: "blend"
});
// An incorrect block is drawn slightly outside its cell so it wraps the real
// block instead of z-fighting with it.
const OVERLAY_SCALE = 1.01;
// A missing block is drawn slightly inside its cell so a run of them reads as one mass,
// but when a block is placed there is no z-fighting. This inset is also the one thing
// keeping neighbor culling from being exactly invisible: two missing blocks
// side by side stop short of their shared boundary, so culling the faces they
// present to each other opens a seam visible at a grazing angle. Setting this
// to 1.00 makes every cull exact, but causes z-fighting for placed blocks.
const MISSING_SCALE = 0.995;
// A missing block in a mode that draws no preview (the Classic look): a small see-through cube
// floating in the middle of its cell.
const MARKER_SCALE = 0.90;
const PARTICLE_STYLES = Object.freeze({
[BlockVerificationLevel.NoMatch]: Object.freeze({
color: { red: 1, green: 0, blue: 0, alpha: 0.2 }, scale: OVERLAY_SCALE, material: MaterialType.BLEND
}),
[BlockVerificationLevel.TypeMatch]: Object.freeze({
color: { red: 1, green: 1, blue: 0, alpha: 0.2 }, scale: OVERLAY_SCALE, material: MaterialType.BLEND
}),
[BlockVerificationLevel.Missing]: Object.freeze({
color: { red: 0.55, green: 0.8, blue: 1, alpha: 1 }, scale: MISSING_SCALE, material: MaterialType.OPAQUE
})
});
const MARKER_STYLE = Object.freeze({
color: { red: 0, green: 0, blue: 1, alpha: 0.2 }, scale: MARKER_SCALE, material: MaterialType.BLEND
});
const BOX_STYLES = Object.freeze({
[BlockVerificationLevel.NoMatch]: Object.freeze({
color: { red: 1, green: 0, blue: 0, alpha: 1 }, scale: OVERLAY_SCALE
}),
[BlockVerificationLevel.TypeMatch]: Object.freeze({
color: { red: 1, green: 1, blue: 0, alpha: 1 }, scale: OVERLAY_SCALE
}),
[BlockVerificationLevel.Missing]: Object.freeze({
color: { red: 0.3, green: 0.57, blue: 0.87, alpha: 1 }, scale: 1.00
})
});
// A face the pipeline couldn't resolve.
export const UNRESOLVED_FACE_STYLE = Object.freeze({
color: { red: 0.3, green: 0.57, blue: 0.87, alpha: 0.2 }, material: MaterialType.BLEND
});
// Water is the one block whose texture is authored see-through - Java draws it
// translucent and block/water_still carries an alpha of 180/255, which the
// atlas keeps. The preview's usual material alpha-tests rather than blending,
// which forced every partly-transparent texel solid.
export const WATER_MATERIAL = MaterialType.BLEND;
// Undefined for levels that draw no particle at all.
export function particleStyleOf(verificationLevel, showsBlockPreview) {
if (verificationLevel === BlockVerificationLevel.Missing && !showsBlockPreview)
return MARKER_STYLE;
return PARTICLE_STYLES[verificationLevel];
}
// Undefined for levels that get no box. That is what makes a cell going to
// Match or Air a removal rather than a recolour.
export function boxStyleOf(verificationLevel) {
return BOX_STYLES[verificationLevel];
}