asdf
This commit is contained in:
parent
5f6adef565
commit
10ae63c763
4 changed files with 49 additions and 34 deletions
3
.gitmodules
vendored
3
.gitmodules
vendored
|
@ -7,6 +7,3 @@
|
||||||
[submodule "Keishiki/ext/freetype"]
|
[submodule "Keishiki/ext/freetype"]
|
||||||
path = Keishiki/ext/freetype
|
path = Keishiki/ext/freetype
|
||||||
url = https://github.com/freetype/freetype.git
|
url = https://github.com/freetype/freetype.git
|
||||||
[submodule "Keishiki/ext/ImNodeFlow"]
|
|
||||||
path = Keishiki/ext/ImNodeFlow
|
|
||||||
url = https://github.com/Fattorino/ImNodeFlow.git
|
|
||||||
|
|
|
@ -19,7 +19,8 @@ namespace {
|
||||||
draw_plugboard = true,
|
draw_plugboard = true,
|
||||||
draw_shader = true,
|
draw_shader = true,
|
||||||
draw_comp = true,
|
draw_comp = true,
|
||||||
draw_interpolation = true;
|
draw_interpolation = true,
|
||||||
|
draw_properties = true;
|
||||||
|
|
||||||
const f32 row_height = 20.0f;
|
const f32 row_height = 20.0f;
|
||||||
|
|
||||||
|
@ -340,7 +341,7 @@ namespace K::UI {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlugboardNodeDrawSockets(PlugboardGraph::NodeInstance& n, ImGuiStyle& style,
|
void PlugboardNodeDrawSockets(PlugboardGraph::NodeInstance& n, ImGuiStyle& style,
|
||||||
bool& dragging_on_socket, ImVec2& source, std::unordered_map<PlugboardGraph::ConnectInfo, ImVec4, PlugboardGraph::_ConnectInfoHasher>& link_pos,
|
bool& dragging_on_socket, ImVec2& source, std::unordered_map<PlugboardGraph::ConnectInfo, PlugboardGraph::LinksFromSource, PlugboardGraph::_ConnectInfoHasher>& link_pos,
|
||||||
bool dummy = true) {
|
bool dummy = true) {
|
||||||
i32 row = 1;
|
i32 row = 1;
|
||||||
for (u32 out = 0; out < n.node->out_names.size(); out++, row++) {
|
for (u32 out = 0; out < n.node->out_names.size(); out++, row++) {
|
||||||
|
@ -374,12 +375,13 @@ namespace K::UI {
|
||||||
ImGui::PopID();
|
ImGui::PopID();
|
||||||
|
|
||||||
// Update link info if needed
|
// Update link info if needed
|
||||||
if (n.outputs_going[out].p != nullptr) {
|
if (n.outputs_going[out].p != nullptr)
|
||||||
auto pos = ImGui::GetCursorScreenPos() + ImVec2{ ImGui::GetFrameHeight() / 2, -ImGui::GetFrameHeight() / 2 - style.ItemInnerSpacing.y};
|
std::visit([&link_pos, &style](auto&& arg) {
|
||||||
auto& d = link_pos[std::get<PlugboardGraph::ConnectInfo>(n.outputs_going[out].p->inputs_fed[n.outputs_going[out].index])];
|
using T = std::decay_t<decltype(arg)>;
|
||||||
d.w = pos.x;
|
if constexpr (std::is_same_v<T, PlugboardGraph::ConnectInfo>)
|
||||||
d.z = pos.y;
|
link_pos[arg].source = ImGui::GetCursorScreenPos() + ImVec2{ ImGui::GetFrameHeight() / 2, -ImGui::GetFrameHeight() / 2 - style.ItemInnerSpacing.y};
|
||||||
}
|
}, n.outputs_going[out].p->inputs_fed[n.outputs_going[out].index]);
|
||||||
|
|
||||||
}
|
}
|
||||||
for (u32 in = 0; in < n.inputs_fed.size(); in++, row++) {
|
for (u32 in = 0; in < n.inputs_fed.size(); in++, row++) {
|
||||||
ImGui::PushID(row);
|
ImGui::PushID(row);
|
||||||
|
@ -405,12 +407,11 @@ namespace K::UI {
|
||||||
}
|
}
|
||||||
|
|
||||||
// Update link info if needed
|
// Update link info if needed
|
||||||
if (n.inputs_fed[in].index() == 0) {
|
std::visit([&link_pos, &style](auto&& arg) {
|
||||||
auto pos = ImGui::GetCursorScreenPos() + ImVec2{ ImGui::GetFrameHeight() / 2, -ImGui::GetFrameHeight() / 2 - style.ItemInnerSpacing.y};
|
using T = std::decay_t<decltype(arg)>;
|
||||||
auto& d = link_pos[std::get<PlugboardGraph::ConnectInfo>(n.inputs_fed[in])];
|
if constexpr (std::is_same_v<T, PlugboardGraph::ConnectInfo>)
|
||||||
d.x = pos.x;
|
link_pos[arg].sinks.push_back(ImGui::GetCursorScreenPos() + ImVec2{ ImGui::GetFrameHeight() / 2, -ImGui::GetFrameHeight() / 2 - style.ItemInnerSpacing.y});
|
||||||
d.y = pos.y;
|
}, n.inputs_fed[in]);
|
||||||
}
|
|
||||||
|
|
||||||
ImGui::TableNextColumn();
|
ImGui::TableNextColumn();
|
||||||
ImGui::Text("%s", n.node->in_names[in].c_str());
|
ImGui::Text("%s", n.node->in_names[in].c_str());
|
||||||
|
@ -421,10 +422,10 @@ namespace K::UI {
|
||||||
}
|
}
|
||||||
|
|
||||||
void PlugboardDrawNode(PlugboardGraph::NodeInstance& n, ImVec2& view_pos, i32 id, ImGuiIO& io, ImGuiStyle& style,
|
void PlugboardDrawNode(PlugboardGraph::NodeInstance& n, ImVec2& view_pos, i32 id, ImGuiIO& io, ImGuiStyle& style,
|
||||||
bool& dragging_on_socket, ImVec2& source, std::unordered_map<PlugboardGraph::ConnectInfo, ImVec4, PlugboardGraph::_ConnectInfoHasher>& link_pos) {
|
bool& dragging_on_socket, ImVec2& source, std::unordered_map<PlugboardGraph::ConnectInfo, PlugboardGraph::LinksFromSource, PlugboardGraph::_ConnectInfoHasher>& link_pos) {
|
||||||
ImGui::SetCursorPos(view_pos + n.pos);
|
ImGui::SetCursorPos(view_pos + n.pos);
|
||||||
ImGui::PushID(id);
|
ImGui::PushID(id);
|
||||||
ImGui::PushStyleColor(ImGuiCol_ChildBg, 0xFF080813);
|
ImGui::PushStyleColor(ImGuiCol_ChildBg, 0xAA080813);
|
||||||
ImGui::BeginChild(n.node->name.c_str(), {}, ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_Border);
|
ImGui::BeginChild(n.node->name.c_str(), {}, ImGuiChildFlags_AlwaysAutoResize | ImGuiChildFlags_AutoResizeX | ImGuiChildFlags_AutoResizeY | ImGuiChildFlags_Border);
|
||||||
ImGui::PopStyleColor();
|
ImGui::PopStyleColor();
|
||||||
if (ImGui::BeginTable(n.node->name.c_str(), 3)) {
|
if (ImGui::BeginTable(n.node->name.c_str(), 3)) {
|
||||||
|
@ -498,8 +499,9 @@ namespace K::UI {
|
||||||
view_pos = old_view_pos + (io.MousePos - io.MouseClickedPos[0]);
|
view_pos = old_view_pos + (io.MousePos - io.MouseClickedPos[0]);
|
||||||
}
|
}
|
||||||
|
|
||||||
for (u32 i = 0; i < s.plugboard.nodes.size(); i++)
|
u32 i = 0;
|
||||||
PlugboardDrawNode(s.plugboard.nodes[i], view_pos, i, io, style, dragging_on_socket, drag_source, s.plugboard.links_pos);
|
for (auto it = s.plugboard.nodes.begin(); it != s.plugboard.nodes.end(); it++, i++)
|
||||||
|
PlugboardDrawNode(*it, view_pos, i, io, style, dragging_on_socket, drag_source, s.plugboard.links_pos);
|
||||||
|
|
||||||
ImGui::SetCursorPos({});
|
ImGui::SetCursorPos({});
|
||||||
ImGui::PushStyleColor(ImGuiCol_ChildBg, 0x33FFFFFF);
|
ImGui::PushStyleColor(ImGuiCol_ChildBg, 0x33FFFFFF);
|
||||||
|
@ -526,7 +528,8 @@ namespace K::UI {
|
||||||
right_offset += ImGui::GetItemRectMax().x - ImGui::GetWindowWidth();
|
right_offset += ImGui::GetItemRectMax().x - ImGui::GetWindowWidth();
|
||||||
|
|
||||||
for (auto& [_, link] : s.plugboard.links_pos)
|
for (auto& [_, link] : s.plugboard.links_pos)
|
||||||
window->DrawList->AddLine({link.x, link.y}, {link.w, link.z}, 0xFFFFFFFF, 2.0f);
|
for (auto& sink : link.sinks)
|
||||||
|
window->DrawList->AddLine(link.source, sink, 0xFFFFFFFF, 2.0f);
|
||||||
|
|
||||||
if (dragging_on_socket)
|
if (dragging_on_socket)
|
||||||
window->DrawList->AddLine(ImGui::GetMousePos(), drag_source, 0xFFFFFFFF, 2.0f);
|
window->DrawList->AddLine(ImGui::GetMousePos(), drag_source, 0xFFFFFFFF, 2.0f);
|
||||||
|
@ -585,7 +588,7 @@ namespace K::UI {
|
||||||
it->second.exposure = {&s.plugboard.out_instance, static_cast<u32>(s.plugboard.out_instance.node->in_names.size())};
|
it->second.exposure = {&s.plugboard.out_instance, static_cast<u32>(s.plugboard.out_instance.node->in_names.size())};
|
||||||
s.plugboard.out_instance.node->in_names.push_back(id);
|
s.plugboard.out_instance.node->in_names.push_back(id);
|
||||||
s.plugboard.out_instance.node->in_types.push_back(PlugboardGraph::Type(it->second.val.index())); // this is shaky and bug prone -- relies on the shader types being in line with plugboard types
|
s.plugboard.out_instance.node->in_types.push_back(PlugboardGraph::Type(it->second.val.index())); // this is shaky and bug prone -- relies on the shader types being in line with plugboard types
|
||||||
s.plugboard.out_instance.inputs_fed.push_back(ShaderValToPlugboard(it->second.val));
|
s.plugboard.out_instance.inputs_fed.emplace_back(ShaderValToPlugboard(it->second.val));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
it->second.exposure.p->disconnect(it->second.exposure.index);
|
it->second.exposure.p->disconnect(it->second.exposure.index);
|
||||||
|
@ -639,6 +642,14 @@ namespace K::UI {
|
||||||
|
|
||||||
void Interpolation(CompState& s) {
|
void Interpolation(CompState& s) {
|
||||||
if (ImGui::Begin("Interpolation", &draw_interpolation)) {
|
if (ImGui::Begin("Interpolation", &draw_interpolation)) {
|
||||||
|
|
||||||
|
}
|
||||||
|
ImGui::End();
|
||||||
|
}
|
||||||
|
|
||||||
|
void Properties(CompState& s) {
|
||||||
|
if (ImGui::Begin("Properties", &draw_properties)) {
|
||||||
|
|
||||||
}
|
}
|
||||||
ImGui::End();
|
ImGui::End();
|
||||||
}
|
}
|
||||||
|
@ -650,7 +661,7 @@ namespace K::UI {
|
||||||
|
|
||||||
ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(), ImGuiDockNodeFlags_PassthruCentralNode);
|
ImGui::DockSpaceOverViewport(ImGui::GetMainViewport(), ImGuiDockNodeFlags_PassthruCentralNode);
|
||||||
|
|
||||||
// ImGui::ShowDemoWindow();
|
ImGui::ShowDemoWindow();
|
||||||
static ImGuiStyle& style = ImGui::GetStyle();
|
static ImGuiStyle& style = ImGui::GetStyle();
|
||||||
style.GrabRounding = style.FrameRounding = 5.0f;
|
style.GrabRounding = style.FrameRounding = 5.0f;
|
||||||
MainMenuBar(s);
|
MainMenuBar(s);
|
||||||
|
@ -659,6 +670,7 @@ namespace K::UI {
|
||||||
if (draw_plugboard) Plugboard(s);
|
if (draw_plugboard) Plugboard(s);
|
||||||
if (draw_comp) Composition(s);
|
if (draw_comp) Composition(s);
|
||||||
if (draw_interpolation) Interpolation(s);
|
if (draw_interpolation) Interpolation(s);
|
||||||
|
if (draw_properties) Properties(s);
|
||||||
|
|
||||||
if (save_called && ready_frame == frame) {
|
if (save_called && ready_frame == frame) {
|
||||||
stbi_write_png("frame.png", s.width, s.height, 4, save_buffer, s.width * 4);
|
stbi_write_png("frame.png", s.width, s.height, 4, save_buffer, s.width * 4);
|
||||||
|
|
|
@ -1 +0,0 @@
|
||||||
Subproject commit 3e4ed6e5b51cc9a874480b94f112d5965b0412b0
|
|
|
@ -4,6 +4,7 @@
|
||||||
#include <variant>
|
#include <variant>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
#include <imgui.h>
|
#include <imgui.h>
|
||||||
|
#include <list>
|
||||||
|
|
||||||
namespace K::PlugboardGraph {
|
namespace K::PlugboardGraph {
|
||||||
enum Type {
|
enum Type {
|
||||||
|
@ -72,7 +73,8 @@ namespace K::PlugboardGraph {
|
||||||
struct NodeInstance;
|
struct NodeInstance;
|
||||||
|
|
||||||
struct ConnectInfo {
|
struct ConnectInfo {
|
||||||
NodeInstance *p; u32 index;
|
NodeInstance *p; // NOTE: so NodeInstances must be stored in a list, otherwise vector realloc leads to UAF
|
||||||
|
u32 index;
|
||||||
auto operator<=>(const ConnectInfo&) const = default;
|
auto operator<=>(const ConnectInfo&) const = default;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -85,9 +87,9 @@ namespace K::PlugboardGraph {
|
||||||
};
|
};
|
||||||
|
|
||||||
struct NodeInstance {
|
struct NodeInstance {
|
||||||
Node *node;
|
Node *node; // should be safe if we require those to be static, UAF might pop up later
|
||||||
|
|
||||||
Vector<std::variant<ConnectInfo, T_Map<Type::T_Count>::type>> inputs_fed;
|
Vector<std::variant<T_Map<Type::T_Count>::type, ConnectInfo>> inputs_fed;
|
||||||
Vector<ConnectInfo> outputs_going;
|
Vector<ConnectInfo> outputs_going;
|
||||||
|
|
||||||
ImVec2 pos, old_pos;
|
ImVec2 pos, old_pos;
|
||||||
|
@ -111,10 +113,10 @@ namespace K::PlugboardGraph {
|
||||||
|
|
||||||
|
|
||||||
inline NodeInstance MakeInstance(Node& n) {
|
inline NodeInstance MakeInstance(Node& n) {
|
||||||
Vector<std::variant<ConnectInfo, T_Map<Type::T_Count>::type>> inp;
|
Vector<std::variant<T_Map<Type::T_Count>::type, ConnectInfo>> inp;
|
||||||
Vector<ConnectInfo> out;
|
Vector<ConnectInfo> out;
|
||||||
for (auto t : n.in_types)
|
for (auto t : n.in_types)
|
||||||
inp.push_back(expand_type(t));
|
inp.emplace_back(expand_type(t));
|
||||||
for (auto t : n.out_types)
|
for (auto t : n.out_types)
|
||||||
out.push_back({});
|
out.push_back({});
|
||||||
return {
|
return {
|
||||||
|
@ -137,16 +139,21 @@ namespace K::PlugboardGraph {
|
||||||
return info.p->node->fetch[info.index](pack);
|
return info.p->node->fetch[info.index](pack);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct LinksFromSource {
|
||||||
|
ImVec2 source;
|
||||||
|
Vector<ImVec2> sinks;
|
||||||
|
};
|
||||||
|
|
||||||
struct PlugboardGraph {
|
struct PlugboardGraph {
|
||||||
Vector<NodeInstance> nodes;
|
std::list<NodeInstance> nodes; // OK complexity wise since we would usually traverse the entire thing anyway, locality will likely be bad
|
||||||
std::unordered_map<ConnectInfo, ImVec4, _ConnectInfoHasher> links_pos; // this is hilariously bad
|
std::unordered_map<ConnectInfo, LinksFromSource, _ConnectInfoHasher> links_pos; // this is hilariously bad
|
||||||
Node comp_in = {
|
Node comp_in = {
|
||||||
"Composition In",
|
"Composition In",
|
||||||
{},
|
{},
|
||||||
{},
|
{},
|
||||||
{"Time"},
|
{"Time"},
|
||||||
{T_Float},
|
{T_Float},
|
||||||
{[](Vector<T_Map<T_Count>::type> v) { return T_Map<T_Count>::type{ static_cast<f32>(SDL_GetTicks()) / 20.0f }; }} // kill me
|
{[](const Vector<T_Map<T_Count>::type>& v) { return T_Map<T_Count>::type{ static_cast<f32>(SDL_GetTicks()) / 20.0f }; }} // kill me
|
||||||
},
|
},
|
||||||
comp_out = {
|
comp_out = {
|
||||||
"Composition Out",
|
"Composition Out",
|
||||||
|
|
Loading…
Add table
Reference in a new issue