From 0d713b6da64f6b9b74dbf5504fe3530b170ebcc9 Mon Sep 17 00:00:00 2001 From: lachrymaLF Date: Sun, 26 May 2024 16:05:18 -0400 Subject: [PATCH] nodes init --- Keishiki/CMakeLists.txt | 16 +- Keishiki/Keishiki.cpp | 7 +- Keishiki/UI.cpp | 330 ++++++++++++++++++---------------- Keishiki/include/Graphics.h | 6 +- Keishiki/runtime/Keishiki.png | Bin 10976 -> 4484 bytes README.md | 2 +- TODO.md | 26 ++- 7 files changed, 214 insertions(+), 173 deletions(-) diff --git a/Keishiki/CMakeLists.txt b/Keishiki/CMakeLists.txt index 079d005..1a46e20 100644 --- a/Keishiki/CMakeLists.txt +++ b/Keishiki/CMakeLists.txt @@ -5,29 +5,27 @@ cmake_minimum_required (VERSION 3.12) project("Main") -add_executable (Keishiki - "ext/imgui/imgui.cpp" "ext/imgui_impl_bgfx.cpp" "ext/imgui/backends/imgui_impl_sdl2.cpp" - "ext/imgui/imgui_demo.cpp" "ext/imgui/imgui_draw.cpp" "ext/imgui/imgui_tables.cpp" "ext/imgui/imgui_widgets.cpp" - "ext/imgui/misc/cpp/imgui_stdlib.cpp" +file(GLOB SRC_FILES ${PROJECT_SOURCE_DIR}/*.cpp) +file(GLOB IMGUI_SRC ${PROJECT_SOURCE_DIR}/ext/imgui/*.cpp) - "Keishiki.cpp" "Graphics.cpp" "UI.cpp" "ShaderGraph.cpp") +add_executable (Keishiki ${IMGUI_SRC} + "ext/imgui_impl_bgfx.cpp" "ext/imgui/backends/imgui_impl_sdl2.cpp" "ext/imgui/misc/cpp/imgui_stdlib.cpp" "ext/ImNodeFlow/src/ImNodeFlow.cpp" + ${SRC_FILES}) set_property(TARGET Keishiki PROPERTY CXX_STANDARD 23) -include_directories ("include" "include/ext" "ext/imgui") +include_directories ("include" "include/ext" "ext/imgui" "ext/ImNodeFlow/include") add_subdirectory("ext/freetype") add_subdirectory("ext/bgfx") -#add_subdirectory("ext/ImNodeFlow") add_compile_definitions(IMGUI_DEFINE_MATH_OPERATORS) -#target_link_libraries(Keishiki ImNodeFlow) if (WIN32) include_directories("include/windows") - target_link_libraries (Keishiki PRIVATE freetype bgfx bx ${PROJECT_SOURCE_DIR}/lib/x64/SDL2.lib ${PROJECT_SOURCE_DIR}/lib/x64/SDL2main.lib) + target_link_libraries (Keishiki PRIVATE freetype bgfx bx ${PROJECT_SOURCE_DIR}/lib/x64/SDL2.lib ${PROJECT_SOURCE_DIR}/lib/x64/SDL2main.lib imgui-sdl2) elseif (APPLE) find_package(SDL2 REQUIRED) target_link_libraries (Keishiki PRIVATE freetype bgfx bx SDL2::SDL2) diff --git a/Keishiki/Keishiki.cpp b/Keishiki/Keishiki.cpp index 2a8d467..6e94d57 100644 --- a/Keishiki/Keishiki.cpp +++ b/Keishiki/Keishiki.cpp @@ -75,13 +75,12 @@ namespace K { } bgfx::setDebug(BGFX_DEBUG_TEXT); - bgfx::setViewClear(K::Graphics::K_VIEW_BG, BGFX_CLEAR_COLOR | BGFX_CLEAR_DEPTH, 0x000000ff, 1.0f, 0); - bgfx::setViewRect(K::Graphics::K_VIEW_BG, 0, 0, window_width, window_height); + bgfx::setViewRect(K::Graphics::K_VIEW_LOGO, 0, 0, window_width, window_height); float view[16]; bx::mtxTranslate(view, 0.f, 0.f, 1.0f); float proj[16]; bx::mtxOrtho(proj, 0.0f, window_width, 0.0f, window_height, 0.1f, 100.0f, 0.f, bgfx::getCaps()->homogeneousDepth); - bgfx::setViewTransform(K::Graphics::K_VIEW_BG, view, proj); + bgfx::setViewTransform(K::Graphics::K_VIEW_LOGO, view, proj); K::UI::Init(window); @@ -100,7 +99,7 @@ namespace K { } void Render() { - K::Graphics::DrawTextureImageAlpha(K::Graphics::K_VIEW_BG, *logo, window_width - logo->w + 10, 0, .7f); + K::Graphics::DrawTextureImageAlpha(K::Graphics::K_VIEW_LOGO, *logo, window_width - logo->w + 10, 0, 1.0f); UI::Draw(frame, state); diff --git a/Keishiki/UI.cpp b/Keishiki/UI.cpp index a46a5d7..48b55e6 100644 --- a/Keishiki/UI.cpp +++ b/Keishiki/UI.cpp @@ -12,11 +12,12 @@ #include namespace { - // windows + // Panels bool draw_viewport = true, draw_plugboard = true, draw_shader = true, - draw_comp = true; + draw_comp = true, + draw_interpolation = true; const f32 row_height = 20.0f; @@ -131,6 +132,7 @@ namespace K::UI { ImGui::Text("Composition Size: %ux%u", s.width, s.height); + ImGui::SameLine(); auto cp = save_called; if (cp) ImGui::BeginDisabled(); @@ -146,7 +148,7 @@ namespace K::UI { } void Composition(CompState& s) { - if (!ImGui::Begin("Composition", &draw_plugboard)) { + if (!ImGui::Begin("Composition", &draw_comp)) { ImGui::End(); return; } @@ -179,10 +181,11 @@ namespace K::UI { l.track.uniforms["translate"].second = ShaderGraph::T_Map::type(.0f, .0f); l.track.shader = "void main() {\n" + "\tfloat angle = -rot * M_PI / 180.0f;\n" "\tvec2 uv = vec2(v_texcoord0.x, 1.0f - v_texcoord0.y) - .5f;\n" "\tuv = uv - translate;\n" "\tuv = uv * aspect_ratio;\n" - "\tuv = vec2(cos(rot)*uv.x - sin(rot)*uv.y, sin(rot)*uv.x + cos(rot)*uv.y);\n" + "\tuv = vec2(cos(angle)*uv.x - sin(angle)*uv.y, sin(angle)*uv.x + cos(angle)*uv.y);\n" "\tuv = uv / scale;\n" "\tuv = uv + .5f;\n\n" "\tvec4 tx = texture2D(s_texColor, uv);\n" @@ -192,6 +195,7 @@ namespace K::UI { s.layers.push_back(std::move(l)); } ImGui::SameLine(); + ImGui::SetNextItemWidth(-100.0f); ImGui::InputText("##LayerName", &name); ImGui::SameLine(); if (no_selection) ImGui::BeginDisabled(); @@ -261,7 +265,7 @@ namespace K::UI { auto source_flags = ImGuiDragDropFlags_SourceNoDisableHover | ImGuiDragDropFlags_SourceNoHoldToOpenOthers; if (!no_selection) source_flags |= ImGuiDragDropFlags_SourceNoPreviewTooltip; if ((no_selection || s.selected.contains(i)) && ImGui::BeginDragDropSource(source_flags)) { - if (s.selected.empty()) ImGui::Text("Moving From #%u %s", i, s.layers[i].name.c_str()); + if (s.selected.empty()) ImGui::Text("Swap with #%u %s", i, s.layers[i].name.c_str()); ImGui::SetDragDropPayload("DND_DEMO_NAME", &i, sizeof(u32)); ImGui::EndDragDropSource(); } @@ -335,150 +339,164 @@ namespace K::UI { } void Plugboard(CompState& s) { - if (ImGui::Begin("Plugboard", &draw_plugboard)) { - if (ImGui::BeginTable("Source", 1, ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit, { 50.0f, -FLT_MIN })) { - - ImGui::PushID(1); - ImGui::TableNextRow(ImGuiTableRowFlags_None, row_height); - ImGui::TableNextColumn(); - ImGui::Text("Time"); - ImGui::PopID(); - - ImGui::EndTable(); - } - ImGui::SameLine(); - if (ImGui::InvisibleButton("Graph", ImVec2{200.0f, 200.0f})) { - Log("d"); - } - } - ImGui::End(); - } - - void Nodegraph(CompState& s) { - ImGuiWindow* window = ImGui::GetCurrentWindow(); - if (window->SkipItems) { + if (!ImGui::Begin("Plugboard", &draw_plugboard)) { ImGui::End(); return; } - else { - ImGuiIO& io = ImGui::GetIO(); - ImGui::Text("Inspecting layer #%u \"%s\"", active_index, active->name.c_str()); + ImGuiIO& io = ImGui::GetIO(); + ImGuiStyle style = ImGui::GetStyle(); + static f32 view_scale = 1.0f; + static ImVec2 view_pos{}, old_view_pos{}; - const ImGuiStyle& style = ImGui::GetCurrentContext()->Style; - const ImGuiID id = window->GetID("Nodegraph"); + ImGui::PushStyleColor(ImGuiCol_ChildBg, 0xFF100500); + ImGui::BeginChild("view_port", ImGui::GetContentRegionAvail(), 0, ImGuiWindowFlags_NoMove); + ImGui::PopStyleColor(); - const ImRect bbox(window->DC.CursorPos, window->DC.CursorPos + ImGui::GetContentRegionAvail()); - ImGui::ItemSize(bbox, style.FramePadding.y); - if (!ImGui::ItemAdd(bbox, id)) { - ImGui::End(); - return; + if (ImGui::IsMouseClicked(0)) { + old_view_pos = view_pos; + } + if (ImGui::IsItemActive()) { + view_pos = old_view_pos + (io.MousePos - io.MouseClickedPos[0]); + } + + static ImVec2 out{}, in{}, out2{}, in2{}; + + static ImVec2 pos{}, old_pos{}; + ImGui::SetCursorPos(view_pos + pos); + static bool active{}; + ImGui::PushID(1); + ImGui::PushStyleColor(ImGuiCol_ChildBg, 0xFF080813); + ImGui::BeginChild("sad", {}, ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_Border); + ImGui::PopStyleColor(); + if (ImGui::BeginTable("s", 3)) { + ImGui::TableNextRow(ImGuiTableRowFlags_None, row_height); + ImGui::TableNextColumn(); + ImGui::TableNextColumn(); + ImGui::Button("Asdf", {100.0f , 0.0f}); + if (ImGui::IsItemClicked()) { + old_pos = pos; } if (ImGui::IsItemActive()) { - window->DrawList->AddLine(io.MouseClickedPos[0], io.MousePos, 0xFFAAAAAA, 2.0f); + pos = old_pos + (io.MousePos - io.MouseClickedPos[0]); } - static ImRect canvas_rect{ 0.0f, 0.0f, 100.0f, 100.0f }; - static ImRect view_rect{ 0.0f, 0.0f, 10.0f, 10.0f }; - - struct OutToIn { - Node* node; - u32 index; - }; - - auto DrawNode = [&](Node& n) { - ImGui::SetCursorPos(n.pos); - ImGui::BeginGroup(); - ImGui::Button(n.name.c_str()); - static ImVec2 old_pos = n.pos; - if (ImGui::IsItemClicked()) { - old_pos = n.pos; - } - if (ImGui::IsItemActive()) { - n.pos = old_pos + (io.MousePos - io.MouseClickedPos[0]); - } - - u32 i = 0; - for (u32 u = 0; u < n.out.size(); u++) { - auto& [type, name] = n.out[u]; - - ImGui::PushID(i); - ImGui::Dummy({100.0f - ImGui::CalcTextSize(name.c_str()).x, 0}); - ImGui::SameLine(); - ImGui::Text(name.c_str()); - ImGui::SameLine(); - - bool active{}; - ImGui::RadioButton("##", active); - if (ImGui::IsItemActive()) { - window->DrawList->AddLine(io.MouseClickedPos[0], io.MousePos, 0xFFAAAAAA, 2.0f); - } - - if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) { - OutToIn d{ &n, u }; - ImGui::SetDragDropPayload("K_SHADER_OUT_TO_IN", &d, sizeof(d)); - ImGui::Text("%s", Type_To_Str[type]); - ImGui::EndDragDropSource(); - } - //if (ImGui::BeginDragDropTarget()) { - // if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("K_SHADER_IN_TO_OUT")) { - // InSlot* in = *(InSlot**)payload->Data; - // } - // ImGui::EndDragDropTarget(); - //} - - ImGui::PopID(); - i++; - } - for (InSlot& s : n.inputs) { - ImGui::PushID(i); - - bool active = s.node != nullptr; - if (active) { - window->DrawList->AddLine(window->DC.CursorPos, io.MousePos, 0xFFAAAAAA, 2.0f); - } - ImGui::RadioButton((s.name).c_str(), active); - if (ImGui::IsItemActive()) - window->DrawList->AddLine(io.MouseClickedPos[0], io.MousePos, 0xFFAAAAAA, 2.0f); - - //if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) { - // const InSlot* ptr = &s; - // ImGui::SetDragDropPayload("K_SHADER_IN_TO_OUT", &ptr, sizeof(ptr)); - // ImGui::Text("%s", Type_To_Str[s.type]); - // ImGui::EndDragDropSource(); - //} - if (ImGui::BeginDragDropTarget()) { - if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("K_SHADER_OUT_TO_IN")) { - OutToIn out = *(const OutToIn*)payload->Data; - if (out.node->out[out.index].first == s.type) { - s.node = out.node; - s.out_index = out.index; - } - } - ImGui::EndDragDropTarget(); - } - - ImGui::PopID(); - i++; - } - - ImGui::EndGroup(); - window->DrawList->AddRect(ImGui::GetItemRectMin(), ImGui::GetItemRectMax(), 0xFFFFFFFF); - }; - - window->DrawList->AddRectFilled(bbox.Min, bbox.Max, ImGui::GetColorU32(ImGuiCol_FrameBg)); - - for (u32 i = 0; i < active->track.tree.nodes.size(); i++) { - ImGui::PushID(i); - DrawNode(active->track.tree.nodes[i]); - ImGui::PopID(); - } - - static bool graph_hover{}, graph_held{}; - ImGui::ButtonBehavior(bbox, id, &graph_hover, &graph_held); + ImGui::TableNextColumn(); + ImGui::PushID(1); + ImGui::TableNextRow(ImGuiTableRowFlags_None, row_height); + ImGui::TableNextColumn(); + ImGui::TableNextColumn(); + ImGui::Dummy({100.0f - ImGui::CalcTextSize("asd").x - style.ItemSpacing.x, 0.0f}); + ImGui::SameLine(); + ImGui::Text("qq"); + ImGui::TableNextColumn(); + ImGui::RadioButton("##asd", active); + out = ImGui::GetCursorScreenPos() + ImVec2{ ImGui::GetFrameHeight() / 2, -ImGui::GetFrameHeight() / 2 - style.ItemInnerSpacing.y }; + ImGui::TableNextRow(ImGuiTableRowFlags_None, row_height); + ImGui::TableNextColumn(); + ImGui::RadioButton("##asd", active); + in2 = ImGui::GetCursorScreenPos() + ImVec2{ ImGui::GetFrameHeight() / 2, -ImGui::GetFrameHeight() / 2 - style.ItemInnerSpacing.y }; + ImGui::TableNextColumn(); + ImGui::Text("asd"); + ImGui::TableNextColumn(); + ImGui::PopID(); + ImGui::EndTable(); } + + + +/* + if (ImGui::IsItemActive()) { + } + + if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) { + OutToIn d{ &n, u }; + ImGui::SetDragDropPayload("K_SHADER_OUT_TO_IN", &d, sizeof(d)); + ImGui::Text("asdf"); + ImGui::EndDragDropSource(); + } + if (ImGui::BeginDragDropTarget()) { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("K_SHADER_IN_TO_OUT")) { + InSlot* in = *(InSlot**)payload->Data; + } + ImGui::EndDragDropTarget(); + } +*/ + +/* for (InSlot& s : n.inputs) { + ImGui::PushID(i); + + bool active = s.node != nullptr; + if (active) { + window->DrawList->AddLine(window->DC.CursorPos, io.MousePos, 0xFFAAAAAA, 2.0f); + } + ImGui::RadioButton((s.name).c_str(), active); + if (ImGui::IsItemActive()) + window->DrawList->AddLine(io.MouseClickedPos[0], io.MousePos, 0xFFAAAAAA, 2.0f); + + //if (ImGui::BeginDragDropSource(ImGuiDragDropFlags_None)) { + // const InSlot* ptr = &s; + // ImGui::SetDragDropPayload("K_SHADER_IN_TO_OUT", &ptr, sizeof(ptr)); + // ImGui::Text("%s", Type_To_Str[s.type]); + // ImGui::EndDragDropSource(); + //} + if (ImGui::BeginDragDropTarget()) { + if (const ImGuiPayload* payload = ImGui::AcceptDragDropPayload("K_SHADER_OUT_TO_IN")) { + OutToIn out = *(const OutToIn*)payload->Data; + if (out.node->out[out.index].first == s.type) { + s.node = out.node; + s.out_index = out.index; + } + } + ImGui::EndDragDropTarget(); + } + + ImGui::PopID(); + i++; + }*/ + + ImGui::EndChild(); + ImGui::PopID(); + + ImGui::SetCursorPos({}); + ImGui::PushStyleColor(ImGuiCol_ChildBg, 0x33FFFFFF); + ImGui::BeginChild("asdasd", {}, ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY ); + ImGui::PopStyleColor(); + if (ImGui::BeginTable("Source", 2)) { + ImGui::PushID(1); + ImGui::TableNextRow(ImGuiTableRowFlags_None, row_height); + ImGui::TableNextColumn(); + ImGui::Text("Time"); + ImGui::TableNextColumn(); + ImGui::RadioButton("##asd", active); + out2 = ImGui::GetCursorScreenPos() + ImVec2{ ImGui::GetFrameHeight() / 2, -ImGui::GetFrameHeight() / 2 - style.ItemInnerSpacing.y }; + ImGui::PopID(); + ImGui::EndTable(); + } + ImGui::EndChild(); + + ImGui::SetCursorPos({ImGui::GetContentRegionAvail().x - 100.0f, 0.0f}); + ImGui::PushStyleColor(ImGuiCol_ChildBg, 0x33FFFFFF); + ImGui::BeginChild("ert", {}, ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY); + ImGui::PopStyleColor(); + if (ImGui::BeginTable("Source", 1)) { + ImGui::PushID(1); + ImGui::TableNextRow(ImGuiTableRowFlags_None, row_height); + ImGui::TableNextColumn(); + ImGui::RadioButton("asfnjklanf", active); + in = ImGui::GetCursorScreenPos() + ImVec2{ ImGui::GetFrameHeight() / 2, -ImGui::GetFrameHeight() / 2 - style.ItemInnerSpacing.y }; + ImGui::PopID(); + ImGui::EndTable(); + } + ImGui::EndChild(); + + ImGui::GetCurrentWindow()->DrawList->AddLine(in, out, 0xFFFFFFFF, 2.0f); + ImGui::GetCurrentWindow()->DrawList->AddLine(in2, out2, 0xFFAAAAAA, 2.0f); + + ImGui::EndChild(); + ImGui::End(); - } +} void Shader(CompState& s) { if (ImGui::Begin("Shader", &draw_shader)) { @@ -498,18 +516,19 @@ namespace K::UI { (data->EventChar >= '0' && data->EventChar <= '9') || data->EventChar == '_')); } }; + ImGui::SetNextItemWidth(-80.0f); ImGui::InputText("##UniformName", &name, ImGuiInputTextFlags_CallbackCharFilter, TextFilters::VariableName); ImGui::SameLine(); ImGui::SetNextItemWidth(-FLT_MIN); - ImGui::Combo("Type", &type_current, ShaderGraph::Type_To_Str, ShaderGraph::T_Count); + ImGui::Combo("##Type", &type_current, ShaderGraph::Type_To_Str, ShaderGraph::T_Count); - if (ImGui::BeginTable("Uniforms", 5, ImGuiTableFlags_Borders | ImGuiTableFlags_SizingFixedFit)) { - ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoSort); - ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_NoSort); - ImGui::TableSetupColumn("Expose", ImGuiTableColumnFlags_NoSort); - ImGui::TableSetupColumn("Value", ImGuiTableColumnFlags_NoSort, ImGui::GetContentRegionAvail().x / 1.7f); - ImGui::TableSetupColumn("##del", ImGuiTableColumnFlags_NoSort); + if (ImGui::BeginTable("Uniforms", 5, ImGuiTableFlags_Borders)) { + ImGui::TableSetupColumn("Name", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("Type", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("Expose", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed); + ImGui::TableSetupColumn("Value", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthStretch); + ImGui::TableSetupColumn("##del", ImGuiTableColumnFlags_NoSort | ImGuiTableColumnFlags_WidthFixed); ImGui::TableHeadersRow(); i32 i = 0; for (auto it = s.layers[s.active].track.uniforms.begin(); it != s.layers[s.active].track.uniforms.end();) { @@ -529,13 +548,13 @@ namespace K::UI { if constexpr (std::is_same_v::type>) ImGui::DragFloat("##", &arg, 0.005f); else if constexpr (std::is_same_v::type>) - ImGui::DragInt("##", &arg); + ImGui::DragInt("##", &arg, 0.005f); else if constexpr (std::is_same_v::type>) - ImGui::DragFloat4("##", &arg.r); + ImGui::DragFloat4("##", &arg.r, 0.005f); else if constexpr (std::is_same_v::type>) - ImGui::DragFloat2("##", &arg.x); + ImGui::DragFloat2("##", &arg.x, 0.005f); else if constexpr (std::is_same_v::type>) - ImGui::DragFloat3("##", &arg.x); + ImGui::DragFloat3("##", &arg.x, 0.005f); }, it->second.second); ImGui::TableNextColumn(); if (ImGui::Button("X")) { @@ -548,7 +567,7 @@ namespace K::UI { ImGui::EndTable(); } ImGui::Text("Editing Layer %u: %s", s.active, s.layers[s.active].name.c_str()); - ImGui::InputTextMultiline("##source", &s.layers[s.active].track.shader, ImVec2(-FLT_MIN, ImGui::GetTextLineHeight() * 40), ImGuiInputTextFlags_AllowTabInput); + ImGui::InputTextMultiline("##source", &s.layers[s.active].track.shader, ImVec2(-FLT_MIN, ImGui::GetContentRegionAvail().y - 25.0f), ImGuiInputTextFlags_AllowTabInput); if (ImGui::Button("Submit Shader")) s.layers[s.active].track.compile(); } @@ -556,12 +575,20 @@ namespace K::UI { ImGui::End(); } + void Interpolation(CompState& s) { + if (ImGui::Begin("Interpolation", &draw_interpolation)) { + } + ImGui::End(); + } + void Draw(u32 frame, CompState& s) { ImGui_ImplSDL2_NewFrame(); ImGui_Implbgfx_NewFrame(); ImGui::NewFrame(); - ImGui::ShowDemoWindow(); + ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(), ImGuiDockNodeFlags_PassthruCentralNode); + +// ImGui::ShowDemoWindow(); static ImGuiStyle& style = ImGui::GetStyle(); style.GrabRounding = style.FrameRounding = 5.0f; MainMenuBar(s); @@ -569,6 +596,7 @@ namespace K::UI { if (draw_shader) Shader(s); if (draw_plugboard) Plugboard(s); if (draw_comp) Composition(s); + if (draw_interpolation) Interpolation(s); if (save_called && ready_frame == frame) { stbi_write_png("frame.png", s.width, s.height, 4, save_buffer, s.width * 4); @@ -585,7 +613,7 @@ namespace K::UI { io.ConfigFlags |= ImGuiConfigFlags_NavEnableKeyboard; io.ConfigFlags |= ImGuiConfigFlags_DockingEnable; // io.Fonts->AddFontFromFileTTF("SourceHanSans-Regular.ttc", 17); - ImGui_Implbgfx_Init(K::Graphics::K_VIEW_TOP); + ImGui_Implbgfx_Init(K::Graphics::K_VIEW_UI); switch (bgfx::getRendererType()) { case bgfx::RendererType::Noop: diff --git a/Keishiki/include/Graphics.h b/Keishiki/include/Graphics.h index 125c159..9514533 100644 --- a/Keishiki/include/Graphics.h +++ b/Keishiki/include/Graphics.h @@ -7,11 +7,11 @@ namespace K::Graphics { enum VIEW_ID { - K_VIEW_BG, K_VIEW_COMP_COMPOSITE, K_VIEW_COMP_SAVE, K_VIEW_DRAW, - K_VIEW_TOP, + K_VIEW_UI, + K_VIEW_LOGO, }; bool Init(u16 width, u16 height); @@ -72,7 +72,6 @@ namespace K::Graphics { K_V_ColourBurn, K_V_LinearBurn, K_V_ColourDodge, - K_V_LinearDodge, K_V_Hue, K_V_Saturation, @@ -112,7 +111,6 @@ namespace K::Graphics { "Colour Burn", "Linear Burn", "Colour Dodge", - "Linear Dodge", "Hue", "Saturation", diff --git a/Keishiki/runtime/Keishiki.png b/Keishiki/runtime/Keishiki.png index d24ab3169bdd2cc08fa8c193f21d89abe39ba1ca..01543d63b363ef534e4180352baafa1f5bf5c3f0 100644 GIT binary patch literal 4484 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 -# Keishiki: Real-Time Compositor-Sequencer +# Keishiki: Real-Time Compositor-Sequencer Framework ## Libraries - [bgfx](https://github.com/bkaradzic/bgfx) diff --git a/TODO.md b/TODO.md index 7c356f7..bdddaee 100644 --- a/TODO.md +++ b/TODO.md @@ -1,17 +1,35 @@ +# NOW ## Compositor - Manage Samplers -- (Resources in general) + - Blender previews (important) - Data model for comps - Dump and read back state, (de)serialization!!! -- std::unordered_map -> std::flat_map pending compiler support +- Non-negotiables: + - Text (idea: index-based evaluation in plugboard) + - Shapes (idea: embed glisp :mmtroll:, need to inquire -- still a lot of friction for simple shapes if we don't also get the glisp tools) + - External data driving (json?) +- Layer Groups (jokes -- can be completely UI side) ## UI -- Sequencer timeline init -- Viewport Gizmos (https://github.com/CedricGuillemet/ImGuizmo) -- Shader nodes (https://github.com/CedricGuillemet/ImGuizmo) +- Interpolation Editor init +- Timeline/Dope sheet init +- Viewport gizmos (Layer-specific & nodes -- can separate into different tools?) + +# Later +## Compositor +- std::unordered_map -> std::flat_map pending compiler support +- Simple 3D engine ## Audio - Wait for SDL3! + - SDL_mixer will be able to do all of wav ogg flac mp3 opus, we live in good times + - output needs to be handled differently (if we care at all -- likely not) ## IO - Video import (research opencv libavcodec etc) + - maybe https://superuser.com/a/1397578 -- no portable way to get stdout, this is messed up + - boost::process? idk, might as well just go through a file - File dialogues pending SDL3 + - https://wiki.libsdl.org/SDL3/CategoryDialog +- Down the road: OIIO output for more than PNG's + - don't care about video export -- leave it for ffmpeg