Skip to content

🪧 Culling Teks Papan Tanda & Tanda Gantung 2 Sisi (Minecraft 26.3) ​

Dalam Minecraft 26.3, papan tanda dan tanda gantung memiliki kapabilitas teks dua sisi (SignTextSlot.FRONT dan SignTextSlot.BACK). Secara bawaan, mesin render font game mengurai, melakukan kerning, dan me-render quad teks, pewarna, serta garis luar bercahaya untuk kedua sisi secara bersamaan—bahkan ketika pemain melihat langsung ke sisi depan papan tanda yang menempel di dinding.

Camera Culling mengatasi ini dengan menghitung perkalian titik vektor normal ($\vec{N} \cdot \vec{V}$) dan fast-pass teks kosong untuk tidak me-render permukaan teks papan tanda yang tidak terlihat atau kosong.


📋 Informasi Singkat Culling Papan Tanda ​

PropertiNilai
Target PipelineBlockEntityRenderDispatcher.tryExtractRenderState @At("RETURN")
Hook APIsignState.frontText = null; / signState.backText = null;
Tipe yang DidukungWall Signs, Standing Signs, Wall Hanging Signs, Ceiling Hanging Signs
Fast-Pass Teks KosongMelewati permukaan kosong secara otomatis dengan nol karakter teks non-spasi
Margin Perkalian TitikToleransi $\pm 0.05$ mencegah terjadinya pop-in di sudut tepi

📐 Matematika Perkalian Titik Vektor Normal ​

Untuk menentukan apakah sisi depan atau belakang papan tanda menghadap ke arah kamera, Camera Culling menghitung perkalian titik antara vektor normal permukaan papan tanda $\vec{N} = (N_x, N_z)$ dan vektor dari pusat papan tanda ke kamera $\vec{V} = (V_x, V_z)$:

$$V_x = X_{\text{cam} - (X_{\text{sign} + 0.5), \quad V_z = Z_{\text{cam} - (Z_{\text{sign} + 0.5)$$

1. Wall Signs (WallSignBlock.FACING) & Wall Hanging Signs (WallHangingSignBlock.FACING) ​

Vektor normal diturunkan langsung dari offset langkah Direction blok: $$N_x = \text{facing.getStepX()}, \quad N_z = \text{facing.getStepZ()}$$

2. Standing Signs (StandingSignBlock.ROTATION) & Ceiling Hanging Signs (CeilingHangingSignBlock.ROTATION) ​

Rotasi direpresentasikan sebagai bilangan bulat $0 \dots 15$. Sudut $\theta$ dalam radian dihitung sebagai berikut: $$\theta = \left(\frac{\text{rotation} \times 360^\circ}{16}\right) \times \frac{\pi}{180}$$ $$N_x = -\sin\theta, \quad N_z = \cos\theta$$

3. Penentuan Visibilitas ​

Perkalian titik $D$ mengevaluasi sudut pengamatan: $$D = N_x V_x + N_z V_z$$

  • Evaluasi Teks Depan: Di-cull saat $D < -0.05$ (Kamera berada di belakang permukaan papan tanda).
  • Evaluasi Teks Belakang: Di-cull saat $D > 0.05$ (Kamera berada di depan permukaan papan tanda).

⚡ Fast-Pass Sisi Kosong ​

Jika pemain hanya menulis teks pada satu sisi papan tanda (atau menempatkan tanda tanpa teks sebagai penghalang/dekorasi), Camera Culling memeriksa 4 baris teks:

java
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;
}

Permukaan kosong diatur ke null seketika tanpa menjalankan trigonometri atau perkalian titik vektor.


🔗 Halaman Terkait ​

Official documentation & web portal for Dasik Igaijinn mods.