Skip to content

Commit

Permalink
#5643: Start implementing the 3-way selection group merge algorithm
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Jun 21, 2021
1 parent 58dde92 commit dee964f
Show file tree
Hide file tree
Showing 7 changed files with 131 additions and 23 deletions.
24 changes: 3 additions & 21 deletions libs/scene/merge/SelectionGroupMerger.h
Expand Up @@ -7,6 +7,7 @@
#include <functional>
#include "NodeUtils.h"
#include "selectionlib.h"
#include "SelectionGroupMergerBase.h"

namespace scene
{
Expand All @@ -21,7 +22,8 @@ namespace merge
* It tries to keep group links between nodes intact if the nodes are only present
* in the base scene (were not removed during the geometry merge phase).
*/
class SelectionGroupMerger
class SelectionGroupMerger :
public SelectionGroupMergerBase
{
public:
struct Change
Expand Down Expand Up @@ -52,7 +54,6 @@ class SelectionGroupMerger

std::vector<std::size_t> _baseGroupIdsToRemove;

std::stringstream _log;
std::vector<Change> _changes;

public:
Expand All @@ -74,11 +75,6 @@ class SelectionGroupMerger
return _baseRoot;
}

std::string getLogMessages() const
{
return _log.str();
}

const std::vector<Change>& getChangeLog() const
{
return _changes;
Expand Down Expand Up @@ -132,8 +128,6 @@ class SelectionGroupMerger
}

private:
using GroupMembers = std::map<std::string, scene::INodePtr>;

void processBaseGroup(selection::ISelectionGroup& group)
{
// Check if there's a counter-part in the source scene
Expand Down Expand Up @@ -280,18 +274,6 @@ class SelectionGroupMerger
}
}

GroupMembers getGroupMemberFingerprints(selection::ISelectionGroup& group)
{
GroupMembers members;

group.foreachNode([&](const INodePtr& member)
{
members.emplace(NodeUtils::GetGroupMemberFingerprint(member), member);
});

return members;
}

void ensureGroupSizeOrder()
{
std::map<std::size_t, std::size_t> baseGroupSizes;
Expand Down
44 changes: 44 additions & 0 deletions libs/scene/merge/SelectionGroupMergerBase.h
@@ -0,0 +1,44 @@
#pragma once

#include <sstream>
#include <map>
#include "iselectiongroup.h"
#include "imap.h"
#include "NodeUtils.h"

namespace scene
{

namespace merge
{

class SelectionGroupMergerBase
{
protected:
std::stringstream _log;

public:
std::string getLogMessages() const
{
return _log.str();
}

protected:
using GroupMembers = std::map<std::string, scene::INodePtr>;

GroupMembers getGroupMemberFingerprints(selection::ISelectionGroup& group)
{
GroupMembers members;

group.foreachNode([&](const INodePtr& member)
{
members.emplace(NodeUtils::GetGroupMemberFingerprint(member), member);
});

return members;
}
};

}

}
18 changes: 16 additions & 2 deletions libs/scene/merge/ThreeWayMergeOperation.cpp
Expand Up @@ -4,6 +4,7 @@
#include "inamespace.h"
#include "NodeUtils.h"
#include "GraphComparer.h"
#include "ThreeWaySelectionGroupMerger.h"

namespace scene
{
Expand Down Expand Up @@ -60,7 +61,8 @@ ThreeWayMergeOperation::ThreeWayMergeOperation(const scene::IMapRootNodePtr& bas
const scene::IMapRootNodePtr& sourceRoot, const scene::IMapRootNodePtr& targetRoot) :
_baseRoot(baseRoot),
_sourceRoot(sourceRoot),
_targetRoot(targetRoot)
_targetRoot(targetRoot),
_mergeSelectionGroups(true)
{}

ThreeWayMergeOperation::~ThreeWayMergeOperation()
Expand Down Expand Up @@ -384,9 +386,21 @@ void ThreeWayMergeOperation::adjustSourceEntitiesWithNameConflicts()
_targetRoot->getNamespace()->ensureNoConflicts(_sourceRoot, sourceEntitiesToBeRenamed);
}

void ThreeWayMergeOperation::applyActions()
{
MergeOperationBase::applyActions();

if (_mergeSelectionGroups)
{
ThreeWaySelectionGroupMerger merger(_baseRoot, _sourceRoot, _targetRoot);

merger.adjustTargetGroups();
}
}

void ThreeWayMergeOperation::setMergeSelectionGroups(bool enabled)
{
// TODO
_mergeSelectionGroups = enabled;
}

void ThreeWayMergeOperation::setMergeLayers(bool enabled)
Expand Down
4 changes: 4 additions & 0 deletions libs/scene/merge/ThreeWayMergeOperation.h
Expand Up @@ -29,6 +29,8 @@ class ThreeWayMergeOperation :
// Volatile data only needed during analysis
struct ComparisonData;

bool _mergeSelectionGroups;

public:
using Ptr = std::shared_ptr<ThreeWayMergeOperation>;

Expand All @@ -54,6 +56,8 @@ class ThreeWayMergeOperation :
return _targetRoot;
}

void applyActions() override;

private:
void adjustSourceEntitiesWithNameConflicts();

Expand Down
56 changes: 56 additions & 0 deletions libs/scene/merge/ThreeWaySelectionGroupMerger.h
@@ -0,0 +1,56 @@
#pragma once

#include "SelectionGroupMergerBase.h"

namespace scene
{

namespace merge
{

class ThreeWaySelectionGroupMerger :
public SelectionGroupMergerBase
{
private:
IMapRootNodePtr _baseRoot;
IMapRootNodePtr _sourceRoot;
IMapRootNodePtr _targetRoot;

selection::ISelectionGroupManager& _baseManager;
selection::ISelectionGroupManager& _sourceManager;
selection::ISelectionGroupManager& _targetManager;

public:
ThreeWaySelectionGroupMerger(const IMapRootNodePtr& baseRoot, const IMapRootNodePtr& sourceRoot, const IMapRootNodePtr& targetRoot) :
_baseRoot(baseRoot),
_sourceRoot(sourceRoot),
_targetRoot(targetRoot),
_baseManager(_baseRoot->getSelectionGroupManager()),
_sourceManager(_sourceRoot->getSelectionGroupManager()),
_targetManager(_targetRoot->getSelectionGroupManager())
{}

const IMapRootNodePtr& getSourceRoot() const
{
return _sourceRoot;
}

const IMapRootNodePtr& getTargetRoot() const
{
return _targetRoot;
}

const IMapRootNodePtr& getBaseRoot() const
{
return _baseRoot;
}

void adjustTargetGroups()
{

}
};

}

}
2 changes: 2 additions & 0 deletions tools/msvc/scenelib.vcxproj
Expand Up @@ -148,7 +148,9 @@
<ClInclude Include="..\..\libs\scene\merge\MergeOperationBase.h" />
<ClInclude Include="..\..\libs\scene\merge\NodeUtils.h" />
<ClInclude Include="..\..\libs\scene\merge\SelectionGroupMerger.h" />
<ClInclude Include="..\..\libs\scene\merge\SelectionGroupMergerBase.h" />
<ClInclude Include="..\..\libs\scene\merge\ThreeWayMergeOperation.h" />
<ClInclude Include="..\..\libs\scene\merge\ThreeWaySelectionGroupMerger.h" />
<ClInclude Include="..\..\libs\scene\ModelBreakdown.h" />
<ClInclude Include="..\..\libs\scene\ModelFinder.h" />
<ClInclude Include="..\..\libs\scene\Node.h" />
Expand Down
6 changes: 6 additions & 0 deletions tools/msvc/scenelib.vcxproj.filters
Expand Up @@ -142,5 +142,11 @@
<ClInclude Include="..\..\libs\scene\merge\MergeOperationBase.h">
<Filter>scene\merge</Filter>
</ClInclude>
<ClInclude Include="..\..\libs\scene\merge\ThreeWaySelectionGroupMerger.h">
<Filter>scene\merge</Filter>
</ClInclude>
<ClInclude Include="..\..\libs\scene\merge\SelectionGroupMergerBase.h">
<Filter>scene\merge</Filter>
</ClInclude>
</ItemGroup>
</Project>

0 comments on commit dee964f

Please sign in to comment.