#include "debugdraw.hpp" #include "editor.hpp" #include "model.hpp" #include "ui.hpp" static struct { UI* ui; UI::Toolbar* toolbar; UI::Button* mat_btn; UI::Modal* mat_win; UI::Slider* metalness_input; Model_Instance* selected_inst; int selected_mesh; } editor; static int mat_win_handler(UI::Element* e, const UI::Message& m) { (void)e; if (m.type == UI::Message::Type::destroy) editor.mat_btn->enable(); return 0; } static int mat_btn_handler(UI::Element* e, const UI::Message& m) { (void)e; if (m.type == UI::Message::Type::click) { editor.mat_win = editor.ui->create_element( editor.ui->root, "Material Editor" ); auto container = editor.ui->create_element( editor.mat_win->contents ); editor.mat_win->handler = mat_win_handler; editor.mat_btn->disable(); editor.metalness_input = editor.ui->create_element( container, 0.0f, 1.0f ); if (!editor.selected_inst) editor.metalness_input->disable(); editor.metalness_input->input->handler = []( UI::Element* e, const UI::Message& m ) { if (editor.selected_inst) { UI::Float_Input* in = (UI::Float_Input*)e; Mesh* meshes = editor.selected_inst->m->get_meshes(); Mesh& mesh = meshes[editor.selected_mesh]; Material* mat = mesh.material; mat->metalness = in->val; } return 0; }; } return 0; } void init_editor(UI* ui) { editor.ui = ui; editor.toolbar = ui->create_element(ui->root); editor.mat_btn = ui->create_element( editor.toolbar, "Edit Material" ); editor.mat_win = 0; editor.mat_btn->handler = mat_btn_handler; } void deinit_editor() { } void editor_on_select(Model_Instance* instance, int mesh) { if (!editor.ui->hovered) { editor.selected_inst = instance; editor.selected_mesh = mesh; if (editor.mat_win) { if (instance) { Mesh* meshes = instance->m->get_meshes(); Mesh& msh = meshes[mesh]; Material* mat = msh.material; editor.metalness_input->enable(); editor.metalness_input->input->set_val(mat->metalness); } else editor.metalness_input->disable(); } } } void editor_draw(Line_Renderer& lr) { if (editor.selected_inst) { lr.add_box( editor.selected_inst->bounds[editor.selected_mesh] ); } }