====== Clipnodes ====== Was genau sind Clipnodes, wie entstehen sie und wie lässt sich der lästige **MAX_MAP_CLIPNODES** Fehler vermeiden, resp. wie reduziert man Clipnodes? Clipnodes werden vom [[glossar:hlbsp|BSP-Compiler]] erstellt und werden dazu benötigt, damit die Engine weiss, wo sich der Spieler bewegen kann, und wo nicht. So erzeugen beispielsweise normale Wände und Böden Clipnodes, so dass der Spieler nicht durch diese hindurch gehen kann. Komplexe Objekte, wie z.B. [[glossar:brush|ausgebrushte]] Geländer, oder Gitter, welche der Spieler sowieso nicht durchqueren kann, erzeugen in ihren Lücken ebenfalls einen Haufen Clipnodes. Diese nützen aber niemandem und treiben nur die Anzahl Clipnodes in die Höhe bis unsere Map nicht mehr kompilierbar wird. Wie vermeidet man nun solche überflüssigen Clipnodes? Die Lösung ist so einfach wie genial. Man erstellt einfach einen [[glossar:clip|CLIP-Brush]], in welchem man seine Detailbrushes "versteckt", also darin einpackt. Der BSP-Compiler berechnet so nur die Clipnodes des äusseren CLIP-Brushes, da die hypothetischen Clipnodes des inneren Detailbrushes vom CLIP-Brush überdeckt werden. ===== Experiment ===== Hier mal eine kleines Beispiel zur Erläuterung: {{glossar:clipnode:clipnodes.png}} Das im Bild grün dargestellte Objekt sind unsere Detailbrushes. Der rote Kasten ist der CLIP-Brush. Wir [[glossar:kompilieren]] nun in verschiedenen Konfigurationen der [[glossar:brush|Brushes]] und schauen, was unsere Clipnodes so machen. * Als erstes kompilieren wir nur mit den Detailbrushes. Den CLIP-Brush entfernen wir zunächst. * Danach kompiliern wir mit den Detailbrushes und dem CLIP-Brush. Beide als Worldbrush. * Jetzt ein weiterer Versuch, ohne CLIP-Brush, dafür machen wir unsere Detailbrushes zu einem [[half-life:entities:func_illusionary]] * Und jetzt das gleiche, einfach als [[half-life:entities:func_wall]] * Und nun nehmen wir den CLIP-Brush als Worldbrush wieder zur Hand, und versuchen so die Clipnodes des leer im Raume stehend Detailbrush-[[glossar:entity|Entitys]] zu kaschieren. * Zu guter letzt noch ein Versuch, in welchem wir den CLIP-Brush zum [[half-life:entities:func_wall]] des Detailbrushes hinzufügen. Und hier nun das Resultat unserer Versuchsreihe: ^ Detailbrush und CLIP-Brush ^ Anzahl erzeugter Clipnodes ^ | Detailbrush als Worldbrush ohne CLIP-Brush | 153 | | Detailbrush als Worldbrush mit CLIP-Brush | 31 | | Detailbrush als func_illusionary ohne CLIP-Brush ((**Vorsicht:** Ältere Compiler berechnen die Clipnodes eines func_illusionarys möglicherweise gleich, wie eines func_walls. Vorheriger Test notwendig!)) | 18 | | Detailbrush als func_wall ohne CLIP-Brush | 210 | | Detailbrush als func_wall mit CLIP-Brush | 223 | | Detailbrush als func_wall und CLIP-Brush als ein Entity | 36 | \\ Erschreckenderweise hat unser Versuch, die Clipnodes eines func_walls mit einem World CLIP-Brush zu kaschieren, die Clipnodes nur noch weiter in die Höhe katapultiert. Erst als wir den CLIP-Brush zum gleichen Entity wie die Detailbrushes hinzugefügt haben, haben sich unsere Clipnodes wieder auf ein erträgliches Mass gesenkt. ===== Fazit ===== * Kleine Details können, **wenn es die Compiler-Tools unterstützen**, getrost zu einem func_illusionary gemacht werden. * Die Clipnodes von Details aus Worldbrushes kann man mit einem simplen CLIP-Brush problemlos überdecken. * Aber sobald wir ein Detail als Entity haben, **muss** der CLIP-Brush zum gleichen Entity gehören, sonst geht der Schuss nach hinten los! ===== Bemerkungen ===== * Für das Experiment wurden die ZHLT Compiler 3.4 verwenden. Mehr Informationen: http://zhlt.info/ * Die Versuchsmap mit dem Detail- und dem CLIP-Brush kann hier herunter geladen werden: {{glossar:clipnode:clipnode.zip}} * Für eine Auswertung der verbrauchten Clipnodes einer Map (und anderen interessanten Daten) genügt es, wenn man den Compilern einfach als Parameter ''-chart'' hinzufügt. \\ Richman //2007/07/05 21:45//