Перестройка узлов в анимациях сцены
This commit is contained in:
parent
6811650249
commit
b5572c5de0
|
@ -43,6 +43,8 @@ class Scene
|
||||||
void rebuild_Nodes_list(T& nodes, const Scene& from); // Перестройка узлов выбранного списка
|
void rebuild_Nodes_list(T& nodes, const Scene& from); // Перестройка узлов выбранного списка
|
||||||
template <class T>
|
template <class T>
|
||||||
void move_parent(Node& for_node, const std::list<T>& from_nodes, std::list<T>& this_nodes); // Сдвигает родителя узла между двумя списками при условии его принадлежности к оригинальному
|
void move_parent(Node& for_node, const std::list<T>& from_nodes, std::list<T>& this_nodes); // Сдвигает родителя узла между двумя списками при условии его принадлежности к оригинальному
|
||||||
|
template <class T>
|
||||||
|
void move_animation_target(Node*& target, const std::list<T>& from_nodes, std::list<T>& this_nodes); // Перестройка узлов анимации
|
||||||
};
|
};
|
||||||
|
|
||||||
#endif // SCENE_H
|
#endif // SCENE_H
|
||||||
|
|
|
@ -8,7 +8,8 @@ Scene::Scene()
|
||||||
|
|
||||||
// Конструктор копирования
|
// Конструктор копирования
|
||||||
Scene::Scene(const Scene ©): root(copy.root),
|
Scene::Scene(const Scene ©): root(copy.root),
|
||||||
nodes(copy.nodes), models(copy.models), cameras(copy.cameras)
|
nodes(copy.nodes), models(copy.models), cameras(copy.cameras),
|
||||||
|
animations(copy.animations), animation_names(copy.animation_names)
|
||||||
{
|
{
|
||||||
rebuld_tree(copy);
|
rebuld_tree(copy);
|
||||||
}
|
}
|
||||||
|
@ -20,6 +21,8 @@ Scene& Scene::operator=(const Scene& other)
|
||||||
nodes = other.nodes;
|
nodes = other.nodes;
|
||||||
models = other.models;
|
models = other.models;
|
||||||
cameras = other.cameras;
|
cameras = other.cameras;
|
||||||
|
animations = other.animations;
|
||||||
|
animation_names = other.animation_names;
|
||||||
|
|
||||||
rebuld_tree(other);
|
rebuld_tree(other);
|
||||||
|
|
||||||
|
@ -79,6 +82,18 @@ void Scene::move_parent(Node& for_node, const std::list<T>& from_nodes, std::lis
|
||||||
for_node.setParent(&(*it_this));
|
for_node.setParent(&(*it_this));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Перестройка узлов анимации
|
||||||
|
template <class T>
|
||||||
|
void Scene::move_animation_target(Node*& target, const std::list<T>& from_nodes, std::list<T>& this_nodes)
|
||||||
|
{
|
||||||
|
// Цикл по элементам списков для перемещения родителя
|
||||||
|
// Списки в процессе копирования идеинтичные, вторая проверка не требуется
|
||||||
|
for (auto it_from = from_nodes.begin(), it_this = this_nodes.begin(); it_from != from_nodes.end(); ++it_from, ++it_this)
|
||||||
|
// Если адрес объекта, на который указывает итератор, совпадает с родителем - меняем родителя по второму итератору (it_this)
|
||||||
|
if (&(*it_from) == target)
|
||||||
|
target = &(*it_this);
|
||||||
|
}
|
||||||
|
|
||||||
// Перестройка дерева после копирования или присваивания
|
// Перестройка дерева после копирования или присваивания
|
||||||
void Scene::rebuld_tree(const Scene& from)
|
void Scene::rebuld_tree(const Scene& from)
|
||||||
{
|
{
|
||||||
|
@ -86,6 +101,32 @@ void Scene::rebuld_tree(const Scene& from)
|
||||||
rebuild_Nodes_list(nodes, from);
|
rebuild_Nodes_list(nodes, from);
|
||||||
rebuild_Nodes_list(models, from);
|
rebuild_Nodes_list(models, from);
|
||||||
rebuild_Nodes_list(cameras, from);
|
rebuild_Nodes_list(cameras, from);
|
||||||
|
|
||||||
|
// Восстановим указатели на узлы для каналов анимаций
|
||||||
|
for (auto & animation : animations)
|
||||||
|
for (auto & channel : animation.channels)
|
||||||
|
{
|
||||||
|
// Если целевой узел - оригинальный корневой узел, то меняем на собственный корневой узел
|
||||||
|
if (channel.target == &from.root)
|
||||||
|
{
|
||||||
|
channel.target = &root;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если можно привести к модели, то ищем родителя среди моделей
|
||||||
|
if (dynamic_cast<Model*>(channel.target))
|
||||||
|
move_animation_target(channel.target, from.models, this->models);
|
||||||
|
else
|
||||||
|
// Иначе проверяем на принадлежность к камерам
|
||||||
|
if (dynamic_cast<Camera*>(channel.target))
|
||||||
|
move_animation_target(channel.target, from.cameras, this->cameras);
|
||||||
|
// Иначе это пустой узел
|
||||||
|
else
|
||||||
|
move_animation_target(channel.target, from.nodes, this->nodes);
|
||||||
|
|
||||||
|
// Не нашли узел - значит он не часть этой сцены
|
||||||
|
// и изменений по каналу не требуется
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
#define TINYOBJLOADER_IMPLEMENTATION
|
#define TINYOBJLOADER_IMPLEMENTATION
|
||||||
|
|
Loading…
Reference in New Issue