Skip to content

Commit e7ca845

Browse files
committed
Make drawing faster by storing nodes always ordered by id instead of sorting them all the time.
1 parent 5a2387c commit e7ca845

22 files changed

Lines changed: 313 additions & 147 deletions

Sources/NodeEngine/NE_NodeGroupList.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ void NodeGroupList::DeleteGroup (const NodeGroupId& groupId)
8181
groupIdToNodes.erase (groupId);
8282
}
8383

84+
void NodeGroupList::MakeSorted ()
85+
{
86+
groups.MakeSorted ();
87+
}
88+
8489
void NodeGroupList::AddNodeToGroup (const NodeGroupId& groupId, const NodeId& nodeId)
8590
{
8691
if (DBGERROR (!groups.Contains (groupId))) {

Sources/NodeEngine/NE_NodeGroupList.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,7 @@ class NodeGroupList
2626

2727
bool AddGroup (const NodeGroupPtr& group);
2828
void DeleteGroup (const NodeGroupId& groupId);
29+
void MakeSorted ();
2930

3031
void AddNodeToGroup (const NodeGroupId& groupId, const NodeId& nodeId);
3132
void RemoveNodeFromGroup (const NodeId& nodeId);

Sources/NodeEngine/NE_NodeList.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,11 @@ bool NodeList::DeleteNode (const NodeId& nodeId)
5959
return nodes.Erase (nodeId);
6060
}
6161

62+
void NodeList::MakeSorted ()
63+
{
64+
nodes.MakeSorted ();
65+
}
66+
6267
void NodeList::Clear ()
6368
{
6469
nodes.Clear ();

Sources/NodeEngine/NE_NodeList.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@ class NodeList
2323

2424
bool AddNode (const NodeId& nodeId, const NodePtr& nodePtr);
2525
bool DeleteNode (const NodeId& nodeId);
26+
void MakeSorted ();
2627
void Clear ();
2728

2829
void Enumerate (const std::function<bool (NodePtr)>& processor);

Sources/NodeEngine/NE_NodeManager.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@
1010
namespace NE
1111
{
1212

13-
SERIALIZATION_INFO (NodeManager, 3);
13+
SERIALIZATION_INFO (NodeManager, 4);
1414

1515
template <typename SlotListType, typename SlotType>
1616
static bool HasDuplicates (const SlotListType& slots)
@@ -615,6 +615,12 @@ NodeGroupPtr NodeManager::AddNodeGroup (const NodeGroupPtr& group)
615615
return AddNodeGroup (group, IdPolicy::GenerateNew);
616616
}
617617

618+
void NodeManager::MakeNodesAndGroupsSorted ()
619+
{
620+
nodeList.MakeSorted ();
621+
nodeGroupList.MakeSorted ();
622+
}
623+
618624
void NodeManager::DeleteNodeGroup (const NodeGroupId& groupId)
619625
{
620626
return nodeGroupList.DeleteGroup (groupId);

Sources/NodeEngine/NE_NodeManager.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -156,6 +156,7 @@ class NodeManager
156156

157157
NodePtr AddNode (const NodePtr& node, IdPolicy idHandling, InitPolicy initPolicy);
158158
NodeGroupPtr AddNodeGroup (const NodeGroupPtr& group, IdPolicy idHandling);
159+
void MakeNodesAndGroupsSorted ();
159160

160161
UniqueIdGenerator idGenerator;
161162
NodeList nodeList;

Sources/NodeEngine/NE_NodeManagerMerge.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -256,6 +256,7 @@ bool NodeManagerMerge::UpdateNodeManager (const NodeManager& source, NodeManager
256256
return true;
257257
});
258258

259+
target.MakeNodesAndGroupsSorted ();
259260
return true;
260261
}
261262

Sources/NodeEngine/NE_NodeManagerSerialization.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,10 @@ Stream::Status NodeManagerSerialization::Read (NodeManager& nodeManager, InputSt
2727
return groupStatus;
2828
}
2929

30+
if (header.GetVersion () < 4) {
31+
nodeManager.MakeNodesAndGroupsSorted ();
32+
}
33+
3034
ReadEnum (inputStream, nodeManager.updateMode);
3135

3236
return inputStream.GetStatus ();

Sources/NodeEngine/NE_OrderedMap.hpp

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,7 @@ class OrderedMap
3434
bool Insert (const Key& key, const Value& value);
3535
bool InsertBefore (const Key& key, const Value& value, const Key& nextKey);
3636
bool InsertAfter (const Key& key, const Value& value, const Key& prevKey);
37+
void MakeSorted ();
3738
bool Erase (const Key& key);
3839
void Clear ();
3940

@@ -186,6 +187,14 @@ bool OrderedMap<Key, Value>::InsertAfter (const Key& key, const Value& value, co
186187
return true;
187188
}
188189

190+
template <typename Key, typename Value>
191+
void OrderedMap<Key, Value>::MakeSorted ()
192+
{
193+
valueList.sort ([&] (const KeyValue& a, const KeyValue& b) {
194+
return a.first < b.first;
195+
});
196+
}
197+
189198
template <typename Key, typename Value>
190199
bool OrderedMap<Key, Value>::Erase (const Key& key)
191200
{

Sources/NodeEngineTest/NodeEditorVisualTest.cpp

Lines changed: 34 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -566,4 +566,38 @@ TEST (AlignNodesTest)
566566
}
567567
}
568568

569+
TEST (NodeOrderTest)
570+
{
571+
NodeEditorTestEnv env (GetDefaultSkinParams ());
572+
Point padding (10.0, 10.0);
573+
574+
{ // create two nodes
575+
env.nodeEditor.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Number 1"), Point (100.0, 100.0), 0.0, 1.0)));
576+
env.nodeEditor.AddNode (UINodePtr (new DoubleUpDownNode (LocString (L"Number 2"), Point (150.0, 100.0), 0.0, 1.0)));
577+
ASSERT (env.CheckReference (L"NodeOrderTest_Initial.svg"));
578+
}
579+
580+
{ // select top node
581+
env.Click (env.GetNodeRect (env.GetNode (L"Number 2")).GetTopLeft () + padding);
582+
ASSERT (env.CheckReference (L"NodeOrderTest_Number2Selected.svg"));
583+
}
584+
585+
{ // delete bottom node
586+
env.ExecuteCommand (CommandCode::Escape);
587+
env.SetNextCommandName (L"Delete Nodes");
588+
env.RightClick (env.GetNodeRect (env.GetNode (L"Number 1")).GetTopLeft () + padding);
589+
ASSERT (env.CheckReference (L"NodeOrderTest_Number1Deleted.svg"));
590+
}
591+
592+
{ // undo delete
593+
env.ExecuteCommand (CommandCode::Undo);
594+
ASSERT (env.CheckReference (L"NodeOrderTest_Number1Recreated.svg"));
595+
}
596+
597+
{ // select top node
598+
env.Click (env.GetNodeRect (env.GetNode (L"Number 2")).GetTopLeft () + padding);
599+
ASSERT (env.CheckReference (L"NodeOrderTest_Number2SelectedAfterUndo.svg"));
600+
}
601+
}
602+
569603
}

0 commit comments

Comments
 (0)