Propper++
Инструмент Propper++ в
Hammer++ позволяет превращать брашворк в модели, или объединять разные модели в одну. Он служит как полная замена устаревшему Propper.
Установка
Перед использованием Propper++ Вы должны указать StudioMDL в Tools -> Options -> Build Programs -> MDL executable. Это компилятор, который сделает модели для движка.
bin вместо bin/win64.Базовое использование
Браши
В первую очередь выберите браши, которые Вы хотите превратить в модели. Если Вы хотите превратить их в одну модель вместо нескольких, то сначала нужно их сгруппировать либо через инструменты групп, либо через превращение их в одну энтити.
Затем откройте Propper++ в меню Tools -> Propper++ или используя сочетание клавиш Ctrl + Shift + P.
Вы увидите множество опций. Практически все из них неважны, кроме Model Path + Name наверху.
Имя в конце станет именем, данным Вашей модели. Поменяйте его на что-нибудь подходящее для модели, например moykrutoystul.
Нажмите Build + Compile и браши должны быть успешно превращены в модель после того, как компилятор закончит работу.
Превращенная брашевая геометрия будет сохранена в визгруппу Propper. Это можно использовать, чтобы сохранить или восстановить изначальную геометрию при необходимости.
Изменение размера пропов
В добавление к превращению брашей в модели, Propper++ поддерживает перенос моделей в другие папки и соединение с другими моделями. Пропущенные через Propper++ модели свои скины, бодигруппы и скейлинг по умолчанию. Это полезно, например, для простого изменения размера prop_static в играх, которые это не поддерживают, вместо использования неудобного метода декомпиляции и последующей рекомпиляции моделей вручную.
Чтобы изменить размер prop_static во всех направлениях одновременно, превратите его в prop_dynamic, чтобы поменять Model Scale, или же добавьте значение modelscale, выключив SmartEdit.
Также можно сменить значение Scale в меню Propper++. Можно использовать отрицательные значения, чтобы отразить модель по какой-либо из осей.
Объединение брашей и моделей
Также возможно объединять браши и модели в общую модель. Чтобы это сделать, нужно сгруппировать выделение, используя инструменты групп, а затем использовать Propper++ как обычно.
Продвинутое использование
Редактирование перед компиляцией
Иногда изменение сгенерированных файлов модели может быть полезно. Например, чтобы добавить дополнительные параметры (такие как $texturegroup), или чтобы изменить меши. В Propper++ это поддерживается через использование двухэтапного процесса: Build и Compile. Обычно оба этих шага запускаются одновременно, но при необходимости их можно запустить вручную.
- Кнопка Build сгенерирует файлы QC и SMD для модели.
- Кнопка Compile отправит сгенерированные файлы в компилятор, а потом заменит выделенные объекты, если включена такая опция.
Таким образом, вы можете нажать Build-Only, отредактировать получившиеся файлы, а затем нажать Compile-Only, чтобы скомпилировать модель.
Передвижение ориджина модели или точки освещения
По умолчанию, ориджин сгенерированной модели и точка освещения распожены в центре границ выбранной геометрии.
При использовании Propper++ на брашевой энтити, у которой есть параметр origin, будет использовано значение именно из этого параметра.
Положение освещения можно заменить, указав свой ориджин освещения на любой выбранной модели. Propper++ прочитает первый, который найдет, и будет использовать его как новый $illumposition.
Добавление скинов
Смотрите $texturegroup, чтобы получить больше информации про добавление скинов.
Откройте Ваш кастомный QC, созданный Propper++, и добавьте следующий код куда-нибудь внутрь файла:
$cdmaterials "models/mycustomfolder" "models/lorem/mycustomfolder2" $texturegroup "skinfamilies" { { "default_texture" } // Скин 0 - стандартный { "custom_texture_1" } // Скин 1 { "custom_texture_2" } // Скин 2 { "custom_texture_3" } // Скин 3 [...] }
Стандартный вариант (скин 0) должен быть текстурой по умолчанию, а скины 1 - 32 должны быть текстурой, которую Вы хотите заменить.
Если Вы хотите заменить больше одной текстуры, Вы можете добавить следующий код:
$cdmaterials "models/mycustomfolder" "models/lorem/mycustomfolder2"
$texturegroup "skinfamilies"
{
{ "(1)random_texture" "(2)random_texture" [...] } // Случайные стандартные текстуры как пример
{ "baggagecarousel04" "helicopter_news2" [...] } // Пример
{ "baggagecarousel04" "acvent05" [...] } // Пример
{ "acunit01" "acvent05" [...] } // Пример
[...]
}
Первая колонка заменит первую стандартную текстуру (1), а вторая колонка будет заменять вторую текстуру (2).
После добавления скинов, Вам нужно нажать кнопку Compile Only в меню Propper++, чтобы рекомпилировать модель.
Массовая конвертация
Когда выделены несколько групп брашей, каждая из них будет превращена в свою индивидуальную модель. Когда такое происходит, в меню Propper++ появится предупреждение. При генерации названия моделей они будут иметь цифровой номер, добавленный к концу названия модели.
Дисплейсменты
Дисплейсменты так же можно конвертировать, используя Propper++. Однако в отличие от брашей, для дисплейсментов не будет построена коллизия. Это намеренно, так как автоматически сгенерированная модель коллизии для дисплейсментов была бы очень дорогой и возможно вызывала бы задержки на сервере (каждый треугольник должен быть отдельной невогнутой частью коллизии). Если Вам требуется коллизия для дисплейсментов, постройте им упрощённые версии из брашей и укажите их в параметре Entity name as physics mesh.
Ещё одно ограничение заключается в том, что смешанные текстуры не появятся после конвертации, так как модели не поддерживают повертексное смешивание текстур.
Объединение статичных пропов
Propper++ так же может быть использован для объединения пропов с целью оптимизации, похожего на Static Prop Combine в более новых играх. Демонстрация прироста производительности от объединения статичных пропов в один находится справа.
Объединение улучшает производительность, уменьшая количество запросов на отрисовку. Вкратце: запросы на отрисовку - метод, которым пользуется процессор, чтобы сказать видеокарте что и как нужно отрисовать. Эта коммуникация дорогая и современные игры обычно стараются как можно больше сократить количество запросов на отрисовку. Каждый проп в игре будет создавать новый запрос на отрисовку. Если в пропе несколько материалов, то каждый из них будет создавать новый запрос на отрисовку. Объединяя пропы, количество таких запросов уменьшается. Со слов Valve: использование объединения статичных пропов на картах CS:GO (которые используют очень много статичных пропов) улучшило производительность на 40%.
При поиске моделей для объединения, убедитесь, что Вы следуете этим принципам:
- Вы должны объединять только те модели, которые делят одни и те же материалы - иначе пользы от объединения не будет. Разные материалы всё ещё будут создавать новые запросы. Например, не объединяйте дерево с коробкой, но объединяйте коробку с другими такими же коробками.
- Объединяйте модели, которые находятся рядом. Объединение моделей расширит границы пропа и сделает отрезку его рендера ареапорталами или чем-либо ещё менее вероятной.
- Старайтесь не объединять модели, которые имеют коллизию и не находятся близко, так как физический движок не сможет эффективно оптимизировать такую модель. Если Вам нужно такое сделать, то отключайте коллизию или делайте упрощённую физическую модель самостоятельно.
- Не объединяйте объекты, проходящие через или под тень, если модели не поддерживают повертексное освещение (т.е. ни один из материалов не имеет $bumpmap или $phong). Объединенный проп будет использовать освещение только из своего центра и по этой причине может смотреться странно в месте, где проходит тень. Альтернативно, разделите объединенный проп напополам по границе тени, чтобы обе стороны получали правильное освещение.
Чтобы легко находить скопления пропов, которые можно объединить, используйте команду r_colorstaticprops 1 в игре. Каждый уникальный цвет пропа означает, что он создаёт новый запрос на отрисовку. После объединения пропов, Вы заметите, что они имеют один цвет (что хорошо).
Если Вы замечаете плохое освещение на объединенных пропах (например, такие пропы становятся очень тёмными), то причиной этого может быть ориджин освещения, находящийся в геометрии. Чтобы это исправить, используйте info_lighting.
Освещение статичных пропов
В некоторых играх prop_static поддерживает использование лайтмапа, сгенерированного VRAD. Однако у этой функции есть большие ограничения:
- Пропы с пересекающейся UV-развёрткой или несколькими материалами не могут быть правильно освещены.
- Брашевая геометрия, превращённая в модели, не может быть правильно освещена в связи с искажённой UV-развёрткой.
- Материалы, использующие $bumpmap или $phong не могут быть освещены.
Функция Lightmap Atlas обходит все эти ограничения. Она берёт выбранные модели и (или) браши и генерирует одну непересекающуюся UV-развёртку (или "атлас") для всей модели, а потом накладывает на неё текстуры. Она также автоматически убирает бампмапы и фонг с материалов.
Чтобы использовать эту функцию, включите Generate atlas.
Измените ширину и высоту атласа на своё усмотрение. Внешний вид будет зависеть от самой геометрии, от количества объединенных объектов и так далее, так что экспериментируйте с этим. Оставляйте разрешение степенью двойки. Более высокие разрешения будут иметь более хорошее качество текстур и больший вес. Это не размер лайтмапа - он указывается отдельно в настройках prop_static.
Есть 4 формата сжатия на выбор: DXT1, DXT5, RGB888 и RGBA8888. Форматы DXT сжаты, остальные - нет и поэтому имеют улучшенное качество, но гораздо больший размер файла. DXT1 и RGB888 не поддерживают прозрачность, сохраняя размер файла. Вы не должны использовать DXT5 или RGBA8888, если Вам не нужен альфа-канал для чего-либо (например для маски для $envmap)
Наконец, можно отключить билинейную фильтрацию для повышенной чёткости текстуры, однако это субъективно и зависит от текстуры и модели. Некоторые выглядят лучше, некоторые хуже. Обычно эту опцию не стоит выключать.
После построения и компиляции модели, она будет готова для лайтмапного освещения. Смотрите статью про prop_static для деталей. Если текстура смотрится слишком "мыльно", увеличьте разрешение атласа или уменьшите количество объединяемых пропов.
Текстуры-атласы сохраняются в Material Path + Model Name, если Вы хотите на них посмотреть.
Запечение Ambient Occlusion
Добавлено в сборке 8870: теперь в атлас можно запечь AO. Это полезно для создания более естественно выглядящих пропов, так как
VRAD по умолчанию не использует ambient occlusion.
Для включения этой функции выставьте галочку рядом с надписью Bake AO. У запечения есть некоторые настройки, которые можно изменить.
- Samples
- Количество семплов (проб), влияющее на качество AO. Большее количество семплов займёт больше времени. Hammer++ распределяет запечение на несколько потоков, но этот процесс всё равно может занять несколько секунд с высоким количеством семплов.
- Radius
- Радиус эффекта AO. Чем меньше значение, тем менее заметны изменения.
- Margin
- Отступ от краёв AO для избежания проблем. Бóльшие значения предотвращают заметные швы, однако они могут вызвать наплыв эффекта на соседние UV-острова.
- Opacity
- Непрозрачность AO при умножении на основную текстуру.
Настройки
- Model Path + Name
Это путь и название модели, которая будет сгенерирована. он находится относительно папки models в Вашей игре. Например, в Garry's Mod, "propper/moykrutoystul" сгенерирует модель по этому пути:
<path-to-exe>/garrysmod/models/propper/moykrutoystul.mdl
Все маркеры $vmf будут заменены на название текущего VMF. Это удобно для организации файлов и для ограничения конфликтов между картами, если они делят модели с одинаковыми названиями.
- Add incremental suffix if already existing MDL name is found
Когда включено, то при нахождении MDL с таким же названием, как в Model Path + Name, к названию модели будет добавлен цифровой номер (_0, _1 и так дале). Этот номер будет увеличиваться, пока не найдётся неконфликтующее название. Параметр полезен для предотвращения случайной перезаписи существующих моделей, после которой прежние файлы было бы невозможно восстановить. Отключите эту опцию, если Вы хотите перезаписать модель новыми файлами (или просто удалите существующую модель).
- Source file directory
Это место, где будут расположены файлы, необходимые для компиляции итоговой модели. Как и в предыдущих параметрах, этот путь может быть либо относительно директории игры, либо полным путём до любой директории в файловой системе. Этот параметр так же поддерживает маркеры $vmf.
Пример с Garry's Mod: modelsrc/propper/rpassets положит исходные файлы (SMD и QC) в эту директорию:
<path-to-exe>/garrysmod/modelsrc/propper/rpassets
- Material path
Это папка, в которой появятся сконвертированные материалы. Материалы для брашей обычно используют шейдер LightmappedGeneric, несовместимый с моделями, так что Propper++ конвертирует эти шейдеры в VertexLitGeneric. Как и ранее, этот параметр относителен папки materials в директории игры. Поддерживаются маркеры $vmf, которые автоматически заменяются на название файла, который сейчас открыт в Hammer.
Пример использования с Garry's Mod: выставленный путь models/propper/rpassets сгенерирует материалы в эту директорию:
<path-to-exe>/garrysmod/materials/models/propper/rpassets
- Entity name as physics mesh
Указывает, какая именная энтити должна быть использована как модель коллизии. Это полезно для создания упрощённых физических моделей для сложной геометрии. Поставив этот параметр на $self, модель будет использовать выделение как физическую модель. Если оставить этот параметр пустым, то коллизии не будет. Имена энтити не будут работать, если выделить несколько групп объектов.
- Entity classname
Если включен параметр Creaty entity after compile, то выделенные объекты будет заменены энтити с этим классом и сгенерированной моделью.
- Surfaceprop
$surfaceprop модели. Если оставить пустым, то материал, который покрывает самую большую площадь, будет выбран как материал поверхности. Если в выделении есть модели, то будет использован $surfaceprop той модели, которая появляется чаще остальных.
- Scale
Размер по осям X, Y и Z для модели. Поддерживаются отрицательные числа: если их ввести, то Propper++ автоматически исправит направление, в которое смотрят стороны.
- Mass
Заменяет массу модели. Если оставить пустым, то масса будет автоматически вычислена компилятором, используя $automass.
- Smoothing angle
Сглаживает нормали вертексов, угол между которыми меньше, чем значение этого параметра. Похож на -smooth в VRAD. 0 полностью отключает сглаживание. Полезно для округлых форм: цилиндров, сфер, арок.
- Relocate materials
Если включено, передвигает брашевые материалы в папку, указанную в Material path. Это предотвращает замену обычных материалов на новые.
- Rename shaders
Если включено, то шейдеры LightmappedGeneric, WorldVertexTransition и Water будут переименованы в VertexLitGeneric.
- $concave collision
Включает $concave (вогнутые) модели коллизии. Если выключено, то компилятор сделает shrinkwrap на модели, чтобы создать новую модель коллизии.
- Remove bad collision faces
Маленькие или тонкие стороны брашей могут вызывать проблемы при компиляции коллизии. Этот параметр автоматически удалит такие стороны (добавив $remove2d в $collisionmodel).
- Skip nodraw faces
Пропускает добавление полигонов, покрытых tools/toolsnodraw, к видимой геометрии. Они всё ещё будут добавлены к модели коллизии.
- Wait for keypress after compile
Если включено, то закрытие окна компилятора не произойдёт, пока не будет нажата какая-либо клавиша. Полезно для проверки на предупреждения или ошибки.
- Create entity after compile
Если включено, то заменит выделение новой энтити со сгенерированной моделью.
- Move selection to 'Propper' visgroup
Если включено, то выделение сохраняется в визгруппу под названием "Propper" после компиляции.
- $casttextureshadows
Добавляет команду $casttextureshadows в QC. Полезно для работы теней от полупрозрачных поверхностей в VRAD (с -textureshadows) без ручного добавления модели в lights.rad
- Lightmap Atlas
Смотрите секцию про продвинутое использование выше.
Параметры
Propper++ использует следующие параметры:
- Origin (origin) <origin>
- Если в данной группе есть только одна энтити, то параметр Origin будет использован, как ориджин получившейся SMD-модели.
- Pitch Yaw Roll (Y Z X) (angles) <углы>
- Поворачивает получившуюся SMD-модель.
- Name (targetname) <целевой объект>
- Lighting Origin (lightingorigin) <целевой объект>
- Выставляет $illumposition на основе положения указанной именной энтити.
- Model (model) <путь к модели>
- MDL для использования.
- Skin (skin) <целое число>
- Скин используемой MDL.
- Bodygroup (body) <целое число>
- Бодигруппы модели.
- Uniform Model Scale (modelscale) <число с плавающей запятой>
- Масштабирует получившийся меш по всем осям.