Renderer/ShaderAst: Add BinaryFunc
This commit is contained in:
parent
41b50eeac3
commit
25562a5856
|
|
@ -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;
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
};
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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");
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
||||||
|
|
@ -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);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue