ShaderNode: Add save/load
This commit is contained in:
@@ -1,5 +1,6 @@
|
||||
#include <ShaderNode/ShaderGraph.hpp>
|
||||
#include <ShaderNode/DataModels/InputValue.hpp>
|
||||
#include <ShaderNode/DataTypes/FloatData.hpp>
|
||||
#include <ShaderNode/DataTypes/VecData.hpp>
|
||||
#include <Nazara/Renderer/ShaderBuilder.hpp>
|
||||
#include <QtWidgets/QFormLayout>
|
||||
@@ -11,7 +12,10 @@ ShaderNode(graph)
|
||||
m_onInputUpdateSlot.Connect(GetGraph().OnInputUpdate, [&](ShaderGraph*, std::size_t inputIndex)
|
||||
{
|
||||
if (m_currentInputIndex == inputIndex)
|
||||
{
|
||||
UpdatePreview();
|
||||
Q_EMIT dataUpdated(0);
|
||||
}
|
||||
});
|
||||
|
||||
if (graph.GetInputCount() > 0)
|
||||
@@ -172,3 +176,19 @@ QString InputValue::validationMessage() const
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
void InputValue::restore(const QJsonObject& data)
|
||||
{
|
||||
m_currentInputText = data["input"].toString().toStdString();
|
||||
OnInputListUpdate();
|
||||
|
||||
ShaderNode::restore(data);
|
||||
}
|
||||
|
||||
QJsonObject InputValue::save() const
|
||||
{
|
||||
QJsonObject data = ShaderNode::save();
|
||||
data["input"] = QString::fromStdString(m_currentInputText);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -37,6 +37,9 @@ class InputValue : public ShaderNode
|
||||
bool ComputePreview(QPixmap& pixmap) override;
|
||||
void OnInputListUpdate();
|
||||
|
||||
void restore(const QJsonObject& data) override;
|
||||
QJsonObject save() const override;
|
||||
|
||||
NazaraSlot(ShaderGraph, OnInputListUpdate, m_onInputListUpdateSlot);
|
||||
NazaraSlot(ShaderGraph, OnInputUpdate, m_onInputUpdateSlot);
|
||||
|
||||
|
||||
@@ -188,3 +188,19 @@ void OutputValue::OnOutputListUpdate()
|
||||
inputIndex++;
|
||||
}
|
||||
}
|
||||
|
||||
void OutputValue::restore(const QJsonObject& data)
|
||||
{
|
||||
m_currentOutputText = data["input"].toString().toStdString();
|
||||
OnOutputListUpdate();
|
||||
|
||||
ShaderNode::restore(data);
|
||||
}
|
||||
|
||||
QJsonObject OutputValue::save() const
|
||||
{
|
||||
QJsonObject data = ShaderNode::save();
|
||||
data["input"] = QString::fromStdString(m_currentOutputText);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -36,6 +36,9 @@ class OutputValue : public ShaderNode
|
||||
bool ComputePreview(QPixmap& pixmap) override;
|
||||
void OnOutputListUpdate();
|
||||
|
||||
void restore(const QJsonObject& data) override;
|
||||
QJsonObject save() const override;
|
||||
|
||||
NazaraSlot(ShaderGraph, OnOutputListUpdate, m_onOutputListUpdateSlot);
|
||||
NazaraSlot(ShaderGraph, OnOutputUpdate, m_onOutputUpdateSlot);
|
||||
|
||||
|
||||
@@ -54,14 +54,25 @@ void SampleTexture::UpdateOutput()
|
||||
float u = float(uvPtr[0]) / 255;
|
||||
float v = float(uvPtr[1]) / 255;
|
||||
|
||||
int texX = std::clamp(int(u * textureWidth), 0, textureWidth - 1);
|
||||
int texY = std::clamp(int(v * textureHeight), 0, textureHeight - 1);
|
||||
int texPixel = (texY * textureWidth + texX) * 4;
|
||||
if (textureWidth > 0 && textureHeight > 0)
|
||||
{
|
||||
int texX = std::clamp(int(u * textureWidth), 0, textureWidth - 1);
|
||||
int texY = std::clamp(int(v * textureHeight), 0, textureHeight - 1);
|
||||
int texPixel = (texY * textureWidth + texX) * 4;
|
||||
|
||||
*outputPtr++ = texturePtr[texPixel + 0];
|
||||
*outputPtr++ = texturePtr[texPixel + 1];
|
||||
*outputPtr++ = texturePtr[texPixel + 2];
|
||||
*outputPtr++ = texturePtr[texPixel + 3];
|
||||
}
|
||||
else
|
||||
{
|
||||
*outputPtr++ = 0;
|
||||
*outputPtr++ = 0;
|
||||
*outputPtr++ = 0;
|
||||
*outputPtr++ = 0xFF;
|
||||
}
|
||||
|
||||
*outputPtr++ = texturePtr[texPixel + 0];
|
||||
*outputPtr++ = texturePtr[texPixel + 1];
|
||||
*outputPtr++ = texturePtr[texPixel + 2];
|
||||
*outputPtr++ = texturePtr[texPixel + 3];
|
||||
uvPtr += 4;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -81,8 +81,6 @@ void ShaderNode::EnablePreview(bool enable)
|
||||
m_pixmapLabel->clear();
|
||||
m_pixmap.reset();
|
||||
}
|
||||
|
||||
embeddedWidgetSizeUpdated();
|
||||
}
|
||||
}
|
||||
|
||||
@@ -95,6 +93,29 @@ void ShaderNode::setInData(std::shared_ptr<QtNodes::NodeData>, int)
|
||||
{
|
||||
}
|
||||
|
||||
void ShaderNode::restore(const QJsonObject& data)
|
||||
{
|
||||
NodeDataModel::restore(data);
|
||||
|
||||
bool isPreviewEnabled = data["preview_enabled"].toBool(m_isPreviewEnabled);
|
||||
m_previewSize.x = data["preview_width"].toInt(m_previewSize.x);
|
||||
m_previewSize.y = data["preview_height"].toInt(m_previewSize.y);
|
||||
m_variableName = data["variable_name"].toString().toStdString();
|
||||
|
||||
EnablePreview(isPreviewEnabled);
|
||||
}
|
||||
|
||||
QJsonObject ShaderNode::save() const
|
||||
{
|
||||
QJsonObject data = NodeDataModel::save();
|
||||
data["preview_enabled"] = m_isPreviewEnabled;
|
||||
data["preview_width"] = m_previewSize.x;
|
||||
data["preview_height"] = m_previewSize.y;
|
||||
data["variable_name"] = QString::fromStdString(m_variableName);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
bool ShaderNode::ComputePreview(QPixmap& /*pixmap*/)
|
||||
{
|
||||
return false;
|
||||
@@ -103,7 +124,10 @@ bool ShaderNode::ComputePreview(QPixmap& /*pixmap*/)
|
||||
void ShaderNode::UpdatePreview()
|
||||
{
|
||||
if (!m_pixmap)
|
||||
{
|
||||
embeddedWidgetSizeUpdated();
|
||||
return;
|
||||
}
|
||||
|
||||
QPixmap& pixmap = *m_pixmap;
|
||||
|
||||
@@ -116,4 +140,6 @@ void ShaderNode::UpdatePreview()
|
||||
pixmap = pixmap.scaled(m_previewSize.x, m_previewSize.y);
|
||||
|
||||
m_pixmapLabel->setPixmap(pixmap);
|
||||
|
||||
embeddedWidgetSizeUpdated();
|
||||
}
|
||||
|
||||
@@ -40,6 +40,9 @@ class ShaderNode : public QtNodes::NodeDataModel
|
||||
inline void EnableCustomVariableName(bool enable = true);
|
||||
void UpdatePreview();
|
||||
|
||||
void restore(const QJsonObject& data) override;
|
||||
QJsonObject save() const override;
|
||||
|
||||
private:
|
||||
virtual bool ComputePreview(QPixmap& pixmap);
|
||||
|
||||
|
||||
@@ -12,7 +12,10 @@ ShaderNode(graph)
|
||||
m_onTexturePreviewUpdateSlot.Connect(GetGraph().OnTexturePreviewUpdate, [&](ShaderGraph*, std::size_t textureIndex)
|
||||
{
|
||||
if (m_currentTextureIndex == textureIndex)
|
||||
{
|
||||
UpdatePreview();
|
||||
Q_EMIT dataUpdated(0);
|
||||
}
|
||||
});
|
||||
|
||||
if (graph.GetTextureCount() > 0)
|
||||
@@ -161,3 +164,19 @@ QString TextureValue::validationMessage() const
|
||||
|
||||
return QString();
|
||||
}
|
||||
|
||||
void TextureValue::restore(const QJsonObject& data)
|
||||
{
|
||||
m_currentTextureText = data["texture"].toString().toStdString();
|
||||
OnTextureListUpdate();
|
||||
|
||||
ShaderNode::restore(data);
|
||||
}
|
||||
|
||||
QJsonObject TextureValue::save() const
|
||||
{
|
||||
QJsonObject data = ShaderNode::save();
|
||||
data["texture"] = QString::fromStdString(m_currentTextureText);
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
@@ -36,6 +36,9 @@ class TextureValue : public ShaderNode
|
||||
bool ComputePreview(QPixmap& pixmap) override;
|
||||
void OnTextureListUpdate();
|
||||
|
||||
void restore(const QJsonObject& data) override;
|
||||
QJsonObject save() const override;
|
||||
|
||||
NazaraSlot(ShaderGraph, OnTextureListUpdate, m_onTextureListUpdateSlot);
|
||||
NazaraSlot(ShaderGraph, OnTexturePreviewUpdate, m_onTexturePreviewUpdateSlot);
|
||||
|
||||
|
||||
@@ -33,9 +33,11 @@ class VecValue : public ShaderNode
|
||||
|
||||
private:
|
||||
bool ComputePreview(QPixmap& pixmap) override;
|
||||
|
||||
QColor ToColor() const;
|
||||
|
||||
void restore(const QJsonObject& data) override;
|
||||
QJsonObject save() const override;
|
||||
|
||||
VecType<ComponentCount> m_value;
|
||||
};
|
||||
|
||||
|
||||
@@ -2,6 +2,7 @@
|
||||
#include <Nazara/Core/Algorithm.hpp>
|
||||
#include <Nazara/Renderer/ShaderBuilder.hpp>
|
||||
#include <ShaderNode/DataTypes/VecData.hpp>
|
||||
#include <QtCore/QJsonArray>
|
||||
#include <array>
|
||||
#include <tuple>
|
||||
|
||||
@@ -116,3 +117,27 @@ QColor VecValue<ComponentCount>::ToColor() const
|
||||
|
||||
return QColor::fromRgbF(values[0], values[1], values[2], values[3]);
|
||||
}
|
||||
|
||||
template<std::size_t ComponentCount>
|
||||
void VecValue<ComponentCount>::restore(const QJsonObject& data)
|
||||
{
|
||||
QJsonArray vecValues = data["value"].toArray();
|
||||
for (std::size_t i = 0; i < ComponentCount; ++i)
|
||||
m_value[i] = vecValues[int(i)].toInt(m_value[i]);
|
||||
|
||||
ShaderNode::restore(data);
|
||||
}
|
||||
|
||||
template<std::size_t ComponentCount>
|
||||
QJsonObject VecValue<ComponentCount>::save() const
|
||||
{
|
||||
QJsonObject data = ShaderNode::save();
|
||||
|
||||
QJsonArray vecValues;
|
||||
for (std::size_t i = 0; i < ComponentCount; ++i)
|
||||
vecValues.push_back(m_value[i]);
|
||||
|
||||
data["value"] = vecValues;
|
||||
|
||||
return data;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user