24 #include <unordered_map>
26 #include "../../handler/repo_database_handler_abstract.h"
27 #include "../bson/repo_node.h"
28 #include "../bson/repo_node_revision.h"
29 #include "repo_graph_abstract.h"
31 typedef std::unordered_map<repoUUID, std::vector<repo::core::model::RepoNode*>,
RepoUUIDHasher > ParentMap;
38 std::size_t operator()(
const repoUUID& uid)
const
40 return boost::hash<boost::uuids::uuid>()(uid);
47 struct repoGraphInstance
51 RepoNodeSet materials;
54 RepoNodeSet references;
56 RepoNodeSet transformations;
61 std::unordered_map<repoUUID, RepoNode*, RepoUUIDHasher > nodesByUniqueID;
62 std::unordered_map<repoUUID, repoUUID, RepoUUIDHasher > sharedIDtoUniqueID;
63 ParentMap parentToChildren;
64 std::unordered_map<repoUUID, RepoScene*, RepoUUIDHasher > referenceToScene;
67 static const std::vector<std::string> collectionsInProject;
68 static const uint16_t REPO_SCENE_TEXTURE_BIT = 0x0001;
93 const std::string &database = std::string(),
94 const std::string &projectName = std::string(),
95 const std::string &sceneExt = REPO_COLLECTION_SCENE,
96 const std::string &revExt = REPO_COLLECTION_HISTORY,
97 const std::string &stashExt = REPO_COLLECTION_STASH_REPO,
98 const std::string &rawExt = REPO_COLLECTION_RAW,
99 const std::string &issuesExt = REPO_COLLECTION_ISSUES,
100 const std::string &srcExt = REPO_COLLECTION_STASH_SRC,
101 const std::string &gltfExt = REPO_COLLECTION_STASH_GLTF,
102 const std::string &x3dExt = REPO_COLLECTION_STASH_X3D,
103 const std::string &jsonExt = REPO_COLLECTION_STASH_JSON);
127 const std::vector<std::string> &refFiles,
128 const RepoNodeSet &cameras,
129 const RepoNodeSet &meshes,
130 const RepoNodeSet &materials,
131 const RepoNodeSet &metadata,
132 const RepoNodeSet &textures,
133 const RepoNodeSet &transformations,
134 const RepoNodeSet &references = RepoNodeSet(),
135 const RepoNodeSet &maps = RepoNodeSet(),
136 const RepoNodeSet &unknowns = RepoNodeSet(),
137 const std::string &sceneExt = REPO_COLLECTION_SCENE,
138 const std::string &revExt = REPO_COLLECTION_HISTORY,
139 const std::string &stashExt = REPO_COLLECTION_STASH_REPO,
140 const std::string &rawExt = REPO_COLLECTION_RAW,
141 const std::string &issuesExt = REPO_COLLECTION_ISSUES,
142 const std::string &srcExt = REPO_COLLECTION_STASH_SRC,
143 const std::string &gltfExt = REPO_COLLECTION_STASH_GLTF,
144 const std::string &x3dExt = REPO_COLLECTION_STASH_X3D,
145 const std::string &jsonExt = REPO_COLLECTION_STASH_JSON);
155 static std::vector<RepoNode*> filterNodesByType(
156 const std::vector<RepoNode*> nodes,
157 const NodeType filter);
172 return status & REPO_SCENE_TEXTURE_BIT;
178 status |= REPO_SCENE_TEXTURE_BIT;
188 RepoNodeSet &metadata,
189 const bool &exactMatch,
190 const bool &propagateData =
true);
201 const RepoNodeSet &cameras,
202 const RepoNodeSet &meshes,
203 const RepoNodeSet &materials,
204 const RepoNodeSet &textures,
205 const RepoNodeSet &transformations);
225 const std::string &userName,
226 const std::string &message = std::string(),
227 const std::string &tag = std::string());
238 std::string &errMsg);
319 return revNode->getUniqueID();
333 return revNode->getAuthor();
338 static std::vector<std::string> getProjectExtensions()
340 return collectionsInProject;
358 return worldOffset.size() ? worldOffset : std::vector<double>({ 0, 0, 0 });
376 return !unRevisioned;
386 databaseName = sanitizeName(newDatabaseName);
387 projectName = sanitizeName(newProjectName);
396 headRevision =
false;
397 revision = revisionID;
419 const std::vector<double> &offset);
426 std::string getBranchName()
const;
435 if (stashGraph.rootNode)
436 return GraphType::OPTIMIZED;
438 return GraphType::DEFAULT;
451 std::string &errMsg);
462 std::string &errMsg);
472 std::string &errMsg);
480 void updateRevisionStatus(
482 const RevisionNode::UploadStatus &status);
490 void printStatistics(std::iostream &output);
505 const repoUUID &parent,
506 const repoUUID &child,
507 const bool &modifyParent =
true,
508 const bool &modifyChild =
true)
510 return abandonChild(gType, parent, getNodeBySharedID(gType, child), modifyParent, modifyChild);
520 const GraphType &gType,
521 const repoUUID &parent,
523 const bool &modifyParent =
true,
524 const bool &modifyChild =
true);
538 const repoUUID &parent,
539 const repoUUID &child,
540 const bool &noUpdate =
false)
542 addInheritance(gType, getNodeByUniqueID(gType, parent), getNodeByUniqueID(gType, child), noUpdate);
556 const GraphType &gType,
559 const bool &noUpdate =
false);
567 std::vector<RepoNode*>
570 const repoUUID &parent)
const;
579 std::vector<RepoNode*>
580 getChildrenNodesFiltered(
582 const repoUUID &parent,
583 const NodeType &type)
const;
592 std::vector<RepoNode*> getParentNodesFiltered(
593 const GraphType &gType,
595 const NodeType &type)
const;
602 const repoUUID &reference)
const
604 const repoGraphInstance &g = gType == GraphType::OPTIMIZED ? stashGraph : graph;
607 std::unordered_map<repoUUID, RepoScene*, boost::hash<boost::uuids::uuid> >::const_iterator it = g.referenceToScene.find(reference);
608 if (it != g.referenceToScene.end())
609 refScene = it->second;
620 std::string getTextureIDForMesh(
621 const GraphType &gType,
622 const repoUUID &sharedID)
const;
635 return gType == GraphType::OPTIMIZED ? stashGraph.cameras : graph.cameras;
645 return gType == GraphType::OPTIMIZED ? stashGraph.materials : graph.materials;
653 const GraphType &gType = GraphType::DEFAULT)
const
655 return gType == GraphType::OPTIMIZED ? stashGraph.maps : graph.maps;
665 return gType == GraphType::OPTIMIZED ? stashGraph.meshes : graph.meshes;
675 return gType == GraphType::OPTIMIZED ? stashGraph.metadata : graph.metadata;
685 return gType == GraphType::OPTIMIZED ? stashGraph.references : graph.references;
695 return gType == GraphType::OPTIMIZED ? stashGraph.textures : graph.textures;
705 return gType == GraphType::OPTIMIZED ? stashGraph.transformations : graph.transformations;
714 return std::vector<repoUUID>(newAdded.begin(), newAdded.end());
717 std::set<repoUUID> getAllSharedIDs(
718 const GraphType &gType)
const;
726 std::vector<RepoNode*> getAllDescendantsByType(
727 const GraphType &gType,
728 const repoUUID &sharedID,
729 const NodeType &type)
const;
737 return std::vector<repoUUID>(newModified.begin(), newModified.end());
746 return std::vector<repoUUID>(newRemoved.begin(), newRemoved.end());
762 std::vector<repo_vector_t> getSceneBoundingBox()
const;
764 size_t getTotalNodesChanged()
const
766 return newRemoved.size() + newAdded.size() + newModified.size();
777 const repoUUID &sharedID)
const
779 const repoGraphInstance &g = gType == GraphType::OPTIMIZED ? stashGraph : graph;
780 auto it = g.sharedIDtoUniqueID.find(sharedID);
782 if (it == g.sharedIDtoUniqueID.end())
return nullptr;
784 return getNodeByUniqueID(gType, it->second);
795 const repoUUID &uniqueID)
const
797 const repoGraphInstance &g = gType == GraphType::OPTIMIZED ? stashGraph : graph;
798 auto it = g.nodesByUniqueID.find(uniqueID);
800 if (it == g.nodesByUniqueID.end())
return nullptr;
810 const repoGraphInstance &g = gType == GraphType::OPTIMIZED ? stashGraph : graph;
811 return (
bool)g.rootNode;
813 RepoNode* getRoot(
const GraphType &gType)
const {
814 const repoGraphInstance &g = gType == GraphType::OPTIMIZED ? stashGraph : graph;
824 const repoGraphInstance &g = gType == GraphType::OPTIMIZED ? stashGraph : graph;
825 return g.nodesByUniqueID.size();
832 std::vector<std::string> getOriginalFiles()
const;
843 void addNodes(
const std::vector<RepoNode *> &nodes);
857 const repoUUID &sharedID,
859 const bool &overwrite =
false)
861 modifyNode(gtype, getNodeBySharedID(gtype, sharedID), newNode, overwrite);
876 const GraphType >ype,
879 const bool &overwrite =
false);
891 const GraphType >ype,
892 const repoUUID &sharedID);
898 void reorientateDirectXModel();
914 const GraphType &gType,
915 const RepoNodeSet nodes,
917 RepoNodeSet *collection);
929 const GraphType &gType,
931 std::string &errMsg);
943 const std::vector<repoUUID> &nodesToCommit,
944 const GraphType &gType,
945 std::string &errMsg);
954 bool commitProjectSettings(
957 const std::string &userName);
969 bool commitRevisionNode(
973 const std::string &userName,
974 const std::string &message,
975 const std::string &tag);
983 bool commitSceneChanges(
985 std::string &errMsg);
994 void getSceneBoundingBoxInternal(
995 const GraphType &gType,
997 const std::vector<float> &mat,
998 std::vector<repo_vector_t> &bbox)
const;
1009 const GraphType >ype,
1011 std::vector<RepoBSON> nodes,
1012 std::string &errMsg);
1027 void populateAndUpdate(
1028 const GraphType &gType,
1029 const RepoNodeSet &cameras,
1030 const RepoNodeSet &meshes,
1031 const RepoNodeSet &materials,
1032 const RepoNodeSet &metadata,
1033 const RepoNodeSet &textures,
1034 const RepoNodeSet &transformations,
1035 const RepoNodeSet &references,
1036 const RepoNodeSet &maps,
1037 const RepoNodeSet &unknowns);
1045 const std::vector<double> &offset);
1051 std::string sceneExt;
1061 std::vector<RepoNode*> toRemove;
1062 std::vector<double> worldOffset;
1065 std::string commitMsg;
1076 std::set<repoUUID> newCurrent;
1077 std::set<repoUUID> newAdded;
1078 std::set<repoUUID> newRemoved;
1079 std::set<repoUUID> newModified;
1081 repoGraphInstance graph;
1082 repoGraphInstance stashGraph;
RevisionNode * revNode
Definition: repo_scene.h:1069
bool hasRoot(const GraphType &gType) const
Definition: repo_scene.h:809
uint32_t getItemsInCurrentGraph(const GraphType &gType)
Definition: repo_scene.h:823
Definition: repo_node_revision.h:49
std::string issuesExt
Definition: repo_scene.h:1055
void setBranch(repoUUID branchID)
Definition: repo_scene.h:404
std::string getDatabaseName() const
Definition: repo_scene.h:253
void abandonChild(const GraphType &gType, const repoUUID &parent, const repoUUID &child, const bool &modifyParent=true, const bool &modifyChild=true)
Definition: repo_scene.h:503
std::string stashExt
Definition: repo_scene.h:1053
RepoNodeSet getAllMeshes(const GraphType &gType) const
Definition: repo_scene.h:662
repoUUID getBranchID() const
Definition: repo_scene.h:244
RepoScene * getSceneFromReference(const GraphType &gType, const repoUUID &reference) const
Definition: repo_scene.h:600
bool isRevisioned() const
Definition: repo_scene.h:374
bool isHeadRevision() const
Definition: repo_scene.h:365
Definition: repo_connection_pool_mongo.h:32
void setMissingTexture()
Definition: repo_scene.h:177
std::string getX3DExtension() const
Definition: repo_scene.h:298
RepoNodeSet getAllTransformations(const GraphType &gType) const
Definition: repo_scene.h:702
std::string jsonExt
Definition: repo_scene.h:1059
void setCommitMessage(const std::string &msg)
Definition: repo_scene.h:410
RepoNodeSet getAllCameras(const GraphType &gType) const
Definition: repo_scene.h:632
RepoNodeSet getAllTextures(const GraphType &gType) const
Definition: repo_scene.h:692
RepoNodeSet getAllReferences(const GraphType &gType) const
Definition: repo_scene.h:682
Definition: repo_scene.h:44
Definition: repo_database_handler_abstract.h:37
std::vector< repoUUID > getRemovedNodesID() const
Definition: repo_scene.h:744
RepoNodeSet getAllMaps(const GraphType &gType=GraphType::DEFAULT) const
Definition: repo_scene.h:652
std::string getSRCExtension() const
Definition: repo_scene.h:280
RepoNode * getNodeBySharedID(const GraphType &gType, const repoUUID &sharedID) const
Definition: repo_scene.h:775
std::string getStashExtension() const
Definition: repo_scene.h:262
void setDatabaseAndProjectName(std::string newDatabaseName, std::string newProjectName)
Definition: repo_scene.h:384
std::vector< std::string > refFiles
Definition: repo_scene.h:1060
std::vector< RepoNode * > getRemovedNodes() const
Definition: repo_scene.h:753
std::string revExt
Definition: repo_scene.h:1052
Definition: repo_node_utils.h:40
std::string getProjectName() const
Definition: repo_scene.h:347
RepoNodeSet getAllMaterials(const GraphType &gType) const
Definition: repo_scene.h:642
RepoNode * getNodeByUniqueID(const GraphType &gType, const repoUUID &uniqueID) const
Definition: repo_scene.h:793
std::string srcExt
Definition: repo_scene.h:1056
std::string rawExt
Definition: repo_scene.h:1054
GraphType getViewGraph() const
Definition: repo_scene.h:433
std::vector< double > getWorldOffset() const
Definition: repo_scene.h:356
bool isMissingTexture() const
Definition: repo_scene.h:171
std::string getGLTFExtension() const
Definition: repo_scene.h:289
Definition: repo_node.h:33
std::string getOwner() const
Definition: repo_scene.h:330
void modifyNode(const GraphType >ype, const repoUUID &sharedID, RepoNode *newNode, const bool &overwrite=false)
Definition: repo_scene.h:855
std::vector< repoUUID > getModifiedNodesID() const
Definition: repo_scene.h:735
repoUUID getRevisionID() const
Definition: repo_scene.h:316
std::string getRawExtension() const
Definition: repo_scene.h:271
bool isOK() const
Definition: repo_scene.h:163
std::string x3dExt
Definition: repo_scene.h:1058
Definition: repo_scene.h:36
RepoNodeSet getAllMetadata(const GraphType &gType) const
Definition: repo_scene.h:672
std::vector< repoUUID > getAddedNodesID() const
Definition: repo_scene.h:712
GraphType
Definition: repo_scene.h:75
std::string getJSONExtension() const
Definition: repo_scene.h:307
Definition: repo_graph_abstract.h:32
std::string gltfExt
Definition: repo_scene.h:1057
void setRevision(repoUUID revisionID)
Definition: repo_scene.h:394
void addInheritance(const GraphType &gType, const repoUUID &parent, const repoUUID &child, const bool &noUpdate=false)
Definition: repo_scene.h:536