Skip to content

🪧 2-Sided Sign & Hanging Sign Text Culling (Minecraft 26.2) ​

In Minecraft 26.2, signs feature two-sided text rendering. The game's font rendering engine draws glyph quads, colors, and glow outlines on both sides simultaneously.

Camera Culling eliminates unnecessary text rendering passes via normal vector dot products ($\vec{N} \cdot \vec{V}$) and empty-text fast passes.


📋 Sign Culling Infobox ​

PropertyValue
Target PipelineBlockEntityRenderDispatcher.tryExtractRenderState @At("RETURN")
API HooksignState.frontText = null; / signState.backText = null;
Supported TypesWall Signs, Standing Signs, Wall Hanging Signs, Ceiling Hanging Signs
Empty Fast-PassAutomatically skips blank faces with zero text characters
Dot Product MarginTolerance of $\pm 0.05$ prevents edge-angle pop-in

📐 Vector Normal Dot-Product Mathematics ​

$$\vec{V} = (X_{\text{cam} - (X_{\text{sign} + 0.5), Z_{\text{cam} - (Z_{\text{sign} + 0.5))$$

1. Wall Signs & Wall Hanging Signs ​

Derived directly from block Direction step offsets: $$N_x = \text{facing.getStepX()}, \quad N_z = \text{facing.getStepZ()}$$

2. Standing Signs & Ceiling Hanging Signs ​

$$\theta = \left(\frac{\text{rotation} \times 360^\circ}{16}\right) \times \frac{\pi}{180}$$ $$N_x = -\sin\theta, \quad N_z = \cos\theta$$

3. Visibility Determination ​

$$D = N_x V_x + N_z V_z$$

  • Front Text: Culled when $D < -0.05$.
  • Back Text: Culled when $D > 0.05$.

⚡ Empty-Side Fast-Pass ​

java
public static boolean isTextEmpty(SignText text) {
    if (text == null) return true;
    for (int i = 0; i < 4; i++) {
        Component msg = text.getMessage(i, false);
        if (msg != null && !msg.getString().trim().isEmpty()) {
            return false;
        }
    }
    return true;
}

Blank faces are nulled out immediately without calculating dot products.


Official documentation & web portal for Dasik Igaijinn mods.