From d3db22ce224fa659cf19b49910aea348010e316d Mon Sep 17 00:00:00 2001 From: Lynix Date: Tue, 16 Jun 2020 17:45:21 +0200 Subject: [PATCH] ShaderEditor/VecBinOp: Add component check --- src/ShaderNode/DataModels/VecBinOp.hpp | 3 +++ src/ShaderNode/DataModels/VecBinOp.inl | 26 +++++++++++++++++++++++++- 2 files changed, 28 insertions(+), 1 deletion(-) diff --git a/src/ShaderNode/DataModels/VecBinOp.hpp b/src/ShaderNode/DataModels/VecBinOp.hpp index 0fbb93f9c..977b0d3ba 100644 --- a/src/ShaderNode/DataModels/VecBinOp.hpp +++ b/src/ShaderNode/DataModels/VecBinOp.hpp @@ -23,6 +23,9 @@ class VecBinOp : public ShaderNode void setInData(std::shared_ptr value, int index) override; + QtNodes::NodeValidationState validationState() const override; + QString validationMessage() const override; + private: virtual void ApplyOp(const std::uint8_t* left, const std::uint8_t* right, std::uint8_t* output, std::size_t pixelCount) = 0; diff --git a/src/ShaderNode/DataModels/VecBinOp.inl b/src/ShaderNode/DataModels/VecBinOp.inl index 7d3cf1e12..5a12aff08 100644 --- a/src/ShaderNode/DataModels/VecBinOp.inl +++ b/src/ShaderNode/DataModels/VecBinOp.inl @@ -65,6 +65,30 @@ void VecBinOp::setInData(std::shared_ptr value, int in UpdateOutput(); } +template +QtNodes::NodeValidationState VecBinOp::validationState() const +{ + if (!m_lhs || !m_rhs) + return QtNodes::NodeValidationState::Error; + + if (m_lhs->componentCount != m_rhs->componentCount) + return QtNodes::NodeValidationState::Error; + + return QtNodes::NodeValidationState::Valid; +} + +template +QString VecBinOp::validationMessage() const +{ + if (!m_lhs || !m_rhs) + return "Missing operands"; + + if (m_lhs->componentCount != m_rhs->componentCount) + return "Incompatible components count (left has " + QString::number(m_lhs->componentCount) + ", right has " + QString::number(m_rhs->componentCount) + ")"; + + return QString(); +} + template bool VecBinOp::ComputePreview(QPixmap& pixmap) { @@ -78,7 +102,7 @@ bool VecBinOp::ComputePreview(QPixmap& pixmap) template void VecBinOp::UpdateOutput() { - if (!m_lhs || !m_rhs || m_lhs->componentCount != m_rhs->componentCount) + if (validationState() != QtNodes::NodeValidationState::Valid) { m_output = std::make_shared(4); m_output->preview = QImage(1, 1, QImage::Format_RGBA8888);