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)
|
||||
{
|
||||
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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
}
|
||||
|
||||
|
|
|
|||
|
|
@ -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
|
||||
|
|
|
|||
Loading…
Reference in New Issue