@dcl/ecs 7.20.5-22631826546.commit-7c189f5 → 7.20.5-22638270380.commit-3f48d5e
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/dist/components/extended/Tween.d.ts +0 -90
- package/dist/components/extended/Tween.js +0 -152
- package/dist/components/generated/component-names.gen.js +0 -4
- package/dist/components/generated/global.gen.d.ts +0 -8
- package/dist/components/generated/global.gen.js +0 -4
- package/dist/components/generated/index.gen.d.ts +0 -16
- package/dist/components/generated/index.gen.js +0 -20
- package/dist/components/generated/pb/decentraland/sdk/components/common/input_action.gen.d.ts +2 -12
- package/dist/components/generated/pb/decentraland/sdk/components/common/input_action.gen.js +0 -11
- package/dist/components/generated/pb/decentraland/sdk/components/input_modifier.gen.d.ts +0 -2
- package/dist/components/generated/pb/decentraland/sdk/components/input_modifier.gen.js +0 -20
- package/dist/components/generated/pb/decentraland/sdk/components/pointer_events.gen.d.ts +1 -5
- package/dist/components/generated/pb/decentraland/sdk/components/pointer_events.gen.js +1 -20
- package/dist/components/generated/pb/decentraland/sdk/components/tween.gen.d.ts +0 -40
- package/dist/components/generated/pb/decentraland/sdk/components/tween.gen.js +0 -176
- package/dist/components/generated/pb/decentraland/sdk/components/virtual_camera.gen.d.ts +0 -3
- package/dist/components/generated/pb/decentraland/sdk/components/virtual_camera.gen.js +1 -10
- package/dist/components/index.d.ts +5 -4
- package/dist/components/index.js +5 -5
- package/dist/components/manual/CreatedBy.d.ts +9 -0
- package/dist/components/manual/CreatedBy.js +8 -0
- package/dist/components/manual/Transform.d.ts +9 -0
- package/dist/components/manual/Transform.js +3 -3
- package/dist/components/types.d.ts +2 -2
- package/dist/engine/component.d.ts +52 -1
- package/dist/engine/grow-only-value-set-component-definition.js +45 -2
- package/dist/engine/lww-element-set-component-definition.d.ts +3 -1
- package/dist/engine/lww-element-set-component-definition.js +65 -12
- package/dist/index.d.ts +2 -2
- package/dist/index.js +1 -1
- package/dist/serialization/crdt/authoritativePutComponent.d.ts +15 -0
- package/dist/serialization/crdt/authoritativePutComponent.js +47 -0
- package/dist/serialization/crdt/index.d.ts +1 -0
- package/dist/serialization/crdt/index.js +1 -0
- package/dist/serialization/crdt/types.d.ts +25 -3
- package/dist/serialization/crdt/types.js +3 -1
- package/dist/systems/crdt/index.d.ts +0 -1
- package/dist/systems/crdt/index.js +55 -146
- package/dist/systems/events.d.ts +0 -65
- package/dist/systems/events.js +8 -70
- package/dist-cjs/components/extended/Tween.d.ts +0 -90
- package/dist-cjs/components/extended/Tween.js +0 -152
- package/dist-cjs/components/generated/component-names.gen.js +0 -4
- package/dist-cjs/components/generated/global.gen.d.ts +0 -8
- package/dist-cjs/components/generated/global.gen.js +1 -6
- package/dist-cjs/components/generated/index.gen.d.ts +0 -16
- package/dist-cjs/components/generated/index.gen.js +2 -26
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/input_action.gen.d.ts +2 -12
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/common/input_action.gen.js +1 -12
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/input_modifier.gen.d.ts +0 -2
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/input_modifier.gen.js +0 -20
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/pointer_events.gen.d.ts +1 -5
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/pointer_events.gen.js +1 -20
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/tween.gen.d.ts +0 -40
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/tween.gen.js +1 -177
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/virtual_camera.gen.d.ts +0 -3
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/virtual_camera.gen.js +1 -10
- package/dist-cjs/components/index.d.ts +5 -4
- package/dist-cjs/components/index.js +7 -7
- package/dist-cjs/components/manual/CreatedBy.d.ts +9 -0
- package/dist-cjs/components/manual/CreatedBy.js +10 -0
- package/dist-cjs/components/manual/Transform.d.ts +9 -0
- package/dist-cjs/components/manual/Transform.js +3 -3
- package/dist-cjs/components/types.d.ts +2 -2
- package/dist-cjs/engine/component.d.ts +52 -1
- package/dist-cjs/engine/grow-only-value-set-component-definition.js +44 -1
- package/dist-cjs/engine/lww-element-set-component-definition.d.ts +3 -1
- package/dist-cjs/engine/lww-element-set-component-definition.js +68 -13
- package/dist-cjs/index.d.ts +2 -2
- package/dist-cjs/index.js +2 -2
- package/dist-cjs/serialization/crdt/authoritativePutComponent.d.ts +15 -0
- package/dist-cjs/serialization/crdt/authoritativePutComponent.js +50 -0
- package/dist-cjs/serialization/crdt/index.d.ts +1 -0
- package/dist-cjs/serialization/crdt/index.js +1 -0
- package/dist-cjs/serialization/crdt/types.d.ts +25 -3
- package/dist-cjs/serialization/crdt/types.js +3 -1
- package/dist-cjs/systems/crdt/index.d.ts +0 -1
- package/dist-cjs/systems/crdt/index.js +55 -169
- package/dist-cjs/systems/events.d.ts +0 -65
- package/dist-cjs/systems/events.js +8 -70
- package/package.json +2 -2
- package/dist/components/extended/AudioAnalysis.d.ts +0 -55
- package/dist/components/extended/AudioAnalysis.js +0 -66
- package/dist/components/generated/AudioAnalysis.gen.d.ts +0 -1
- package/dist/components/generated/AudioAnalysis.gen.js +0 -25
- package/dist/components/generated/AvatarLocomotionSettings.gen.d.ts +0 -1
- package/dist/components/generated/AvatarLocomotionSettings.gen.js +0 -25
- package/dist/components/generated/PhysicsCombinedForce.gen.d.ts +0 -1
- package/dist/components/generated/PhysicsCombinedForce.gen.js +0 -25
- package/dist/components/generated/PhysicsCombinedImpulse.gen.d.ts +0 -1
- package/dist/components/generated/PhysicsCombinedImpulse.gen.js +0 -25
- package/dist/components/generated/pb/decentraland/sdk/components/audio_analysis.gen.d.ts +0 -37
- package/dist/components/generated/pb/decentraland/sdk/components/audio_analysis.gen.js +0 -161
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_locomotion_settings.gen.d.ts +0 -35
- package/dist/components/generated/pb/decentraland/sdk/components/avatar_locomotion_settings.gen.js +0 -123
- package/dist/components/generated/pb/decentraland/sdk/components/physics_combined_force.gen.d.ts +0 -25
- package/dist/components/generated/pb/decentraland/sdk/components/physics_combined_force.gen.js +0 -42
- package/dist/components/generated/pb/decentraland/sdk/components/physics_combined_impulse.gen.d.ts +0 -28
- package/dist/components/generated/pb/decentraland/sdk/components/physics_combined_impulse.gen.js +0 -51
- package/dist/serialization/crdt/network/utils.d.ts +0 -9
- package/dist/serialization/crdt/network/utils.js +0 -60
- package/dist-cjs/components/extended/AudioAnalysis.d.ts +0 -55
- package/dist-cjs/components/extended/AudioAnalysis.js +0 -70
- package/dist-cjs/components/generated/AudioAnalysis.gen.d.ts +0 -1
- package/dist-cjs/components/generated/AudioAnalysis.gen.js +0 -28
- package/dist-cjs/components/generated/AvatarLocomotionSettings.gen.d.ts +0 -1
- package/dist-cjs/components/generated/AvatarLocomotionSettings.gen.js +0 -28
- package/dist-cjs/components/generated/PhysicsCombinedForce.gen.d.ts +0 -1
- package/dist-cjs/components/generated/PhysicsCombinedForce.gen.js +0 -28
- package/dist-cjs/components/generated/PhysicsCombinedImpulse.gen.d.ts +0 -1
- package/dist-cjs/components/generated/PhysicsCombinedImpulse.gen.js +0 -28
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/audio_analysis.gen.d.ts +0 -37
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/audio_analysis.gen.js +0 -167
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_locomotion_settings.gen.d.ts +0 -35
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/avatar_locomotion_settings.gen.js +0 -129
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/physics_combined_force.gen.d.ts +0 -25
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/physics_combined_force.gen.js +0 -48
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/physics_combined_impulse.gen.d.ts +0 -28
- package/dist-cjs/components/generated/pb/decentraland/sdk/components/physics_combined_impulse.gen.js +0 -57
- package/dist-cjs/serialization/crdt/network/utils.d.ts +0 -9
- package/dist-cjs/serialization/crdt/network/utils.js +0 -67
|
@@ -1,24 +1,17 @@
|
|
|
1
1
|
import { EntityState } from '../../engine/entity';
|
|
2
2
|
import { ReadWriteByteBuffer } from '../../serialization/ByteBuffer';
|
|
3
|
-
import { AppendValueOperation, CrdtMessageProtocol
|
|
3
|
+
import { AppendValueOperation, CrdtMessageProtocol } from '../../serialization/crdt';
|
|
4
4
|
import { DeleteComponent } from '../../serialization/crdt/deleteComponent';
|
|
5
5
|
import { DeleteEntity } from '../../serialization/crdt/deleteEntity';
|
|
6
6
|
import { PutComponentOperation } from '../../serialization/crdt/putComponent';
|
|
7
|
+
import { AuthoritativePutComponentOperation } from '../../serialization/crdt/authoritativePutComponent';
|
|
7
8
|
import { CrdtMessageType } from '../../serialization/crdt/types';
|
|
8
|
-
import { PutNetworkComponentOperation } from '../../serialization/crdt/network/putComponentNetwork';
|
|
9
|
-
import { NetworkEntity as defineNetworkEntity, NetworkParent as defineNetworkParent, Transform as defineTransform } from '../../components';
|
|
10
|
-
import * as networkUtils from '../../serialization/crdt/network/utils';
|
|
11
|
-
// NetworkMessages can only have a MAX_SIZE of 12kb. So we need to send it in chunks.
|
|
12
|
-
export const LIVEKIT_MAX_SIZE = 12;
|
|
13
9
|
/**
|
|
14
10
|
* @internal
|
|
15
11
|
*/
|
|
16
12
|
export function crdtSceneSystem(engine, onProcessEntityComponentChange) {
|
|
17
13
|
const transports = [];
|
|
18
|
-
//
|
|
19
|
-
const NetworkEntity = defineNetworkEntity(engine);
|
|
20
|
-
const NetworkParent = defineNetworkParent(engine);
|
|
21
|
-
const Transform = defineTransform(engine);
|
|
14
|
+
// No network components needed - pure CRDT processing only
|
|
22
15
|
// Messages that we received at transport.onMessage waiting to be processed
|
|
23
16
|
const receivedMessages = [];
|
|
24
17
|
// Messages already processed by the engine but that we need to broadcast to other transports.
|
|
@@ -43,27 +36,20 @@ export function crdtSceneSystem(engine, onProcessEntityComponentChange) {
|
|
|
43
36
|
if (header.type === CrdtMessageType.DELETE_COMPONENT) {
|
|
44
37
|
message = DeleteComponent.read(buffer);
|
|
45
38
|
}
|
|
46
|
-
else if (header.type === CrdtMessageType.DELETE_COMPONENT_NETWORK) {
|
|
47
|
-
message = DeleteComponentNetwork.read(buffer);
|
|
48
|
-
}
|
|
49
39
|
else if (header.type === CrdtMessageType.PUT_COMPONENT) {
|
|
50
40
|
message = PutComponentOperation.read(buffer);
|
|
51
41
|
}
|
|
52
|
-
else if (header.type === CrdtMessageType.
|
|
53
|
-
message =
|
|
42
|
+
else if (header.type === CrdtMessageType.AUTHORITATIVE_PUT_COMPONENT) {
|
|
43
|
+
message = AuthoritativePutComponentOperation.read(buffer);
|
|
54
44
|
}
|
|
55
45
|
else if (header.type === CrdtMessageType.DELETE_ENTITY) {
|
|
56
46
|
message = DeleteEntity.read(buffer);
|
|
57
47
|
}
|
|
58
|
-
else if (header.type === CrdtMessageType.DELETE_ENTITY_NETWORK) {
|
|
59
|
-
message = DeleteEntityNetwork.read(buffer);
|
|
60
|
-
}
|
|
61
48
|
else if (header.type === CrdtMessageType.APPEND_VALUE) {
|
|
62
49
|
message = AppendValueOperation.read(buffer);
|
|
63
|
-
// Unknown message, we skip it
|
|
64
50
|
}
|
|
65
51
|
else {
|
|
66
|
-
//
|
|
52
|
+
// Unknown message, we skip it (including NETWORK messages)
|
|
67
53
|
buffer.incrementReadOffset(header.length);
|
|
68
54
|
}
|
|
69
55
|
if (message) {
|
|
@@ -84,22 +70,6 @@ export function crdtSceneSystem(engine, onProcessEntityComponentChange) {
|
|
|
84
70
|
const messagesToProcess = value.splice(0, value.length);
|
|
85
71
|
return messagesToProcess;
|
|
86
72
|
}
|
|
87
|
-
/**
|
|
88
|
-
* Find the local entityId associated to the network component message.
|
|
89
|
-
* It's a mapping Network -> to Local
|
|
90
|
-
* If it's not a network message, return the entityId received by the message
|
|
91
|
-
*/
|
|
92
|
-
function findNetworkId(msg) {
|
|
93
|
-
const hasNetworkId = 'networkId' in msg;
|
|
94
|
-
if (hasNetworkId) {
|
|
95
|
-
for (const [entityId, network] of engine.getEntitiesWith(NetworkEntity)) {
|
|
96
|
-
if (network.networkId === msg.networkId && network.entityId === msg.entityId) {
|
|
97
|
-
return { entityId, network };
|
|
98
|
-
}
|
|
99
|
-
}
|
|
100
|
-
}
|
|
101
|
-
return { entityId: msg.entityId };
|
|
102
|
-
}
|
|
103
73
|
/**
|
|
104
74
|
* This fn will be called on every tick.
|
|
105
75
|
* Process all the messages queue received by the transport
|
|
@@ -108,46 +78,52 @@ export function crdtSceneSystem(engine, onProcessEntityComponentChange) {
|
|
|
108
78
|
const messagesToProcess = getMessages(receivedMessages);
|
|
109
79
|
const entitiesShouldBeCleaned = [];
|
|
110
80
|
for (const msg of messagesToProcess) {
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
entityId = engine.addEntity();
|
|
115
|
-
network = { entityId: msg.entityId, networkId: msg.networkId };
|
|
116
|
-
NetworkEntity.createOrReplace(entityId, network);
|
|
117
|
-
}
|
|
118
|
-
if (msg.type === CrdtMessageType.DELETE_ENTITY || msg.type === CrdtMessageType.DELETE_ENTITY_NETWORK) {
|
|
119
|
-
entitiesShouldBeCleaned.push(entityId);
|
|
81
|
+
// Simple CRDT processing - no network logic
|
|
82
|
+
if (msg.type === CrdtMessageType.DELETE_ENTITY) {
|
|
83
|
+
entitiesShouldBeCleaned.push(msg.entityId);
|
|
120
84
|
broadcastMessages.push(msg);
|
|
121
85
|
}
|
|
122
86
|
else {
|
|
123
|
-
const entityState = engine.entityContainer.getEntityState(entityId);
|
|
124
|
-
// Skip updates from removed
|
|
87
|
+
const entityState = engine.entityContainer.getEntityState(msg.entityId);
|
|
88
|
+
// Skip updates from removed entities
|
|
125
89
|
if (entityState === EntityState.Removed)
|
|
126
90
|
continue;
|
|
127
|
-
// Entities with unknown
|
|
91
|
+
// Entities with unknown state should update its entity state
|
|
128
92
|
if (entityState === EntityState.Unknown) {
|
|
129
|
-
engine.entityContainer.updateUsedEntity(entityId);
|
|
130
|
-
}
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
if (
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
93
|
+
engine.entityContainer.updateUsedEntity(msg.entityId);
|
|
94
|
+
}
|
|
95
|
+
// Only process component-related messages (not DELETE_ENTITY)
|
|
96
|
+
if ('componentId' in msg) {
|
|
97
|
+
const component = engine.getComponentOrNull(msg.componentId);
|
|
98
|
+
if (component) {
|
|
99
|
+
// Handle authoritative messages differently - they force the state regardless of timestamp
|
|
100
|
+
const tryUpdate = () => {
|
|
101
|
+
try {
|
|
102
|
+
return msg.type === CrdtMessageType.AUTHORITATIVE_PUT_COMPONENT
|
|
103
|
+
? component.__forceUpdateFromCrdt(msg)
|
|
104
|
+
: component.updateFromCrdt(msg);
|
|
105
|
+
}
|
|
106
|
+
catch (e) {
|
|
107
|
+
console.error('[receiveMessages] ERROR processing message', msg, e);
|
|
108
|
+
return null;
|
|
109
|
+
}
|
|
110
|
+
};
|
|
111
|
+
const result = tryUpdate();
|
|
112
|
+
if (!result)
|
|
113
|
+
continue;
|
|
114
|
+
const [conflictMessage, value] = result;
|
|
115
|
+
if (!conflictMessage) {
|
|
116
|
+
// Add message to broadcast queue when no conflict
|
|
117
|
+
broadcastMessages.push(msg);
|
|
118
|
+
onProcessEntityComponentChange && onProcessEntityComponentChange(msg.entityId, msg.type, component, value);
|
|
119
|
+
}
|
|
139
120
|
}
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
|
|
121
|
+
else {
|
|
122
|
+
// Component not found - still broadcast for editor compatibility
|
|
123
|
+
/* istanbul ignore next */
|
|
143
124
|
broadcastMessages.push(msg);
|
|
144
|
-
onProcessEntityComponentChange && onProcessEntityComponentChange(entityId, msg.type, component, value);
|
|
145
125
|
}
|
|
146
126
|
}
|
|
147
|
-
else {
|
|
148
|
-
// TODO: test this line, it is fundammental to make the editor work
|
|
149
|
-
broadcastMessages.push(msg);
|
|
150
|
-
}
|
|
151
127
|
}
|
|
152
128
|
}
|
|
153
129
|
// the last stage of the syncrhonization is to delete the entities
|
|
@@ -161,16 +137,17 @@ export function crdtSceneSystem(engine, onProcessEntityComponentChange) {
|
|
|
161
137
|
}
|
|
162
138
|
}
|
|
163
139
|
/**
|
|
164
|
-
*
|
|
140
|
+
* Simple CRDT message broadcasting - no network-specific logic
|
|
165
141
|
*/
|
|
166
142
|
async function sendMessages(entitiesDeletedThisTick) {
|
|
167
|
-
//
|
|
143
|
+
// Get messages from broadcast queue and component updates
|
|
168
144
|
const crdtMessages = getMessages(broadcastMessages);
|
|
169
145
|
const buffer = new ReadWriteByteBuffer();
|
|
146
|
+
// Generate CRDT messages from component updates
|
|
170
147
|
for (const component of engine.componentsIter()) {
|
|
171
148
|
for (const message of component.getCrdtUpdates()) {
|
|
172
149
|
const offset = buffer.currentWriteOffset();
|
|
173
|
-
//
|
|
150
|
+
// Only create messages if there's a transport that will handle it
|
|
174
151
|
if (transports.some((t) => t.filter(message))) {
|
|
175
152
|
if (message.type === CrdtMessageType.PUT_COMPONENT) {
|
|
176
153
|
PutComponentOperation.write(message.entityId, message.timestamp, message.componentId, message.data, buffer);
|
|
@@ -194,7 +171,7 @@ export function crdtSceneSystem(engine, onProcessEntityComponentChange) {
|
|
|
194
171
|
}
|
|
195
172
|
}
|
|
196
173
|
}
|
|
197
|
-
//
|
|
174
|
+
// Handle deleted entities
|
|
198
175
|
for (const entityId of entitiesDeletedThisTick) {
|
|
199
176
|
const offset = buffer.currentWriteOffset();
|
|
200
177
|
DeleteEntity.write(entityId, buffer);
|
|
@@ -205,87 +182,19 @@ export function crdtSceneSystem(engine, onProcessEntityComponentChange) {
|
|
|
205
182
|
});
|
|
206
183
|
onProcessEntityComponentChange && onProcessEntityComponentChange(entityId, CrdtMessageType.DELETE_ENTITY);
|
|
207
184
|
}
|
|
208
|
-
//
|
|
209
|
-
const
|
|
210
|
-
|
|
211
|
-
const __NetworkMessagesBuffer = [];
|
|
212
|
-
const transportIndex = Number(index);
|
|
213
|
-
const transport = transports[transportIndex];
|
|
214
|
-
const isRendererTransport = transport.type === 'renderer';
|
|
215
|
-
const isNetworkTransport = transport.type === 'network';
|
|
216
|
-
// Reset Buffer for each Transport
|
|
217
|
-
transportBuffer.resetBuffer();
|
|
218
|
-
const buffer = new ReadWriteByteBuffer();
|
|
219
|
-
// Then we send all the new crdtMessages that the transport needs to process
|
|
185
|
+
// Simple transport broadcasting - no network-specific transforms
|
|
186
|
+
for (const transport of transports) {
|
|
187
|
+
const transportBuffer = new ReadWriteByteBuffer();
|
|
220
188
|
for (const message of crdtMessages) {
|
|
221
|
-
// Check if adding this message would exceed the size limit
|
|
222
|
-
const currentBufferSize = transportBuffer.toBinary().byteLength;
|
|
223
|
-
const messageSize = message.messageBuffer.byteLength;
|
|
224
|
-
if (isNetworkTransport && (currentBufferSize + messageSize) / 1024 > LIVEKIT_MAX_SIZE) {
|
|
225
|
-
// If the current buffer has content, save it as a chunk
|
|
226
|
-
if (currentBufferSize > 0) {
|
|
227
|
-
__NetworkMessagesBuffer.push(transportBuffer.toCopiedBinary());
|
|
228
|
-
transportBuffer.resetBuffer();
|
|
229
|
-
}
|
|
230
|
-
// If the message itself is larger than the limit, we need to handle it specially
|
|
231
|
-
// For now, we'll skip it to prevent infinite loops
|
|
232
|
-
if (messageSize / 1024 > LIVEKIT_MAX_SIZE) {
|
|
233
|
-
console.error(`Message too large (${messageSize} bytes), skipping message for entity ${message.entityId}`);
|
|
234
|
-
continue;
|
|
235
|
-
}
|
|
236
|
-
}
|
|
237
189
|
// Avoid echo messages
|
|
238
|
-
if (message.transportId ===
|
|
239
|
-
continue;
|
|
240
|
-
// Redundant message for the transport
|
|
241
|
-
if (!transport.filter(message))
|
|
242
|
-
continue;
|
|
243
|
-
const { entityId } = findNetworkId(message);
|
|
244
|
-
const transformNeedsFix = 'componentId' in message &&
|
|
245
|
-
message.componentId === Transform.componentId &&
|
|
246
|
-
Transform.has(entityId) &&
|
|
247
|
-
NetworkParent.has(entityId) &&
|
|
248
|
-
NetworkEntity.has(entityId);
|
|
249
|
-
// If there was a LOCAL change in the transform. Add the parent to that transform
|
|
250
|
-
if (isRendererTransport && message.type === CrdtMessageType.PUT_COMPONENT && transformNeedsFix) {
|
|
251
|
-
const parent = findNetworkId(NetworkParent.get(entityId));
|
|
252
|
-
const transformData = networkUtils.fixTransformParent(message, Transform.get(entityId), parent.entityId);
|
|
253
|
-
const offset = buffer.currentWriteOffset();
|
|
254
|
-
PutComponentOperation.write(entityId, message.timestamp, message.componentId, transformData, buffer);
|
|
255
|
-
transportBuffer.writeBuffer(buffer.buffer().subarray(offset, buffer.currentWriteOffset()), false);
|
|
190
|
+
if (message.transportId === transports.indexOf(transport))
|
|
256
191
|
continue;
|
|
192
|
+
// Check if transport wants this message
|
|
193
|
+
if (transport.filter(message)) {
|
|
194
|
+
transportBuffer.writeBuffer(message.messageBuffer, false);
|
|
257
195
|
}
|
|
258
|
-
if (isRendererTransport && networkUtils.isNetworkMessage(message)) {
|
|
259
|
-
// If it's the renderer transport and its a NetworkMessage, we need to fix the entityId field and convert it to a known Message.
|
|
260
|
-
// PUT_NETWORK_COMPONENT -> PUT_COMPONENT
|
|
261
|
-
let transformData = 'data' in message ? message.data : new Uint8Array();
|
|
262
|
-
if (transformNeedsFix) {
|
|
263
|
-
const parent = findNetworkId(NetworkParent.get(entityId));
|
|
264
|
-
transformData = networkUtils.fixTransformParent(message, Transform.get(entityId), parent.entityId);
|
|
265
|
-
}
|
|
266
|
-
networkUtils.networkMessageToLocal({ ...message, data: transformData }, entityId, buffer, transportBuffer);
|
|
267
|
-
// Iterate the next message
|
|
268
|
-
continue;
|
|
269
|
-
}
|
|
270
|
-
// If its a network transport and its a PUT_COMPONENT that has a NetworkEntity component, we need to send this message
|
|
271
|
-
// through comms with the EntityID and NetworkID from ther NetworkEntity so everyone can recieve this message and map to their custom entityID.
|
|
272
|
-
if (isNetworkTransport && !networkUtils.isNetworkMessage(message)) {
|
|
273
|
-
const networkData = NetworkEntity.getOrNull(message.entityId);
|
|
274
|
-
// If it has networkData convert the message to PUT_NETWORK_COMPONENT.
|
|
275
|
-
if (networkData) {
|
|
276
|
-
networkUtils.localMessageToNetwork(message, networkData, buffer, transportBuffer);
|
|
277
|
-
// Iterate the next message
|
|
278
|
-
continue;
|
|
279
|
-
}
|
|
280
|
-
}
|
|
281
|
-
// Common message
|
|
282
|
-
transportBuffer.writeBuffer(message.messageBuffer, false);
|
|
283
|
-
}
|
|
284
|
-
if (isNetworkTransport && transportBuffer.currentWriteOffset()) {
|
|
285
|
-
__NetworkMessagesBuffer.push(transportBuffer.toBinary());
|
|
286
196
|
}
|
|
287
|
-
|
|
288
|
-
await transport.send(message);
|
|
197
|
+
await transport.send(transportBuffer.toBinary());
|
|
289
198
|
}
|
|
290
199
|
}
|
|
291
200
|
/**
|
package/dist/systems/events.d.ts
CHANGED
|
@@ -17,7 +17,6 @@ export type EventSystemOptions = {
|
|
|
17
17
|
showFeedback?: boolean;
|
|
18
18
|
showHighlight?: boolean;
|
|
19
19
|
maxPlayerDistance?: number;
|
|
20
|
-
priority?: number;
|
|
21
20
|
};
|
|
22
21
|
export declare const getDefaultOpts: (opts?: Partial<EventSystemOptions>) => EventSystemOptions;
|
|
23
22
|
/**
|
|
@@ -48,30 +47,6 @@ export interface PointerEventsSystem {
|
|
|
48
47
|
* @param entity - Entity where the callback was attached
|
|
49
48
|
*/
|
|
50
49
|
removeOnPointerHoverLeave(entity: Entity): void;
|
|
51
|
-
/**
|
|
52
|
-
* @public
|
|
53
|
-
* Remove the callback for onProximityDown event
|
|
54
|
-
* @param entity - Entity where the callback was attached
|
|
55
|
-
*/
|
|
56
|
-
removeOnProximityDown(entity: Entity): void;
|
|
57
|
-
/**
|
|
58
|
-
* @public
|
|
59
|
-
* Remove the callback for onProximityUp event
|
|
60
|
-
* @param entity - Entity where the callback was attached
|
|
61
|
-
*/
|
|
62
|
-
removeOnProximityUp(entity: Entity): void;
|
|
63
|
-
/**
|
|
64
|
-
* @public
|
|
65
|
-
* Remove the callback for onProximityEnter event
|
|
66
|
-
* @param entity - Entity where the callback was attached
|
|
67
|
-
*/
|
|
68
|
-
removeOnProximityEnter(entity: Entity): void;
|
|
69
|
-
/**
|
|
70
|
-
* @public
|
|
71
|
-
* Remove the callback for onProximityLeave event
|
|
72
|
-
* @param entity - Entity where the callback was attached
|
|
73
|
-
*/
|
|
74
|
-
removeOnProximityLeave(entity: Entity): void;
|
|
75
50
|
/**
|
|
76
51
|
* @public
|
|
77
52
|
* Execute callback when the user press the InputButton pointing at the entity
|
|
@@ -126,46 +101,6 @@ export interface PointerEventsSystem {
|
|
|
126
101
|
entity: Entity;
|
|
127
102
|
opts?: Partial<EventSystemOptions>;
|
|
128
103
|
}, cb: EventSystemCallback): void;
|
|
129
|
-
/**
|
|
130
|
-
* @public
|
|
131
|
-
* Execute callback when the user presses the proximity button on the entity
|
|
132
|
-
* @param pointerData - Entity to attach the callback - Opts to trigger Feedback and Button
|
|
133
|
-
* @param cb - Function to execute when click fires
|
|
134
|
-
*/
|
|
135
|
-
onProximityDown(pointerData: {
|
|
136
|
-
entity: Entity;
|
|
137
|
-
opts?: Partial<EventSystemOptions>;
|
|
138
|
-
}, cb: EventSystemCallback): void;
|
|
139
|
-
/**
|
|
140
|
-
* @public
|
|
141
|
-
* Execute callback when the user releases the proximity button on the entity
|
|
142
|
-
* @param pointerData - Entity to attach the callback - Opts to trigger Feedback and Button
|
|
143
|
-
* @param cb - Function to execute when event fires
|
|
144
|
-
*/
|
|
145
|
-
onProximityUp(pointerData: {
|
|
146
|
-
entity: Entity;
|
|
147
|
-
opts?: Partial<EventSystemOptions>;
|
|
148
|
-
}, cb: EventSystemCallback): void;
|
|
149
|
-
/**
|
|
150
|
-
* @public
|
|
151
|
-
* Execute callback when the entity enters the proximity zone of the user
|
|
152
|
-
* @param pointerData - Entity to attach the callback - Opts to trigger Feedback and Button
|
|
153
|
-
* @param cb - Function to execute when event fires
|
|
154
|
-
*/
|
|
155
|
-
onProximityEnter(pointerData: {
|
|
156
|
-
entity: Entity;
|
|
157
|
-
opts?: Partial<EventSystemOptions>;
|
|
158
|
-
}, cb: EventSystemCallback): void;
|
|
159
|
-
/**
|
|
160
|
-
* @public
|
|
161
|
-
* Execute callback when the entity leaves the proximity zone of the user
|
|
162
|
-
* @param pointerData - Entity to attach the callback - Opts to trigger Feedback and Button
|
|
163
|
-
* @param cb - Function to execute when event fires
|
|
164
|
-
*/
|
|
165
|
-
onProximityLeave(pointerData: {
|
|
166
|
-
entity: Entity;
|
|
167
|
-
opts?: Partial<EventSystemOptions>;
|
|
168
|
-
}, cb: EventSystemCallback): void;
|
|
169
104
|
}
|
|
170
105
|
/**
|
|
171
106
|
* @public
|
package/dist/systems/events.js
CHANGED
|
@@ -18,14 +18,12 @@ export function createPointerEventsSystem(engine, inputSystem) {
|
|
|
18
18
|
EventType[EventType["Up"] = 2] = "Up";
|
|
19
19
|
EventType[EventType["HoverEnter"] = 3] = "HoverEnter";
|
|
20
20
|
EventType[EventType["HoverLeave"] = 4] = "HoverLeave";
|
|
21
|
-
EventType[EventType["ProximityEnter"] = 5] = "ProximityEnter";
|
|
22
|
-
EventType[EventType["ProximityLeave"] = 6] = "ProximityLeave";
|
|
23
21
|
})(EventType || (EventType = {}));
|
|
24
22
|
const eventsMap = new Map();
|
|
25
23
|
function getEvent(entity) {
|
|
26
24
|
return eventsMap.get(entity) || eventsMap.set(entity, new Map()).get(entity);
|
|
27
25
|
}
|
|
28
|
-
function setPointerEvent(entity, type, opts
|
|
26
|
+
function setPointerEvent(entity, type, opts) {
|
|
29
27
|
const pointerEvent = PointerEvents.getMutableOrNull(entity) || PointerEvents.create(entity);
|
|
30
28
|
pointerEvent.pointerEvents.push({
|
|
31
29
|
eventType: type,
|
|
@@ -35,19 +33,15 @@ export function createPointerEventsSystem(engine, inputSystem) {
|
|
|
35
33
|
showHighlight: opts.showHighlight,
|
|
36
34
|
hoverText: opts.hoverText,
|
|
37
35
|
maxDistance: opts.maxDistance,
|
|
38
|
-
maxPlayerDistance: opts.maxPlayerDistance
|
|
39
|
-
|
|
40
|
-
},
|
|
41
|
-
interactionType: interactionType ?? 0 /* InteractionType.CURSOR */
|
|
36
|
+
maxPlayerDistance: opts.maxPlayerDistance
|
|
37
|
+
}
|
|
42
38
|
});
|
|
43
39
|
}
|
|
44
|
-
function removePointerEvent(entity, type, button
|
|
40
|
+
function removePointerEvent(entity, type, button) {
|
|
45
41
|
const pointerEvent = PointerEvents.getMutableOrNull(entity);
|
|
46
42
|
if (!pointerEvent)
|
|
47
43
|
return;
|
|
48
|
-
pointerEvent.pointerEvents = pointerEvent.pointerEvents.filter((pointer) => !(pointer.eventInfo?.button === button &&
|
|
49
|
-
pointer.eventType === type &&
|
|
50
|
-
pointer.interactionType === interactionType));
|
|
44
|
+
pointerEvent.pointerEvents = pointerEvent.pointerEvents.filter((pointer) => !(pointer.eventInfo?.button === button && pointer.eventType === type));
|
|
51
45
|
}
|
|
52
46
|
function getPointerEvent(eventType) {
|
|
53
47
|
if (eventType === EventType.Up) {
|
|
@@ -59,15 +53,9 @@ export function createPointerEventsSystem(engine, inputSystem) {
|
|
|
59
53
|
else if (eventType === EventType.HoverEnter) {
|
|
60
54
|
return 2 /* PointerEventType.PET_HOVER_ENTER */;
|
|
61
55
|
}
|
|
62
|
-
else if (eventType === EventType.ProximityEnter) {
|
|
63
|
-
return 4 /* PointerEventType.PET_PROXIMITY_ENTER */;
|
|
64
|
-
}
|
|
65
|
-
else if (eventType === EventType.ProximityLeave) {
|
|
66
|
-
return 5 /* PointerEventType.PET_PROXIMITY_LEAVE */;
|
|
67
|
-
}
|
|
68
56
|
return 1 /* PointerEventType.PET_DOWN */;
|
|
69
57
|
}
|
|
70
|
-
function removeEvent(entity, type
|
|
58
|
+
function removeEvent(entity, type) {
|
|
71
59
|
const event = getEvent(entity);
|
|
72
60
|
const pointerEvent = event.get(type);
|
|
73
61
|
if (pointerEvent?.opts.hoverText) {
|
|
@@ -90,9 +78,7 @@ export function createPointerEventsSystem(engine, inputSystem) {
|
|
|
90
78
|
if (eventType === EventType.Down ||
|
|
91
79
|
eventType === EventType.Up ||
|
|
92
80
|
eventType === EventType.HoverEnter ||
|
|
93
|
-
eventType === EventType.HoverLeave
|
|
94
|
-
eventType === EventType.ProximityEnter ||
|
|
95
|
-
eventType === EventType.ProximityLeave) {
|
|
81
|
+
eventType === EventType.HoverLeave) {
|
|
96
82
|
const command = inputSystem.getInputCommand(opts.button, getPointerEvent(eventType), entity);
|
|
97
83
|
if (command) {
|
|
98
84
|
checkNotThenable(cb(command), 'Event handler returned a thenable. Only synchronous functions are allowed');
|
|
@@ -139,38 +125,6 @@ export function createPointerEventsSystem(engine, inputSystem) {
|
|
|
139
125
|
getEvent(entity).set(EventType.HoverLeave, { cb, opts: options });
|
|
140
126
|
setPointerEvent(entity, 3 /* PointerEventType.PET_HOVER_LEAVE */, options);
|
|
141
127
|
};
|
|
142
|
-
const onProximityDown = (...args) => {
|
|
143
|
-
const [data, cb] = args;
|
|
144
|
-
const { entity, opts } = data;
|
|
145
|
-
const options = getDefaultOpts(opts);
|
|
146
|
-
removeEvent(entity, EventType.Down, 1 /* InteractionType.PROXIMITY */);
|
|
147
|
-
getEvent(entity).set(EventType.Down, { cb, opts: options });
|
|
148
|
-
setPointerEvent(entity, 1 /* PointerEventType.PET_DOWN */, options, 1 /* InteractionType.PROXIMITY */);
|
|
149
|
-
};
|
|
150
|
-
const onProximityUp = (...args) => {
|
|
151
|
-
const [data, cb] = args;
|
|
152
|
-
const { entity, opts } = data;
|
|
153
|
-
const options = getDefaultOpts(opts);
|
|
154
|
-
removeEvent(entity, EventType.Up, 1 /* InteractionType.PROXIMITY */);
|
|
155
|
-
getEvent(entity).set(EventType.Up, { cb, opts: options });
|
|
156
|
-
setPointerEvent(entity, 0 /* PointerEventType.PET_UP */, options, 1 /* InteractionType.PROXIMITY */);
|
|
157
|
-
};
|
|
158
|
-
const onProximityEnter = (...args) => {
|
|
159
|
-
const [data, cb] = args;
|
|
160
|
-
const { entity, opts } = data;
|
|
161
|
-
const options = getDefaultOpts(opts);
|
|
162
|
-
removeEvent(entity, EventType.ProximityEnter, 1 /* InteractionType.PROXIMITY */);
|
|
163
|
-
getEvent(entity).set(EventType.ProximityEnter, { cb, opts: options });
|
|
164
|
-
setPointerEvent(entity, 4 /* PointerEventType.PET_PROXIMITY_ENTER */, options, 1 /* InteractionType.PROXIMITY */);
|
|
165
|
-
};
|
|
166
|
-
const onProximityLeave = (...args) => {
|
|
167
|
-
const [data, cb] = args;
|
|
168
|
-
const { entity, opts } = data;
|
|
169
|
-
const options = getDefaultOpts(opts);
|
|
170
|
-
removeEvent(entity, EventType.ProximityLeave, 1 /* InteractionType.PROXIMITY */);
|
|
171
|
-
getEvent(entity).set(EventType.ProximityLeave, { cb, opts: options });
|
|
172
|
-
setPointerEvent(entity, 5 /* PointerEventType.PET_PROXIMITY_LEAVE */, options, 1 /* InteractionType.PROXIMITY */);
|
|
173
|
-
};
|
|
174
128
|
return {
|
|
175
129
|
removeOnClick(entity) {
|
|
176
130
|
removeEvent(entity, EventType.Click);
|
|
@@ -187,18 +141,6 @@ export function createPointerEventsSystem(engine, inputSystem) {
|
|
|
187
141
|
removeOnPointerHoverLeave(entity) {
|
|
188
142
|
removeEvent(entity, EventType.HoverLeave);
|
|
189
143
|
},
|
|
190
|
-
removeOnProximityDown(entity) {
|
|
191
|
-
removeEvent(entity, EventType.Down, 1 /* InteractionType.PROXIMITY */);
|
|
192
|
-
},
|
|
193
|
-
removeOnProximityUp(entity) {
|
|
194
|
-
removeEvent(entity, EventType.Up, 1 /* InteractionType.PROXIMITY */);
|
|
195
|
-
},
|
|
196
|
-
removeOnProximityEnter(entity) {
|
|
197
|
-
removeEvent(entity, EventType.ProximityEnter, 1 /* InteractionType.PROXIMITY */);
|
|
198
|
-
},
|
|
199
|
-
removeOnProximityLeave(entity) {
|
|
200
|
-
removeEvent(entity, EventType.ProximityLeave, 1 /* InteractionType.PROXIMITY */);
|
|
201
|
-
},
|
|
202
144
|
onClick(value, cb) {
|
|
203
145
|
const { entity } = value;
|
|
204
146
|
const options = getDefaultOpts(value.opts);
|
|
@@ -211,10 +153,6 @@ export function createPointerEventsSystem(engine, inputSystem) {
|
|
|
211
153
|
onPointerDown,
|
|
212
154
|
onPointerUp,
|
|
213
155
|
onPointerHoverEnter,
|
|
214
|
-
onPointerHoverLeave
|
|
215
|
-
onProximityDown,
|
|
216
|
-
onProximityUp,
|
|
217
|
-
onProximityEnter,
|
|
218
|
-
onProximityLeave
|
|
156
|
+
onPointerHoverLeave
|
|
219
157
|
};
|
|
220
158
|
}
|
|
@@ -1,66 +1,6 @@
|
|
|
1
1
|
import { Entity, IEngine, LastWriteWinElementSetComponentDefinition } from '../../engine';
|
|
2
2
|
import { Quaternion, Vector2, Vector3 } from '../generated/pb/decentraland/common/vectors.gen';
|
|
3
3
|
import { EasingFunction, Move, MoveContinuous, PBTween, Rotate, RotateContinuous, Scale, TextureMove, TextureMoveContinuous, TextureMovementType } from '../generated/index.gen';
|
|
4
|
-
/**
|
|
5
|
-
* @public
|
|
6
|
-
* Partial params for Tween.Mode.MoveRotateScale(). At least one of position, rotation, or scale must be provided.
|
|
7
|
-
* Use this when building a mode for Tween.createOrReplace() or TweenSequence (e.g. only positionStart/positionEnd).
|
|
8
|
-
*/
|
|
9
|
-
export interface MoveRotateScaleModeParams {
|
|
10
|
-
/** Position tween (start → end). Optional. */
|
|
11
|
-
position?: {
|
|
12
|
-
start: Vector3;
|
|
13
|
-
end: Vector3;
|
|
14
|
-
};
|
|
15
|
-
/** Rotation tween (start → end). Optional. */
|
|
16
|
-
rotation?: {
|
|
17
|
-
start: Quaternion;
|
|
18
|
-
end: Quaternion;
|
|
19
|
-
};
|
|
20
|
-
/** Scale tween (start → end). Optional. */
|
|
21
|
-
scale?: {
|
|
22
|
-
start: Vector3;
|
|
23
|
-
end: Vector3;
|
|
24
|
-
};
|
|
25
|
-
}
|
|
26
|
-
/**
|
|
27
|
-
* @public
|
|
28
|
-
* Parameters for setMoveRotateScale. At least one of position, rotation, or scale must be provided.
|
|
29
|
-
*/
|
|
30
|
-
export interface SetMoveRotateScaleParams extends MoveRotateScaleModeParams {
|
|
31
|
-
/** Duration of the tween in milliseconds. */
|
|
32
|
-
duration: number;
|
|
33
|
-
/** Easing function (defaults to EF_LINEAR). */
|
|
34
|
-
easingFunction?: EasingFunction;
|
|
35
|
-
}
|
|
36
|
-
/**
|
|
37
|
-
* @public
|
|
38
|
-
* Partial params for Tween.Mode.MoveRotateScaleContinuous(). At least one of position, rotation, or scale must be provided.
|
|
39
|
-
*/
|
|
40
|
-
export interface MoveRotateScaleContinuousModeParams {
|
|
41
|
-
/** Position direction for continuous movement. Optional. */
|
|
42
|
-
position?: {
|
|
43
|
-
direction: Vector3;
|
|
44
|
-
};
|
|
45
|
-
/** Rotation direction for continuous rotation. Optional. */
|
|
46
|
-
rotation?: {
|
|
47
|
-
direction: Quaternion;
|
|
48
|
-
};
|
|
49
|
-
/** Scale direction for continuous scale change. Optional. */
|
|
50
|
-
scale?: {
|
|
51
|
-
direction: Vector3;
|
|
52
|
-
};
|
|
53
|
-
/** Speed of the animation per second. */
|
|
54
|
-
speed: number;
|
|
55
|
-
}
|
|
56
|
-
/**
|
|
57
|
-
* @public
|
|
58
|
-
* Parameters for setMoveRotateScaleContinuous. At least one of position, rotation, or scale must be provided.
|
|
59
|
-
*/
|
|
60
|
-
export interface SetMoveRotateScaleContinuousParams extends MoveRotateScaleContinuousModeParams {
|
|
61
|
-
/** Duration in milliseconds (defaults to 0 for infinite). */
|
|
62
|
-
duration?: number;
|
|
63
|
-
}
|
|
64
4
|
/**
|
|
65
5
|
* @public
|
|
66
6
|
*/
|
|
@@ -93,16 +33,6 @@ export interface TweenHelper {
|
|
|
93
33
|
* @returns a texture-move-continuous mode tween
|
|
94
34
|
*/
|
|
95
35
|
TextureMoveContinuous: (textureMove: TextureMoveContinuous) => PBTween['mode'];
|
|
96
|
-
/**
|
|
97
|
-
* @returns a move-rotate-scale mode tween
|
|
98
|
-
* @param params - partial transform (at least one of position, rotation, scale); omit axes you don't need
|
|
99
|
-
*/
|
|
100
|
-
MoveRotateScale: (params: MoveRotateScaleModeParams) => PBTween['mode'];
|
|
101
|
-
/**
|
|
102
|
-
* @returns a move-rotate-scale-continuous mode tween
|
|
103
|
-
* @param params - partial transform (at least one of position, rotation, scale) + speed; omit axes you don't need
|
|
104
|
-
*/
|
|
105
|
-
MoveRotateScaleContinuous: (params: MoveRotateScaleContinuousModeParams) => PBTween['mode'];
|
|
106
36
|
}
|
|
107
37
|
/**
|
|
108
38
|
* @public
|
|
@@ -188,25 +118,5 @@ export interface TweenComponentDefinitionExtended extends LastWriteWinElementSet
|
|
|
188
118
|
* @param duration - duration of the tween in milliseconds (defaults to 0 for infinite)
|
|
189
119
|
*/
|
|
190
120
|
setTextureMoveContinuous(entity: Entity, direction: Vector2, speed: number, movementType?: TextureMovementType, duration?: number): void;
|
|
191
|
-
/**
|
|
192
|
-
* @public
|
|
193
|
-
*
|
|
194
|
-
* Creates or replaces a move-rotate-scale tween component that simultaneously animates
|
|
195
|
-
* an entity's position, rotation, and/or scale from start to end. Provide only the
|
|
196
|
-
* properties you need (at least one of position, rotation, or scale).
|
|
197
|
-
* @param entity - entity to apply the tween to
|
|
198
|
-
* @param params - object with optional position, rotation, scale (each with start/end), duration, and optional easingFunction
|
|
199
|
-
*/
|
|
200
|
-
setMoveRotateScale(entity: Entity, params: SetMoveRotateScaleParams): void;
|
|
201
|
-
/**
|
|
202
|
-
* @public
|
|
203
|
-
*
|
|
204
|
-
* Creates or replaces a continuous move-rotate-scale tween component that simultaneously
|
|
205
|
-
* moves, rotates, and/or scales an entity continuously. Provide only the properties
|
|
206
|
-
* you need (at least one of position, rotation, or scale).
|
|
207
|
-
* @param entity - entity to apply the tween to
|
|
208
|
-
* @param params - object with optional position, rotation, scale (each with direction), speed, and optional duration
|
|
209
|
-
*/
|
|
210
|
-
setMoveRotateScaleContinuous(entity: Entity, params: SetMoveRotateScaleContinuousParams): void;
|
|
211
121
|
}
|
|
212
122
|
export declare function defineTweenComponent(engine: Pick<IEngine, 'defineComponentFromSchema'>): TweenComponentDefinitionExtended;
|