implement random nodes

This commit is contained in:
sshumakov3
2021-01-15 14:57:42 +03:00
parent 166a4e5a9e
commit 2587c74d42
8 changed files with 350 additions and 0 deletions

View File

@@ -0,0 +1,48 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#include "RandomDecimalNode.hpp"
#include <noggit/Red/NodeEditor/Nodes/BaseNode.inl>
#include <noggit/Red/NodeEditor/Nodes/DataTypes/GenericData.hpp>
#include <QRandomGenerator>
using namespace noggit::Red::NodeEditor::Nodes;
RandomDecimalNode::RandomDecimalNode()
: BaseNode()
{
setName("RandomDecimalNode");
setCaption("Random Decimal");
_validation_state = NodeValidationState::Valid;
addPortDefault<IntegerData>(PortType::In, "Seed", true);
addPort<DecimalData>(PortType::Out, "Decimal", true);
}
void RandomDecimalNode::compute()
{
QRandomGenerator rand;
rand.seed(defaultPortData<IntegerData>(PortType::In, 0)->value());
_out_ports[0].out_value = std::make_shared<DecimalData>(rand.generateDouble());
Q_EMIT dataUpdated(0);
}
QJsonObject RandomDecimalNode::save() const
{
QJsonObject json_obj = BaseNode::save();
defaultWidgetToJson(PortType::In, 0, json_obj, "seed");
return json_obj;
}
void RandomDecimalNode::restore(const QJsonObject& json_obj)
{
BaseNode::restore(json_obj);
defaultWidgetFromJson(PortType::In, 0, json_obj, "seed");
}

View File

@@ -0,0 +1,36 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#ifndef NOGGIT_RANDOMDECIMALNODE_HPP
#define NOGGIT_RANDOMDECIMALNODE_HPP
#include <noggit/Red/NodeEditor/Nodes/BaseNode.hpp>
using QtNodes::PortType;
using QtNodes::PortIndex;
using QtNodes::NodeData;
using QtNodes::NodeDataType;
using QtNodes::NodeDataModel;
using QtNodes::NodeValidationState;
namespace noggit
{
namespace Red::NodeEditor::Nodes
{
class RandomDecimalNode : public BaseNode
{
Q_OBJECT
public:
RandomDecimalNode();
void compute() override;
QJsonObject save() const override;
void restore(QJsonObject const& json_obj) override;
};
}
}
#endif //NOGGIT_RANDOMDECIMALNODE_HPP

View File

@@ -0,0 +1,51 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#include "RandomDecimalRangeNode.hpp"
#include <noggit/Red/NodeEditor/Nodes/BaseNode.inl>
#include <noggit/Red/NodeEditor/Nodes/DataTypes/GenericData.hpp>
#include <QRandomGenerator>
using namespace noggit::Red::NodeEditor::Nodes;
RandomDecimalRangeNode::RandomDecimalRangeNode()
: BaseNode()
{
setName("RandomDecimalRangeNode");
setCaption("Random Decimal Range");
_validation_state = NodeValidationState::Valid;
addPortDefault<IntegerData>(PortType::In, "Seed", true);
addPortDefault<DecimalData>(PortType::In, "Highest<Decimal>", true);
addPort<DecimalData>(PortType::Out, "Decimal", true);
}
void RandomDecimalRangeNode::compute()
{
QRandomGenerator rand;
rand.seed(defaultPortData<DecimalData>(PortType::In, 0)->value());
double highest = defaultPortData<DecimalData>(PortType::In, 1)->value();
_out_ports[0].out_value = std::make_shared<DecimalData>(rand.bounded(highest));
Q_EMIT dataUpdated(0);
}
QJsonObject RandomDecimalRangeNode::save() const
{
QJsonObject json_obj = BaseNode::save();
defaultWidgetToJson(PortType::In, 0, json_obj, "seed");
defaultWidgetToJson(PortType::In, 1, json_obj, "highest");
return json_obj;
}
void RandomDecimalRangeNode::restore(const QJsonObject& json_obj)
{
BaseNode::restore(json_obj);
defaultWidgetFromJson(PortType::In, 0, json_obj, "seed");
defaultWidgetFromJson(PortType::In, 1, json_obj, "highest");
}

View File

@@ -0,0 +1,35 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#ifndef NOGGIT_RANDOMDECIMALRANGENODE_HPP
#define NOGGIT_RANDOMDECIMALRANGENODE_HPP
#include <noggit/Red/NodeEditor/Nodes/BaseNode.hpp>
using QtNodes::PortType;
using QtNodes::PortIndex;
using QtNodes::NodeData;
using QtNodes::NodeDataType;
using QtNodes::NodeDataModel;
using QtNodes::NodeValidationState;
namespace noggit
{
namespace Red::NodeEditor::Nodes
{
class RandomDecimalRangeNode : public BaseNode
{
Q_OBJECT
public:
RandomDecimalRangeNode();
void compute() override;
QJsonObject save() const override;
void restore(QJsonObject const& json_obj) override;
};
}
}
#endif //NOGGIT_RANDOMDECIMALRANGENODE_HPP

View File

@@ -0,0 +1,48 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#include "RandomIntegerNode.hpp"
#include <noggit/Red/NodeEditor/Nodes/BaseNode.inl>
#include <noggit/Red/NodeEditor/Nodes/DataTypes/GenericData.hpp>
#include <QRandomGenerator>
using namespace noggit::Red::NodeEditor::Nodes;
RandomIntegerNode::RandomIntegerNode()
: BaseNode()
{
setName("RandomIntegerNode");
setCaption("Random Integer");
_validation_state = NodeValidationState::Valid;
addPortDefault<IntegerData>(PortType::In, "Seed", true);
addPort<IntegerData>(PortType::Out, "Integer", true);
}
void RandomIntegerNode::compute()
{
QRandomGenerator rand;
rand.seed(defaultPortData<IntegerData>(PortType::In, 0)->value());
_out_ports[0].out_value = std::make_shared<IntegerData>(rand.generate());
Q_EMIT dataUpdated(0);
}
QJsonObject RandomIntegerNode::save() const
{
QJsonObject json_obj = BaseNode::save();
defaultWidgetToJson(PortType::In, 0, json_obj, "seed");
return json_obj;
}
void RandomIntegerNode::restore(const QJsonObject& json_obj)
{
BaseNode::restore(json_obj);
defaultWidgetFromJson(PortType::In, 0, json_obj, "seed");
}

View File

@@ -0,0 +1,35 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#ifndef NOGGIT_RANDOMINTEGERNODE_HPP
#define NOGGIT_RANDOMINTEGERNODE_HPP
#include <noggit/Red/NodeEditor/Nodes/BaseNode.hpp>
using QtNodes::PortType;
using QtNodes::PortIndex;
using QtNodes::NodeData;
using QtNodes::NodeDataType;
using QtNodes::NodeDataModel;
using QtNodes::NodeValidationState;
namespace noggit
{
namespace Red::NodeEditor::Nodes
{
class RandomIntegerNode : public BaseNode
{
Q_OBJECT
public:
RandomIntegerNode();
void compute() override;
QJsonObject save() const override;
void restore(QJsonObject const& json_obj) override;
};
}
}
#endif //NOGGIT_RANDOMINTEGERNODE_HPP

View File

@@ -0,0 +1,62 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#include "RandomIntegerRangeNode.hpp"
#include <noggit/Red/NodeEditor/Nodes/BaseNode.inl>
#include <noggit/Red/NodeEditor/Nodes/DataTypes/GenericData.hpp>
#include <QRandomGenerator>
using namespace noggit::Red::NodeEditor::Nodes;
RandomIntegerRangeNode::RandomIntegerRangeNode()
: BaseNode()
{
setName("RandomIntegerRangeNode");
setCaption("Random Integer Range");
_validation_state = NodeValidationState::Valid;
addPortDefault<IntegerData>(PortType::In, "Seed", true);
addPortDefault<IntegerData>(PortType::In, "MinInclusive<Integer>", true);
addPortDefault<IntegerData>(PortType::In, "MaxExclusive<Integer>", true);
addPort<IntegerData>(PortType::Out, "Integer", true);
}
void RandomIntegerRangeNode::compute()
{
QRandomGenerator rand;
rand.seed(defaultPortData<IntegerData>(PortType::In, 0)->value());
int lowest = defaultPortData<IntegerData>(PortType::In, 1)->value();
int highest = defaultPortData<IntegerData>(PortType::In, 2)->value();
if (lowest >= highest)
{
setValidationState(NodeValidationState::Error);
setValidationMessage("Error: incorrect range.");
return;
}
_out_ports[0].out_value = std::make_shared<IntegerData>(rand.bounded(lowest, highest));
Q_EMIT dataUpdated(0);
}
QJsonObject RandomIntegerRangeNode::save() const
{
QJsonObject json_obj = BaseNode::save();
defaultWidgetToJson(PortType::In, 0, json_obj, "seed");
defaultWidgetToJson(PortType::In, 1, json_obj, "min_inclusive");
defaultWidgetToJson(PortType::In, 2, json_obj, "max_exclusive");
return json_obj;
}
void RandomIntegerRangeNode::restore(const QJsonObject& json_obj)
{
BaseNode::restore(json_obj);
defaultWidgetFromJson(PortType::In, 0, json_obj, "seed");
defaultWidgetFromJson(PortType::In, 1, json_obj, "min_inclusive");
defaultWidgetFromJson(PortType::In, 2, json_obj, "max_exclusive");
}

View File

@@ -0,0 +1,35 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#ifndef NOGGIT_RANDOMINTEGERRANGENODE_HPP
#define NOGGIT_RANDOMINTEGERRANGENODE_HPP
#include <noggit/Red/NodeEditor/Nodes/BaseNode.hpp>
using QtNodes::PortType;
using QtNodes::PortIndex;
using QtNodes::NodeData;
using QtNodes::NodeDataType;
using QtNodes::NodeDataModel;
using QtNodes::NodeValidationState;
namespace noggit
{
namespace Red::NodeEditor::Nodes
{
class RandomIntegerRangeNode : public BaseNode
{
Q_OBJECT
public:
RandomIntegerRangeNode();
void compute() override;
QJsonObject save() const override;
void restore(QJsonObject const& json_obj) override;
};
}
}
#endif //NOGGIT_RANDOMINTEGERRANGENODE_HPP