1 #ifndef OGLPLUS_TEXGEN_INTERFACE_HPP
9 #define OGLPLUS_TEXGEN_INTERFACE_HPP
22 namespace eagine::oglp::texgen {
29 class compile_context_impl;
31 class compile_context {
33 std::unique_ptr<compile_context_impl> _pimpl;
35 const compile_context_impl& _impl() const noexcept;
37 compile_context_impl& _impl() noexcept;
41 compile_context(compile_context&&) noexcept = default;
42 compile_context(const compile_context&) = delete;
43 compile_context& operator=(compile_context&&) = delete;
44 compile_context& operator=(const compile_context&) = delete;
45 ~compile_context() noexcept;
47 unsigned glsl_version() const;
52 void remember_constant(const constant_intf&);
53 bool remembers_constant(const constant_intf&) const noexcept;
55 void remember_output(const output_intf&);
56 bool remembers_output(const output_intf&) const noexcept;
59 struct constant_intf : interface<constant_intf> {
65 virtual std::ostream& definitions(std::ostream&, compile_context&) = 0;
67 virtual std::ostream& expression(std::ostream&, compile_context&) = 0;
70 struct input_intf : interface<input_intf> {
74 virtual
bool accepts_value_type(slot_data_type) = 0;
76 virtual std::ostream& definitions(std::ostream&, compile_context&) = 0;
78 virtual std::ostream& expression(std::ostream&, compile_context&) = 0;
80 virtual
bool is_connected() = 0;
82 virtual
bool is_connected(output_intf&) = 0;
84 virtual
bool can_connect(output_intf&) = 0;
86 virtual
bool connect(output_intf&) = 0;
88 virtual
void disconnect() = 0;
90 virtual
bool disconnect(output_intf&) = 0;
92 virtual output_intf& connected_output() = 0;
97 bool set_default(
float x) {
98 return set_default_value(0, x);
101 bool set_default(
float x,
float y) {
102 return set_default_value(0, x) && set_default_value(1, y);
105 bool set_default(
float x,
float y,
float z) {
106 return set_default_value(0, x) && set_default_value(1, y) &&
107 set_default_value(2, z);
110 bool set_default(
float x,
float y,
float z,
float w) {
111 return set_default_value(0, x) && set_default_value(1, y) &&
112 set_default_value(3, z) && set_default_value(4, w);
115 virtual void update_needed() = 0;
117 virtual void prepare_connected() = 0;
119 virtual bool render_connected(
const render_params&) = 0;
122 struct output_intf : interface<output_intf> {
128 virtual render_param_bits required_params() = 0;
130 virtual
bool needs_params() {
131 return bool(required_params());
134 virtual std::ostream& definitions(std::ostream&, compile_context&) = 0;
136 virtual std::ostream& expression(std::ostream&, compile_context&) = 0;
138 virtual bool is_connected(input_intf&) = 0;
140 virtual bool connect(input_intf&) = 0;
142 virtual bool disconnect(input_intf&) = 0;
144 virtual void disconnect_all() = 0;
146 virtual void notify_connected() = 0;
148 virtual void prepare_parent() = 0;
150 virtual bool render_parent(
const render_params&) = 0;
153 bool connect_output_to_input(output_intf& output, input_intf& input);
154 bool disconnect_output_from_input(output_intf& output, input_intf& input);
156 struct node_intf : interface<node_intf> {
162 virtual optional_reference_wrapper<input_intf> input_by_name(
string_view);
164 virtual bool can_add_input() = 0;
168 std::ostream& input_definitions(std::ostream&, compile_context&);
174 virtual optional_reference_wrapper<output_intf> output_by_name(
string_view);
176 void disconnect_all();
180 virtual void update_needed() = 0;
182 virtual void prepare() = 0;
184 virtual bool render(
const render_params&) = 0;
192 friend class output_slot;
195 input_intf& _impl() noexcept {
196 EAGINE_ASSERT(is_valid());
200 const input_intf& _impl() const noexcept {
201 EAGINE_ASSERT(is_valid());
206 input_slot() =
default;
208 input_slot(input_intf& impl)
211 bool is_valid() const noexcept {
212 return _pimpl !=
nullptr;
215 explicit inline operator bool() const noexcept {
219 friend bool operator==(
const input_slot& a,
const input_slot& b) noexcept {
220 return a.is_valid() && b.is_valid() && (a._pimpl == b._pimpl);
223 friend bool operator!=(
const input_slot& a,
const input_slot& b) noexcept {
224 return a.is_valid() && b.is_valid() && (a._pimpl != b._pimpl);
227 friend bool operator<(
const input_slot& a,
const input_slot& b) noexcept {
228 return a.is_valid() && b.is_valid() && (a._pimpl < b._pimpl);
232 return _impl().name();
235 bool accepts_value_type(slot_data_type type) {
236 return _impl().accepts_value_type(type);
239 bool is_connected(output_slot& output);
241 bool connect(output_slot& output);
242 bool disconnect(output_slot& output);
247 friend class input_slot;
250 output_intf& _impl() noexcept {
251 EAGINE_ASSERT(is_valid());
256 output_slot() =
default;
258 output_slot(output_intf& impl)
261 bool is_valid() const noexcept {
262 return _pimpl !=
nullptr;
265 explicit inline operator bool() const noexcept {
269 friend bool operator==(
const output_slot& a,
const output_slot& b) noexcept {
270 return a.is_valid() && b.is_valid() && (a._pimpl == b._pimpl);
273 friend bool operator!=(
const output_slot& a,
const output_slot& b) noexcept {
274 return a.is_valid() && b.is_valid() && (a._pimpl != b._pimpl);
277 friend bool operator<(
const output_slot& a,
const output_slot& b) noexcept {
278 return a.is_valid() && b.is_valid() && (a._pimpl < b._pimpl);
282 return _impl().name();
286 return _impl().value_type();
289 std::ostream& definitions(std::ostream& out, compile_context& ctxt) {
290 return _impl().definitions(out, ctxt);
293 std::ostream& expression(std::ostream& out, compile_context& ctxt) {
294 return _impl().expression(out, ctxt);
297 bool is_connected(input_slot&);
299 bool connect(input_slot&);
300 bool disconnect(input_slot&);
302 void notify_connected() {
303 _impl().notify_connected();
309 #if !OGLPLUS_LINK_LIBRARY || defined(OGLPLUS_IMPLEMENTING_LIBRARY)
310 #include <oglplus/texgen/interface.inl>
313 #endif // OGLPLUS_TEXGEN_INTERFACE_HPP