diff --git a/data/layout2.xml b/data/layout2.xml
new file mode 100644
index 0000000..723fb3c
--- /dev/null
+++ b/data/layout2.xml
@@ -0,0 +1,47 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/data/spritesheet.txt b/data/spritesheet.txt
index ff5cd41..be42b30 100644
--- a/data/spritesheet.txt
+++ b/data/spritesheet.txt
@@ -544,7 +544,7 @@ lorry_error 16 16 513 447
lorry_flatbed 16 16 539 447
lorry_go 16 16 565 447
lorry_link 16 16 591 447
-magifier_zoom_out 16 16 617 447
+magnifier_zoom_out 16 16 617 447
magnifier 16 16 643 447
magnifier_zoom_in 16 16 669 447
male 16 16 695 447
diff --git a/engine/app.cpp b/engine/app.cpp
index dfc5c80..b315e8f 100644
--- a/engine/app.cpp
+++ b/engine/app.cpp
@@ -127,70 +127,70 @@ void App::init()
NodeIcon::static_init();
layout.on_loaded = [&] {
- layout[main_id].update(width, height);
- if (auto* button = layout[main_id].find("btn-close"))
+ layout[main_id]->update(width, height);
+ if (auto* button = layout[main_id]->find("btn-close"))
{
button->on_click = [] { exit(0); };
}
- if (auto* button = layout[main_id].find("btn-popup"))
+ if (auto* button = layout[main_id]->find("btn-popup"))
{
button->on_click = [this] {
msgbox = new NodeMessageBox();
msgbox->m_manager = &layout;
msgbox->init();
- layout[main_id].add_child(msgbox);
- layout[main_id].update();
+ layout[main_id]->add_child(msgbox);
+ layout[main_id]->update();
};
}
- if (auto* button = layout[main_id].find("btn-settings"))
+ if (auto* button = layout[main_id]->find("btn-settings"))
{
button->on_click = [this] {
settings = new NodeSettings();
settings->m_manager = &layout;
settings->init();
- layout[main_id].add_child(settings);
- layout[main_id].update();
+ layout[main_id]->add_child(settings);
+ layout[main_id]->update();
};
}
- if (auto* menu_file = layout[main_id].find("menu-file"))
+ if (auto* menu_file = layout[main_id]->find("menu-file"))
{
menu_file->on_click = [=] {
glm::vec2 pos = menu_file->m_pos + glm::vec2(0, menu_file->m_size.y);
- popup = (NodePopupMenu*)layout[const_hash("file-menu")].m_children[0]->clone();
+ popup = (NodePopupMenu*)layout[const_hash("file-menu")]->m_children[0]->clone();
popup->SetPositioning(YGPositionTypeAbsolute);
popup->SetPosition(pos.x, pos.y);
- layout[main_id].add_child(popup);
- layout[main_id].update();
+ layout[main_id]->add_child(popup);
+ layout[main_id]->update();
};
}
- if (auto* menu_file = layout[main_id].find("menu-edit"))
+ if (auto* menu_file = layout[main_id]->find("menu-edit"))
{
menu_file->on_click = [=] {
glm::vec2 pos = menu_file->m_pos + glm::vec2(0, menu_file->m_size.y);
- popup = (NodePopupMenu*)layout[const_hash("edit-menu")].m_children[0]->clone();
+ popup = (NodePopupMenu*)layout[const_hash("edit-menu")]->m_children[0]->clone();
popup->SetPositioning(YGPositionTypeAbsolute);
popup->SetPosition(pos.x, pos.y);
- layout[main_id].add_child(popup);
- layout[main_id].update();
+ layout[main_id]->add_child(popup);
+ layout[main_id]->update();
};
}
- if (auto* menu_file = layout[main_id].find("menu-layers"))
+ if (auto* menu_file = layout[main_id]->find("menu-layers"))
{
menu_file->on_click = [=] {
glm::vec2 pos = menu_file->m_pos + glm::vec2(0, menu_file->m_size.y);
- popup = (NodePopupMenu*)layout[const_hash("layers-menu")].m_children[0]->clone();
+ popup = (NodePopupMenu*)layout[const_hash("layers-menu")]->m_children[0]->clone();
popup->SetPositioning(YGPositionTypeAbsolute);
popup->SetPosition(pos.x, pos.y);
- layout[main_id].add_child(popup);
- layout[main_id].update();
+ layout[main_id]->add_child(popup);
+ layout[main_id]->update();
};
}
- if (auto* toolbar = layout[main_id].find("toolbar"))
+ if (auto* toolbar = layout[main_id]->find("toolbar"))
{
toolbar->m_flood_events = true;
}
};
- layout.load("data/layout.xml");
+ layout.load("data/layout2.xml");
//msgbox->find("btn-ok")->on_click = [] { exit(0); };
// msgbox->find("btn-ok")->m_text->m_text = "DO";
@@ -240,7 +240,7 @@ void App::update(float dt)
auto observer = [this](Node* n)
{
- if (n->m_display)
+ if (n && n->m_display)
{
auto box = n->m_clip;
glScissor((int)box.x-1, (int)(height - box.y - box.w)-1, (int)box.z+2, (int)box.w+2);
@@ -249,7 +249,8 @@ void App::update(float dt)
};
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glEnable(GL_SCISSOR_TEST);
- layout[main_id].watch(observer);
+ if (auto* main = layout[main_id])
+ main->watch(observer);
//msgbox->watch(observer);
glDisable(GL_SCISSOR_TEST);
}
@@ -258,7 +259,8 @@ void App::resize(float w, float h)
{
width = w;
height = h;
- layout[main_id].update(w, h);
+ if (auto* main = layout[main_id])
+ main->update(w, h);
}
void App::mouse_down(int button, float x, float y)
@@ -266,7 +268,7 @@ void App::mouse_down(int button, float x, float y)
MouseEvent e;
e.m_type = button ? kEventType::MouseDownR : kEventType::MouseDownL;
e.m_pos = { x, y };
- layout[main_id].on_event(&e);
+ layout[main_id]->on_event(&e);
printf("mouse click %f %f\n", x, y);
// NodeBorder* n = new NodeBorder();
// n->SetPositioning(YGPositionTypeAbsolute);
@@ -278,30 +280,31 @@ void App::mouse_down(int button, float x, float y)
// layout[main_id].update(width, height);
if (popup)
{
- layout[main_id].remove_child(popup);
+ layout[main_id]->remove_child(popup);
popup = nullptr;
}
if (button == 1)
{
- popup = (NodePopupMenu*)layout[const_hash("popup-menu")].m_children[0]->clone();
+ popup = (NodePopupMenu*)layout[const_hash("popup-menu")]->m_children[0]->clone();
popup->SetPositioning(YGPositionTypeAbsolute);
popup->SetPosition(x, y);
- layout[main_id].add_child(popup);
+ layout[main_id]->add_child(popup);
}
- layout[main_id].update();
+ layout[main_id]->update();
}
void App::mouse_move(float x, float y)
{
MouseEvent e;
e.m_type = kEventType::MouseMove;
e.m_pos = { x, y };
- layout[main_id].on_event(&e);
+ if (auto* main = layout[main_id])
+ main->on_event(&e);
}
void App::mouse_up(int button, float x, float y)
{
MouseEvent e;
e.m_type = button ? kEventType::MouseUpR : kEventType::MouseUpL;
e.m_pos = { x, y };
- layout[main_id].on_event(&e);
- layout[main_id].update();
+ layout[main_id]->on_event(&e);
+ layout[main_id]->update();
}
diff --git a/engine/layout.cpp b/engine/layout.cpp
index 067ace0..3f41161 100644
--- a/engine/layout.cpp
+++ b/engine/layout.cpp
@@ -391,11 +391,18 @@ void Node::load_internal(const tinyxml2::XMLElement* x_node)
n->load_internal(x_child);
break;
}
+ case kWidget::Viewport:
+ {
+ auto n = new NodeViewport();
+ add_child(n);
+ n->load_internal(x_child);
+ break;
+ }
case kWidget::Ref:
{
auto ids = x_child->Attribute("id");
auto id = const_hash(ids);
- auto& ref = (*m_manager)[id].m_children[0];
+ auto& ref = (*m_manager)[id]->m_children[0];
auto n = ref->clone();
add_child(n);
break;
diff --git a/engine/layout.h b/engine/layout.h
index ebc191c..a5122c0 100644
--- a/engine/layout.h
+++ b/engine/layout.h
@@ -49,6 +49,7 @@ enum class kWidget : uint16_t
Button = const_hash("button"),
ButtonCustom = const_hash("button-custom"),
PopupMenu = const_hash("popup-menu"),
+ Viewport = const_hash("viewport"),
Ref = const_hash("ref"),
};
@@ -104,7 +105,7 @@ public:
std::function on_loaded;
bool load(const char* path);
bool reload();
- class Node& operator[](uint16_t id) { return *m_layouts[id]; }
+ class Node* operator[](uint16_t id) { return m_layouts[id].get(); }
//Node& operator[](const char* ids) { return m_layouts[const_hash(ids)]; }
};
@@ -617,7 +618,7 @@ public:
SetWidthP(100);
SetHeightP(100);
SetPositioning(YGPositionTypeAbsolute);
- m_template = (*m_manager)[const_hash("message-box")].m_children[0]->clone();
+ m_template = (*m_manager)[const_hash("message-box")]->m_children[0]->clone();
add_child(m_template);
btnOk = m_template->find("btn-ok");
btnOk->on_click = [&] { destroy(); };
@@ -703,7 +704,7 @@ public:
SetWidthP(100);
SetHeightP(100);
SetPositioning(YGPositionTypeAbsolute);
- m_template = (*m_manager)[const_hash("settings")].m_children[0]->clone();
+ m_template = (*m_manager)[const_hash("settings")]->m_children[0]->clone();
add_child(m_template);
btnOk = m_template->find("btn-ok");
btnOk->on_click = [&] { destroy(); };
@@ -764,3 +765,55 @@ public:
}
}
};
+
+class NodeViewport : public Node
+{
+public:
+ std::unique_ptr m_faces;
+ std::unique_ptr m_sampler;
+ uint16_t m_tex_id;
+
+ virtual void draw() override
+ {
+ static float angle = 0;
+ angle += 0.05;
+ glm::mat4 cam = glm::lookAt(glm::vec3(sinf(angle)*10, 0, -10), glm::vec3(0, 0, 0), glm::vec3(0, -1, 0));
+ glm::mat4 proj = glm::perspective(glm::radians(45.f), m_clip.z / m_clip.w, .1f, 100);
+
+ GLint vp[4];
+ GLfloat cc[4];
+ glGetIntegerv(GL_VIEWPORT, vp);
+ glGetFloatv(GL_COLOR_CLEAR_VALUE, cc);
+
+ glClearColor(1, 0, 0, 1);
+ glClear(GL_COLOR_BUFFER_BIT);
+ auto box = m_clip;
+ glViewport(box.x, (int)(vp[3] - box.y - box.w), box.z, box.w);
+ TextureManager::get(m_tex_id).bind();
+ m_sampler->bind(0);
+ glEnable(GL_BLEND);
+ ShaderManager::use(kShader::Texture);
+ ShaderManager::u_int(kShaderUniform::Tex, 0);
+ ShaderManager::u_mat4(kShaderUniform::MVP, proj * cam);
+ m_faces->draw_fill();
+ m_sampler->unbind();
+ TextureManager::get(m_tex_id).unbind();
+ glDisable(GL_BLEND);
+
+ glViewport(vp[0], vp[1], vp[2], vp[3]);
+ glClearColor(cc[0], cc[1], cc[2], cc[3]);
+ }
+ virtual Node* clone_instantiate() const override
+ {
+ return new NodeViewport;
+ }
+ virtual void create() override
+ {
+ m_faces = std::make_unique();
+ m_faces->create<1>(10, 10);
+ m_sampler = std::make_unique();
+ m_sampler->create();
+ TextureManager::load("data/uvs.jpg");
+ m_tex_id = const_hash("data/uvs.jpg");
+ }
+};