Unravel Engine C++ Reference
Loading...
Searching...
No Matches
script_interop.h
Go to the documentation of this file.
1#pragma once
2#include <math/math.h>
3#include <hpp/small_vector.hpp>
4#include <engine/ecs/ecs.h>
6#include <engine/engine.h>
7#include <dotnetpp/dotnetpp.h>
8#include <dotnetpp/dotnet_managed.h>
9
10namespace dotnetpp_backend
11{
12namespace managed_interface
13{
14
15struct vector2
16{
17 float x;
18 float y;
19};
20
21struct vector3
22{
23 float x;
24 float y;
25 float z;
26};
27
28struct vector4
29{
30 float x;
31 float y;
32 float z;
33 float w;
34};
35
37{
38 float x;
39 float y;
40 float z;
41 float w;
42};
43
44struct color
45{
46 float r;
47 float g;
48 float b;
49 float a;
50};
51
52struct bbox
53{
54 vector3 min{};
55 vector3 max{};
56};
57
59{
60 entt::entity entity{};
63 float distance{};
64};
65
71
73{
74 bool valid{};
75
76 color base_color{1.0f, 1.0f, 1.0f, 1.0f};
78 vector2 tiling{1.0f, 1.0f};
79 float roughness{0.5};
80 float metalness{};
81 float bumpiness{1.0f};
82};
83
85{
86 std::intptr_t native_ptr{};
87 std::string target_element_id;
88 std::intptr_t target_element_ptr{};
89 std::string current_element_id;
90 std::intptr_t current_element_ptr{};
91 int phase{};
92 std::string event_type;
93};
94
96{
97 float x{};
98 float y{};
99 int button{-1};
100 bool ctrl_key{};
101 bool shift_key{};
102 bool alt_key{};
103 bool meta_key{};
104 float delta_x{};
105 float delta_y{};
106};
107
116
118{
119 std::string text;
120 bool ctrl_key{};
121 bool shift_key{};
122 bool alt_key{};
123 bool meta_key{};
124};
125
127{
128 float value{};
129 float min_value{};
130 float max_value{};
131 float step{};
132};
133
135{
136 std::string value;
137};
138
146
147} // namespace managed_interface
148} // namespace dotnetpp_backend
149
150// Converter specializations are implemented in script_interop.cpp inside
151// dotnetpp_backend::managed_interface (alias of dotnetpp_backend:: or clr::).
153{
154template<>
155auto converter::convert(const math::vec2& v) -> dotnetpp_backend::managed_interface::vector2;
156template<>
157auto converter::convert(const dotnetpp_backend::managed_interface::vector2& v) -> math::vec2;
158template<>
159auto converter::convert(const math::vec3& v) -> dotnetpp_backend::managed_interface::vector3;
160template<>
161auto converter::convert(const dotnetpp_backend::managed_interface::vector3& v) -> math::vec3;
162template<>
163auto converter::convert(const math::vec4& v) -> dotnetpp_backend::managed_interface::vector4;
164template<>
165auto converter::convert(const dotnetpp_backend::managed_interface::vector4& v) -> math::vec4;
166template<>
167auto converter::convert(const math::quat& q) -> dotnetpp_backend::managed_interface::quaternion;
168template<>
169auto converter::convert(const dotnetpp_backend::managed_interface::quaternion& q) -> math::quat;
170template<>
171auto converter::convert(const math::color& v) -> dotnetpp_backend::managed_interface::color;
172template<>
173auto converter::convert(const dotnetpp_backend::managed_interface::color& v) -> math::color;
174template<>
175auto converter::convert(const math::bbox& v) -> dotnetpp_backend::managed_interface::bbox;
176template<>
177auto converter::convert(const dotnetpp_backend::managed_interface::bbox& v) -> math::bbox;
178}
179
180template <typename T, size_t StaticCapacity>
181struct dotnet_converter<hpp::small_vector<T, StaticCapacity>>
182{
183 using native_type = hpp::small_vector<T, StaticCapacity>;
184 using managed_type = dotnet::managed_ptr;
185
186 static auto to_managed(const native_type& obj) -> managed_type
187 {
188 std::vector<T> vec(obj.begin(), obj.end());
189 return dotnet_converter<std::vector<T>>::to_managed(vec);
190 }
191
192 static auto from_managed(const managed_type& obj) -> native_type
193 {
194 if(!obj)
195 {
196 return {};
197 }
198 auto vec = dotnet_converter<std::vector<T>>::from_managed(obj);
199 return native_type(vec.begin(), vec.end());
200 }
201};
202
208
209template <>
210struct dotnet_converter<dotnetpp_backend::managed_interface::ui_event_base>
211{
213 using managed_type = dotnet::managed_ptr;
214
215 static auto create_instance(const std::string& namespace_name, const std::string& type_name) -> dotnet::object;
216
217 static void to_managed_base(const native_type& obj, dotnet::object& instance)
218 {
219 dotnet::set_field_value(instance, "nativePtr", obj.native_ptr);
220 dotnet::set_field_value(instance, "targetElementId", obj.target_element_id);
221 dotnet::set_field_value(instance, "targetElementPtr", obj.target_element_ptr);
222 dotnet::set_field_value(instance, "currentElementId", obj.current_element_id);
223 dotnet::set_field_value(instance, "currentElementPtr", obj.current_element_ptr);
224 dotnet::set_field_value(instance, "phase", obj.phase);
225 dotnet::set_field_value(instance, "eventType", obj.event_type);
226 }
227
228 static void from_managed_base(const dotnet::object& object, native_type& data)
229 {
230 dotnet::get_field_value(object, "nativePtr", data.native_ptr);
231 dotnet::get_field_value(object, "targetElementId", data.target_element_id);
232 dotnet::get_field_value(object, "targetElementPtr", data.target_element_ptr);
233 dotnet::get_field_value(object, "currentElementId", data.current_element_id);
234 dotnet::get_field_value(object, "currentElementPtr", data.current_element_ptr);
235 dotnet::get_field_value(object, "phase", data.phase);
236 dotnet::get_field_value(object, "eventType", data.event_type);
237 }
238
239 static auto to_managed(const native_type& obj) -> managed_type
240 {
241 auto instance = create_instance("Unravel.Core", "UIEventBase");
242 to_managed_base(obj, instance);
243 return dotnet::get_managed_ptr(instance);
244 }
245
246 static auto from_managed(const managed_type& obj) -> native_type
247 {
248 dotnet::object object(obj);
249 native_type data;
250 from_managed_base(object, data);
251 return data;
252 }
253};
254
255template <>
256struct dotnet_converter<dotnetpp_backend::managed_interface::ui_pointer_event>
257 : dotnet_converter<dotnetpp_backend::managed_interface::ui_event_base>
258{
260 using managed_type = dotnet::managed_ptr;
261
262 static auto to_managed(const native_type& obj) -> managed_type
263 {
264 auto instance = create_instance("Unravel.Core", "UIPointerEvent");
265 to_managed_base(obj, instance);
266 dotnet::set_field_value(instance, "x", obj.x);
267 dotnet::set_field_value(instance, "y", obj.y);
268 dotnet::set_field_value(instance, "button", obj.button);
269 dotnet::set_field_value(instance, "ctrlKey", obj.ctrl_key);
270 dotnet::set_field_value(instance, "shiftKey", obj.shift_key);
271 dotnet::set_field_value(instance, "altKey", obj.alt_key);
272 dotnet::set_field_value(instance, "metaKey", obj.meta_key);
273 dotnet::set_field_value(instance, "deltaX", obj.delta_x);
274 dotnet::set_field_value(instance, "deltaY", obj.delta_y);
275 return dotnet::get_managed_ptr(instance);
276 }
277
278 static auto from_managed(const managed_type& obj) -> native_type
279 {
280 dotnet::object object(obj);
281 native_type data;
282 from_managed_base(object, data);
283 dotnet::get_field_value(object, "x", data.x);
284 dotnet::get_field_value(object, "y", data.y);
285 dotnet::get_field_value(object, "button", data.button);
286 dotnet::get_field_value(object, "ctrlKey", data.ctrl_key);
287 dotnet::get_field_value(object, "shiftKey", data.shift_key);
288 dotnet::get_field_value(object, "altKey", data.alt_key);
289 dotnet::get_field_value(object, "metaKey", data.meta_key);
290 dotnet::get_field_value(object, "deltaX", data.delta_x);
291 dotnet::get_field_value(object, "deltaY", data.delta_y);
292 return data;
293 }
294};
295
296template <>
297struct dotnet_converter<dotnetpp_backend::managed_interface::ui_key_event>
298 : dotnet_converter<dotnetpp_backend::managed_interface::ui_event_base>
299{
301 using managed_type = dotnet::managed_ptr;
302
303 static auto to_managed(const native_type& obj) -> managed_type
304 {
305 auto instance = create_instance("Unravel.Core", "UIKeyEvent");
306 to_managed_base(obj, instance);
307 dotnet::set_field_value(instance, "keyCode", obj.key_code);
308 dotnet::set_field_value(instance, "ctrlKey", obj.ctrl_key);
309 dotnet::set_field_value(instance, "shiftKey", obj.shift_key);
310 dotnet::set_field_value(instance, "altKey", obj.alt_key);
311 dotnet::set_field_value(instance, "metaKey", obj.meta_key);
312 return dotnet::get_managed_ptr(instance);
313 }
314
315 static auto from_managed(const managed_type& obj) -> native_type
316 {
317 dotnet::object object(obj);
318 native_type data;
319 from_managed_base(object, data);
320 dotnet::get_field_value(object, "keyCode", data.key_code);
321 dotnet::get_field_value(object, "ctrlKey", data.ctrl_key);
322 dotnet::get_field_value(object, "shiftKey", data.shift_key);
323 dotnet::get_field_value(object, "altKey", data.alt_key);
324 dotnet::get_field_value(object, "metaKey", data.meta_key);
325 return data;
326 }
327};
328
329template <>
330struct dotnet_converter<dotnetpp_backend::managed_interface::ui_textinput_event>
331 : dotnet_converter<dotnetpp_backend::managed_interface::ui_event_base>
332{
334 using managed_type = dotnet::managed_ptr;
335
336 static auto to_managed(const native_type& obj) -> managed_type
337 {
338 auto instance = create_instance("Unravel.Core", "UITextInputEvent");
339 to_managed_base(obj, instance);
340 dotnet::set_field_value(instance, "text", obj.text);
341 dotnet::set_field_value(instance, "ctrlKey", obj.ctrl_key);
342 dotnet::set_field_value(instance, "shiftKey", obj.shift_key);
343 dotnet::set_field_value(instance, "altKey", obj.alt_key);
344 dotnet::set_field_value(instance, "metaKey", obj.meta_key);
345 return dotnet::get_managed_ptr(instance);
346 }
347
348 static auto from_managed(const managed_type& obj) -> native_type
349 {
350 dotnet::object object(obj);
351 native_type data;
352 from_managed_base(object, data);
353 dotnet::get_field_value(object, "text", data.text);
354 dotnet::get_field_value(object, "ctrlKey", data.ctrl_key);
355 dotnet::get_field_value(object, "shiftKey", data.shift_key);
356 dotnet::get_field_value(object, "altKey", data.alt_key);
357 dotnet::get_field_value(object, "metaKey", data.meta_key);
358 return data;
359 }
360};
361
362template <>
363struct dotnet_converter<dotnetpp_backend::managed_interface::ui_slider_event>
364 : dotnet_converter<dotnetpp_backend::managed_interface::ui_event_base>
365{
367 using managed_type = dotnet::managed_ptr;
368
369 static auto to_managed(const native_type& obj) -> managed_type
370 {
371 auto instance = create_instance("Unravel.Core", "UISliderEvent");
372 to_managed_base(obj, instance);
373 dotnet::set_field_value(instance, "value", obj.value);
374 dotnet::set_field_value(instance, "minValue", obj.min_value);
375 dotnet::set_field_value(instance, "maxValue", obj.max_value);
376 dotnet::set_field_value(instance, "step", obj.step);
377 return dotnet::get_managed_ptr(instance);
378 }
379
380 static auto from_managed(const managed_type& obj) -> native_type
381 {
382 dotnet::object object(obj);
383 native_type data;
384 from_managed_base(object, data);
385 dotnet::get_field_value(object, "value", data.value);
386 dotnet::get_field_value(object, "minValue", data.min_value);
387 dotnet::get_field_value(object, "maxValue", data.max_value);
388 dotnet::get_field_value(object, "step", data.step);
389 return data;
390 }
391};
392
393template <>
394struct dotnet_converter<dotnetpp_backend::managed_interface::ui_change_event>
395 : dotnet_converter<dotnetpp_backend::managed_interface::ui_event_base>
396{
398 using managed_type = dotnet::managed_ptr;
399
400 static auto to_managed(const native_type& obj) -> managed_type
401 {
402 auto instance = create_instance("Unravel.Core", "UIChangeEvent");
403 to_managed_base(obj, instance);
404 dotnet::set_field_value(instance, "value", obj.value);
405 return dotnet::get_managed_ptr(instance);
406 }
407
408 static auto from_managed(const managed_type& obj) -> native_type
409 {
410 dotnet::object object(obj);
411 native_type data;
412 from_managed_base(object, data);
413 dotnet::get_field_value(object, "value", data.value);
414 return data;
415 }
416};
const btCollisionObject * object
key_code
Definition key.hpp:6
dotnet_register_converter_for_pod(math::vec2, dotnetpp_backend::managed_interface::vector2)
static auto to_managed(const native_type &obj) -> managed_type
static auto from_managed(const managed_type &obj) -> native_type
static auto from_managed(const managed_type &obj) -> native_type
static auto to_managed(const native_type &obj) -> managed_type
static void to_managed_base(const native_type &obj, dotnet::object &instance)
static void from_managed_base(const dotnet::object &object, native_type &data)
static auto from_managed(const managed_type &obj) -> native_type
static auto to_managed(const native_type &obj) -> managed_type
static auto from_managed(const managed_type &obj) -> native_type
static auto to_managed(const native_type &obj) -> managed_type
static auto from_managed(const managed_type &obj) -> native_type
static auto to_managed(const native_type &obj) -> managed_type
static auto from_managed(const managed_type &obj) -> native_type
static auto to_managed(const native_type &obj) -> managed_type
static auto to_managed(const native_type &obj) -> managed_type
static auto from_managed(const managed_type &obj) -> native_type
hpp::small_vector< T, StaticCapacity > native_type
Storage for box vector values and wraps up common functionality.
Definition bbox.h:21