Pulp 1.88.0
Cross-platform audio plugin framework
Loading...
Searching...
No Matches
custom_shader_host.hpp
Go to the documentation of this file.
1#pragma once
2
3#include <string>
4#include <algorithm>
5#include <chrono>
6#include <cstdint>
7#include <optional>
8#include <utility>
9#include <vector>
11
12namespace pulp::view {
13
28public:
30 std::string uniform_name;
31 std::string channel_name;
32 std::string param_name;
33 std::uint32_t last_publish_seq = 0;
34 std::chrono::steady_clock::time_point last_publish_at{};
35 float neutral = 0.0f;
37 };
39 std::string channel_name;
40 std::shared_ptr<const canvas::Canvas::ShaderDataTexture> data;
41 std::uint32_t last_publish_seq = 0;
42 std::chrono::steady_clock::time_point last_publish_at{};
43 float neutral = 0.0f;
44 };
45 virtual ~CustomShaderHost() = default;
46
51 void set_custom_shader(std::string sksl);
52
55
56 bool has_custom_shader() const { return !custom_sksl_.empty(); }
57 const std::string& custom_shader() const { return custom_sksl_; }
62 void set_chart_shader(std::string sksl, float reach = 0.0f) {
63 chart_sksl_ = std::move(sksl);
64 chart_reach_ = reach > 0.0f ? reach : 0.0f;
65 }
66 const std::string& chart_shader() const { return chart_sksl_; }
67 float chart_reach() const {
68 return chart_reach_;
69 }
70
71 void set_shader_uniforms(std::vector<canvas::Canvas::NamedUniform> uniforms) {
72 shader_uniforms_ = std::move(uniforms);
73 }
74 const std::vector<canvas::Canvas::NamedUniform>& shader_uniforms() const { return shader_uniforms_; }
75 void set_shader_value_bindings(std::vector<ShaderValueBinding> bindings) {
76 shader_value_bindings_ = std::move(bindings);
77 }
78 const std::vector<ShaderValueBinding>& shader_value_bindings() const {
79 return shader_value_bindings_;
80 }
81 std::vector<ShaderValueBinding>& shader_value_bindings() { return shader_value_bindings_; }
82 bool shader_uniform_bound(const std::string& name) const {
83 return std::any_of(shader_value_bindings_.begin(), shader_value_bindings_.end(),
84 [&](const auto& binding) { return binding.uniform_name == name; });
85 }
86 void set_shader_scope_binding(std::optional<ShaderScopeBinding> binding) {
87 shader_scope_binding_ = std::move(binding);
88 }
89 const std::optional<ShaderScopeBinding>& shader_scope_binding() const {
90 return shader_scope_binding_;
91 }
92 std::optional<ShaderScopeBinding>& shader_scope_binding() { return shader_scope_binding_; }
93 bool set_shader_uniform_value(const std::string& name, float value) {
94 for (auto& uniform : shader_uniforms_) {
95 if (uniform.name == name && uniform.count == 1) {
96 if (uniform.v[0] == value) return false;
97 uniform.v[0] = value;
98 return true;
99 }
100 }
102 uniform.name = name;
103 uniform.count = 1;
104 uniform.v[0] = value;
105 shader_uniforms_.push_back(std::move(uniform));
106 return true;
107 }
108 void set_shader_reach(float reach) { shader_reach_ = reach < 0.0f ? 0.0f : reach; }
109 float shader_reach() const { return shader_reach_; }
110 void set_shader_geometry(std::optional<canvas::Canvas::ShaderGeometry> geometry) {
111 shader_geometry_ = std::move(geometry);
112 }
113 const std::optional<canvas::Canvas::ShaderGeometry>& shader_geometry() const {
114 return shader_geometry_;
115 }
116 void set_shader_geometry_spec(std::string spec, std::uint64_t topology_hash) {
117 shader_geometry_spec_ = std::move(spec);
118 shader_geometry_topology_hash_ = topology_hash;
119 }
120 const std::string& shader_geometry_spec() const { return shader_geometry_spec_; }
121 std::uint64_t shader_geometry_topology_hash() const { return shader_geometry_topology_hash_; }
122
132 bool shader_uses_time() const { return shader_uses_time_; }
133
140 bool shader_draw_failure_logged() const { return shader_draw_failure_logged_; }
141 void mark_shader_draw_failure_logged() { shader_draw_failure_logged_ = true; }
142
143private:
144 std::string custom_sksl_;
145 std::string chart_sksl_;
146 float chart_reach_ = 0.0f;
147 bool shader_uses_time_ = false;
148 bool shader_draw_failure_logged_ = false;
149 std::vector<canvas::Canvas::NamedUniform> shader_uniforms_;
150 std::vector<ShaderValueBinding> shader_value_bindings_;
151 std::optional<ShaderScopeBinding> shader_scope_binding_;
152 float shader_reach_ = 0.0f;
153 std::optional<canvas::Canvas::ShaderGeometry> shader_geometry_;
154 std::string shader_geometry_spec_;
155 std::uint64_t shader_geometry_topology_hash_ = 0;
156};
157
158} // namespace pulp::view
Mixin for widgets whose body can be painted by a custom SkSL shader.
Definition custom_shader_host.hpp:27
void clear_custom_shader()
Remove the shader and restore the default C++ paint path.
const std::string & shader_geometry_spec() const
Definition custom_shader_host.hpp:120
std::uint64_t shader_geometry_topology_hash() const
Definition custom_shader_host.hpp:121
virtual ~CustomShaderHost()=default
bool shader_uses_time() const
True when the shader actually declares a time uniform, and therefore needs a continuous repaint to an...
Definition custom_shader_host.hpp:132
const std::vector< canvas::Canvas::NamedUniform > & shader_uniforms() const
Definition custom_shader_host.hpp:74
void set_shader_value_bindings(std::vector< ShaderValueBinding > bindings)
Definition custom_shader_host.hpp:75
bool set_shader_uniform_value(const std::string &name, float value)
Definition custom_shader_host.hpp:93
const std::optional< canvas::Canvas::ShaderGeometry > & shader_geometry() const
Definition custom_shader_host.hpp:113
const std::optional< ShaderScopeBinding > & shader_scope_binding() const
Definition custom_shader_host.hpp:89
void set_shader_reach(float reach)
Definition custom_shader_host.hpp:108
bool shader_uniform_bound(const std::string &name) const
Definition custom_shader_host.hpp:82
float shader_reach() const
Definition custom_shader_host.hpp:109
const std::string & custom_shader() const
Definition custom_shader_host.hpp:57
void set_chart_shader(std::string sksl, float reach=0.0f)
Install a chart shader with the extra reach its own source needs (a glow preset's halo).
Definition custom_shader_host.hpp:62
const std::vector< ShaderValueBinding > & shader_value_bindings() const
Definition custom_shader_host.hpp:78
void set_shader_scope_binding(std::optional< ShaderScopeBinding > binding)
Definition custom_shader_host.hpp:86
void set_shader_geometry_spec(std::string spec, std::uint64_t topology_hash)
Definition custom_shader_host.hpp:116
void mark_shader_draw_failure_logged()
Definition custom_shader_host.hpp:141
void set_custom_shader(std::string sksl)
Install an SkSL body shader.
void set_shader_geometry(std::optional< canvas::Canvas::ShaderGeometry > geometry)
Definition custom_shader_host.hpp:110
std::vector< ShaderValueBinding > & shader_value_bindings()
Definition custom_shader_host.hpp:81
bool has_custom_shader() const
Definition custom_shader_host.hpp:56
std::optional< ShaderScopeBinding > & shader_scope_binding()
Definition custom_shader_host.hpp:92
const std::string & chart_shader() const
Definition custom_shader_host.hpp:66
bool shader_draw_failure_logged() const
One-shot latch for "the body shader failed to draw and we logged it".
Definition custom_shader_host.hpp:140
float chart_reach() const
Definition custom_shader_host.hpp:67
void set_shader_uniforms(std::vector< canvas::Canvas::NamedUniform > uniforms)
Definition custom_shader_host.hpp:71
Hover-cursor tracking for platform window hosts.
Definition fwd.hpp:27
@ value
the widget's primary value (Knob, Fader, RangeSlider, Toggle, ProgressBar)
Definition binding_diagnostics.hpp:19
@ uniform
a custom shader uniform
Definition binding_diagnostics.hpp:22
An arbitrary named shader uniform (name → float / vec2 / vec3 / vec4).
Definition canvas.hpp:1652
std::string name
Definition canvas.hpp:1653
Definition custom_shader_host.hpp:38
std::shared_ptr< const canvas::Canvas::ShaderDataTexture > data
Definition custom_shader_host.hpp:40
std::uint32_t last_publish_seq
Definition custom_shader_host.hpp:41
float neutral
Definition custom_shader_host.hpp:43
std::chrono::steady_clock::time_point last_publish_at
Definition custom_shader_host.hpp:42
std::string channel_name
Definition custom_shader_host.hpp:39
Definition custom_shader_host.hpp:29
std::chrono::steady_clock::time_point last_publish_at
Definition custom_shader_host.hpp:34
std::string param_name
Definition custom_shader_host.hpp:32
bool managed_by_param_binding
Definition custom_shader_host.hpp:36
float neutral
Definition custom_shader_host.hpp:35
std::string uniform_name
Definition custom_shader_host.hpp:30
std::string channel_name
Definition custom_shader_host.hpp:31
std::uint32_t last_publish_seq
Definition custom_shader_host.hpp:33