Shader: Fix shader serialization

This commit is contained in:
Jérôme Leclercq 2020-09-01 18:46:57 +02:00
parent ef737a8ecd
commit 7d2673eabd
3 changed files with 22 additions and 4 deletions

View File

@ -17,8 +17,6 @@
namespace Nz namespace Nz
{ {
static_assert(std::is_same_v<std::size_t, UInt32> || std::is_same_v<std::size_t, UInt64>);
class NAZARA_SHADER_API ShaderAstSerializerBase class NAZARA_SHADER_API ShaderAstSerializerBase
{ {
public: public:
@ -70,6 +68,7 @@ namespace Nz
virtual void Value(UInt16& val) = 0; virtual void Value(UInt16& val) = 0;
virtual void Value(UInt32& val) = 0; virtual void Value(UInt32& val) = 0;
virtual void Value(UInt64& val) = 0; virtual void Value(UInt64& val) = 0;
inline void SizeT(std::size_t& val);
virtual void Variable(ShaderNodes::VariablePtr& var) = 0; virtual void Variable(ShaderNodes::VariablePtr& var) = 0;
template<typename T> void Variable(std::shared_ptr<T>& var); template<typename T> void Variable(std::shared_ptr<T>& var);

View File

@ -69,7 +69,12 @@ namespace Nz
optVal.emplace(); optVal.emplace();
if (optVal.has_value()) if (optVal.has_value())
Value(optVal.value()); {
if constexpr (std::is_same_v<T, std::size_t>)
SizeT(optVal.value());
else
Value(optVal.value());
}
} }
template<typename T> template<typename T>
@ -86,6 +91,20 @@ namespace Nz
node = std::static_pointer_cast<T>(value); node = std::static_pointer_cast<T>(value);
} }
inline void ShaderAstSerializerBase::SizeT(std::size_t& val)
{
bool isWriting = IsWriting();
UInt32 fixedVal;
if (isWriting)
fixedVal = static_cast<UInt32>(val);
Value(fixedVal);
if (!isWriting)
val = static_cast<std::size_t>(fixedVal);
}
template<typename T> template<typename T>
void ShaderAstSerializerBase::Variable(std::shared_ptr<T>& var) void ShaderAstSerializerBase::Variable(std::shared_ptr<T>& var)
{ {

View File

@ -137,7 +137,7 @@ namespace Nz
Container(node.memberIndices); Container(node.memberIndices);
for (std::size_t& index : node.memberIndices) for (std::size_t& index : node.memberIndices)
Value(index); SizeT(index);
} }
void ShaderAstSerializerBase::Serialize(ShaderNodes::AssignOp& node) void ShaderAstSerializerBase::Serialize(ShaderNodes::AssignOp& node)