Класс Unigine :: NodeReference
Header: | #include <UnigineNodes.h> |
Inherits from: | Node |
A node reference is a node that refers to an external .node asset on the disk, which is obtained by exporting a node from the world. The world can contain several node references referring to the same .node file. Ссылка на узел - это узел, который ссылается на внешний файл .node на диске, который получается путем экспорта узла из мира.
The .node file usually contains a pre-fabricated node (or a hierarchy of nodes) with links to all the materials, properties and physical bodies that are required for its rendering and behaviour. All changes that are made for the node reference via UnigineEditor are saved into this file. When editing the node reference via code, implement saving changes into the .node file. Файл .node обычно содержит предварительно изготовленный узел (или иерархию узлов) со всеми материалами и свойствами, которые требуются для его визуализации. Все изменения, сделанные для ссылки на узел через UnigineEditor, сохраняются в этом файле.
Node references should be used to propagate a lot of identical objects repeated in the world: unlike regular nodes, reference nodes are loaded into the world faster because of the internal cache usage. It will also make it easier to apply the same changes to all repeated objects. Ссылку на узел следует использовать вместо узла, если в мире много повторяющихся идентичных объектов: это позволит избежать ручного редактирования каждого объекта, если вам нужно внести одинаковые изменения во все эти объекты.
В отличие от обычных узлов, ссылочные узлы загружаются в мир быстрее из-за использования внутреннего кеша.
A NodeReference instance is a Posessor of the nodes stored by it, so it is responsible for loading and deleting them. You can detach the node from the NodeReference instance to make it managed by the World. Экземпляр NodeReference является владельцем узла (или узлов), хранящегося по ссылке, поэтому он отвечает за их загрузку и удаление.
Node Reference TransformationsПреобразования ссылок на узлы#
Local transformation of the root node stored by the NodeReference is not necessarily identity, it can be displaced relative to the NodeReference position, for example. Преобразование NodeReference отличается от преобразования узла (или узлов), хранящегося в ссылке. Однако для NodeReference используется матричная иерархия . Таким образом, при перемещении NodeReference его корневой узел, хранящийся в ссылке, также будет перемещаться относительно этого NodeReference. При этом локальная матрица преобразования корневого ссылочного узла не изменится.
See AlsoСмотрите также#
- Article on Nodes that lists the main differences between the regular nodes and reference nodes Статья о Узлах , в которой перечислены основные различия между обычными узлами и ссылочными узлами
- Article on Node Reference Статья о Справке по узлам
Creating a Node ReferenceСоздание ссылки на узел#
To create a NodeReference, you should specify a path to the existing .node file. For example, you can export a node into a .node file and then create a NodeReference by using it: Чтобы создать NodeReference, вы должны указать путь к существующему файлу .node. Например, вы можете экспортировать узел в файл .node, а затем создать NodeReference, используя его:
#include <UnigineEditor.h>
#include <UnigineNodes.h>
#include <UnigineObjects.h>
#include <UnigineWorld.h>
using namespace Unigine;
int AppWorldLogic::init() {
// create a mesh
MeshPtr mesh = Mesh::create();
mesh->addBoxSurface("box_0", Math::vec3(1.0f));
// create a dynamic mesh by using the mesh
ObjectMeshDynamicPtr dynamic = ObjectMeshDynamic::create(mesh);
// export the dynamic mesh into a .node file
World::saveNode("unigine_project/nodes/node_reference_0.node", dynamic->getNode());
// create a node reference
NodeReferencePtr nodeRef = NodeReference::create("unigine_project/nodes/node_reference_0.node");
return 1;
}
Also you can cast a Node instance to the NodeReference. However, such type casting is possible only if the Node type is NODE_REFERENCE. For example: Также вы можете привести экземпляр Node к NodeReference. Однако такое приведение типов возможно только в том случае, если типом узла является NODE_REFERENCE . Например:
// AppWorldLogic.h
#include <UnigineLogic.h>
#include <UnigineStreams.h>
#include <UnigineNode.h>
#include <UnigineNodes.h>
class AppWorldLogic : public Unigine::WorldLogic {
public:
AppWorldLogic();
virtual ~AppWorldLogic();
virtual int init();
virtual int update();
virtual int postUpdate();
virtual int updatePhysics();
virtual int shutdown();
virtual int save(const Unigine::StreamPtr &stream);
virtual int restore(const Unigine::StreamPtr &stream);
private:
void nodeCast(Unigine::NodePtr node);
};
// AppWorldLogic.cpp
#include <UnigineConsole.h>
#include <UnigineObjects.h>
#include <UnigineWorld.h>
using namespace Unigine;
void AppWorldLogic::nodeCast(NodePtr node) {
// check if the node is a NodeReference
if (node->getType() == Node::NODE_REFERENCE)
{
// cast the node to the NodeReference
NodeReferencePtr nodeRef = checked_ptr_cast<NodeReference>(node);
// set a name for the NodeReference
nodeRef->setName("NodeReference_casted");
}
}
int AppWorldLogic::init() {
// create a NodeReference from the file
NodeReferencePtr nodeRef_0 = NodeReference::create("unigine_project/nodes/node_reference_0.node");
// set a name
nodeRef_0->setName("NodeReference_0");
// save changes into the .world file
Console::run("world_save");
// get the added NodeReference as a Node
NodePtr node = World::getNodeByName("NodeReference_0");
// cast the obtained Node to a NodeReference
nodeCast(node);
return 1;
}
In the result, the NodeReference_0 node will be converted to the NodeReference_casted node. В результате узел NodeReference_0 будет преобразован в узел NodeReference_casted.
Editing a Node ReferenceРедактирование ссылки на узел#
Editing a NodeReference includes: Редактирование NodeReference включает:
- Changing the path to the referenced .node file. Изменение пути к указанному файлу .node.
- Editing the node stored by the reference. Редактирование узла, хранящегося по ссылке.
To access the node to which the NodeReference refers, use the getReference() method. To save the modified reference node to the same .node asset, use World::saveNode() method as follows: To access the node to which the NodeReference refers, use the Reference property. To save the modified reference node to the same .node asset, use World.SaveNode() method as follows: To access the node to which the NodeReference refers, use the getReference() method. To save the modified reference node to the same .node asset, use engine.world.saveNode() method as follows: Чтобы получить доступ к узлу, к которому относится NodeReference, используйте метод getReference() следующим образом:
#include <UnigineConsole.h>
#include <UnigineEditor.h>
#include <UnigineNodes.h>
#include <UnigineObjects.h>
#include <UnigineWorld.h>
using namespace Unigine;
int AppWorldLogic::init() {
// create a NodeReference instance
NodeReferencePtr nodeRef = NodeReference::create("unigine_project/nodes/node_reference_0.node");
// set a name
nodeRef->setName("NodeReference_0");
// get a node stored by the reference and check if it is an ObjectMeshDynamic
if (nodeRef->getReference()->getType() == Node::OBJECT_MESH_DYNAMIC) {
// cast the referenced node to the ObjectMeshDynamic type
ObjectMeshDynamicPtr dynamic = checked_ptr_cast<ObjectMeshDynamic>(nodeRef->getReference());
// set a material
dynamic->setMaterial("mesh_base", 0);
// save changes on the referenced node into the .node file
World::saveNode(nodeRef->getNodeName(), dynamic);
}
return 1;
}
In the result, the source .node file, to which the NodeReference refers, will be updated and the NodeReference_0 node will refer to the updated node with the material assigned. If you want all NodeReferences that refer to the modifed .node asset to update automatically, you should enable automatic reloading of NodeReferences by calling the setAutoReloadNodeReferences() method preliminarily. В результате будет обновлен исходный файл .node, на который ссылается NodeReference, а узел NodeReference_0 будет ссылаться на обновленный узел с назначенным материалом.
NodeReference Class
Члены класса
static NodeReferencePtr create ( const char * name ) #
Constructor. Creates a new object that references a node from a given file. Конструктор. Создает новый объект, который ссылается на узел из заданного файла.Аргументы
- const char * name - Path to a *.node file. Путь к файлу *.node.
void setNodeName ( const char * name ) #
Sets a reference to a new *.node file.// create an NodeReference instance
NodeReferencePtr nodeRef = NodeReference::create("unigine_project/nodes/reference_0.node");
// ...
// change a reference node
nodeRef->setNodePath("unigine_project/nodes/reference_1.node");
// create an NodeReference instance
NodeReferencePtr nodeRef = NodeReference::create("unigine_project/nodes/reference_0.node");
// ...
// change a reference node
nodeRef->setNodeName("unigine_project/nodes/reference_1.node");
Аргументы
- const char * name - Path to a *.node file. Путь к файлу *.node.
const char * getNodeName ( ) #
Returns the path to the referenced *.node file.// create an NodeReference instance
NodeReferencePtr nodeRef = NodeReference::create("unigine_project/nodes/reference_0.node");
// ...
// return the path to the reference node
Log::message("The referenced node is: %s\n",nodeRef->getNodePath());
// create an NodeReference instance
NodeReferencePtr nodeRef = NodeReference::create("unigine_project/nodes/reference_0.node");
// ...
// return the path to the reference node
Log::message("The referenced node is: %s\n",nodeRef->getNodeName());
Возвращаемое значение
Path to the referenced *.node file. Путь к указанному файлу *.node.Ptr<Node> getReference ( ) #
Returns the node stored by the reference. The method should be used when you need to change the referenced node. If getReference() has returned a NodeDummy instance, it means that several nodes of the same hierarchy level has been converted into the NodeReference.// create a NodeReference instance
NodeReferencePtr nodeRef = NodeReference::create("unigine_project/nodes/single_nref.node");
// get a node stored by the reference
NodePtr node = nodeRef->getReference();
// if the node is a NodeDummy
if (node->>getType() == Node::NODE_DUMMY){
// print the type name of each child node of the root node stored by the reference
for(int i = 0; i & node->getNumChildren(); i++) {
Log::message("%d: %s\n",i,node->getChild(i)->getTypeName());
}
}
// create a NodeReference instance
NodeReferencePtr nodeRef = NodeReference::create("unigine_project/nodes/single_nref.node");
// get a node stored by the reference
NodePtr node = nodeRef->getReference();
// if the node is a NodeDummy
if (node->>getType() == Node::NODE_DUMMY){
// print the type name of each child node of the root node stored by the reference
for(int i = 0; i & node->getNumChildren(); i++) {
Log::message("%d: %s\n",i,node->getChild(i)->getTypeName());
}
}
Возвращаемое значение
Node instance. Экземпляр узла.int canBeReference ( const char * name, const Ptr<Node> & node ) #
Returns a value indicating if the hierarchy of the given node does not contain a node reference with the given name. Возвращает значение, указывающее, не содержит ли иерархия данного узла ссылку на узел с заданным именем.Аргументы
- const char * name - Node reference name. Ссылочное имя узла.
- const Ptr<Node> & node - Node to check. Узел для проверки.
Возвращаемое значение
true if the hierarchy of the given node does not contain a node reference with the given name; otherwise, false. 1 , если иерархия данного узла не содержит ссылки на узел с данным именем; в противном случае 0 .Ptr<Node> detachReference ( ) #
Returns the node stored by the reference and releases this node of ownership so it is no longer owned and referred to by the NodeReference. The node is managed by the World.To remove the node do the following:To remove the node do the following:
// create a new NodeReference instance
NodeReferencePtr nodeRef = NodeReference::create("unigine_project/nodes/node_reference_0.node");
// perform something
// ...
// get the node stored by the reference and release NodeReference ownership of the node
NodePtr node = nodeRef->detachReference();
// destroy the NodeReference pointer as the NodeReference doesn't refer to a node any more
nodeRef.deleteForce();
To remove the node do the following: Чтобы удалить узел, сделайте следующее:
// create a new NodeReference instance
NodeReferencePtr nodeRef = NodeReference::create("unigine_project/nodes/node_reference_0.node");
// perform something
// ...
// get the node stored by the reference and release NodeReference ownership of the node
NodePtr node = nodeRef->detachReference();
// destroy the NodeReference pointer as the NodeReference doesn't refer to a node any more
nodeRef.destroy();