-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathWorldTree.cpp
101 lines (84 loc) · 2.72 KB
/
WorldTree.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
#include "WorldTree.h"
#include "d3dUtil.h"
#include "World.h"
#include "Object3D.h"
#include "Util.h"
#include "Editor.h"
WorldTree::WorldTree(Gwen::Controls::Base* pParent)
: Gwen::Controls::CollapsibleCategory(pParent)
{
SetText("World objects");
SetSize(200, 400);
mTreeControl = nullptr;
// Add as a category.
Gwen::Controls::CollapsibleList* parent = (Gwen::Controls::CollapsibleList*)pParent;
parent->Add(this);
}
WorldTree::~WorldTree()
{
delete mTreeControl;
}
void WorldTree::OnSelectChange(Gwen::Controls::Base* pControl)
{
Gwen::Controls::TreeNode* node = (Gwen::Controls::TreeNode*) pControl;
string name = ToString(node->GetButton()->GetText());
WorldTreeNode worldNode = mNodeMap[name];
mEditor->OnItemSelected(worldNode.pData, worldNode.type);
}
void WorldTree::CreateTree()
{
// Remove the old content.
mNodeMap.clear();
delete mTreeControl;
mTreeControl = new Gwen::Controls::TreeControl(this);
mTreeControl->SetBounds(0, 20, 200, 380);
mTreeControl->onSelect.Add(this, &WorldTree::OnSelectChange);
// Add the terrain node.
Gwen::Controls::TreeNode* terrain = mTreeControl->AddNode("Terrain");
terrain->onSelect.Add(this, &WorldTree::OnSelectChange);
mNodeMap["Terrain"].pData = mWorld->GetTerrain();
mNodeMap["Terrain"].type = GLib::TERRAIN;
Gwen::Controls::TreeNode* objects = mTreeControl->AddNode("Objects");
Gwen::Controls::TreeNode* staticObjects = objects->AddNode("Static");
Gwen::Controls::TreeNode* animatedObjects = objects->AddNode("Animated");
Gwen::Controls::TreeNode* lights = mTreeControl->AddNode("Lights (max 10)");
// Add all static objects.
GLib::ObjectList* objectList = mWorld->GetObjects();
map<string, int> counter;
for(int i = 0; i < objectList->size(); i++)
{
GLib::Object3D* object = objectList->operator[](i);
WorldTreeNode node;
node.pData = object;
node.type = object->GetType();
char buffer[256];
string name = object->GetName();
if(counter.find(name) != counter.end())
counter[name]++;
else
counter[name] = 1;
if(node.type == GLib::STATIC_OBJECT) {
sprintf(buffer, "%s %i", name.c_str(), counter[name]);
staticObjects->AddNode(buffer)->onSelect.Add(this, &WorldTree::OnSelectChange);
}
else if(node.type == GLib::ANIMATED_OBJECT) {
sprintf(buffer, "%s %i", name.c_str(), counter[name]);
animatedObjects->AddNode(buffer)->onSelect.Add(this, &WorldTree::OnSelectChange);
}
else if(node.type == GLib::LIGHT_OBJECT) {
sprintf(buffer, "Light %i", i+1);
lights->AddNode(buffer)->onSelect.Add(this, &WorldTree::OnSelectChange);
}
mNodeMap[buffer] = node;
}
objects->ExpandAll();
lights->ExpandAll();
}
void WorldTree::SetEditor(Editor* pEditor)
{
mEditor = pEditor;
}
void WorldTree::SetWorld(GLib::World* pWorld)
{
mWorld = pWorld;
}