По формату #exec команды.

Автор: GOST

Здесь приведены не полные, но иногда полезные данные по формату этой комманды, возможны ошибки. Буду рад увидеть ваши замечания и исправления. Документы, на которые есть ссылки можно найти на сайте у Эпиков. Команды описывались и проверялись для Unreal / UT 4.05.

Словарик:
Меш – mesh – 3D модель персонажа, то что мы видим в игре.
LOD-последовательности - последовательности упрощения, то есть чем дальше, тем меньше деталей отображается. Есть у текстур и моделей (у текстур это мипы //MIPS).

Важно:

  • Если в строке с #exec командой встречается //, то далее следует комментарий, как в обычном C++.
  • Некоторые параметры могут работать только в UT.
  • Команда обрабатывается только на этапе компиляции модуля, а не скриптов.


    Что можно делать командой #exec.

    1. Импортировать меши и анимационные последовательности персонажей.
    2. Зеркалировать меш.
    3. Определять параметры
    4. LOD-выбраковки для меша.
    5. Задавать функциональность объекта через его анимации.
    6. Менять положение центральной точки и вектора направления для меша.
    7. Определять анимации и задавать параметры для них.
    8. Удалять часть кадров из анимации персонажа.
    9. Масштабировать меш при импорте.Назначать текстуры на меш.
    10. При компиляции подгружать модули или объединять их.
    11. Создавать и записывать некий набор информации в модуль.
    12. Импортировать текстуры и задавать некоторые их свойства.
    13. Импортировать звуки.
    14. Создавать шрифты на основе специальных изображений.
    15. Импортировать TTF шрифты.

     

    Описания.



    #exec  MESH  IMPORT  MESH=m_Name ANIVFILE=file_a.3D DATAFILE=file_d.3D X=0 Y=0 Z=0 ZEROTEX=1 LODSTYLE=2
    Импорт мешей и анимаций для персонажей из файлов, созданных плагином из 3DSMAX
    //Дополнительно смотреть документ Unreal Geomorph Level-Of-Detail Notes
    Комментарий:
    Параметры после DATAFILE не обязательны.
    Низкоуровневая детализация (LOD) может быть выключена по умолчанию (depending on how it is hardcoded in UnEdSrv.cpp)
    Пример:
    #exec MESH IMPORT MESH=LodMesh ANIVFILE=MODELS\AnyMesh_a.3D DATAFILE=MODELS\AnyMesh_d.3D X=0 Y=0 Z=0 MLOD=1 LODSTYLE=0 LODFRAME=19

    Параметры:
    MLOD - type Boolean (аналог MIPS=OFF для текстур)
    Двоичный ключ для отключения детализации меша. MLOD=0 исключает потерю деталей.//!!!При этом объект почему-то может вообще не рисоваться (меш перестаёт отрисовываться) в Unreal/UT.

    Always use MLOD=0 if you want to disable any detail loss, rather than putting extreme STRENGTH or MINVERTS values in the LODPARAMS. Что означает, если ключ нормально работает, то лучше пользоваться им, а не вторым способом изменения уроня детализации (см. #exec MESH LODPARAMS).

    LODSTYLE
    Битовое поле переключающее стили построения последовательности упрощения.
    Значение по умолчанию == 0. Полезны 2 и 8.
    0x01: Кривизна дороже длины.
    0x02: Защищает грани двусторонних полигонов.
    0x04: Пытаться беречь текстуру от изломов (рубцов).
    0x08: Длина дороже кривизны
    0x10: Прозрачные полигоны схлопываются немного раньше в LOD-последовательности (убрано в 224)
    Совет: для модели лучше попробовать несколько комбинаций и в итоге выбрать наиболее подходящую.

    LODFRAME
    Если есть анимационная последовательность, можно выбрать представительный кадр (тот кадр, на основе которого будут создаваться LOD-последовательности) для генерации последовательности упрощения. (По-умолчанию кадр == 0).

    LODNOTEX - не видел

    ZEROTEX
    Если установлен, заставляет игнорировать текстурные координаты. Как результат меньше памяти и лучше быстродействие для сложных мешей обстановки (environment-mapped meshes).

    LODOLD - не видел
    Maintain the original order of animation vertices as they are imported. If active, this means some internal reorganization will be done at load time, instead of compile time. Included to make differential patching of older content feasible.

    UNMIRROR – !!! При установленном в 1 происходит зеркалирование меша относительно плоскости YZ; То есть из одной модели можно сделать и её зеркальную копию, что в основном применяется для создания оружия (правый/левый вид)

    UNMIRRORTEX - (значения 1,4). Аналогично зеркалирование для текстур.



    #exec  MESH   LODPARAMS  MESH=m_NameSTRENGTH=0.3
    Определяет параметры LOD-выбраковки (см. также).

    Параметры:

    STRENGTH - float
    Линейный LOD-масштаб. По-умолчанию == 1.0. Увеличивать, для более сильной LOD-выбраковки, уменьшать в случаях, когда искажения модели начинаются слишком рано.

    MINVERTS - int
    Минимальное количество вершин, которое должно остаться у меша независимо от расстояния.
    В основном используется для очень простых объектов (коробки, деревья, птицы и т.п.), которые должны выглядеть хорошо даже на большом расстоянии.

    MORPH - float – примеров использования не видел
    0.0 для отсутствия трансформирования, любое другое значение в отрезке 0.0-1.0 означает пропорцию вершин которыми позволяется жертвовать для плавного трансформирования. По-умолчанию 0.3. Чем больше значение, тем меньше растрескивание, но больший расход времени на просчет. Нормальные значения лежат в интервале 0.25-0.4.

    ZDISP - активно используется в UT
    В координатах мира (стандартная высота игрока == 60) расстояние от отображаемогомеша, с которого начинается упрощение.
    В оригинале: More precisely, the fraction of vertices drawn scales with the distance Z as follows: 1 / ( STRENGTH * (Z - ZDISP) ), where (Z-ZDISP) is clamped at a minimum of 1.0.



    #exec  MESH  NOTIFY  MESH=m_NameSEQ=animName TIME=0.5 FUNCTION=funcName Назначить анимационной последовательности Anim_Name вызов функции объекта, владеющего данным мешем. Количество вызовов не ограничено (в рамках разумного ограничений не выявлено).
    От старта анимации до вызова с параметром TIME=0.0001 проходит 0.04 - 0.05 сек. (может зависеть от общего быстродействия кампутера :) )

    Параметры:

    MESH – меш

    SEQ – имя анимации.

    TIME – задает относительное время вызова из анимции приблизительно по формуле:

    1 сек. * ( NumFrames - 1 )/NumFrames * (номер_кадра_отсчет_от_нуля)/(NumFrames);Где считается, что вся анимация “уложена” в одну секунду.
    Реальный вызов происходит приблизительно во время, исчисляемое как: RealFullAnimTime*( NumFrames - 1 )/NumFrames * (номер_кадра_отсчет_от_нуля)/(NumFrames).


    !!! ПАРАМЕТР TIME=0.0 не работает.

    Значения TIME должны различаться, иначе все одинаковые, кроме первого, игнорируются.
    Для анимации из 5 кадров с RATE=1 (один кадр в секунду):
     
    Действие Время в игре Величины
    Start
    48.889481
    4.040 (полное время)
    TIME = 0.0001 ~ 0-й кадр
    48.927021
    0.038 (дельта)
    TIME = 0.1
    49.418339
    0.491 (дельта)
    TIME = 0.2 - 1-й кадр
    49.944153
    0.526 (дельта)
    TIME = 0.3
    50.433430
    0.489 (дельта)
    TIME = 0.4 - 2-й кадр
    50.921715
    0.488 (дельта)
    TIME = 0.5
    51.445610
    0.524 (дельта)
    TIME = 0.6 - 3-й кадр
    51.945702
    0.500 (дельта)
    TIME = 0.7
    52.437599
    0.492 (дельта)
    TIME = 0.8 - 4-й кадр
    52.929623
    0.492 (дельта)
    End
    52.929623
    0.000 (дельта)

    FUNCTION – метод персонажа, который будет вызван из анимации в установленное в TIME время.



    #exec  MESH  ORIGIN  MESH=m_Name X=0 Y=0 Z=-1 YAW=0 ROLL=0 PITCH=-128
    Относительное изменение положения центральной точки и вектора направления для меша.
    Можно смещать центральную точку меша
    Eдиницы, скорей всего, из 3D MAX. 10ed==1unreal unit (для масштабирования см. SCALE),

    повороты 2*Pi=2^8 (2 в степени 8) //64 == 90 градусов.
    Yaw – в плоскости XY
    Roll – поворот в плоскости нормали к направлению (по оси направления (взгляда) по часовой стрелке)
    Pitch – поворот вверх по направлению взгляда.
    Значения могут быть и орицательными.



    #exec  MESH  SEQUENCE  MESH=meshNameSEQ=anim_Name STARTFRAME=127 NUMFRAMES=8 RATE=15 GROUP=Attack
    объявление анимационной последовательности для меша.

    Параметры:

    RATE – кадров в секунду (default value == 30 (а я верю ;) )), необходим для начального регулирования скорости анимации, чтобы играть её в UT с определённым параметром скорости.

    GROUP – название группы для разделения анимаций.

    STARTFRAME – первый кадр анимации в общей последовательности кадров.

    NUMFRAMES – количество кадров из общей последовательности

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



    #exec  MESH  DROPFRAMES  MESH=meshName STARTFRAME=12 NUMFRAMES=5 позволяет удалить лишние анимации или кадры из анимационных последовательностей. То есть как бы урезать общую последовательность кадров. При этом необходимо вручную уменьшать общую длину анимаций и сдвигать их индексацию, т.к. кадры просто вырезаются (в примере с 12-го удалить 5 кадров, анимация All сократится на 5 кадров и нумерация после 12-го сдвинется). Каждая новая такая команда использует в качестве отсчёта то, что осталось от предыдущей.

    ПРИМЕЧАНИЕ: работает только в UT.
    Параметры по аналогии с #exec  MESH  SEQUENCE



    #exec MESHMAP NEW MESHMAP=name MESH=name
    Назначение MESHMAP - карты размещения текстуры на меше.


    #exec  MESHMAP  SCALE  MESHMAP=name X=0.021 Y=0.021 Z=0.042 YAW=128
    Масштабирование модели по осям (относительно 3DSMAX-овских).
    Зачем здесь повороты (Yaw,Pitch,Roll) не знаю (может это возможность масштабирования в некой повёрнутой системе координат).


    #exec  MESHMAP  SETTEXTURE  MESHMAP=meshMapName NUM=0 TEXTURE=t_Name1 TLOD=5
    Назначение текстур на меш.
    В модели реально может быть до 8 разных текстур (определяется массивом (Display)MultiSkins[0..7]). Под каждую из них отводится свой слот, они нумеруются от 0 до 7.
    При этом 0 – слот для скинов //переменная skin в модели.
    Важно: Этой коммандой можно назначить любую текстуру на модель, в том числе анимационную или процедурную во время компиляции модуля.

    Параметры:

    MESHMAP  – имя карты

    NUM – номер внутренней карты текстуры (0-9);

    TLOD – (видел TLOD=5,10,30,50,200) наверное связано с текстурной LOD-выбраковкой

    Примечание: если текстуру не назначать, то на модель ляжет тектура по умолчанию.
    Менять текстуру на модели можно в редакторе или из скрипта, устанавливая переменные skin или значения массива MultiSkins по соответствующему индексу.



    #exec  OBJ  LOAD  FILE=file PACKAGE=pkg.class
      Подгрузить содержимое из файла модуля в package в подраздел class. Например, сделать доступной текстуру из конкретного Package-файла с текстурами. А также (!!!) любого объекта из любого Package-файла.

      Варинта подгрузки два:

      1. Подгружаемый модуль интегрируется в ваш (например модуль с процедурными тектурами) на этапе компиляции. Для этого надо указать в PACKAGE имя вашего модуля (pkg) и, если необходимо, подраздел (class) внутри вашего модуля. Если внутри подгружаемого модуля есть подразделы (например ldpkg.textures), то в вашем модуле они будут адресоваться pkg.class.textures. В общем, вам выбирать - надо задавать полраздел или нет :)
      2. Подгружаемый модуль загружается только на время компиляции и в дальнейшем используются только ссылки на него. Для этого надо указать в PACKAGE имя подгружаемого модуля и подраздел в нем (pkg) или проигнорировать параметр PACKAGE.


      Классное применение – перенос процедурных текстур в свой package.



    #exec  OBJ  SAVEPACKAGE  PACKAGE="UWindowFonts" FILE="..\Textures\UWindowFonts.utx"
    записать некий набор информации в файлFILE какPACKAGE UwindowFonts.

    Например можно объединять несколько текстурных package-файлов в один, или создавать автоматические текстурные модули (см. наводку здесь).



    #exec  TEXTURE  IMPORT  NAME=BloodSGrn FILE=file.PCX GROUP=Skins FLAGS=2 MIPS=Off LODSET=2 ALPHATRICK=1
    //TRANSLUCENT //TWOSIDED //WEAPON //SKIN //Material #1 или #2 – это комментарии
    импорт тектур.

    GROUP – группа текстуры. Для разделения по группам в браузере текстур.

    FLAGS – флаги текстуры, переносимые на полигон (за разъяснением механизма переноса обращаться к Эпикам ;) ).

    любая комбинация флагов. Из всех возможных проверялось всего несколько.
    (в общем, это не до конца проверенная гипотеза)

    Флаги из заголовочных файлов к движку.
    PF_Invisible = 0x00000001 // Poly is invisible. - невидим
    PF_Masked = 0x00000002 // Poly should be drawn masked. - маскирован
    PF_Translucent = 0x00000004 // Poly is transparent. - прозрачный
    PF_NotSolid = 0x00000008 // Poly is not solid, doesn't block.
    PF_Environment = 0x00000010 // Poly should be drawn environment mapped.
    PF_Semisolid = 0x00000020 // Poly is semi-solid=collision solid,Csg nonsolid.
    PF_Modulated = 0x00000040 // Modulation transparency. – модулированная прозрачность
    PF_FakeBackdrop = 0x00000080 // Poly looks exactly like backdrop.
    PF_TwoSided = 0x00000100 // Poly is visible from both sides. - двусторонний
    PF_AutoUPan = 0x00000200 // Automatically pans in U direction.
    PF_AutoVPan = 0x00000400 // Automatically pans in V direction.
    PF_NoSmooth = 0x00000800 // Don't smooth textures.
    PF_BigWavy = 0x00001000 // Poly has a big wavy pattern in it.
    PF_SmallWavy = 0x00002000 // Small wavy pattern (for water/enviro reflection).
    PF_Flat = 0x00004000 // Flat surface.
    PF_LowShadowDetail= 0x00008000 // Low detaul shadows.
    PF_NoMerge = 0x00010000 // Don't merge poly's nodes before lighting when rendering.
    PF_CloudWavy = 0x00020000 // Polygon appears wavy like clouds.
    PF_DirtyShadows = 0x00040000 // Dirty shadows.
    PF_BrightCorners = 0x00080000 // Brighten convex corners.
    PF_SpecialLit = 0x00100000 // Only speciallit lights apply to this poly.
    PF_Gouraud = 0x00200000 // Gouraud shaded.
    PF_Unlit = 0x00400000 // Unlit.
    PF_HighShadowDetail= 0x00800000// High detail shadows.
    PF_Portal = 0x04000000 // Portal between iZones.
    PF_Mirrored = 0x08000000 // Reflective surface. – зеркальная текстура

    Соответственно десятичное число по комбинации флагов. Само собой разумеется, что некоторые флаги не подлежат комбинированию.
    Примечание: флаги текстуры имеют меньший приоритет, чем флаги граней на меше. (не проверялось для скинов).

    MIPS - создание карт масштабирования для текстуры (LOD-выбраковка) количество или Off (нельзя отключить для текстур больших чем 256x256)

    LODSET – не известно

    ALPHATRICK - не известно

    В комментариях указывается имя материала данное в 3D MAX. При этом комментарий при перекомпилляции u-файла роли не играет. Название материала играет роль только при создании меша и анимации в 3D MAX. (т.е. специальный плагин по названию материала задает свойства граней меша).

    Редактировать свойства граней меша можно в программе UNREALFX.EXE



    #exec  AUDIO  IMPORT  FILE="Sounds\SubFolder\SoundName.wav" NAME="GameSoundName" GROUP="SoundGroup"
    импорт звуков.

    FILE – звуковой файл

    NAME – имя звука в игре

    GROUP – подраздел для звука (разделение по группам в браузере)



    #exec  FONT  IMPORT  FILE=Textures\Font.pcx NAME=GameFont
    импорт шрифта из специальной картинки в формате pcx. Цвет индекс==0  –  пустое место, цвет индекс==255  –  разделительная сетка. Остальные – цвета символа. Ширина символов разная, высота – одна.
    Не ясно как делается antialiasing. Возможно, определяется через индекс цвета как степень прозрачности.


    #exec  NEW  TRUETYPEFONTFACTORY  NAME=UnrFntName FONTNAME="Tahoma" HEIGHT=30 ANTIALIAS=1 CHARACTERSPERPAGE=32
    Импорт шрифта из TTF.

    Шрифт состоит из набора 256x256 текстур, в которых размещены символы шрифта.

    Взято из документа True-Type Font Importing in Unreal.

    НЕПРИЯТНОСТЬ: нормально работает только в UT, при любом неправильном написании (с точки зрения формата команды) берет default-шрифт (что-то вроде Times).

    Параметры:

    NAME – имя шрифта в скриптах (Font’UnrFntName’).

    FONTNAME – имя шрифта в Windows, не имя ttf-файла, а именно шрифта, который будет импортироваться.
    Оригинал: For example "Comic Sans MS", "Arial" or "Earth Normal".
    ПРИМЕЧАНИЕ: Название шрифта с пробелами не воспринимается, т.е. берется default вариант.

    HEIGHT – высота шрифта в точках.

    ANTIALIAS – работает при трех специфических условиях, описанных в True-Type Font Importing in Unreal.
    Оригинал: If AntiAlias is 1, the TTF importer requests an anti-aliased font from Windows with the ANTIALIASED_QUALITY flag to CreateFont(). If it is 0, I pass NONANTIALIASED_QUALITY. See below for limitations of importing fonts with anti-aliasing.

    CHARACTERSPERPAGE – количество символов на одной 256x256 техтуре шрифта.
    Default == 64. Кратен 2.
    Оригинал: The TTF importer will give you an error if it runs out of space when drawing characters on the font pages. If you get the error "Font vertical size exceeded maximum of 256", you should half the CharactersPerPage parameter.

    XPAD and YPAD – добавление дополнительного пустого места между символами.
    Оригинал: add extra space between characters. These default to 1. Some fonts require extra space between characters, as Windows doesn't report their actual spacing requirement correctly.



    Для автоматического создания текстурного package-файла с шрифтами можно использовать txt-файл, запускаемый на выполнение из log-окна редактора.

    Например файл “Fonts.txt” вида:

    new TrueTypeFontFactory PACKAGE="Fonts001" Name=HUDFont10B FontName="Verbana" Height=10 AntiAlias=1 CharactersPerPage=256
    new TrueTypeFontFactory PACKAGE="Fonts001" Name=HUDFont16B FontName="Verbana" Height=16 AntiAlias=1 CharactersPerPage=128
    new TrueTypeFontFactory PACKAGE="Fonts001" Name=HUDFont20B FontName="Verbana" Height=20 AntiAlias=1 CharactersPerPage=128
    new TrueTypeFontFactory PACKAGE="Fonts001" Name=HUDFont26B FontName="Verbana" Height=26 AntiAlias=1 CharactersPerPage=64
    OBJ SAVEPACKAGE PACKAGE="Fonts001" FILE="..\Textures\Fonts001.utx"
    Запускается командой ‘exec Fonts.txt’ в log окне UnrealEd. Результат - файл Fonts001.utx с фонтами ( при неудаче - default-ными :) ).
    ПРИМЕЧАНИЕ: сработало только для UT.