diff --git a/src/presenter.cpp b/src/presenter.cpp
index bd534f6ca98f58f6d1d50b17eb873ec5071b33f6..b782ebdc2bc6d16af840692526c341a967ca8b1c 100644
--- a/src/presenter.cpp
+++ b/src/presenter.cpp
@@ -68,6 +68,48 @@ static com::Folder *default_text_material_box() {
     return box;
 }
 
+static const std::string rectangle_vertex_shader = R"(
+#version 330 core
+
+layout(location = 0) in vec3 vertex_position;
+layout(location = 3) in vec2 a_tex_coords;
+
+out vec2 tex_coords;
+
+void main()
+{
+    tex_coords = a_tex_coords;
+    gl_Position = vec4(vertex_position, 1.);
+}
+)";
+
+static const std::string rectangle_fragment_shader = R"(
+#version 330 core
+
+in vec2 tex_coords;
+
+out vec4 fragColor;
+
+void main()
+{
+    fragColor = vec4(tex_coords, 1., 1.);
+}
+)";
+
+static com::Folder *generate_rectangle() {
+    auto shader = gfx::shader_system()->insert_shader<gfx::TextShader>(
+        {"test-rectangle"}, "test-rectangle-shader", gfx::Shader::UNLIT, rectangle_vertex_shader, rectangle_fragment_shader);
+
+    auto material = gfx::material_system()->insert_material("test-rectangle-material", shader, {"test-rectangle"});
+
+    auto rect = gfx::object_system()->insert_object(
+            { "test-rectangle" }, material,
+            gfx::buffer_generators()->insert_procedural_rectangle({ 1, 1 }, "test-rectangle", { "maker" }));
+    gfx::object_system()->push_frame_back(rect, root()->push_back<com::Folder>("test-rectangle")->push_back<com::Frame>());
+
+    return rect;
+}
+
 static com::Folder *generate_box(vec3 position, vec3 half_sizes_along_axes) {
     auto shader = gfx::shader_system()->insert_shader("box_shader", gfx::Shader::Pipeline::FORWARD, gfx::Shader::LIT,
                                                       { "shaders" });