// 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(BasicType type) { switch (type) { case BasicType::Float2: return 2; case BasicType::Float3: return 3; case BasicType::Float4: return 4; case BasicType::Mat4x4: return 4; default: return 1; } } inline BasicType Node::GetComponentType(BasicType type) { switch (type) { case BasicType::Float2: case BasicType::Float3: case BasicType::Float4: return BasicType::Float1; case BasicType::Mat4x4: return BasicType::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 AccessMember::AccessMember() : Expression(NodeType::AccessMember) { } inline std::shared_ptr AccessMember::Build(ExpressionPtr structExpr, std::size_t memberIndex, ShaderExpressionType exprType) { auto node = std::make_shared(); node->exprType = std::move(exprType); node->memberIndex = memberIndex; node->structExpr = std::move(structExpr); 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(BasicType 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(BasicType 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) { } template std::shared_ptr Nz::ShaderNodes::Constant::Build(const T& value) { auto node = std::make_shared(); node->value = 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