Класс сцены
This commit is contained in:
parent
9142518494
commit
d1ec60c285
|
@ -0,0 +1,32 @@
|
||||||
|
#ifndef SCENE_H
|
||||||
|
#define SCENE_H
|
||||||
|
|
||||||
|
#include <list>
|
||||||
|
|
||||||
|
#include "Model.h"
|
||||||
|
|
||||||
|
// Класс сцены
|
||||||
|
class Scene
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Scene(); // Конструктор пустой сцены
|
||||||
|
Scene(const Scene ©); // Конструктор копирования
|
||||||
|
Scene& operator=(const Scene& other); // Оператор присваивания
|
||||||
|
|
||||||
|
void render(); // Рендер сцены
|
||||||
|
|
||||||
|
Node root; // Корневой узел
|
||||||
|
|
||||||
|
// Списки объектов, выступающих узлами
|
||||||
|
std::list<Node> nodes; // Список пустых узлов
|
||||||
|
std::list<Model> models; // Список моделей для рендера
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void rebuld_tree(const Scene& from); // Перестройка дерева после копирования или присваивания
|
||||||
|
template <class T>
|
||||||
|
void rebuild_Nodes_list(T& nodes, const Scene& from); // Перестройка узлов выбранного списка
|
||||||
|
template <class T>
|
||||||
|
void move_parent(Node& for_node, const std::list<T>& from_nodes, std::list<T>& this_nodes); // Сдвигает родителя узла между двумя списками при условии его принадлежности к оригинальному
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SCENE_H
|
|
@ -0,0 +1,83 @@
|
||||||
|
#include "Scene.h"
|
||||||
|
|
||||||
|
// Конструктор пустой сцены
|
||||||
|
Scene::Scene()
|
||||||
|
{
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
// Конструктор копирования
|
||||||
|
Scene::Scene(const Scene ©): root(copy.root),
|
||||||
|
nodes(copy.nodes), models(copy.models)
|
||||||
|
{
|
||||||
|
rebuld_tree(copy);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Оператор присваивания
|
||||||
|
Scene& Scene::operator=(const Scene& other)
|
||||||
|
{
|
||||||
|
root = other.root;
|
||||||
|
nodes = other.nodes;
|
||||||
|
models = other.models;
|
||||||
|
|
||||||
|
rebuld_tree(other);
|
||||||
|
|
||||||
|
return *this;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Рендер сцены
|
||||||
|
void Scene::render()
|
||||||
|
{
|
||||||
|
for (auto & model : models)
|
||||||
|
model.render();
|
||||||
|
}
|
||||||
|
|
||||||
|
// Перестройка узлов выбранного списка
|
||||||
|
template <class T>
|
||||||
|
void Scene::rebuild_Nodes_list(T& nodes, const Scene& from)
|
||||||
|
{
|
||||||
|
for (auto it = nodes.begin(); it != nodes.end(); it++)
|
||||||
|
{
|
||||||
|
// Берем родителя, который указывает на оригинальный объект
|
||||||
|
Node* parent = it->getParent();
|
||||||
|
|
||||||
|
// Если родитель - оригинальный корневой узел, то меняем на собственный корневой узел
|
||||||
|
if (parent == &from.root)
|
||||||
|
{
|
||||||
|
it->setParent(&root);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если можно привести к модели, то ищем родителя среди моделей
|
||||||
|
if (dynamic_cast<Model*>(parent))
|
||||||
|
move_parent(*it, from.models, this->models);
|
||||||
|
// Иначе это пустой узел
|
||||||
|
else
|
||||||
|
move_parent(*it, from.nodes, this->nodes);
|
||||||
|
|
||||||
|
// Не нашли родителя - значит он не часть этой сцены
|
||||||
|
// и изменений по нему не требуется
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Сдвигает родителя узла между двумя списками при условии его принадлежности к оригинальному
|
||||||
|
template <class T>
|
||||||
|
void Scene::move_parent(Node& for_node, const std::list<T>& from_nodes, std::list<T>& this_nodes)
|
||||||
|
{
|
||||||
|
// Возьмем адрес родителя
|
||||||
|
Node* parent = for_node.getParent();
|
||||||
|
// Цикл по элементам списков для перемещения родителя
|
||||||
|
// Списки в процессе копирования идеинтичные, вторая проверка не требуется
|
||||||
|
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) == parent)
|
||||||
|
for_node.setParent(&(*it_this));
|
||||||
|
}
|
||||||
|
|
||||||
|
// Перестройка дерева после копирования или присваивания
|
||||||
|
void Scene::rebuld_tree(const Scene& from)
|
||||||
|
{
|
||||||
|
// Восстановим родителей в пустых узлах для копии
|
||||||
|
rebuild_Nodes_list(nodes, from);
|
||||||
|
rebuild_Nodes_list(models, from);
|
||||||
|
}
|
Loading…
Reference in New Issue