Ejemplo n.º 1
0
	void TraversePin(UEdGraphPin* Pin)
	{
		if (UK2Node_Knot* Knot = Cast<UK2Node_Knot>(Pin->GetOwningNodeUnchecked()))
		{
			TraverseNodes(Knot);
		}
		else
		{
			VisitedPins.Add(Pin);

			for (UEdGraphPin* OtherPin : Pin->LinkedTo)
			{
				UEdGraphNode* OtherNode = OtherPin->GetOwningNodeUnchecked();
				if (OtherNode && OtherNode->IsA(UK2Node_Knot::StaticClass()))
				{
					TraverseNodes(OtherNode);
				}
			}
		}
	}
Ejemplo n.º 2
0
	void TraverseNodes(UEdGraphNode* Node)
	{
		if (VisitedNodes.Contains(Node))
		{
			return;
		}
		VisitedNodes.Add(Node);

		for (UEdGraphPin* MyPin : Node->Pins)
		{
			VisitedPins.Add(MyPin);

			for (UEdGraphPin* OtherPin : MyPin->LinkedTo)
			{
				UEdGraphNode* OtherNode = OtherPin->GetOwningNodeUnchecked();
				if (OtherNode && OtherNode->IsA(UK2Node_Knot::StaticClass()))
				{
					TraverseNodes(OtherNode);
				}
			}
		}
	}
Ejemplo n.º 3
0
CUmbralMap::CUmbralMap(const MapLayoutPtr& mapLayout)
{
	for(const auto& resourceItem : mapLayout->GetResourceItems())
	{
		if(resourceItem.type == '\0trb' || resourceItem.type == '\0txb')
		{
			CResourceManager::GetInstance().LoadResource(resourceItem.resourceId, resourceItem.name);
		}
	}

	const auto& layoutNodes = mapLayout->GetLayoutNodes();

	//Build bg parts
	for(const auto& nodePair : layoutNodes)
	{
		if(auto bgPartObjectNode = std::dynamic_pointer_cast<CMapLayout::BGPARTS_BASE_OBJECT_NODE>(nodePair.second))
		{
			auto bgPartObject = CreateBgPartObject(mapLayout, bgPartObjectNode);
			assert(bgPartObject);
			m_bgPartObjects.insert(std::make_pair(nodePair.first, bgPartObject));
		}
	}

	for(const auto& nodePair : layoutNodes)
	{
		if(auto instanceNode = std::dynamic_pointer_cast<CMapLayout::INSTANCE_OBJECT_NODE>(nodePair.second))
		{
			auto refNodeIterator = layoutNodes.find(instanceNode->refNodePtr);
			if(refNodeIterator == std::end(layoutNodes)) continue;

			CVector3 instancePosition(instanceNode->posX, instanceNode->posY, instanceNode->posZ);
			CQuaternion instanceRotY(CVector3(0, -1, 0), instanceNode->rotY);

			auto refNode = refNodeIterator->second;
			if(auto unitTreeObjectNode = std::dynamic_pointer_cast<CMapLayout::UNIT_TREE_OBJECT_NODE>(refNode))
			{
				for(const auto& item : unitTreeObjectNode->items)
				{
					auto refNodeIterator = layoutNodes.find(item.nodePtr);
					assert(refNodeIterator != std::end(layoutNodes));
					if(refNodeIterator == std::end(layoutNodes)) continue;

					auto refNode = refNodeIterator->second;
					if(auto bgPartsBaseObjectNode = std::dynamic_pointer_cast<CMapLayout::BGPARTS_BASE_OBJECT_NODE>(refNode))
					{
						auto bgPartObjectIterator = m_bgPartObjects.find(item.nodePtr);
						assert(bgPartObjectIterator != std::end(m_bgPartObjects));
						if(bgPartObjectIterator == std::end(m_bgPartObjects)) continue;

						auto tempNode = Palleon::CSceneNode::Create();
						tempNode->AppendChild(bgPartObjectIterator->second);
						tempNode->SetPosition(instancePosition);
						tempNode->SetRotation(instanceRotY);
						tempNode->UpdateTransformations();
						tempNode->TraverseNodes(
							[&] (const Palleon::SceneNodePtr& node)
							{
								if(auto mesh = std::dynamic_pointer_cast<CUmbralMesh>(node))
								{
									auto instance = mesh->CreateInstance();
									m_instances.push_back(instance);
								}
								return true;
							}
						);
					}
				}
			}
			else if(auto bgPartObjectNode = std::dynamic_pointer_cast<CMapLayout::BGPARTS_BASE_OBJECT_NODE>(refNode))
			{
				auto bgPartObjectIterator = m_bgPartObjects.find(refNodeIterator->first);
				assert(bgPartObjectIterator != std::end(m_bgPartObjects));
				if(bgPartObjectIterator == std::end(m_bgPartObjects)) continue;

				auto tempNode = Palleon::CSceneNode::Create();
				tempNode->AppendChild(bgPartObjectIterator->second);
				tempNode->SetPosition(instancePosition);
				tempNode->SetRotation(instanceRotY);
				tempNode->UpdateTransformations();

				tempNode->TraverseNodes(
					[&] (const Palleon::SceneNodePtr& node)
					{
						if(auto mesh = std::dynamic_pointer_cast<CUmbralMesh>(node))
						{
							auto instance = mesh->CreateInstance();
							m_instances.push_back(instance);
						}
						return true;
					}
				);
			}
		}
	}
}