Ejemplo n.º 1
0
bool RepoScene::addNodeToScene(
	const GraphType &gType,
	const RepoNodeSet nodes,
	std::string &errMsg,
	RepoNodeSet *collection)
{
	bool success = true;
	RepoNodeSet::iterator nodeIterator;
	if (nodes.size() > 0)
	{
		collection->insert(nodes.begin(), nodes.end());
		for (nodeIterator = nodes.begin(); nodeIterator != nodes.end(); ++nodeIterator)
		{
			RepoNode * node = *nodeIterator;
			if (node)
			{
				if (!addNodeToMaps(gType, node, errMsg))
				{
					repoError << "failed to add node (" << node->getUniqueID() << " to scene graph: " << errMsg;
					success = false;
				}
			}
			if (gType == GraphType::DEFAULT)
				newAdded.insert(node->getSharedID());
		}
	}

	return success;
}
Ejemplo n.º 2
0
bool RepoScene::commitNodes(
	repo::core::handler::AbstractDatabaseHandler *handler,
	const std::vector<repoUUID> &nodesToCommit,
	const GraphType &gType,
	std::string &errMsg)
{
	bool success = true;

	bool isStashGraph = gType == GraphType::OPTIMIZED;
	repoGraphInstance &g = isStashGraph ? stashGraph : graph;
	std::string ext = isStashGraph ? stashExt : sceneExt;

	size_t count = 0;
	size_t total = nodesToCommit.size();

	repoInfo << "Committing " << total << " nodes...";

	for (const repoUUID &id : nodesToCommit)
	{
		if (++count % 500 == 0 || count == total - 1)
		{
			repoInfo << "Committing " << count << " of " << total;
		}

		const repoUUID uniqueID = gType == GraphType::OPTIMIZED ? id : g.sharedIDtoUniqueID[id];
		RepoNode *node = g.nodesByUniqueID[uniqueID];
		if (node->objsize() > handler->documentSizeLimit())
		{
			//Try to extract binary data out of the bson to shrink it.
			RepoNode shrunkNode = node->cloneAndShrink();
			if (shrunkNode.objsize() > handler->documentSizeLimit())
			{
				success = false;
				errMsg += "Node '" + UUIDtoString(node->getUniqueID()) + "' over 16MB in size is not committed.";
			}
			else
			{
				node->swap(shrunkNode);
				success &= handler->insertDocument(databaseName, projectName + "." + ext, *node, errMsg);
			}
		}
		else
			success &= handler->insertDocument(databaseName, projectName + "." + ext, *node, errMsg);
	}

	return success;
}
Ejemplo n.º 3
0
void RepoScene::modifyNode(
	const GraphType                   &gtype,
	RepoNode                          *nodeToChange,
	RepoNode                          *newNode,
	const bool						  &overwrite)
{
	if (!nodeToChange || !newNode)
	{
		repoError << "Failed to modify node in scene (node is nullptr)";
		return;
	}
	repoGraphInstance &g = gtype == GraphType::OPTIMIZED ? stashGraph : graph;

	repoUUID sharedID = nodeToChange->getSharedID();

	RepoNode updatedNode;

	//generate new UUID if it  is not in list, otherwise use the current one.
	bool isInList = gtype == GraphType::OPTIMIZED ||
		(newAdded.find(sharedID) != newAdded.end() || newModified.find(sharedID) != newModified.end());
	updatedNode = overwrite ? *newNode : RepoNode(nodeToChange->cloneAndAddFields(newNode, !isInList));

	repoUUID newUniqueID = updatedNode.getUniqueID();

	if (gtype == GraphType::DEFAULT && !isInList)
	{
		newModified.insert(sharedID);
		newCurrent.erase(nodeToChange->getUniqueID());
		newCurrent.insert(newUniqueID);
	}

	//update shared to unique ID  and uniqueID to node mapping
	g.sharedIDtoUniqueID[sharedID] = newUniqueID;
	g.nodesByUniqueID.erase(nodeToChange->getUniqueID());
	g.nodesByUniqueID[newUniqueID] = nodeToChange;

	nodeToChange->swap(updatedNode);
}
Ejemplo n.º 4
0
void RepoScene::removeNode(
	const GraphType                   &gtype,
	const repoUUID                    &sharedID
	)
{
	repoGraphInstance &g = gtype == GraphType::OPTIMIZED ? stashGraph : graph;
	RepoNode *node = getNodeBySharedID(gtype, sharedID);
	if (node)
	{
		//Remove entry from everything.
		g.nodesByUniqueID.erase(node->getUniqueID());
		g.sharedIDtoUniqueID.erase(sharedID);
		g.parentToChildren.erase(sharedID);

		bool keepNode = false;
		if (gtype == GraphType::DEFAULT)
		{
			//If this node was in newAdded or newModified, remove it
			std::set<repoUUID>::iterator iterator;
			if ((iterator = newAdded.find(sharedID)) != newAdded.end())
			{
				newAdded.erase(iterator);
			}
			else
			{
				if ((iterator = newModified.find(sharedID)) != newModified.end())
				{
					newModified.erase(iterator);
				}

				newRemoved.insert(sharedID);
				keepNode = true;
			}
		}

		//remove from the nodes sets
		switch (node->getTypeAsEnum())
		{
		case NodeType::CAMERA:
			g.cameras.erase(node);
			break;
		case NodeType::MATERIAL:
			g.materials.erase(node);
			break;
		case NodeType::MESH:
			g.meshes.erase(node);
			break;
		case NodeType::METADATA:
			g.metadata.erase(node);
			break;
		case NodeType::REFERENCE:
		{
			g.references.erase(node);
			//Since it's reference node, also delete the referenced scene
			RepoScene *s = g.referenceToScene[sharedID];
			delete s;
			g.referenceToScene.erase(sharedID);
		}
		break;
		case NodeType::TEXTURE:
			g.textures.erase(node);
			break;
		case NodeType::TRANSFORMATION:
			g.transformations.erase(node);
			break;
		case NodeType::UNKNOWN:
			g.unknowns.erase(node);
			break;
		default:
			repoError << "Unexpected node type: " << (int)node->getTypeAsEnum();
		}

		if (keepNode)
		{
			//add node onto the toRemove list
			toRemove.push_back(node);
		}
		else
			delete node;
	}
	else
	{
		repoError << "Trying to delete a node that doesn't exist!";
	}
}