Renderer/ShaderAst: Add BinaryFunc

This commit is contained in:
Lynix 2020-06-04 18:29:50 +02:00
parent 41b50eeac3
commit 25562a5856
4 changed files with 75 additions and 1 deletions

View File

@ -33,6 +33,7 @@ namespace Nz
void Write(const ShaderAst::AssignOp& node) override; void Write(const ShaderAst::AssignOp& node) override;
void Write(const ShaderAst::Branch& node) override; void Write(const ShaderAst::Branch& node) override;
void Write(const ShaderAst::BinaryFunc& node) override;
void Write(const ShaderAst::BinaryOp& node) override; void Write(const ShaderAst::BinaryOp& node) override;
void Write(const ShaderAst::BuiltinVariable& node) override; void Write(const ShaderAst::BuiltinVariable& node) override;
void Write(const ShaderAst::Cast& node) override; void Write(const ShaderAst::Cast& node) override;

View File

@ -26,12 +26,19 @@ namespace Nz
Simple //< = Simple //< =
}; };
enum class BinaryIntrinsic
{
CrossProduct,
DotProduct
};
enum class BinaryType enum class BinaryType
{ {
Add, //< + Add, //< +
Substract, //< - Substract, //< -
Multiply, //< * Multiply, //< *
Divide, //< / Divide, //< /
Equality //< == Equality //< ==
}; };
@ -325,6 +332,22 @@ namespace Nz
ExpressionPtr sampler; ExpressionPtr sampler;
ExpressionPtr coordinates; ExpressionPtr coordinates;
}; };
//////////////////////////////////////////////////////////////////////////
class NAZARA_RENDERER_API BinaryFunc : public Expression
{
public:
inline BinaryFunc(BinaryIntrinsic Op, ExpressionPtr Left, ExpressionPtr Right);
ExpressionType GetExpressionType() const override;
void Register(ShaderWriter& visitor) override;
void Visit(ShaderWriter& visitor) override;
BinaryIntrinsic intrinsic;
ExpressionPtr left;
ExpressionPtr right;
};
} }
} }

View File

@ -243,6 +243,29 @@ namespace Nz
if (coordinates->GetExpressionType() != ExpressionType::Float2) if (coordinates->GetExpressionType() != ExpressionType::Float2)
throw std::runtime_error("Coordinates must be a Float2"); throw std::runtime_error("Coordinates must be a Float2");
} }
inline BinaryFunc::BinaryFunc(BinaryIntrinsic Op, ExpressionPtr Left, ExpressionPtr Right) :
intrinsic(Op),
left(Left),
right(Right)
{
ExpressionType leftType = left->GetExpressionType();
ExpressionType rightType = right->GetExpressionType();
if (leftType != rightType)
//TODO: AstParseError
throw std::runtime_error("Left expression type must match right expression type");
switch (intrinsic)
{
case BinaryIntrinsic::CrossProduct:
{
if (leftType != ExpressionType::Float3)
//TODO: AstParseError
throw std::runtime_error("CrossProduct only works with Float3 expressions");
}
}
}
} }
} }

View File

@ -254,4 +254,31 @@ namespace Nz::ShaderAst
{ {
visitor.Write(*this); visitor.Write(*this);
} }
ExpressionType BinaryFunc::GetExpressionType() const
{
switch (intrinsic)
{
case BinaryIntrinsic::CrossProduct:
return left->GetExpressionType();
case BinaryIntrinsic::DotProduct:
return ExpressionType::Float1;
}
NazaraAssert(false, "Unhandled builtin");
return ExpressionType::Void;
}
void BinaryFunc::Register(ShaderWriter& visitor)
{
left->Register(visitor);
right->Register(visitor);
}
void BinaryFunc::Visit(ShaderWriter& visitor)
{
visitor.Write(*this);
}
} }