Ru/Hammer++/Propper++

Инструмент Propper++ в позволяет превращать брашворк в модели, или объединять разные модели в одну. Он служит как полная замена устаревшему Propper.
== Установка ==
Перед использованием инструмента Вы должны указать StudioMDL в Tools -> Options -> Build Programs -> MDL executable. Это компилятор, который сделает модели для движка.
== Базовое использование ==
=== Браши ===
В первую очередь выберите браши, которые Вы хотите превратить в модели. Если Вы хотите превратить их в одну модель вместо нескольких, то сначала нужно их сгруппировать либо через инструменты групп, либо через превращение их в одну энтити.
Затем откройте Propper++ в меню Tools -> Propper++ или используя сочетание клавиш Ctrl + Shift + P.
Вы увидите множество опций. Практически все из них неважны, кроме Model Path + Name наверху.
Имя в конце станет именем, данным Вашей модели. Поменяйте его на что-нибудь подходящее для модели, например moykrutoystul.
Нажмите Build + Compile и браши должны быть успешно превращены в модель после того, как компилятор закончит работу.
Превращенная брашевая геометрия будет сохранена в визгруппу Propper. Это можно использовать, чтобы сохранить или восстановить изначальную геометрию при необходимости.
=== Изменение размера пропов ===
В добавление к превращению брашей, Propper++ поддерживает перенос или соединение с выбранными моделями. Модели, которые пропущены через Propper++ будут иметь свои скины, бодигруппы и скейлинг по умолчанию. Полезное применение этого - быстрое изменение размера prop_static в играх, которые это не поддерживают, вместо использования старого неудобного метода декомпиляции и последующей рекомпиляции моделей.
Чтобы изменить размер prop_static во всех направлениях одновременно, превратите его в prop_dynamic для того, чтобы поменять Model Scale, или добавить значение , выключив SmartEdit.
Альтернативно, смените значение Scale в меню Propper++. Вы можете использовать отрицательные значения чтобы отразить проп по какой-либо из осей.
=== Объединение брашей и моделей ===
Так же возможно объединять браши и модели вместе. Чтобы это сделать, нужно сгруппировать выделение используя инструменты групп, а затем запустить инструмент как обычно.
== Продвинутое использование ==
=== Редактирование перед компиляцией ===
Иногда изменение сгенерированных файлов модели может быть полезно, например чтобы добавить дополнительные параметры, такие как $texturegroup, или чтобы изменить меши. Propper++ позволяет это, используя двухэтапный процесс: Build, а потом Compile.
Обычно оба этих шага запускаются одновременно, но их так же можно запускать вручную.
* Build сгенерирует файлы QC и SMD для модели.
* Compile отправит сгенерированные файлы в компилятор, а потом заменит выделение (если это включено).
Таким образом, вы можете нажать Build-Only, отредактировать файлы, а потом Compile-Only, чтобы скомпилировать модель.
=== Передвижение ориджина модели или точки освещения ===
По умолчанию, ориджин сгенерированной модели и точка освещения распожены в центре границ выбранной геометрии.
Если использовать инструмент Propper++ на брашевой энтити, и у энтити есть параметр , то будет использовано это значение.
Положение освещения можно заменить, указав свой ориджин освещения на любой выбранной модели. Propper++ прочитает первый, который найдет, и будет использовать его как новый $illumposition.
=== Добавление скинов ===
Смотрите , чтобы получить больше информации про добавление скинов.
Откройте Ваш кастомный , созданный Propper++, и добавьте следующий код куда-нибудь внутрь файла:
 "models/mycustomfolder" "models/lorem/mycustomfolder2"
 "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++ так же может быть использован для объединения пропов с целью оптимизации, похожего на в более новых играх. Демонстрация прироста производительности от объединения статичных пропов в один находится справа.
Объединение улучшает производительность, уменьшая количество запросов на отрисовку. Вкратце: запросы на отрисовку - метод, которым пользуется процессор, чтобы сказать видеокарте что и как нужно отрисовать. Эта коммуникация дорогая и современные игры обычно стараются как можно больше сократить количество запросов на отрисовку. Каждый проп в игре будет создавать новый запрос на отрисовку. Если в пропе несколько материалов, то каждый из них будет создавать новый запрос на отрисовку. Объединяя пропы, количество таких запросов уменьшается. Со слов Valve: использование объединения статичных пропов на картах CS:GO (которые используют очень много статичных пропов) улучшило производительность на 40%.
При поиске моделей для объединения, убедитесь, что Вы следуете этим принципам:
* Вы должны объединять только те модели, которые делят одни и те же материалы - иначе пользы от объединения не будет. Разные материалы всё ещё будут создавать новые запросы. Например, не объединяйте дерево с коробкой, но объединяйте коробку с другими такими же коробками.
* Объединяйте модели, которые находятся рядом. Объединение моделей расширит границы пропа и сделает отрезку его рендера ареапорталами или чем-либо ещё менее вероятной.
* Старайтесь не объединять модели, которые имеют коллизию и не находятся близко, так как физический движок не сможет эффективно оптимизировать такую модель. Если Вам нужно такое сделать, то отключайте коллизию или делайте упрощённую физическую модель самостоятельно.
* Не объединяйте объекты, проходящие через или под тень, если модели не поддерживают повертексное освещение (т.е. ни один из материалов не имеет или ). Объединенный проп будет использовать освещение только из своего центра и по этой причине может смотреться странно в месте, где проходит тень. Альтернативно, разделите объединенный проп напополам по границе тени, чтобы обе стороны получали правильное освещение.
Чтобы легко находить скопления пропов, которые можно объединить, используйте команду r_colorstaticprops 1 в игре. Каждый уникальный цвет пропа означает, что он создаёт новый запрос на отрисовку. После объединения пропов, Вы заметите, что они имеют один цвет (что хорошо).
Если Вы замечаете плохое освещение на объединенных пропах (например, такие пропы становятся очень тёмными), то причиной этого может быть ориджин освещения, находящийся в геометрии. Чтобы это исправить, используйте .
=== Освещение статичных пропов ===
В некоторых играх поддерживает использование лайтмапа, сгенерированного . Однако у этой функции есть большие ограничения:
* Пропы с пересекающейся -развёрткой или несколькими материалами не могут быть правильно освещены.
* Брашевая геометрия, превращённая в модели, не может быть правильно освещена в связи с искажённой -развёрткой.
* Материалы, использующие или не могут быть освещены.
Функция Lightmap Atlas обходит все эти ограничения. Она берёт выбранные модели и (или) браши и генерирует одну непересекающуюся -развёртку (или "атлас") для всей модели, а потом накладывает на неё текстуры. Она так же автоматически убирает бампмапы и фонг с материалов.
Чтобы использовать эту функцию, включите Generate atlas.
Измените ширину и высоту атласа на своё усмотрение. Внешний вид будет зависеть от самой геометрии, от количества объединенных объектов и так далее, так что экспериментируйте с этим. Оставляйте разрешение степенью двойки. Более высокие разрешения будут иметь более хорошее качество текстур и больший вес. Это не размер лайтмапа - он указывается отдельно в настройках .
Есть 4 формата сжатия на выбор: DXT1, DXT5, RGB888 и RGBA8888. Форматы DXT сжаты, остальные - нет и поэтому имеют улучшенное качество, но гораздо больший размер файла. DXT1 и RGB888 не поддерживают прозрачность, сохраняя размер файла. Вы не должны использовать DXT5 или RGBA8888, если Вам не нужен альфа-канал для чего-либо (например для маски для )
Наконец, можно отключить билинейную фильтрацию для повышенной чёткости текстуры, однако это субъективно и зависит от текстуры и модели. Некоторые выглядят лучше, некоторые хуже. Обычно эту опцию не стоит выключать.
После построения и компиляции модели, она будет готова для лайтмапного освещения. Смотрите статью про для деталей. Если текстура смотрится слишком "мыльно", увеличьте разрешение атласа или уменьшите количество объединяемых пропов.
Текстуры-атласы сохраняются в Material Path + Model Name, если Вы хотите на них посмотреть.
== Настройки ==
* Model Path + Name
Это путь и название модели, которая будет сгенерирована. он находится относительно папки models в Вашей игре. Например, в Garry's Mod, "propper/moykrutoystul" сгенерирует модель по этому пути:
.../GarrysMod/garrysmod/models/propper/moykrutoystul.mdl
Все маркеры $vmf будут заменены на название текущего . Это удобно для организации файлов и для ограничения конфликтов между картами, если они делят модели с одинаковыми названиями.
* Add incremental suffix if already existing MDL name is found
Когда включено, то при нахождении с таким же названием, как в Model Path + Name, к названию модели будет добавлен цифровой номер (_0, _1 и так дале). Этот номер будет добавляться, пока не будет найдено неконфликтующее название. Это удобно для предотвращения случайной перезаписи существующих моделей, так как после этого файлы было бы невозможно восстановить. Отключите эту опцию, если Вы хотите перезаписать модель новыми файлами (или просто удалите существующую модель).
* Source file directory
Это место, где будут расположены файлы, необходимые для модели. Как и выше, может быть либо относительно директории игры, либо полным путём до любого места на Вашем компьютере. Этот параметр так же поддерживает маркеры $vmf.
Пример с Garry's Mod: "modelsrc/propper/rpassets" положит исходные файлы и в эту директорию:
.../GarrysMod/garrysmod/modelsrc/propper/rpassets
* Material path
Это папка, в которую будут положены сконвертированные материалы. Брашевые материалы обычно используют шейдер LightmappedGeneric, несовместимый с моделями, так что Propper++ конвертирует эти шейдеры в VertexLitGeneric. Как и ранее, этот параметр относителен директории игры, но внутри папки materials. Поддерживает маркеры $vmf. 
Пример с Garry's Mod: "models/propper/rpassets" сгенерирует материалы в эту директорию:
../GarrysMod/garrysmod/materials/models/propper
* Entity name as physics mesh
Этот параметр позволяет Вам указать, какая именная энтити должна быть использована как модель коллизии. Это полезно для создания упрощённых физических моделей для сложной геометрии. Поставив этот параметр на $self, модель будет использовать выделение как физическую модель. Если оставить этот параметр пустым, то коллизии не будет. Имена энтити не будут работать, если выделить несколько групп объектов.
* Entity classname
Если включен параметр Creaty entity after compile, то выделение будет заменено энтити с этим классом и сгенерированной моделью.
* Surfaceprop
 модели. Если оставить пустым, то материал, который покрывает самую большую площадь, будет выбран как материал поверхности. Если в выделении есть модели, то будет использован той модели, которая появляется больше всех.
* Scale
Размер по осям X, Y и Z для модели. Отрицательные значения поддерживаются и применят исправление, чтобы перевернуть стороны в правильное направление.
* Mass
Заменяет массу модели. Если оставить пустым, то масса будет автоматически вычислена компилятором, используя .
* Smoothing angle
Сглаживает нормали вертексов угол между которыми меньше, чем значение этого параметра. Похож на -smooth в . 0 отключает сглаживание. Полезно для круглых форм, как цилиндры.
* Relocate materials
Если включено, передвигает брашевые материалы в папку, указанную в Material path. Это предотвращает замену обычных материалов на новые.
* Rename shaders
Если включено, то шейдеры , и будут переименованы в .
* $concave collision
Включает (вогнутые) модели коллизии. Если выключено, то компилятор сделает shrinkwrap на модели, чтобы создать новую модель коллизии.
* Remove bad collision faces
Маленькие или тонкие стороны брашей могут вызывать проблемы при компиляции коллизии. Этот параметр автоматически удалит такие стороны (добавив $remove2d в ).
* Skip nodraw faces
Пропускает добавление сторон, покрытых текстурой tools/toolsnodraw, к видимой геометрии. Они всё ещё будут добавлены к модели коллизии.
* Wait for keypress after compile
Если включено, то ждёт нажатия любой клавиши на клавиатуре перед закрытием окна вывода компилятора. Полезно для проверки на предупреждения или ошибки.
* Create entity after compile
Если включено, то заменит выделение новой энтити со сгенерированной моделью.
* Move selection to 'Propper' visgroup
Если включено, то выделение сохраняется в визгруппу под названием "Propper" после компиляции.
* $casttextureshadows
Добавляет команду в . Полезно для работы теней от полупрозрачных поверхностей в (с -textureshadows) без ручного добавления модели в 
* Lightmap Atlas
Смотрите секцию про продвинутое использование выше.
== Параметры ==
Propper++ использует следующие параметры: