From f0af6114f4d49615a049fbd20453ed76c5ebd34c Mon Sep 17 00:00:00 2001 From: parker Date: Tue, 22 Jul 2025 02:27:09 +0100 Subject: [PATCH 01/11] feat(parameter): add float parm --- CMakeLists.txt | 2 ++ src/Gui/Parameters/AbstractFormParm.cpp | 23 +++++++++++++++++++++ src/Gui/Parameters/AbstractFormParm.h | 18 ++++++++++++++++ src/Gui/Parameters/AbstractSliderParm.cpp | 2 +- src/Gui/Parameters/FloatParm.cpp | 3 +++ src/Gui/Parameters/FloatParm.h | 13 ++++++++++++ src/Gui/ParametersPanel/ParametersPanel.cpp | 16 ++++++++++---- 7 files changed, 72 insertions(+), 5 deletions(-) create mode 100644 src/Gui/Parameters/AbstractFormParm.cpp create mode 100644 src/Gui/Parameters/AbstractFormParm.h create mode 100644 src/Gui/Parameters/FloatParm.cpp create mode 100644 src/Gui/Parameters/FloatParm.h diff --git a/CMakeLists.txt b/CMakeLists.txt index d86c9ac..651f9d9 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -45,6 +45,8 @@ set(GUI_SOURCES src/Gui/Network/TabMenu.cpp src/Gui/ParametersPanel/ParametersPanel.cpp src/Gui/Parameters/AbstractSliderParm.cpp + src/Gui/Parameters/AbstractFormParm.cpp + src/Gui/Parameters/FloatParm.cpp ) # qt diff --git a/src/Gui/Parameters/AbstractFormParm.cpp b/src/Gui/Parameters/AbstractFormParm.cpp new file mode 100644 index 0000000..e5725df --- /dev/null +++ b/src/Gui/Parameters/AbstractFormParm.cpp @@ -0,0 +1,23 @@ +#include "Gui/Parameters/AbstractFormParm.h" +#include "Gui/Parameters/AbstractSliderParm.h" +#include +#include + + +enzo::ui::AbstractFormParm::AbstractFormParm() +{ + auto label = new QLabel("Parm name:"); + label->setStyleSheet("QLabel{background: none}"); + label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + + mainLayout_ = new QHBoxLayout(); + mainLayout_->addWidget(label); + mainLayout_->addWidget(new AbstractSliderParm()); + mainLayout_->setContentsMargins(0,0,0,0); + + setFixedHeight(24); + setProperty("class", "Parameter"); + setStyleSheet(".Parameter { background-color: none;}"); + setLayout(mainLayout_); +} + diff --git a/src/Gui/Parameters/AbstractFormParm.h b/src/Gui/Parameters/AbstractFormParm.h new file mode 100644 index 0000000..82d2243 --- /dev/null +++ b/src/Gui/Parameters/AbstractFormParm.h @@ -0,0 +1,18 @@ +#include +#include + +namespace enzo::ui +{ + +class AbstractFormParm +: public QWidget +{ +public: + AbstractFormParm(); + +private: + QHBoxLayout* mainLayout_; + +}; + +} diff --git a/src/Gui/Parameters/AbstractSliderParm.cpp b/src/Gui/Parameters/AbstractSliderParm.cpp index eb777a3..3516d9c 100644 --- a/src/Gui/Parameters/AbstractSliderParm.cpp +++ b/src/Gui/Parameters/AbstractSliderParm.cpp @@ -21,7 +21,7 @@ enzo::ui::AbstractSliderParm::AbstractSliderParm(QWidget *parent, Qt::WindowFlag valueLabel_ = new QLabel(); valueLabel_->setAlignment(Qt::AlignCenter); - valueLabel_->setStyleSheet("background-color: transparent;"); + valueLabel_->setStyleSheet("background-color: none;"); setProperty("type", "SliderParm"); setStyleSheet(R"( QWidget[type="SliderParm"] diff --git a/src/Gui/Parameters/FloatParm.cpp b/src/Gui/Parameters/FloatParm.cpp new file mode 100644 index 0000000..476c7fa --- /dev/null +++ b/src/Gui/Parameters/FloatParm.cpp @@ -0,0 +1,3 @@ +#include "Gui/Parameters/FloatParm.h" + + diff --git a/src/Gui/Parameters/FloatParm.h b/src/Gui/Parameters/FloatParm.h new file mode 100644 index 0000000..64e513f --- /dev/null +++ b/src/Gui/Parameters/FloatParm.h @@ -0,0 +1,13 @@ +#include "Gui/Parameters/AbstractSliderParm.h" + +namespace enzo::ui +{ + +class FloatParm +: public AbstractSliderParm +{ + using AbstractSliderParm = AbstractSliderParm; + +}; + +} diff --git a/src/Gui/ParametersPanel/ParametersPanel.cpp b/src/Gui/ParametersPanel/ParametersPanel.cpp index 6ac2323..9002dc2 100644 --- a/src/Gui/ParametersPanel/ParametersPanel.cpp +++ b/src/Gui/ParametersPanel/ParametersPanel.cpp @@ -1,7 +1,10 @@ #include "Gui/ParametersPanel/ParametersPanel.h" #include "Gui/Parameters/AbstractSliderParm.h" +#include "Gui/Parameters/AbstractFormParm.h" +#include "Gui/Parameters/FloatParm.h" #include #include +#include #include #include @@ -10,6 +13,7 @@ ParametersPanel::ParametersPanel(QWidget *parent, Qt::WindowFlags f) { mainLayout_ = new QVBoxLayout(); parametersLayout_ = new QVBoxLayout(); + parametersLayout_->setAlignment(Qt::AlignTop); bgWidget_ = new QWidget(); bgWidget_->setLayout(parametersLayout_); @@ -25,10 +29,14 @@ ParametersPanel::ParametersPanel(QWidget *parent, Qt::WindowFlags f) mainLayout_->addLayout(parametersLayout_); mainLayout_->addWidget(bgWidget_); - parametersLayout_->addWidget(new enzo::ui::AbstractSliderParm()); - parametersLayout_->addWidget(new enzo::ui::AbstractSliderParm()); - parametersLayout_->addWidget(new enzo::ui::AbstractSliderParm()); - parametersLayout_->addWidget(new enzo::ui::AbstractSliderParm()); + // parametersLayout_->addWidget(new enzo::ui::AbstractSliderParm()); + // parametersLayout_->addWidget(new enzo::ui::AbstractSliderParm()); + // parametersLayout_->addWidget(new enzo::ui::FloatParm()); + // parametersLayout_->addWidget(new enzo::ui::FloatParm()); + parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); + parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); + parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); + parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); setLayout(mainLayout_); From 8ad6ecc299309e24a903ee9cdbea3a78018b4005 Mon Sep 17 00:00:00 2001 From: parker Date: Tue, 22 Jul 2025 18:45:00 +0100 Subject: [PATCH 02/11] feat(parms): add template and type --- CMakeLists.txt | 1 + src/Engine/Parameter/Template.cpp | 7 +++++++ src/Engine/Parameter/Template.h | 13 +++++++++++++ src/Engine/Parameter/Type.cpp | 0 src/Engine/Parameter/Type.h | 11 +++++++++++ 5 files changed, 32 insertions(+) create mode 100644 src/Engine/Parameter/Template.cpp create mode 100644 src/Engine/Parameter/Template.h create mode 100644 src/Engine/Parameter/Type.cpp create mode 100644 src/Engine/Parameter/Type.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 651f9d9..cafc9f6 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -20,6 +20,7 @@ set(ENGINE_SOURCES src/Engine/Operator/GeometryOpDef.cpp src/Engine/Operator/OperatorTable.cpp src/Engine/Operator/Context.cpp + src/Engine/Parameter/Template.cpp src/Engine/Network/NetworkManager.cpp ) diff --git a/src/Engine/Parameter/Template.cpp b/src/Engine/Parameter/Template.cpp new file mode 100644 index 0000000..7e54063 --- /dev/null +++ b/src/Engine/Parameter/Template.cpp @@ -0,0 +1,7 @@ +#include "Engine/Parameter/Template.h" + +enzo::prm::Template::Template() +{ + + +} diff --git a/src/Engine/Parameter/Template.h b/src/Engine/Parameter/Template.h new file mode 100644 index 0000000..4d855cb --- /dev/null +++ b/src/Engine/Parameter/Template.h @@ -0,0 +1,13 @@ +#pragma once + +namespace enzo::prm +{ + +class Template +{ + Template(); + +}; + +} + diff --git a/src/Engine/Parameter/Type.cpp b/src/Engine/Parameter/Type.cpp new file mode 100644 index 0000000..e69de29 diff --git a/src/Engine/Parameter/Type.h b/src/Engine/Parameter/Type.h new file mode 100644 index 0000000..6c34617 --- /dev/null +++ b/src/Engine/Parameter/Type.h @@ -0,0 +1,11 @@ +#pragma once + +namespace enzo::prm + +{ +class Type +{ + +}; + +} From c5f2dec0085ed315df2f76c4af9c0172fe6afec8 Mon Sep 17 00:00:00 2001 From: parker Date: Tue, 22 Jul 2025 21:18:06 +0100 Subject: [PATCH 03/11] feat: register parameter list --- src/Engine/Operator/OperatorTable.cpp | 2 +- src/Engine/Operator/OperatorTable.h | 5 +++-- src/Engine/Parameter/FloatType.cpp | 1 + src/Engine/Parameter/FloatType.h | 12 ++++++++++++ src/Engine/Parameter/Template.cpp | 5 +++-- src/Engine/Parameter/Template.h | 6 +++++- src/Engine/Parameter/Type.cpp | 0 src/Engine/Parameter/Type.h | 16 ++++++++++++++-- src/OpDefs/CMakeLists.txt | 1 + src/OpDefs/GopHouse.cpp | 1 + src/OpDefs/GopHouse.h | 3 +++ src/OpDefs/GopTransform.cpp | 2 ++ src/OpDefs/GopTransform.hpp | 3 +++ src/OpDefs/RegisterPlugin.cpp | 6 ++++-- 14 files changed, 53 insertions(+), 10 deletions(-) create mode 100644 src/Engine/Parameter/FloatType.cpp create mode 100644 src/Engine/Parameter/FloatType.h delete mode 100644 src/Engine/Parameter/Type.cpp diff --git a/src/Engine/Operator/OperatorTable.cpp b/src/Engine/Operator/OperatorTable.cpp index 999b952..d4f8d8e 100644 --- a/src/Engine/Operator/OperatorTable.cpp +++ b/src/Engine/Operator/OperatorTable.cpp @@ -3,7 +3,7 @@ #include -void enzo::op::OperatorTable::addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc) +void enzo::op::OperatorTable::addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template templateList[]) { std::cout << "OPERATOR TABLE ADDED\n"; std::cout << "adding operator: " << displayName << "\n"; diff --git a/src/Engine/Operator/OperatorTable.h b/src/Engine/Operator/OperatorTable.h index 106196a..b8f0cf2 100644 --- a/src/Engine/Operator/OperatorTable.h +++ b/src/Engine/Operator/OperatorTable.h @@ -3,6 +3,7 @@ #include #include "Engine/Network/NetworkManager.h" #include "Engine/Operator/GeometryOpDef.h" +#include "Engine/Parameter/Template.h" namespace enzo::op @@ -17,7 +18,7 @@ struct OpInfo class BOOST_SYMBOL_EXPORT OperatorTable { public: - static void addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc); + static void addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template templateList[]); static nt::opConstructor getOpConstructor(std::string name); static std::vector getData(); // TODO: move to better spot (maybe engine class) @@ -25,6 +26,6 @@ public: private: static std::vector opInfoStore_; }; -using addOperatorPtr = void (*)(const char* internalName, const char* displayName, nt::opConstructor ctorFunc); +using addOperatorPtr = void (*)(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template templateList[]); } diff --git a/src/Engine/Parameter/FloatType.cpp b/src/Engine/Parameter/FloatType.cpp new file mode 100644 index 0000000..ba07bee --- /dev/null +++ b/src/Engine/Parameter/FloatType.cpp @@ -0,0 +1 @@ +#include "Engine/Parameter/FloatType.h" diff --git a/src/Engine/Parameter/FloatType.h b/src/Engine/Parameter/FloatType.h new file mode 100644 index 0000000..da6c7d8 --- /dev/null +++ b/src/Engine/Parameter/FloatType.h @@ -0,0 +1,12 @@ +#pragma once +#include "Engine/Parameter/Type.h" + +// namespace enzo::prm +// { +// class FloatType +// : public Type +// { +// public: + +// }; +// } diff --git a/src/Engine/Parameter/Template.cpp b/src/Engine/Parameter/Template.cpp index 7e54063..08256be 100644 --- a/src/Engine/Parameter/Template.cpp +++ b/src/Engine/Parameter/Template.cpp @@ -1,7 +1,8 @@ #include "Engine/Parameter/Template.h" +#include "Engine/Parameter/Type.h" -enzo::prm::Template::Template() +enzo::prm::Template::Template(enzo::prm::Type type) +: type_{type} { - } diff --git a/src/Engine/Parameter/Template.h b/src/Engine/Parameter/Template.h index 4d855cb..a260836 100644 --- a/src/Engine/Parameter/Template.h +++ b/src/Engine/Parameter/Template.h @@ -1,11 +1,15 @@ #pragma once +#include "Engine/Parameter/Type.h" namespace enzo::prm { class Template { - Template(); +public: + Template(enzo::prm::Type type); +private: + enzo::prm::Type type_; }; diff --git a/src/Engine/Parameter/Type.cpp b/src/Engine/Parameter/Type.cpp deleted file mode 100644 index e69de29..0000000 diff --git a/src/Engine/Parameter/Type.h b/src/Engine/Parameter/Type.h index 6c34617..3c858fb 100644 --- a/src/Engine/Parameter/Type.h +++ b/src/Engine/Parameter/Type.h @@ -2,10 +2,22 @@ namespace enzo::prm -{ -class Type { +enum class Type +{ + STRING, + FLOAT, + INT, }; + +// class Type +// { + +// }; + +// const extern prm::Type FlOAT_TYPE; +// const extern prm::Type STRING_TYPE; + } diff --git a/src/OpDefs/CMakeLists.txt b/src/OpDefs/CMakeLists.txt index 0939367..f58e6db 100644 --- a/src/OpDefs/CMakeLists.txt +++ b/src/OpDefs/CMakeLists.txt @@ -17,6 +17,7 @@ add_library(${libName} SHARED ../Engine/Operator/Geometry.cpp ../Engine/Operator/Attribute.cpp ../Engine/Network/NetworkManager.cpp + ../Engine/Parameter/Template.cpp GopTransform.cpp GopHouse.cpp ) diff --git a/src/OpDefs/GopHouse.cpp b/src/OpDefs/GopHouse.cpp index 8be2bda..89eace7 100644 --- a/src/OpDefs/GopHouse.cpp +++ b/src/OpDefs/GopHouse.cpp @@ -79,3 +79,4 @@ void GOP_house::cookOp(enzo::op::Context context) // } } +enzo::prm::Template GOP_house::parameterList[] = {}; diff --git a/src/OpDefs/GopHouse.h b/src/OpDefs/GopHouse.h index e749dbd..0bfd6bd 100644 --- a/src/OpDefs/GopHouse.h +++ b/src/OpDefs/GopHouse.h @@ -1,5 +1,6 @@ #pragma once #include "Engine/Operator/GeometryOpDef.h" +#include "Engine/Parameter/Template.h" class GOP_house : public enzo::nt::GeometryOpDef @@ -12,4 +13,6 @@ public: return new GOP_house(opId); } + static BOOST_SYMBOL_EXPORT enzo::prm::Template parameterList[]; + }; diff --git a/src/OpDefs/GopTransform.cpp b/src/OpDefs/GopTransform.cpp index 0674b44..c487803 100644 --- a/src/OpDefs/GopTransform.cpp +++ b/src/OpDefs/GopTransform.cpp @@ -38,3 +38,5 @@ void GopTransform::cookOp(enzo::op::Context context) } +enzo::prm::Template GopTransform::parameterList[] = {}; + diff --git a/src/OpDefs/GopTransform.hpp b/src/OpDefs/GopTransform.hpp index 168adfd..70056ff 100644 --- a/src/OpDefs/GopTransform.hpp +++ b/src/OpDefs/GopTransform.hpp @@ -1,5 +1,6 @@ #pragma once #include "Engine/Operator/GeometryOpDef.h" +#include "Engine/Parameter/Template.h" class GopTransform : public enzo::nt::GeometryOpDef @@ -12,4 +13,6 @@ public: return new GopTransform(opId); } + static BOOST_SYMBOL_EXPORT enzo::prm::Template parameterList[]; + }; diff --git a/src/OpDefs/RegisterPlugin.cpp b/src/OpDefs/RegisterPlugin.cpp index 1362c30..71324e9 100644 --- a/src/OpDefs/RegisterPlugin.cpp +++ b/src/OpDefs/RegisterPlugin.cpp @@ -11,12 +11,14 @@ extern "C" addOperator( "transform", "Transform", - &GopTransform::ctor + &GopTransform::ctor, + GopTransform::parameterList ); addOperator( "house", "House", - &GOP_house::ctor + &GOP_house::ctor, + GopTransform::parameterList ); } From b2afebd8833499a8215c8b86184db11c7e9267c1 Mon Sep 17 00:00:00 2001 From: parker Date: Wed, 23 Jul 2025 14:06:57 +0100 Subject: [PATCH 04/11] feat: pass node info with template --- CMakeLists.txt | 56 ++++++++++++------------ src/Engine/Network/NetworkManager.cpp | 5 ++- src/Engine/Network/NetworkManager.h | 2 +- src/Engine/Operator/GeometryOperator.cpp | 4 +- src/Engine/Operator/GeometryOperator.h | 3 +- src/Engine/Operator/OpInfo.h | 15 +++++++ src/Engine/Operator/OperatorTable.cpp | 23 +++++++++- src/Engine/Operator/OperatorTable.h | 12 ++--- src/Engine/Parameter/FloatParm.cpp | 7 +++ src/Engine/Parameter/FloatParm.h | 18 ++++++++ src/Engine/Parameter/Template.cpp | 4 +- src/Engine/Parameter/Template.h | 4 +- src/Gui/Network/Network.cpp | 42 ++++++++++-------- src/Gui/Network/Network.h | 2 +- src/Gui/Network/TabMenu.cpp | 16 ++++++- src/Gui/Network/TabMenu.h | 3 +- src/OpDefs/GopTransform.cpp | 5 ++- 17 files changed, 151 insertions(+), 70 deletions(-) create mode 100644 src/Engine/Operator/OpInfo.h create mode 100644 src/Engine/Parameter/FloatParm.cpp create mode 100644 src/Engine/Parameter/FloatParm.h diff --git a/CMakeLists.txt b/CMakeLists.txt index cafc9f6..616317b 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,37 +76,37 @@ target_link_libraries(${AppExec} PRIVATE Qt6::Core Qt6::Widgets Qt6::SvgWidgets target_include_directories(${AppExec} PUBLIC src) # tests -Include(FetchContent) +# Include(FetchContent) -FetchContent_Declare( - Catch2 - GIT_REPOSITORY https://github.com/catchorg/Catch2.git - GIT_TAG v3.8.1 # or a later release -) +# FetchContent_Declare( +# Catch2 +# GIT_REPOSITORY https://github.com/catchorg/Catch2.git +# GIT_TAG v3.8.1 # or a later release +# ) -FetchContent_MakeAvailable(Catch2) +# FetchContent_MakeAvailable(Catch2) -add_executable(${TestExec} - ${ENGINE_SOURCES} - tests/main-tests.cpp - tests/OperatorTests.cpp - tests/NetworkTests.cpp -) -target_link_libraries(${TestExec} PRIVATE Catch2::Catch2WithMain Eigen3::Eigen Qt6::Core TBB::tbb Boost::filesystem Boost::system) -target_compile_definitions(${TestExec} PRIVATE UNIT_TEST) -target_include_directories(${TestExec} PUBLIC - src - ${BOOST_INCLUDE_DIRS} -) +# add_executable(${TestExec} +# ${ENGINE_SOURCES} +# tests/main-tests.cpp +# tests/OperatorTests.cpp +# tests/NetworkTests.cpp +# ) +# target_link_libraries(${TestExec} PRIVATE Catch2::Catch2WithMain Eigen3::Eigen Qt6::Core TBB::tbb Boost::filesystem Boost::system) +# target_compile_definitions(${TestExec} PRIVATE UNIT_TEST) +# target_include_directories(${TestExec} PUBLIC +# src +# ${BOOST_INCLUDE_DIRS} +# ) -# benchmarks -add_executable(${BenchExec} - ${ENGINE_SOURCES} +# # benchmarks +# add_executable(${BenchExec} +# ${ENGINE_SOURCES} - tests/Benchmarks.cpp -) -target_link_libraries(${BenchExec} PRIVATE Catch2::Catch2WithMain Eigen3::Eigen Qt6::Core TBB::tbb Boost::filesystem Boost::system) -target_compile_definitions(${BenchExec} PRIVATE UNIT_TEST) -target_include_directories(${BenchExec} PUBLIC src) +# tests/Benchmarks.cpp +# ) +# target_link_libraries(${BenchExec} PRIVATE Catch2::Catch2WithMain Eigen3::Eigen Qt6::Core TBB::tbb Boost::filesystem Boost::system) +# target_compile_definitions(${BenchExec} PRIVATE UNIT_TEST) +# target_include_directories(${BenchExec} PUBLIC src) -add_subdirectory(src/OpDefs) +# add_subdirectory(src/OpDefs) diff --git a/src/Engine/Network/NetworkManager.cpp b/src/Engine/Network/NetworkManager.cpp index 058127d..1768f22 100644 --- a/src/Engine/Network/NetworkManager.cpp +++ b/src/Engine/Network/NetworkManager.cpp @@ -3,6 +3,7 @@ #include "Engine/Operator/GeometryOperator.h" #include "Engine/Operator/Attribute.h" #include "Engine/Operator/AttributeHandle.h" +#include "Engine/Operator/OpInfo.h" #include "Engine/Types.h" #include #include @@ -10,11 +11,11 @@ #include #include -enzo::nt::OpId enzo::nt::NetworkManager::addOperator(nt::opConstructor ctorFunc) +enzo::nt::OpId enzo::nt::NetworkManager::addOperator(op::OpInfo opInfo) { maxOpId_++; - gopStore_.emplace(maxOpId_, std::make_unique(maxOpId_, ctorFunc)); + gopStore_.emplace(maxOpId_, std::make_unique(maxOpId_, opInfo)); std::cout << "adding operator " << maxOpId_ << "\n"; return maxOpId_; diff --git a/src/Engine/Network/NetworkManager.h b/src/Engine/Network/NetworkManager.h index 309743b..5ea01b1 100644 --- a/src/Engine/Network/NetworkManager.h +++ b/src/Engine/Network/NetworkManager.h @@ -18,7 +18,7 @@ public: static NetworkManager& getInstance(); // functions - OpId addOperator(nt::opConstructor ctorFunc); + OpId addOperator(op::OpInfo opInfo); std::optional getDisplayOp(); bool isValidOp(nt::OpId opId); GeometryOperator& getGeoOperator(nt::OpId opId); diff --git a/src/Engine/Operator/GeometryOperator.cpp b/src/Engine/Operator/GeometryOperator.cpp index ad74635..ce0c313 100644 --- a/src/Engine/Operator/GeometryOperator.cpp +++ b/src/Engine/Operator/GeometryOperator.cpp @@ -23,8 +23,8 @@ void enzo::nt::connectOperators(enzo::nt::OpId inputOpId, unsigned int inputInde outputOp.addInputConnection(newConnection); } -nt::GeometryOperator::GeometryOperator(enzo::nt::OpId opId, nt::opConstructor ctorFunc) -: opId_{opId}, opDef_(ctorFunc(opId)) +nt::GeometryOperator::GeometryOperator(enzo::nt::OpId opId, op::OpInfo opinfo) +: opId_{opId}, opDef_(opinfo.ctorFunc(opId)) { // TODO: drive by geometry definition maxInputs_=4; diff --git a/src/Engine/Operator/GeometryOperator.h b/src/Engine/Operator/GeometryOperator.h index d5457d3..a5878cb 100644 --- a/src/Engine/Operator/GeometryOperator.h +++ b/src/Engine/Operator/GeometryOperator.h @@ -1,5 +1,6 @@ #pragma once #include "Engine/Operator/GeometryConnection.h" +#include "Engine/Operator/OpInfo.h" #include "Engine/Operator/GeometryOpDef.h" #include "Engine/Types.h" #include @@ -11,7 +12,7 @@ void connectOperators(enzo::nt::OpId inputOpId, unsigned int inputIndex, enzo::n class GeometryOperator { public: - GeometryOperator(enzo::nt::OpId opId, nt::opConstructor ctorFunc); + GeometryOperator(enzo::nt::OpId opId, op::OpInfo opinfo); // disable copying GeometryOperator(const GeometryOperator&) = delete; diff --git a/src/Engine/Operator/OpInfo.h b/src/Engine/Operator/OpInfo.h new file mode 100644 index 0000000..aed01a4 --- /dev/null +++ b/src/Engine/Operator/OpInfo.h @@ -0,0 +1,15 @@ +#pragma once +#include +#include "Engine/Operator/GeometryOpDef.h" +#include "Engine/Parameter/Template.h" + +namespace enzo::op +{ +struct OpInfo +{ + std::string internalName; + std::string displayName; + enzo::nt::opConstructor ctorFunc; + enzo::prm::Template* templates; +}; +} diff --git a/src/Engine/Operator/OperatorTable.cpp b/src/Engine/Operator/OperatorTable.cpp index d4f8d8e..948eb5c 100644 --- a/src/Engine/Operator/OperatorTable.cpp +++ b/src/Engine/Operator/OperatorTable.cpp @@ -3,11 +3,18 @@ #include -void enzo::op::OperatorTable::addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template templateList[]) +void enzo::op::OperatorTable::addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template* templates) { std::cout << "OPERATOR TABLE ADDED\n"; std::cout << "adding operator: " << displayName << "\n"; - opInfoStore_.push_back({internalName, displayName, ctorFunc}); + enzo::op::OpInfo info { + internalName, + displayName, + ctorFunc, + templates + }; + + opInfoStore_.push_back(info); } enzo::nt::opConstructor enzo::op::OperatorTable::getOpConstructor(std::string name) @@ -22,6 +29,18 @@ enzo::nt::opConstructor enzo::op::OperatorTable::getOpConstructor(std::string na return nullptr; } +const std::optional enzo::op::OperatorTable::getOpInfo(std::string name) +{ + for(auto it = opInfoStore_.begin(); it!=opInfoStore_.end(); ++it) + { + if(it->internalName==name) + { + return *it; + } + } + return std::nullopt; +} + std::vector enzo::op::OperatorTable::getData() { return opInfoStore_; diff --git a/src/Engine/Operator/OperatorTable.h b/src/Engine/Operator/OperatorTable.h index b8f0cf2..a59655d 100644 --- a/src/Engine/Operator/OperatorTable.h +++ b/src/Engine/Operator/OperatorTable.h @@ -3,29 +3,25 @@ #include #include "Engine/Network/NetworkManager.h" #include "Engine/Operator/GeometryOpDef.h" +#include "Engine/Operator/OpInfo.h" #include "Engine/Parameter/Template.h" namespace enzo::op { -struct OpInfo -{ - std::string internalName; - std::string displayName; - enzo::nt::opConstructor ctorFunc; -}; class BOOST_SYMBOL_EXPORT OperatorTable { public: - static void addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template templateList[]); + static void addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template* templates); static nt::opConstructor getOpConstructor(std::string name); + static const std::optional getOpInfo(std::string name); static std::vector getData(); // TODO: move to better spot (maybe engine class) static void initPlugins(); private: static std::vector opInfoStore_; }; -using addOperatorPtr = void (*)(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template templateList[]); +using addOperatorPtr = void (*)(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template* templateList); } diff --git a/src/Engine/Parameter/FloatParm.cpp b/src/Engine/Parameter/FloatParm.cpp new file mode 100644 index 0000000..5affc8d --- /dev/null +++ b/src/Engine/Parameter/FloatParm.cpp @@ -0,0 +1,7 @@ +#include "Engine/Parameter/FloatParm.h" + + +enzo::prm::FloatParm::FloatParm(Template prmTemplate) +: template_{prmTemplate} +{ +} diff --git a/src/Engine/Parameter/FloatParm.h b/src/Engine/Parameter/FloatParm.h new file mode 100644 index 0000000..3449e08 --- /dev/null +++ b/src/Engine/Parameter/FloatParm.h @@ -0,0 +1,18 @@ +#pragma once +#include "Engine/Parameter/Template.h" +#include "Engine/Types.h" + +namespace enzo::prm +{ +class FloatParm +{ +public: + FloatParm(Template prmTemplate); + inline bt::floatT getValue() const {return value_;} + inline void setValue(bt::floatT value) {value_ = value;} +private: + Template template_; + bt::floatT value_ = 0; + +}; +} diff --git a/src/Engine/Parameter/Template.cpp b/src/Engine/Parameter/Template.cpp index 08256be..34f9f79 100644 --- a/src/Engine/Parameter/Template.cpp +++ b/src/Engine/Parameter/Template.cpp @@ -1,8 +1,8 @@ #include "Engine/Parameter/Template.h" #include "Engine/Parameter/Type.h" -enzo::prm::Template::Template(enzo::prm::Type type) -: type_{type} +enzo::prm::Template::Template(enzo::prm::Type type, const char* name) +: type_{type}, name_{name} { } diff --git a/src/Engine/Parameter/Template.h b/src/Engine/Parameter/Template.h index a260836..cddc30a 100644 --- a/src/Engine/Parameter/Template.h +++ b/src/Engine/Parameter/Template.h @@ -7,9 +7,11 @@ namespace enzo::prm class Template { public: - Template(enzo::prm::Type type); + Template(enzo::prm::Type type, const char* name); private: enzo::prm::Type type_; + // TODO: make a class that holds token and name + const char* name_; }; diff --git a/src/Gui/Network/Network.cpp b/src/Gui/Network/Network.cpp index 8cc2bdf..b8823eb 100644 --- a/src/Gui/Network/Network.cpp +++ b/src/Gui/Network/Network.cpp @@ -19,6 +19,7 @@ #include #include #include +#include #include "Gui/Network/TabMenu.h" using namespace enzo; @@ -310,30 +311,35 @@ void Network::keyPressEvent(QKeyEvent *event) tabMenu_->showOnMouse(); break; } - case(Qt::Key_G): - { - if(auto newNode = createNode(op::OperatorTable::getOpConstructor("transform"))) - { - newNode->setPos(viewPos); - } + // case(Qt::Key_G): + // { + // auto opInfo = op::OperatorTable::getOpInfo("transform"); + // if(!opInfo.has_value()) {throw std::runtime_error("Couldn't find op info for: " + )} + // if( + // opInfo.has_value() && + // auto newNode = createNode(opInfo) + // ) + // { + // newNode->setPos(viewPos); + // } - break; - } - case(Qt::Key_F): - { - if(auto newNode = createNode(op::OperatorTable::getOpConstructor("house"))) - { - newNode->setPos(viewPos); - } + // break; + // } + // case(Qt::Key_F): + // { + // if(auto newNode = createNode(op::OperatorTable::getOpInfo("house"))) + // { + // newNode->setPos(viewPos); + // } - break; - } + // break; + // } } } -NodeGraphic* Network::createNode(nt::opConstructor ctorFunc) +NodeGraphic* Network::createNode(op::OpInfo opInfo) { - if(nt::OpId id = enzo::nt::nm().addOperator(ctorFunc)) + if(nt::OpId id = enzo::nt::nm().addOperator(opInfo)) { NodeGraphic* newNode = new NodeGraphic(id); QPointF cursorPos = view_->mapToScene(mapFromGlobal(QCursor::pos())); diff --git a/src/Gui/Network/Network.h b/src/Gui/Network/Network.h index a918e68..74348d8 100644 --- a/src/Gui/Network/Network.h +++ b/src/Gui/Network/Network.h @@ -33,7 +33,7 @@ public: DEFAULT, MOVING_NODE }; - NodeGraphic* createNode(enzo::nt::opConstructor ctorFunc); + NodeGraphic* createNode(enzo::op::OpInfo opInfo); private: QLayout* mainLayout_; diff --git a/src/Gui/Network/TabMenu.cpp b/src/Gui/Network/TabMenu.cpp index edff4e5..22f5757 100644 --- a/src/Gui/Network/TabMenu.cpp +++ b/src/Gui/Network/TabMenu.cpp @@ -171,11 +171,23 @@ void enzo::ui::TabMenu::textChanged(const QString &text) } } +void enzo::ui::TabMenu::createNode(std::string nodeName) +{ + // get node info + std::optional opInfo = op::OperatorTable::getOpInfo(nodeName); + // check valid result + if(!opInfo.has_value()) {throw std::runtime_error("Couldn't find op info for: " + nodeName);} + + static_cast(parentWidget())->createNode(opInfo.value()); +} void enzo::ui::TabMenu::nodeClicked() { + // get name of button clicked TabMenuButton* buttonClicked = static_cast(sender()); - static_cast(parentWidget())->createNode(op::OperatorTable::getOpConstructor(buttonClicked->nodeName)); + + createNode(buttonClicked->nodeName); + doHide(); } @@ -230,7 +242,7 @@ bool enzo::ui::TabMenu::event(QEvent *event) if(visibleButtons_.size()==0) return true; if(selectionIndex_>=visibleButtons_.size()) selectionIndex_=visibleButtons_.size()-1; auto button = visibleButtons_.at(selectionIndex_); - static_cast(parentWidget())->createNode(op::OperatorTable::getOpConstructor(button->nodeName)); + createNode(button->nodeName); doHide(); return true; } diff --git a/src/Gui/Network/TabMenu.h b/src/Gui/Network/TabMenu.h index 33e7a4c..12f6f65 100644 --- a/src/Gui/Network/TabMenu.h +++ b/src/Gui/Network/TabMenu.h @@ -21,11 +21,11 @@ public: QString getDisplayText() {return displayText_;} void setSelected(bool selected); private: + QHBoxLayout* mainLayout_; QLabel* textLabel_; QSvgWidget* icon_; QString displayText_; - }; class TabMenu @@ -42,6 +42,7 @@ private: DOWN }; + void createNode(std::string nodeName); QVBoxLayout* mainLayout_; QLineEdit* searchBar_; QScrollArea* nodeScrollArea_; diff --git a/src/OpDefs/GopTransform.cpp b/src/OpDefs/GopTransform.cpp index c487803..0ff36af 100644 --- a/src/OpDefs/GopTransform.cpp +++ b/src/OpDefs/GopTransform.cpp @@ -38,5 +38,8 @@ void GopTransform::cookOp(enzo::op::Context context) } -enzo::prm::Template GopTransform::parameterList[] = {}; +enzo::prm::Template GopTransform::parameterList[] = { + enzo::prm::Template(enzo::prm::Type::FLOAT, "Test"), + enzo::prm::Template(enzo::prm::Type::FLOAT, "Test2") +}; From c3fabfa47bde660f92f5723c818fe949d5801a66 Mon Sep 17 00:00:00 2001 From: parker Date: Wed, 23 Jul 2025 16:57:27 +0100 Subject: [PATCH 05/11] feat: working parameter creation --- CMakeLists.txt | 1 + src/Engine/Operator/GeometryOperator.cpp | 21 +++++++++++++++++++-- src/Engine/Operator/GeometryOperator.h | 7 ++++++- src/Engine/Operator/OpInfo.h | 1 + src/Engine/Operator/OperatorTable.cpp | 6 ++++-- src/Engine/Operator/OperatorTable.h | 4 ++-- src/Engine/Parameter/FloatParm.cpp | 7 ------- src/Engine/Parameter/FloatParm.h | 18 ------------------ src/Engine/Parameter/Parameter.cpp | 9 +++++++++ src/Engine/Parameter/Parameter.h | 18 ++++++++++++++++++ src/Engine/Parameter/Template.cpp | 17 +++++++++++++++++ src/Engine/Parameter/Template.h | 5 +++++ src/OpDefs/GopHouse.cpp | 5 ++++- src/OpDefs/GopTransform.cpp | 4 +++- 14 files changed, 89 insertions(+), 34 deletions(-) delete mode 100644 src/Engine/Parameter/FloatParm.cpp delete mode 100644 src/Engine/Parameter/FloatParm.h create mode 100644 src/Engine/Parameter/Parameter.cpp create mode 100644 src/Engine/Parameter/Parameter.h diff --git a/CMakeLists.txt b/CMakeLists.txt index 616317b..1e4df0c 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -21,6 +21,7 @@ set(ENGINE_SOURCES src/Engine/Operator/OperatorTable.cpp src/Engine/Operator/Context.cpp src/Engine/Parameter/Template.cpp + src/Engine/Parameter/Parameter.cpp src/Engine/Network/NetworkManager.cpp ) diff --git a/src/Engine/Operator/GeometryOperator.cpp b/src/Engine/Operator/GeometryOperator.cpp index ce0c313..b5460b4 100644 --- a/src/Engine/Operator/GeometryOperator.cpp +++ b/src/Engine/Operator/GeometryOperator.cpp @@ -3,6 +3,8 @@ #include "Engine/Network/NetworkManager.h" #include #include "Engine/Operator/Context.h" +#include "Engine/Parameter/Parameter.h" +#include "Engine/Parameter/Template.h" #include using namespace enzo; @@ -23,12 +25,27 @@ void enzo::nt::connectOperators(enzo::nt::OpId inputOpId, unsigned int inputInde outputOp.addInputConnection(newConnection); } -nt::GeometryOperator::GeometryOperator(enzo::nt::OpId opId, op::OpInfo opinfo) -: opId_{opId}, opDef_(opinfo.ctorFunc(opId)) +nt::GeometryOperator::GeometryOperator(enzo::nt::OpId opId, op::OpInfo opInfo) +: opId_{opId}, opInfo_{opInfo}, opDef_(opInfo.ctorFunc(opId)) { // TODO: drive by geometry definition maxInputs_=4; maxOutputs_=4; + + initParameters(); +} + +void nt::GeometryOperator::initParameters() +{ + for(const prm::Template* t = opInfo_.templates; t->isValid(); ++t) + { + std::cout << "name: " << t->getName() << "\n"; + // create parameter + parameters_.push_back( + std::make_shared(*t) + ); + } + } void enzo::nt::GeometryOperator::cookOp(op::Context context) diff --git a/src/Engine/Operator/GeometryOperator.h b/src/Engine/Operator/GeometryOperator.h index a5878cb..398a5b6 100644 --- a/src/Engine/Operator/GeometryOperator.h +++ b/src/Engine/Operator/GeometryOperator.h @@ -2,6 +2,7 @@ #include "Engine/Operator/GeometryConnection.h" #include "Engine/Operator/OpInfo.h" #include "Engine/Operator/GeometryOpDef.h" +#include "Engine/Parameter/Parameter.h" #include "Engine/Types.h" #include #include @@ -12,7 +13,7 @@ void connectOperators(enzo::nt::OpId inputOpId, unsigned int inputIndex, enzo::n class GeometryOperator { public: - GeometryOperator(enzo::nt::OpId opId, op::OpInfo opinfo); + GeometryOperator(enzo::nt::OpId opId, op::OpInfo opInfo); // disable copying GeometryOperator(const GeometryOperator&) = delete; @@ -33,12 +34,16 @@ public: private: + void initParameters(); + // TODO: avoid duplicate connections std::vector> inputConnections_; std::vector> outputConnections_; + std::vector> parameters_; unsigned int maxInputs_; unsigned int maxOutputs_; std::unique_ptr opDef_; enzo::nt::OpId opId_; + enzo::op::OpInfo opInfo_; }; } diff --git a/src/Engine/Operator/OpInfo.h b/src/Engine/Operator/OpInfo.h index aed01a4..1fea8fe 100644 --- a/src/Engine/Operator/OpInfo.h +++ b/src/Engine/Operator/OpInfo.h @@ -11,5 +11,6 @@ struct OpInfo std::string displayName; enzo::nt::opConstructor ctorFunc; enzo::prm::Template* templates; + size_t templatesSize; }; } diff --git a/src/Engine/Operator/OperatorTable.cpp b/src/Engine/Operator/OperatorTable.cpp index 948eb5c..2e49156 100644 --- a/src/Engine/Operator/OperatorTable.cpp +++ b/src/Engine/Operator/OperatorTable.cpp @@ -3,15 +3,17 @@ #include -void enzo::op::OperatorTable::addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template* templates) +void enzo::op::OperatorTable::addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template templates[]) { std::cout << "OPERATOR TABLE ADDED\n"; std::cout << "adding operator: " << displayName << "\n"; + std::cout << "tempalate size: " << sizeof(templates) << "\n"; enzo::op::OpInfo info { internalName, displayName, ctorFunc, - templates + templates, + sizeof(*templates) }; opInfoStore_.push_back(info); diff --git a/src/Engine/Operator/OperatorTable.h b/src/Engine/Operator/OperatorTable.h index a59655d..aef66c2 100644 --- a/src/Engine/Operator/OperatorTable.h +++ b/src/Engine/Operator/OperatorTable.h @@ -13,7 +13,7 @@ namespace enzo::op class BOOST_SYMBOL_EXPORT OperatorTable { public: - static void addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template* templates); + static void addOperator(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template templates[]); static nt::opConstructor getOpConstructor(std::string name); static const std::optional getOpInfo(std::string name); static std::vector getData(); @@ -22,6 +22,6 @@ public: private: static std::vector opInfoStore_; }; -using addOperatorPtr = void (*)(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template* templateList); +using addOperatorPtr = void (*)(const char* internalName, const char* displayName, nt::opConstructor ctorFunc, prm::Template templateList[]); } diff --git a/src/Engine/Parameter/FloatParm.cpp b/src/Engine/Parameter/FloatParm.cpp deleted file mode 100644 index 5affc8d..0000000 --- a/src/Engine/Parameter/FloatParm.cpp +++ /dev/null @@ -1,7 +0,0 @@ -#include "Engine/Parameter/FloatParm.h" - - -enzo::prm::FloatParm::FloatParm(Template prmTemplate) -: template_{prmTemplate} -{ -} diff --git a/src/Engine/Parameter/FloatParm.h b/src/Engine/Parameter/FloatParm.h deleted file mode 100644 index 3449e08..0000000 --- a/src/Engine/Parameter/FloatParm.h +++ /dev/null @@ -1,18 +0,0 @@ -#pragma once -#include "Engine/Parameter/Template.h" -#include "Engine/Types.h" - -namespace enzo::prm -{ -class FloatParm -{ -public: - FloatParm(Template prmTemplate); - inline bt::floatT getValue() const {return value_;} - inline void setValue(bt::floatT value) {value_ = value;} -private: - Template template_; - bt::floatT value_ = 0; - -}; -} diff --git a/src/Engine/Parameter/Parameter.cpp b/src/Engine/Parameter/Parameter.cpp new file mode 100644 index 0000000..3aa0935 --- /dev/null +++ b/src/Engine/Parameter/Parameter.cpp @@ -0,0 +1,9 @@ +#include "Engine/Parameter/Parameter.h" +#include + + +enzo::prm::Parameter::Parameter(Template prmTemplate) +: template_{prmTemplate} +{ + std::cout << "created new parameter: " << prmTemplate.getName() << "\n"; +} diff --git a/src/Engine/Parameter/Parameter.h b/src/Engine/Parameter/Parameter.h new file mode 100644 index 0000000..ab26c8f --- /dev/null +++ b/src/Engine/Parameter/Parameter.h @@ -0,0 +1,18 @@ +#pragma once +#include "Engine/Parameter/Template.h" +#include "Engine/Types.h" + +namespace enzo::prm +{ +class Parameter +{ +public: + Parameter(Template prmTemplate); + inline bt::floatT evalFloat() const {return floatValue_;} + inline void setFloat(bt::floatT value) {floatValue_ = value;} +private: + Template template_; + bt::floatT floatValue_ = 0; + +}; +} diff --git a/src/Engine/Parameter/Template.cpp b/src/Engine/Parameter/Template.cpp index 34f9f79..2768e1e 100644 --- a/src/Engine/Parameter/Template.cpp +++ b/src/Engine/Parameter/Template.cpp @@ -6,3 +6,20 @@ enzo::prm::Template::Template(enzo::prm::Type type, const char* name) { } + +enzo::prm::Template::Template() +{ + +} + +bool enzo::prm::Template::isValid() const +{ + return name_!=nullptr; + +} + +const char* enzo::prm::Template::getName() const +{ + return name_; +} + diff --git a/src/Engine/Parameter/Template.h b/src/Engine/Parameter/Template.h index cddc30a..6e69d38 100644 --- a/src/Engine/Parameter/Template.h +++ b/src/Engine/Parameter/Template.h @@ -8,6 +8,9 @@ class Template { public: Template(enzo::prm::Type type, const char* name); + Template(); + const char* getName() const; + bool isValid() const; private: enzo::prm::Type type_; // TODO: make a class that holds token and name @@ -15,5 +18,7 @@ private: }; +inline enzo::prm::Template Terminator = enzo::prm::Template(); + } diff --git a/src/OpDefs/GopHouse.cpp b/src/OpDefs/GopHouse.cpp index 89eace7..eb53ded 100644 --- a/src/OpDefs/GopHouse.cpp +++ b/src/OpDefs/GopHouse.cpp @@ -79,4 +79,7 @@ void GOP_house::cookOp(enzo::op::Context context) // } } -enzo::prm::Template GOP_house::parameterList[] = {}; +enzo::prm::Template GOP_house::parameterList[] = +{ + enzo::prm::Terminator +}; diff --git a/src/OpDefs/GopTransform.cpp b/src/OpDefs/GopTransform.cpp index 0ff36af..cbca302 100644 --- a/src/OpDefs/GopTransform.cpp +++ b/src/OpDefs/GopTransform.cpp @@ -1,5 +1,6 @@ #include "OpDefs/GopTransform.hpp" #include "Engine/Operator/AttributeHandle.h" +#include "Engine/Parameter/Template.h" GopTransform::GopTransform(enzo::nt::OpId opId) : enzo::nt::GeometryOpDef(opId) @@ -40,6 +41,7 @@ void GopTransform::cookOp(enzo::op::Context context) enzo::prm::Template GopTransform::parameterList[] = { enzo::prm::Template(enzo::prm::Type::FLOAT, "Test"), - enzo::prm::Template(enzo::prm::Type::FLOAT, "Test2") + enzo::prm::Template(enzo::prm::Type::FLOAT, "Test2"), + enzo::prm::Terminator }; From ae78e15931652e4a74b9c5b0899e1cf16459a4db Mon Sep 17 00:00:00 2001 From: parker Date: Wed, 23 Jul 2025 19:54:40 +0100 Subject: [PATCH 06/11] feat(parameter): populate parameterPanel --- CMakeLists.txt | 4 ++- src/Engine/Operator/GeometryOperator.cpp | 4 +++ src/Engine/Operator/GeometryOperator.h | 2 +- src/Engine/Operator/OperatorTable.cpp | 8 +++-- src/Engine/Parameter/Parameter.cpp | 6 ++++ src/Engine/Parameter/Parameter.h | 1 + src/Gui/Interface.cpp | 5 +-- src/Gui/Network/Network.cpp | 2 +- src/Gui/Parameters/AbstractFormParm.cpp | 14 ++++++-- src/Gui/Parameters/AbstractFormParm.h | 4 ++- src/Gui/ParametersPanel/ParametersPanel.cpp | 38 ++++++++++++++++----- src/Gui/ParametersPanel/ParametersPanel.h | 2 ++ src/OpDefs/GopHouse.cpp | 1 + src/OpDefs/GopTransform.cpp | 8 +++-- src/OpDefs/RegisterPlugin.cpp | 2 +- 15 files changed, 79 insertions(+), 22 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index 1e4df0c..ba25f38 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -76,6 +76,9 @@ qt_add_executable(${AppExec} target_link_libraries(${AppExec} PRIVATE Qt6::Core Qt6::Widgets Qt6::SvgWidgets Qt6::OpenGLWidgets glm::glm Eigen3::Eigen TBB::tbb Boost::filesystem Boost::system) target_include_directories(${AppExec} PUBLIC src) +# compile nodes +add_subdirectory(src/OpDefs) + # tests # Include(FetchContent) @@ -110,4 +113,3 @@ target_include_directories(${AppExec} PUBLIC src) # target_compile_definitions(${BenchExec} PRIVATE UNIT_TEST) # target_include_directories(${BenchExec} PUBLIC src) -# add_subdirectory(src/OpDefs) diff --git a/src/Engine/Operator/GeometryOperator.cpp b/src/Engine/Operator/GeometryOperator.cpp index b5460b4..bbc6234 100644 --- a/src/Engine/Operator/GeometryOperator.cpp +++ b/src/Engine/Operator/GeometryOperator.cpp @@ -83,6 +83,10 @@ std::vector> nt::GeometryOperator: } return inputConnections; } +std::vector> nt::GeometryOperator::getParameters() +{ + return {parameters_.begin(), parameters_.end()}; +} std::vector> nt::GeometryOperator::getOutputConnections() const { diff --git a/src/Engine/Operator/GeometryOperator.h b/src/Engine/Operator/GeometryOperator.h index 398a5b6..43b4d83 100644 --- a/src/Engine/Operator/GeometryOperator.h +++ b/src/Engine/Operator/GeometryOperator.h @@ -26,7 +26,7 @@ public: void addOutputConnection(std::shared_ptr connection); std::vector> getInputConnections() const; std::vector> getOutputConnections() const; - + std::vector> getParameters(); unsigned int getMaxInputs() const; diff --git a/src/Engine/Operator/OperatorTable.cpp b/src/Engine/Operator/OperatorTable.cpp index 2e49156..a0bc157 100644 --- a/src/Engine/Operator/OperatorTable.cpp +++ b/src/Engine/Operator/OperatorTable.cpp @@ -7,13 +7,17 @@ void enzo::op::OperatorTable::addOperator(const char* internalName, const char* { std::cout << "OPERATOR TABLE ADDED\n"; std::cout << "adding operator: " << displayName << "\n"; - std::cout << "tempalate size: " << sizeof(templates) << "\n"; + + for(const prm::Template* t = templates; t->isValid(); ++t) + { + std::cout << "name: " << t->getName() << "\n"; + } + enzo::op::OpInfo info { internalName, displayName, ctorFunc, templates, - sizeof(*templates) }; opInfoStore_.push_back(info); diff --git a/src/Engine/Parameter/Parameter.cpp b/src/Engine/Parameter/Parameter.cpp index 3aa0935..500aea5 100644 --- a/src/Engine/Parameter/Parameter.cpp +++ b/src/Engine/Parameter/Parameter.cpp @@ -7,3 +7,9 @@ enzo::prm::Parameter::Parameter(Template prmTemplate) { std::cout << "created new parameter: " << prmTemplate.getName() << "\n"; } + +std::string enzo::prm::Parameter::getName() const +{ + return template_.getName(); +} + diff --git a/src/Engine/Parameter/Parameter.h b/src/Engine/Parameter/Parameter.h index ab26c8f..30e6bc2 100644 --- a/src/Engine/Parameter/Parameter.h +++ b/src/Engine/Parameter/Parameter.h @@ -8,6 +8,7 @@ class Parameter { public: Parameter(Template prmTemplate); + std::string getName() const; inline bt::floatT evalFloat() const {return floatValue_;} inline void setFloat(bt::floatT value) {floatValue_ = value;} private: diff --git a/src/Gui/Interface.cpp b/src/Gui/Interface.cpp index 0e2e459..e3e104f 100644 --- a/src/Gui/Interface.cpp +++ b/src/Gui/Interface.cpp @@ -42,17 +42,18 @@ EnzoUI::EnzoUI() viewportSplitter_->addWidget(viewport); viewportSplitter_->addWidget(networkSplitter_); - viewportSplitter_->setStretchFactor(0, 4); + viewportSplitter_->setStretchFactor(0, 25); viewportSplitter_->setStretchFactor(1, 1); networkSplitter_->addWidget(parametersPanel); networkSplitter_->addWidget(network); networkSplitter_->setStretchFactor(0, 1); - networkSplitter_->setStretchFactor(1, 15); + networkSplitter_->setStretchFactor(1, 10); mainLayout_->addWidget(viewportSplitter_); // connect signals connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, viewport, &Viewport::geometryChanged); + connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, parametersPanel, &ParametersPanel::selectionChanged); } diff --git a/src/Gui/Network/Network.cpp b/src/Gui/Network/Network.cpp index b8823eb..7735e7d 100644 --- a/src/Gui/Network/Network.cpp +++ b/src/Gui/Network/Network.cpp @@ -399,8 +399,8 @@ void Network::mouseReleaseEvent(QMouseEvent *event) NodeGraphic* prevDisplayNode = nodeStore_.at(*prevDisplayOpId); prevDisplayNode->setDisplayFlag(false); } - nm.setDisplayOp(opId); static_cast(clickedDisplayFlag)->setEnabled(true); + nm.setDisplayOp(opId); } if(state_==State::MOVING_NODE) { diff --git a/src/Gui/Parameters/AbstractFormParm.cpp b/src/Gui/Parameters/AbstractFormParm.cpp index e5725df..97ae266 100644 --- a/src/Gui/Parameters/AbstractFormParm.cpp +++ b/src/Gui/Parameters/AbstractFormParm.cpp @@ -4,9 +4,19 @@ #include -enzo::ui::AbstractFormParm::AbstractFormParm() +enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr parameter) { - auto label = new QLabel("Parm name:"); + std::string name; + if(auto sharedParameter=parameter.lock()) + { + name = sharedParameter->getName(); + } + else + { + return; + } + + auto label = new QLabel(QString::fromStdString(name+":")); label->setStyleSheet("QLabel{background: none}"); label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); diff --git a/src/Gui/Parameters/AbstractFormParm.h b/src/Gui/Parameters/AbstractFormParm.h index 82d2243..43f1346 100644 --- a/src/Gui/Parameters/AbstractFormParm.h +++ b/src/Gui/Parameters/AbstractFormParm.h @@ -1,5 +1,7 @@ +#include "Engine/Parameter/Parameter.h" #include #include +#include namespace enzo::ui { @@ -8,7 +10,7 @@ class AbstractFormParm : public QWidget { public: - AbstractFormParm(); + AbstractFormParm(std::weak_ptr parameter); private: QHBoxLayout* mainLayout_; diff --git a/src/Gui/ParametersPanel/ParametersPanel.cpp b/src/Gui/ParametersPanel/ParametersPanel.cpp index 9002dc2..3e76b49 100644 --- a/src/Gui/ParametersPanel/ParametersPanel.cpp +++ b/src/Gui/ParametersPanel/ParametersPanel.cpp @@ -1,7 +1,10 @@ #include "Gui/ParametersPanel/ParametersPanel.h" +#include "Engine/Operator/GeometryOperator.h" #include "Gui/Parameters/AbstractSliderParm.h" #include "Gui/Parameters/AbstractFormParm.h" #include "Gui/Parameters/FloatParm.h" +#include "Engine/Network/NetworkManager.h" +#include #include #include #include @@ -29,15 +32,34 @@ ParametersPanel::ParametersPanel(QWidget *parent, Qt::WindowFlags f) mainLayout_->addLayout(parametersLayout_); mainLayout_->addWidget(bgWidget_); - // parametersLayout_->addWidget(new enzo::ui::AbstractSliderParm()); - // parametersLayout_->addWidget(new enzo::ui::AbstractSliderParm()); - // parametersLayout_->addWidget(new enzo::ui::FloatParm()); - // parametersLayout_->addWidget(new enzo::ui::FloatParm()); - parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); - parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); - parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); - parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); + // parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); + // parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); + // parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); + // parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); setLayout(mainLayout_); } + +void ParametersPanel::selectionChanged() +{ + enzo::nt::NetworkManager& nm = enzo::nt::nm(); + std::optional displayOpId = nm.getDisplayOp(); + + if(!displayOpId.has_value()) return; + + // clear layout safely + QLayoutItem *child; + while ((child = parametersLayout_->takeAt(0)) != nullptr) { + delete child->widget(); + delete child; + } + + enzo::nt::GeometryOperator& displayOp = nm.getGeoOperator(displayOpId.value()); + auto parameters = displayOp.getParameters(); + for(auto parameter : parameters) + { + parametersLayout_->addWidget(new enzo::ui::AbstractFormParm(parameter)); + } +} + diff --git a/src/Gui/ParametersPanel/ParametersPanel.h b/src/Gui/ParametersPanel/ParametersPanel.h index 7a4bfda..8749474 100644 --- a/src/Gui/ParametersPanel/ParametersPanel.h +++ b/src/Gui/ParametersPanel/ParametersPanel.h @@ -8,6 +8,8 @@ class ParametersPanel { public: ParametersPanel(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); +public slots: + void selectionChanged(); private: QVBoxLayout* mainLayout_; QVBoxLayout* parametersLayout_; diff --git a/src/OpDefs/GopHouse.cpp b/src/OpDefs/GopHouse.cpp index eb53ded..4610be1 100644 --- a/src/OpDefs/GopHouse.cpp +++ b/src/OpDefs/GopHouse.cpp @@ -81,5 +81,6 @@ void GOP_house::cookOp(enzo::op::Context context) enzo::prm::Template GOP_house::parameterList[] = { + enzo::prm::Template(enzo::prm::Type::FLOAT, "Size"), enzo::prm::Terminator }; diff --git a/src/OpDefs/GopTransform.cpp b/src/OpDefs/GopTransform.cpp index cbca302..c146855 100644 --- a/src/OpDefs/GopTransform.cpp +++ b/src/OpDefs/GopTransform.cpp @@ -39,9 +39,11 @@ void GopTransform::cookOp(enzo::op::Context context) } -enzo::prm::Template GopTransform::parameterList[] = { - enzo::prm::Template(enzo::prm::Type::FLOAT, "Test"), - enzo::prm::Template(enzo::prm::Type::FLOAT, "Test2"), +enzo::prm::Template GopTransform::parameterList[] = +{ + enzo::prm::Template(enzo::prm::Type::FLOAT, "translateX"), + enzo::prm::Template(enzo::prm::Type::FLOAT, "translateY"), + enzo::prm::Template(enzo::prm::Type::FLOAT, "translateZ"), enzo::prm::Terminator }; diff --git a/src/OpDefs/RegisterPlugin.cpp b/src/OpDefs/RegisterPlugin.cpp index 71324e9..57dea9a 100644 --- a/src/OpDefs/RegisterPlugin.cpp +++ b/src/OpDefs/RegisterPlugin.cpp @@ -18,7 +18,7 @@ extern "C" "house", "House", &GOP_house::ctor, - GopTransform::parameterList + GOP_house::parameterList ); } From 884c7a094a464eb5ba52ba0dfa8739b7a5d2d57b Mon Sep 17 00:00:00 2001 From: parker Date: Wed, 23 Jul 2025 20:31:02 +0100 Subject: [PATCH 07/11] feat(parameter): persistant parameter value --- src/Engine/Parameter/Parameter.cpp | 9 ++++ src/Engine/Parameter/Parameter.h | 4 +- src/Gui/Parameters/AbstractFormParm.cpp | 52 ++++++++++++++--------- src/Gui/Parameters/AbstractFormParm.h | 5 +++ src/Gui/Parameters/AbstractSliderParm.cpp | 8 +++- src/Gui/Parameters/AbstractSliderParm.h | 6 ++- 6 files changed, 60 insertions(+), 24 deletions(-) diff --git a/src/Engine/Parameter/Parameter.cpp b/src/Engine/Parameter/Parameter.cpp index 500aea5..6399446 100644 --- a/src/Engine/Parameter/Parameter.cpp +++ b/src/Engine/Parameter/Parameter.cpp @@ -13,3 +13,12 @@ std::string enzo::prm::Parameter::getName() const return template_.getName(); } +enzo::bt::floatT enzo::prm::Parameter::evalFloat() const +{ + return floatValue_; +} +void enzo::prm::Parameter::setFloat(bt::floatT value) +{ + floatValue_ = value; +} + diff --git a/src/Engine/Parameter/Parameter.h b/src/Engine/Parameter/Parameter.h index 30e6bc2..e2ce818 100644 --- a/src/Engine/Parameter/Parameter.h +++ b/src/Engine/Parameter/Parameter.h @@ -9,8 +9,8 @@ class Parameter public: Parameter(Template prmTemplate); std::string getName() const; - inline bt::floatT evalFloat() const {return floatValue_;} - inline void setFloat(bt::floatT value) {floatValue_ = value;} + bt::floatT evalFloat() const; + void setFloat(bt::floatT value); private: Template template_; bt::floatT floatValue_ = 0; diff --git a/src/Gui/Parameters/AbstractFormParm.cpp b/src/Gui/Parameters/AbstractFormParm.cpp index 97ae266..64f605a 100644 --- a/src/Gui/Parameters/AbstractFormParm.cpp +++ b/src/Gui/Parameters/AbstractFormParm.cpp @@ -2,32 +2,46 @@ #include "Gui/Parameters/AbstractSliderParm.h" #include #include +#include enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr parameter) +: parameter_{parameter} { - std::string name; - if(auto sharedParameter=parameter.lock()) + if(auto sharedParameter=parameter_.lock()) { - name = sharedParameter->getName(); + std::string name = sharedParameter->getName(); + auto label = new QLabel(QString::fromStdString(name+":")); + label->setStyleSheet("QLabel{background: none}"); + label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); + + auto slider = new AbstractSliderParm(); + connect(slider, &AbstractSliderParm::valueChanged, this, &AbstractFormParm::changeValue); + slider->setValue(sharedParameter->evalFloat()); + + mainLayout_ = new QHBoxLayout(); + mainLayout_->addWidget(label); + mainLayout_->addWidget(slider); + mainLayout_->setContentsMargins(0,0,0,0); + + setFixedHeight(24); + setProperty("class", "Parameter"); + setStyleSheet(".Parameter { background-color: none;}"); + setLayout(mainLayout_); + } + +} + +void enzo::ui::AbstractFormParm::changeValue(enzo::bt::floatT value) +{ + if(auto sharedParameter=parameter_.lock()) + { + sharedParameter->setFloat(value); } else { - return; + std::cout << "ERROR: parameter no longer exists\n"; + } - - auto label = new QLabel(QString::fromStdString(name+":")); - label->setStyleSheet("QLabel{background: none}"); - label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); - - mainLayout_ = new QHBoxLayout(); - mainLayout_->addWidget(label); - mainLayout_->addWidget(new AbstractSliderParm()); - mainLayout_->setContentsMargins(0,0,0,0); - - setFixedHeight(24); - setProperty("class", "Parameter"); - setStyleSheet(".Parameter { background-color: none;}"); - setLayout(mainLayout_); + } - diff --git a/src/Gui/Parameters/AbstractFormParm.h b/src/Gui/Parameters/AbstractFormParm.h index 43f1346..d2279bb 100644 --- a/src/Gui/Parameters/AbstractFormParm.h +++ b/src/Gui/Parameters/AbstractFormParm.h @@ -12,8 +12,13 @@ class AbstractFormParm public: AbstractFormParm(std::weak_ptr parameter); +protected slots: + void changeValue(bt::floatT value); + + private: QHBoxLayout* mainLayout_; + std::weak_ptr parameter_; }; diff --git a/src/Gui/Parameters/AbstractSliderParm.cpp b/src/Gui/Parameters/AbstractSliderParm.cpp index 3516d9c..18c3264 100644 --- a/src/Gui/Parameters/AbstractSliderParm.cpp +++ b/src/Gui/Parameters/AbstractSliderParm.cpp @@ -13,6 +13,8 @@ enzo::ui::AbstractSliderParm::AbstractSliderParm(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) { + // tells qt to style the widget even though it's a Q_OBJECT + setAttribute(Qt::WA_StyledBackground, true); setFixedHeight(24); value_ = defaultValue_; @@ -53,8 +55,8 @@ void enzo::ui::AbstractSliderParm::paintEvent(QPaintEvent *event) void enzo::ui::AbstractSliderParm::setValue(bt::floatT value) { - if(value_==value) - return; + // if(value_==value) + // return; if(clampMin_ && valuemaxValue_) { value = maxValue_; } @@ -65,6 +67,8 @@ void enzo::ui::AbstractSliderParm::setValue(bt::floatT value) valStr.truncate(4); valueLabel_->setText(valStr); + valueChanged(value_); + } diff --git a/src/Gui/Parameters/AbstractSliderParm.h b/src/Gui/Parameters/AbstractSliderParm.h index df18579..640321c 100644 --- a/src/Gui/Parameters/AbstractSliderParm.h +++ b/src/Gui/Parameters/AbstractSliderParm.h @@ -10,11 +10,15 @@ namespace enzo::ui class AbstractSliderParm : public QWidget { + Q_OBJECT public: AbstractSliderParm(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); + void setValue(bt::floatT value); + +signals: + void valueChanged(bt::floatT value); private: - void setValue(bt::floatT value); QVBoxLayout* mainLayout_; QLabel* valueLabel_; From f49c6bd5de5778943705e40fb6c4c6817c17332e Mon Sep 17 00:00:00 2001 From: parker Date: Wed, 23 Jul 2025 21:19:58 +0100 Subject: [PATCH 08/11] fix: adjust stretch factors --- src/Gui/Interface.cpp | 26 +++++++++++++++++---- src/Gui/Network/Network.cpp | 4 ++-- src/Gui/ParametersPanel/ParametersPanel.cpp | 1 - src/Gui/Viewport/Viewport.cpp | 13 +++-------- 4 files changed, 27 insertions(+), 17 deletions(-) diff --git a/src/Gui/Interface.cpp b/src/Gui/Interface.cpp index e3e104f..ffd80cf 100644 --- a/src/Gui/Interface.cpp +++ b/src/Gui/Interface.cpp @@ -24,7 +24,7 @@ EnzoUI::EnzoUI() setStyleSheet("background-color:#1d2021;"); Viewport* viewport = new Viewport(); - Network* network = new Network(this); + Network* network = new Network(); ParametersPanel* parametersPanel = new ParametersPanel(); constexpr int margin = 2; @@ -34,6 +34,7 @@ EnzoUI::EnzoUI() mainLayout_->setContentsMargins(margin, margin, margin, margin); + viewportSplitter_ = new Splitter(this); networkSplitter_ = new Splitter(this); networkSplitter_->setOrientation(Qt::Vertical); @@ -42,13 +43,13 @@ EnzoUI::EnzoUI() viewportSplitter_->addWidget(viewport); viewportSplitter_->addWidget(networkSplitter_); - viewportSplitter_->setStretchFactor(0, 25); + viewportSplitter_->setStretchFactor(0, 4); viewportSplitter_->setStretchFactor(1, 1); networkSplitter_->addWidget(parametersPanel); networkSplitter_->addWidget(network); - networkSplitter_->setStretchFactor(0, 1); - networkSplitter_->setStretchFactor(1, 10); + networkSplitter_->setStretchFactor(0, 10); + networkSplitter_->setStretchFactor(1, 1); mainLayout_->addWidget(viewportSplitter_); @@ -56,4 +57,21 @@ EnzoUI::EnzoUI() connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, viewport, &Viewport::geometryChanged); connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, parametersPanel, &ParametersPanel::selectionChanged); +// ─── end of EnzoUI ctor ─── +QTimer::singleShot(0, this, [=] { +auto dump = [](const char* name, QWidget* w) { + qInfo().nospace() + << name + << " sizeHint=" << w->sizeHint() + << " minHint=" << w->minimumSizeHint() + << " min=" << w->minimumSize() + << " policy=" << w->sizePolicy(); +}; + + dump("Viewport ", viewport); + dump("ParametersPanel ", parametersPanel); + dump("Network ", network); + dump("NetworkSplitter ", networkSplitter_); // will show max(child‑mins) +}); + } diff --git a/src/Gui/Network/Network.cpp b/src/Gui/Network/Network.cpp index 7735e7d..718554d 100644 --- a/src/Gui/Network/Network.cpp +++ b/src/Gui/Network/Network.cpp @@ -28,9 +28,9 @@ Network::Network(QWidget* parent) : QWidget(parent) { - mainLayout_ = new QVBoxLayout(parent); + mainLayout_ = new QVBoxLayout(this); // mainLayout_->setContentsMargins(0,0,0,0); - this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); + // this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); tabMenu_ = new enzo::ui::TabMenu(this); diff --git a/src/Gui/ParametersPanel/ParametersPanel.cpp b/src/Gui/ParametersPanel/ParametersPanel.cpp index 3e76b49..99b9638 100644 --- a/src/Gui/ParametersPanel/ParametersPanel.cpp +++ b/src/Gui/ParametersPanel/ParametersPanel.cpp @@ -29,7 +29,6 @@ ParametersPanel::ParametersPanel(QWidget *parent, Qt::WindowFlags f) )" ); - mainLayout_->addLayout(parametersLayout_); mainLayout_->addWidget(bgWidget_); // parametersLayout_->addWidget(new enzo::ui::AbstractFormParm()); diff --git a/src/Gui/Viewport/Viewport.cpp b/src/Gui/Viewport/Viewport.cpp index b8737d0..746f374 100644 --- a/src/Gui/Viewport/Viewport.cpp +++ b/src/Gui/Viewport/Viewport.cpp @@ -14,17 +14,10 @@ Viewport::Viewport(QWidget *parent, Qt::WindowFlags f) : QWidget(parent, f) { mainLayout_=new QVBoxLayout(); - openGLWidget_ = new ViewportGLWidget(this); mainLayout_->addWidget(openGLWidget_); - openGLWidget_->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - // mainLayout_->addWidget(new QPushButton("hello world")); + openGLWidget_ = new ViewportGLWidget(this); + mainLayout_->addWidget(openGLWidget_); + this->setLayout(mainLayout_); - // this->setSizePolicy(QSizePolicy::Expanding, QSizePolicy::Expanding); - // QTimer::singleShot(100, this, [=] { - // std::cout << "MyGLWidget size: " << openGLWidget_->width() << " x " << openGLWidget_->height() << std::endl; - // }); - - } void Viewport::geometryChanged(enzo::geo::Geometry& geometry) From 8a380a0feef89370ec74c001104524b7a49cc316 Mon Sep 17 00:00:00 2001 From: parker Date: Thu, 24 Jul 2025 01:26:11 +0100 Subject: [PATCH 09/11] feat: context can red parameters --- src/Engine/Operator/Context.cpp | 12 ++++++++++++ src/Engine/Operator/Context.h | 1 + src/Engine/Operator/GeometryOpDef.h | 1 + src/Engine/Operator/GeometryOperator.cpp | 13 +++++++++++++ src/Engine/Operator/GeometryOperator.h | 1 + src/OpDefs/CMakeLists.txt | 1 + src/OpDefs/GopTransform.cpp | 4 +++- 7 files changed, 32 insertions(+), 1 deletion(-) diff --git a/src/Engine/Operator/Context.cpp b/src/Engine/Operator/Context.cpp index 34eecaa..27d47bd 100644 --- a/src/Engine/Operator/Context.cpp +++ b/src/Engine/Operator/Context.cpp @@ -1,6 +1,8 @@ #include "Engine/Operator/Context.h" #include "Engine/Network/NetworkManager.h" +#include "Engine/Parameter/Parameter.h" #include +#include enzo::op::Context::Context(enzo::nt::OpId opId, enzo::nt::NetworkManager& networkManager) @@ -23,3 +25,13 @@ enzo::geo::Geometry enzo::op::Context::cloneInputGeo(unsigned int inputIndex) return networkManager_.getGeoOperator(inputConnection->getInputOpId()).getOutputGeo(inputConnection->getInputIndex()); } +enzo::bt::floatT enzo::op::Context::evalFloatParm(const char* parmName) const +{ + enzo::nt::GeometryOperator& selfOp = networkManager_.getGeoOperator(opId_); + std::weak_ptr parameter = selfOp.getParameter(parmName); + + if(auto sharedParm = parameter.lock()) + { + return sharedParm->evalFloat(); + } +} diff --git a/src/Engine/Operator/Context.h b/src/Engine/Operator/Context.h index c89c37f..96dd46c 100644 --- a/src/Engine/Operator/Context.h +++ b/src/Engine/Operator/Context.h @@ -15,6 +15,7 @@ class Context public: Context(enzo::nt::OpId opId, enzo::nt::NetworkManager& networkManager); enzo::geo::Geometry cloneInputGeo(unsigned int inputIndex); + bt::floatT evalFloatParm(const char* parmName) const; private: enzo::nt::OpId opId_; enzo::nt::NetworkManager& networkManager_; diff --git a/src/Engine/Operator/GeometryOpDef.h b/src/Engine/Operator/GeometryOpDef.h index 2a671df..9ffaee9 100644 --- a/src/Engine/Operator/GeometryOpDef.h +++ b/src/Engine/Operator/GeometryOpDef.h @@ -20,6 +20,7 @@ private: unsigned int minInputs_; unsigned int maxInputs_; unsigned int maxOutputs_; + protected: enzo::nt::OpId opId_; const enzo::geo::Geometry& getInputGeoView(unsigned int inputIndex); diff --git a/src/Engine/Operator/GeometryOperator.cpp b/src/Engine/Operator/GeometryOperator.cpp index bbc6234..93c0189 100644 --- a/src/Engine/Operator/GeometryOperator.cpp +++ b/src/Engine/Operator/GeometryOperator.cpp @@ -74,6 +74,19 @@ void nt::GeometryOperator::addOutputConnection(std::shared_ptr nt::GeometryOperator::getParameter(std::string parameterName) +{ + for(auto parm : parameters_) + { + if(parm->getName()==parameterName) + { + return parm; + } + } + return std::weak_ptr(); + +} + std::vector> nt::GeometryOperator::getInputConnections() const { std::vector> inputConnections; diff --git a/src/Engine/Operator/GeometryOperator.h b/src/Engine/Operator/GeometryOperator.h index 43b4d83..e4a0513 100644 --- a/src/Engine/Operator/GeometryOperator.h +++ b/src/Engine/Operator/GeometryOperator.h @@ -27,6 +27,7 @@ public: std::vector> getInputConnections() const; std::vector> getOutputConnections() const; std::vector> getParameters(); + std::weak_ptr getParameter(std::string parameterName); unsigned int getMaxInputs() const; diff --git a/src/OpDefs/CMakeLists.txt b/src/OpDefs/CMakeLists.txt index f58e6db..0ed25a4 100644 --- a/src/OpDefs/CMakeLists.txt +++ b/src/OpDefs/CMakeLists.txt @@ -18,6 +18,7 @@ add_library(${libName} SHARED ../Engine/Operator/Attribute.cpp ../Engine/Network/NetworkManager.cpp ../Engine/Parameter/Template.cpp + ../Engine/Parameter/Parameter.cpp GopTransform.cpp GopHouse.cpp ) diff --git a/src/OpDefs/GopTransform.cpp b/src/OpDefs/GopTransform.cpp index c146855..c94994a 100644 --- a/src/OpDefs/GopTransform.cpp +++ b/src/OpDefs/GopTransform.cpp @@ -26,7 +26,9 @@ void GopTransform::cookOp(enzo::op::Context context) for(int i=0; i Date: Thu, 24 Jul 2025 01:55:21 +0100 Subject: [PATCH 10/11] feat(parameters): add defaults and remove qt keywords --- CMakeLists.txt | 1 + src/Engine/Network/NetworkManager.h | 2 +- src/Engine/Parameter/Parameter.cpp | 1 + src/Engine/Parameter/Template.cpp | 9 +++++++-- src/Engine/Parameter/Template.h | 10 +++++++++- src/Gui/Network/TabMenu.h | 2 +- src/Gui/Parameters/AbstractFormParm.cpp | 3 ++- src/Gui/Parameters/AbstractFormParm.h | 5 +++-- src/Gui/Parameters/AbstractSliderParm.h | 2 +- src/Gui/ParametersPanel/ParametersPanel.h | 2 +- src/Gui/Viewport/Viewport.h | 2 +- src/Gui/Viewport/ViewportGLWidget.h | 2 +- src/OpDefs/GopHouse.cpp | 12 ++---------- src/OpDefs/GopTransform.cpp | 6 +++--- 14 files changed, 34 insertions(+), 25 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index ba25f38..5b43982 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -54,6 +54,7 @@ set(GUI_SOURCES # qt find_package(Qt6 REQUIRED COMPONENTS Core Widgets SvgWidgets OpenGLWidgets) qt_standard_project_setup() +ADD_DEFINITIONS(-DQT_NO_KEYWORDS) # glm find_package(glm REQUIRED) diff --git a/src/Engine/Network/NetworkManager.h b/src/Engine/Network/NetworkManager.h index 5ea01b1..a5a9f3d 100644 --- a/src/Engine/Network/NetworkManager.h +++ b/src/Engine/Network/NetworkManager.h @@ -42,7 +42,7 @@ private: enzo::nt::OpId maxOpId_=0; // operator selected for displaying in the viewport std::optional displayOp_=std::nullopt; -signals: +Q_SIGNALS: void updateDisplay(enzo::geo::Geometry& geometry); }; diff --git a/src/Engine/Parameter/Parameter.cpp b/src/Engine/Parameter/Parameter.cpp index 6399446..4f22343 100644 --- a/src/Engine/Parameter/Parameter.cpp +++ b/src/Engine/Parameter/Parameter.cpp @@ -5,6 +5,7 @@ enzo::prm::Parameter::Parameter(Template prmTemplate) : template_{prmTemplate} { + floatValue_ = prmTemplate.getDefault(); std::cout << "created new parameter: " << prmTemplate.getName() << "\n"; } diff --git a/src/Engine/Parameter/Template.cpp b/src/Engine/Parameter/Template.cpp index 2768e1e..ff699ef 100644 --- a/src/Engine/Parameter/Template.cpp +++ b/src/Engine/Parameter/Template.cpp @@ -1,8 +1,8 @@ #include "Engine/Parameter/Template.h" #include "Engine/Parameter/Type.h" -enzo::prm::Template::Template(enzo::prm::Type type, const char* name) -: type_{type}, name_{name} +enzo::prm::Template::Template(enzo::prm::Type type, const char* name, bt::floatT theDefault) +: type_{type}, name_{name}, default_{theDefault} { } @@ -18,6 +18,11 @@ bool enzo::prm::Template::isValid() const } +const enzo::bt::floatT enzo::prm::Template::getDefault() const +{ + return default_; +} + const char* enzo::prm::Template::getName() const { return name_; diff --git a/src/Engine/Parameter/Template.h b/src/Engine/Parameter/Template.h index 6e69d38..b34cde2 100644 --- a/src/Engine/Parameter/Template.h +++ b/src/Engine/Parameter/Template.h @@ -1,5 +1,6 @@ #pragma once #include "Engine/Parameter/Type.h" +#include "Engine/Types.h" namespace enzo::prm { @@ -7,12 +8,19 @@ namespace enzo::prm class Template { public: - Template(enzo::prm::Type type, const char* name); + Template( + enzo::prm::Type type, + const char* name, + // TODO: change default to class that can store multiple types + bt::floatT theDefault + ); Template(); const char* getName() const; + const bt::floatT getDefault() const; bool isValid() const; private: enzo::prm::Type type_; + bt::floatT default_; // TODO: make a class that holds token and name const char* name_; diff --git a/src/Gui/Network/TabMenu.h b/src/Gui/Network/TabMenu.h index 12f6f65..fa158bc 100644 --- a/src/Gui/Network/TabMenu.h +++ b/src/Gui/Network/TabMenu.h @@ -59,7 +59,7 @@ protected: void focusOutEvent(QFocusEvent *event) override; bool event(QEvent *event) override; // void resizeEvent(QResizeEvent *event) override; -protected slots: +protected Q_SLOTS: void nodeClicked(); }; diff --git a/src/Gui/Parameters/AbstractFormParm.cpp b/src/Gui/Parameters/AbstractFormParm.cpp index 64f605a..629c413 100644 --- a/src/Gui/Parameters/AbstractFormParm.cpp +++ b/src/Gui/Parameters/AbstractFormParm.cpp @@ -16,7 +16,6 @@ enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr param label->setSizePolicy(QSizePolicy::Maximum, QSizePolicy::Preferred); auto slider = new AbstractSliderParm(); - connect(slider, &AbstractSliderParm::valueChanged, this, &AbstractFormParm::changeValue); slider->setValue(sharedParameter->evalFloat()); mainLayout_ = new QHBoxLayout(); @@ -28,6 +27,8 @@ enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr param setProperty("class", "Parameter"); setStyleSheet(".Parameter { background-color: none;}"); setLayout(mainLayout_); + + connect(slider, &AbstractSliderParm::valueChanged, this, &AbstractFormParm::changeValue); } } diff --git a/src/Gui/Parameters/AbstractFormParm.h b/src/Gui/Parameters/AbstractFormParm.h index d2279bb..3b58e89 100644 --- a/src/Gui/Parameters/AbstractFormParm.h +++ b/src/Gui/Parameters/AbstractFormParm.h @@ -2,6 +2,7 @@ #include #include #include +#include namespace enzo::ui { @@ -9,13 +10,13 @@ namespace enzo::ui class AbstractFormParm : public QWidget { + Q_OBJECT public: AbstractFormParm(std::weak_ptr parameter); -protected slots: +protected Q_SLOTS: void changeValue(bt::floatT value); - private: QHBoxLayout* mainLayout_; std::weak_ptr parameter_; diff --git a/src/Gui/Parameters/AbstractSliderParm.h b/src/Gui/Parameters/AbstractSliderParm.h index 640321c..1e28496 100644 --- a/src/Gui/Parameters/AbstractSliderParm.h +++ b/src/Gui/Parameters/AbstractSliderParm.h @@ -15,7 +15,7 @@ public: AbstractSliderParm(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); void setValue(bt::floatT value); -signals: +Q_SIGNALS: void valueChanged(bt::floatT value); private: diff --git a/src/Gui/ParametersPanel/ParametersPanel.h b/src/Gui/ParametersPanel/ParametersPanel.h index 8749474..5a99de1 100644 --- a/src/Gui/ParametersPanel/ParametersPanel.h +++ b/src/Gui/ParametersPanel/ParametersPanel.h @@ -8,7 +8,7 @@ class ParametersPanel { public: ParametersPanel(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); -public slots: +public Q_SLOTS: void selectionChanged(); private: QVBoxLayout* mainLayout_; diff --git a/src/Gui/Viewport/Viewport.h b/src/Gui/Viewport/Viewport.h index bf63d68..fe86376 100644 --- a/src/Gui/Viewport/Viewport.h +++ b/src/Gui/Viewport/Viewport.h @@ -23,6 +23,6 @@ private: QPointF leftStartPos_; bool rightMouseDown_=false; QPointF rightStartPos_; -public slots: +public Q_SLOTS: void geometryChanged(enzo::geo::Geometry& geometry); }; diff --git a/src/Gui/Viewport/ViewportGLWidget.h b/src/Gui/Viewport/ViewportGLWidget.h index 0c02d31..2917873 100644 --- a/src/Gui/Viewport/ViewportGLWidget.h +++ b/src/Gui/Viewport/ViewportGLWidget.h @@ -25,6 +25,6 @@ protected: void resizeGL(int w, int h) override; void paintGL() override; -public slots: +public Q_SLOTS: void geometryChanged(enzo::geo::Geometry& geometry); }; diff --git a/src/OpDefs/GopHouse.cpp b/src/OpDefs/GopHouse.cpp index 4610be1..beacaf5 100644 --- a/src/OpDefs/GopHouse.cpp +++ b/src/OpDefs/GopHouse.cpp @@ -48,7 +48,7 @@ void GOP_house::cookOp(enzo::op::Context context) for(int i=0; i Date: Thu, 24 Jul 2025 02:34:36 +0100 Subject: [PATCH 11/11] feat(parameters): signal on parameter change --- src/Engine/Network/NetworkManager.cpp | 38 +++++++++++++++--------- src/Engine/Network/NetworkManager.h | 4 +++ src/Engine/Operator/GeometryOperator.cpp | 14 +++++++-- src/Engine/Operator/GeometryOperator.h | 7 +++++ src/Engine/Parameter/Parameter.cpp | 2 +- src/Engine/Parameter/Parameter.h | 2 ++ src/Gui/Interface.cpp | 3 +- 7 files changed, 51 insertions(+), 19 deletions(-) diff --git a/src/Engine/Network/NetworkManager.cpp b/src/Engine/Network/NetworkManager.cpp index 1768f22..738cb98 100644 --- a/src/Engine/Network/NetworkManager.cpp +++ b/src/Engine/Network/NetworkManager.cpp @@ -15,7 +15,19 @@ enzo::nt::OpId enzo::nt::NetworkManager::addOperator(op::OpInfo opInfo) { maxOpId_++; - gopStore_.emplace(maxOpId_, std::make_unique(maxOpId_, opInfo)); + std::unique_ptr newOp = std::make_unique(maxOpId_, opInfo); + newOp->nodeDirtied.connect( + [this](nt::OpId opId) + { + cookOp(opId); + + if(getDisplayOp()==opId) + { + enzo::nt::GeometryOperator& displayOp = getGeoOperator(opId); + updateDisplay(displayOp.getOutputGeo(0)); + } + }); + gopStore_.emplace(maxOpId_, std::move(newOp)); std::cout << "adding operator " << maxOpId_ << "\n"; return maxOpId_; @@ -51,27 +63,25 @@ bool enzo::nt::NetworkManager::isValidOp(nt::OpId opId) void enzo::nt::NetworkManager::setDisplayOp(OpId opId) { - std::cout << "gop size before: " << gopStore_.size() <<"\n"; displayOp_=opId; - std::vector dependencyGraph = getDependencyGraph(opId); - enzo::geo::Geometry prevGeometry; - std::cout << "size: " << dependencyGraph.size() << "\n"; + + cookOp(opId); - for(enzo::nt::OpId dependencyOpId : dependencyGraph) - { - cookOp(dependencyOpId); - } - std::cout << "gop size middle: " << gopStore_.size() <<"\n"; // <- size: 1 enzo::nt::GeometryOperator& displayOp = getGeoOperator(opId); updateDisplay(displayOp.getOutputGeo(0)); - std::cout << "gop size after: " << gopStore_.size() <<"\n"; + displayNodeChanged(); } void enzo::nt::NetworkManager::cookOp(enzo::nt::OpId opId) { - enzo::nt::GeometryOperator& op = getGeoOperator(opId); - enzo::op::Context context(opId, enzo::nt::nm()); - op.cookOp(context); + std::vector dependencyGraph = getDependencyGraph(opId); + + for(enzo::nt::OpId dependencyOpId : dependencyGraph) + { + enzo::nt::GeometryOperator& op = getGeoOperator(dependencyOpId); + enzo::op::Context context(dependencyOpId, enzo::nt::nm()); + op.cookOp(context); + } } std::vector enzo::nt::NetworkManager::getDependencyGraph(enzo::nt::OpId opId) diff --git a/src/Engine/Network/NetworkManager.h b/src/Engine/Network/NetworkManager.h index a5a9f3d..87a6043 100644 --- a/src/Engine/Network/NetworkManager.h +++ b/src/Engine/Network/NetworkManager.h @@ -24,6 +24,8 @@ public: GeometryOperator& getGeoOperator(nt::OpId opId); void setDisplayOp(OpId opId); + boost::signals2::signal displayNodeChanged; + #ifdef UNIT_TEST void _reset(); #endif @@ -42,6 +44,8 @@ private: enzo::nt::OpId maxOpId_=0; // operator selected for displaying in the viewport std::optional displayOp_=std::nullopt; + + Q_SIGNALS: void updateDisplay(enzo::geo::Geometry& geometry); diff --git a/src/Engine/Operator/GeometryOperator.cpp b/src/Engine/Operator/GeometryOperator.cpp index 93c0189..f66ee81 100644 --- a/src/Engine/Operator/GeometryOperator.cpp +++ b/src/Engine/Operator/GeometryOperator.cpp @@ -41,16 +41,24 @@ void nt::GeometryOperator::initParameters() { std::cout << "name: " << t->getName() << "\n"; // create parameter - parameters_.push_back( - std::make_shared(*t) - ); + auto parameter = std::make_shared(*t); + parameter->valueChanged.connect(boost::bind(&GeometryOperator::dirtyNode, this)); + + parameters_.push_back(parameter); } } +void enzo::nt::GeometryOperator::dirtyNode() +{ + dirty_=true; + nodeDirtied(opId_); +} + void enzo::nt::GeometryOperator::cookOp(op::Context context) { opDef_->cookOp(context); + dirty_=false; } geo::Geometry& enzo::nt::GeometryOperator::getOutputGeo(unsigned outputIndex) diff --git a/src/Engine/Operator/GeometryOperator.h b/src/Engine/Operator/GeometryOperator.h index e4a0513..827114f 100644 --- a/src/Engine/Operator/GeometryOperator.h +++ b/src/Engine/Operator/GeometryOperator.h @@ -29,10 +29,16 @@ public: std::vector> getParameters(); std::weak_ptr getParameter(std::string parameterName); + void dirtyNode(); + unsigned int getMaxInputs() const; unsigned int getMaxOutputs() const; + // signals + boost::signals2::signal nodeDirtied; + + private: void initParameters(); @@ -46,5 +52,6 @@ private: std::unique_ptr opDef_; enzo::nt::OpId opId_; enzo::op::OpInfo opInfo_; + bool dirty_ = true; }; } diff --git a/src/Engine/Parameter/Parameter.cpp b/src/Engine/Parameter/Parameter.cpp index 4f22343..bbe193e 100644 --- a/src/Engine/Parameter/Parameter.cpp +++ b/src/Engine/Parameter/Parameter.cpp @@ -1,7 +1,6 @@ #include "Engine/Parameter/Parameter.h" #include - enzo::prm::Parameter::Parameter(Template prmTemplate) : template_{prmTemplate} { @@ -21,5 +20,6 @@ enzo::bt::floatT enzo::prm::Parameter::evalFloat() const void enzo::prm::Parameter::setFloat(bt::floatT value) { floatValue_ = value; + valueChanged(); } diff --git a/src/Engine/Parameter/Parameter.h b/src/Engine/Parameter/Parameter.h index e2ce818..dbf9cba 100644 --- a/src/Engine/Parameter/Parameter.h +++ b/src/Engine/Parameter/Parameter.h @@ -1,6 +1,7 @@ #pragma once #include "Engine/Parameter/Template.h" #include "Engine/Types.h" +#include namespace enzo::prm { @@ -11,6 +12,7 @@ public: std::string getName() const; bt::floatT evalFloat() const; void setFloat(bt::floatT value); + boost::signals2::signal valueChanged; private: Template template_; bt::floatT floatValue_ = 0; diff --git a/src/Gui/Interface.cpp b/src/Gui/Interface.cpp index ffd80cf..9a6a1bf 100644 --- a/src/Gui/Interface.cpp +++ b/src/Gui/Interface.cpp @@ -55,7 +55,8 @@ EnzoUI::EnzoUI() // connect signals connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, viewport, &Viewport::geometryChanged); - connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, parametersPanel, &ParametersPanel::selectionChanged); + enzo::nt::nm().displayNodeChanged.connect([parametersPanel](){parametersPanel->selectionChanged();}); + // connect(&enzo::nt::nm(), &enzo::nt::NetworkManager::updateDisplay, parametersPanel, &ParametersPanel::selectionChanged); // ─── end of EnzoUI ctor ─── QTimer::singleShot(0, this, [=] {