@dcl/ecs 7.0.0-3548419522.commit-ddcf4b7 → 7.0.0-3568547351.commit-5420eac

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (212) hide show
  1. package/README.md +2 -3
  2. package/dist/components/extended/Animator.d.ts +49 -0
  3. package/dist/components/extended/Animator.js +58 -0
  4. package/dist/components/extended/Material.d.ts +42 -0
  5. package/dist/components/extended/Material.js +42 -0
  6. package/dist/components/extended/MeshCollider.d.ts +42 -0
  7. package/dist/components/extended/MeshCollider.js +41 -0
  8. package/dist/components/extended/MeshRenderer.d.ts +40 -0
  9. package/dist/components/extended/MeshRenderer.js +27 -0
  10. package/dist/components/generated/Animator.gen.d.ts +8 -0
  11. package/dist/components/generated/Animator.gen.js +19 -0
  12. package/dist/components/generated/AudioSource.gen.d.ts +8 -0
  13. package/dist/components/generated/AudioSource.gen.js +19 -0
  14. package/dist/components/generated/AudioStream.gen.d.ts +8 -0
  15. package/dist/components/generated/AudioStream.gen.js +19 -0
  16. package/dist/components/generated/AvatarAttach.gen.d.ts +8 -0
  17. package/dist/components/generated/AvatarAttach.gen.js +19 -0
  18. package/dist/components/generated/AvatarModifierArea.gen.d.ts +8 -0
  19. package/dist/components/generated/AvatarModifierArea.gen.js +19 -0
  20. package/dist/components/generated/AvatarShape.gen.d.ts +8 -0
  21. package/dist/components/generated/AvatarShape.gen.js +19 -0
  22. package/dist/components/generated/Billboard.gen.d.ts +8 -0
  23. package/dist/components/generated/Billboard.gen.js +19 -0
  24. package/dist/components/generated/CameraMode.gen.d.ts +8 -0
  25. package/dist/components/generated/CameraMode.gen.js +19 -0
  26. package/dist/components/generated/CameraModeArea.gen.d.ts +8 -0
  27. package/dist/components/generated/CameraModeArea.gen.js +19 -0
  28. package/dist/components/generated/GltfContainer.gen.d.ts +8 -0
  29. package/dist/components/generated/GltfContainer.gen.js +19 -0
  30. package/dist/components/generated/Material.gen.d.ts +8 -0
  31. package/dist/components/generated/Material.gen.js +19 -0
  32. package/dist/components/generated/MeshCollider.gen.d.ts +8 -0
  33. package/dist/components/generated/MeshCollider.gen.js +19 -0
  34. package/dist/components/generated/MeshRenderer.gen.d.ts +8 -0
  35. package/dist/components/generated/MeshRenderer.gen.js +19 -0
  36. package/dist/components/generated/NftShape.gen.d.ts +8 -0
  37. package/dist/components/generated/NftShape.gen.js +19 -0
  38. package/dist/components/generated/PointerEventsResult.gen.d.ts +8 -0
  39. package/dist/components/generated/PointerEventsResult.gen.js +19 -0
  40. package/dist/components/generated/PointerHoverFeedback.gen.d.ts +8 -0
  41. package/dist/components/generated/PointerHoverFeedback.gen.js +19 -0
  42. package/dist/components/generated/PointerLock.gen.d.ts +8 -0
  43. package/dist/components/generated/PointerLock.gen.js +19 -0
  44. package/dist/components/generated/Raycast.gen.d.ts +8 -0
  45. package/dist/components/generated/Raycast.gen.js +19 -0
  46. package/dist/components/generated/RaycastResult.gen.d.ts +8 -0
  47. package/dist/components/generated/RaycastResult.gen.js +19 -0
  48. package/dist/components/generated/TextShape.gen.d.ts +8 -0
  49. package/dist/components/generated/TextShape.gen.js +19 -0
  50. package/dist/components/generated/UiBackground.gen.d.ts +8 -0
  51. package/dist/components/generated/UiBackground.gen.js +19 -0
  52. package/dist/components/generated/UiText.gen.d.ts +8 -0
  53. package/dist/components/generated/UiText.gen.js +19 -0
  54. package/dist/components/generated/UiTransform.gen.d.ts +8 -0
  55. package/dist/components/generated/UiTransform.gen.js +19 -0
  56. package/dist/components/generated/VisibilityComponent.gen.d.ts +8 -0
  57. package/dist/components/generated/VisibilityComponent.gen.js +19 -0
  58. package/dist/components/generated/global.gen.d.ts +42 -0
  59. package/dist/components/generated/global.gen.js +23 -0
  60. package/dist/components/generated/ids.gen.d.ts +28 -0
  61. package/dist/components/generated/ids.gen.js +29 -0
  62. package/dist/components/generated/index.gen.d.ts +99 -0
  63. package/dist/components/generated/index.gen.js +96 -0
  64. package/dist/components/generated/pb/decentraland/common/colors.gen.d.ts +26 -0
  65. package/dist/components/generated/pb/decentraland/common/colors.gen.js +95 -0
  66. package/dist/components/generated/pb/decentraland/common/texture.gen.d.ts +56 -0
  67. package/dist/components/generated/pb/decentraland/common/texture.gen.js +139 -0
  68. package/dist/components/generated/pb/decentraland/common/vectors.gen.d.ts +36 -0
  69. package/dist/components/generated/pb/decentraland/common/vectors.gen.js +126 -0
  70. package/dist/components/generated/pb/decentraland/sdk/components/animator.gen.d.ts +30 -0
  71. package/dist/components/generated/pb/decentraland/sdk/components/animator.gen.js +109 -0
  72. package/dist/components/generated/pb/decentraland/sdk/components/audio_source.gen.d.ts +17 -0
  73. package/dist/components/generated/pb/decentraland/sdk/components/audio_source.gen.js +58 -0
  74. package/dist/components/generated/pb/decentraland/sdk/components/audio_stream.gen.d.ts +14 -0
  75. package/dist/components/generated/pb/decentraland/sdk/components/audio_stream.gen.js +46 -0
  76. package/dist/components/generated/pb/decentraland/sdk/components/avatar_attach.gen.d.ts +18 -0
  77. package/dist/components/generated/pb/decentraland/sdk/components/avatar_attach.gen.js +47 -0
  78. package/dist/components/generated/pb/decentraland/sdk/components/avatar_modifier_area.gen.d.ts +18 -0
  79. package/dist/components/generated/pb/decentraland/sdk/components/avatar_modifier_area.gen.js +62 -0
  80. package/dist/components/generated/pb/decentraland/sdk/components/avatar_shape.gen.d.ts +38 -0
  81. package/dist/components/generated/pb/decentraland/sdk/components/avatar_shape.gen.js +129 -0
  82. package/dist/components/generated/pb/decentraland/sdk/components/billboard.gen.d.ts +18 -0
  83. package/dist/components/generated/pb/decentraland/sdk/components/billboard.gen.js +45 -0
  84. package/dist/components/generated/pb/decentraland/sdk/components/camera_mode.gen.d.ts +12 -0
  85. package/dist/components/generated/pb/decentraland/sdk/components/camera_mode.gen.js +33 -0
  86. package/dist/components/generated/pb/decentraland/sdk/components/camera_mode_area.gen.d.ts +14 -0
  87. package/dist/components/generated/pb/decentraland/sdk/components/camera_mode_area.gen.js +40 -0
  88. package/dist/components/generated/pb/decentraland/sdk/components/common/camera_type.gen.d.ts +4 -0
  89. package/dist/components/generated/pb/decentraland/sdk/components/common/camera_type.gen.js +7 -0
  90. package/dist/components/generated/pb/decentraland/sdk/components/common/id.gen.d.ts +1 -0
  91. package/dist/components/generated/pb/decentraland/sdk/components/common/id.gen.js +3 -0
  92. package/dist/components/generated/pb/decentraland/sdk/components/common/input_action.gen.d.ts +16 -0
  93. package/dist/components/generated/pb/decentraland/sdk/components/common/input_action.gen.js +19 -0
  94. package/dist/components/generated/pb/decentraland/sdk/components/common/texts.gen.d.ts +15 -0
  95. package/dist/components/generated/pb/decentraland/sdk/components/common/texts.gen.js +19 -0
  96. package/dist/components/generated/pb/decentraland/sdk/components/gltf_container.gen.d.ts +12 -0
  97. package/dist/components/generated/pb/decentraland/sdk/components/gltf_container.gen.js +34 -0
  98. package/dist/components/generated/pb/decentraland/sdk/components/material.gen.d.ts +82 -0
  99. package/dist/components/generated/pb/decentraland/sdk/components/material.gen.js +231 -0
  100. package/dist/components/generated/pb/decentraland/sdk/components/mesh_collider.gen.d.ts +70 -0
  101. package/dist/components/generated/pb/decentraland/sdk/components/mesh_collider.gen.js +176 -0
  102. package/dist/components/generated/pb/decentraland/sdk/components/mesh_renderer.gen.d.ts +65 -0
  103. package/dist/components/generated/pb/decentraland/sdk/components/mesh_renderer.gen.js +196 -0
  104. package/dist/components/generated/pb/decentraland/sdk/components/nft_shape.gen.d.ts +41 -0
  105. package/dist/components/generated/pb/decentraland/sdk/components/nft_shape.gen.js +73 -0
  106. package/dist/components/generated/pb/decentraland/sdk/components/pointer_events_result.gen.d.ts +34 -0
  107. package/dist/components/generated/pb/decentraland/sdk/components/pointer_events_result.gen.js +89 -0
  108. package/dist/components/generated/pb/decentraland/sdk/components/pointer_hover_feedback.gen.d.ts +46 -0
  109. package/dist/components/generated/pb/decentraland/sdk/components/pointer_hover_feedback.gen.js +126 -0
  110. package/dist/components/generated/pb/decentraland/sdk/components/pointer_lock.gen.d.ts +11 -0
  111. package/dist/components/generated/pb/decentraland/sdk/components/pointer_lock.gen.js +34 -0
  112. package/dist/components/generated/pb/decentraland/sdk/components/raycast.gen.d.ts +19 -0
  113. package/dist/components/generated/pb/decentraland/sdk/components/raycast.gen.js +58 -0
  114. package/dist/components/generated/pb/decentraland/sdk/components/raycast_result.gen.d.ts +32 -0
  115. package/dist/components/generated/pb/decentraland/sdk/components/raycast_result.gen.js +150 -0
  116. package/dist/components/generated/pb/decentraland/sdk/components/text_shape.gen.d.ts +41 -0
  117. package/dist/components/generated/pb/decentraland/sdk/components/text_shape.gen.js +176 -0
  118. package/dist/components/generated/pb/decentraland/sdk/components/ui_background.gen.d.ts +13 -0
  119. package/dist/components/generated/pb/decentraland/sdk/components/ui_background.gen.js +35 -0
  120. package/dist/components/generated/pb/decentraland/sdk/components/ui_text.gen.d.ts +21 -0
  121. package/dist/components/generated/pb/decentraland/sdk/components/ui_text.gen.js +59 -0
  122. package/dist/components/generated/pb/decentraland/sdk/components/ui_transform.gen.d.ts +149 -0
  123. package/dist/components/generated/pb/decentraland/sdk/components/ui_transform.gen.js +454 -0
  124. package/dist/components/generated/pb/decentraland/sdk/components/visibility_component.gen.d.ts +12 -0
  125. package/dist/components/generated/pb/decentraland/sdk/components/visibility_component.gen.js +34 -0
  126. package/dist/components/generated/pb/google/protobuf/descriptor.gen.d.ts +378 -0
  127. package/dist/components/generated/pb/google/protobuf/descriptor.gen.js +1476 -0
  128. package/dist/components/generated/types.gen.d.ts +6 -0
  129. package/dist/components/generated/types.gen.js +8 -0
  130. package/dist/components/index.d.ts +15 -0
  131. package/dist/components/index.js +16 -0
  132. package/dist/components/legacy/Transform.d.ts +27 -0
  133. package/dist/components/legacy/Transform.js +55 -0
  134. package/dist/components/types.d.ts +4 -0
  135. package/dist/components/types.js +1 -0
  136. package/dist/engine/component.d.ts +72 -0
  137. package/dist/engine/component.js +130 -0
  138. package/dist/engine/entity-utils.d.ts +18 -0
  139. package/dist/engine/entity-utils.js +34 -0
  140. package/dist/engine/entity.d.ts +17 -0
  141. package/dist/engine/entity.js +55 -0
  142. package/dist/engine/index.d.ts +12 -0
  143. package/dist/engine/index.js +172 -0
  144. package/dist/engine/input.d.ts +36 -0
  145. package/dist/engine/input.js +156 -0
  146. package/dist/engine/readonly.d.ts +29 -0
  147. package/dist/engine/readonly.js +6 -0
  148. package/dist/engine/systems.d.ts +16 -0
  149. package/dist/engine/systems.js +44 -0
  150. package/dist/engine/types.d.ts +148 -0
  151. package/dist/engine/types.js +1 -0
  152. package/dist/index.d.ts +16 -4679
  153. package/dist/index.js +24 -15202
  154. package/dist/runtime/initialization/index.d.ts +21 -0
  155. package/dist/runtime/initialization/index.js +20 -0
  156. package/dist/runtime/invariant.d.ts +1 -0
  157. package/dist/runtime/invariant.js +8 -0
  158. package/dist/runtime/types.d.ts +22 -0
  159. package/dist/runtime/types.js +19 -0
  160. package/dist/schemas/Array.d.ts +5 -0
  161. package/dist/schemas/Array.js +24 -0
  162. package/dist/schemas/ISchema.d.ts +9 -0
  163. package/dist/schemas/ISchema.js +1 -0
  164. package/dist/schemas/Map.d.ts +19 -0
  165. package/dist/schemas/Map.js +31 -0
  166. package/dist/schemas/Optional.d.ts +5 -0
  167. package/dist/schemas/Optional.js +25 -0
  168. package/dist/schemas/basic/Boolean.d.ts +5 -0
  169. package/dist/schemas/basic/Boolean.js +14 -0
  170. package/dist/schemas/basic/Enum.d.ts +5 -0
  171. package/dist/schemas/basic/Enum.js +16 -0
  172. package/dist/schemas/basic/Float.d.ts +9 -0
  173. package/dist/schemas/basic/Float.js +28 -0
  174. package/dist/schemas/basic/Integer.d.ts +17 -0
  175. package/dist/schemas/basic/Integer.js +56 -0
  176. package/dist/schemas/basic/String.d.ts +9 -0
  177. package/dist/schemas/basic/String.js +18 -0
  178. package/dist/schemas/custom/Color3.d.ts +13 -0
  179. package/dist/schemas/custom/Color3.js +20 -0
  180. package/dist/schemas/custom/Color4.d.ts +14 -0
  181. package/dist/schemas/custom/Color4.js +22 -0
  182. package/dist/schemas/custom/Entity.d.ts +6 -0
  183. package/dist/schemas/custom/Entity.js +14 -0
  184. package/dist/schemas/custom/Quaternion.d.ts +14 -0
  185. package/dist/schemas/custom/Quaternion.js +22 -0
  186. package/dist/schemas/custom/Vector3.d.ts +13 -0
  187. package/dist/schemas/custom/Vector3.js +20 -0
  188. package/dist/schemas/index.d.ts +42 -0
  189. package/dist/schemas/index.js +37 -0
  190. package/dist/schemas/typing.d.ts +15 -0
  191. package/dist/schemas/typing.js +1 -0
  192. package/dist/serialization/ByteBuffer/index.d.ts +140 -0
  193. package/dist/serialization/ByteBuffer/index.js +244 -0
  194. package/dist/serialization/crdt/componentOperation.d.ts +31 -0
  195. package/dist/serialization/crdt/componentOperation.js +47 -0
  196. package/dist/serialization/wireMessage.d.ts +39 -0
  197. package/dist/serialization/wireMessage.js +52 -0
  198. package/dist/systems/async-task.d.ts +5 -0
  199. package/dist/systems/async-task.js +28 -0
  200. package/dist/systems/crdt/index.d.ts +8 -0
  201. package/dist/systems/crdt/index.js +169 -0
  202. package/dist/systems/crdt/types.d.ts +18 -0
  203. package/dist/systems/crdt/types.js +1 -0
  204. package/dist/systems/crdt/utils.d.ts +9 -0
  205. package/dist/systems/crdt/utils.js +11 -0
  206. package/dist/systems/cyclicParentingChecker.d.ts +17 -0
  207. package/dist/systems/cyclicParentingChecker.js +33 -0
  208. package/dist/systems/events.d.ts +56 -0
  209. package/dist/systems/events.js +145 -0
  210. package/package.json +9 -14
  211. package/dist/index.min.js +0 -1
  212. package/dist/index.min.js.map +0 -1
@@ -0,0 +1,36 @@
1
+ import { InputAction } from '../components/generated/pb/decentraland/sdk/components/common/input_action.gen';
2
+ import { PointerEventType } from '../components/generated/pb/decentraland/sdk/components/pointer_hover_feedback.gen';
3
+ import { PBPointerEventsResult_PointerCommand } from '../components/generated/pb/decentraland/sdk/components/pointer_events_result.gen';
4
+ import { Entity } from './entity';
5
+ import { IEngine } from './types';
6
+ /**
7
+ * @public
8
+ */
9
+ export declare type IInputSystem = {
10
+ /**
11
+ * @public
12
+ * Check if a pointer event has been emitted in the last tick-update.
13
+ * @param inputAction - the input action to query
14
+ * @param pointerEventType - the pointer event type to query
15
+ * @param entity - the entity to query, ignore for global
16
+ * @returns boolean
17
+ */
18
+ isTriggered: (inputAction: InputAction, pointerEventType: PointerEventType, entity?: Entity) => boolean;
19
+ /**
20
+ * @public
21
+ * Check if an input action is currently being pressed.
22
+ * @param inputAction - the input action to query
23
+ * @returns boolean
24
+ */
25
+ isPressed: (inputAction: InputAction) => boolean;
26
+ /**
27
+ * @public
28
+ * Get the input command info if a pointer event has been emitted in the last tick-update.
29
+ * @param inputAction - the input action to query
30
+ * @param pointerEventType - the pointer event type to query
31
+ * @param entity - the entity to query, ignore for global
32
+ * @returns the input command info or undefined if there is no command in the last tick-update
33
+ */
34
+ getInputCommand: (inputAction: InputAction, pointerEventType: PointerEventType, entity?: Entity) => PBPointerEventsResult_PointerCommand | null;
35
+ };
36
+ export declare function createInputSystem(engine: IEngine): IInputSystem;
@@ -0,0 +1,156 @@
1
+ import * as components from '../components';
2
+ import { Schemas } from '../schemas';
3
+ const InputCommands = [
4
+ 0 /* InputAction.IA_POINTER */,
5
+ 1 /* InputAction.IA_PRIMARY */,
6
+ 2 /* InputAction.IA_SECONDARY */,
7
+ 4 /* InputAction.IA_FORWARD */,
8
+ 5 /* InputAction.IA_BACKWARD */,
9
+ 6 /* InputAction.IA_RIGHT */,
10
+ 7 /* InputAction.IA_LEFT */,
11
+ 8 /* InputAction.IA_JUMP */,
12
+ 9 /* InputAction.IA_WALK */,
13
+ 10 /* InputAction.IA_ACTION_3 */,
14
+ 11 /* InputAction.IA_ACTION_4 */,
15
+ 12 /* InputAction.IA_ACTION_5 */,
16
+ 13 /* InputAction.IA_ACTION_6 */
17
+ ];
18
+ const InternalInputStateSchema = {
19
+ timestampLastUpdate: Schemas.Number,
20
+ currentTimestamp: Schemas.Number,
21
+ buttonState: Schemas.Array(Schemas.Map({
22
+ value: Schemas.Boolean,
23
+ ts: Schemas.Number
24
+ }))
25
+ };
26
+ const InternalInputStateComponentId = 1500;
27
+ const TimestampUpdateSystemPriority = 1 << 20;
28
+ const ButtonStateUpdateSystemPriority = 0;
29
+ export function createInputSystem(engine) {
30
+ const PointerEventsResult = components.PointerEventsResult(engine);
31
+ const InternalInputStateComponent = engine.defineComponent(InternalInputStateSchema, InternalInputStateComponentId);
32
+ InternalInputStateComponent.create(engine.RootEntity, {
33
+ buttonState: Array.from({ length: InputCommands.length }, () => ({
34
+ ts: 0,
35
+ value: false
36
+ }))
37
+ });
38
+ function timestampUpdateSystem() {
39
+ const state = InternalInputStateComponent.get(engine.RootEntity);
40
+ if (state.currentTimestamp > state.timestampLastUpdate) {
41
+ InternalInputStateComponent.getMutable(engine.RootEntity).timestampLastUpdate = state.currentTimestamp;
42
+ }
43
+ }
44
+ function buttonStateUpdateSystem() {
45
+ const component = PointerEventsResult.getOrNull(engine.RootEntity);
46
+ if (!component)
47
+ return;
48
+ const state = InternalInputStateComponent.getMutable(engine.RootEntity);
49
+ for (const command of component.commands) {
50
+ if (command.timestamp > state.buttonState[command.button].ts) {
51
+ if (command.state === 1 /* PointerEventType.PET_DOWN */) {
52
+ state.buttonState[command.button].value = true;
53
+ }
54
+ else if (command.state === 0 /* PointerEventType.PET_UP */) {
55
+ state.buttonState[command.button].value = false;
56
+ }
57
+ }
58
+ }
59
+ }
60
+ engine.addSystem(buttonStateUpdateSystem, ButtonStateUpdateSystemPriority, '@dcl/ecs#buttonStateUpdateSystem');
61
+ engine.addSystem(timestampUpdateSystem, TimestampUpdateSystemPriority, '@dcl/ecs#timestampUpdateSystem');
62
+ function getClick(inputAction, entity) {
63
+ if (inputAction !== 3 /* InputAction.IA_ANY */) {
64
+ return findClick(inputAction, entity);
65
+ }
66
+ for (const input of InputCommands) {
67
+ const cmd = findClick(input, entity);
68
+ if (cmd)
69
+ return cmd;
70
+ }
71
+ return null;
72
+ }
73
+ function findClick(inputAction, entity) {
74
+ const component = PointerEventsResult.getOrNull(engine.RootEntity);
75
+ if (!component)
76
+ return null;
77
+ const commands = component.commands;
78
+ // We search the last DOWN command sorted by timestamp
79
+ const down = findLastAction(commands, 1 /* PointerEventType.PET_DOWN */, inputAction, entity);
80
+ // We search the last UP command sorted by timestamp
81
+ if (!down)
82
+ return null;
83
+ const up = findLastAction(commands, 0 /* PointerEventType.PET_UP */, inputAction, entity);
84
+ if (!up)
85
+ return null;
86
+ const state = InternalInputStateComponent.get(engine.RootEntity);
87
+ // If the DOWN command has happen before the UP commands, it means that that a clicked has happen
88
+ if (down.timestamp < up.timestamp &&
89
+ up.timestamp > state.timestampLastUpdate) {
90
+ InternalInputStateComponent.getMutable(engine.RootEntity).currentTimestamp = Math.max(up.timestamp, state.currentTimestamp);
91
+ return { up, down };
92
+ }
93
+ return null;
94
+ }
95
+ function getInputCommand(inputAction, pointerEventType, entity) {
96
+ if (inputAction !== 3 /* InputAction.IA_ANY */) {
97
+ return findInputCommand(inputAction, pointerEventType, entity);
98
+ }
99
+ for (const input of InputCommands) {
100
+ const cmd = findInputCommand(input, pointerEventType, entity);
101
+ if (cmd)
102
+ return cmd;
103
+ }
104
+ return null;
105
+ }
106
+ function findInputCommand(inputAction, pointerEventType, entity) {
107
+ const component = PointerEventsResult.getOrNull(engine.RootEntity);
108
+ if (!component)
109
+ return null;
110
+ // We search the last pointer Event command sorted by timestamp
111
+ const command = findLastAction(component.commands, pointerEventType, inputAction, entity);
112
+ if (!command)
113
+ return null;
114
+ const state = InternalInputStateComponent.get(engine.RootEntity);
115
+ if (command.timestamp > state.timestampLastUpdate) {
116
+ InternalInputStateComponent.getMutable(engine.RootEntity).currentTimestamp = Math.max(command.timestamp, state.currentTimestamp);
117
+ return command;
118
+ }
119
+ else {
120
+ return null;
121
+ }
122
+ }
123
+ function isClicked(inputAction, entity) {
124
+ return getClick(inputAction, entity) !== null;
125
+ }
126
+ function isTriggered(inputAction, pointerEventType, entity) {
127
+ return getInputCommand(inputAction, pointerEventType, entity) !== null;
128
+ }
129
+ function isPressed(inputAction) {
130
+ return InternalInputStateComponent.get(engine.RootEntity).buttonState[inputAction].value;
131
+ }
132
+ return {
133
+ // @public
134
+ isPressed,
135
+ // @internal
136
+ getClick,
137
+ // @public
138
+ getInputCommand,
139
+ // @internal
140
+ isClicked,
141
+ // @public
142
+ isTriggered
143
+ };
144
+ }
145
+ function findLastAction(commands, pointerEventType, inputAction, entity) {
146
+ let commandToReturn = undefined;
147
+ for (const command of commands) {
148
+ if (command.button === inputAction &&
149
+ command.state === pointerEventType &&
150
+ (!entity || (command.hit && entity === command.hit.entityId))) {
151
+ if (!commandToReturn || command.timestamp >= commandToReturn.timestamp)
152
+ commandToReturn = command;
153
+ }
154
+ }
155
+ return commandToReturn;
156
+ }
@@ -0,0 +1,29 @@
1
+ import { ComponentDefinition } from './component';
2
+ /**
3
+ * @public
4
+ */
5
+ export declare type DeepReadonlyMap<K, V> = ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>>;
6
+ /**
7
+ * @public
8
+ */
9
+ export declare type DeepReadonlySet<T> = ReadonlySet<DeepReadonly<T>>;
10
+ /**
11
+ * @public
12
+ */
13
+ export declare type DeepReadonlyObject<T> = {
14
+ readonly [K in keyof T]: DeepReadonly<T[K]>;
15
+ };
16
+ /**
17
+ * @public
18
+ */
19
+ export declare type ReadonlyPrimitive = number | string | number[] | string[] | boolean | boolean[];
20
+ /**
21
+ * @public
22
+ */
23
+ export declare type ReadonlyComponentSchema<T extends [ComponentDefinition<any, any>, ...ComponentDefinition<any, any>[]]> = {
24
+ [K in keyof T]: T[K] extends ComponentDefinition<any, any> ? ReturnType<T[K]['get']> : never;
25
+ };
26
+ /**
27
+ * @public
28
+ */
29
+ export declare type DeepReadonly<T> = T extends ReadonlyPrimitive ? T : T extends Map<infer K, infer V> ? DeepReadonlyMap<K, V> : T extends Set<infer M> ? DeepReadonlySet<M> : DeepReadonlyObject<T>;
@@ -0,0 +1,6 @@
1
+ /**
2
+ * @internal
3
+ */
4
+ export function deepReadonly(val) {
5
+ return Object.freeze({ ...val });
6
+ }
@@ -0,0 +1,16 @@
1
+ /**
2
+ * @public
3
+ */
4
+ export declare type SystemFn = (dt: number) => void;
5
+ export declare const SYSTEMS_REGULAR_PRIORITY = 100000;
6
+ declare type System = {
7
+ fn: SystemFn;
8
+ priority: number;
9
+ name?: string;
10
+ };
11
+ export declare function SystemContainer(): {
12
+ add: (fn: SystemFn, priority: number, name?: string) => void;
13
+ remove: (selector: string | SystemFn) => boolean;
14
+ getSystems(): System[];
15
+ };
16
+ export {};
@@ -0,0 +1,44 @@
1
+ export const SYSTEMS_REGULAR_PRIORITY = 100e3;
2
+ export function SystemContainer() {
3
+ const systems = [];
4
+ function sort() {
5
+ // TODO: systems with the same priority should always have the same stable order
6
+ // add a "counter" to the System type to ensure that order
7
+ systems.sort((a, b) => b.priority - a.priority);
8
+ }
9
+ function add(fn, priority, name) {
10
+ const systemName = name ?? fn.name;
11
+ if (systems.find((item) => item.fn === fn)) {
12
+ throw new Error(`System ${JSON.stringify(systemName)} already added to the engine`);
13
+ }
14
+ systems.push({
15
+ fn,
16
+ priority,
17
+ name: systemName
18
+ });
19
+ // TODO: replace this sort by an insertion in the right place
20
+ sort();
21
+ }
22
+ function remove(selector) {
23
+ let index = -1;
24
+ if (typeof selector === 'string') {
25
+ index = systems.findIndex((item) => item.name === selector);
26
+ }
27
+ else {
28
+ index = systems.findIndex((item) => item.fn === selector);
29
+ }
30
+ if (index === -1) {
31
+ return false;
32
+ }
33
+ systems.splice(index, 1);
34
+ sort();
35
+ return true;
36
+ }
37
+ return {
38
+ add,
39
+ remove,
40
+ getSystems() {
41
+ return systems;
42
+ }
43
+ };
44
+ }
@@ -0,0 +1,148 @@
1
+ import type { ISchema } from '../schemas/ISchema';
2
+ import { Result, Spec } from '../schemas/Map';
3
+ import { Transport } from '../systems/crdt/types';
4
+ import { ComponentDefinition as CompDef } from './component';
5
+ import { Entity } from './entity';
6
+ import { SystemFn } from './systems';
7
+ import { ReadonlyComponentSchema } from './readonly';
8
+ export { ISchema } from '../schemas/ISchema';
9
+ /**
10
+ * @public
11
+ */
12
+ export declare type Unpacked<T> = T extends (infer U)[] ? U : T;
13
+ /**
14
+ * @public
15
+ */
16
+ export declare type ComponentSchema<T extends [CompDef<any>, ...CompDef<any>[]]> = {
17
+ [K in keyof T]: T[K] extends CompDef<any> ? ReturnType<T[K]['getMutable']> : never;
18
+ };
19
+ /**
20
+ * @public
21
+ */
22
+ export declare type IEngine = {
23
+ /**
24
+ * Increment the used entity counter and return the next one.
25
+ * @param dynamic - whether or no the entity should be considered as Dynamic (vs Static)
26
+ * @returns the next entity unused
27
+ */
28
+ addEntity(dynamic?: boolean): Entity;
29
+ /**
30
+ * An alias of engine.addEntity(true)
31
+ */
32
+ addDynamicEntity(): Entity;
33
+ /**
34
+ * Remove all components of an entity
35
+ * @param entity - entity
36
+ */
37
+ removeEntity(entity: Entity): void;
38
+ /**
39
+ * Remove all components of each entity in the tree made with Transform parenting
40
+ * @param firstEntity - the root entity of the tree
41
+ */
42
+ removeEntityWithChildren(firstEntity: Entity): void;
43
+ /**
44
+ * Check if an entity exists in the engine
45
+ * @param entity - the entity to validate
46
+ * @returns true if the entity exists in the engine
47
+ */
48
+ entityExists(entity: Entity): boolean;
49
+ /**
50
+ * Add the system to the engine. It will be called every tick updated.
51
+ * @param system - function that receives the delta time between last tick and current one.
52
+ * @param priority - a number with the priority, big number are called before smaller ones
53
+ * @param name - optional: a unique name to identify it
54
+ *
55
+ * Example:
56
+ * ```ts
57
+ * function mySystem(dt: number) {
58
+ * const entitiesWithMeshRenderer = engine.getEntitiesWith(MeshRenderer, Transform)
59
+ * for (const [entity, _meshRenderer, _transform] of engine.getEntitiesWith(MeshRenderer, Transform)) {
60
+ * // do stuffs
61
+ * }
62
+ * }
63
+ * engine.addSystem(mySystem, 10)
64
+ * ```
65
+ */
66
+ addSystem(system: SystemFn, priority?: number, name?: string): void;
67
+ /**
68
+ * Remove a system from the engine.
69
+ * @param selector - the function or the unique name to identify
70
+ * @returns if it was found and removed
71
+ */
72
+ removeSystem(selector: string | SystemFn): boolean;
73
+ /**
74
+ * Define a component and add it to the engine.
75
+ * @param spec - An object with schema fields
76
+ * @param componentId - unique id to identify the component, if the component id already exist, it will fail.
77
+ * @param constructorDefault - the initial value prefilled when a component is created without a value
78
+ * @returns The component definition
79
+ *
80
+ * ```ts
81
+ * const DoorComponentId = 10017
82
+ * const Door = engine.defineComponent({
83
+ * id: Schemas.Int,
84
+ * name: Schemas.String
85
+ * }, DoorComponentId)
86
+ *
87
+ * ```
88
+ */
89
+ defineComponent<T extends Spec, ConstructorType = Partial<Result<T>>>(spec: T, componentId: number, constructorDefault?: ConstructorType): CompDef<ISchema<Result<T>>, Partial<Result<T>>>;
90
+ /**
91
+ * Define a component and add it to the engine.
92
+ * @param spec - An object with schema fields
93
+ * @param componentId - unique id to identify the component, if the component id already exist, it will fail.
94
+ * @returns The component definition
95
+ *
96
+ * ```ts
97
+ * const StateComponentId = 10023
98
+ * const StateComponent = engine.defineComponent(Schemas.Bool, VisibleComponentId)
99
+ * ```
100
+ */
101
+ defineComponentFromSchema<T extends ISchema<ConstructorType>, ConstructorType>(spec: T, componentId: number, constructorDefault?: ConstructorType): CompDef<T, ConstructorType>;
102
+ /**
103
+ * Get the component definition from the component id.
104
+ * @param componentId - component number used to identify the component descriptor
105
+ * @returns the component definition, throw an error if it doesn't exist
106
+ * ```ts
107
+ * const StateComponentId = 10023
108
+ * const StateComponent = engine.getComponent(StateComponentId)
109
+ * ```
110
+ */
111
+ getComponent<T extends ISchema>(componentId: number): CompDef<T>;
112
+ /**
113
+ * Get a iterator of entities that has all the component requested.
114
+ * @param components - a list of component definitions
115
+ * @returns An iterator of an array with the [entity, component1, component2, ...]
116
+ *
117
+ * Example:
118
+ * ```ts
119
+ * for (const [entity, meshRenderer, transform] of engine.getEntitiesWith(MeshRenderer, Transform)) {
120
+ * // the properties of meshRenderer and transform are read only
121
+ * }
122
+ * ```
123
+ */
124
+ getEntitiesWith<T extends [CompDef<any>, ...CompDef<any>[]]>(...components: T): Iterable<[Entity, ...ReadonlyComponentSchema<T>]>;
125
+ /**
126
+ * @param deltaTime - deltaTime in seconds
127
+ */
128
+ update(deltaTime: number): void;
129
+ /**
130
+ * @public
131
+ * Refer to the root of the scene, all Transforms without a parent are parenting with RootEntity.
132
+ */
133
+ readonly RootEntity: Entity;
134
+ /**
135
+ * @public
136
+ * The current player entity
137
+ */
138
+ readonly PlayerEntity: Entity;
139
+ /**
140
+ * @public
141
+ * Camera entity of current player.
142
+ */
143
+ readonly CameraEntity: Entity;
144
+ /**
145
+ * @param transport - transport which changes its onmessage to process CRDT messages
146
+ */
147
+ addTransport(transport: Transport): void;
148
+ };
@@ -0,0 +1 @@
1
+ export {};