6.8 KiB
Определение ресурсов (assets)
Документ описывает формат файлов ресурсов и правила их адресации на стороне сервера.
Описание основано на загрузчиках из Src/Server/AssetsManager.hpp и связанных структурах
подготовки (PreparedNodeState, PreparedModel, PreparedGLTF).
Общая схема
- Ресурсы берутся из списка папок
AssetsRegister::Assets(от последнего мода к первому). Первый найденный ресурс по пути имеет приоритет. - Переопределения через
AssetsRegister::Customимеют более высокий приоритет. - Адрес ресурса состоит из
domainиkey.domain— имя папки в assets,key— относительный путь внутри папки типа ресурса. - Обработанные ресурсы сохраняются в
server_cache/assets.
Дерево папок
assets/
<domain>/
nodestate/ *.json
model/ *.json | *.gltf | *.glb
texture/ *.png | *.jpg (jpeg)
particle/ (загрузка из файлов пока не реализована)
animation/ (загрузка из файлов пока не реализована)
sound/ (загрузка из файлов пока не реализована)
font/ (загрузка из файлов пока не реализована)
Пример: assets/core/nodestate/stone.json имеет domain=core, key=stone.json.
При обращении к nodestate из логики нод используется ключ без суффикса .json
(сервер дописывает расширение автоматически).
Nodestate (JSON)
Файл nodestate — это JSON-объект, где ключи — условия, а значения — описание модели или список вариантов моделей.
Условия
Условие — строковое выражение. Поддерживаются:
- числа,
true,false - переменные:
stateилиstate:value(двоеточие — часть имени) - операторы:
+ - * / %,!,&,|,< <= > >= == != - скобки
Пустая строка условия трактуется как true.
Формат варианта модели
Объект варианта:
model: строкаdomain:keyили массив объектов моделейweight: число (вес при случайном выборе), по умолчанию1uvlock: bool (используется для векторных моделей; для одиночной модели игнорируется)transformations: массив строк"key=value"для трансформаций
Если model — строка, это одиночная модель.
Если model — массив, это векторная модель: набор объектов вида:
{ "model": "domain:key", "uvlock": false, "transformations": ["x=0", "ry=1.57"] }
Для векторной модели также могут задаваться uvlock и transformations на верхнем уровне
(они применяются к группе).
Трансформации поддерживают ключи:
x, y, z, rx, ry, rz (сдвиг и поворот).
Домен в строке domain:key можно опустить — тогда используется домен файла nodestate.
Пример
{
"": { "model": "core:stone" },
"variant == 1": [
{ "model": "core:stone_alt", "weight": 2 },
{ "model": "core:stone_alt_2", "weight": 1, "transformations": ["ry=1.57"] }
],
"facing:north": {
"model": [
{ "model": "core:stone", "transformations": ["ry=3.14"] },
{ "model": "core:stone_detail", "transformations": ["x=0.5"] }
],
"uvlock": true
}
}
Model (JSON)
Формат описывает геометрию и текстуры.
Верхний уровень
gui_light: строка (сейчас используется толькоdefault)ambient_occlusion: booldisplay: объект с наборамиrotation/translation/scale(все — массивы из 3 чисел)textures: объектname -> string(ссылка на текстуру или pipeline)cuboids: массив геометрических блоковsub_models: массив подмоделей
Текстуры
В textures значение:
- либо строка
domain:key(прямая ссылка на текстуру), - либо pipeline-строка, начинающаяся с
tex(компилируетсяTexturePipelineProgram).
Если домен не указан, используется домен файла модели.
Cuboids
Элемент cuboids:
shade: bool (по умолчаниюtrue)from:[x, y, z]to:[x, y, z]faces: объект граней (down|up|north|south|west|east)transformations: массив"key=value"(ключи как у nodestate)
Грань (faces.<name>) может содержать:
uv:[u0, v0, u1, v1]texture: строка (ключ изtextures)cullface:down|up|north|south|west|easttintindex: introtation: int16
Sub-models
sub_models допускает:
- строку
domain:key - объект
{ "model": "domain:key", "scene": 0 } - объект
{ "path": "domain:key", "scene": 0 }
Поле scene опционально.
Пример
{
"ambient_occlusion": true,
"textures": {
"all": "core:stone"
},
"cuboids": [
{
"from": [0, 0, 0],
"to": [16, 16, 16],
"faces": {
"north": { "uv": [0, 0, 16, 16], "texture": "#all" }
}
}
],
"sub_models": [
"core:stone_detail",
{ "model": "core:stone_variant", "scene": 1 }
]
}
Model (glTF / GLB)
Файлы моделей могут быть:
.gltf(JSON glTF).glb(binary glTF)
Оба формата конвертируются в PreparedGLTF.
Texture
Поддерживаются только PNG и JPEG. Формат определяется по сигнатуре файла.
Прочие типы ресурсов
Для particle, animation, sound, font загрузка из файловой системы
в серверном загрузчике пока не реализована (std::unreachable()), но возможна
регистрация из Lua через path (сырые бинарные данные).