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) void CastVec<ToComponentCount>::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
{ {
assert(index == 0); assert(index == 0);
if (value) if (value && value->type().id == VecData::Type().id)
{ {
assert(dynamic_cast<VecData*>(value.get()) != nullptr); assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_input = std::static_pointer_cast<VecData>(value); 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); assert(index == 0 || index == 1);
std::shared_ptr<Matrix4Data> castedValue; std::shared_ptr<Matrix4Data> castedValue;
if (value) if (value && value->type().id == Matrix4Data::Type().id)
{ {
assert(dynamic_cast<Matrix4Data*>(value.get()) != nullptr); assert(dynamic_cast<Matrix4Data*>(value.get()) != nullptr);
castedValue = std::static_pointer_cast<Matrix4Data>(value); 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: case 0:
{ {
if (value) if (value && value->type().id == Matrix4Data::Type().id)
{ {
assert(dynamic_cast<Matrix4Data*>(value.get()) != nullptr); assert(dynamic_cast<Matrix4Data*>(value.get()) != nullptr);
m_lhs = std::static_pointer_cast<Matrix4Data>(value); 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: case 1:
{ {
if (value) if (value && value->type().id == VecData::Type().id)
{ {
assert(dynamic_cast<VecData*>(value.get()) != nullptr); assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_rhs = std::static_pointer_cast<VecData>(value); m_rhs = std::static_pointer_cast<VecData>(value);

View File

@ -126,6 +126,9 @@ QtNodes::NodeValidationState OutputValue::validationState() const
case PrimitiveType::Float3: case PrimitiveType::Float3:
case PrimitiveType::Float4: case PrimitiveType::Float4:
{ {
if (m_input->type().id != VecData::Type().id)
return QtNodes::NodeValidationState::Error;
assert(dynamic_cast<VecData*>(m_input.get()) != nullptr); assert(dynamic_cast<VecData*>(m_input.get()) != nullptr);
const VecData& vec = static_cast<const VecData&>(*m_input); const VecData& vec = static_cast<const VecData&>(*m_input);
if (GetComponentCount(outputEntry.type) != vec.componentCount) if (GetComponentCount(outputEntry.type) != vec.componentCount)
@ -156,6 +159,9 @@ QString OutputValue::validationMessage() const
case PrimitiveType::Float3: case PrimitiveType::Float3:
case PrimitiveType::Float4: case PrimitiveType::Float4:
{ {
if (m_input->type().id != VecData::Type().id)
return "Expected vector";
assert(dynamic_cast<VecData*>(m_input.get()) != nullptr); assert(dynamic_cast<VecData*>(m_input.get()) != nullptr);
const VecData& vec = static_cast<const VecData&>(*m_input); const VecData& vec = static_cast<const VecData&>(*m_input);
@ -179,6 +185,9 @@ bool OutputValue::ComputePreview(QPixmap& pixmap)
{ {
case PrimitiveType::Bool: case PrimitiveType::Bool:
{ {
if (m_input->type().id != BoolData::Type().id)
return false;
assert(dynamic_cast<BoolData*>(m_input.get()) != nullptr); assert(dynamic_cast<BoolData*>(m_input.get()) != nullptr);
const BoolData& data = static_cast<const BoolData&>(*m_input); const BoolData& data = static_cast<const BoolData&>(*m_input);
@ -188,6 +197,9 @@ bool OutputValue::ComputePreview(QPixmap& pixmap)
case PrimitiveType::Float1: case PrimitiveType::Float1:
{ {
if (m_input->type().id != FloatData::Type().id)
return false;
assert(dynamic_cast<FloatData*>(m_input.get()) != nullptr); assert(dynamic_cast<FloatData*>(m_input.get()) != nullptr);
const FloatData& data = static_cast<const FloatData&>(*m_input); const FloatData& data = static_cast<const FloatData&>(*m_input);
@ -208,6 +220,9 @@ bool OutputValue::ComputePreview(QPixmap& pixmap)
case PrimitiveType::Float3: case PrimitiveType::Float3:
case PrimitiveType::Float4: case PrimitiveType::Float4:
{ {
if (m_input->type().id != VecData::Type().id)
return false;
assert(dynamic_cast<VecData*>(m_input.get()) != nullptr); assert(dynamic_cast<VecData*>(m_input.get()) != nullptr);
const VecData& data = static_cast<const VecData&>(*m_input); 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) void PositionOutputValue::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
{ {
assert(index == 0); assert(index == 0);
if (value) if (value && value->type().id == VecData::Type().id)
{ {
assert(dynamic_cast<VecData*>(value.get()) != nullptr); assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_input = std::static_pointer_cast<VecData>(value); 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: case 0:
{ {
if (value) if (value && value->type().id == Texture2Data::Type().id)
{ {
assert(dynamic_cast<Texture2Data*>(value.get()) != nullptr); assert(dynamic_cast<Texture2Data*>(value.get()) != nullptr);
m_texture = std::static_pointer_cast<Texture2Data>(value); m_texture = std::static_pointer_cast<Texture2Data>(value);
} }
else else
@ -168,10 +167,9 @@ void SampleTexture::setInData(std::shared_ptr<QtNodes::NodeData> value, int inde
case 1: case 1:
{ {
if (value) if (value && value->type().id == VecData::Type().id)
{ {
assert(dynamic_cast<VecData*>(value.get()) != nullptr); assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_uv = std::static_pointer_cast<VecData>(value); m_uv = std::static_pointer_cast<VecData>(value);
} }
else else

View File

@ -50,12 +50,8 @@ void VecBinOp<BinOp>::setInData(std::shared_ptr<QtNodes::NodeData> value, int in
assert(index == 0 || index == 1); assert(index == 0 || index == 1);
std::shared_ptr<VecData> castedValue; 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); castedValue = std::static_pointer_cast<VecData>(value);
}
if (index == 0) if (index == 0)
m_lhs = std::move(castedValue); 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); assert(index == 0 || index == 1);
std::shared_ptr<VecData> castedValue; std::shared_ptr<VecData> castedValue;
if (value) if (value && value->type().id == VecData::Type().id)
{ {
assert(dynamic_cast<VecData*>(value.get()) != nullptr); assert(dynamic_cast<VecData*>(value.get()) != nullptr);
castedValue = std::static_pointer_cast<VecData>(value); 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: case 0:
{ {
if (value) if (value && value->type().id == FloatData::Type().id)
{ {
assert(dynamic_cast<FloatData*>(value.get()) != nullptr); assert(dynamic_cast<FloatData*>(value.get()) != nullptr);
m_lhs = std::static_pointer_cast<FloatData>(value); m_lhs = std::static_pointer_cast<FloatData>(value);
} }
else else
@ -91,10 +90,9 @@ void VecFloatMul::setInData(std::shared_ptr<QtNodes::NodeData> value, int index)
case 1: case 1:
{ {
if (value) if (value && value->type().id == VecData::Type().id)
{ {
assert(dynamic_cast<VecData*>(value.get()) != nullptr); assert(dynamic_cast<VecData*>(value.get()) != nullptr);
m_rhs = std::static_pointer_cast<VecData>(value); m_rhs = std::static_pointer_cast<VecData>(value);
} }
else else