ShaderNode: Fix possible crash with incompatible types
This commit is contained in:
@@ -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
|
||||||
|
|||||||
Reference in New Issue
Block a user