Renderer/ShaderAst: Add Sample2D

This commit is contained in:
Lynix 2020-05-19 20:06:11 +02:00
parent c26f3b9b71
commit e23eb74802
7 changed files with 67 additions and 8 deletions

View File

@ -40,6 +40,7 @@ namespace Nz
void Write(const ShaderAst::ExpressionStatement& node) override;
void Write(const ShaderAst::NamedVariable& node) override;
void Write(const ShaderAst::NodePtr& node) override;
void Write(const ShaderAst::Sample2D& node) override;
void Write(const ShaderAst::StatementBlock& node) override;
void Write(const ShaderAst::SwizzleOp& node) override;

View File

@ -42,12 +42,13 @@ namespace Nz
enum class ExpressionType
{
Boolean, // bool
Float1, // float
Float2, // vec2
Float3, // vec3
Float4, // vec4
Mat4x4, // mat4
Boolean, // bool
Float1, // float
Float2, // vec2
Float3, // vec3
Float4, // vec4
Mat4x4, // mat4
Sampler2D, // sampler2D
Void // void
};
@ -284,6 +285,21 @@ namespace Nz
std::size_t componentCount;
ExpressionPtr expression;
};
//////////////////////////////////////////////////////////////////////////
class NAZARA_RENDERER_API Sample2D : public Expression
{
public:
inline Sample2D(ExpressionPtr samplerPtr, ExpressionPtr coordinatesPtr);
ExpressionType GetExpressionType() const override;
void Register(ShaderWriter& visitor) override;
void Visit(ShaderWriter& visitor) override;
ExpressionPtr sampler;
ExpressionPtr coordinates;
};
}
}

View File

@ -2,6 +2,7 @@
// This file is part of the "Nazara Engine - Renderer module"
// For conditions of distribution and use, see copyright notice in Config.hpp
#include <Nazara/Renderer/ShaderAst.hpp>
#include <Nazara/Renderer/Debug.hpp>
namespace Nz
@ -225,6 +226,17 @@ namespace Nz
std::copy(swizzleComponents.begin(), swizzleComponents.end(), components.begin());
}
inline Sample2D::Sample2D(ExpressionPtr samplerPtr, ExpressionPtr coordinatesPtr) :
sampler(std::move(samplerPtr)),
coordinates(std::move(coordinatesPtr))
{
if (sampler->GetExpressionType() != ExpressionType::Sampler2D)
throw std::runtime_error("Sampler must be a Sampler2D");
if (coordinates->GetExpressionType() != ExpressionType::Float2)
throw std::runtime_error("Coordinates must be a Float2");
}
}
}

View File

@ -66,6 +66,7 @@ namespace Nz { namespace ShaderBuilder
constexpr BinOpBuilder<ShaderAst::BinaryType::Multiply> Multiply;
constexpr VarBuilder<ShaderAst::VariableType::Output> Output;
constexpr VarBuilder<ShaderAst::VariableType::Parameter> Parameter;
constexpr GenBuilder<ShaderAst::Sample2D> Sample2D;
constexpr GenBuilder<ShaderAst::SwizzleOp> Swizzle;
constexpr BinOpBuilder<ShaderAst::BinaryType::Substract> Substract;
constexpr VarBuilder<ShaderAst::VariableType::Uniform> Uniform;

View File

@ -41,6 +41,7 @@ namespace Nz
virtual void Write(const ShaderAst::ExpressionStatement& node) = 0;
virtual void Write(const ShaderAst::NamedVariable& node) = 0;
virtual void Write(const ShaderAst::NodePtr& node) = 0;
virtual void Write(const ShaderAst::Sample2D& node) = 0;
virtual void Write(const ShaderAst::StatementBlock& node) = 0;
virtual void Write(const ShaderAst::SwizzleOp& node) = 0;

View File

@ -128,6 +128,15 @@ namespace Nz
node->Visit(*this);
}
void GlslWriter::Write(const ShaderAst::Sample2D& node)
{
Append("texture(");
Write(node.sampler);
Append(", ");
Write(node.coordinates);
Append(")");
}
void GlslWriter::Write(const ShaderAst::AssignOp& node)
{
Write(node.variable);
@ -338,6 +347,9 @@ namespace Nz
case ShaderAst::ExpressionType::Mat4x4:
Append("mat4");
break;
case ShaderAst::ExpressionType::Sampler2D:
Append("sampler2D");
break;
case ShaderAst::ExpressionType::Void:
Append("void");
break;

View File

@ -6,7 +6,7 @@
#include <Nazara/Renderer/ShaderWriter.hpp>
#include <Nazara/Renderer/Debug.hpp>
namespace Nz { namespace ShaderAst
namespace Nz::ShaderAst
{
void ExpressionStatement::Register(ShaderWriter& visitor)
{
@ -192,5 +192,21 @@ namespace Nz { namespace ShaderAst
{
visitor.Write(*this);
}
}
ExpressionType Sample2D::GetExpressionType() const
{
return ExpressionType::Float4;
}
void Sample2D::Register(ShaderWriter& visitor)
{
sampler->Register(visitor);
coordinates->Register(visitor);
}
void Sample2D::Visit(ShaderWriter& visitor)
{
visitor.Write(*this);
}
}