Skip to content

Commit a19ae3c

Browse files
committed
feat: got to a compiled state
1 parent a49228d commit a19ae3c

15 files changed

+147
-316
lines changed

.editorconfig

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
root = true
2+
3+
[*]
4+
insert_final_newline = true
5+
indent_style = tab
6+
indent_size = 4

Runtime/AsyncRunner.cs

Lines changed: 8 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ namespace Ecsact {
99
public class AsyncRunner : EcsactRunner {
1010
private EcsactRuntime? runtime;
1111

12+
public global::System.Int32? SessionId;
13+
1214
private void Enqueue() {
1315
var localExecutionOptions = executionOptions;
1416

@@ -21,6 +23,7 @@ private void Enqueue() {
2123
localExecutionOptions.create_entities_placeholders.ToArray();
2224
localExecutionOptions.Alloc();
2325
Ecsact.Defaults.Runtime.async.EnqueueExecutionOptions(
26+
SessionId.Value!,
2427
localExecutionOptions.C()
2528
);
2629
} finally {
@@ -29,11 +32,15 @@ private void Enqueue() {
2932
}
3033

3134
void Update() {
35+
if(!SessionId.HasValue) {
36+
return;
37+
}
38+
3239
if(Ecsact.Defaults.Runtime != null) {
3340
if(!executionOptions.isEmpty()) {
3441
Enqueue();
3542
}
36-
Ecsact.Defaults.Runtime.async.Flush();
43+
Ecsact.Defaults.Runtime.async.Flush(SessionId.Value);
3744
}
3845
}
3946
}

Runtime/EcsactRuntime.cs

Lines changed: 133 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,17 @@ class CurrentSystemExecutionState {
1717

1818
namespace 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+
2031
namespace Async {
2132
public 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;

Runtime/VisualScripting/AsyncConnectEvent.cs

Lines changed: 0 additions & 50 deletions
This file was deleted.

Runtime/VisualScripting/AsyncConnectEvent.cs.meta

Lines changed: 0 additions & 11 deletions
This file was deleted.

0 commit comments

Comments
 (0)