Mapping y Hammer

func_detail o world brush: qué va en cada sitio en Hammer

¿func_detail o world brush? Reglas claras con mediciones de una compilación de prueba: qué sella, qué corta visleafs y qué errores provocan leaks.

Un brush sigue siendo world brush cuando sella el mapa hacia el exterior o tapa la vista entre dos zonas: paredes exteriores, suelos, techos y tabiques. El resto de la geometría sólida hecha con brushes pasa a ser func_detail, es decir, pilares, escalones, marcos, molduras y muebles. El motivo es el cálculo de visibilidad: solo los world brushes cortan el espacio en visleafs y portales. En una sala de prueba con 64 pilares, VVIS informó de 180 portales. Con los mismos pilares como func_detail informó de 4.

Qué hacen los world brushes por la visibilidad

VBSP construye un árbol BSP a partir de los world brushes. Cada plano en el que se apoya una cara de un brush puede dividir el espacio. Lo que queda son trozos convexos de espacio, los visleafs, y entre leafs vecinos, los portales. Del mismo árbol salen dos cosas más:

  • Sellado: VBSP inunda el árbol partiendo de las entities. Si la inundación llega al vacío, informa de **** leaked ****.
  • Caras: Las caras visibles se dividen a lo largo de los cortes, así que muchos cortes significan también muchas caras pequeñas.

El código fuente de VBSP que Valve publicó con el Source SDK 2013 no deja dudas sobre el orden: el árbol, los portales y la prueba de leak se crean exclusivamente a partir de los brushes sin el flag de detalle. Los brushes de detalle solo se añaden después.

Qué cambia func_detail en todo esto

func_detail no es una entity que exista en el juego. Al cargar, VBSP mueve sus brushes al mundo, los marca como detalle y descarta la entity. Lo que se deriva de ello:

  • Sin influencia en la visibilidad. Los brushes de detalle no crean visleafs ni portales, pero tampoco tapan la vista.
  • No sellan. No entran en la prueba de leak.
  • Siguen siendo sólidos. En el BSP conservan el flag de geometría sólida. Los jugadores y los props chocan con ellos como con cualquier pared.
  • Sin nombre, sin inputs. Aparte de los niveles de DirectX, el FGD no define ningún keyvalue, y func_detail no se puede mover ni ocultar en el juego.
  • Las caras del mundo quedan enteras. Según el FGD, una pared no se trocea cuando tiene un detalle pegado.

En el compile log reconoces los brushes de detalle por tres líneas adicionales de VBSP:

Chop Details...done (0)
Find Visible Detail Sides...done (0)
Merging details...done (0)

La prueba: 64 pilares como world brushes y como func_detail

Para este artículo se compiló con los compiladores de GMod una sala de 2048 por 2048 unidades y 256 unidades de alto: una vez vacía, otra con una cuadrícula de 64 pilares (32 por 32 unidades, de suelo a techo) como world brushes y otra con los mismos pilares como func_detail.

MediciónSala vacíaPilares como world brushesPilares como func_detail
portalclusters (VVIS)41004
numportals (VVIS)41804
Caras en el BSP96560352
de ellas, caras de suelo3614036
Brushes en el BSP67070

Para VVIS, la sala con pilares de detalle es idéntica a la sala vacía. El número de brushes se mantiene, así que func_detail no alivia el límite de brushes de los límites de los mapas de Source. Además, los pilares como world brushes dividen el suelo en muchas caras pequeñas, mientras que bajo pilares de detalle queda en las mismas 36 piezas que en la sala vacía.

Los 180 portales no consiguen nada aquí: VVIS informó de que, de media, 92 de 100 clusters eran visibles, porque unos pilares estrechos no ocultan casi nada.

Las dos variantes compilan en menos de un segundo. Así que la prueba muestra el mecanismo, no el tiempo de espera. En un mapa entero, el efecto se va sumando hasta dar los tiempos de compilación del artículo VVIS tarda una eternidad.

Reglas: qué pasa a ser detalle y qué nunca

ElementoTipoMotivo
Paredes exteriores, suelo y techo de la envolventeWorld brushsellan el mapa
Tabiques y losas de suelo entre salasWorld brushtapan la vista
Pilares, vigas, cajas, muebles hechos con brushesfunc_detailno ocultan casi nada, crean muchos cortes
Escalones, barandillas, marcos de ventanas y puertas, moldurasfunc_detailpura decoración
Arcos, cilindros, formas rotadas e inclinadasfunc_detailcortan el espacio en ángulos desfavorables

La pregunta de control para cada brush es: ¿tendría el mapa un leak, o se podría ver otra zona, si faltara este brush? Si la respuesta es sí, sigue siendo world brush. Si es no, selecciónalo y conviértelo en detalle con Ctrl+T (Tie to Entity).

Errores típicos

El error más habitual es un brush de detalle como parte de la envolvente exterior. En la prueba, una de las cuatro paredes se convirtió en func_detail. VBSP informó del leak y no escribió ningún archivo de portales. La tercera línea es de VVIS, que entonces abortó (ruta acortada):

**** leaked ****
Entity info_player_start (256.00 256.00 1.00) leaked!
LoadPortals: couldn't read ...\d_wall_detail.prt

La solución: selecciona el brush y devuélvelo al mundo con Ctrl+Shift+W (Move to World). Cómo encontrar el punto lo explica solucionar el error de leak del mapa. Más errores con la misma causa:

  • Un hueco que solo cierra un detalle. Un marco de ventana o un pilar en una esquina rellena un hueco de la envolvente. En el editor parece sellado, pero para VBSP ahí hay un agujero.
  • Areaportal en un marco de detalle. VBSP también determina las áreas de los areaportals antes de añadir los brushes de detalle, así que la abertura en la que va un func_areaportal tiene que estar rodeada de world brushes. Más sobre esto en Areaportals, hints y occluders.
  • Todo es detalle. Entonces no queda nada que tape la vista, y el motor renderiza salas que están detrás de paredes. La relación la explica optimizar el rendimiento de un mapa de GMod.

func_brush, props y displacements, comparados

TipoCorta visleafsSellaControlable en el juego
World brushsísí, salvo que su material sea translúcidono
func_detailnonono
func_brushnonosí
prop_staticnonono
Displacementnonono

Usa func_brush cuando un brush tiene que hacer algo en el juego: tiene nombre, se puede activar y desactivar con los inputs Enable y Disable, y se puede hacer no sólido con el keyvalue «Solidity». A cambio, es una entity de verdad y ocupa un slot en tiempo de ejecución, consulta el límite de edicts y «no free edicts». Según el FGD, solo proyecta sombras de lightmap si pones «Shadows» en «Yes».

Los objetos de formas finas o que se repiten mucho quedan mejor como modelo, consulta prop_static, prop_dynamic y prop_physics. El terreno se construye como displacement con un world brush sencillo debajo. En la prueba, una pared exterior con una cara de displacement provocó un leak igual que la pared de detalle.

Hacer visible el efecto

La comprobación más importante está al principio de la salida de VVIS. En la prueba con los pilares como world brushes tenía este aspecto:

 100 portalclusters
 180 numportals

Apunta numportals antes y después de un cambio. Estas herramientas también ayudan:

  • Carga el archivo de portales. Map > Load Portal File muestra en el editor los portales de la última compilación. VBSP escribe el archivo .prt junto al VMF, pero solo si el mapa no tiene ningún leak.
  • Oculta los detalles. En la lista de visgroups hay una entrada «World Details» dentro de «Auto». Sin la marca, los brushes de detalle desaparecen. Los world brushes que quedan son la envolvente con la que trabaja VBSP.
  • Compila sin detalles. Según su texto de ayuda, el parámetro -nodetail de VBSP elimina toda la geometría de detalle. Lo que queda determina la visibilidad.
  • Haz revisar el log. El Map Scanner detecta causas raíz, errores derivados y las soluciones adecuadas en logs de VBSP, VVIS y VRAD.

Preguntas frecuentes

¿Importa si junto varios brushes en un solo func_detail?

Para el resultado, no. VBSP mueve todos los brushes de detalle al mundo y descarta la entity. Cómo los agrupes solo importa para tener el editor ordenado.

¿Cómo construyo una pared exterior curva?

En dos capas: por fuera, una envolvente sencilla y recta de world brushes que sella, y delante de ella la forma curva como func_detail. Aplica tools/toolsnodraw a los lados de la envolvente que nadie ve.

¿Por qué mi sala vacía tiene aun así varios visleafs?

Porque VBSP corta además a lo largo de una cuadrícula fija: cada 1024 unidades en los ejes X e Y, según el código fuente del SDK 2013. La sala de prueba vacía de 2048 por 2048 unidades constaba de cuatro visleafs, y los cuatro portales estaban en las líneas a 1024 unidades.