@dcl/ecs 7.0.0-3532389879.commit-c89c80c → 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,169 @@
1
+ import { crdtProtocol } from '@dcl/crdt';
2
+ import { createByteBuffer } from '../../serialization/ByteBuffer';
3
+ import { ComponentOperation as Message } from '../../serialization/crdt/componentOperation';
4
+ import WireMessage from '../../serialization/wireMessage';
5
+ export function crdtSceneSystem(engine) {
6
+ const transports = [];
7
+ // CRDT Client
8
+ const crdtClient = crdtProtocol();
9
+ // Messages that we received at transport.onMessage waiting to be processed
10
+ const receivedMessages = [];
11
+ // Messages already processed by the engine but that we need to broadcast to other transports.
12
+ const transportMessages = [];
13
+ // Map of entities already processed at least once
14
+ /**
15
+ *
16
+ * @param transportType tranport id to identiy messages
17
+ * @returns a function to process received messages
18
+ */
19
+ function parseChunkMessage(transportType) {
20
+ /**
21
+ * Receives a chunk of binary messages and stores all the valid
22
+ * Component Operation Messages at messages queue
23
+ * @param chunkMessage A chunk of binary messages
24
+ */
25
+ return function parseChunkMessage(chunkMessage) {
26
+ const buffer = createByteBuffer({
27
+ reading: { buffer: chunkMessage, currentOffset: 0 }
28
+ });
29
+ while (WireMessage.validate(buffer)) {
30
+ const offset = buffer.currentReadOffset();
31
+ const message = Message.read(buffer);
32
+ const { type, entity, componentId, data, timestamp } = message;
33
+ receivedMessages.push({
34
+ type,
35
+ entity,
36
+ componentId,
37
+ data,
38
+ timestamp,
39
+ transportType,
40
+ messageBuffer: buffer
41
+ .buffer()
42
+ .subarray(offset, buffer.currentReadOffset())
43
+ });
44
+ }
45
+ // TODO: do something if buffler.len>0
46
+ };
47
+ }
48
+ /**
49
+ * Return and clear the messaes queue
50
+ * @returns messages recieved by the transport to process on the next tick
51
+ */
52
+ function getMessages(value) {
53
+ const messagesToProcess = Array.from(value);
54
+ value.length = 0;
55
+ return messagesToProcess;
56
+ }
57
+ /**
58
+ * This fn will be called on every tick.
59
+ * Process all the messages queue received by the transport
60
+ */
61
+ function receiveMessages() {
62
+ const messagesToProcess = getMessages(receivedMessages);
63
+ for (const transport of transports) {
64
+ const buffer = createByteBuffer();
65
+ for (const message of messagesToProcess) {
66
+ const { data, timestamp, componentId, entity, type } = message;
67
+ const crdtMessage = {
68
+ key1: entity,
69
+ key2: componentId,
70
+ data: data || null,
71
+ timestamp: timestamp
72
+ };
73
+ const component = engine.getComponent(componentId);
74
+ const current = crdtClient.processMessage(crdtMessage);
75
+ // CRDT outdated message. Resend this message through the wire
76
+ if (crdtMessage !== current) {
77
+ const type = component.has(entity)
78
+ ? WireMessage.Enum.PUT_COMPONENT
79
+ : WireMessage.Enum.DELETE_COMPONENT;
80
+ Message.write(type, entity, current.timestamp, component, buffer);
81
+ }
82
+ else {
83
+ // Process CRDT Message
84
+ if (type === WireMessage.Enum.DELETE_COMPONENT) {
85
+ component.deleteFrom(entity);
86
+ }
87
+ else {
88
+ const opts = {
89
+ reading: { buffer: message.data, currentOffset: 0 }
90
+ };
91
+ const bb = createByteBuffer(opts);
92
+ // Update engine component
93
+ component.upsertFromBinary(message.entity, bb);
94
+ component.clearDirty();
95
+ }
96
+ // Add message to transport queue to be processed by others transports
97
+ transportMessages.push(message);
98
+ }
99
+ }
100
+ if (buffer.size()) {
101
+ transport.send(buffer.toBinary());
102
+ }
103
+ }
104
+ }
105
+ /**
106
+ * Iterates the dirty map and generates crdt messages to be send
107
+ * @param dirtyMap a map of { entities: [componentId] }
108
+ */
109
+ function createMessages(dirtyMap) {
110
+ // CRDT Messages will be the merge between the recieved transport messages and the new crdt messages
111
+ const crdtMessages = getMessages(transportMessages);
112
+ const buffer = createByteBuffer();
113
+ for (const [entity, componentsId] of dirtyMap) {
114
+ for (const componentId of componentsId) {
115
+ const component = engine.getComponent(componentId);
116
+ const entityComponent = component.has(entity)
117
+ ? component.toBinary(entity).toBinary()
118
+ : null;
119
+ const event = crdtClient.createEvent(entity, componentId, entityComponent);
120
+ const offset = buffer.currentWriteOffset();
121
+ const type = component.has(entity)
122
+ ? WireMessage.Enum.PUT_COMPONENT
123
+ : WireMessage.Enum.DELETE_COMPONENT;
124
+ const transportMessage = {
125
+ type,
126
+ componentId,
127
+ entity,
128
+ timestamp: event.timestamp
129
+ };
130
+ if (transports.some((t) => t.filter(transportMessage))) {
131
+ Message.write(type, entity, event.timestamp, component, buffer);
132
+ crdtMessages.push({
133
+ ...transportMessage,
134
+ messageBuffer: buffer
135
+ .buffer()
136
+ .subarray(offset, buffer.currentWriteOffset())
137
+ });
138
+ }
139
+ }
140
+ }
141
+ // Send messages to transports
142
+ const transportBuffer = createByteBuffer();
143
+ for (const transport of transports) {
144
+ transportBuffer.resetBuffer();
145
+ for (const message of crdtMessages) {
146
+ if (transport.filter(message)) {
147
+ transportBuffer.writeBuffer(message.messageBuffer, false);
148
+ }
149
+ }
150
+ if (transportBuffer.size()) {
151
+ transport.send(transportBuffer.toBinary());
152
+ }
153
+ else {
154
+ transport.send(new Uint8Array([]));
155
+ }
156
+ }
157
+ }
158
+ function addTransport(transport) {
159
+ transports.push(transport);
160
+ transport.onmessage = parseChunkMessage(transport.type);
161
+ // TODO: pull messages from transport
162
+ // TODO: send entities to transport
163
+ }
164
+ return {
165
+ createMessages,
166
+ receiveMessages,
167
+ addTransport
168
+ };
169
+ }
@@ -0,0 +1,18 @@
1
+ import { Entity } from '../../engine/entity';
2
+ import WireMessage from '../../serialization/wireMessage';
3
+ export declare type ReceiveMessage = {
4
+ type: WireMessage.Enum;
5
+ entity: Entity;
6
+ componentId: number;
7
+ timestamp: number;
8
+ transportType?: string;
9
+ data?: Uint8Array;
10
+ messageBuffer: Uint8Array;
11
+ };
12
+ export declare type TransportMessage = Omit<ReceiveMessage, 'data'>;
13
+ export declare type Transport = {
14
+ type: string;
15
+ send(message: Uint8Array): void;
16
+ onmessage?(message: Uint8Array): void;
17
+ filter(message: Omit<TransportMessage, 'messageBuffer'>): boolean;
18
+ };
@@ -0,0 +1 @@
1
+ export {};
@@ -0,0 +1,9 @@
1
+ import { ComponentDefinition } from '../../engine/component';
2
+ export declare namespace CrdtUtils {
3
+ type ComponentID = ComponentDefinition<any>['_id'];
4
+ enum SynchronizedEntityType {
5
+ NETWORKED = 0,
6
+ RENDERER = 1
7
+ }
8
+ }
9
+ export default CrdtUtils;
@@ -0,0 +1,11 @@
1
+ export var CrdtUtils;
2
+ (function (CrdtUtils) {
3
+ let SynchronizedEntityType;
4
+ (function (SynchronizedEntityType) {
5
+ // synchronizes entities with the NetworkSynchronized component only, used for networked games
6
+ SynchronizedEntityType[SynchronizedEntityType["NETWORKED"] = 0] = "NETWORKED";
7
+ // synchronizes entities needed by the renderer
8
+ SynchronizedEntityType[SynchronizedEntityType["RENDERER"] = 1] = "RENDERER";
9
+ })(SynchronizedEntityType = CrdtUtils.SynchronizedEntityType || (CrdtUtils.SynchronizedEntityType = {}));
10
+ })(CrdtUtils || (CrdtUtils = {}));
11
+ export default CrdtUtils;
@@ -0,0 +1,17 @@
1
+ import { IEngine } from '../engine/types';
2
+ /**
3
+ * Transform parenting: cyclic dependency checker
4
+ * It checks only in modified Transforms
5
+ *
6
+ * Add this system with:
7
+ * ```ts
8
+ * engine.addSystem(cyclicParentingChecker(engine))
9
+ * ````
10
+ * And then it will check every tick the parenting.
11
+ *
12
+ * @public
13
+ *
14
+ * @params engine
15
+ * @returns a system
16
+ */
17
+ export declare function cyclicParentingChecker(engine: IEngine): () => void;
@@ -0,0 +1,33 @@
1
+ import * as components from '../components';
2
+ /**
3
+ * Transform parenting: cyclic dependency checker
4
+ * It checks only in modified Transforms
5
+ *
6
+ * Add this system with:
7
+ * ```ts
8
+ * engine.addSystem(cyclicParentingChecker(engine))
9
+ * ````
10
+ * And then it will check every tick the parenting.
11
+ *
12
+ * @public
13
+ *
14
+ * @params engine
15
+ * @returns a system
16
+ */
17
+ export function cyclicParentingChecker(engine) {
18
+ const Transform = components.Transform(engine);
19
+ return () => {
20
+ for (const entity of Transform.dirtyIterator()) {
21
+ let transform = Transform.getOrNull(entity);
22
+ while (transform && transform.parent) {
23
+ if (transform.parent === entity) {
24
+ console.error(`There is a cyclic parent with entity ${entity}`);
25
+ break;
26
+ }
27
+ else {
28
+ transform = Transform.getOrNull(transform.parent);
29
+ }
30
+ }
31
+ }
32
+ };
33
+ }
@@ -0,0 +1,56 @@
1
+ import { InputAction } from '../components/generated/pb/decentraland/sdk/components/common/input_action.gen';
2
+ import { PBPointerEventsResult_PointerCommand } from '../components/generated/pb/decentraland/sdk/components/pointer_events_result.gen';
3
+ import { IEngine } from '../engine/types';
4
+ import { Entity } from '../engine/entity';
5
+ import { IInputSystem } from '../engine/input';
6
+ export declare type EventSystemCallback = (event: PBPointerEventsResult_PointerCommand) => void;
7
+ export declare type EventSystemOptions = {
8
+ button?: InputAction;
9
+ hoverText?: string;
10
+ maxDistance?: number;
11
+ };
12
+ export declare type PointerEventsSystem = ReturnType<typeof createPointerEventSystem>;
13
+ export declare function createPointerEventSystem(engine: IEngine, inputSystem: IInputSystem): {
14
+ /**
15
+ * @internal
16
+ * Remove the callback for onClick event
17
+ * @param entity - Entity where the callback was attached
18
+ */
19
+ removeOnClick(entity: Entity): void;
20
+ /**
21
+ * @public
22
+ * Remove the callback for onPointerDown event
23
+ * @param entity - Entity where the callback was attached
24
+ */
25
+ removeOnPointerDown(entity: Entity): void;
26
+ /**
27
+ * @public
28
+ * Remove the callback for onPointerUp event
29
+ * @param entity - Entity where the callback was attached
30
+ */
31
+ removeOnPointerUp(entity: Entity): void;
32
+ /**
33
+ * @internal
34
+ * Execute callback when the user clicks the entity.
35
+ * @param entity - Entity to attach the callback
36
+ * @param cb - Function to execute when onPointerDown fires
37
+ * @param opts - Opts to trigger Feedback and Button
38
+ */
39
+ onClick(entity: Entity, cb: EventSystemCallback, opts?: EventSystemOptions): void;
40
+ /**
41
+ * @public
42
+ * Execute callback when the user press the InputButton pointing at the entity
43
+ * @param entity - Entity to attach the callback
44
+ * @param cb - Function to execute when click fires
45
+ * @param opts - Opts to trigger Feedback and Button
46
+ */
47
+ onPointerDown(entity: Entity, cb: EventSystemCallback, opts?: EventSystemOptions): void;
48
+ /**
49
+ * @public
50
+ * Execute callback when the user releases the InputButton pointing at the entity
51
+ * @param entity - Entity to attach the callback
52
+ * @param cb - Function to execute when click fires
53
+ * @param opts - Opts to trigger Feedback and Button
54
+ */
55
+ onPointerUp(entity: Entity, cb: EventSystemCallback, opts?: EventSystemOptions): void;
56
+ };
@@ -0,0 +1,145 @@
1
+ import * as components from '../components';
2
+ import { checkNotThenable } from '../runtime/invariant';
3
+ export function createPointerEventSystem(engine, inputSystem) {
4
+ const PointerHoverFeedback = components.PointerHoverFeedback(engine);
5
+ let EventType;
6
+ (function (EventType) {
7
+ EventType[EventType["Click"] = 0] = "Click";
8
+ EventType[EventType["Down"] = 1] = "Down";
9
+ EventType[EventType["Up"] = 2] = "Up";
10
+ })(EventType || (EventType = {}));
11
+ const getDefaultOpts = (opts = {}) => ({
12
+ button: 3 /* InputAction.IA_ANY */,
13
+ hoverText: 'Interact',
14
+ maxDistance: 100,
15
+ ...opts
16
+ });
17
+ const eventsMap = new Map();
18
+ function getEvent(entity) {
19
+ return (eventsMap.get(entity) || eventsMap.set(entity, new Map()).get(entity));
20
+ }
21
+ function setHoverFeedback(entity, type, opts) {
22
+ if (opts.hoverText) {
23
+ const pointerEvent = PointerHoverFeedback.getMutableOrNull(entity) ||
24
+ PointerHoverFeedback.create(entity);
25
+ pointerEvent.pointerEvents.push({
26
+ eventType: type,
27
+ eventInfo: {
28
+ button: opts.button,
29
+ showFeedback: true,
30
+ hoverText: opts.hoverText,
31
+ maxDistance: opts.maxDistance
32
+ }
33
+ });
34
+ }
35
+ }
36
+ function removeHoverFeedback(entity, type, button) {
37
+ const pointerEvent = PointerHoverFeedback.getMutableOrNull(entity);
38
+ if (!pointerEvent)
39
+ return;
40
+ pointerEvent.pointerEvents = pointerEvent.pointerEvents.filter((pointer) => !(pointer.eventInfo?.button === button && pointer.eventType === type));
41
+ }
42
+ function getPointerEvent(eventType) {
43
+ if (eventType === EventType.Up) {
44
+ return 0 /* PointerEventType.PET_UP */;
45
+ }
46
+ return 1 /* PointerEventType.PET_DOWN */;
47
+ }
48
+ function removeEvent(entity, type) {
49
+ const event = getEvent(entity);
50
+ const pointerEvent = event.get(type);
51
+ if (pointerEvent?.opts.hoverText) {
52
+ removeHoverFeedback(entity, getPointerEvent(type), pointerEvent.opts.button);
53
+ }
54
+ event.delete(type);
55
+ }
56
+ // @internal
57
+ engine.addSystem(function EventSystem() {
58
+ for (const [entity, event] of eventsMap) {
59
+ if (!engine.entityExists(entity)) {
60
+ eventsMap.delete(entity);
61
+ continue;
62
+ }
63
+ for (const [eventType, { cb, opts }] of event) {
64
+ if (eventType === EventType.Click) {
65
+ const command = inputSystem.getClick(opts.button, entity);
66
+ if (command)
67
+ checkNotThenable(cb(command.up), 'Click event returned a thenable. Only synchronous functions are allowed');
68
+ }
69
+ if (eventType === EventType.Down || eventType === EventType.Up) {
70
+ const command = inputSystem.getInputCommand(opts.button, getPointerEvent(eventType), entity);
71
+ if (command) {
72
+ checkNotThenable(cb(command), 'Event handler returned a thenable. Only synchronous functions are allowed');
73
+ }
74
+ }
75
+ }
76
+ }
77
+ });
78
+ return {
79
+ /**
80
+ * @internal
81
+ * Remove the callback for onClick event
82
+ * @param entity - Entity where the callback was attached
83
+ */
84
+ removeOnClick(entity) {
85
+ removeEvent(entity, EventType.Click);
86
+ },
87
+ /**
88
+ * @public
89
+ * Remove the callback for onPointerDown event
90
+ * @param entity - Entity where the callback was attached
91
+ */
92
+ removeOnPointerDown(entity) {
93
+ removeEvent(entity, EventType.Down);
94
+ },
95
+ /**
96
+ * @public
97
+ * Remove the callback for onPointerUp event
98
+ * @param entity - Entity where the callback was attached
99
+ */
100
+ removeOnPointerUp(entity) {
101
+ removeEvent(entity, EventType.Up);
102
+ },
103
+ /**
104
+ * @internal
105
+ * Execute callback when the user clicks the entity.
106
+ * @param entity - Entity to attach the callback
107
+ * @param cb - Function to execute when onPointerDown fires
108
+ * @param opts - Opts to trigger Feedback and Button
109
+ */
110
+ onClick(entity, cb, opts) {
111
+ const options = getDefaultOpts(opts);
112
+ // Clear previous event with over feedback included
113
+ removeEvent(entity, EventType.Click);
114
+ // Set new event
115
+ getEvent(entity).set(EventType.Click, { cb, opts: options });
116
+ setHoverFeedback(entity, 1 /* PointerEventType.PET_DOWN */, options);
117
+ },
118
+ /**
119
+ * @public
120
+ * Execute callback when the user press the InputButton pointing at the entity
121
+ * @param entity - Entity to attach the callback
122
+ * @param cb - Function to execute when click fires
123
+ * @param opts - Opts to trigger Feedback and Button
124
+ */
125
+ onPointerDown(entity, cb, opts) {
126
+ const options = getDefaultOpts(opts);
127
+ removeEvent(entity, EventType.Down);
128
+ getEvent(entity).set(EventType.Down, { cb, opts: options });
129
+ setHoverFeedback(entity, 1 /* PointerEventType.PET_DOWN */, options);
130
+ },
131
+ /**
132
+ * @public
133
+ * Execute callback when the user releases the InputButton pointing at the entity
134
+ * @param entity - Entity to attach the callback
135
+ * @param cb - Function to execute when click fires
136
+ * @param opts - Opts to trigger Feedback and Button
137
+ */
138
+ onPointerUp(entity, cb, opts) {
139
+ const options = getDefaultOpts(opts);
140
+ removeEvent(entity, EventType.Up);
141
+ getEvent(entity).set(EventType.Up, { cb, opts: options });
142
+ setHoverFeedback(entity, 0 /* PointerEventType.PET_UP */, options);
143
+ }
144
+ };
145
+ }
package/package.json CHANGED
@@ -1,11 +1,12 @@
1
1
  {
2
2
  "name": "@dcl/ecs",
3
- "version": "7.0.0-3532389879.commit-c89c80c",
3
+ "version": "7.0.0-3568547351.commit-5420eac",
4
4
  "description": "Decentraland ECS",
5
- "main": "dist/index.js",
6
- "typings": "dist/index.d.ts",
5
+ "main": "./dist/index.js",
6
+ "typings": "./dist/index.d.ts",
7
+ "types": "./dist/index.d.ts",
7
8
  "scripts": {
8
- "build": "./../dcl-rollup/node_modules/.bin/rollup -c ./../dcl-rollup/dist/ecs.config.js"
9
+ "build": "tsc -p tsconfig.json"
9
10
  },
10
11
  "repository": {
11
12
  "type": "git",
@@ -23,22 +24,16 @@
23
24
  },
24
25
  "homepage": "https://github.com/decentraland/ecs#readme",
25
26
  "devDependencies": {
26
- "@types/fs-extra": "^9.0.13",
27
- "fs-extra": "^10.1.0",
28
27
  "ts-proto": "^1.112.0"
29
28
  },
30
29
  "dependencies": {
31
30
  "@dcl/crdt": "^1.0.0-20220819145912.commit-35069cd",
32
- "@dcl/ecs-math": "^2.0.1-20221108141807.commit-a1344cb",
33
- "@dcl/posix": "^1.0.4",
31
+ "@dcl/js-runtime": "file:../js-runtime",
34
32
  "@dcl/protocol": "^1.0.0-3524279049.commit-02b9080"
35
33
  },
36
34
  "files": [
37
- "dist/index.js",
38
- "dist/index.d.ts",
39
- "dist/index.min.js",
40
- "dist/index.min.js.map",
41
- "proto-definitions"
35
+ "dist",
36
+ "etc"
42
37
  ],
43
- "commit": "c89c80c3172f4a3ccbc191441f4c4a7b3fe06ac9"
38
+ "commit": "5420eac2bc4215f214136d8b1331864a19118824"
44
39
  }