3 #include "ext_critical.h"
7 #include <ossia/detail/config.hpp>
10 #include <ossia/detail/optional.hpp>
11 #include <ossia/detail/safe_vec.hpp>
12 #include <ossia/network/base/node.hpp>
13 #include <ossia/network/base/osc_address.hpp>
14 #include <ossia/network/base/value_callback.hpp>
15 #include <ossia/network/common/path.hpp>
16 #include <ossia/network/dataspace/dataspace.hpp>
17 #include <ossia/network/generic/generic_device.hpp>
22 #define OSSIA_MAX_MAX_ATTR_SIZE 256
30 #pragma mark t_object_base structure declaration
32 enum class object_class
54 object_base*
object{};
57 t_symbol* classname{};
60 friend bool operator<(search_result a, search_result b) {
return a.level < b.level; }
79 bool m_local_mute{
false};
82 ossia::net::address_scope m_addr_scope{};
83 object_class m_otype{};
86 void* m_highlight_clock{};
91 std::shared_ptr<ossia::net::generic_device> m_device{};
92 using matcher_vector = std::vector<std::shared_ptr<matcher>>;
93 matcher_vector m_matchers{};
94 std::vector<matcher*> m_node_selection{};
95 std::optional<ossia::traversal::path> m_selection_path{};
96 static void class_setup(t_class* c);
98 void fill_selection();
100 void get_hierarchy();
102 void set_description();
106 void set_recall_safe();
109 object_base* find_parent_object();
113 find_parent_object_recursively(t_object* patcher,
bool look_for_model_view);
115 static void get_description(object_base* x, std::vector<matcher*> nodes);
116 static void get_tags(object_base* x, std::vector<matcher*> nodes);
117 static void get_priority(object_base* x, std::vector<matcher*> nodes);
118 static void get_hidden(object_base* x, std::vector<matcher*> nodes);
119 static void get_zombie(object_base* x, std::vector<matcher*> nodes);
120 static void get_mess_cb(object_base* x, t_symbol* s);
121 static void select_mess_cb(object_base* x, t_symbol* s,
int argc, t_atom* argv);
122 static void get_recall_safe(object_base* x, std::vector<matcher*> nodes);
126 t_symbol* m_tags[OSSIA_MAX_MAX_ATTR_SIZE] = {{}};
127 t_symbol* m_description{};
131 long m_recall_safe{};
137 t_object* m_patcher{};
140 long m_description_size{};
143 std::vector<search_result> m_found_parameters{};
144 std::vector<search_result> m_found_models{};
154 std::mutex m_bind_mutex;
156 std::vector<t_object*> m_patcher_hierarchy;
159 static void update_attribute(
162 notify(object_base* x, t_symbol* s, t_symbol* msg,
void* sender,
void* data);
166 static void defer_set_output(object_base* x, t_symbol* s,
int argc, t_atom* argv);
167 static void set(object_base* x, t_symbol* s,
int argc, t_atom* argv);
168 static void get_address(object_base* x, std::vector<matcher*> nodes);
169 static void lock_and_touch(object_base* x, t_symbol* s);
170 static void loadbang(object_base* x);
171 void save_children_state();
173 void clear_and_init_registration();
175 static void reset_color(object_base* x);
178 void set_matchers_index();
180 std::vector<std::string> m_paths{};
183 std::vector<std::shared_ptr<matcher>> find_or_create_matchers();
185 void remove_matcher(
const std::shared_ptr<matcher>& m);
187 [[nodiscard]] matcher_vector::iterator remove_matcher(matcher_vector::iterator m);
189 std::map<std::string, ossia::value> m_value_map{};
192 std::vector<std::shared_ptr<matcher>> find_parent_nodes();
193 void load_configuration(ossia_max& omax);
194 void create_patcher_hierarchy(ossia_max& omax);
195 unsigned long poly_index();
196 void make_global_paths(
const std::string& name);
200 #pragma mark Utilities
205 std::vector<t_atom>& data;
206 void operator()(impulse)
const
209 atom_setsym(&a, gensym(
"bang"));
213 void operator()(int32_t i)
const
220 void operator()(int64_t i)
const
227 void operator()(
float f)
const
230 atom_setfloat(&a, f);
234 void operator()(
bool b)
const
237 float f = b ? 1. : 0.;
238 atom_setfloat(&a, f);
242 void operator()(
const std::string& str)
const
244 t_symbol* s = gensym(str.c_str());
250 template <std::
size_t N>
251 void operator()(std::array<float, N> vec)
const
253 data.reserve(data.size() + N);
254 for(std::size_t i = 0; i < N; i++)
257 atom_setfloat(&a, vec[i]);
262 void operator()(
const std::vector<ossia::value>& t)
const
264 data.reserve(data.size() + t.size());
265 for(
const auto& v : t)
269 void operator()(
const ossia::value_map_type& t)
const { }
271 void operator()()
const { }
276 template <
typename T>
281 void set_out(t_atom& a)
const
288 (t_object*)x, (method)object_base::defer_set_output, gensym(
"set"), 1, &a);
292 outlet_anything(x->m_set_out, gensym(
"set"), 1, &a);
297 void set_out(
int N, t_atom* a)
const
304 (t_object*)x, (method)object_base::defer_set_output, gensym(
"set"), N, a);
308 outlet_anything(x->m_set_out, gensym(
"set"), N, a);
313 void operator()(impulse)
const
315 outlet_bang(x->m_data_out);
318 outlet_bang(x->m_set_out);
321 void operator()(int32_t i)
const
325 outlet_int(x->m_data_out, i);
330 void operator()(
float f)
const
334 atom_setfloat(&a, f);
335 if(x && x->m_data_out)
337 outlet_float(x->m_data_out, f);
342 void operator()(
bool b)
const { (*this)(b ? 1 : 0); }
344 void operator()(
const std::string& str)
const
346 t_symbol* s = gensym(str.c_str());
350 outlet_anything(x->m_data_out, s, 0,
nullptr);
355 template <std::
size_t N>
356 void operator()(std::array<float, N> vec)
const
360 for(
int i = 0; i < N; i++)
361 atom_setfloat(a + i, vec[i]);
362 outlet_list(x->m_data_out, gensym(
"list"), N, a);
367 void operator()(
const std::vector<ossia::value>& t)
const
369 std::vector<t_atom> va;
375 for(
const auto& v : t)
378 t_atom* list_ptr = !va.empty() ? va.data() :
nullptr;
380 outlet_list(x->m_data_out, gensym(
"list"), va.size(), list_ptr);
382 set_out(va.size(), list_ptr);
385 void operator()(
const ossia::value_map_type& t)
const { }
387 void operator()()
const
389 object_error((t_object*)x,
"%s received an invalid data", x->m_name->s_name);
The node_base class.
Definition: network/base/node.hpp:48
The parameter_base class.
Definition: ossia/network/base/parameter.hpp:48
The value class.
Definition: value.hpp:173