feat: add type agnostic parameter defaults

This commit is contained in:
parker
2025-08-03 23:57:31 +01:00
parent 0af1c65996
commit 3d65b13e1b
14 changed files with 146 additions and 34 deletions

View File

@@ -22,6 +22,7 @@ set(ENGINE_SOURCES
src/Engine/Operator/Context.cpp src/Engine/Operator/Context.cpp
src/Engine/Parameter/Template.cpp src/Engine/Parameter/Template.cpp
src/Engine/Parameter/Parameter.cpp src/Engine/Parameter/Parameter.cpp
src/Engine/Parameter/Default.cpp
src/Engine/Network/NetworkManager.cpp src/Engine/Network/NetworkManager.cpp
) )

View File

@@ -0,0 +1,8 @@
#include "Engine/Parameter/Default.h"
enzo::prm::Default::Default(bt::floatT floatDefault, const char *stringDefault)
: floatDefault_{floatDefault}, stringDefault_{stringDefault}
{
}

View File

@@ -0,0 +1,27 @@
#pragma once
#include "Engine/Types.h"
namespace enzo::prm
{
class Default
{
public:
Default(bt::floatT floatDefault=0, const char *stringDefault = ""
// TODO: add string meaning eg.
// , CH_StringMeaning string_meaning = CH_STRING_LITERAL
);
bt::floatT getFloat() const { return floatDefault_; }
bt::intT getInt() const { return (bt::intT)floatDefault_; }
const char *getString() const { return stringDefault_; }
void set(bt::floatT thefloat, const char *thestring);
void setFloat(bt::floatT value) { floatDefault_ = value; }
void setInt(bt::intT value) { floatDefault_ = (bt::intT)value; }
void setString(const char *value) { stringDefault_ = value; }
private:
bt::floatT floatDefault_;
const char* stringDefault_;
};
}

View File

@@ -1,5 +1,7 @@
#include "Engine/Parameter/Parameter.h" #include "Engine/Parameter/Parameter.h"
#include "Engine/Parameter/Default.h"
#include "Engine/Types.h" #include "Engine/Types.h"
#include <algorithm>
#include <iostream> #include <iostream>
#include <stdexcept> #include <stdexcept>
#include <string> #include <string>
@@ -7,8 +9,33 @@
enzo::prm::Parameter::Parameter(Template prmTemplate) enzo::prm::Parameter::Parameter(Template prmTemplate)
: template_{prmTemplate} : template_{prmTemplate}
{ {
floatValues_ = std::vector<bt::floatT>(prmTemplate.getSize(), prmTemplate.getDefault()); floatValues_ = std::vector<bt::floatT>();
stringValues_ = std::vector<bt::String>(prmTemplate.getSize(), "default"); floatValues_.reserve(prmTemplate.getSize());
stringValues_ = std::vector<bt::String>(prmTemplate.getSize(), prmTemplate.getDefault().getString());
stringValues_.reserve(prmTemplate.getSize());
const unsigned int templateSize = prmTemplate.getSize();
const unsigned int numDefaults = prmTemplate.getNumDefaults();
if(numDefaults==1)
{
floatValues_ = std::vector<bt::floatT>(templateSize, prmTemplate.getDefault().getFloat());
stringValues_ = std::vector<bt::String>(templateSize, prmTemplate.getDefault().getString());
}
for(int i=0; i<templateSize; ++i)
{
prm::Default prmDefault;
if(i<numDefaults)
{
prmDefault = prmTemplate.getDefault(i);
}
floatValues_.push_back(prmDefault.getFloat());
stringValues_.push_back(prmDefault.getString());
}
std::cout << "created new parameter: " << prmTemplate.getName() << "\n"; std::cout << "created new parameter: " << prmTemplate.getName() << "\n";
} }

View File

@@ -1,12 +1,32 @@
#include "Engine/Parameter/Template.h" #include "Engine/Parameter/Template.h"
#include "Engine/Parameter/Default.h"
#include "Engine/Parameter/Type.h" #include "Engine/Parameter/Type.h"
enzo::prm::Template::Template(enzo::prm::Type type, const char* name, bt::floatT theDefault, unsigned int vectorSize) enzo::prm::Template::Template(enzo::prm::Type type, const char* name)
: type_{type}, name_{name}, default_{theDefault}, vectorSize_(vectorSize) : Template(type, name, prm::Default())
{ {
} }
enzo::prm::Template::Template(enzo::prm::Type type, const char* name, unsigned int vectorSize)
: Template(type, name, prm::Default(), vectorSize)
{
}
enzo::prm::Template::Template(enzo::prm::Type type, const char* name, std::vector<prm::Default> defaults, unsigned int vectorSize)
: type_{type}, name_{name}, defaults_{defaults}, vectorSize_(vectorSize)
{
}
enzo::prm::Template::Template(enzo::prm::Type type, const char* name, prm::Default theDefault, unsigned int vectorSize)
: type_{type}, name_{name}, vectorSize_(vectorSize)
{
defaults_.push_back(theDefault);
}
enzo::prm::Template::Template() enzo::prm::Template::Template()
{ {
@@ -30,11 +50,17 @@ const unsigned int enzo::prm::Template::getSize() const
const enzo::bt::floatT enzo::prm::Template::getDefault() const const enzo::prm::Default enzo::prm::Template::getDefault(unsigned int index) const
{ {
return default_; return defaults_.at(index);
} }
const unsigned int enzo::prm::Template::getNumDefaults() const
{
return defaults_.size();
}
const char* enzo::prm::Template::getName() const const char* enzo::prm::Template::getName() const
{ {
return name_; return name_;

View File

@@ -1,4 +1,5 @@
#pragma once #pragma once
#include "Engine/Parameter/Default.h"
#include "Engine/Parameter/Type.h" #include "Engine/Parameter/Type.h"
#include "Engine/Types.h" #include "Engine/Types.h"
@@ -8,22 +9,37 @@ namespace enzo::prm
class Template class Template
{ {
public: public:
Template(
enzo::prm::Type type,
const char* name
);
Template( Template(
enzo::prm::Type type, enzo::prm::Type type,
const char* name, const char* name,
// TODO: change default to class that can store multiple types unsigned int vectorSize
bt::floatT theDefault, );
Template(
enzo::prm::Type type,
const char* name,
std::vector<prm::Default> defaults,
unsigned int vectorSize = 1
);
Template(
enzo::prm::Type type,
const char* name,
prm::Default theDefault,
unsigned int vectorSize = 1 unsigned int vectorSize = 1
); );
Template(); Template();
const char* getName() const; const char* getName() const;
const bt::floatT getDefault() const; const prm::Default getDefault(unsigned int index=0) const;
const prm::Type getType() const; const prm::Type getType() const;
const unsigned int getSize() const; const unsigned int getSize() const;
const unsigned int getNumDefaults() const;
bool isValid() const; bool isValid() const;
private: private:
enzo::prm::Type type_; enzo::prm::Type type_;
bt::floatT default_; std::vector<prm::Default> defaults_;
// TODO: make a class that holds token and name // TODO: make a class that holds token and name
const char* name_; const char* name_;
unsigned int vectorSize_; unsigned int vectorSize_;

View File

@@ -28,18 +28,16 @@ enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr<prm::Parameter> param
case prm::Type::FLOAT: case prm::Type::FLOAT:
{ {
AbstractSliderParm* slider; AbstractSliderParm* slider;
slider = new AbstractSliderParm(); slider = new AbstractSliderParm(sharedParameter->evalFloat());
slider->setValue(sharedParameter->evalFloat());
mainLayout_->addWidget(slider); mainLayout_->addWidget(slider);
connect(slider, &AbstractSliderParm::valueChanged, this, [this](bt::floatT value){this->changeValue(value, 0);}); connect(slider, &AbstractSliderParm::valueChanged, this, [this](bt::floatT value){this->changeValue(value, 0);});
break; break;
} }
case prm::Type::XYZ: case prm::Type::XYZ:
{ {
AbstractSliderParm* slider1 = new AbstractSliderParm(); AbstractSliderParm* slider1 = new AbstractSliderParm(sharedParameter->evalFloat(0));
AbstractSliderParm* slider2 = new AbstractSliderParm(); AbstractSliderParm* slider2 = new AbstractSliderParm(sharedParameter->evalFloat(1));
AbstractSliderParm* slider3 = new AbstractSliderParm(); AbstractSliderParm* slider3 = new AbstractSliderParm(sharedParameter->evalFloat(2));
slider1->setValue(sharedParameter->evalFloat());
QHBoxLayout* vectorLayout = new QHBoxLayout(); QHBoxLayout* vectorLayout = new QHBoxLayout();
vectorLayout->addWidget(slider1); vectorLayout->addWidget(slider1);
vectorLayout->addWidget(slider2); vectorLayout->addWidget(slider2);
@@ -52,7 +50,7 @@ enzo::ui::AbstractFormParm::AbstractFormParm(std::weak_ptr<prm::Parameter> param
} }
case prm::Type::STRING: case prm::Type::STRING:
{ {
StringParm* stringParm = new StringParm(); StringParm* stringParm = new StringParm(sharedParameter->evalString());
connect(stringParm, &StringParm::valueChanged, this, [this](bt::String value){this->changeValue(value, 0);}); connect(stringParm, &StringParm::valueChanged, this, [this](bt::String value){this->changeValue(value, 0);});

View File

@@ -10,13 +10,13 @@
#include <string> #include <string>
enzo::ui::AbstractSliderParm::AbstractSliderParm(QWidget *parent, Qt::WindowFlags f) enzo::ui::AbstractSliderParm::AbstractSliderParm(bt::floatT value, QWidget *parent, Qt::WindowFlags f)
: QWidget(parent, f) : QWidget(parent, f)
{ {
// tells qt to style the widget even though it's a Q_OBJECT // tells qt to style the widget even though it's a Q_OBJECT
setAttribute(Qt::WA_StyledBackground, true); setAttribute(Qt::WA_StyledBackground, true);
setFixedHeight(24); setFixedHeight(24);
value_ = defaultValue_;
mainLayout_ = new QVBoxLayout(); mainLayout_ = new QVBoxLayout();
setLayout(mainLayout_); setLayout(mainLayout_);
@@ -34,7 +34,7 @@ enzo::ui::AbstractSliderParm::AbstractSliderParm(QWidget *parent, Qt::WindowFlag
)"); )");
mainLayout_->addWidget(valueLabel_); mainLayout_->addWidget(valueLabel_);
setValue(value_); setValueImpl(value);
} }
void enzo::ui::AbstractSliderParm::paintEvent(QPaintEvent *event) void enzo::ui::AbstractSliderParm::paintEvent(QPaintEvent *event)
@@ -53,20 +53,24 @@ void enzo::ui::AbstractSliderParm::paintEvent(QPaintEvent *event)
} }
void enzo::ui::AbstractSliderParm::setValue(bt::floatT value) void enzo::ui::AbstractSliderParm::setValueImpl(bt::floatT value)
{ {
// if(value_==value)
// return;
if(clampMin_ && value<minValue_) { value = minValue_; } if(clampMin_ && value<minValue_) { value = minValue_; }
if(clampMax_ && value>maxValue_) { value = maxValue_; } if(clampMax_ && value>maxValue_) { value = maxValue_; }
value_ = value; value_ = value;
update(); QString valStr = QString::number(value_);
QString valStr = QString::number(value);
valStr.truncate(4); valStr.truncate(4);
valueLabel_->setText(valStr); valueLabel_->setText(valStr);
}
void enzo::ui::AbstractSliderParm::setValue(bt::floatT value)
{
setValueImpl(value);
update();
valueChanged(value_); valueChanged(value_);
} }

View File

@@ -12,7 +12,7 @@ class AbstractSliderParm
{ {
Q_OBJECT Q_OBJECT
public: public:
AbstractSliderParm(QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags()); AbstractSliderParm(bt::floatT value, QWidget *parent = nullptr, Qt::WindowFlags f = Qt::WindowFlags());
void setValue(bt::floatT value); void setValue(bt::floatT value);
Q_SIGNALS: Q_SIGNALS:
@@ -23,12 +23,13 @@ private:
QVBoxLayout* mainLayout_; QVBoxLayout* mainLayout_;
QLabel* valueLabel_; QLabel* valueLabel_;
bt::floatT value_; bt::floatT value_;
float defaultValue_=0;
bool clampMin_ = true; bool clampMin_ = true;
bool clampMax_ = true; bool clampMax_ = true;
bt::floatT minValue_=-5; bt::floatT minValue_=-5;
bt::floatT maxValue_=10; bt::floatT maxValue_=10;
void setValueImpl(bt::floatT value);
protected: protected:
void paintEvent(QPaintEvent *event) override; void paintEvent(QPaintEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override; void mouseMoveEvent(QMouseEvent *event) override;

View File

@@ -11,13 +11,16 @@
#include <string> #include <string>
enzo::ui::StringParm::StringParm(QWidget *parent) enzo::ui::StringParm::StringParm(bt::String value, QWidget *parent)
: QLineEdit(parent) : QLineEdit(parent)
{ {
// tells qt to style the widget even though it's a Q_OBJECT // tells qt to style the widget even though it's a Q_OBJECT
setAttribute(Qt::WA_StyledBackground, true); setAttribute(Qt::WA_StyledBackground, true);
setFixedHeight(24); setFixedHeight(24);
value_ = value;
setText(QString::fromStdString(value_));
// setAlignment(Qt::AlignCenter); // setAlignment(Qt::AlignCenter);
// setStyleSheet("background-color: none;"); // setStyleSheet("background-color: none;");

View File

@@ -13,7 +13,7 @@ class StringParm
{ {
Q_OBJECT Q_OBJECT
public: public:
StringParm(QWidget *parent = nullptr); StringParm(bt::String value, QWidget *parent = nullptr);
void setValue(bt::String value); void setValue(bt::String value);
void setValueQString(QString value); void setValueQString(QString value);

View File

@@ -19,6 +19,7 @@ add_library(${libName} SHARED
../Engine/Network/NetworkManager.cpp ../Engine/Network/NetworkManager.cpp
../Engine/Parameter/Template.cpp ../Engine/Parameter/Template.cpp
../Engine/Parameter/Parameter.cpp ../Engine/Parameter/Parameter.cpp
../Engine/Parameter/Default.cpp
GopTransform.cpp GopTransform.cpp
GopHouse.cpp GopHouse.cpp
GopTestCube.cpp GopTestCube.cpp

View File

@@ -122,7 +122,7 @@ void GopGeometryImport::cookOp(enzo::op::Context context)
enzo::prm::Template GopGeometryImport::parameterList[] = enzo::prm::Template GopGeometryImport::parameterList[] =
{ {
enzo::prm::Template(enzo::prm::Type::STRING, "filePath", 1), enzo::prm::Template(enzo::prm::Type::STRING, "filePath"),
enzo::prm::Template(enzo::prm::Type::FLOAT, "size", 1), enzo::prm::Template(enzo::prm::Type::FLOAT, "size", enzo::prm::Default(1)),
enzo::prm::Terminator enzo::prm::Terminator
}; };

View File

@@ -62,8 +62,8 @@ void GopTransform::cookOp(enzo::op::Context context)
enzo::prm::Template GopTransform::parameterList[] = enzo::prm::Template GopTransform::parameterList[] =
{ {
enzo::prm::Template(enzo::prm::Type::XYZ, "translate", 0, 3), enzo::prm::Template(enzo::prm::Type::XYZ, "translate", 3),
enzo::prm::Template(enzo::prm::Type::XYZ, "rotate", 0, 3), enzo::prm::Template(enzo::prm::Type::XYZ, "rotate", 3),
enzo::prm::Terminator enzo::prm::Terminator
}; };