Skip to content

Commit bf7b0d9

Browse files
Kelwanzaucy
andauthored
feat: API for streaming components (#262)
Co-authored-by: Ezekiel Warren <ezekiel@seaube.com>
1 parent e811be1 commit bf7b0d9

File tree

5 files changed

+182
-74
lines changed

5 files changed

+182
-74
lines changed

ecsact/runtime/async.h

Lines changed: 17 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -205,12 +205,28 @@ ECSACT_ASYNC_API_FN(void, ecsact_async_disconnect)(void);
205205
*/
206206
ECSACT_ASYNC_API_FN(int32_t, ecsact_async_get_current_tick)(void);
207207

208+
/**
209+
* Sends Ecsact stream data to the specified registry. Stream data will be
210+
* applied on the next ecsact_execute_systems call.
211+
*
212+
* @param ... if the component has indexed fields then those fields must be
213+
* supplied to the variadic arguments in declaration order.
214+
*/
215+
ECSACT_CORE_API_FN(ecsact_async_request_id, ecsact_async_stream)
216+
( //
217+
ecsact_entity_id entity,
218+
ecsact_component_id component_id,
219+
const void* component_data,
220+
...
221+
);
222+
208223
#define FOR_EACH_ECSACT_ASYNC_API_FN(fn, ...) \
209224
fn(ecsact_async_enqueue_execution_options, __VA_ARGS__); \
210225
fn(ecsact_async_flush_events, __VA_ARGS__); \
211226
fn(ecsact_async_connect, __VA_ARGS__); \
212227
fn(ecsact_async_disconnect, __VA_ARGS__); \
213-
fn(ecsact_async_get_current_tick, __VA_ARGS__);
228+
fn(ecsact_async_get_current_tick, __VA_ARGS__); \
229+
fn(ecsact_async_stream, __VA_ARGS__)
214230

215231
#undef ECSACT_ASYNC_API
216232
#undef ECSACT_ASYNC_API_FN

ecsact/runtime/common.h

Lines changed: 42 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -274,6 +274,15 @@ typedef enum {
274274
ECSACT_EXEC_SYS_ERR_ACTION_ENTITY_CONSTRAINT_BROKEN = 2,
275275
} ecsact_execute_systems_error;
276276

277+
typedef enum {
278+
ECSACT_STREAM_OK = 0,
279+
280+
/**
281+
* An invalid or non-stream component ID was passed into the stream.
282+
*/
283+
ECSACT_STREAM_INVALID_COMPONENT_ID = 1,
284+
} ecsact_stream_error;
285+
277286
typedef enum {
278287
/**
279288
* System has no capabilities for this component.
@@ -287,7 +296,8 @@ typedef enum {
287296

288297
/**
289298
* System may only write to component.
290-
* NOTE: This flag is only valid if accompanied by `ECSACT_SYS_CAP_READONLY`.
299+
* NOTE: This flag is only valid if accompanied by
300+
* `ECSACT_SYS_CAP_READONLY`.
291301
*/
292302
ECSACT_SYS_CAP_WRITEONLY = 2,
293303

@@ -342,6 +352,11 @@ typedef enum {
342352
* `ECSACT_SYS_CAP_INCLUDE`
343353
*/
344354
ECSACT_SYS_CAP_REMOVES = 64 | ECSACT_SYS_CAP_INCLUDE,
355+
356+
/**
357+
* System may enable or disable streaming data for this component.
358+
*/
359+
ECSACT_SYS_CAP_STREAM_TOGGLE = 128,
345360
} ecsact_system_capability;
346361

347362
/**
@@ -661,6 +676,32 @@ typedef enum {
661676
ECSACT_EVENT_DESTROY_ENTITY = 4,
662677
} ecsact_event;
663678

679+
typedef enum ecsact_component_type {
680+
/**
681+
* The component has no unique type
682+
*/
683+
ECSACT_COMPONENT_TYPE_NONE = 0,
684+
685+
/*
686+
* The component takes in a continuous feed of data. Look at stream toggle to
687+
* see how you can set the component to receive updates from either
688+
* ecsact_stream or systems.
689+
*/
690+
ECSACT_COMPONENT_TYPE_STREAM = 1,
691+
692+
/*
693+
* The component is a stream component (@see ECSACT_COMPONENT_TYPE_STREAM) but
694+
* may be updated overtime instead of all at once.
695+
*/
696+
ECSACT_COMPONENT_TYPE_LAZY_STREAM = 2,
697+
698+
/**
699+
* The component only lives during system execution and is automatically
700+
* removed.
701+
*/
702+
ECSACT_COMPONENT_TYPE_TRANSIENT = 3
703+
} ecsact_component_stream;
704+
664705
/**
665706
* Component event callback
666707
*/

ecsact/runtime/core.h

Lines changed: 38 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -264,30 +264,48 @@ ECSACT_CORE_API_FN(ecsact_ees, ecsact_get_entity_execution_status)
264264
ecsact_system_like_id system_like_id
265265
);
266266

267+
/**
268+
* Sends Ecsact stream data to the specified registry. Stream data will be
269+
* applied on the next ecsact_execute_systems call. The last set of stream data
270+
* is always used.
271+
*
272+
* @param ... if the component has indexed fields then those fields must be
273+
* supplied to the variadic arguments in declaration order.
274+
*/
275+
ECSACT_CORE_API_FN(ecsact_stream_error, ecsact_stream)
276+
( //
277+
ecsact_registry_id registry_id,
278+
ecsact_entity_id entity,
279+
ecsact_component_id component_id,
280+
const void* component_data,
281+
...
282+
);
283+
267284
// # BEGIN FOR_EACH_ECSACT_CORE_API_FN
268285
#ifdef ECSACT_MSVC_TRADITIONAL
269286
# define FOR_EACH_ECSACT_CORE_API_FN(fn, ...) ECSACT_MSVC_TRADITIONAL_ERROR()
270287
#else
271-
# define FOR_EACH_ECSACT_CORE_API_FN(fn, ...) \
272-
fn(ecsact_create_registry, __VA_ARGS__); \
273-
fn(ecsact_destroy_registry, __VA_ARGS__); \
274-
fn(ecsact_clear_registry, __VA_ARGS__); \
275-
fn(ecsact_create_entity, __VA_ARGS__); \
276-
fn(ecsact_ensure_entity, __VA_ARGS__); \
277-
fn(ecsact_entity_exists, __VA_ARGS__); \
278-
fn(ecsact_destroy_entity, __VA_ARGS__); \
279-
fn(ecsact_count_entities, __VA_ARGS__); \
280-
fn(ecsact_get_entities, __VA_ARGS__); \
281-
fn(ecsact_add_component, __VA_ARGS__); \
282-
fn(ecsact_has_component, __VA_ARGS__); \
283-
fn(ecsact_get_component, __VA_ARGS__); \
284-
fn(ecsact_count_components, __VA_ARGS__); \
285-
fn(ecsact_get_components, __VA_ARGS__); \
286-
fn(ecsact_each_component, __VA_ARGS__); \
287-
fn(ecsact_update_component, __VA_ARGS__); \
288-
fn(ecsact_remove_component, __VA_ARGS__); \
289-
fn(ecsact_execute_systems, __VA_ARGS__); \
290-
fn(ecsact_get_entity_execution_status, __VA_ARGS__)
288+
# define FOR_EACH_ECSACT_CORE_API_FN(fn, ...) \
289+
fn(ecsact_create_registry, __VA_ARGS__); \
290+
fn(ecsact_destroy_registry, __VA_ARGS__); \
291+
fn(ecsact_clear_registry, __VA_ARGS__); \
292+
fn(ecsact_create_entity, __VA_ARGS__); \
293+
fn(ecsact_ensure_entity, __VA_ARGS__); \
294+
fn(ecsact_entity_exists, __VA_ARGS__); \
295+
fn(ecsact_destroy_entity, __VA_ARGS__); \
296+
fn(ecsact_count_entities, __VA_ARGS__); \
297+
fn(ecsact_get_entities, __VA_ARGS__); \
298+
fn(ecsact_add_component, __VA_ARGS__); \
299+
fn(ecsact_has_component, __VA_ARGS__); \
300+
fn(ecsact_get_component, __VA_ARGS__); \
301+
fn(ecsact_count_components, __VA_ARGS__); \
302+
fn(ecsact_get_components, __VA_ARGS__); \
303+
fn(ecsact_each_component, __VA_ARGS__); \
304+
fn(ecsact_update_component, __VA_ARGS__); \
305+
fn(ecsact_remove_component, __VA_ARGS__); \
306+
fn(ecsact_execute_systems, __VA_ARGS__); \
307+
fn(ecsact_get_entity_execution_status, __VA_ARGS__); \
308+
fn(ecsact_stream, __VA_ARGS__)
291309
#endif
292310

293311
#endif // ECSACT_RUNTIME_CORE_H

ecsact/runtime/dynamic.h

Lines changed: 75 additions & 51 deletions
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,19 @@ ECSACT_DYNAMIC_API_FN(bool, ecsact_system_execution_context_has)
135135
...
136136
);
137137

138+
/**
139+
* Enable or disable streaming data for the given component.
140+
* @param ... if the component has indexed fields then those fields must be
141+
* supplied to the variadic arguments in declaration order.
142+
*/
143+
ECSACT_DYNAMIC_API_FN(void, ecsact_system_execution_context_stream_toggle)
144+
( //
145+
struct ecsact_system_execution_context* context,
146+
ecsact_component_id component_id,
147+
bool streaming_enabled,
148+
...
149+
);
150+
138151
/**
139152
* Generate a new entity with specified components.
140153
*
@@ -515,62 +528,73 @@ ECSACT_DYNAMIC_API_FN(void, ecsact_set_system_notify_component_setting)
515528
ecsact_system_notify_setting setting
516529
);
517530

531+
/**
532+
* Sets a components type
533+
*/
534+
ECSACT_DYNAMIC_API_FN(void, ecsact_set_component_type)
535+
( //
536+
ecsact_component_id component_id,
537+
ecsact_component_type component_type
538+
);
539+
518540
// # BEGIN FOR_EACH_ECSACT_DYNAMIC_API_FN
519541
#ifdef ECSACT_MSVC_TRADITIONAL
520542
# define FOR_EACH_ECSACT_DYNAMIC_API_FN(fn, ...) \
521543
ECSACT_MSVC_TRADITIONAL_ERROR()
522544
#else
523-
# define FOR_EACH_ECSACT_DYNAMIC_API_FN(fn, ...) \
524-
fn(ecsact_system_execution_context_action, __VA_ARGS__); \
525-
fn(ecsact_system_execution_context_add, __VA_ARGS__); \
526-
fn(ecsact_system_execution_context_remove, __VA_ARGS__); \
527-
fn(ecsact_system_execution_context_get, __VA_ARGS__); \
528-
fn(ecsact_system_execution_context_update, __VA_ARGS__); \
529-
fn(ecsact_system_execution_context_has, __VA_ARGS__); \
530-
fn(ecsact_system_execution_context_generate, __VA_ARGS__); \
531-
fn(ecsact_system_execution_context_parent, __VA_ARGS__); \
532-
fn(ecsact_system_execution_context_same, __VA_ARGS__); \
533-
fn(ecsact_system_execution_context_other, __VA_ARGS__); \
534-
fn(ecsact_system_execution_context_entity, __VA_ARGS__); \
535-
fn(ecsact_system_execution_context_id, __VA_ARGS__); \
536-
fn(ecsact_create_package, __VA_ARGS__); \
537-
fn(ecsact_set_package_source_file_path, __VA_ARGS__); \
538-
fn(ecsact_add_dependency, __VA_ARGS__); \
539-
fn(ecsact_remove_dependency, __VA_ARGS__); \
540-
fn(ecsact_destroy_package, __VA_ARGS__); \
541-
fn(ecsact_create_system, __VA_ARGS__); \
542-
fn(ecsact_set_system_lazy_iteration_rate, __VA_ARGS__); \
543-
fn(ecsact_add_child_system, __VA_ARGS__); \
544-
fn(ecsact_remove_child_system, __VA_ARGS__); \
545-
fn(ecsact_reorder_system, __VA_ARGS__); \
546-
fn(ecsact_set_system_execution_impl, __VA_ARGS__); \
547-
fn(ecsact_create_action, __VA_ARGS__); \
548-
fn(ecsact_create_component, __VA_ARGS__); \
549-
fn(ecsact_create_transient, __VA_ARGS__); \
550-
fn(ecsact_add_field, __VA_ARGS__); \
551-
fn(ecsact_remove_field, __VA_ARGS__); \
552-
fn(ecsact_destroy_component, __VA_ARGS__); \
553-
fn(ecsact_destroy_transient, __VA_ARGS__); \
554-
fn(ecsact_create_enum, __VA_ARGS__); \
555-
fn(ecsact_destroy_enum, __VA_ARGS__); \
556-
fn(ecsact_add_enum_value, __VA_ARGS__); \
557-
fn(ecsact_remove_enum_value, __VA_ARGS__); \
558-
fn(ecsact_set_system_capability, __VA_ARGS__); \
559-
fn(ecsact_unset_system_capability, __VA_ARGS__); \
560-
fn(ecsact_add_system_assoc, __VA_ARGS__); \
561-
fn(ecsact_remove_system_assoc, __VA_ARGS__); \
562-
fn(ecsact_add_system_assoc_field, __VA_ARGS__); \
563-
fn(ecsact_remove_system_assoc_field, __VA_ARGS__); \
564-
fn(ecsact_set_system_assoc_capability, __VA_ARGS__); \
565-
fn(ecsact_set_system_association_capability, __VA_ARGS__); \
566-
fn(ecsact_unset_system_association_capability, __VA_ARGS__); \
567-
fn(ecsact_add_system_generates, __VA_ARGS__); \
568-
fn(ecsact_remove_system_generates, __VA_ARGS__); \
569-
fn(ecsact_system_generates_set_component, __VA_ARGS__); \
570-
fn(ecsact_system_generates_unset_component, __VA_ARGS__); \
571-
fn(ecsact_set_entity_execution_status, __VA_ARGS__); \
572-
fn(ecsact_set_system_parallel_execution, __VA_ARGS__); \
573-
fn(ecsact_set_system_notify_component_setting, __VA_ARGS__)
545+
# define FOR_EACH_ECSACT_DYNAMIC_API_FN(fn, ...) \
546+
fn(ecsact_system_execution_context_action, __VA_ARGS__); \
547+
fn(ecsact_system_execution_context_add, __VA_ARGS__); \
548+
fn(ecsact_system_execution_context_remove, __VA_ARGS__); \
549+
fn(ecsact_system_execution_context_get, __VA_ARGS__); \
550+
fn(ecsact_system_execution_context_update, __VA_ARGS__); \
551+
fn(ecsact_system_execution_context_has, __VA_ARGS__); \
552+
fn(ecsact_system_execution_context_stream_toggle, __VA_ARGS__); \
553+
fn(ecsact_system_execution_context_generate, __VA_ARGS__); \
554+
fn(ecsact_system_execution_context_parent, __VA_ARGS__); \
555+
fn(ecsact_system_execution_context_same, __VA_ARGS__); \
556+
fn(ecsact_system_execution_context_other, __VA_ARGS__); \
557+
fn(ecsact_system_execution_context_entity, __VA_ARGS__); \
558+
fn(ecsact_system_execution_context_id, __VA_ARGS__); \
559+
fn(ecsact_create_package, __VA_ARGS__); \
560+
fn(ecsact_set_package_source_file_path, __VA_ARGS__); \
561+
fn(ecsact_add_dependency, __VA_ARGS__); \
562+
fn(ecsact_remove_dependency, __VA_ARGS__); \
563+
fn(ecsact_destroy_package, __VA_ARGS__); \
564+
fn(ecsact_create_system, __VA_ARGS__); \
565+
fn(ecsact_set_system_lazy_iteration_rate, __VA_ARGS__); \
566+
fn(ecsact_add_child_system, __VA_ARGS__); \
567+
fn(ecsact_remove_child_system, __VA_ARGS__); \
568+
fn(ecsact_reorder_system, __VA_ARGS__); \
569+
fn(ecsact_set_system_execution_impl, __VA_ARGS__); \
570+
fn(ecsact_create_action, __VA_ARGS__); \
571+
fn(ecsact_create_component, __VA_ARGS__); \
572+
fn(ecsact_create_transient, __VA_ARGS__); \
573+
fn(ecsact_add_field, __VA_ARGS__); \
574+
fn(ecsact_remove_field, __VA_ARGS__); \
575+
fn(ecsact_destroy_component, __VA_ARGS__); \
576+
fn(ecsact_destroy_transient, __VA_ARGS__); \
577+
fn(ecsact_create_enum, __VA_ARGS__); \
578+
fn(ecsact_destroy_enum, __VA_ARGS__); \
579+
fn(ecsact_add_enum_value, __VA_ARGS__); \
580+
fn(ecsact_remove_enum_value, __VA_ARGS__); \
581+
fn(ecsact_set_system_capability, __VA_ARGS__); \
582+
fn(ecsact_unset_system_capability, __VA_ARGS__); \
583+
fn(ecsact_add_system_assoc, __VA_ARGS__); \
584+
fn(ecsact_remove_system_assoc, __VA_ARGS__); \
585+
fn(ecsact_add_system_assoc_field, __VA_ARGS__); \
586+
fn(ecsact_remove_system_assoc_field, __VA_ARGS__); \
587+
fn(ecsact_set_system_assoc_capability, __VA_ARGS__); \
588+
fn(ecsact_set_system_association_capability, __VA_ARGS__); \
589+
fn(ecsact_unset_system_association_capability, __VA_ARGS__); \
590+
fn(ecsact_add_system_generates, __VA_ARGS__); \
591+
fn(ecsact_remove_system_generates, __VA_ARGS__); \
592+
fn(ecsact_system_generates_set_component, __VA_ARGS__); \
593+
fn(ecsact_system_generates_unset_component, __VA_ARGS__); \
594+
fn(ecsact_set_entity_execution_status, __VA_ARGS__); \
595+
fn(ecsact_set_system_parallel_execution, __VA_ARGS__); \
596+
fn(ecsact_set_system_notify_component_setting, __VA_ARGS__); \
597+
fn(ecsact_set_component_type, __VA_ARGS__)
574598
#endif
575599

576600
#endif // ECSACT_RUNTIME_DYNAMIC_H

ecsact/runtime/meta.h

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -511,6 +511,14 @@ ECSACT_META_API_FN(void, ecsact_meta_system_notify_settings)
511511
int32_t* out_notifies_count
512512
);
513513

514+
/**
515+
* Check the type of a component.
516+
*/
517+
ECSACT_META_API_FN(ecsact_component_type, ecsact_meta_component_type)
518+
( //
519+
ecsact_component_like_id component_id
520+
);
521+
514522
// # BEGIN FOR_EACH_ECSACT_META_API_FN
515523
#ifdef ECSACT_MSVC_TRADITIONAL
516524
# define FOR_EACH_ECSACT_META_API_FN(fn, ...) ECSACT_MSVC_TRADITIONAL_ERROR()
@@ -575,7 +583,8 @@ ECSACT_META_API_FN(void, ecsact_meta_system_notify_settings)
575583
fn(ecsact_meta_get_lazy_iteration_rate, __VA_ARGS__); \
576584
fn(ecsact_meta_get_system_parallel_execution, __VA_ARGS__); \
577585
fn(ecsact_meta_system_notify_settings_count, __VA_ARGS__); \
578-
fn(ecsact_meta_system_notify_settings, __VA_ARGS__)
586+
fn(ecsact_meta_system_notify_settings, __VA_ARGS__); \
587+
fn(ecsact_meta_component_type, __VA_ARGS__)
579588
#endif
580589

581590
#endif // ECSACT_RUNTIME_META_H

0 commit comments

Comments
 (0)