diff --git a/src/presenter.cpp b/src/presenter.cpp index 70c6686c342644b55454fa10d15edd8a8e0b07ba..f5e25cf8574717f0b90340c956b177d646edf102 100644 --- a/src/presenter.cpp +++ b/src/presenter.cpp @@ -12,6 +12,7 @@ #include <iostream> #include <sstream> #include <fstream> +#include <glm/gtx/string_cast.hpp> namespace mak { @@ -73,15 +74,31 @@ void Presenter::initialize() auto shader = gfx::shader_system()->insert_shader<Graph>( { "text_shaders" }, "consolas_shader", - Graph::UNLIT + Graph::UNLIT, + Graph::PHONG, + Graph::PARTIAL ); - Graph::TextureNode* textureNode = shader->insert<Graph::TextureNode>(com::ContextPath{"age", "texture", "font", "Consolas_16.png"}); + gfx::AtlasGlyphProps glyph_props; + gfx::load_true_type_font(osi::data()->dir() / "age" / "font" / "open_sans" / "OpenSans-Regular.ttf", 48U, glyph_props); + //Graph::TextureNode* textureNode = shader->insert<Graph::TextureNode>(com::ContextPath{"age", "texture", "font", "Consolas_16.png"}, ElementType::VEC4); + Graph::TextureNode* textureNode = shader->insert<Graph::TextureNode>(com::ContextPath{"age", "texture", "font", "Open Sans_Regular_48_font_atlas.png"}, ElementType::VEC4); Graph::NodeVaryingTexcoord* uvCoordNode = shader->insert<Graph::NodeVaryingTexcoord>(); + Graph::NodeDecomposeVector* decomposeNode = shader->insert<Graph::NodeDecomposeVector>(ElementType::VEC4); + Graph::NodeComposeVector* composeNode = shader->insert<Graph::NodeComposeVector>(ElementType::VEC3); + shader->connect(composeNode, 0, decomposeNode, 0); + shader->connect(composeNode, 1, decomposeNode, 1); + shader->connect(composeNode, 2, decomposeNode, 2); + shader->connect(decomposeNode, 0, textureNode, 0); + shader->connect(textureNode, Graph::TextureNode::inputs::tex_coord, uvCoordNode, 0); - shader->connect(shader->root(), Graph::MasterNodeUnlit::inputs::color, textureNode, 0); + shader->connect(shader->root(), Graph::MasterNodeUnlit::inputs::color, composeNode, 0); + shader->connect(shader->root(), Graph::MasterNodeUnlit::inputs::alpha, decomposeNode, 3); + + auto emission = shader->insert<Graph::NodeConstant>(vec3{0.}); + shader->connect(shader->root(), Graph::MasterNodeUnlit::inputs::emission, emission, 0); gfx::Material* tex_material = gfx::material_system()->insert_material("box_material", text_shader, {"materials"}); gfx::Material* consolas_material = gfx::material_system()->insert_material("consolas_material", shader, {"materials"}); @@ -99,65 +116,88 @@ void Presenter::initialize() ); // --- BEGIN test_box --- - com::Folder* const test_box = gfx::object_system()->insert_object( - { "maker", "test_box" }, - tex_material, - gfx::buffer_generators()->insert_procedural_box_solid({ 0.5f, 0.5f, 0.5f } , "test_box", { "maker" }) - ); - gfx::object_system()->push_frame_back( - test_box , - root()->push_back<com::Folder>("test_box")->push_back<com::Frame>() - ); - gfx::object_system()->get_uniforms(test_box)->push_back<com::FileVec3>("material_ambient_color", vec3{ 0.75f, 0.75f, 0 }); - - // The second instance - com::Frame* const frame2 = root()->push_back<com::Folder>("test_box_2")->push_back<com::Frame>(); - frame2->move_origin({ 0.5f, 0, 1.5f }); - gfx::object_system()->push_frame_back(test_box, frame2); + //com::Folder* const test_box = gfx::object_system()->insert_object( + //{ "maker", "test_box" }, + //tex_material, + //gfx::buffer_generators()->insert_procedural_box_solid({ 0.5f, 0.5f, 0.5f } , "test_box", { "maker" }) + //); + //gfx::object_system()->push_frame_back( + //test_box , + //root()->push_back<com::Folder>("test_box")->push_back<com::Frame>() + //); + //gfx::object_system()->get_uniforms(test_box)->push_back<com::FileVec3>("material_ambient_color", vec3{ 0.75f, 0.75f, 0 }); + + //// The second instance + //com::Frame* const frame2 = root()->push_back<com::Folder>("test_box_2")->push_back<com::Frame>(); + //frame2->move_origin({ 0.5f, 0, 1.5f }); + //gfx::object_system()->push_frame_back(test_box, frame2); // --- END test_box --- // UI // Create gfx/ui/ and maker/ui/ folders - gfx::Button* ui_elem1 = gfx::ui_generators()->create_ui_button("ui_elem1", {}); - gfx::Button* ui_elem2 = gfx::ui_generators()->create_ui_button("ui_elem2", {}); - com::Folder* ui_elem_folder1 = root()->push_back<com::Folder>(ui_elem1->name()); - com::Folder* ui_elem_folder2 = root()->push_back<com::Folder>(ui_elem2->name()); + gfx::Button* ui_elem1 = gfx::ui_generators()->create_ui_button("ui_elem1", {"buttons"}, "text"); + gfx::Button* ui_elem2 = gfx::ui_generators()->create_ui_button("ui_elem2", {"buttons"}, "text1234"); + gfx::TextBox* ui_elem_text_box1 = dynamic_cast<gfx::TextBox*>(ui_elem1->get_child(gfx::Button::text_box_folder_name())); + gfx::TextBox* ui_elem_text_box2 = dynamic_cast<gfx::TextBox*>(ui_elem2->get_child(gfx::Button::text_box_folder_name())); + com::Frame* ui_elem_frame1 = root()->push_back<com::Folder>(ui_elem1->name())->push_back<com::Frame>(); + com::Frame* ui_elem_frame2 = root()->push_back<com::Folder>(ui_elem2->name())->push_back<com::Frame>(); + com::Frame* ui_elem_text_box_frame1 = root()->push_back<com::Folder>(root()->generate_unique_name(gfx::Button::text_box_folder_name()))->push_back<com::Frame>(); + com::Frame* ui_elem_text_box_frame2 = root()->push_back<com::Folder>(root()->generate_unique_name(gfx::Button::text_box_folder_name()))->push_back<com::Frame>(); + gfx::ui_system()->set_parent(ui_elem1, camera_frame()); gfx::ui_system()->set_parent(ui_elem2, camera_frame()); + gfx::ui_system()->set_parent(ui_elem_text_box1, ui_elem_frame1); + gfx::ui_system()->set_parent(ui_elem_text_box2, ui_elem_frame2); // Set variables - gfx::ui_system()->get_transform(ui_elem1)->set_position(vec2{ 0.5f, 0.5f }); - gfx::ui_system()->get_transform(ui_elem1)->set_scale(vec2{ 0.01f, 0.005f}); + gfx::ui_system()->get_transform(ui_elem1)->set_position(vec2{ 0.7f, 0.7f }); + gfx::ui_system()->get_transform(ui_elem1)->set_scale(vec2{ 0.01f, 0.01f }); - gfx::ui_system()->get_transform(ui_elem2)->set_position(vec2{ -0.03f, 0.04f}); - gfx::ui_system()->get_transform(ui_elem2)->set_scale(vec2{ 0.01f, 0.05f}); + gfx::ui_system()->get_transform(ui_elem2)->set_position(vec2{ -0.7f, -0.7f}); + gfx::ui_system()->get_transform(ui_elem2)->set_scale(vec2{ 0.01f, 0.01f }); + + gfx::ui_system()->get_transform(ui_elem_text_box1)->set_position(vec2{ 0.00f, 0.00f }); + gfx::ui_system()->get_transform(ui_elem_text_box1)->set_scale(vec2{ 3.0f, 3.0f }); + gfx::ui_system()->get_transform(ui_elem_text_box2)->set_position(vec2{ 0.00f, 0.00f }); + gfx::ui_system()->get_transform(ui_elem_text_box2)->set_scale(vec2{ 0.5f, 0.5f }); // Create buffer gfx::Buffer* ui_buffer = gfx::buffer_generators()->insert_procedural_rectangle({ 1.0f, 1.0f }, "ui_buffer", { "ui" }); gfx::Buffer* ui_text_buffer1 = gfx::buffer_generators()->insert_procedural_text_rectangle( - "01234", + ui_elem_text_box1->get_text() + "12123123", font_props, - gfx::ui_system()->get_transform(ui_elem1)->get_aabb().hi.x - gfx::ui_system()->get_transform(ui_elem1)->get_aabb().lo.x, + // would like to set it up based on button aabb + 1.0f, 255U, true, true, "button_1_text" ); gfx::Buffer* ui_text_buffer2 = gfx::buffer_generators()->insert_procedural_text_rectangle( - "01234", + ui_elem_text_box2->get_text(), font_props, - gfx::ui_system()->get_transform(ui_elem2)->get_aabb().hi.x - gfx::ui_system()->get_transform(ui_elem2)->get_aabb().lo.x, + 10.0f, 255U, true, true, "button_2_text" ); + gfx::Buffer* ttf_buffer = gfx::buffer_generators()->create_text_buffer( + "text", + glyph_props, + "id" + ); + + //ui_elem1->get_theme()->set_material(gfx::ENABLED, consolas_material); + // Insert UI elements into object system - auto ui_elem_object1 = gfx::ui_system()->insert_object(ui_elem1, ui_elem_folder1, consolas_material, ui_text_buffer1); - auto ui_elem_object2 = gfx::ui_system()->insert_object(ui_elem2, ui_elem_folder2, consolas_material, ui_text_buffer2); + auto ui_elem_object1 = gfx::ui_system()->insert_object(ui_elem1, ui_elem_frame1, tex_material, ui_buffer); + auto ui_elem_object2 = gfx::ui_system()->insert_object(ui_elem2, ui_elem_frame2, tex_material, ui_buffer); + gfx::ui_system()->insert_object(ui_elem_text_box1, ui_elem_text_box_frame1, consolas_material, ttf_buffer); + gfx::ui_system()->insert_object(ui_elem_text_box2, ui_elem_text_box_frame2, consolas_material, ui_text_buffer2); // --- BEGIN directional light --- @@ -175,19 +215,13 @@ void Presenter::initialize() // --- END directional light --- - // BEGIN Handlers - ButtonHandler* button_handler = root()->find<ButtonHandler>(ButtonHandler::self_name()); - gfx::ui_system()->add_handler(ui_elem1, button_handler); - gfx::ui_system()->add_handler(ui_elem2, button_handler); - - // END handlers - - gfx::object_system()->insert_light(test_box, dir_light); - gfx::object_system()->insert_light(test_box, ambient_light); - gfx::light_system()->insert_shadow_caster(dir_light, test_box); + //gfx::object_system()->insert_light(test_box, dir_light); + //gfx::object_system()->insert_light(test_box, ambient_light); + //gfx::light_system()->insert_shadow_caster(dir_light, test_box); print_tree(*gfx::root(), std::cout); print_tree(*mak::root(), std::cout); - + std::cout << glm::to_string(gfx::camera_system()->active_camera()->bottom_left_absolute()) << std::endl; + std::cout << glm::to_string(gfx::camera_system()->active_camera()->top_right_absolute()) << std::endl; } void Presenter::release() @@ -203,7 +237,18 @@ void Presenter::release() void Presenter::next_round() { gfx::renderer()->clear_render_buffers(); - gfx::renderer()->present_collection(gfx::object_system()->objects(), gfx::Renderer::pipeline::FORWARD); + //gfx::renderer()->present_collection(gfx::object_system()->objects(), gfx::Renderer::pipeline::FORWARD); + gfx::renderer()->present_collection(gfx::object_system()->objects()->find<com::Folder>("grid"), gfx::Renderer::pipeline::FORWARD); + //gfx::renderer()->present_collection(gfx::object_system()->objects()->find<com::Folder>("maker"), gfx::Renderer::pipeline::FORWARD); + + // if I change to ortho, the intersection with mouse stops working + gfx::camera_system()->active_camera()->set_perspective(false); + + gfx::renderer()->configure_depth_writing(false); + gfx::renderer()->configure_blending(true, GL_ONE, GL_ONE_MINUS_SRC_ALPHA); + gfx::renderer()->present_collection(gfx::object_system()->objects()->find<com::Folder>("ui"), gfx::Renderer::pipeline::FORWARD); + gfx::camera_system()->active_camera()->set_perspective(true); + gfx::renderer()->configure_depth_writing(true); } }