Промежуточный формат хранения сцен (составных объектов). Используется совместно с компонентной моделью для эффективного создания сложных сцен.
Текстовый файл, содержащий локаторы и объекты. Формат локаторов финальный и неизменный, формат объектов не фиксируется, всё что нам известно об объектах - каждый объект обязан ссылаться на один или более (верёвки) локаторов.
Чтение файла осуществляется стандартным парсером, который не понимает формата объектов, но способен их бы увидеть, каталогизировать и зачитать их свойства не вдаваясь в детали.
Локатор это локальное пространство, или если так удобное - размещение некоего объекта в пространстве, глобальном, либо другого объекта). Локатор определяет позицию, ориентацию и масштаб (скейлинг) дочернего объекта относительно материнского. Локатор содержит:
locator "tank" locator "tank:tower" { position = Vector3( 0, 2, 0 ) } locator "tank:tower:cannon" { position = Vector3(0,0,0) hpb = Vector3(180*,0,0) scale = Vector3(100%, 50%, 100%) }
В примере выше показаны три локатора, первый из которых не содержит никаких данных, так как у него всё по нулям, а последний - максимальный набор данных, где и позиция, и ориентация, и даже масштабирование.
Идентификаторы служат для привязки к локаторам ним объектов или других локаторов. Идентификатор имеет вид [материнский локатор:]<имя>, где <имя> является текстовой строкой, содержащей цифры, литеры и символ подчёркивания. Правило именования локаторов нужно сделать совместимым с Maya. Например, такое дерево локаторов:
Превращается в список полных имён: “1”, “1:2”, “1:2:3”, “1:4”. То есть идентификатор локатора это собственное (локальное) имя локатора, и полное имя материнского локатора, через символ “:”. Так как полное материнского локатора тоже составное, в случае глубокой вложенности, имена получаются довольно длинные.
Каждый локатор является пространством имён дочерних локаторов, что требует уникальности имён на одном уровне иерархии, но позволяет совпадение имён локаторов из разных ветвей дерева. Тахнически, имя дочернего локатора может совпадать с именем материнского, что однако не является хорошим стилем.
Локатор задаёт положение объекта в пространстве сцены, либо иного локатора. Граф сцены представляется в виде списка, где связи отображаются именами.
Трансформация в локаторе хранится полностью, и несмотря на то, что нам вряд-ли понадобится скалирование, его придётся поддерживать.
Некая совокупность данных в формате “<имя поля> = <данные поля>”. Имена полей могут быть довольно разными, это зависит от конкретной задачи, и компонент, этим парсингом занимающихся. однако есть стандартные поля, чтение которых обеспечивается базовым парсером:
object { field1 = value1 field2 = operator( arg1, arg2, arg3) field_composite { subfield1 = value11 subfield2 = value12 } }
<note tip>нужны ли объектам имена?</note>
object { attach = "tank:tower" } object { attach 1 = "ship:desk:27" attach 2 = "ship:mast1:topFragment:end" }
Задаёт привязку объекта к локатору. Если необходимо привязаться к более чем одному локатору, поле дублируется и снабжается локальным именем
Пустое поле Attach означает глобальность объекта.
object Hull { attach = "ship" mesh = "ship.mesh" }
Говорит импортёру, что вот тут привязан меш. Компонентная модель не грузит меш напрямую, она работает с компонентами. Но если в скрипте захотят использовать компоненту с мешем - будет откуда взять его имя следующим образом:
class Ship { component SimpleMesh { scene = kurz( "corvette.kurz": mesh( "hull" ) ) }
Здесь компонента ищет ресурс не по введённому вручную имени, а берёт это имя через импортёр Kurz: в файле “corvette.kurz” ищет объект “hull” и смотрит - нет ли у него нужного ему поля “mesh”
Общий алгоритм использования формата таков:
Первичные данные создаются человеком. Мы рассмотрим несколько примеров:
Художник создаёт корабль, как набор связанных между собой мешей - деталей корпуса корабля, такелажа. Часть мешей можно не создавать, например ставить на корабль каждую пушку художнику не требуется. Однако для каждого такого отсутствующего объекта (пушки), создаётся локатор. Если объект проще генерировать в игре (например - верёвку) - создаёются локаторы для двух концов верёвки.
class Gun { component GunLogic component Physics component MeshActor { mesh = scene("scenes/cannons/small:gun01:mesh") } } class Ship { scene = { ship("scenes/ships/frigate") } component Spawner gun { prototype = Gun{ locator= "scenes/cannons/small:gun01:locator" } } }