// Copyright (C) 2021 Jérôme "Lynix" Leclercq (lynix680@gmail.com) // This file is part of the "Nazara Engine - Shader module" // For conditions of distribution and use, see copyright notice in Config.hpp #include #include namespace Nz::ShaderBuilder { inline std::unique_ptr Impl::AccessMember::operator()(ShaderAst::ExpressionPtr expr, std::vector memberIdentifiers) const { auto accessMemberNode = std::make_unique(); accessMemberNode->expr = std::move(expr); accessMemberNode->identifiers = std::move(memberIdentifiers); return accessMemberNode; } inline std::unique_ptr Impl::AccessIndex::operator()(ShaderAst::ExpressionPtr expr, const std::vector& indexConstants) const { auto accessMemberNode = std::make_unique(); accessMemberNode->expr = std::move(expr); accessMemberNode->indices.reserve(indexConstants.size()); for (Int32 index : indexConstants) accessMemberNode->indices.push_back(ShaderBuilder::Constant(index)); return accessMemberNode; } inline std::unique_ptr Impl::AccessIndex::operator()(ShaderAst::ExpressionPtr expr, std::vector indexExpressions) const { auto accessMemberNode = std::make_unique(); accessMemberNode->expr = std::move(expr); accessMemberNode->indices = std::move(indexExpressions); return accessMemberNode; } inline std::unique_ptr Impl::Assign::operator()(ShaderAst::AssignType op, ShaderAst::ExpressionPtr left, ShaderAst::ExpressionPtr right) const { auto assignNode = std::make_unique(); assignNode->op = op; assignNode->left = std::move(left); assignNode->right = std::move(right); return assignNode; } inline std::unique_ptr Impl::Binary::operator()(ShaderAst::BinaryType op, ShaderAst::ExpressionPtr left, ShaderAst::ExpressionPtr right) const { auto binaryNode = std::make_unique(); binaryNode->op = op; binaryNode->left = std::move(left); binaryNode->right = std::move(right); return binaryNode; } template std::unique_ptr Impl::Branch::operator()(ShaderAst::ExpressionPtr condition, ShaderAst::StatementPtr truePath, ShaderAst::StatementPtr falsePath) const { auto branchNode = std::make_unique(); auto& condStatement = branchNode->condStatements.emplace_back(); condStatement.condition = std::move(condition); condStatement.statement = std::move(truePath); branchNode->elseStatement = std::move(falsePath); branchNode->isConst = Const; return branchNode; } template std::unique_ptr Impl::Branch::operator()(std::vector condStatements, ShaderAst::StatementPtr elseStatement) const { auto branchNode = std::make_unique(); branchNode->condStatements = std::move(condStatements); branchNode->elseStatement = std::move(elseStatement); branchNode->isConst = Const; return branchNode; } inline std::unique_ptr Impl::CallFunction::operator()(std::string functionName, std::vector parameters) const { auto callFunctionExpression = std::make_unique(); callFunctionExpression->targetFunction = std::move(functionName); callFunctionExpression->parameters = std::move(parameters); return callFunctionExpression; } inline std::unique_ptr Impl::Cast::operator()(ShaderAst::ExpressionType targetType, std::array expressions) const { auto castNode = std::make_unique(); castNode->expressions = std::move(expressions); castNode->targetType = std::move(targetType); return castNode; } inline std::unique_ptr Impl::Cast::operator()(ShaderAst::ExpressionType targetType, std::vector expressions) const { auto castNode = std::make_unique(); castNode->targetType = std::move(targetType); assert(expressions.size() <= castNode->expressions.size()); for (std::size_t i = 0; i < expressions.size(); ++i) castNode->expressions[i] = std::move(expressions[i]); return castNode; } inline std::unique_ptr Impl::ConditionalExpression::operator()(ShaderAst::ExpressionPtr condition, ShaderAst::ExpressionPtr truePath, ShaderAst::ExpressionPtr falsePath) const { auto condExprNode = std::make_unique(); condExprNode->condition = std::move(condition); condExprNode->falsePath = std::move(falsePath); condExprNode->truePath = std::move(truePath); return condExprNode; } inline std::unique_ptr Impl::ConditionalStatement::operator()(ShaderAst::ExpressionPtr condition, ShaderAst::StatementPtr statement) const { auto condStatementNode = std::make_unique(); condStatementNode->condition = std::move(condition); condStatementNode->statement = std::move(statement); return condStatementNode; } inline std::unique_ptr Impl::Constant::operator()(ShaderAst::ConstantValue value) const { auto constantNode = std::make_unique(); constantNode->value = std::move(value); return constantNode; } inline std::unique_ptr Impl::DeclareConst::operator()(std::string name, ShaderAst::ExpressionPtr initialValue) const { auto declareConstNode = std::make_unique(); declareConstNode->name = std::move(name); declareConstNode->expression = std::move(initialValue); return declareConstNode; } inline std::unique_ptr Impl::DeclareConst::operator()(std::string name, ShaderAst::ExpressionType type, ShaderAst::ExpressionPtr initialValue) const { auto declareConstNode = std::make_unique(); declareConstNode->name = std::move(name); declareConstNode->type = std::move(type); declareConstNode->expression = std::move(initialValue); return declareConstNode; } inline std::unique_ptr Impl::DeclareFunction::operator()(std::string name, ShaderAst::StatementPtr statement) const { auto declareFunctionNode = std::make_unique(); declareFunctionNode->name = std::move(name); declareFunctionNode->statements.push_back(std::move(statement)); return declareFunctionNode; } inline std::unique_ptr Impl::DeclareFunction::operator()(std::string name, std::vector parameters, std::vector statements, ShaderAst::ExpressionType returnType) const { auto declareFunctionNode = std::make_unique(); declareFunctionNode->name = std::move(name); declareFunctionNode->parameters = std::move(parameters); declareFunctionNode->returnType = std::move(returnType); declareFunctionNode->statements = std::move(statements); return declareFunctionNode; } inline std::unique_ptr Impl::DeclareFunction::operator()(std::optional entryStage, std::string name, std::vector parameters, std::vector statements, ShaderAst::ExpressionType returnType) const { auto declareFunctionNode = std::make_unique(); if (entryStage) declareFunctionNode->entryStage = *entryStage; declareFunctionNode->name = std::move(name); declareFunctionNode->parameters = std::move(parameters); declareFunctionNode->returnType = std::move(returnType); declareFunctionNode->statements = std::move(statements); return declareFunctionNode; } inline std::unique_ptr Impl::DeclareOption::operator()(std::string name, ShaderAst::ExpressionType type, ShaderAst::ExpressionPtr initialValue) const { auto declareOptionNode = std::make_unique(); declareOptionNode->optName = std::move(name); declareOptionNode->optType = std::move(type); declareOptionNode->defaultValue = std::move(initialValue); return declareOptionNode; } inline std::unique_ptr Impl::DeclareStruct::operator()(ShaderAst::StructDescription description) const { auto declareStructNode = std::make_unique(); declareStructNode->description = std::move(description); return declareStructNode; } inline std::unique_ptr Impl::DeclareVariable::operator()(std::string name, ShaderAst::ExpressionPtr initialValue) const { auto declareVariableNode = std::make_unique(); declareVariableNode->varName = std::move(name); declareVariableNode->initialExpression = std::move(initialValue); return declareVariableNode; } inline std::unique_ptr Impl::DeclareVariable::operator()(std::string name, ShaderAst::ExpressionType type, ShaderAst::ExpressionPtr initialValue) const { auto declareVariableNode = std::make_unique(); declareVariableNode->varName = std::move(name); declareVariableNode->varType = std::move(type); declareVariableNode->initialExpression = std::move(initialValue); return declareVariableNode; } inline std::unique_ptr Impl::ExpressionStatement::operator()(ShaderAst::ExpressionPtr expression) const { auto expressionStatementNode = std::make_unique(); expressionStatementNode->expression = std::move(expression); return expressionStatementNode; } inline std::unique_ptr Impl::Identifier::operator()(std::string name) const { auto identifierNode = std::make_unique(); identifierNode->identifier = std::move(name); return identifierNode; } inline std::unique_ptr Impl::Intrinsic::operator()(ShaderAst::IntrinsicType intrinsicType, std::vector parameters) const { auto intrinsicExpression = std::make_unique(); intrinsicExpression->intrinsic = intrinsicType; intrinsicExpression->parameters = std::move(parameters); return intrinsicExpression; } inline std::unique_ptr Impl::Multi::operator()(std::vector statements) const { auto multiStatement = std::make_unique(); multiStatement->statements = std::move(statements); return multiStatement; } template std::unique_ptr Impl::NoParam::operator()() const { return std::make_unique(); } inline std::unique_ptr Impl::Return::operator()(ShaderAst::ExpressionPtr expr) const { auto returnNode = std::make_unique(); returnNode->returnExpr = std::move(expr); return returnNode; } inline std::unique_ptr Impl::Swizzle::operator()(ShaderAst::ExpressionPtr expression, std::vector swizzleComponents) const { auto swizzleNode = std::make_unique(); swizzleNode->expression = std::move(expression); assert(swizzleComponents.size() <= swizzleNode->components.size()); swizzleNode->componentCount = swizzleComponents.size(); for (std::size_t i = 0; i < swizzleNode->componentCount; ++i) swizzleNode->components[i] = swizzleComponents[i]; return swizzleNode; } inline std::unique_ptr Impl::Unary::operator()(ShaderAst::UnaryType op, ShaderAst::ExpressionPtr expression) const { auto unaryNode = std::make_unique(); unaryNode->expression = std::move(expression); unaryNode->op = op; return unaryNode; } } #include