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; }
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; }
void RepoScene::modifyNode( const GraphType >ype, 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); }
void RepoScene::removeNode( const GraphType >ype, 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!"; } }