🧱 Oclusão de Entidades (Minecraft 26.1.2)
No Minecraft 26.1.2, a renderização de entidades do cliente extrai estados de renderização para todas as entidades dentro do frustum da câmera — mesmo quando obscurecidas atrás de cavernas, penhascos ou construções. O Camera Culling intercepta essa verificação para evitar que mobs ocluídos consumam processamento de geometria na CPU e chamadas de desenho na GPU.
📋 Informações Rápidas de Oclusão de Entidades
| Propriedade | Valor |
|---|---|
| Pipeline Alvo | EntityRenderer.shouldRender(T, Frustum, double, double, double) |
| Perfil Padrão | SUPER (Extremo) |
| Contexto de Recorte | ClipContext.Block.COLLIDER, ClipContext.Fluid.NONE |
| Filtragem de Chão | Ignora impactos Direction.UP quando altura do impacto $\le Y + 0.15\text{m}$ |
| Oclusão por Folhas | Blocos de renderização sólida e blocos BlockTags.LEAVES ocluem as linhas de visão |
| Bolha de Imunidade | Distância ao quadrado $< \text{minDistanceSq}$ |
🔬 Amostragem Anatômica Multiponto de Linha de Visão
Em vez de um raycast simplista de ponto único que faz os mobs piscarem nas esquinas, o Camera Culling realiza amostragem anatômica multiponto com base no Perfil de Culling selecionado:
[1] Head Top (maxY - 0.05)
\
[2] Eye Position (entity.getEyeY())
\
[3] Upper Torso (minY + height * 0.70)
\
[4] Center of Mass (centerY)
\
[5-8] Elevated Perimeter Flanks (width/depth checks)- Amostra 1: Topo da Cabeça da Entidade (
maxY - 0.05)- Verificação de alta prioridade. Detecta entidades altas espiando por cima de barricadas baixas ou cercas.
- Amostra 2: Posição Anatômica dos Olhos (
getEyeY())- Linha de visão direta da câmera até os olhos do mob.
- Amostra 3: Tronco Superior / Peito (
minY + height * 0.70)- Avalia linhas de visão da parte superior do corpo com segurança acima do nível do solo.
- Amostra 4: Centro de Massa (
(minY + maxY) * 0.5)- Teste geométrico geral do ponto médio.
- Amostras 5–8: Flancos Elevados do Perímetro
- Avalia $(X_{\min} + 0.15, Z_{\min} + 0.15)$, $(X_{\max} - 0.15, Z_{\min} + 0.15)$, etc. Garante que chefes largos (ex.: Devastadores, Wardens, Aranhas) permaneçam visíveis quando seus ombros surgirem de trás de quinas.
🛡️ Filtragem Direcional de Chão e Encostas
Quando um jogador olha para baixo em direção a um mob situado em terreno irregular, um raycast padrão pode colidir com a superfície superior de um bloco próximo aos pés do mob, tratando incorretamente o chão como uma parede oclusora.
O Camera Culling incorpora a Filtragem Direcional de Impacto no Chão: $$\text{Se } \text{hit.getDirection()} == \text{Direction.UP} \quad \text{e} \quad Y_{\text{hit} \le Y_{\text{target} + 0.15\text{m} \implies \text{Linha de Visão Válida (Não Bloqueada)}$$
Isso assegura que mobs atravessando colinas, escadas e terrenos acidentados nunca sejam ocluídos erroneamente.
⚡ Motor de Raycast sem Alocação
Em versões anteriores, a avaliação de 8 pontos de amostra em 100 entidades gerava mais de 180.000 alocações de new Vec3() na heap por segundo, resultando em pausas de coleta de lixo (GC) Young-Gen da JVM.
No 26.1.2, o CullingRaycastHelper passa diretamente as coordenadas primitivas:
public static boolean hasLineOfSight(Level level, Vec3 from, double toX, double toY, double toZ)Essa arquitetura elimina completamente alocações intermediárias na heap a cada quadro.
