User Tools

Site Tools


sharedtec:formats:kurz

Kurz

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

Определения

Kurz-файл

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

Чтение файла осуществляется стандартным парсером, который не понимает формата объектов, но способен их бы увидеть, каталогизировать и зачитать их свойства не вдаваясь в детали.

Локатор

Локатор это локальное пространство, или если так удобное - размещение некоего объекта в пространстве, глобальном, либо другого объекта). Локатор определяет позицию, ориентацию и масштаб (скейлинг) дочернего объекта относительно материнского. Локатор содержит:

  • идентификатор
  • место в иерархии
  • трансформация
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%) }

В примере выше показаны три локатора, первый из которых не содержит никаких данных, так как у него всё по нулям, а последний - максимальный набор данных, где и позиция, и ориентация, и даже масштабирование.

Идентификатор

Идентификаторы служат для привязки к локаторам ним объектов или других локаторов. Идентификатор имеет вид [материнский локатор:]<имя>, где <имя> является текстовой строкой, содержащей цифры, литеры и символ подчёркивания. FIXME Правило именования локаторов нужно сделать совместимым с Maya. Например, такое дерево локаторов:

  • 1
    • 2
      • 3
    • 4

Превращается в список полных имён: “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>

Стандартные поля

Attach
object {
    attach = "tank:tower"
}

object {
    attach 1 = "ship:desk:27"
    attach 2 = "ship:mast1:topFragment:end"
}

Задаёт привязку объекта к локатору. Если необходимо привязаться к более чем одному локатору, поле дублируется и снабжается локальным именем FIXME

Пустое поле Attach означает глобальность объекта.

Mesh
object Hull {
    attach = "ship"
    mesh = "ship.mesh"
}

Говорит импортёру, что вот тут привязан меш. Компонентная модель не грузит меш напрямую, она работает с компонентами. Но если в скрипте захотят использовать компоненту с мешем - будет откуда взять его имя следующим образом:

class Ship {
    component SimpleMesh {
        scene = kurz( "corvette.kurz": mesh( "hull" ) )
}

Здесь компонента ищет ресурс не по введённому вручную имени, а берёт это имя через импортёр Kurz: в файле “corvette.kurz” ищет объект “hull” и смотрит - нет ли у него нужного ему поля “mesh”

Техпроцесс

Общий алгоритм использования формата таков:

  1. Создаются первичные данные, в редакторе или вручную. Описывается некая составная сущность, сцена, или просто совокупность объектов.
  2. Сохраняется иерархия сцены в формате Kurz. Можно использовать расширенный формат (создавать свои Форматные Блоки)
  3. Загружается файл иерархии, если загружающий знает о Форматных Блоках, они анализируются, если нет - пропускаются
  4. По загруженному файлу иерархии строится сцена(объект), либо настраивается спавнер этой сцены.

Первичные данные

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

Первичные данные корабля из Maya

Художник создаёт корабль, как набор связанных между собой мешей - деталей корпуса корабля, такелажа. Часть мешей можно не создавать, например ставить на корабль каждую пушку художнику не требуется. Однако для каждого такого отсутствующего объекта (пушки), создаётся локатор. Если объект проще генерировать в игре (например - верёвку) - создаёются локаторы для двух концов верёвки.

Синтаксис Kurz

Формат файла

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

Из скрипта

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" 
       }
   }
}
sharedtec/formats/kurz.txt · Last modified: 2022/04/07 13:13 (external edit)