added range loop based layout nodes traversal

This commit is contained in:
2017-01-27 19:26:45 +00:00
parent baaade6050
commit d413e49821
2 changed files with 38 additions and 33 deletions

View File

@@ -126,23 +126,18 @@ void App::update(float dt)
shader_color.u_vec4("col", { .3f, .3f, .3f, 1 });
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
std::stack<Node*> nodes;
Node* current = &layout;
nodes.push(current);
glEnable(GL_SCISSOR_TEST);
while (current)
for (auto& n : layout)
{
nodes.pop();
glm::mat4 pivot = glm::translate(glm::vec3(.5f, .5f, 0.f));
glm::mat4 scale = glm::scale(glm::vec3(current->m_size, 1.f));
glm::mat4 pos = glm::translate(glm::vec3(current->m_pos, 0));
glm::mat4 scale = glm::scale(glm::vec3(n.m_size, 1.f));
glm::mat4 pos = glm::translate(glm::vec3(n.m_pos, 0));
auto mvp = proj * pos * scale * pivot;
auto box = current->m_clip;
auto box = n.m_clip;
glScissor(box.x, height - box.y - box.w, box.z, box.w);
shader_color.u_vec4("col", current->color);
shader_color.u_vec4("col", n.color);
shader_color.use();
shader_color.u_mat4("mvp", mvp);
plane.draw_fill();
@@ -151,33 +146,10 @@ void App::update(float dt)
shader_color.use();
shader_color.u_mat4("mvp", mvp);
plane.draw_stroke();
for (auto& c : current->children)
nodes.push(&c);
current = nodes.size() ? nodes.top() : nullptr;
}
glDisable(GL_SCISSOR_TEST);
tex.unbind();
sampler.unbind();
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//shader_color.use();
//shader_color.u_mat4("mvp", proj * glm::translate(glm::vec3{width/2, height/2, 0.f}) * glm::scale(glm::vec3(8)));
//shader_color.u_vec4("col", {1, 1, 1, 1});
//glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
//tex.bind();
//shader.use();
//shader.u_mat4("mvp", proj * glm::translate(glm::vec3{ width / 2, height / 2, 0.f }) * glm::scale(glm::vec3(8)));
//shader.u_int("tex", 0);
//circle3.draw_fill();
//glPolygonMode(GL_FRONT_AND_BACK, GL_LINE);
//shader_color.use();
//shader_color.u_mat4("mvp", proj * glm::translate(glm::vec3{width/2, height/2, 0.f}) * glm::scale(glm::vec3(8)));
//shader_color.u_vec4("col", {1, 1, 1, 1});
//glLineWidth(2);
//circle3.draw_fill();
}
void App::resize(float w, float h)

View File

@@ -168,4 +168,37 @@ public:
void load(const char* path);
void load_internal(const tinyxml2::XMLElement* x_node);
void reload();
class iterator
{
std::stack<Node*> m_nodes;
Node* m_current;
public:
iterator(Node* root)
{
m_current = root;
if (root)
m_nodes.push(root);
}
iterator& operator++()
{
m_nodes.pop();
for (auto& c : m_current->children)
m_nodes.push(&c);
m_current = m_nodes.size() ? m_nodes.top() : nullptr;
return *this;
}
Node& operator*() { return *m_current; }
Node* operator->() { return m_current; }
bool operator==(const iterator& rhs) { return m_current == rhs.m_current; }
bool operator!=(const iterator& rhs) { return m_current != rhs.m_current; }
};
iterator begin()
{
return this;
}
iterator end()
{
return nullptr;
}
};