@@ -17,6 +17,17 @@ class CurrentSystemExecutionState {
1717
1818namespace Ecsact {
1919
20+ public enum EntityExecutionStatus : Int32 {
21+ Idle ,
22+ PendingLazy ,
23+ }
24+
25+ public enum StreamError : Int32 {
26+ Ok ,
27+ /// An invalid or non-stream component ID was passed into the stream.
28+ InvalidComponentId ,
29+ }
30+
2031namespace Async {
2132public enum ConnectState : Int32 {
2233 NotConnected ,
@@ -753,13 +764,21 @@ public delegate void AsyncReqCompleteCallback(
753764 IntPtr callbackUserData
754765 ) ;
755766
767+ public delegate void AsyncSessionEventCallback (
768+ Int32 sessionId ,
769+ Ecsact . Async . SessionEvent sessionEvent ,
770+ IntPtr callbackUserData
771+ ) ;
772+
756773 public struct AsyncEventsCollector {
757774 public AsyncErrorCallback errorCallback ;
758775 public IntPtr errorCallbackUserData ;
759776 public AsyncExecSystemErrorCallback asyncExecErrorCallback ;
760777 public IntPtr asyncExecErrorCallbackUserData ;
761778 public AsyncReqCompleteCallback asyncReqCompleteCallback ;
762779 public IntPtr asyncReqCompleteCallbackUserData ;
780+ public AsyncSessionEventCallback asyncSessionEventCallback ;
781+ public IntPtr asyncSessionEventCallbackUserData ;
763782 }
764783
765784 static EcsactRuntime ( ) {
@@ -815,32 +834,37 @@ public class Async : ModuleBase {
815834 } ;
816835
817836 internal delegate void ecsact_async_enqueue_execute_options_delegate (
818- Int32 sessionId ,
837+ Int32 sessionId ,
819838 CExecutionOptions executionOptions
820839 ) ;
821- internal ecsact_async_enqueue_execute_options_delegate ? ecsact_async_enqueue_execution_options ;
840+ internal
841+ ecsact_async_enqueue_execute_options_delegate ? ecsact_async_enqueue_execution_options ;
822842
823843 internal delegate void ecsact_async_flush_events_delegate (
824- Int32 sessionId ,
844+ Int32 sessionId ,
825845 in ExecutionEventsCollector executionEventsCollector ,
826846 in AsyncEventsCollector asyncEventsCollector
827847 ) ;
828848 internal ecsact_async_flush_events_delegate ? ecsact_async_flush_events ;
829849
830- internal delegate Int32 ecsact_async_start_delegate ( IntPtr data , Int32 dataLength ) ;
850+ internal delegate Int32
851+ ecsact_async_start_delegate ( IntPtr data , Int32 dataLength ) ;
831852 internal ecsact_async_start_delegate ? ecsact_async_start ;
832853
833854 internal delegate void ecsact_async_stop_delegate ( Int32 SessionId ) ;
834- internal ecsact_async_stop_delegate ? ecsact_async_stop ;
855+ internal ecsact_async_stop_delegate ? ecsact_async_stop ;
835856
836857 internal delegate void ecsact_async_stop_all_delegate ( ) ;
837858 internal ecsact_async_stop_all_delegate ? ecsact_async_stop_all ;
838859
839860 internal delegate void ecsact_async_force_reset_delegate ( ) ;
840861 internal ecsact_async_force_reset_delegate ? ecsact_async_force_reset ;
841862
842- internal delegate int ecsact_async_get_current_tick_delegate ( Int32 sesssionId ) ;
843- internal ecsact_async_get_current_tick_delegate ? ecsact_async_get_current_tick ;
863+ internal delegate int ecsact_async_get_current_tick_delegate (
864+ Int32 sesssionId
865+ ) ;
866+ internal
867+ ecsact_async_get_current_tick_delegate ? ecsact_async_get_current_tick ;
844868
845869 internal delegate void ecsact_async_stream_delegate (
846870 Int32 sessionId ,
@@ -851,7 +875,6 @@ IntPtr indexedFieldValues
851875 ) ;
852876 internal ecsact_async_stream_delegate ? ecsact_async_stream ;
853877
854-
855878 public delegate void AsyncErrorCallback (
856879 Ecsact . AsyncError err ,
857880 Int32 [ ] requestIds
@@ -866,10 +889,11 @@ public delegate void ConnectCallback(
866889 Int32 connectPort
867890 ) ;
868891
869- private AsyncEventsCollector _asyncEvs ;
870- private List < AsyncErrorCallback > _errCallbacks = new ( ) ;
871- private List < SystemErrorCallback > _sysErrCallbacks = new ( ) ;
872- private EcsactRuntime _owner ;
892+ private AsyncEventsCollector _asyncEvs ;
893+ private List < AsyncErrorCallback > _errCallbacks = new ( ) ;
894+ private List < SystemErrorCallback > _sysErrCallbacks = new ( ) ;
895+ private List < AsyncSessionEventCallback > _sessionEvCallbacks = new ( ) ;
896+ private EcsactRuntime _owner ;
873897
874898 public delegate void ConnectStateChangeHandler (
875899 Ecsact . Async . ConnectState newState
@@ -886,6 +910,8 @@ internal Async(EcsactRuntime owner) {
886910 asyncExecErrorCallbackUserData = IntPtr . Zero ,
887911 asyncReqCompleteCallback = OnAsyncReqCompleteHandler ,
888912 asyncReqCompleteCallbackUserData = IntPtr . Zero ,
913+ asyncSessionEventCallback = OnAsyncSessionEventHandler ,
914+ asyncSessionEventCallbackUserData = IntPtr . Zero ,
889915 } ;
890916 }
891917
@@ -934,19 +960,42 @@ IntPtr callbackUserData
934960 // TODO: report done requests
935961 }
936962
963+ [ AOT . MonoPInvokeCallback ( typeof ( AsyncSessionEventCallback ) ) ]
964+ public static void OnAsyncSessionEventHandler (
965+ Int32 sessionId ,
966+ Ecsact . Async . SessionEvent sessionEvent ,
967+ IntPtr callbackUserData
968+ ) {
969+ var self = ( GCHandle . FromIntPtr ( callbackUserData ) . Target as Async ) ! ;
970+ foreach ( var cb in self . _sessionEvCallbacks ) {
971+ cb ( sessionId , sessionEvent ) ;
972+ }
973+ }
974+
937975 public Action OnSystemError ( SystemErrorCallback callback ) {
938976 _sysErrCallbacks . Add ( callback ) ;
939-
940977 return ( ) => { _sysErrCallbacks . Remove ( callback ) ; } ;
941978 }
942979
980+ public delegate void AsyncSessionEventCallback (
981+ Int32 sessionId ,
982+ Ecsact . Async . SessionEvent sessionEvent
983+ ) ;
984+
985+ public Action OnSessionEvent ( AsyncSessionEventCallback callback ) {
986+ _sessionEvCallbacks . Add ( callback ) ;
987+ return ( ) => { _sessionEvCallbacks . Remove ( callback ) ; } ;
988+ }
989+
943990 /**
944991 * Wrapper for `ecsact_async_start`
945992 */
946993 public Int32 Start ( byte [ ] optionData ) {
947994 if ( ecsact_async_start == null ) {
948995 throw new EcsactRuntimeMissingMethod ( "ecsact_async_start" ) ;
949996 }
997+
998+ throw new Exception ( "TODO" ) ;
950999 }
9511000
9521001 /**
@@ -960,14 +1009,39 @@ public void Stop(Int32 sessionId) {
9601009 ecsact_async_stop ( sessionId ) ;
9611010 }
9621011
1012+ /**
1013+ * Wrapper for `ecsact_async_stop_all`
1014+ */
1015+ public void StopAll ( ) {
1016+ if ( ecsact_async_stop_all == null ) {
1017+ throw new EcsactRuntimeMissingMethod ( "ecsact_async_stop_all" ) ;
1018+ }
1019+
1020+ ecsact_async_stop_all ( ) ;
1021+ }
1022+
1023+ /**
1024+ * Wrapper for `ecsact_async_force_reset`
1025+ */
1026+ public void ForceReset ( ) {
1027+ if ( ecsact_async_force_reset == null ) {
1028+ throw new EcsactRuntimeMissingMethod ( "ecsact_async_force_reset" ) ;
1029+ }
1030+
1031+ ecsact_async_force_reset ( ) ;
1032+ }
1033+
9631034 public Int32 GetCurrentTick ( Int32 sessionId ) {
9641035 if ( ecsact_async_get_current_tick == null ) {
9651036 throw new EcsactRuntimeMissingMethod ( "ecsact_async_get_current_tick" ) ;
9661037 }
9671038 return ecsact_async_get_current_tick ( sessionId ) ;
9681039 }
9691040
970- public void EnqueueExecutionOptions ( Int32 sessionId , CExecutionOptions executionOptions ) {
1041+ public void EnqueueExecutionOptions (
1042+ Int32 sessionId ,
1043+ CExecutionOptions executionOptions
1044+ ) {
9711045 if ( ecsact_async_enqueue_execution_options == null ) {
9721046 throw new EcsactRuntimeMissingMethod (
9731047 "ecsact_async_enqueue_execution_options"
@@ -1064,10 +1138,22 @@ Int32 componentId
10641138#endif
10651139 }
10661140
1067- internal delegate Int32 ecsact_create_registry_delegate ( string registryName
1141+ internal delegate Int32 ecsact_create_registry_delegate ( //
1142+ string registryName
10681143 ) ;
10691144 internal ecsact_create_registry_delegate ? ecsact_create_registry ;
10701145
1146+ internal delegate Int32 ecsact_clone_registry_delegate ( //
1147+ Int32 registry ,
1148+ string registryName
1149+ ) ;
1150+ internal ecsact_clone_registry_delegate ? ecsact_clone_registry ;
1151+
1152+ internal delegate Int64 ecsact_hash_registry_delegate ( //
1153+ Int32 registry
1154+ ) ;
1155+ internal ecsact_hash_registry_delegate ? ecsact_hash_registry ;
1156+
10711157 internal delegate void ecsact_destroy_registry_delegate ( Int32 registryId ) ;
10721158 internal ecsact_destroy_registry_delegate ? ecsact_destroy_registry ;
10731159
@@ -1196,6 +1282,24 @@ in ExecutionEventsCollector eventsCollector
11961282 ) ;
11971283 internal ecsact_execute_systems_delegate ? ecsact_execute_systems ;
11981284
1285+ internal delegate
1286+ Ecsact . EntityExecutionStatus ecsact_get_entity_execution_status_delegate (
1287+ Int32 registry ,
1288+ Int32 entity ,
1289+ Int32 systemLikeId
1290+ ) ;
1291+ internal
1292+ ecsact_get_entity_execution_status_delegate ? ecsact_get_entity_execution_status ;
1293+
1294+ internal delegate Ecsact . StreamError ecsact_stream_delegate (
1295+ Int32 registry ,
1296+ Int32 entity ,
1297+ Int32 component ,
1298+ IntPtr componentData ,
1299+ IntPtr indexedFieldValues
1300+ ) ;
1301+ internal ecsact_stream_delegate ? ecsact_stream ;
1302+
11991303 private EcsactRuntime _owner ;
12001304
12011305 internal Core ( EcsactRuntime owner ) {
@@ -1791,6 +1895,16 @@ internal delegate Int32
17911895 internal
17921896 ecsact_system_execution_context_entity_delegate ? ecsact_system_execution_context_entity ;
17931897
1898+ internal delegate void
1899+ ecsact_system_execution_context_stream_toggle_delegate (
1900+ IntPtr context ,
1901+ Int32 componentId ,
1902+ [ MarshalAs ( UnmanagedType . I1 ) ] bool streamingEnabled ,
1903+ IntPtr indexedFieldValues
1904+ ) ;
1905+ internal
1906+ ecsact_system_execution_context_stream_toggle_delegate ? ecsact_system_execution_context_stream_toggle ;
1907+
17941908 internal delegate void ecsact_set_system_execution_impl_delegate (
17951909 Int32 systemId ,
17961910 CSystemExecutionImpl executionImpl
@@ -2665,7 +2779,6 @@ public static EcsactRuntime Load(IEnumerable<string> libraryPaths) {
26652779 // clang-format on
26662780 }
26672781
2668-
26692782 if ( runtime . _wasm . ecsact_si_wasm_set_trap_handler != null ) {
26702783 runtime . _wasm . ecsact_si_wasm_set_trap_handler ( DefaultWasmTrapHandler ) ;
26712784 }
@@ -2685,8 +2798,10 @@ public static void Free(EcsactRuntime runtime) {
26852798 }
26862799
26872800 if ( runtime . _async != null ) {
2688- if ( runtime . _async . connectState == Ecsact . Async . ConnectState . Connected ) {
2689- runtime . _async . Stop ( ) ;
2801+ if ( runtime . _async . ecsact_async_force_reset != null ) {
2802+ runtime . _async . ecsact_async_force_reset ( ) ;
2803+ } else if ( runtime . _async . ecsact_async_stop_all != null ) {
2804+ runtime . _async . ecsact_async_stop_all ( ) ;
26902805 }
26912806
26922807 runtime . _async . ecsact_async_flush_events = null ;
0 commit comments