ShaderNode: Fix possible crash with incompatible types
This commit is contained in:
parent
5ca9776755
commit
e5cd461bae
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue