Fix transparent blocks
This commit is contained in:
@@ -93,10 +93,18 @@ interface BlockStateVariant {
|
||||
y: number;
|
||||
}
|
||||
|
||||
// solid: fully opaque. cutout: texels are either opaque or see-through (leaves).
|
||||
// translucent: blended and sorted back to front (water, glass)
|
||||
export const RENDER_LAYERS = ["solid", "cutout", "translucent"] as const;
|
||||
export type RenderLayer = typeof RENDER_LAYERS[number];
|
||||
|
||||
export interface BlockRegistry {
|
||||
id: string;
|
||||
textures: string | TextureSideTopBottom | TextureFront;
|
||||
transparent?: boolean;
|
||||
// solid when not set. anything else doesn't hide its neighbors' faces
|
||||
render_layer?: RenderLayer;
|
||||
// hide faces between two of this block, like glass and water. defaults to true for translucent blocks
|
||||
cull_same?: boolean;
|
||||
alpha?: number;
|
||||
|
||||
has_collision: boolean;
|
||||
|
||||
+19
-4
@@ -1,6 +1,12 @@
|
||||
// the json formats from MODS.md, and converting them to and from the engine's registry entries.
|
||||
// the mod loader uses the from_json direction, tests use both to check nothing is lost
|
||||
import type { BlockRegistry, BlockStateDefinition, ItemRegistry } from "./everything_registry.ts";
|
||||
import {
|
||||
type BlockRegistry,
|
||||
type BlockStateDefinition,
|
||||
type ItemRegistry,
|
||||
RENDER_LAYERS,
|
||||
type RenderLayer,
|
||||
} from "./everything_registry.ts";
|
||||
|
||||
export const FORMAT_VERSION = 1;
|
||||
export const ID_PATTERN = /^[a-z0-9_]+:[a-z0-9_]+$/;
|
||||
@@ -25,6 +31,9 @@ export interface ManifestJson {
|
||||
export interface BlockJson {
|
||||
id: string;
|
||||
textures: BlockTextures;
|
||||
render_layer?: RenderLayer;
|
||||
cull_same?: boolean;
|
||||
// replaced by render_layer, true means translucent
|
||||
transparent?: boolean;
|
||||
alpha?: number;
|
||||
collision?: boolean;
|
||||
@@ -78,7 +87,8 @@ export interface GridRecipe {
|
||||
|
||||
export function block_to_json(block: BlockRegistry, has_item: boolean): BlockJson {
|
||||
const json: BlockJson = { id: block.id, textures: block.textures };
|
||||
if (block.transparent) json.transparent = true;
|
||||
if (block.render_layer && block.render_layer !== "solid") json.render_layer = block.render_layer;
|
||||
if (block.cull_same !== undefined) json.cull_same = block.cull_same;
|
||||
if (block.alpha !== undefined) json.alpha = block.alpha;
|
||||
if (!block.has_collision) json.collision = false;
|
||||
if (block.toughness !== undefined) {
|
||||
@@ -101,7 +111,9 @@ export function block_from_json(json: BlockJson): { block: BlockRegistry; has_it
|
||||
textures: json.textures,
|
||||
has_collision: json.collision ?? true,
|
||||
};
|
||||
if (json.transparent) block.transparent = true;
|
||||
const render_layer = json.render_layer ?? (json.transparent ? "translucent" : undefined);
|
||||
if (render_layer && render_layer !== "solid") block.render_layer = render_layer;
|
||||
if (json.cull_same !== undefined) block.cull_same = json.cull_same;
|
||||
if (json.alpha !== undefined) block.alpha = json.alpha;
|
||||
if (json.mining) {
|
||||
block.toughness = json.mining.toughness;
|
||||
@@ -243,7 +255,10 @@ export function validate_block(json: unknown): Problems {
|
||||
(["top", "bottom", "side"].every((k) => typeof textures[k] === "string") ||
|
||||
["front", "side"].every((k) => typeof textures[k] === "string")));
|
||||
if (!texture_ok) problems.push("textures must be a texture id, { top, bottom, side } or { front, side }");
|
||||
for (const key of ["transparent", "collision", "item", "interactive", "replaceable"]) {
|
||||
if (json.render_layer !== undefined && !RENDER_LAYERS.includes(json.render_layer as RenderLayer)) {
|
||||
problems.push(`render_layer must be one of ${RENDER_LAYERS.join(", ")}`);
|
||||
}
|
||||
for (const key of ["cull_same", "transparent", "collision", "item", "interactive", "replaceable"]) {
|
||||
if (json[key] !== undefined && typeof json[key] !== "boolean") problems.push(`${key} must be true or false`);
|
||||
}
|
||||
if (json.alpha !== undefined && (typeof json.alpha !== "number" || json.alpha < 0 || json.alpha > 1)) {
|
||||
|
||||
Reference in New Issue
Block a user