ShaderNode: Fix possible crash with incompatible types

This commit is contained in:
Jérôme Leclercq 2020-10-30 23:08:03 +01:00
parent 5ca9776755
commit e5cd461bae
9 changed files with 26 additions and 21 deletions

View File

@ -141,7 +141,7 @@ template<std::size_t ToComponentCount>
void CastVec<ToComponentCount>::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
{
assert(index == 0);
if (value)
if (value && value->type().id == VecData::Type().id)
{
assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_input = std::static_pointer_cast<VecData>(value);

View File

@ -50,10 +50,9 @@ void Mat4BinOp<BinOp>::setInData(std::shared_ptr<QtNodes::NodeData> value, int i
assert(index == 0 || index == 1);
std::shared_ptr<Matrix4Data> castedValue;
if (value)
if (value && value->type().id == Matrix4Data::Type().id)
{
assert(dynamic_cast<Matrix4Data*>(value.get()) != nullptr);
castedValue = std::static_pointer_cast<Matrix4Data>(value);
}

View File

@ -77,7 +77,7 @@ void Mat4VecMul::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
{
case 0:
{
if (value)
if (value && value->type().id == Matrix4Data::Type().id)
{
assert(dynamic_cast<Matrix4Data*>(value.get()) != nullptr);
m_lhs = std::static_pointer_cast<Matrix4Data>(value);
@ -90,7 +90,7 @@ void Mat4VecMul::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
case 1:
{
if (value)
if (value && value->type().id == VecData::Type().id)
{
assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_rhs = std::static_pointer_cast<VecData>(value);

View File

@ -126,6 +126,9 @@ QtNodes::NodeValidationState OutputValue::validationState() const
case PrimitiveType::Float3:
case PrimitiveType::Float4:
{
if (m_input->type().id != VecData::Type().id)
return QtNodes::NodeValidationState::Error;
assert(dynamic_cast<VecData*>(m_input.get()) != nullptr);
const VecData& vec = static_cast<const VecData&>(*m_input);
if (GetComponentCount(outputEntry.type) != vec.componentCount)
@ -156,6 +159,9 @@ QString OutputValue::validationMessage() const
case PrimitiveType::Float3:
case PrimitiveType::Float4:
{
if (m_input->type().id != VecData::Type().id)
return "Expected vector";
assert(dynamic_cast<VecData*>(m_input.get()) != nullptr);
const VecData& vec = static_cast<const VecData&>(*m_input);
@ -179,6 +185,9 @@ bool OutputValue::ComputePreview(QPixmap& pixmap)
{
case PrimitiveType::Bool:
{
if (m_input->type().id != BoolData::Type().id)
return false;
assert(dynamic_cast<BoolData*>(m_input.get()) != nullptr);
const BoolData& data = static_cast<const BoolData&>(*m_input);
@ -188,6 +197,9 @@ bool OutputValue::ComputePreview(QPixmap& pixmap)
case PrimitiveType::Float1:
{
if (m_input->type().id != FloatData::Type().id)
return false;
assert(dynamic_cast<FloatData*>(m_input.get()) != nullptr);
const FloatData& data = static_cast<const FloatData&>(*m_input);
@ -208,6 +220,9 @@ bool OutputValue::ComputePreview(QPixmap& pixmap)
case PrimitiveType::Float3:
case PrimitiveType::Float4:
{
if (m_input->type().id != VecData::Type().id)
return false;
assert(dynamic_cast<VecData*>(m_input.get()) != nullptr);
const VecData& data = static_cast<const VecData&>(*m_input);

View File

@ -52,7 +52,7 @@ std::shared_ptr<QtNodes::NodeData> PositionOutputValue::outData(QtNodes::PortInd
void PositionOutputValue::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
{
assert(index == 0);
if (value)
if (value && value->type().id == VecData::Type().id)
{
assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_input = std::static_pointer_cast<VecData>(value);

View File

@ -154,10 +154,9 @@ void SampleTexture::setInData(std::shared_ptr<QtNodes::NodeData> value, int inde
{
case 0:
{
if (value)
if (value && value->type().id == Texture2Data::Type().id)
{
assert(dynamic_cast<Texture2Data*>(value.get()) != nullptr);
m_texture = std::static_pointer_cast<Texture2Data>(value);
}
else
@ -168,10 +167,9 @@ void SampleTexture::setInData(std::shared_ptr<QtNodes::NodeData> value, int inde
case 1:
{
if (value)
if (value && value->type().id == VecData::Type().id)
{
assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_uv = std::static_pointer_cast<VecData>(value);
}
else

View File

@ -50,12 +50,8 @@ void VecBinOp<BinOp>::setInData(std::shared_ptr<QtNodes::NodeData> value, int in
assert(index == 0 || index == 1);
std::shared_ptr<VecData> castedValue;
if (value)
{
assert(dynamic_cast<VecData*>(value.get()) != nullptr);
if (value && value->type().id == VecData::Type().id)
castedValue = std::static_pointer_cast<VecData>(value);
}
if (index == 0)
m_lhs = std::move(castedValue);

View File

@ -71,10 +71,9 @@ void VecDot::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
assert(index == 0 || index == 1);
std::shared_ptr<VecData> castedValue;
if (value)
if (value && value->type().id == VecData::Type().id)
{
assert(dynamic_cast<VecData*>(value.get()) != nullptr);
castedValue = std::static_pointer_cast<VecData>(value);
}

View File

@ -77,10 +77,9 @@ void VecFloatMul::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
{
case 0:
{
if (value)
if (value && value->type().id == FloatData::Type().id)
{
assert(dynamic_cast<FloatData*>(value.get()) != nullptr);
m_lhs = std::static_pointer_cast<FloatData>(value);
}
else
@ -91,10 +90,9 @@ void VecFloatMul::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
case 1:
{
if (value)
if (value && value->type().id == VecData::Type().id)
{
assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_rhs = std::static_pointer_cast<VecData>(value);
}
else