Improve code
This commit is contained in:
parent
e342c88e64
commit
3c1c61fb5e
|
|
@ -498,6 +498,24 @@ Nz::ShaderNodes::StatementPtr ShaderGraph::ToAst()
|
||||||
return Nz::ShaderNodes::StatementBlock::Build(std::move(statements));
|
return Nz::ShaderNodes::StatementBlock::Build(std::move(statements));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Nz::ShaderExpressionType ShaderGraph::ToShaderExpressionType(const std::variant<PrimitiveType, std::size_t>& type) const
|
||||||
|
{
|
||||||
|
return std::visit([&](auto&& arg) -> Nz::ShaderExpressionType
|
||||||
|
{
|
||||||
|
using T = std::decay_t<decltype(arg)>;
|
||||||
|
if constexpr (std::is_same_v<T, PrimitiveType>)
|
||||||
|
return ToShaderExpressionType(arg);
|
||||||
|
else if constexpr (std::is_same_v<T, std::size_t>)
|
||||||
|
{
|
||||||
|
assert(arg < m_structs.size());
|
||||||
|
const auto& s = m_structs[arg];
|
||||||
|
return s.name;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
static_assert(AlwaysFalse<T>::value, "non-exhaustive visitor");
|
||||||
|
}, type);
|
||||||
|
};
|
||||||
|
|
||||||
void ShaderGraph::UpdateBuffer(std::size_t bufferIndex, std::string name, BufferType bufferType, std::size_t structIndex, std::size_t bindingIndex)
|
void ShaderGraph::UpdateBuffer(std::size_t bufferIndex, std::string name, BufferType bufferType, std::size_t structIndex, std::size_t bindingIndex)
|
||||||
{
|
{
|
||||||
assert(bufferIndex < m_buffers.size());
|
assert(bufferIndex < m_buffers.size());
|
||||||
|
|
@ -565,9 +583,36 @@ void ShaderGraph::UpdateTexturePreview(std::size_t textureIndex, QImage preview)
|
||||||
OnTexturePreviewUpdate(this, textureIndex);
|
OnTexturePreviewUpdate(this, textureIndex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Nz::ShaderExpressionType ShaderGraph::ToShaderExpressionType(PrimitiveType type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case PrimitiveType::Bool: return Nz::ShaderNodes::BasicType::Boolean;
|
||||||
|
case PrimitiveType::Float1: return Nz::ShaderNodes::BasicType::Float1;
|
||||||
|
case PrimitiveType::Float2: return Nz::ShaderNodes::BasicType::Float2;
|
||||||
|
case PrimitiveType::Float3: return Nz::ShaderNodes::BasicType::Float3;
|
||||||
|
case PrimitiveType::Float4: return Nz::ShaderNodes::BasicType::Float4;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(false);
|
||||||
|
throw std::runtime_error("Unhandled primitive type");
|
||||||
|
}
|
||||||
|
|
||||||
|
Nz::ShaderExpressionType ShaderGraph::ToShaderExpressionType(TextureType type)
|
||||||
|
{
|
||||||
|
switch (type)
|
||||||
|
{
|
||||||
|
case TextureType::Sampler2D: return Nz::ShaderNodes::BasicType::Sampler2D;
|
||||||
|
}
|
||||||
|
|
||||||
|
assert(false);
|
||||||
|
throw std::runtime_error("Unhandled texture type");
|
||||||
|
}
|
||||||
|
|
||||||
std::shared_ptr<QtNodes::DataModelRegistry> ShaderGraph::BuildRegistry()
|
std::shared_ptr<QtNodes::DataModelRegistry> ShaderGraph::BuildRegistry()
|
||||||
{
|
{
|
||||||
auto registry = std::make_shared<QtNodes::DataModelRegistry>();
|
auto registry = std::make_shared<QtNodes::DataModelRegistry>();
|
||||||
|
RegisterShaderNode<BufferField>(*this, registry, "Inputs");
|
||||||
RegisterShaderNode<CastToVec2>(*this, registry, "Casts");
|
RegisterShaderNode<CastToVec2>(*this, registry, "Casts");
|
||||||
RegisterShaderNode<CastToVec3>(*this, registry, "Casts");
|
RegisterShaderNode<CastToVec3>(*this, registry, "Casts");
|
||||||
RegisterShaderNode<CastToVec4>(*this, registry, "Casts");
|
RegisterShaderNode<CastToVec4>(*this, registry, "Casts");
|
||||||
|
|
|
||||||
|
|
@ -56,6 +56,7 @@ class ShaderGraph
|
||||||
QJsonObject Save();
|
QJsonObject Save();
|
||||||
|
|
||||||
Nz::ShaderNodes::StatementPtr ToAst();
|
Nz::ShaderNodes::StatementPtr ToAst();
|
||||||
|
Nz::ShaderExpressionType ToShaderExpressionType(const std::variant<PrimitiveType, std::size_t>& type) const;
|
||||||
|
|
||||||
void UpdateBuffer(std::size_t bufferIndex, std::string name, BufferType bufferType, std::size_t structIndex, std::size_t bindingIndex);
|
void UpdateBuffer(std::size_t bufferIndex, std::string name, BufferType bufferType, std::size_t structIndex, std::size_t bindingIndex);
|
||||||
void UpdateInput(std::size_t inputIndex, std::string name, PrimitiveType type, InputRole role, std::size_t roleIndex, std::size_t locationIndex);
|
void UpdateInput(std::size_t inputIndex, std::string name, PrimitiveType type, InputRole role, std::size_t roleIndex, std::size_t locationIndex);
|
||||||
|
|
@ -121,6 +122,9 @@ class ShaderGraph
|
||||||
NazaraSignal(OnTexturePreviewUpdate, ShaderGraph*, std::size_t /*textureIndex*/);
|
NazaraSignal(OnTexturePreviewUpdate, ShaderGraph*, std::size_t /*textureIndex*/);
|
||||||
NazaraSignal(OnTextureUpdate, ShaderGraph*, std::size_t /*textureIndex*/);
|
NazaraSignal(OnTextureUpdate, ShaderGraph*, std::size_t /*textureIndex*/);
|
||||||
|
|
||||||
|
static Nz::ShaderExpressionType ToShaderExpressionType(PrimitiveType type);
|
||||||
|
static Nz::ShaderExpressionType ToShaderExpressionType(TextureType type);
|
||||||
|
|
||||||
private:
|
private:
|
||||||
std::shared_ptr<QtNodes::DataModelRegistry> BuildRegistry();
|
std::shared_ptr<QtNodes::DataModelRegistry> BuildRegistry();
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -212,39 +212,12 @@ Nz::ShaderAst MainWindow::ToShader()
|
||||||
{
|
{
|
||||||
Nz::ShaderNodes::StatementPtr shaderAst = m_shaderGraph.ToAst();
|
Nz::ShaderNodes::StatementPtr shaderAst = m_shaderGraph.ToAst();
|
||||||
|
|
||||||
//TODO: Put in another function
|
|
||||||
auto GetExpressionFromInOut = [&](PrimitiveType type)
|
|
||||||
{
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case PrimitiveType::Bool: return Nz::ShaderNodes::BasicType::Boolean;
|
|
||||||
case PrimitiveType::Float1: return Nz::ShaderNodes::BasicType::Float1;
|
|
||||||
case PrimitiveType::Float2: return Nz::ShaderNodes::BasicType::Float2;
|
|
||||||
case PrimitiveType::Float3: return Nz::ShaderNodes::BasicType::Float3;
|
|
||||||
case PrimitiveType::Float4: return Nz::ShaderNodes::BasicType::Float4;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(false);
|
|
||||||
throw std::runtime_error("Unhandled input type");
|
|
||||||
};
|
|
||||||
|
|
||||||
auto GetExpressionFromTexture = [&](TextureType type)
|
|
||||||
{
|
|
||||||
switch (type)
|
|
||||||
{
|
|
||||||
case TextureType::Sampler2D: return Nz::ShaderNodes::BasicType::Sampler2D;
|
|
||||||
}
|
|
||||||
|
|
||||||
assert(false);
|
|
||||||
throw std::runtime_error("Unhandled texture type");
|
|
||||||
};
|
|
||||||
|
|
||||||
Nz::ShaderAst shader;
|
Nz::ShaderAst shader;
|
||||||
for (const auto& input : m_shaderGraph.GetInputs())
|
for (const auto& input : m_shaderGraph.GetInputs())
|
||||||
shader.AddInput(input.name, GetExpressionFromInOut(input.type), input.locationIndex);
|
shader.AddInput(input.name, m_shaderGraph.ToShaderExpressionType(input.type), input.locationIndex);
|
||||||
|
|
||||||
for (const auto& output : m_shaderGraph.GetOutputs())
|
for (const auto& output : m_shaderGraph.GetOutputs())
|
||||||
shader.AddOutput(output.name, GetExpressionFromInOut(output.type), output.locationIndex);
|
shader.AddOutput(output.name, m_shaderGraph.ToShaderExpressionType(output.type), output.locationIndex);
|
||||||
|
|
||||||
for (const auto& buffer : m_shaderGraph.GetBuffers())
|
for (const auto& buffer : m_shaderGraph.GetBuffers())
|
||||||
{
|
{
|
||||||
|
|
@ -253,7 +226,7 @@ Nz::ShaderAst MainWindow::ToShader()
|
||||||
}
|
}
|
||||||
|
|
||||||
for (const auto& uniform : m_shaderGraph.GetTextures())
|
for (const auto& uniform : m_shaderGraph.GetTextures())
|
||||||
shader.AddUniform(uniform.name, GetExpressionFromTexture(uniform.type), uniform.bindingIndex, {});
|
shader.AddUniform(uniform.name, m_shaderGraph.ToShaderExpressionType(uniform.type), uniform.bindingIndex, {});
|
||||||
|
|
||||||
for (const auto& s : m_shaderGraph.GetStructs())
|
for (const auto& s : m_shaderGraph.GetStructs())
|
||||||
{
|
{
|
||||||
|
|
@ -267,7 +240,7 @@ Nz::ShaderAst MainWindow::ToShader()
|
||||||
{
|
{
|
||||||
using T = std::decay_t<decltype(arg)>;
|
using T = std::decay_t<decltype(arg)>;
|
||||||
if constexpr (std::is_same_v<T, PrimitiveType>)
|
if constexpr (std::is_same_v<T, PrimitiveType>)
|
||||||
member.type = GetExpressionFromInOut(arg);
|
member.type = m_shaderGraph.ToShaderExpressionType(arg);
|
||||||
else if constexpr (std::is_same_v<T, std::size_t>)
|
else if constexpr (std::is_same_v<T, std::size_t>)
|
||||||
member.type = m_shaderGraph.GetStruct(arg).name;
|
member.type = m_shaderGraph.GetStruct(arg).name;
|
||||||
else
|
else
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue