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/Parameter/Template.cpp
src/Engine/Parameter/Parameter.cpp
src/Engine/Parameter/Default.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/Default.h"
#include "Engine/Types.h"
#include <algorithm>
#include <iostream>
#include <stdexcept>
#include <string>
@@ -7,8 +9,33 @@
enzo::prm::Parameter::Parameter(Template prmTemplate)
: template_{prmTemplate}
{
floatValues_ = std::vector<bt::floatT>(prmTemplate.getSize(), prmTemplate.getDefault());
stringValues_ = std::vector<bt::String>(prmTemplate.getSize(), "default");
floatValues_ = std::vector<bt::floatT>();
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";
}

View File

@@ -1,12 +1,32 @@
#include "Engine/Parameter/Template.h"
#include "Engine/Parameter/Default.h"
#include "Engine/Parameter/Type.h"
enzo::prm::Template::Template(enzo::prm::Type type, const char* name, bt::floatT theDefault, unsigned int vectorSize)
: type_{type}, name_{name}, default_{theDefault}, vectorSize_(vectorSize)
enzo::prm::Template::Template(enzo::prm::Type type, const char* name)
: 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()
{
@@ -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
{
return name_;

View File

@@ -1,4 +1,5 @@
#pragma once
#include "Engine/Parameter/Default.h"
#include "Engine/Parameter/Type.h"
#include "Engine/Types.h"
@@ -8,22 +9,37 @@ 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,
unsigned int vectorSize
);
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
);
Template();
const char* getName() const;
const bt::floatT getDefault() const;
const prm::Default getDefault(unsigned int index=0) const;
const prm::Type getType() const;
const unsigned int getSize() const;
const unsigned int getNumDefaults() const;
bool isValid() const;
private:
enzo::prm::Type type_;
bt::floatT default_;
std::vector<prm::Default> defaults_;
// TODO: make a class that holds token and name
const char* name_;
unsigned int vectorSize_;

View File

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

View File

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

View File

@@ -12,7 +12,7 @@ class AbstractSliderParm
{
Q_OBJECT
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);
Q_SIGNALS:
@@ -23,12 +23,13 @@ private:
QVBoxLayout* mainLayout_;
QLabel* valueLabel_;
bt::floatT value_;
float defaultValue_=0;
bool clampMin_ = true;
bool clampMax_ = true;
bt::floatT minValue_=-5;
bt::floatT maxValue_=10;
void setValueImpl(bt::floatT value);
protected:
void paintEvent(QPaintEvent *event) override;
void mouseMoveEvent(QMouseEvent *event) override;

View File

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

View File

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

View File

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

View File

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

View File

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