Loading...
Searching...
No Matches
Texgen.hpp
1#pragma once
2#if __has_include(<score_plugin_gfx.hpp>)
3#define SCORE_JIT_HAS_TEXGEN 1
4#include <Process/Execution/ProcessComponent.hpp>
5#include <Process/GenericProcessFactory.hpp>
6#include <Process/Process.hpp>
7#include <Process/ProcessMetadata.hpp>
8#include <Process/Script/ScriptEditor.hpp>
9#include <Process/Script/ScriptProcess.hpp>
10
11#include <Scenario/Commands/ScriptEditCommand.hpp>
12
13#include <Control/DefaultEffectItem.hpp>
14#include <Effect/EffectFactory.hpp>
15#include <JitCpp/EditScript.hpp>
16
17#include <ossia/dataflow/execution_state.hpp>
18#include <ossia/dataflow/graph_node.hpp>
19#include <ossia/dataflow/node_process.hpp>
20
21#include <verdigris>
22
23namespace Jit
24{
25class TexgenModel;
26}
27PROCESS_METADATA(
28 , Jit::TexgenModel, "b9a20181-2925-4ade-925e-a2fd05fcbf9b", "Jit",
29 "C++ texture generator", Process::ProcessCategory::Script, "Visuals/Textures",
30 "Generate a texture", "ossia score", QStringList{}, {}, {},
31 QUrl("https://ossia.io/score-docs/processes/texgen.html#texture-generator"),
32 Process::ProcessFlags::SupportsAll | Process::ProcessFlags::ScriptEditingSupported)
33namespace Jit
34{
35struct Driver;
36using TexgenFunction = void(unsigned char* rgb, int width, int height, int t);
37using TexgenCompiler = Driver;
38using TexgenFactory = std::function<TexgenFunction>;
39class TexgenModel : public Process::ProcessModel
40{
41 friend class JitUI;
42 friend class JitUpdateUI;
43 SCORE_SERIALIZE_FRIENDS
44 PROCESS_METADATA_IMPL(TexgenModel)
45
46 W_OBJECT(TexgenModel)
47public:
48 TexgenModel(
49 TimeVal t, const QString& jitProgram, const Id<Process::ProcessModel>&,
50 QObject* parent);
51 ~TexgenModel() override;
52
53 TexgenModel(DataStream::Deserializer& vis, QObject* parent);
54 TexgenModel(JSONObject::Deserializer& vis, QObject* parent);
55 TexgenModel(DataStream::Deserializer&& vis, QObject* parent);
56 TexgenModel(JSONObject::Deserializer&& vis, QObject* parent);
57
58 bool validate(const QString& txt) const noexcept;
59 const QString& script() const noexcept { return m_text; }
60 [[nodiscard]] Process::ScriptChangeResult setScript(const QString& txt);
61 void scriptChanged(const QString& txt) W_SIGNAL(scriptChanged, txt);
62 void programChanged() W_SIGNAL(programChanged);
63
64 QString prettyName() const noexcept override;
65
66 TexgenFactory factory;
67
68 void errorMessage(int line, const QString& e) W_SIGNAL(errorMessage, line, e);
69
70 PROPERTY(QString, script READ script WRITE setScript NOTIFY scriptChanged)
71private:
72 QString effect() const noexcept override;
73 void loadPreset(const Process::Preset& preset) override;
74 Process::Preset savePreset() const noexcept override;
75 bool presetChangesPorts(const Process::Preset& p) const noexcept override
76 {
78 }
79 void init();
80 [[nodiscard]] Process::ScriptChangeResult reload();
81 QString m_text;
82 std::unique_ptr<TexgenCompiler> m_compiler;
83};
84}
85
86namespace Process
87{
88template <>
89QString
90EffectProcessFactory_T<Jit::TexgenModel>::customConstructionData() const noexcept;
91
92template <>
93Process::Descriptor
94EffectProcessFactory_T<Jit::TexgenModel>::descriptor(QString d) const noexcept;
95template <>
96Process::Descriptor EffectProcessFactory_T<Jit::TexgenModel>::descriptor(
97 const Process::ProcessModel& d) const noexcept;
98}
99class QPlainTextEdit;
100namespace Jit
101{
102
103struct TexgenLanguageSpec
104{
105 static constexpr const char* language = "C++";
106};
107
108using TexgenEffectFactory = Process::EffectProcessFactory_T<TexgenModel>;
109using TexgenLayerFactory = Process::ScriptLayerFactory_T<
111 TexgenModel, TexgenModel::p_script, TexgenLanguageSpec>>;
112
113class TexgenExecutor final
114 : public Execution::ProcessComponent_T<Jit::TexgenModel, ossia::node_process>
115{
116 COMPONENT_METADATA("ec4bd3af-8d81-4d92-9b53-86a34d8108f8")
117
118public:
119 static constexpr bool is_unique = true;
120
121 TexgenExecutor(Jit::TexgenModel& proc, const Execution::Context& ctx, QObject* parent);
122 ~TexgenExecutor() override;
123
124 void cleanup() override;
125};
126using TexgenExecutorFactory = Execution::ProcessComponentFactory_T<TexgenExecutor>;
127}
128
129namespace Jit
130{
131class EditTexgen : public Scenario::EditScript<TexgenModel, TexgenModel::p_script>
132{
133 SCORE_COMMAND_DECL(CommandFactoryName(), EditTexgen, "Edit a texture script")
134public:
135 using Scenario::EditScript<TexgenModel, TexgenModel::p_script>::EditScript;
136};
137
138}
139
140namespace score
141{
142template <>
143struct StaticPropertyCommand<Jit::TexgenModel::p_script> : Jit::EditTexgen
144{
145 using Jit::EditTexgen::EditTexgen;
146};
147}
148
149#endif
Definition DataStreamVisitor.hpp:202
Definition JSONVisitor.hpp:423
Definition EffectFactory.hpp:86
Definition EffectFactory.hpp:14
The Process class.
Definition score-lib-process/Process/Process.hpp:82
bool scriptPresetChangesPorts(const Preset &preset) const noexcept
Definition score-lib-process/Process/Process.cpp:271
Definition ScriptEditor.hpp:54
Definition ScriptEditCommand.hpp:16
The id_base_t class.
Definition Identifier.hpp:59
Components used for the execution of a score.
Definition PortTap.cpp:24
Base classes and tools to implement processes and layers.
Definition JSONVisitor.hpp:1115
@ ScriptEditingSupported
The process is based on user-editable source code (JS, Faust, etc.)
Definition ProcessFlags.hpp:70
Main plug-in of score.
Definition ConnectionsList.hpp:22
Base toolkit upon which the software is built.
Definition Application.cpp:83
Definition Process/Execution/ProcessComponent.hpp:101
Definition ScriptProcess.hpp:14
Definition TimeValue.hpp:21