diff --git a/data/layout.xml b/data/layout.xml
index 42106ae..8f91a9d 100644
--- a/data/layout.xml
+++ b/data/layout.xml
@@ -1,13 +1,34 @@
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/engine/app.cpp b/engine/app.cpp
index 078adf3..1e3277f 100644
--- a/engine/app.cpp
+++ b/engine/app.cpp
@@ -18,12 +18,14 @@ void App::update_layout()
while (y_current)
{
y_stack.pop();
- auto ctx = reinterpret_cast(YGNodeGetContext(y_current));
+ auto ctx = reinterpret_cast(YGNodeGetContext(y_current));
if (!ctx)
{
float x = YGNodeLayoutGetLeft(y_current);
float y = YGNodeLayoutGetTop(y_current);
- ctx = new glm::vec2(x, y);
+ float w = YGNodeLayoutGetWidth(y_current);
+ float h = YGNodeLayoutGetHeight(y_current);
+ ctx = new glm::vec4(x, y, w, h);
YGNodeSetContext(y_current, ctx);
}
@@ -31,10 +33,20 @@ void App::update_layout()
for (int i = 0; i < n; i++)
{
auto y_child = YGNodeGetChild(y_current, i);
- auto ctx_child = reinterpret_cast(YGNodeGetContext(y_child));
- if (!ctx_child) ctx_child = new glm::vec2();
- ctx_child->x = ctx->x + YGNodeLayoutGetLeft(y_child);
- ctx_child->y = ctx->y + YGNodeLayoutGetTop(y_child);
+ auto ctx_child = reinterpret_cast(YGNodeGetContext(y_child));
+ if (!ctx_child) ctx_child = new glm::vec4();
+ float x = YGNodeLayoutGetLeft(y_child);
+ float y = YGNodeLayoutGetTop(y_child);
+ float w = YGNodeLayoutGetWidth(y_child);
+ float h = YGNodeLayoutGetHeight(y_child);
+ float pt = 0;//YGNodeLayoutGetPadding(y_current, YGEdgeTop);
+ float pr = 0;//YGNodeLayoutGetPadding(y_current, YGEdgeRight);
+ float pb = 0;//YGNodeLayoutGetPadding(y_current, YGEdgeBottom);
+ float pl = 0;//YGNodeLayoutGetPadding(y_current, YGEdgeLeft);
+ ctx_child->x = ctx->x + x + pl;
+ ctx_child->y = ctx->y + y + pt;
+ ctx_child->z = w - (pl + pr);
+ ctx_child->w = h - (pt + pb);
YGNodeSetContext(y_child, ctx_child);
y_stack.emplace(y_child);
}
@@ -42,58 +54,31 @@ void App::update_layout()
}
}
-void App::init()
+void App::load_layout()
{
- static const char* shader_v =
- "#version 150\n"
- "uniform mat4 mvp;"
- "in vec4 pos;"
- "in vec2 uvs;"
- "out vec3 uv;"
- "void main(){"
- " uv = vec3(uvs, pos.w);"
- " gl_Position = mvp * vec4(pos.xyz, 1.f);"
- "}";
- static const char* shader_f =
- "#version 150\n"
- "uniform sampler2D tex;"
- "in vec3 uv;"
- "out vec4 frag;"
- "void main(){"
- //" frag = texture(tex, uv.xy/uv.z);"
- " frag = texture(tex, uv.xy);"
- "}";
- static const char* shader_uv_f =
- "#version 150\n"
- "uniform sampler2D tex;"
- "in vec3 uv;"
- "out vec4 frag;"
- "void main(){"
- " frag = vec4(uv.xy,0,1);"
- "}";
- static const char* shader_color_v =
- "#version 150\n"
- "uniform mat4 mvp;"
- "in vec4 pos;"
- "void main(){"
- " gl_Position = mvp * pos;"
- "}";
- static const char* shader_color_f =
- "#version 150\n"
- "uniform vec4 col;"
- "out vec4 frag;"
- "void main(){"
- " frag = col;"
- "}";
+ struct stat tmp_info;
+ if (stat("data/layout.xml", &tmp_info) != 0)
+ return;
+ if (tmp_info.st_mtime <= g_file_info.st_mtime)
+ return;
+ g_file_info = tmp_info;
- auto w = att::Width(10.f);
- printf("type: %d\n", att::value("Height"));
+ if (y_root)
+ YGNodeFreeRecursive(y_root);
+ shapes_list.clear();
y_root = YGNodeNew();
YGNodeStyleSetWidth(y_root, width);
+ //YGNodeStyleSetWidthPercent(y_root, 100);
YGNodeStyleSetHeight(y_root, height);
+ //YGNodeStyleSetHeightPercent(y_root, 100);
YGNodeStyleSetFlexDirection(y_root, YGFlexDirectionRow);
YGNodeStyleSetFlexWrap(y_root, YGWrapWrap);
+ YGNodeStyleSetPadding(y_root, YGEdgeAll, 0);
+ YGNodeStyleSetPadding(y_root, YGEdgeTop, 0);
+ YGNodeStyleSetPadding(y_root, YGEdgeRight, 0);
+ YGNodeStyleSetPadding(y_root, YGEdgeBottom, 0);
+ YGNodeStyleSetPadding(y_root, YGEdgeLeft, 0);
//YGNodeStyleSetJustifyContent(y_root, YGJustifyFlexStart);
using NodePair = std::pair;
@@ -110,13 +95,8 @@ void App::init()
stack.pop();
auto y_root = current.first;
auto child = current.second->FirstChildElement();
- YGNodeStyleSetPosition(y_root, YGEdgeAll, 0);
- YGNodeStyleSetPadding(y_root, YGEdgeAll, 0);
- YGNodeStyleSetMargin(y_root, YGEdgeAll, 0);
- YGNodeStyleSetPositionType(y_root, YGPositionTypeRelative);
- YGNodeStyleSetPosition(y_root, YGEdgeAll, 0);
- YGNodeStyleSetPadding(y_root, YGEdgeAll, 0);
- YGNodeStyleSetMargin(y_root, YGEdgeAll, 0);
+ //YGNodeStyleSetPosition(y_root, YGEdgeAll, 0);
+ //YGNodeStyleSetPositionType(y_root, YGPositionTypeRelative);
while (child)
{
printf("Element %s: ", child->Name());
@@ -126,11 +106,26 @@ void App::init()
if (strcmp("plane", child->Name()) == 0)
{
auto shape = std::make_unique();
- shape->create<5>(100.f, 100.f);
+ //shape->create<5>(100.f, 100.f);
shape->y_node = y_node;
shapes_list.push_back(std::move(shape));
YGNodeSetContext(y_node, shape.get());
}
+ YGNodeStyleSetWidth(y_node, 0);
+ YGNodeStyleSetWidthPercent(y_node, 100);
+ YGNodeStyleSetHeight(y_node, 0);
+ YGNodeStyleSetHeightPercent(y_node, 100);
+ YGNodeStyleSetPadding(y_node, YGEdgeAll, 0);
+ YGNodeStyleSetPadding(y_node, YGEdgeTop, 0);
+ YGNodeStyleSetPadding(y_node, YGEdgeRight, 0);
+ YGNodeStyleSetPadding(y_node, YGEdgeBottom, 0);
+ YGNodeStyleSetPadding(y_node, YGEdgeLeft, 0);
+
+ YGNodeStyleSetPosition(y_node, YGEdgeAll, 0);
+ YGNodeStyleSetPosition(y_node, YGEdgeTop, 0);
+ YGNodeStyleSetPosition(y_node, YGEdgeRight, 0);
+ YGNodeStyleSetPosition(y_node, YGEdgeBottom, 0);
+ YGNodeStyleSetPosition(y_node, YGEdgeLeft, 0);
while (attr)
{
const auto ka = att::value(attr->Name());
@@ -187,6 +182,48 @@ void App::init()
case att::kAttribute::FlexWrap:
YGNodeStyleSetFlexWrap(y_node, attr->IntValue() ? YGWrapWrap : YGWrapNoWrap);
break;
+ case att::kAttribute::Padding:
+ {
+ glm::vec4 pad;
+ int n = sscanf(attr->Value(), "%f %f %f %f", &pad.x, &pad.y, &pad.z, &pad.w);
+ if (n == 1)
+ {
+ YGNodeStyleSetPadding(y_node, YGEdgeTop, pad.x);
+ YGNodeStyleSetPadding(y_node, YGEdgeRight, pad.x);
+ YGNodeStyleSetPadding(y_node, YGEdgeBottom, pad.x);
+ YGNodeStyleSetPadding(y_node, YGEdgeLeft, pad.x);
+ }
+ else
+ {
+ YGNodeStyleSetPadding(y_node, YGEdgeTop, pad.x);
+ YGNodeStyleSetPadding(y_node, YGEdgeRight, pad.y);
+ YGNodeStyleSetPadding(y_node, YGEdgeBottom, pad.z);
+ YGNodeStyleSetPadding(y_node, YGEdgeLeft, pad.w);
+ }
+ break;
+ }
+ case att::kAttribute::Margin:
+ {
+ glm::vec4 pad;
+ int n = sscanf(attr->Value(), "%f %f %f %f", &pad.x, &pad.y, &pad.z, &pad.w);
+ if (n == 1)
+ {
+ YGNodeStyleSetMargin(y_node, YGEdgeTop, pad.x);
+ YGNodeStyleSetMargin(y_node, YGEdgeRight, pad.x);
+ YGNodeStyleSetMargin(y_node, YGEdgeBottom, pad.x);
+ YGNodeStyleSetMargin(y_node, YGEdgeLeft, pad.x);
+ }
+ else
+ {
+ YGNodeStyleSetMargin(y_node, YGEdgeTop, pad.x);
+ YGNodeStyleSetMargin(y_node, YGEdgeRight, pad.y);
+ YGNodeStyleSetMargin(y_node, YGEdgeBottom, pad.z);
+ YGNodeStyleSetMargin(y_node, YGEdgeLeft, pad.w);
+ }
+ break;
+ }
+ default:
+ break;
}
attr = attr->Next();
}
@@ -195,10 +232,56 @@ void App::init()
child = child->NextSiblingElement();
printf("\n");
}
- current = stack.size() ? stack.top() : NodePair{nullptr, nullptr};
+ current = stack.size() ? stack.top() : NodePair{ nullptr, nullptr };
}
-
update_layout();
+}
+
+void App::init()
+{
+ static const char* shader_v =
+ "#version 150\n"
+ "uniform mat4 mvp;"
+ "in vec4 pos;"
+ "in vec2 uvs;"
+ "out vec3 uv;"
+ "void main(){"
+ " uv = vec3(uvs, pos.w);"
+ " gl_Position = mvp * vec4(pos.xyz, 1.f);"
+ "}";
+ static const char* shader_f =
+ "#version 150\n"
+ "uniform sampler2D tex;"
+ "in vec3 uv;"
+ "out vec4 frag;"
+ "void main(){"
+ //" frag = texture(tex, uv.xy/uv.z);"
+ " frag = texture(tex, uv.xy);"
+ "}";
+ static const char* shader_uv_f =
+ "#version 150\n"
+ "uniform sampler2D tex;"
+ "in vec3 uv;"
+ "out vec4 frag;"
+ "void main(){"
+ " frag = vec4(uv.xy,0,1);"
+ "}";
+ static const char* shader_color_v =
+ "#version 150\n"
+ "uniform mat4 mvp;"
+ "in vec4 pos;"
+ "void main(){"
+ " gl_Position = mvp * pos;"
+ "}";
+ static const char* shader_color_f =
+ "#version 150\n"
+ "uniform vec4 col;"
+ "out vec4 frag;"
+ "void main(){"
+ " frag = col;"
+ "}";
+
+ load_layout();
for (auto& s : shapes_list)
{
@@ -248,12 +331,14 @@ void App::update(float dt)
{
glm::mat4 proj = glm::ortho(0.f, width, height, 0.f, -1.f, 1.f);
- Shape* shapes[] = { &circle, &circle2, &circle3, &circle4, &plane, &rounded, &slice };
+ //Shape* shapes[] = { &circle, &circle2, &circle3, &circle4, &plane, &rounded, &slice };
- //glClearColor(red, 0, 0, 1);
+ glClearColor(.1f, .1f, .1f, 1.f);
glViewport(0, 0, (GLsizei)width, (GLsizei)height);
glClear(GL_COLOR_BUFFER_BIT);
+ load_layout();
+
/*
auto s = glm::scale(glm::vec3(1.5));
int h = 100;
@@ -296,7 +381,7 @@ void App::update(float dt)
shader.use();
shader.u_int("tex", 0);
shader_color.use();
- shader_color.u_vec4("col", { 0, 0, 1, 1 });
+ shader_color.u_vec4("col", { .3f, .3f, .3f, 1 });
for (auto& s : shapes_list)
{
@@ -304,18 +389,18 @@ void App::update(float dt)
float h = YGNodeLayoutGetHeight(s->y_node);
float x = YGNodeLayoutGetLeft(s->y_node);
float y = YGNodeLayoutGetTop(s->y_node);
- auto loc = reinterpret_cast(YGNodeGetContext(s->y_node));
+ auto layout = *reinterpret_cast(YGNodeGetContext(s->y_node));
glPolygonMode(GL_FRONT_AND_BACK, GL_FILL);
glm::mat4 pivot = glm::translate(glm::vec3(.5f, .5f, 0.f));
- glm::mat4 scale = glm::scale(glm::vec3(w, h, 1.f));
- glm::mat4 pos = glm::translate(glm::vec3(*loc, 0));
+ glm::mat4 scale = glm::scale(glm::vec3(layout.zw(), 1.f));
+ glm::mat4 pos = glm::translate(glm::vec3(layout.xy(), 0));
auto mvp = proj * pos * scale * pivot;
- shader_uv.use();
- shader.u_mat4("mvp", mvp);
- plane.draw_fill();
+ //shader_uv.use();
+ //shader_uv.u_mat4("mvp", mvp);
+ //plane.draw_fill();
shader_color.use();
shader_color.u_mat4("mvp", mvp);
diff --git a/engine/app.hpp b/engine/app.hpp
index e0806fa..6a2a173 100644
--- a/engine/app.hpp
+++ b/engine/app.hpp
@@ -16,7 +16,8 @@ class App
Rounded rounded;
Slice9 slice;
Texture2D tex;
- YGNodeRef y_root;
+ YGNodeRef y_root { nullptr };
+ struct stat g_file_info { 0 };
public:
static App I;
float width;
@@ -26,4 +27,5 @@ public:
void update(float dt);
void resize(float w, float h);
void update_layout();
+ void load_layout();
};
diff --git a/engine/main.cpp b/engine/main.cpp
index c31ce4a..236b0d1 100644
--- a/engine/main.cpp
+++ b/engine/main.cpp
@@ -227,6 +227,7 @@ int main()
wc.lpfnWndProc = (WNDPROC)WndProc;
wc.lpszClassName = className;
wc.hbrBackground = (HBRUSH)COLOR_WINDOW;
+ wc.hCursor = LoadCursor(NULL, IDC_ARROW);
RegisterClass(&wc);
diff --git a/engine/shape.hpp b/engine/shape.hpp
index b659698..b239b2a 100644
--- a/engine/shape.hpp
+++ b/engine/shape.hpp
@@ -6,7 +6,8 @@ namespace att
Width, MinWidth, MaxWidth,
Height, MinHeight, MaxHeight,
Divisions, InnerRadius, OuterRadius,
- Grow, Shrink, FlexDir, FlexWrap
+ Grow, Shrink, FlexDir, FlexWrap,
+ Padding, Margin
};
struct AttributeBase
@@ -45,6 +46,8 @@ namespace att
{ "shrink", kAttribute::Shrink },
{ "dir", kAttribute::FlexDir },
{ "wrap", kAttribute::FlexWrap },
+ { "pad", kAttribute::Padding },
+ { "margin", kAttribute::Margin},
};
constexpr int map_size = sizeof(map) / sizeof(typemap) - 1;
constexpr bool same(const char* a, const char* b)
@@ -83,6 +86,8 @@ namespace att
DECLARE_ATTRIBUTE(Shrink, float);
DECLARE_ATTRIBUTE(FlexDir, int);
DECLARE_ATTRIBUTE(FlexWrap, int);
+ DECLARE_ATTRIBUTE(Padding, glm::vec4);
+ DECLARE_ATTRIBUTE(Margin, glm::vec4);
#undef DECLARE_ATTRIBUTE
}