-
Notifications
You must be signed in to change notification settings - Fork 0
26.3 Sign and Hanging Sign Culling
In Minecraft 26.3, signs and hanging signs feature two-sided text capabilities (SignTextSlot.FRONT and SignTextSlot.BACK). By default, the game's font rendering engine parses, kerns, and renders text quads, dyes, and glowing outlines for both sides simultaneouslyβeven when the player is looking directly at the front of a wall-mounted sign.
Camera Culling solves this by calculating normal vector dot products (
| Property | Value |
|---|---|
| Target Pipeline |
BlockEntityRenderDispatcher.tryExtractRenderState @At("RETURN")
|
| API Hook |
signState.frontText = null; / signState.backText = null;
|
| Supported Types | Wall Signs, Standing Signs, Wall Hanging Signs, Ceiling Hanging Signs |
| Empty Fast-Pass | Automatically skips blank faces with zero non-whitespace characters |
| Dot Product Margin | Tolerance of |
To determine whether the front or back face of a sign is pointing towards the camera, Camera Culling calculates the dot product between the sign face normal vector
The normal vector is derived directly from the block's Direction step offsets:
2. Standing Signs (StandingSignBlock.ROTATION) & Ceiling Hanging Signs (CeilingHangingSignBlock.ROTATION)
Rotation is represented as an integer
The dot product
-
Front Face Evaluation: Culled when
$D < -0.05$ (Camera is behind the sign face). -
Back Face Evaluation: Culled when
$D > 0.05$ (Camera is in front of the sign face).
If a player has only written text on one side of a sign (or placed a sign without text as a barrier/decoration), Camera Culling inspects the 4 text lines:
public static boolean isTextEmpty(SignText text) {
if (text == null) return true;
for (Component msg : text.getMessages(false)) {
if (msg != null && !msg.getString().trim().isEmpty()) {
return false;
}
}
return true;
}Blank faces are nulled out immediately without running trigonometry or vector dot products.
Camera Culling Documentation β’ Part of the Vanilla Outsider Collection
Author: Dasik (Rifaditya) β’ Licensed under GNU General Public License v3.0 (GPLv3)
π Repository Source Disclaimer: The documentation in this Wiki reflects the current source code state in the repository, which may include recent unreleased commits ahead of public release builds on CurseForge/Modrinth.
- MC 26.3 Overview
- Entity Occlusion Culling
- Block Entity Culling
- Sign & Hanging Sign Culling
- Particle & Animation Culling
- Mob Crowd Overdraw Defense
- Distance Texture LOD
- Boss & Blacklist Immunity
- Temporal Hysteresis & Math
- Commands & Configuration
- GUI Configuration (YACL)
- Debug Tracing & Diagnostics
- Architecture & Mixins
- Developer Setup & Building
- API & Mod Integration
- MC 26.2 Overview
- Entity Occlusion Culling
- Block Entity Culling
- Sign & Hanging Sign Culling
- Particle & Animation Culling
- Mob Crowd Overdraw Defense
- Distance Texture LOD
- Boss & Blacklist Immunity
- Temporal Hysteresis & Math
- Commands & Configuration
- GUI Configuration (YACL)
- Debug Tracing & Diagnostics
- Architecture & Mixins
- Developer Setup & Building
- API & Mod Integration
- MC 26.1.2 Overview
- Entity Occlusion Culling
- Block Entity Culling
- Sign & Hanging Sign Culling
- Particle & Animation Culling
- Mob Crowd Overdraw Defense
- Distance Texture LOD
- Boss & Blacklist Immunity
- Temporal Hysteresis & Math
- Commands & Configuration
- GUI Configuration (YACL)
- Debug Tracing & Diagnostics
- Architecture & Mixins
- Developer Setup & Building
- API & Mod Integration