From 7dab1d735f77f56d06988b4a4b7dc5ac299b5e3c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=A9r=C3=B4me=20Leclercq?= Date: Fri, 4 Mar 2022 18:32:31 +0100 Subject: [PATCH] Shader: Add AstExportVisitor --- .../Nazara/Shader/Ast/AstExportVisitor.hpp | 46 +++++++++++++++++++ .../Nazara/Shader/Ast/AstExportVisitor.inl | 12 +++++ src/Nazara/Shader/Ast/AstExportVisitor.cpp | 25 ++++++++++ 3 files changed, 83 insertions(+) create mode 100644 include/Nazara/Shader/Ast/AstExportVisitor.hpp create mode 100644 include/Nazara/Shader/Ast/AstExportVisitor.inl create mode 100644 src/Nazara/Shader/Ast/AstExportVisitor.cpp diff --git a/include/Nazara/Shader/Ast/AstExportVisitor.hpp b/include/Nazara/Shader/Ast/AstExportVisitor.hpp new file mode 100644 index 000000000..49db1d5e8 --- /dev/null +++ b/include/Nazara/Shader/Ast/AstExportVisitor.hpp @@ -0,0 +1,46 @@ +// Copyright (C) 2022 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 + +#pragma once + +#ifndef NAZARA_SHADER_AST_ASTEXPORTVISITOR_HPP +#define NAZARA_SHADER_AST_ASTEXPORTVISITOR_HPP + +#include +#include +#include +#include + +namespace Nz::ShaderAst +{ + class NAZARA_SHADER_API AstExportVisitor : public AstRecursiveVisitor + { + public: + struct Callbacks; + + AstExportVisitor() = default; + AstExportVisitor(const AstExportVisitor&) = delete; + AstExportVisitor(AstExportVisitor&&) = delete; + ~AstExportVisitor() = default; + + void Visit(Statement& statement, const Callbacks& callbacks); + + AstExportVisitor& operator=(const AstExportVisitor&) = delete; + AstExportVisitor& operator=(AstExportVisitor&&) = delete; + + struct Callbacks + { + std::function onExportedStruct; + }; + + private: + void Visit(DeclareStructStatement& node) override; + + const Callbacks* m_callbacks; + }; +} + +#include + +#endif // NAZARA_SHADER_AST_ASTEXPORTVISITOR_HPP diff --git a/include/Nazara/Shader/Ast/AstExportVisitor.inl b/include/Nazara/Shader/Ast/AstExportVisitor.inl new file mode 100644 index 000000000..84c3f06b6 --- /dev/null +++ b/include/Nazara/Shader/Ast/AstExportVisitor.inl @@ -0,0 +1,12 @@ +// Copyright (C) 2022 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::ShaderAst +{ +} + +#include diff --git a/src/Nazara/Shader/Ast/AstExportVisitor.cpp b/src/Nazara/Shader/Ast/AstExportVisitor.cpp new file mode 100644 index 000000000..3d79f5f35 --- /dev/null +++ b/src/Nazara/Shader/Ast/AstExportVisitor.cpp @@ -0,0 +1,25 @@ +// Copyright (C) 2022 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 +#include + +namespace Nz::ShaderAst +{ + void AstExportVisitor::Visit(Statement& statement, const Callbacks& callbacks) + { + m_callbacks = &callbacks; + statement.Visit(*this); + } + + void AstExportVisitor::Visit(DeclareStructStatement& node) + { + if (!node.isExported.HasValue() || !node.isExported.GetResultingValue()) + return; + + if (m_callbacks->onExportedStruct) + m_callbacks->onExportedStruct(node); + } +}