Loading...
Searching...
No Matches
AvndJit.hpp
1#pragma once
2#include <Process/Execution/ProcessComponent.hpp>
3#include <Process/GenericProcessFactory.hpp>
4#include <Process/Process.hpp>
5#include <Process/ProcessMetadata.hpp>
6#include <Process/Script/ScriptEditor.hpp>
7
8#include <Scenario/Commands/ScriptEditCommand.hpp>
9
10#include <Control/DefaultEffectItem.hpp>
11#include <Effect/EffectFactory.hpp>
12#include <JitCpp/EditScript.hpp>
13
14#include <ossia/dataflow/execution_state.hpp>
15#include <ossia/dataflow/graph_node.hpp>
16#include <ossia/dataflow/node_process.hpp>
17
18#include <score_plugin_jit_export.h>
19namespace AvndJit
20{
21class Model;
22}
23
24namespace Jit
25{
26struct Driver;
27}
28PROCESS_METADATA(
29 , AvndJit::Model, "193686f2-1f3b-45ce-9251-2e79ca06933b", "Jit", "Avendish",
30 Process::ProcessCategory::Script, "Script", "Avendish compilation process",
31 "ossia score", QStringList{}, {}, {},
32 QUrl(
33 "https://ossia.io/score-docs/development/plugins/"
34 "plugins-with-avendish.html#avendish-documentation"),
35 Process::ProcessFlags::SupportsAll | Process::ProcessFlags::DynamicPorts)
36namespace AvndJit
37{
38using NodeCompiler = Jit::Driver;
39using NodeFunction = ossia::graph_node*(int, double);
40using NodeFactory = std::function<NodeFunction>;
41class Model : public Process::ProcessModel
42{
43 friend class JitUI;
44 friend class JitUpdateUI;
45 SCORE_SERIALIZE_FRIENDS
46 PROCESS_METADATA_IMPL(Model)
47
48 W_OBJECT(Model)
49public:
50 Model(
51 TimeVal t, const QString& jitProgram, const Id<Process::ProcessModel>&,
52 QObject* parent);
53 ~Model() override;
54
55 Model(DataStream::Deserializer& vis, QObject* parent);
56 Model(JSONObject::Deserializer& vis, QObject* parent);
57 Model(DataStream::Deserializer&& vis, QObject* parent);
58 Model(JSONObject::Deserializer&& vis, QObject* parent);
59
60 bool validate(const QString& txt) const noexcept;
61
62 const QString& script() const { return m_text; }
63 [[nodiscard]] Process::ScriptChangeResult setScript(const QString& txt);
64 void scriptChanged(const QString& txt) W_SIGNAL(scriptChanged, txt);
65 void programChanged() W_SIGNAL(programChanged);
66
67 static constexpr bool hasExternalUI() noexcept { return true; }
68
69 QString prettyName() const noexcept override;
70
71 std::shared_ptr<NodeFactory> factory;
72
73 void errorMessage(int line, const QString& e) W_SIGNAL(errorMessage, line, e);
74 PROPERTY(QString, script READ script WRITE setScript NOTIFY scriptChanged)
75private:
76 std::shared_ptr<NodeFactory> getJitFactory();
77
78 QString effect() const noexcept override;
79 void loadPreset(const Process::Preset& preset) override;
80 Process::Preset savePreset() const noexcept override;
81
82 void init();
83 [[nodiscard]] Process::ScriptChangeResult reload();
84 QString m_text;
85 std::unique_ptr<NodeCompiler> m_compiler;
86};
87
88struct LanguageSpec
89{
90 static constexpr const char* language = "C++";
91};
92
94using LayerFactory = Process::EffectLayerFactory_T<
97}
98
99namespace Process
100{
101template <>
102QString EffectProcessFactory_T<AvndJit::Model>::customConstructionData() const noexcept;
103
104template <>
105Process::Descriptor
106EffectProcessFactory_T<AvndJit::Model>::descriptor(QString d) const noexcept;
107
108template <>
109Process::Descriptor EffectProcessFactory_T<AvndJit::Model>::descriptor(
110 const Process::ProcessModel& d) const noexcept;
111}
112
113namespace AvndJit
114{
115class Executor final
116 : public Execution::ProcessComponent_T<AvndJit::Model, ossia::node_process>
117{
118 COMPONENT_METADATA("086fbfcf-44e9-4ea6-baad-b4f76e938d69")
119
120public:
121 static constexpr bool is_unique = true;
122
123 Executor(AvndJit::Model& proc, const Execution::Context& ctx, QObject* parent);
124 ~Executor() override;
125};
127}
128
129namespace AvndJit
130{
131class EditAvndScript : public Scenario::EditScript<Model, Model::p_script>
132{
133 SCORE_COMMAND_DECL(Jit::CommandFactoryName(), EditAvndScript, "Edit a C++ program")
134public:
135 using Scenario::EditScript<Model, Model::p_script>::EditScript;
136};
137
138}
139
140namespace score
141{
142template <>
143struct StaticPropertyCommand<AvndJit::Model::p_script> : AvndJit::EditAvndScript
144{
145 using AvndJit::EditAvndScript::EditAvndScript;
146};
147}
Definition AvndJit.hpp:132
Definition AvndJit.hpp:117
Definition DataStreamVisitor.hpp:202
Definition Process/Execution/ProcessComponent.hpp:119
Definition JSONVisitor.hpp:423
Definition DefaultEffectItem.hpp:26
Definition EffectFactory.hpp:67
Definition EffectFactory.hpp:14
The Process class.
Definition score-lib-process/Process/Process.hpp:61
Definition ScriptEditor.hpp:47
Definition ScriptEditCommand.hpp:16
The id_base_t class.
Definition Identifier.hpp:57
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
@ DynamicPorts
The process has a variable structure, e.g. its ports can change dynamically.
Definition ProcessFlags.hpp:59
Base toolkit upon which the software is built.
Definition Application.cpp:97
STL namespace.
Definition ExecutionContext.hpp:76
Definition Process/Execution/ProcessComponent.hpp:89
Definition Driver.hpp:11
Definition ScriptProcess.hpp:14
Definition TimeValue.hpp:21
Definition PropertyCommand.hpp:112