нуллбраши не должны поедать видимые браши. Давайте я немного проясню с терминологией.
Клипбраш - это детальный браш, он вообще не влияет на видимый хулл и как следствие не затрагивает обычные браши при CSG. Но из-за того что он детальный, им нельзя заделывать наружные стенки уровня. Нуллбраш - это структуральный колоизационный браш, он влияет на разбиение обычных брашей.
И на CSG в том числе. То есть это просто невидимые фейсы, которые наравне с хинтами участвуют в разбиении пространства. А потом удаляются из финальной карты. Но BSP плевать на наличие текстуры или текстурной матрицы, он ориентируется только по плоскости. Т.е. на уровне BSP всё происходит штатно. Проблемы начинаются именно в CSG. CSG как известно вычитает одни браши из других, а потом, по возможности склеивает эти результаты в новые браши. Есть несколько критериев, по которым это осуществляется.
1. контентс браша. Ну понятно, скай режет воду, солиды режут скай и все режут empty.
2. detaillevel - если он совпадает, то старший браш в списке режет младший
если не совпадает, то старший детайллевел режет младший
3. порядок следования брашей - самое главное. Второй браш режет первый, третий режет второй и так далее.
Понятное дело, что браши никаким чудом не могут случайно распологаться таким образом, чтобы корректно друг-друга порезать, поэтому перед CSG их обычно сортируют по контентсам, обеспечивая выполнение первого и третьего условия, а второе выполняется уже в процессе CSG. С сортировкой раньше были некоторые баги, которые китаец успешно исправил, но главный баг - остался.
Дело в том, что нуллбраши имеют точно такой CONTENTS_SOLID как и видимые.
А теперь внимание - как они друг-друга порежут при CSG? Как-то!
Это типичный UB. Я помню в 2004-м или в 2005-м Миг-29 делал какой-то маленький мод про халфу и у него были загадочные дырки в полигонах, причём карта не ликовала. Народ еще выразился в том плане, что это были "продвинутые глюки". Вот как раз из-за неопредёлённости вычитания между видимым и невидимым брашем. Очевидно отсюда же лезут лики при любой попытке сделать какую-нибудь лошадку моделькой, однажды точности эпсилона просто нехватает и невидимый браш сжирает сторону видимого. Хотя визуально кажется что там всё ровно. Отсюда же и видимый эффект при накрутке эпсилона, хотя и нестабильный. Но в действительности всё дело только лишь в приоритете. Нулл не должен жрать видимый браш ни при каких раскладах. Если это внешние фейсы - они удалятся в любом случае. А если внутренние - вы будете наслаждаться вот такими "ликами". Но сортировка по контентсам вообще не предполагает задание явного порядка следования для особых случаев - я не смогу втиснуть новый контентс с нужным номером, т.к. эти номера часть спецификации формата. Да это и не нужно. Надо просто ввести уровни приоритета для каждого браша и сортировать уже по ним.
Отдельно еще хочу сказать за клипноды. Тут кристаллайз жаловался, что даже несмотря на все китайские оптимизации по прежнему какое-то говно лезет. Самое любопытное, что все кто делал карты под кваку не жаловались на плохую колоизацию никогда. Это прерогатива тех, кто кубал под халфу. Код надувания брашей в халфе и кваке совершенно разный. Почему так? Вальва переделывала код для поддержки мультипоточности. А потом всякие китайцы его исправляли. А потом еще запускали дополнительный проход для исправления исправленный клипнодов (FixBrinks). И в итоге вся эта порнография нормально не работала никогда. Клипноды может и экономила, но приглючивала. Надо просто вернуть классический код надувания брашей.