ShaderEditor: Fixes

This commit is contained in:
Lynix 2020-06-16 17:44:20 +02:00
parent 2258a4f87f
commit 90abb52e4e
11 changed files with 106 additions and 23 deletions

View File

@ -38,6 +38,9 @@ class CastVec : public ShaderNode
bool ComputePreview(QPixmap& pixmap) override;
void UpdateOutput();
void restore(const QJsonObject& data) override;
QJsonObject save() const override;
std::shared_ptr<VecData> m_input;
std::shared_ptr<VecData> m_output;
VecType<ToComponentCount> m_overflowComponents;

View File

@ -34,6 +34,7 @@ void CastVec<ToComponentCount>::BuildNodeEdition(QFormLayout* layout)
{
QDoubleSpinBox* spinbox = new QDoubleSpinBox;
spinbox->setDecimals(6);
spinbox->setRange(std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max());
spinbox->setValue(m_overflowComponents[i]);
connect(spinbox, qOverload<double>(&QDoubleSpinBox::valueChanged), [=](double)
@ -66,7 +67,7 @@ Nz::ShaderAst::ExpressionPtr CastVec<ToComponentCount>::GetExpression(Nz::Shader
constexpr auto ExpressionType = VecExpressionType<ToComponentCount>;
return Nz::ShaderBuilder::Cast<ExpressionType>(expr.data(), overflowComponentCount);
return Nz::ShaderBuilder::Cast<ExpressionType>(expr.data(), 1 + overflowComponentCount);
}
else if (ToComponentCount < fromComponentCount)
{
@ -232,3 +233,29 @@ void CastVec<ToComponentCount>::UpdateOutput()
UpdatePreview();
}
template<std::size_t ToComponentCount>
void CastVec<ToComponentCount>::restore(const QJsonObject& data)
{
QJsonArray vecValues = data["value"].toArray();
std::size_t commonValues = std::min(static_cast<std::size_t>(vecValues.size()), ToComponentCount);
for (std::size_t i = 0; i < commonValues; ++i)
m_overflowComponents[i] = float(vecValues[int(i)].toDouble(m_overflowComponents[i]));
ShaderNode::restore(data);
}
template<std::size_t ToComponentCount>
QJsonObject CastVec<ToComponentCount>::save() const
{
QJsonObject data = ShaderNode::save();
QJsonArray vecValues;
for (std::size_t i = 0; i < ToComponentCount; ++i)
vecValues.push_back(m_overflowComponents[i]);
data["value"] = vecValues;
return data;
}

View File

@ -57,6 +57,7 @@ void FloatValue::BuildNodeEdition(QFormLayout* layout)
QDoubleSpinBox* spinbox = new QDoubleSpinBox;
spinbox->setDecimals(6);
spinbox->setRange(std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max());
spinbox->setValue(m_value);
connect(spinbox, qOverload<double>(&QDoubleSpinBox::valueChanged), [=](double)

View File

@ -20,9 +20,8 @@ ShaderNode(graph)
if (graph.GetInputCount() > 0)
{
auto& firstInput = graph.GetInput(0);
m_currentInputIndex = 0;
m_currentInputText = firstInput.name;
UpdateInputText();
}
DisableCustomVariableName();
@ -70,11 +69,27 @@ void InputValue::OnInputListUpdate()
}
}
void InputValue::UpdateInputText()
{
if (m_currentInputIndex)
{
auto& input = GetGraph().GetInput(*m_currentInputIndex);
m_currentInputText = input.name;
}
else
m_currentInputText.clear();
}
void InputValue::BuildNodeEdition(QFormLayout* layout)
{
ShaderNode::BuildNodeEdition(layout);
QComboBox* inputSelection = new QComboBox;
for (const auto& inputEntry : GetGraph().GetInputs())
inputSelection->addItem(QString::fromStdString(inputEntry.name));
if (m_currentInputIndex)
inputSelection->setCurrentIndex(int(*m_currentInputIndex));
connect(inputSelection, qOverload<int>(&QComboBox::currentIndexChanged), [&](int index)
{
@ -83,11 +98,11 @@ void InputValue::BuildNodeEdition(QFormLayout* layout)
else
m_currentInputIndex.reset();
UpdateInputText();
UpdatePreview();
});
for (const auto& inputEntry : GetGraph().GetInputs())
inputSelection->addItem(QString::fromStdString(inputEntry.name));
Q_EMIT dataUpdated(0);
});
layout->addRow(tr("Input"), inputSelection);
}

View File

@ -36,6 +36,7 @@ class InputValue : public ShaderNode
private:
bool ComputePreview(QPixmap& pixmap) override;
void OnInputListUpdate();
void UpdateInputText();
void restore(const QJsonObject& data) override;
QJsonObject save() const override;

View File

@ -17,9 +17,8 @@ ShaderNode(graph)
if (graph.GetOutputCount() > 0)
{
auto& firstOutput = graph.GetOutput(0);
m_currentOutputIndex = 0;
m_currentOutputText = firstOutput.name;
UpdateOutputText();
}
EnablePreview();
@ -32,7 +31,12 @@ void OutputValue::BuildNodeEdition(QFormLayout* layout)
ShaderNode::BuildNodeEdition(layout);
QComboBox* outputSelection = new QComboBox;
for (const auto& outputEntry : GetGraph().GetOutputs())
outputSelection->addItem(QString::fromStdString(outputEntry.name));
if (m_currentOutputIndex)
outputSelection->setCurrentIndex(int(*m_currentOutputIndex));
connect(outputSelection, qOverload<int>(&QComboBox::currentIndexChanged), [&](int index)
{
if (index >= 0)
@ -40,12 +44,10 @@ void OutputValue::BuildNodeEdition(QFormLayout* layout)
else
m_currentOutputIndex.reset();
UpdateOutputText();
UpdatePreview();
});
for (const auto& outputEntry : GetGraph().GetOutputs())
outputSelection->addItem(QString::fromStdString(outputEntry.name));
layout->addRow(tr("Output"), outputSelection);
}
@ -189,9 +191,20 @@ void OutputValue::OnOutputListUpdate()
}
}
void OutputValue::UpdateOutputText()
{
if (m_currentOutputIndex)
{
auto& output = GetGraph().GetOutput(*m_currentOutputIndex);
m_currentOutputText = output.name;
}
else
m_currentOutputText.clear();
}
void OutputValue::restore(const QJsonObject& data)
{
m_currentOutputText = data["input"].toString().toStdString();
m_currentOutputText = data["output"].toString().toStdString();
OnOutputListUpdate();
ShaderNode::restore(data);
@ -200,7 +213,7 @@ void OutputValue::restore(const QJsonObject& data)
QJsonObject OutputValue::save() const
{
QJsonObject data = ShaderNode::save();
data["input"] = QString::fromStdString(m_currentOutputText);
data["output"] = QString::fromStdString(m_currentOutputText);
return data;
}

View File

@ -35,6 +35,7 @@ class OutputValue : public ShaderNode
private:
bool ComputePreview(QPixmap& pixmap) override;
void OnOutputListUpdate();
void UpdateOutputText();
void restore(const QJsonObject& data) override;
QJsonObject save() const override;

View File

@ -20,9 +20,8 @@ ShaderNode(graph)
if (graph.GetTextureCount() > 0)
{
auto& firstInput = graph.GetTexture(0);
m_currentTextureIndex = 0;
m_currentTextureText = firstInput.name;
UpdateOutputTexture();
}
DisableCustomVariableName();
@ -57,6 +56,17 @@ void TextureValue::OnTextureListUpdate()
}
}
void TextureValue::UpdateOutputTexture()
{
if (m_currentTextureIndex)
{
auto& texture = GetGraph().GetTexture(*m_currentTextureIndex);
m_currentTextureText = texture.name;
}
else
m_currentTextureText.clear();
}
bool TextureValue::ComputePreview(QPixmap& pixmap)
{
if (!m_currentTextureIndex)
@ -74,6 +84,12 @@ void TextureValue::BuildNodeEdition(QFormLayout* layout)
ShaderNode::BuildNodeEdition(layout);
QComboBox* textureSelection = new QComboBox;
for (const auto& textureEntry : GetGraph().GetTextures())
textureSelection->addItem(QString::fromStdString(textureEntry.name));
if (m_currentTextureIndex)
textureSelection->setCurrentIndex(int(*m_currentTextureIndex));
connect(textureSelection, qOverload<int>(&QComboBox::currentIndexChanged), [&](int index)
{
if (index >= 0)
@ -81,14 +97,12 @@ void TextureValue::BuildNodeEdition(QFormLayout* layout)
else
m_currentTextureIndex.reset();
UpdateOutputTexture();
UpdatePreview();
Q_EMIT dataUpdated(0);
});
for (const auto& textureEntry : GetGraph().GetTextures())
textureSelection->addItem(QString::fromStdString(textureEntry.name));
layout->addRow(tr("Texture"), textureSelection);
}
@ -120,7 +134,7 @@ auto TextureValue::dataType(QtNodes::PortType portType, QtNodes::PortIndex portI
assert(portType == QtNodes::PortType::Out);
assert(portIndex == 0);
return VecData::Type();
return Texture2Data::Type();
}
std::shared_ptr<QtNodes::NodeData> TextureValue::outData(QtNodes::PortIndex port)

View File

@ -35,6 +35,7 @@ class TextureValue : public ShaderNode
protected:
bool ComputePreview(QPixmap& pixmap) override;
void OnTextureListUpdate();
void UpdateOutputTexture();
void restore(const QJsonObject& data) override;
QJsonObject save() const override;

View File

@ -78,6 +78,7 @@ void VecValue<ComponentCount>::BuildNodeEdition(QFormLayout* layout)
{
QDoubleSpinBox* spinbox = new QDoubleSpinBox;
spinbox->setDecimals(6);
spinbox->setRange(std::numeric_limits<float>::lowest(), std::numeric_limits<float>::max());
spinbox->setValue(m_value[i]);
connect(spinbox, qOverload<double>(&QDoubleSpinBox::valueChanged), [=](double)
@ -122,8 +123,10 @@ 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]);
std::size_t commonValues = std::min(static_cast<std::size_t>(vecValues.size()), ComponentCount);
for (std::size_t i = 0; i < commonValues; ++i)
m_value[i] = float(vecValues[int(i)].toDouble(m_value[i]));
ShaderNode::restore(data);
}

View File

@ -3,8 +3,12 @@
QImage QuadPreview::GetImage(InputRole role, std::size_t roleIndex) const
{
assert(role == InputRole::TexCoord);
assert(roleIndex == 0);
if (role != InputRole::TexCoord)
{
QImage dummy(1, 1, QImage::Format_RGBA8888);
dummy.fill(QColor::fromRgb(0, 0, 0, 0));
return dummy;
}
QImage uv(128, 128, QImage::Format_RGBA8888);