Compare commits
1 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 42cfbc80ee |
@@ -1,127 +0,0 @@
|
|||||||
#pragma once
|
|
||||||
|
|
||||||
#include <td/display/DisplayState.h>
|
|
||||||
|
|
||||||
#include <imgui_node_editor.h>
|
|
||||||
|
|
||||||
namespace ed = ax::NodeEditor;
|
|
||||||
|
|
||||||
namespace td {
|
|
||||||
|
|
||||||
class NodeEditorState : public DisplayState {
|
|
||||||
public:
|
|
||||||
enum class PinType {
|
|
||||||
Flow,
|
|
||||||
Bool,
|
|
||||||
Int,
|
|
||||||
Float,
|
|
||||||
String,
|
|
||||||
Object,
|
|
||||||
Function,
|
|
||||||
Delegate,
|
|
||||||
};
|
|
||||||
|
|
||||||
enum class PinKind { Output, Input };
|
|
||||||
|
|
||||||
enum class NodeType { Blueprint, Simple, Tree, Comment, Houdini };
|
|
||||||
|
|
||||||
struct Pin;
|
|
||||||
|
|
||||||
struct Node {
|
|
||||||
ed::NodeId ID;
|
|
||||||
std::string Name;
|
|
||||||
std::vector<Pin> Inputs;
|
|
||||||
std::vector<Pin> Outputs;
|
|
||||||
ImColor Color;
|
|
||||||
NodeType Type;
|
|
||||||
ImVec2 Size;
|
|
||||||
|
|
||||||
std::string State;
|
|
||||||
std::string SavedState;
|
|
||||||
|
|
||||||
Node(int id, const char* name, ImColor color = ImColor(255, 255, 255)) :
|
|
||||||
ID(id), Name(name), Color(color), Type(NodeType::Blueprint), Size(0, 0) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Pin {
|
|
||||||
ed::PinId ID;
|
|
||||||
::td::NodeEditorState::Node* Node;
|
|
||||||
std::string Name;
|
|
||||||
PinType Type;
|
|
||||||
PinKind Kind;
|
|
||||||
|
|
||||||
Pin(int id, const char* name, PinType type) : ID(id), Node(nullptr), Name(name), Type(type), Kind(PinKind::Input) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct Link {
|
|
||||||
ed::LinkId ID;
|
|
||||||
|
|
||||||
ed::PinId StartPinID;
|
|
||||||
ed::PinId EndPinID;
|
|
||||||
|
|
||||||
ImColor Color;
|
|
||||||
|
|
||||||
Link(ed::LinkId id, ed::PinId startPinId, ed::PinId endPinId) :
|
|
||||||
ID(id), StartPinID(startPinId), EndPinID(endPinId), Color(255, 255, 255) {}
|
|
||||||
};
|
|
||||||
|
|
||||||
struct NodeIdLess {
|
|
||||||
bool operator()(const ed::NodeId& lhs, const ed::NodeId& rhs) const {
|
|
||||||
return lhs.AsPointer() < rhs.AsPointer();
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
int m_NextId = 1;
|
|
||||||
const int m_PinIconSize = 24;
|
|
||||||
std::vector<Node> m_Nodes;
|
|
||||||
std::vector<Link> m_Links;
|
|
||||||
ImTextureID m_HeaderBackground = 0;
|
|
||||||
ImTextureID m_SaveIcon = 0;
|
|
||||||
ImTextureID m_RestoreIcon = 0;
|
|
||||||
const float m_TouchTime = 1.0f;
|
|
||||||
std::map<ed::NodeId, float, NodeIdLess> m_NodeTouchTime;
|
|
||||||
bool m_ShowOrdinals = false;
|
|
||||||
|
|
||||||
|
|
||||||
public:
|
|
||||||
NodeEditorState(Display& a_Display);
|
|
||||||
~NodeEditorState();
|
|
||||||
|
|
||||||
virtual void Update(float a_Delta) override;
|
|
||||||
|
|
||||||
private:
|
|
||||||
int GetNextId();
|
|
||||||
ed::LinkId GetNextLinkId();
|
|
||||||
void TouchNode(ed::NodeId id);
|
|
||||||
float GetTouchProgress(ed::NodeId id);
|
|
||||||
void UpdateTouch();
|
|
||||||
Node* FindNode(ed::NodeId id);
|
|
||||||
Link* FindLink(ed::LinkId id);
|
|
||||||
Pin* FindPin(ed::PinId id);
|
|
||||||
bool IsPinLinked(ed::PinId id);
|
|
||||||
bool CanCreateLink(Pin* a, Pin* b);
|
|
||||||
void BuildNode(Node* node);
|
|
||||||
Node* SpawnInputActionNode();
|
|
||||||
Node* SpawnBranchNode();
|
|
||||||
Node* SpawnDoNNode();
|
|
||||||
Node* SpawnOutputActionNode();
|
|
||||||
Node* SpawnPrintStringNode();
|
|
||||||
Node* SpawnMessageNode();
|
|
||||||
Node* SpawnSetTimerNode();
|
|
||||||
Node* SpawnLessNode();
|
|
||||||
Node* SpawnWeirdNode();
|
|
||||||
Node* SpawnTraceByChannelNode();
|
|
||||||
Node* SpawnTreeSequenceNode();
|
|
||||||
Node* SpawnTreeTaskNode();
|
|
||||||
Node* SpawnTreeTask2Node();
|
|
||||||
Node* SpawnComment();
|
|
||||||
Node* SpawnHoudiniTransformNode();
|
|
||||||
Node* SpawnHoudiniGroupNode();
|
|
||||||
void BuildNodes();
|
|
||||||
ImColor GetIconColor(PinType type);
|
|
||||||
void DrawPinIcon(const Pin& pin, bool connected, int alpha);
|
|
||||||
void ShowStyleEditor(bool* show = nullptr);
|
|
||||||
void ShowLeftPane(float paneWidth);
|
|
||||||
};
|
|
||||||
|
|
||||||
} // namespace td
|
|
||||||
@@ -1,6 +0,0 @@
|
|||||||
|
|
||||||
target("imgui-node-editor")
|
|
||||||
set_kind("static")
|
|
||||||
add_files("imgui-node-editor/**.cpp")
|
|
||||||
add_includedirs("imgui-node-editor", {public = true})
|
|
||||||
add_packages("imgui")
|
|
||||||
70
src/main.cpp
70
src/main.cpp
@@ -1,18 +1,68 @@
|
|||||||
#include <chrono>
|
// #include <chrono>
|
||||||
#include <td/display/state/NodeEditorState.h>
|
// #include <td/display/state/MainMenuState.h>
|
||||||
#include <td/misc/Time.h>
|
// #include <td/misc/Time.h>
|
||||||
|
|
||||||
|
#define SOL_ALL_SAFETIES_ON 1
|
||||||
|
#include <sol/sol.hpp>
|
||||||
|
|
||||||
|
void some_function() {
|
||||||
|
std::cout << "some function!" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
void some_other_function() {
|
||||||
|
std::cout << "some other function!" << std::endl;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct some_class {
|
||||||
|
int variable = 30;
|
||||||
|
|
||||||
|
double member_function() {
|
||||||
|
return 24.5;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
int main(int argc, char** argv) {
|
int main(int argc, char** argv) {
|
||||||
// init GL context
|
// init GL context
|
||||||
td::Display display(1920, 1080, "Tower-Defense 2");
|
// td::Display display(1920, 1080, "Tower-Defense 2");
|
||||||
|
|
||||||
display.ChangeState<td::NodeEditorState>();
|
// display.ChangeState<td::MainMenuState>();
|
||||||
|
|
||||||
td::Timer timer;
|
// td::Timer timer;
|
||||||
while (!display.IsCloseRequested()) {
|
// while (!display.IsCloseRequested()) {
|
||||||
display.PollEvents();
|
// display.PollEvents();
|
||||||
display.Update(timer.GetDelta());
|
// display.Update(timer.GetDelta());
|
||||||
}
|
// }
|
||||||
|
|
||||||
|
std::cout << "=== functions (all) ===" << std::endl;
|
||||||
|
|
||||||
|
sol::state lua;
|
||||||
|
lua.open_libraries(sol::lib::base);
|
||||||
|
|
||||||
|
// put an instance of "some_class" into lua
|
||||||
|
// (we'll go into more detail about this later
|
||||||
|
// just know here that it works and is
|
||||||
|
// put into lua as a userdata
|
||||||
|
lua.set("sc", some_class());
|
||||||
|
|
||||||
|
// binds a plain function
|
||||||
|
lua["f1"] = some_function;
|
||||||
|
lua.set_function("f2", &some_other_function);
|
||||||
|
|
||||||
|
// binds just the member function
|
||||||
|
lua["m1"] = &some_class::member_function;
|
||||||
|
|
||||||
|
// binds the class to the type
|
||||||
|
lua.set_function("m2", &some_class::member_function, some_class{});
|
||||||
|
|
||||||
|
// binds just the member variable as a function
|
||||||
|
lua["v1"] = &some_class::variable;
|
||||||
|
|
||||||
|
// binds class with member variable as function
|
||||||
|
lua.set_function("v2", &some_class::variable, some_class{});
|
||||||
|
|
||||||
|
lua.script_file("test/main.lua");
|
||||||
|
|
||||||
|
std::cout << std::endl;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
24
test/main.lua
Normal file
24
test/main.lua
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
f1() -- some function!
|
||||||
|
f2() -- some other function!
|
||||||
|
|
||||||
|
-- need class instance if you don't bind it with the function
|
||||||
|
print(m1(sc)) -- 24.5
|
||||||
|
-- does not need class instance: was bound to lua with one
|
||||||
|
print(m2()) -- 24.5
|
||||||
|
|
||||||
|
-- need class instance if you
|
||||||
|
-- don't bind it with the function
|
||||||
|
print(v1(sc)) -- 30
|
||||||
|
-- does not need class instance:
|
||||||
|
-- it was bound with one
|
||||||
|
print(v2()) -- 30
|
||||||
|
|
||||||
|
-- can set, still
|
||||||
|
-- requires instance
|
||||||
|
v1(sc, 212)
|
||||||
|
-- can set, does not need
|
||||||
|
-- class instance: was bound with one
|
||||||
|
v2(254)
|
||||||
|
|
||||||
|
print(v1(sc)) -- 212
|
||||||
|
print(v2()) -- 254
|
||||||
@@ -2,7 +2,8 @@ add_rules("mode.debug", "mode.release")
|
|||||||
|
|
||||||
add_repositories("persson-repo https://git.ale-pri.com/Persson-dev/xmake-repo.git")
|
add_repositories("persson-repo https://git.ale-pri.com/Persson-dev/xmake-repo.git")
|
||||||
|
|
||||||
add_requires("imgui[sdl3,opengl3] 1.92.1", "splib 2.3.2", "zlib", "glew", "fpm", "enet6")
|
add_requires("imgui 1.92.0", {configs = {sdl3 = true, opengl3 = true}})
|
||||||
|
add_requires("libsdl3 3.2.16", "splib 2.3.2", "zlib", "glew", "fpm", "enet6", "sol2")
|
||||||
|
|
||||||
set_languages("c++20")
|
set_languages("c++20")
|
||||||
|
|
||||||
@@ -16,16 +17,13 @@ else
|
|||||||
set_policy("build.sanitizer.undefined", true)
|
set_policy("build.sanitizer.undefined", true)
|
||||||
end
|
end
|
||||||
|
|
||||||
includes("lib/*.lua")
|
|
||||||
|
|
||||||
target("Tower-Defense2")
|
target("Tower-Defense2")
|
||||||
add_includedirs("include", {public = true})
|
add_includedirs("include", {public = true})
|
||||||
set_kind("binary")
|
set_kind("binary")
|
||||||
add_files("src/**.cpp")
|
add_files("src/**.cpp")
|
||||||
add_packages("libsdl3", "imgui", "glew", "splib", "zlib", "fpm", "enet6", {public = true})
|
add_packages("libsdl3", "imgui", "glew", "splib", "zlib", "fpm", "enet6", "sol2", {public = true})
|
||||||
set_rundir(".")
|
set_rundir(".")
|
||||||
add_defines("TD_GL_LOADER_GLEW")
|
add_defines("TD_GL_LOADER_GLEW")
|
||||||
add_deps("imgui-node-editor")
|
|
||||||
|
|
||||||
|
|
||||||
-- Tests
|
-- Tests
|
||||||
|
|||||||
Reference in New Issue
Block a user