Jump to content

List of materials from node


photo

Recommended Posts

Hello,

I have multiple models that I load from .node files.

NodeReferencePtr nodeRef = NodeReference::create(nodePath.c_str());
_node = nodeRef->getReference();
_node->setEnabled(true);

A node can be composed of one ObjectMeshStatic(like pillar_concrete_1) or multiple ObjectMeshStatic in subgroups (Fuselage_R, BackMotor...)

image.png.5d45ce141d0f1bd32cdfd678e6441cd4.png

Is it possible to recover a list of all materials used by a node ?

Link to comment

Hi Damien,

You can do a recursive walk and grab all materials. Something like that:
 

#include <UnigineWorld.h>
#include <UnigineFileSystem.h>

using namespace Unigine;

void process_node(const NodePtr &node)
{
	if (node->isObject())
	{
		ObjectPtr object = static_ptr_cast<Object>(node);
		int num_surfaces = object->getNumSurfaces();
		for (int i = 0; i < num_surfaces; ++i)
		{
			Log::message("object name %s, surface name %s, material path %s\n",
				object->getName(), object->getSurfaceName(i),
				FileSystem::getVirtualPath(object->getMaterial(i)->getPath()).get());
		}
	}

	if (node->getType() == Node::NODE_REFERENCE)
	{
		NodeReferencePtr node_ref = static_ptr_cast<NodeReference>(node);
		process_node(node_ref->getReference());
	}

	int num_children = node->getNumChildren();
	for (int i = 0; i < num_children; ++i)
		process_node(node->getChild(i));
}

int AppWorldLogic::init()
{
	if (NodePtr node = World::getNodeByName("test"))
	{
		process_node(node);
	}
	return 1;
}

Thanks!

  • Like 1
Link to comment
×
×
  • Create New...