Difference between revisions of "Basic Concept"

From Ciliz|W4
Line 58: Line 58:
 
то узел childNode будет сдвинут на 1 по оси X относительно родителя.
 
то узел childNode будет сдвинут на 1 по оси X относительно родителя.
 
|-
 
|-
| <syntaxhighlight lang="c++">XXXXXXXXX</syntaxhighlight> || Example
+
| <syntaxhighlight lang="c++">void removeChild(w4::cref<Node>)
 +
 
 +
void removeChild(const std::string&)
 +
 
 +
void removeChild(const std::list<w4::sptr<Node>>&)</syntaxhighlight> || Отвязка “детей“ от узла по указателю, имени и списку.
 
|-
 
|-
| <syntaxhighlight lang="c++">XXXXXXXXX</syntaxhighlight> || Example
+
| <syntaxhighlight lang="c++">void traversal(const Callback&)
 +
 
 +
void traversal(const PredicateC & predicate, const Callback&)
 +
 
 +
template<typename T> void traversalTyped(const std::function<void(w4::cref<T>)>&);</syntaxhighlight> || Выполнение функтора начиная с текущего узла и вниз по иерархии.
 +
 
 +
Callback имеет сигнатуру '''void(Node&) PredicateC - bool(w4::core::Node&)'''
 +
 
 +
Последний метод вызывается только для узлов, чей тип унаследован от T
 
|-
 
|-
 
| <syntaxhighlight lang="c++">XXXXXXXXX</syntaxhighlight> || Example
 
| <syntaxhighlight lang="c++">XXXXXXXXX</syntaxhighlight> || Example

Revision as of 14:57, 16 June 2020

Scope

В статье описаны основные решения, используемые в W4 Game Engine, и их API.

Coordinate System

Координатная система

Используется left-handed координатная система и вращение производится против часовой стрелки, если смотреть в направлении оси.

Render Tree

Отображаемый на экране результат и зависимость трансформаций объектов друг от друга определяются деревом рендеринга, то есть набором объектов рендеринга. Особенности дерева рендеринга W4 Game Engine:

  • Минимальное дерево рендеринга состоит только из корневого узла.
  • У каждого узла может быть ноль или более подузлов — «детей», но при этом у узла не может быть более одного “родителя“ (самый верхний узел - “корневой“ - родителя не имеет).
  • Для того чтобы объект отобразился на экране и/или пересчитал свои данные, необходимо чтобы он находился в дереве.
  • Иерархия встроенных типов узлов показана на схеме.

Concept 02.png

Примечания по использованию:

  • При рисовании в несколько проходов, у каждого прохода создаётся своё дерево со своим корневым узлом.
  • У каждого узла можно узнать локальные трансформации (то есть трансформации относительно “родителя“) и мировые, а также задать их.
  • При задании мировых координат узла пересчитываются его локальные координаты, при задании локальных - мировые.
  • У узла, не имеющего родителя трансформации совпадают.
  • Можно временно отключить узел, при этом отключаются и все его “потомки“.

Интерфейсы узлов (классов) описаны далее.

Node

Node - базовый класс любого узла (в том числе RootNode).

Метод Описание
w4::sptr<render::RootNode> getRoot() const
Возвращает корневой узел дерева или nullptr при её отсутствии.
w4::sptr<Node> clone() const
Создаёт копию узла, но не имеющую “родителя“
w4::sptr<Node> getParent() const
Возвращает “родительский“ узел или nullptr при её отсутствии.
void setEnabled(bool)
Включает/выключает узел и его “потомков“
void addChild(w4::cref<Node>, bool preserveTransorm = true)

void addChild(const std::string&, w4::cref<Node>, bool preserveTransorm = true)
Добавляет “детей“ к текущему узлу. Возможно задание имени для “ребёнка“.

Параметр "preserveTransform" определяет локальные(false) или глобальные(true) трансформации, которые сохраняются у “ребёнка“.

Например, если дополнить код слева строками:

childNode->setTranslation({1, 0, 0});
parentNode->addChild(childNode);

то узел childNode будет находиться в мировой позиции {1, 0, 0},

а если использовать следующие строки:

childNode->setTranslation({1, 0, 0});
parentNode->addChild(childNode, false);

то узел childNode будет сдвинут на 1 по оси X относительно родителя.

void removeChild(w4::cref<Node>)

void removeChild(const std::string&)

void removeChild(const std::list<w4::sptr<Node>>&)
Отвязка “детей“ от узла по указателю, имени и списку.
void traversal(const Callback&)

 void traversal(const PredicateC & predicate, const Callback&)

template<typename T> void traversalTyped(const std::function<void(w4::cref<T>)>&);
Выполнение функтора начиная с текущего узла и вниз по иерархии.

Callback имеет сигнатуру void(Node&) PredicateC - bool(w4::core::Node&)

Последний метод вызывается только для узлов, чей тип унаследован от T

XXXXXXXXX
Example
XXXXXXXXX
Example
XXXXXXXXX
Example
XXXXXXXXX
Example
XXXXXXXXX
Example
XXXXXXXXX
Example
XXXXXXXXX
Example
XXXXXXXXX
Example

Hierarchy Example

VisibleNode

Mesh

SkinnedMesh

Animator API

ParticlesEmitter

Billboard

Plotter

DataNode

ArcBallNode

Camera

PointLight

SpotLight

Spline