add two last noise nodes

This commit is contained in:
sshumakov3
2021-01-14 02:07:22 +03:00
parent baab859bc5
commit 5cabf8fa1e
5 changed files with 249 additions and 0 deletions

View File

@@ -96,6 +96,8 @@
#include <noggit/Red/NodeEditor/Nodes/Data/Noise/NoiseSelectNode.hpp>
#include <noggit/Red/NodeEditor/Nodes/Data/Noise/NoiseTransformPointNode.hpp>
#include <noggit/Red/NodeEditor/Nodes/Data/Noise/NoiseTurbulenceNode.hpp>
#include <noggit/Red/NodeEditor/Nodes/Data/Noise/NoiseCurveNode.hpp>
#include <noggit/Red/NodeEditor/Nodes/Data/Noise/NoiseTerraceNode.hpp>
#include <noggit/Red/NodeEditor/Nodes/BaseNode.hpp>
#include <noggit/Red/NodeEditor/Nodes/DataTypes/GenericTypeConverter.hpp>
@@ -197,6 +199,8 @@ namespace noggit
ret->registerModel<NoiseExponentNode>("Data//Noise//Modifiers");
ret->registerModel<NoiseInvertNode>("Data//Noise//Modifiers");
ret->registerModel<NoiseScaleBiasNode>("Data//Noise//Modifiers");
ret->registerModel<NoiseCurveNode>("Data//Noise//Modifiers");
ret->registerModel<NoiseTerraceNode>("Data//Noise//Modifiers");
ret->registerModel<NoiseBlendNode>("Data//Noise//Selectors");
ret->registerModel<NoiseSelectNode>("Data//Noise//Selectors");
ret->registerModel<NoiseDisplaceNode>("Data//Noise//Transform");

View File

@@ -0,0 +1,77 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#include "NoiseCurveNode.hpp"
#include <noggit/Red/NodeEditor/Nodes/BaseNode.inl>
#include <noggit/Red/NodeEditor/Nodes/DataTypes/GenericData.hpp>
using namespace noggit::Red::NodeEditor::Nodes;
NoiseCurveNode::NoiseCurveNode()
: BaseNode()
{
setName("NoiseCurveNode");
setCaption("Noise Curve");
_validation_state = NodeValidationState::Valid;
addPortDefault<NoiseData>(PortType::In, "Noise", true);
addPortDefault<ListData>(PortType::In, "Points<List[Vector2D]>", true);
_in_ports[1].data_type->set_parameter_type("vec2");
addPort<NoiseData>(PortType::Out, "Noise", true);
}
void NoiseCurveNode::compute()
{
auto module = new noise::module::Curve();
module->SetSourceModule(0, *static_cast<NoiseData*>(_in_ports[0].in_value.lock().get())->value().get());
auto point_list = static_cast<ListData*>(_in_ports[1].in_value.lock().get())->value();
if (point_list->size() < 4)
{
setValidationState(NodeValidationState::Error);
setValidationMessage("Error: input list should contain at least four points.");
return;
}
std::vector<double> points;
for (int i = 0; i < point_list->size(); ++i)
{
glm::vec2 value = static_cast<Vector2DData*>(point_list->at(i).get())->value();
if (std::find(points.begin(), points.end(), value.x) != points.end())
{
setValidationState(NodeValidationState::Error);
setValidationMessage("Error: duplicate points input values found.");
return;
}
module->AddControlPoint(value.x, value.y);
}
std::shared_ptr<noise::module::Module> noise_data;
noise_data.reset(module);
_out_ports[0].out_value = std::make_shared<NoiseData>(noise_data);
Q_EMIT dataUpdated(0);
}
NodeValidationState NoiseCurveNode::validate()
{
if (!static_cast<NoiseData*>(_in_ports[0].in_value.lock().get()))
{
setValidationState(NodeValidationState::Error);
setValidationMessage("Error: failed to evaluate noise input.");
return _validation_state;
}
if (!static_cast<ListData*>(_in_ports[1].in_value.lock().get()))
{
setValidationState(NodeValidationState::Error);
setValidationMessage("Error: failed to evaluate list input.");
return _validation_state;
}
return _validation_state;
}

View File

@@ -0,0 +1,34 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#ifndef NOGGIT_NOISECURVENODE_HPP
#define NOGGIT_NOISECURVENODE_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 NoiseCurveNode : public BaseNode
{
Q_OBJECT
public:
NoiseCurveNode();
NodeValidationState validate() override;
void compute() override;
};
}
}
#endif //NOGGIT_NOISECURVENODE_HPP

View File

@@ -0,0 +1,98 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#include "NoiseTerraceNode.hpp"
#include <noggit/Red/NodeEditor/Nodes/BaseNode.inl>
#include <noggit/Red/NodeEditor/Nodes/DataTypes/GenericData.hpp>
using namespace noggit::Red::NodeEditor::Nodes;
NoiseTerraceNode::NoiseTerraceNode()
: BaseNode()
{
setName("NoiseTerraceNode");
setCaption("Noise Terrace");
_validation_state = NodeValidationState::Valid;
addPortDefault<NoiseData>(PortType::In, "Noise", true);
addPortDefault<ListData>(PortType::In, "Terraces<List[Decimal]>", true);
_in_ports[1].data_type->set_parameter_type("decimal");
addPortDefault<BooleanData>(PortType::In, "Invert<Boolean>", true);
addPort<NoiseData>(PortType::Out, "Noise", true);
}
void NoiseTerraceNode::compute()
{
auto module = new noise::module::Terrace();
module->SetSourceModule(0, *static_cast<NoiseData*>(_in_ports[0].in_value.lock().get())->value().get());
auto point_list = static_cast<ListData*>(_in_ports[1].in_value.lock().get())->value();
if (point_list->size() < 2)
{
setValidationState(NodeValidationState::Error);
setValidationMessage("Error: input list should contain at least two terrace heights.");
return;
}
std::vector<double> points;
for (int i = 0; i < point_list->size(); ++i)
{
double value = static_cast<DecimalData*>(point_list->at(i).get())->value();
if (std::find(points.begin(), points.end(), value) != points.end())
{
setValidationState(NodeValidationState::Error);
setValidationMessage("Error: duplicate terrace heights found.");
return;
}
module->AddControlPoint(value);
}
module->InvertTerraces(defaultPortData<BooleanData>(PortType::In, 2)->value());
std::shared_ptr<noise::module::Module> noise_data;
noise_data.reset(module);
_out_ports[0].out_value = std::make_shared<NoiseData>(noise_data);
Q_EMIT dataUpdated(0);
}
NodeValidationState NoiseTerraceNode::validate()
{
if (!static_cast<NoiseData*>(_in_ports[0].in_value.lock().get()))
{
setValidationState(NodeValidationState::Error);
setValidationMessage("Error: failed to evaluate noise input.");
return _validation_state;
}
if (!static_cast<ListData*>(_in_ports[1].in_value.lock().get()))
{
setValidationState(NodeValidationState::Error);
setValidationMessage("Error: failed to evaluate list input.");
return _validation_state;
}
return _validation_state;
}
QJsonObject NoiseTerraceNode::save() const
{
QJsonObject json_obj = BaseNode::save();
defaultWidgetToJson(PortType::In, 2, json_obj, "invert");
return json_obj;
}
void NoiseTerraceNode::restore(const QJsonObject& json_obj)
{
BaseNode::restore(json_obj);
defaultWidgetFromJson(PortType::In, 2, json_obj, "invert");
}

View File

@@ -0,0 +1,36 @@
// This file is part of Noggit3, licensed under GNU General Public License (version 3).
#ifndef NOGGIT_NOISETERRACENODE_HPP
#define NOGGIT_NOISETERRACENODE_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 NoiseTerraceNode : public BaseNode
{
Q_OBJECT
public:
NoiseTerraceNode();
NodeValidationState validate() override;
void compute() override;
QJsonObject save() const override;
void restore(QJsonObject const& json_obj) override;
};
}
}
#endif //NOGGIT_NOISETERRACENODE_HPP