// Copyright (C) 2020 Jérôme Leclercq // This file is part of the "Nazara Engine - Renderer module" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include namespace Nz::ShaderNodes { inline Node::Node(NodeType type, bool isStatement) : m_type(type), m_isStatement(isStatement) { } inline NodeType ShaderNodes::Node::GetType() const { return m_type; } inline bool Node::IsStatement() const { return m_isStatement; } inline unsigned int Node::GetComponentCount(ExpressionType type) { switch (type) { case ExpressionType::Float2: return 2; case ExpressionType::Float3: return 3; case ExpressionType::Float4: return 4; case ExpressionType::Mat4x4: return 4; default: return 1; } } inline ExpressionType Node::GetComponentType(ExpressionType type) { switch (type) { case ExpressionType::Float2: case ExpressionType::Float3: case ExpressionType::Float4: return ExpressionType::Float1; case ExpressionType::Mat4x4: return ExpressionType::Float4; default: return type; } } inline Expression::Expression(NodeType type) : Node(type, false) { } inline Statement::Statement(NodeType type) : Node(type, true) { } inline ExpressionStatement::ExpressionStatement() : Statement(NodeType::ExpressionStatement) { } inline std::shared_ptr ExpressionStatement::Build(ExpressionPtr expr) { auto node = std::make_shared(); node->expression = std::move(expr); return node; } inline ConditionalStatement::ConditionalStatement() : Statement(NodeType::ConditionalStatement) { } inline std::shared_ptr ConditionalStatement::Build(std::string condition, StatementPtr statementPtr) { auto node = std::make_shared(); node->conditionName = std::move(condition); node->statement = std::move(statementPtr); return node; } inline StatementBlock::StatementBlock() : Statement(NodeType::StatementBlock) { } template std::shared_ptr StatementBlock::Build(Args&&... args) { auto node = std::make_shared(); node->statements = std::vector({ std::forward(args)... }); return node; } inline DeclareVariable::DeclareVariable() : Statement(NodeType::DeclareVariable) { } inline std::shared_ptr DeclareVariable::Build(LocalVariablePtr variable, ExpressionPtr expression) { auto node = std::make_shared(); node->expression = std::move(expression); node->variable = std::move(variable); return node; } inline Identifier::Identifier() : Expression(NodeType::Identifier) { } inline std::shared_ptr Identifier::Build(VariablePtr variable) { auto node = std::make_shared(); node->var = std::move(variable); return node; } inline AssignOp::AssignOp() : Expression(NodeType::AssignOp) { } inline std::shared_ptr AssignOp::Build(AssignType op, ExpressionPtr left, ExpressionPtr right) { auto node = std::make_shared(); node->op = op; node->left = std::move(left); node->right = std::move(right); return node; } inline BinaryOp::BinaryOp() : Expression(NodeType::BinaryOp) { } inline std::shared_ptr BinaryOp::Build(BinaryType op, ExpressionPtr left, ExpressionPtr right) { auto node = std::make_shared(); node->op = op; node->left = std::move(left); node->right = std::move(right); return node; } inline Branch::Branch() : Statement(NodeType::Branch) { } inline std::shared_ptr Branch::Build(ExpressionPtr condition, StatementPtr trueStatement, StatementPtr falseStatement) { auto node = std::make_shared(); node->condStatements.emplace_back(ConditionalStatement{ std::move(condition), std::move(trueStatement) }); node->elseStatement = std::move(falseStatement); return node; } inline Cast::Cast() : Expression(NodeType::Cast) { } inline std::shared_ptr Cast::Build(ExpressionType castTo, ExpressionPtr first, ExpressionPtr second, ExpressionPtr third, ExpressionPtr fourth) { auto node = std::make_shared(); node->exprType = castTo; node->expressions = { {first, second, third, fourth} }; return node; } inline std::shared_ptr Cast::Build(ExpressionType castTo, ExpressionPtr* Expressions, std::size_t expressionCount) { auto node = std::make_shared(); node->exprType = castTo; for (std::size_t i = 0; i < expressionCount; ++i) node->expressions[i] = Expressions[i]; return node; } inline Constant::Constant() : Expression(NodeType::Constant) { } inline std::shared_ptr Constant::Build(bool value) { auto node = std::make_shared(); node->exprType = ExpressionType::Boolean; node->values.bool1 = value; return node; } inline std::shared_ptr Constant::Build(float value) { auto node = std::make_shared(); node->exprType = ExpressionType::Float1; node->values.vec1 = value; return node; } inline std::shared_ptr Constant::Build(const Vector2f& value) { auto node = std::make_shared(); node->exprType = ExpressionType::Float2; node->values.vec2 = value; return node; } inline std::shared_ptr Constant::Build(const Vector3f& value) { auto node = std::make_shared(); node->exprType = ExpressionType::Float3; node->values.vec3 = value; return node; } inline std::shared_ptr Constant::Build(const Vector4f& value) { auto node = std::make_shared(); node->exprType = ExpressionType::Float4; node->values.vec4 = value; return node; } inline SwizzleOp::SwizzleOp() : Expression(NodeType::SwizzleOp) { } inline std::shared_ptr SwizzleOp::Build(ExpressionPtr expressionPtr, std::initializer_list swizzleComponents) { auto node = std::make_shared(); node->componentCount = swizzleComponents.size(); node->expression = std::move(expressionPtr); std::copy(swizzleComponents.begin(), swizzleComponents.end(), node->components.begin()); return node; } inline Sample2D::Sample2D() : Expression(NodeType::Sample2D) { } inline std::shared_ptr Sample2D::Build(ExpressionPtr samplerPtr, ExpressionPtr coordinatesPtr) { auto node = std::make_shared(); node->coordinates = std::move(coordinatesPtr); node->sampler = std::move(samplerPtr); return node; } inline IntrinsicCall::IntrinsicCall() : Expression(NodeType::IntrinsicCall) { } inline std::shared_ptr IntrinsicCall::Build(IntrinsicType intrinsic, std::vector parameters) { auto node = std::make_shared(); node->intrinsic = intrinsic; node->parameters = std::move(parameters); return node; } } #include