@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.
- package/README.md +2 -3
- package/dist/components/extended/Animator.d.ts +49 -0
- package/dist/components/extended/Animator.js +58 -0
- package/dist/components/extended/Material.d.ts +42 -0
- package/dist/components/extended/Material.js +42 -0
- package/dist/components/extended/MeshCollider.d.ts +42 -0
- package/dist/components/extended/MeshCollider.js +41 -0
- package/dist/components/extended/MeshRenderer.d.ts +40 -0
- package/dist/components/extended/MeshRenderer.js +27 -0
- package/dist/components/generated/Animator.gen.d.ts +8 -0
- package/dist/components/generated/Animator.gen.js +19 -0
- package/dist/components/generated/AudioSource.gen.d.ts +8 -0
- package/dist/components/generated/AudioSource.gen.js +19 -0
- package/dist/components/generated/AudioStream.gen.d.ts +8 -0
- package/dist/components/generated/AudioStream.gen.js +19 -0
- package/dist/components/generated/AvatarAttach.gen.d.ts +8 -0
- package/dist/components/generated/AvatarAttach.gen.js +19 -0
- package/dist/components/generated/AvatarModifierArea.gen.d.ts +8 -0
- package/dist/components/generated/AvatarModifierArea.gen.js +19 -0
- package/dist/components/generated/AvatarShape.gen.d.ts +8 -0
- package/dist/components/generated/AvatarShape.gen.js +19 -0
- package/dist/components/generated/Billboard.gen.d.ts +8 -0
- package/dist/components/generated/Billboard.gen.js +19 -0
- package/dist/components/generated/CameraMode.gen.d.ts +8 -0
- package/dist/components/generated/CameraMode.gen.js +19 -0
- package/dist/components/generated/CameraModeArea.gen.d.ts +8 -0
- package/dist/components/generated/CameraModeArea.gen.js +19 -0
- package/dist/components/generated/GltfContainer.gen.d.ts +8 -0
- package/dist/components/generated/GltfContainer.gen.js +19 -0
- package/dist/components/generated/Material.gen.d.ts +8 -0
- package/dist/components/generated/Material.gen.js +19 -0
- package/dist/components/generated/MeshCollider.gen.d.ts +8 -0
- package/dist/components/generated/MeshCollider.gen.js +19 -0
- package/dist/components/generated/MeshRenderer.gen.d.ts +8 -0
- package/dist/components/generated/MeshRenderer.gen.js +19 -0
- package/dist/components/generated/NftShape.gen.d.ts +8 -0
- package/dist/components/generated/NftShape.gen.js +19 -0
- package/dist/components/generated/PointerEventsResult.gen.d.ts +8 -0
- package/dist/components/generated/PointerEventsResult.gen.js +19 -0
- package/dist/components/generated/PointerHoverFeedback.gen.d.ts +8 -0
- package/dist/components/generated/PointerHoverFeedback.gen.js +19 -0
- package/dist/components/generated/PointerLock.gen.d.ts +8 -0
- package/dist/components/generated/PointerLock.gen.js +19 -0
- package/dist/components/generated/Raycast.gen.d.ts +8 -0
- package/dist/components/generated/Raycast.gen.js +19 -0
- package/dist/components/generated/RaycastResult.gen.d.ts +8 -0
- package/dist/components/generated/RaycastResult.gen.js +19 -0
- package/dist/components/generated/TextShape.gen.d.ts +8 -0
- package/dist/components/generated/TextShape.gen.js +19 -0
- package/dist/components/generated/UiBackground.gen.d.ts +8 -0
- package/dist/components/generated/UiBackground.gen.js +19 -0
- package/dist/components/generated/UiText.gen.d.ts +8 -0
- package/dist/components/generated/UiText.gen.js +19 -0
- package/dist/components/generated/UiTransform.gen.d.ts +8 -0
- package/dist/components/generated/UiTransform.gen.js +19 -0
- package/dist/components/generated/VisibilityComponent.gen.d.ts +8 -0
- package/dist/components/generated/VisibilityComponent.gen.js +19 -0
- package/dist/components/generated/global.gen.d.ts +42 -0
- package/dist/components/generated/global.gen.js +23 -0
- package/dist/components/generated/ids.gen.d.ts +28 -0
- package/dist/components/generated/ids.gen.js +29 -0
- package/dist/components/generated/index.gen.d.ts +99 -0
- package/dist/components/generated/index.gen.js +96 -0
- package/dist/components/generated/pb/decentraland/common/colors.gen.d.ts +26 -0
- package/dist/components/generated/pb/decentraland/common/colors.gen.js +95 -0
- package/dist/components/generated/pb/decentraland/common/texture.gen.d.ts +56 -0
- package/dist/components/generated/pb/decentraland/common/texture.gen.js +139 -0
- package/dist/components/generated/pb/decentraland/common/vectors.gen.d.ts +36 -0
- package/dist/components/generated/pb/decentraland/common/vectors.gen.js +126 -0
- package/dist/components/generated/pb/decentraland/sdk/components/animator.gen.d.ts +30 -0
- package/dist/components/generated/pb/decentraland/sdk/components/animator.gen.js +109 -0
- package/dist/components/generated/pb/decentraland/sdk/components/audio_source.gen.d.ts +17 -0
- package/dist/components/generated/pb/decentraland/sdk/components/audio_source.gen.js +58 -0
- package/dist/components/generated/pb/decentraland/sdk/components/audio_stream.gen.d.ts +14 -0
- package/dist/components/generated/pb/decentraland/sdk/components/audio_stream.gen.js +46 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_attach.gen.d.ts +18 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_attach.gen.js +47 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_modifier_area.gen.d.ts +18 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_modifier_area.gen.js +62 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_shape.gen.d.ts +38 -0
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_shape.gen.js +129 -0
- package/dist/components/generated/pb/decentraland/sdk/components/billboard.gen.d.ts +18 -0
- package/dist/components/generated/pb/decentraland/sdk/components/billboard.gen.js +45 -0
- package/dist/components/generated/pb/decentraland/sdk/components/camera_mode.gen.d.ts +12 -0
- package/dist/components/generated/pb/decentraland/sdk/components/camera_mode.gen.js +33 -0
- package/dist/components/generated/pb/decentraland/sdk/components/camera_mode_area.gen.d.ts +14 -0
- package/dist/components/generated/pb/decentraland/sdk/components/camera_mode_area.gen.js +40 -0
- package/dist/components/generated/pb/decentraland/sdk/components/common/camera_type.gen.d.ts +4 -0
- package/dist/components/generated/pb/decentraland/sdk/components/common/camera_type.gen.js +7 -0
- package/dist/components/generated/pb/decentraland/sdk/components/common/id.gen.d.ts +1 -0
- package/dist/components/generated/pb/decentraland/sdk/components/common/id.gen.js +3 -0
- package/dist/components/generated/pb/decentraland/sdk/components/common/input_action.gen.d.ts +16 -0
- package/dist/components/generated/pb/decentraland/sdk/components/common/input_action.gen.js +19 -0
- package/dist/components/generated/pb/decentraland/sdk/components/common/texts.gen.d.ts +15 -0
- package/dist/components/generated/pb/decentraland/sdk/components/common/texts.gen.js +19 -0
- package/dist/components/generated/pb/decentraland/sdk/components/gltf_container.gen.d.ts +12 -0
- package/dist/components/generated/pb/decentraland/sdk/components/gltf_container.gen.js +34 -0
- package/dist/components/generated/pb/decentraland/sdk/components/material.gen.d.ts +82 -0
- package/dist/components/generated/pb/decentraland/sdk/components/material.gen.js +231 -0
- package/dist/components/generated/pb/decentraland/sdk/components/mesh_collider.gen.d.ts +70 -0
- package/dist/components/generated/pb/decentraland/sdk/components/mesh_collider.gen.js +176 -0
- package/dist/components/generated/pb/decentraland/sdk/components/mesh_renderer.gen.d.ts +65 -0
- package/dist/components/generated/pb/decentraland/sdk/components/mesh_renderer.gen.js +196 -0
- package/dist/components/generated/pb/decentraland/sdk/components/nft_shape.gen.d.ts +41 -0
- package/dist/components/generated/pb/decentraland/sdk/components/nft_shape.gen.js +73 -0
- package/dist/components/generated/pb/decentraland/sdk/components/pointer_events_result.gen.d.ts +34 -0
- package/dist/components/generated/pb/decentraland/sdk/components/pointer_events_result.gen.js +89 -0
- package/dist/components/generated/pb/decentraland/sdk/components/pointer_hover_feedback.gen.d.ts +46 -0
- package/dist/components/generated/pb/decentraland/sdk/components/pointer_hover_feedback.gen.js +126 -0
- package/dist/components/generated/pb/decentraland/sdk/components/pointer_lock.gen.d.ts +11 -0
- package/dist/components/generated/pb/decentraland/sdk/components/pointer_lock.gen.js +34 -0
- package/dist/components/generated/pb/decentraland/sdk/components/raycast.gen.d.ts +19 -0
- package/dist/components/generated/pb/decentraland/sdk/components/raycast.gen.js +58 -0
- package/dist/components/generated/pb/decentraland/sdk/components/raycast_result.gen.d.ts +32 -0
- package/dist/components/generated/pb/decentraland/sdk/components/raycast_result.gen.js +150 -0
- package/dist/components/generated/pb/decentraland/sdk/components/text_shape.gen.d.ts +41 -0
- package/dist/components/generated/pb/decentraland/sdk/components/text_shape.gen.js +176 -0
- package/dist/components/generated/pb/decentraland/sdk/components/ui_background.gen.d.ts +13 -0
- package/dist/components/generated/pb/decentraland/sdk/components/ui_background.gen.js +35 -0
- package/dist/components/generated/pb/decentraland/sdk/components/ui_text.gen.d.ts +21 -0
- package/dist/components/generated/pb/decentraland/sdk/components/ui_text.gen.js +59 -0
- package/dist/components/generated/pb/decentraland/sdk/components/ui_transform.gen.d.ts +149 -0
- package/dist/components/generated/pb/decentraland/sdk/components/ui_transform.gen.js +454 -0
- package/dist/components/generated/pb/decentraland/sdk/components/visibility_component.gen.d.ts +12 -0
- package/dist/components/generated/pb/decentraland/sdk/components/visibility_component.gen.js +34 -0
- package/dist/components/generated/pb/google/protobuf/descriptor.gen.d.ts +378 -0
- package/dist/components/generated/pb/google/protobuf/descriptor.gen.js +1476 -0
- package/dist/components/generated/types.gen.d.ts +6 -0
- package/dist/components/generated/types.gen.js +8 -0
- package/dist/components/index.d.ts +15 -0
- package/dist/components/index.js +16 -0
- package/dist/components/legacy/Transform.d.ts +27 -0
- package/dist/components/legacy/Transform.js +55 -0
- package/dist/components/types.d.ts +4 -0
- package/dist/components/types.js +1 -0
- package/dist/engine/component.d.ts +72 -0
- package/dist/engine/component.js +130 -0
- package/dist/engine/entity-utils.d.ts +18 -0
- package/dist/engine/entity-utils.js +34 -0
- package/dist/engine/entity.d.ts +17 -0
- package/dist/engine/entity.js +55 -0
- package/dist/engine/index.d.ts +12 -0
- package/dist/engine/index.js +172 -0
- package/dist/engine/input.d.ts +36 -0
- package/dist/engine/input.js +156 -0
- package/dist/engine/readonly.d.ts +29 -0
- package/dist/engine/readonly.js +6 -0
- package/dist/engine/systems.d.ts +16 -0
- package/dist/engine/systems.js +44 -0
- package/dist/engine/types.d.ts +148 -0
- package/dist/engine/types.js +1 -0
- package/dist/index.d.ts +16 -4679
- package/dist/index.js +24 -15202
- package/dist/runtime/initialization/index.d.ts +21 -0
- package/dist/runtime/initialization/index.js +20 -0
- package/dist/runtime/invariant.d.ts +1 -0
- package/dist/runtime/invariant.js +8 -0
- package/dist/runtime/types.d.ts +22 -0
- package/dist/runtime/types.js +19 -0
- package/dist/schemas/Array.d.ts +5 -0
- package/dist/schemas/Array.js +24 -0
- package/dist/schemas/ISchema.d.ts +9 -0
- package/dist/schemas/ISchema.js +1 -0
- package/dist/schemas/Map.d.ts +19 -0
- package/dist/schemas/Map.js +31 -0
- package/dist/schemas/Optional.d.ts +5 -0
- package/dist/schemas/Optional.js +25 -0
- package/dist/schemas/basic/Boolean.d.ts +5 -0
- package/dist/schemas/basic/Boolean.js +14 -0
- package/dist/schemas/basic/Enum.d.ts +5 -0
- package/dist/schemas/basic/Enum.js +16 -0
- package/dist/schemas/basic/Float.d.ts +9 -0
- package/dist/schemas/basic/Float.js +28 -0
- package/dist/schemas/basic/Integer.d.ts +17 -0
- package/dist/schemas/basic/Integer.js +56 -0
- package/dist/schemas/basic/String.d.ts +9 -0
- package/dist/schemas/basic/String.js +18 -0
- package/dist/schemas/custom/Color3.d.ts +13 -0
- package/dist/schemas/custom/Color3.js +20 -0
- package/dist/schemas/custom/Color4.d.ts +14 -0
- package/dist/schemas/custom/Color4.js +22 -0
- package/dist/schemas/custom/Entity.d.ts +6 -0
- package/dist/schemas/custom/Entity.js +14 -0
- package/dist/schemas/custom/Quaternion.d.ts +14 -0
- package/dist/schemas/custom/Quaternion.js +22 -0
- package/dist/schemas/custom/Vector3.d.ts +13 -0
- package/dist/schemas/custom/Vector3.js +20 -0
- package/dist/schemas/index.d.ts +42 -0
- package/dist/schemas/index.js +37 -0
- package/dist/schemas/typing.d.ts +15 -0
- package/dist/schemas/typing.js +1 -0
- package/dist/serialization/ByteBuffer/index.d.ts +140 -0
- package/dist/serialization/ByteBuffer/index.js +244 -0
- package/dist/serialization/crdt/componentOperation.d.ts +31 -0
- package/dist/serialization/crdt/componentOperation.js +47 -0
- package/dist/serialization/wireMessage.d.ts +39 -0
- package/dist/serialization/wireMessage.js +52 -0
- package/dist/systems/async-task.d.ts +5 -0
- package/dist/systems/async-task.js +28 -0
- package/dist/systems/crdt/index.d.ts +8 -0
- package/dist/systems/crdt/index.js +169 -0
- package/dist/systems/crdt/types.d.ts +18 -0
- package/dist/systems/crdt/types.js +1 -0
- package/dist/systems/crdt/utils.d.ts +9 -0
- package/dist/systems/crdt/utils.js +11 -0
- package/dist/systems/cyclicParentingChecker.d.ts +17 -0
- package/dist/systems/cyclicParentingChecker.js +33 -0
- package/dist/systems/events.d.ts +56 -0
- package/dist/systems/events.js +145 -0
- package/package.json +9 -14
- package/dist/index.min.js +0 -1
- 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,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-
|
|
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": "
|
|
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/
|
|
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
|
|
38
|
-
"
|
|
39
|
-
"dist/index.min.js",
|
|
40
|
-
"dist/index.min.js.map",
|
|
41
|
-
"proto-definitions"
|
|
35
|
+
"dist",
|
|
36
|
+
"etc"
|
|
42
37
|
],
|
|
43
|
-
"commit": "
|
|
38
|
+
"commit": "5420eac2bc4215f214136d8b1331864a19118824"
|
|
44
39
|
}
|