Класс сцены
This commit is contained in:
parent
30ffd7e882
commit
e8ffed7feb
30
include/Scene.h
Normal file
30
include/Scene.h
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
#ifndef SCENE_H
|
||||||
|
#define SCENE_H
|
||||||
|
|
||||||
|
#include "Model.h"
|
||||||
|
|
||||||
|
// Класс сцены
|
||||||
|
class Scene
|
||||||
|
{
|
||||||
|
public:
|
||||||
|
Scene(); // Конструктор пустой сцены
|
||||||
|
Scene(const Scene ©); // Конструктор копирования
|
||||||
|
Scene& operator=(const Scene& other); // Оператор присваивания
|
||||||
|
|
||||||
|
void render(); // Рендер сцены
|
||||||
|
|
||||||
|
Node root; // Корневой узел
|
||||||
|
|
||||||
|
// Списки объектов, выступающих узлами
|
||||||
|
std::vector<Node> nodes; // Список пустых узлов
|
||||||
|
std::vector<Model> models; // Список моделей для рендера
|
||||||
|
|
||||||
|
protected:
|
||||||
|
void rebuld_tree(const Scene& from); // Перестройка дерева после копирования или присваивания
|
||||||
|
template <class T>
|
||||||
|
void rebuild_Nodes_vector(T& nodes, const Scene& from); // Перестройка узлов выбранного списка
|
||||||
|
template <class T>
|
||||||
|
bool move_pointer(Node& for_node, const std::vector<T>& from_nodes, std::vector<T>& this_nodes); // Сдвигает родителя узла между двумя списками при условии его принадлежности к оригинальному, возвращает признак замены
|
||||||
|
};
|
||||||
|
|
||||||
|
#endif // SCENE_H
|
83
src/Scene.cpp
Normal file
83
src/Scene.cpp
Normal file
@ -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_vector(T& nodes, const Scene& from)
|
||||||
|
{
|
||||||
|
for (int i = 0; i < nodes.size(); i++)
|
||||||
|
{
|
||||||
|
// Берем родителя, который указывает на оригинальный объект
|
||||||
|
Node* parent = nodes[i].getParent();
|
||||||
|
|
||||||
|
// Если родитель - оригинальный корневой узел, то меняем на собственный корневой узел
|
||||||
|
if (parent == &from.root)
|
||||||
|
{
|
||||||
|
nodes[i].setParent(&root);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Если наши родителя - меняем на него
|
||||||
|
if (move_pointer(nodes[i], from.nodes, this->nodes))
|
||||||
|
continue;
|
||||||
|
if (move_pointer(nodes[i], from.models, models))
|
||||||
|
continue;
|
||||||
|
|
||||||
|
// Не нашли родителя - значит он не часть этой сцены
|
||||||
|
// и изменений по нему не требуется
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Сдвигает родителя узла между двумя списками при условии его принадлежности к оригинальному, возвращает признак замены
|
||||||
|
template <class T>
|
||||||
|
bool Scene::move_pointer(Node& for_node, const std::vector<T>& from_nodes, std::vector<T>& this_nodes)
|
||||||
|
{
|
||||||
|
// Определим отступ в памяти
|
||||||
|
std::ptrdiff_t offset = (T*)for_node.getParent() - from_nodes.data();
|
||||||
|
// Если отступ является частью оригинального списка
|
||||||
|
if (offset >= 0 && offset < from_nodes.size())
|
||||||
|
{
|
||||||
|
for_node.setParent(this_nodes.data() + offset); // Замена родителя
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Перестройка дерева после копирования или присваивания
|
||||||
|
void Scene::rebuld_tree(const Scene& from)
|
||||||
|
{
|
||||||
|
// Восстановим родителей в пустых узлах для копии
|
||||||
|
rebuild_Nodes_vector(nodes, from);
|
||||||
|
rebuild_Nodes_vector(models, from);
|
||||||
|
}
|
Loading…
x
Reference in New Issue
Block a user