Propper++

From Valve Developer Community
< Ru‎ | Hammer++
Jump to navigation Jump to search
English (en)Português do Brasil (pt-br)Русский (ru)Translate (Translate)

Инструмент Propper++ в Hammer++ Hammer++ позволяет превращать брашворк в модели, или объединять разные модели в одну. Он служит как полная замена устаревшему Propper(en).

Интерфейс Propper++

Установка

Перед использованием Propper++ Вы должны указать StudioMDL(en) в Tools -> Options -> Build Programs -> MDL executable. Это компилятор, который сделает модели для движка.

Warning.pngПредупреждение:(только в Ветвь Team Fortress 2) 64-битный StudioMDL не работает. Вы должны использовать 32-битный, который находится в папке bin вместо bin/win64.

Базовое использование

Браши

В первую очередь выберите браши, которые Вы хотите превратить в модели. Если Вы хотите превратить их в одну модель вместо нескольких, то сначала нужно их сгруппировать либо через инструменты групп(en), либо через превращение их в одну энтити. Затем откройте Propper++ в меню Tools -> Propper++ или используя сочетание клавиш Ctrl + Shift + P.

Вы увидите множество опций. Практически все из них неважны, кроме Model Path + Name наверху. Имя в конце станет именем, данным Вашей модели. Поменяйте его на что-нибудь подходящее для модели, например moykrutoystul.

Нажмите Build + Compile и браши должны быть успешно превращены в модель после того, как компилятор закончит работу. Превращенная брашевая геометрия будет сохранена в визгруппу Propper. Это можно использовать, чтобы сохранить или восстановить изначальную геометрию при необходимости.

Note.pngПримечание:Так как это пользовательские ассеты, Вам необходимо убидеться, что они запакованы в карту когда Вы делитесь ей с другими людьми. Такие инструменты, как CompilePal(en) или VIDE(en) могут помочь Вам с этим.
Warning.pngПредупреждение:Будьте осторожны с конвертацией очень детализированной брашевой геометрии (сотни, тысячи граней). Это создаёт сложную модель коллизии, которая может вызвать плохую производительность. В таком случае Вам стоит или разделить эти браши на несколько групп, или указать другую группу брашей, как упрощённую модель коллизии, используя настройку Entity name as physics mesh
Icon-Bug.pngБаг:Брашевые энтити вне FGD(en) не распознаются Propper++.


Изменение размера пропов

В добавление к превращению брашей в модели, Propper++ поддерживает перенос моделей в другие папки и соединение с другими моделями. Пропущенные через Propper++ модели свои скины, бодигруппы и скейлинг по умолчанию. Это полезно, например, для простого изменения размера prop_static(en) в играх, которые это не поддерживают, вместо использования неудобного метода декомпиляции и последующей рекомпиляции моделей вручную.

Чтобы изменить размер prop_static(en) во всех направлениях одновременно, превратите его в prop_dynamic(en), чтобы поменять Model Scale, или же добавьте значение modelscale, выключив SmartEdit(en).

Tip.pngСовет:В Hammer++ Hammer++ размер пропа, выделенного в 3D окне, можно изменять, зажав Ctrl и вращая колёсико мыши. Зажатие Shift изменяет шаг с 0.5 до 0.05.

Также можно сменить значение Scale в меню Propper++. Можно использовать отрицательные значения, чтобы отразить модель по какой-либо из осей.

Объединение брашей и моделей

Также возможно объединять браши и модели в общую модель. Чтобы это сделать, нужно сгруппировать выделение, используя инструменты групп(en), а затем использовать Propper++ как обычно.

Продвинутое использование

Редактирование перед компиляцией

Иногда изменение сгенерированных файлов модели может быть полезно. Например, чтобы добавить дополнительные параметры (такие как $texturegroup(en)), или чтобы изменить меши. В Propper++ это поддерживается через использование двухэтапного процесса: Build и Compile. Обычно оба этих шага запускаются одновременно, но при необходимости их можно запустить вручную.

  • Кнопка Build сгенерирует файлы QC(en) и SMD(en) для модели.
  • Кнопка Compile отправит сгенерированные файлы в компилятор, а потом заменит выделенные объекты, если включена такая опция.

Таким образом, вы можете нажать Build-Only, отредактировать получившиеся файлы, а затем нажать Compile-Only, чтобы скомпилировать модель.

Tip.pngСовет:Используйте кнопку Explore, чтобы быстро открыть папку со сгенерированными файлами.

Передвижение ориджина модели или точки освещения

По умолчанию, ориджин(en) сгенерированной модели и точка освещения(en) распожены в центре границ(en) выбранной геометрии.

При использовании Propper++ на брашевой энтити, у которой есть параметр origin, будет использовано значение именно из этого параметра.

Положение освещения можно заменить, указав свой ориджин освещения на любой выбранной модели. Propper++ прочитает первый, который найдет, и будет использовать его как новый $illumposition(en).

Подтвердить:Что насчёт использования Propper++ на группах энтити, возможно включающих пропы? Может ли ориджин быть указан каким-либо другим методом?


Добавление скинов

Смотрите $texturegroup(en), чтобы получить больше информации про добавление скинов.

Откройте Ваш кастомный QC(en), созданный Propper++, и добавьте следующий код куда-нибудь внутрь файла:

$cdmaterials(en) "models/mycustomfolder" "models/lorem/mycustomfolder2"
$texturegroup(en) "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++, чтобы рекомпилировать модель.

Tip.pngСовет:Конвертируйте несколько наборов брашей с разными текстурами, которые Вы хотите видеть в скинах. Это освободит Вас от ручного создания материалов для скинов.

Массовая конвертация

Когда выделены несколько групп брашей, каждая из них будет превращена в свою индивидуальную модель. Когда такое происходит, в меню Propper++ появится предупреждение. При генерации названия моделей они будут иметь цифровой номер, добавленный к концу названия модели.

Дисплейсменты

Дисплейсменты(en) так же можно конвертировать, используя Propper++. Однако в отличие от брашей, для дисплейсментов не будет построена коллизия. Это намеренно, так как автоматически сгенерированная модель коллизии для дисплейсментов была бы очень дорогой(en) и возможно вызывала бы задержки на сервере (каждый треугольник должен быть отдельной невогнутой частью коллизии). Если Вам требуется коллизия для дисплейсментов, постройте им упрощённые версии из брашей и укажите их в параметре Entity name as physics mesh.

Ещё одно ограничение заключается в том, что смешанные текстуры не появятся после конвертации, так как модели не поддерживают повертексное смешивание текстур.

Объединение статичных пропов

Сравнение производительности 240 статичных пропов деревьев на пустой карте: не используя настроек, используя расстояние пропадания и объединение Propper++.
Скопление коробок, показанное с использованием r_colorstaticprops 1. Это хороший кандидат для объединения, чтобы сократить 3 запроса на отрисовку до 1.

Propper++ так же может быть использован для объединения пропов с целью оптимизации, похожего на Static Prop Combine(en) в более новых играх. Демонстрация прироста производительности от объединения статичных пропов в один находится справа.

Объединение улучшает производительность, уменьшая количество запросов на отрисовку. Вкратце: запросы на отрисовку - метод, которым пользуется процессор, чтобы сказать видеокарте что и как нужно отрисовать. Эта коммуникация дорогая и современные игры обычно стараются как можно больше сократить количество запросов на отрисовку. Каждый проп в игре будет создавать новый запрос на отрисовку. Если в пропе несколько материалов, то каждый из них будет создавать новый запрос на отрисовку. Объединяя пропы, количество таких запросов уменьшается. Со слов Valve: использование объединения статичных пропов на картах CS:GO (которые используют очень много статичных пропов) улучшило производительность на 40%.

При поиске моделей для объединения, убедитесь, что Вы следуете этим принципам:

  • Вы должны объединять только те модели, которые делят одни и те же материалы - иначе пользы от объединения не будет. Разные материалы всё ещё будут создавать новые запросы. Например, не объединяйте дерево с коробкой, но объединяйте коробку с другими такими же коробками.
  • Объединяйте модели, которые находятся рядом. Объединение моделей расширит границы пропа и сделает отрезку его рендера ареапорталами или чем-либо ещё менее вероятной.
  • Старайтесь не объединять модели, которые имеют коллизию и не находятся близко, так как физический движок не сможет эффективно оптимизировать такую модель. Если Вам нужно такое сделать, то отключайте коллизию или делайте упрощённую физическую модель самостоятельно.
  • Не объединяйте объекты, проходящие через или под тень, если модели не поддерживают повертексное освещение (т.е. ни один из материалов не имеет $bumpmap(en) или $phong(en)). Объединенный проп будет использовать освещение только из своего центра и по этой причине может смотреться странно в месте, где проходит тень. Альтернативно, разделите объединенный проп напополам по границе тени, чтобы обе стороны получали правильное освещение.

Чтобы легко находить скопления пропов, которые можно объединить, используйте команду r_colorstaticprops 1 в игре. Каждый уникальный цвет пропа означает, что он создаёт новый запрос на отрисовку. После объединения пропов, Вы заметите, что они имеют один цвет (что хорошо).

Если Вы замечаете плохое освещение на объединенных пропах (например, такие пропы становятся очень тёмными), то причиной этого может быть ориджин освещения, находящийся в геометрии. Чтобы это исправить, используйте info_lighting(en).

Note.pngПримечание:Помните, что объединение множества пропов может привести к заметному увеличению размера файла карты. Однако, если Ваша игра поддерживает сжатие BSP(en), то это не станет большой проблемой, так как объединенные пропы имеют очень хорошую степень сжатия.
Note.pngПримечание:Движок имеет ограничение по количеству вертексов в меше. Propper++ автоматически разделяет модель на разные меши, если та имеет больше 65535 вертексов.
Warning.pngПредупреждение:При объединении множества детализированных моделей компилятор может крашнуться. В таком случае, попробуйте объединить одну половину выделения, а потом вторую отдельно.

Освещение статичных пропов

В некоторых играх prop_static(en) поддерживает использование лайтмапа, сгенерированного VRAD(en). Однако у этой функции есть большие ограничения:

  • Пропы с пересекающейся UV(en)-развёрткой или несколькими материалами не могут быть правильно освещены.
  • Брашевая геометрия, превращённая в модели, не может быть правильно освещена в связи с искажённой UV(en)-развёрткой.
  • Материалы, использующие $bumpmap(en) или $phong(en) не могут быть освещены.

Функция Lightmap Atlas обходит все эти ограничения. Она берёт выбранные модели и (или) браши и генерирует одну непересекающуюся UV(en)-развёртку (или "атлас") для всей модели, а потом накладывает на неё текстуры. Она также автоматически убирает бампмапы и фонг с материалов.

Чтобы использовать эту функцию, включите Generate atlas.

Измените ширину и высоту атласа на своё усмотрение. Внешний вид будет зависеть от самой геометрии, от количества объединенных объектов и так далее, так что экспериментируйте с этим. Оставляйте разрешение степенью двойки. Более высокие разрешения будут иметь более хорошее качество текстур и больший вес. Это не размер лайтмапа - он указывается отдельно в настройках prop_static(en).

Есть 4 формата сжатия на выбор: DXT1, DXT5, RGB888 и RGBA8888. Форматы DXT сжаты, остальные - нет и поэтому имеют улучшенное качество, но гораздо больший размер файла. DXT1 и RGB888 не поддерживают прозрачность, сохраняя размер файла. Вы не должны использовать DXT5 или RGBA8888, если Вам не нужен альфа-канал для чего-либо (например для маски для $envmap(en))

Наконец, можно отключить билинейную фильтрацию для повышенной чёткости текстуры, однако это субъективно и зависит от текстуры и модели. Некоторые выглядят лучше, некоторые хуже. Обычно эту опцию не стоит выключать.

После построения и компиляции модели, она будет готова для лайтмапного освещения. Смотрите статью про prop_static(en) для деталей. Если текстура смотрится слишком "мыльно", увеличьте разрешение атласа или уменьшите количество объединяемых пропов.

Текстуры-атласы сохраняются в Material Path + Model Name, если Вы хотите на них посмотреть.

Warning.pngПредупреждение:Помните, что лайтмапы на пропах не только много весят, но и долго компилируются. Используйте эту функцию изредка.
Warning.pngПредупреждение:Браши занимают много пространства в атласе, так как их текстуры обычно большие и часто повторяются. Это может привести к тому, что всё остальное (например модели или другие более маленькие браши) станет непропорционально низкокачественным в атласе. Желательно использовать модели. Если же Вам нужно использовать браши, используйте nodraw на как можно большем количестве сторон, чтобы те не появлялись в атласе.

Запечение Ambient Occlusion

Сравнение внешнего вида моделей, сгенерированных при помощи Propper++, с AO и без (слева: без AO, справа: с запеченным AO)

Добавлено в сборке 8870: теперь в атлас можно запечь AO. Это полезно для создания более естественно выглядящих пропов, так как VRAD 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(en). Это удобно для организации файлов и для ограничения конфликтов между картами, если они делят модели с одинаковыми названиями.

  • Add incremental suffix if already existing MDL name is found

Когда включено, то при нахождении MDL(en) с таким же названием, как в Model Path + Name, к названию модели будет добавлен цифровой номер (_0, _1 и так дале). Этот номер будет увеличиваться, пока не найдётся неконфликтующее название. Параметр полезен для предотвращения случайной перезаписи существующих моделей, после которой прежние файлы было бы невозможно восстановить. Отключите эту опцию, если Вы хотите перезаписать модель новыми файлами (или просто удалите существующую модель).

  • Source file directory

Это место, где будут расположены файлы, необходимые для компиляции итоговой модели. Как и в предыдущих параметрах, этот путь может быть либо относительно директории игры, либо полным путём до любой директории в файловой системе. Этот параметр так же поддерживает маркеры $vmf. Пример с Garry's Mod: modelsrc/propper/rpassets положит исходные файлы (SMD(en) и QC(en)) в эту директорию:

<path-to-exe>/garrysmod/modelsrc/propper/rpassets

  • Material path

Это папка, в которой появятся сконвертированные материалы. Материалы для брашей обычно используют шейдер LightmappedGeneric(en), несовместимый с моделями, так что Propper++ конвертирует эти шейдеры в VertexLitGeneric(en). Как и ранее, этот параметр относителен папки 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(en) модели. Если оставить пустым, то материал, который покрывает самую большую площадь, будет выбран как материал поверхности. Если в выделении есть модели, то будет использован $surfaceprop(en) той модели, которая появляется чаще остальных.

  • Scale

Размер по осям X, Y и Z для модели. Поддерживаются отрицательные числа: если их ввести, то Propper++ автоматически исправит направление, в которое смотрят стороны.

  • Mass

Заменяет массу модели. Если оставить пустым, то масса будет автоматически вычислена компилятором, используя $automass(en).

  • Smoothing angle

Сглаживает нормали вертексов, угол между которыми меньше, чем значение этого параметра. Похож на -smooth в VRAD(en). 0 полностью отключает сглаживание. Полезно для округлых форм: цилиндров, сфер, арок.

  • Relocate materials

Если включено, передвигает брашевые материалы в папку, указанную в Material path. Это предотвращает замену обычных материалов на новые.

  • Rename shaders

Если включено, то шейдеры LightmappedGeneric(en), WorldVertexTransition(en) и Water(en) будут переименованы в VertexLitGeneric(en).

  • $concave collision

Включает $concave(en) (вогнутые) модели коллизии. Если выключено, то компилятор сделает shrinkwrap на модели, чтобы создать новую модель коллизии.

  • Remove bad collision faces

Маленькие или тонкие стороны брашей могут вызывать проблемы при компиляции коллизии. Этот параметр автоматически удалит такие стороны (добавив $remove2d в $collisionmodel(en)).

  • Skip nodraw faces

Пропускает добавление полигонов, покрытых tools/toolsnodraw, к видимой геометрии. Они всё ещё будут добавлены к модели коллизии.

  • Wait for keypress after compile

Если включено, то закрытие окна компилятора не произойдёт, пока не будет нажата какая-либо клавиша. Полезно для проверки на предупреждения или ошибки.

  • Create entity after compile

Если включено, то заменит выделение новой энтити со сгенерированной моделью.

  • Move selection to 'Propper' visgroup

Если включено, то выделение сохраняется в визгруппу под названием "Propper" после компиляции.

  • $casttextureshadows

Добавляет команду $casttextureshadows(en) в QC(en). Полезно для работы теней от полупрозрачных поверхностей в VRAD(en)-textureshadows) без ручного добавления модели в lights.rad(en)

  • Lightmap Atlas

Смотрите секцию про продвинутое использование выше.

Параметры

Propper++ использует следующие параметры:

Origin (origin) <origin(en)>
Если в данной группе есть только одна энтити, то параметр Origin будет использован, как ориджин получившейся SMD-модели.
Pitch Yaw Roll (Y Z X) (angles) <углы(en)>
Поворачивает получившуюся SMD-модель.
Name (targetname) <целевой объект(en)>
Lighting Origin (lightingorigin) <целевой объект(en)>
Выставляет $illumposition(en) на основе положения указанной именной энтити.
Model (model) <путь к модели(en)>
MDL(en) для использования.
Skin (skin) <целое число(en)>
Скин(en) используемой MDL(en).
Bodygroup (body) <целое число(en)>
Бодигруппы(en) модели(en).
Uniform Model Scale (modelscale) <число с плавающей запятой(en)>
Масштабирует получившийся меш по всем осям.