Класс сцены
This commit is contained in:
		
							parent
							
								
									71a0f73211
								
							
						
					
					
						commit
						7fc285f941
					
				
							
								
								
									
										32
									
								
								include/Scene.h
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										32
									
								
								include/Scene.h
									
									
									
									
									
										Normal file
									
								
							| @ -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
 | ||||
							
								
								
									
										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_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…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user