Mapping et Hammer

func_detail ou world brush : que mettre où dans Hammer

func_detail ou world brush ? Règles claires et mesures d’une compilation test : ce qui rend étanche, ce qui coupe les visleafs, quelles erreurs mènent au leak.

Un brush reste un world brush quand il rend la map étanche vers l’extérieur ou bloque la vue entre deux zones : murs extérieurs, sols, plafonds et cloisons. Le reste de la géométrie solide en brushes devient du func_detail, c’est-à-dire les piliers, les marches, les encadrements, les moulures et les meubles. La raison, c’est le calcul de visibilité : seuls les world brushes découpent l’espace en visleafs et en portals. Dans une pièce de test avec 64 piliers, VVIS a signalé 180 portals. Avec les mêmes piliers en func_detail, il en a signalé 4.

Ce que les world brushes font pour la visibilité

VBSP construit un arbre BSP à partir des world brushes. Chaque plan sur lequel repose une face de brush peut diviser l’espace. Il en reste des portions d’espace convexes, les visleafs, et entre les leafs voisins, les portals. Deux autres choses découlent du même arbre :

  • Étanchéité : VBSP inonde l’arbre en partant des entités. Si l’inondation atteint le vide, il signale **** leaked ****.
  • Faces : Les faces visibles sont divisées le long des découpes, donc beaucoup de découpes signifient aussi beaucoup de petites faces.

Le code source de VBSP que Valve a publié avec le Source SDK 2013 est sans ambiguïté sur l’ordre : l’arbre, les portals et le test de leak sont créés exclusivement à partir des brushes sans le flag de détail. Les brushes de détail ne sont ajoutés qu’ensuite.

Ce que func_detail y change

func_detail n’est pas une entité qui existe en jeu. Au chargement, VBSP déplace ses brushes dans le monde, les marque comme détail et supprime l’entité. Ce qui en découle :

  • Aucune influence sur la visibilité. Les brushes de détail ne créent ni visleafs ni portals, mais ils ne bloquent pas la vue non plus.
  • Pas d’étanchéité. Ils sont absents du test de leak.
  • Toujours solides. Dans le BSP, ils conservent le flag de la géométrie solide. Les joueurs et les props entrent en collision avec eux comme avec n’importe quel mur.
  • Pas de nom, pas d’inputs. En dehors des niveaux DirectX, le FGD ne définit aucun keyvalue, et func_detail ne peut être ni déplacé ni masqué en jeu.
  • Les faces du monde restent entières. D’après le FGD, un mur n’est pas découpé quand un détail est posé dessus.

Dans le compile log, tu reconnais les brushes de détail à trois lignes supplémentaires de VBSP :

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

Le test : 64 piliers en world brushes et en func_detail

Pour cet article, une pièce de 2048 sur 2048 unités et de 256 unités de haut a été compilée avec les compilateurs de GMod : une fois vide, une fois avec une grille de 64 piliers (32 sur 32 unités, du sol au plafond) en world brushes et une fois avec les mêmes piliers en func_detail.

MesurePièce videPiliers en world brushesPiliers en func_detail
portalclusters (VVIS)41004
numportals (VVIS)41804
Faces dans le BSP96560352
dont faces de sol3614036
Brushes dans le BSP67070

Pour VVIS, la pièce avec les piliers de détail est identique à la pièce vide. Le nombre de brushes reste le même, donc func_detail ne soulage pas la limite de brushes décrite dans les limites des maps Source. Les piliers en world brushes divisent en plus le sol en beaucoup de petites faces, alors que sous des piliers de détail il reste dans les mêmes 36 morceaux que dans la pièce vide.

Les 180 portals n’apportent rien ici : VVIS a signalé en moyenne 92 clusters visibles sur 100, parce que des piliers étroits ne cachent presque rien.

Les deux variantes se compilent en moins d’une seconde. Le test montre donc le mécanisme, pas le temps d’attente. Sur une map entière, l’effet s’additionne pour donner les temps de compilation de l’article sur VVIS qui prend une éternité.

Règles : ce qui devient du détail et ce qui ne le devient jamais

ÉlémentTypeRaison
Murs extérieurs, sol et plafond de l’enveloppeWorld brushrendent la map étanche
Cloisons et dalles entre les piècesWorld brushbloquent la vue
Piliers, poutres, caisses, meubles faits de brushesfunc_detailne cachent presque rien, créent beaucoup de découpes
Marches, rambardes, encadrements de fenêtres et de portes, mouluresfunc_detailpure décoration
Arches, cylindres, formes pivotées et inclinéesfunc_detaildécoupent l’espace selon des angles défavorables

La question de contrôle pour chaque brush : la map cesserait-elle d’être étanche, ou pourrait-on voir dans une autre zone, si ce brush manquait ? Si oui, il reste un world brush. Si non, sélectionne-le et transforme-le en détail avec Ctrl+T (Tie to Entity).

Erreurs typiques

L’erreur la plus fréquente est un brush de détail qui fait partie de l’enveloppe extérieure. Dans le test, l’un des quatre murs a été transformé en func_detail. VBSP a signalé le leak et n’a écrit aucun fichier de portals. La troisième ligne vient de VVIS, qui s’est alors interrompu (chemin raccourci) :

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

La solution : sélectionne le brush et renvoie-le dans le monde avec Ctrl+Shift+W (Move to World). Corriger l’erreur de leak explique comment trouver l’endroit. D’autres erreurs qui ont la même cause :

  • Un trou que seul un détail referme. Un encadrement de fenêtre ou un pilier dans un angle comble un vide dans l’enveloppe. Dans l’éditeur, ça a l’air étanche, mais pour VBSP il y a un trou.
  • Areaportal dans un cadre en détail. VBSP détermine aussi les zones des areaportals avant d’ajouter les brushes de détail, donc l’ouverture dans laquelle se trouve un func_areaportal doit être entourée de world brushes. Plus de détails dans Areaportals, hints et occluders.
  • Tout est en détail. Il ne reste alors plus rien pour bloquer la vue, et le moteur dessine des pièces situées derrière des murs. Le lien est expliqué dans optimiser les performances d’une map GMod.

func_brush, props et displacements en comparaison

TypeDécoupe les visleafsRend étanchePilotable en jeu
World brushouioui, sauf si son matériau est translucidenon
func_detailnonnonnon
func_brushnonnonoui
prop_staticnonnonnon
Displacementnonnonnon

Utilise func_brush quand un brush doit faire quelque chose en jeu : il a un nom, s’active et se désactive avec les inputs Enable et Disable, et peut être rendu non solide via le keyvalue « Solidity ». En contrepartie, c’est une vraie entité et il occupe un slot à l’exécution, voir la limite d’edicts et « no free edicts ». D’après le FGD, il ne projette des ombres de lightmap que si tu règles « Shadows » sur « Yes ».

Les objets aux formes fines ou souvent répétés sont mieux en modèle, voir prop_static, prop_dynamic et prop_physics. Le terrain se construit en displacement avec un world brush simple en dessous. Dans le test, un mur extérieur avec une face en displacement a mené à un leak, exactement comme le mur en détail.

Rendre l’effet visible

Le contrôle le plus important se trouve au début de la sortie de VVIS. Dans le test avec les piliers en world brushes, elle ressemblait à ceci :

 100 portalclusters
 180 numportals

Note numportals avant et après une modification. Ces outils aident aussi :

  • Charger le fichier de portals. Map > Load Portal File affiche dans l’éditeur les portals de la dernière compilation. VBSP écrit le fichier .prt à côté du VMF, mais seulement si la map n’a pas de leak.
  • Masquer les détails. Dans la liste des visgroups, il y a une entrée « World Details » sous « Auto ». Sans la coche, les brushes de détail disparaissent. Les world brushes qui restent sont l’enveloppe avec laquelle VBSP travaille.
  • Compiler sans les détails. D’après son texte d’aide, le paramètre -nodetail de VBSP retire toute la géométrie de détail. Ce qui reste détermine la visibilité.
  • Faire vérifier le log. Le Map Scanner détecte les causes racines, les erreurs en cascade et les solutions adaptées dans les logs VBSP, VVIS et VRAD.

Questions fréquentes

Est-ce important de regrouper plusieurs brushes dans un seul func_detail ?

Pas pour le résultat. VBSP déplace tous les brushes de détail dans le monde et supprime l’entité. La façon dont tu les regroupes ne compte que pour garder l’éditeur bien rangé.

Comment construire un mur extérieur arrondi ?

En deux couches : à l’extérieur, une enveloppe simple et droite en world brushes qui rend étanche, et devant, la forme arrondie en func_detail. Applique tools/toolsnodraw sur les côtés de l’enveloppe que personne ne voit.

Pourquoi ma pièce vide a-t-elle quand même plusieurs visleafs ?

Parce que VBSP découpe en plus le long d’une grille fixe : toutes les 1024 unités sur les axes X et Y, d’après le code source du SDK 2013. La pièce de test vide de 2048 sur 2048 unités se composait de quatre visleafs, et les quatre portals se trouvaient sur les lignes à 1024 unités.