@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,36 @@
|
|
|
1
|
+
import { InputAction } from '../components/generated/pb/decentraland/sdk/components/common/input_action.gen';
|
|
2
|
+
import { PointerEventType } from '../components/generated/pb/decentraland/sdk/components/pointer_hover_feedback.gen';
|
|
3
|
+
import { PBPointerEventsResult_PointerCommand } from '../components/generated/pb/decentraland/sdk/components/pointer_events_result.gen';
|
|
4
|
+
import { Entity } from './entity';
|
|
5
|
+
import { IEngine } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export declare type IInputSystem = {
|
|
10
|
+
/**
|
|
11
|
+
* @public
|
|
12
|
+
* Check if a pointer event has been emitted in the last tick-update.
|
|
13
|
+
* @param inputAction - the input action to query
|
|
14
|
+
* @param pointerEventType - the pointer event type to query
|
|
15
|
+
* @param entity - the entity to query, ignore for global
|
|
16
|
+
* @returns boolean
|
|
17
|
+
*/
|
|
18
|
+
isTriggered: (inputAction: InputAction, pointerEventType: PointerEventType, entity?: Entity) => boolean;
|
|
19
|
+
/**
|
|
20
|
+
* @public
|
|
21
|
+
* Check if an input action is currently being pressed.
|
|
22
|
+
* @param inputAction - the input action to query
|
|
23
|
+
* @returns boolean
|
|
24
|
+
*/
|
|
25
|
+
isPressed: (inputAction: InputAction) => boolean;
|
|
26
|
+
/**
|
|
27
|
+
* @public
|
|
28
|
+
* Get the input command info if a pointer event has been emitted in the last tick-update.
|
|
29
|
+
* @param inputAction - the input action to query
|
|
30
|
+
* @param pointerEventType - the pointer event type to query
|
|
31
|
+
* @param entity - the entity to query, ignore for global
|
|
32
|
+
* @returns the input command info or undefined if there is no command in the last tick-update
|
|
33
|
+
*/
|
|
34
|
+
getInputCommand: (inputAction: InputAction, pointerEventType: PointerEventType, entity?: Entity) => PBPointerEventsResult_PointerCommand | null;
|
|
35
|
+
};
|
|
36
|
+
export declare function createInputSystem(engine: IEngine): IInputSystem;
|
|
@@ -0,0 +1,156 @@
|
|
|
1
|
+
import * as components from '../components';
|
|
2
|
+
import { Schemas } from '../schemas';
|
|
3
|
+
const InputCommands = [
|
|
4
|
+
0 /* InputAction.IA_POINTER */,
|
|
5
|
+
1 /* InputAction.IA_PRIMARY */,
|
|
6
|
+
2 /* InputAction.IA_SECONDARY */,
|
|
7
|
+
4 /* InputAction.IA_FORWARD */,
|
|
8
|
+
5 /* InputAction.IA_BACKWARD */,
|
|
9
|
+
6 /* InputAction.IA_RIGHT */,
|
|
10
|
+
7 /* InputAction.IA_LEFT */,
|
|
11
|
+
8 /* InputAction.IA_JUMP */,
|
|
12
|
+
9 /* InputAction.IA_WALK */,
|
|
13
|
+
10 /* InputAction.IA_ACTION_3 */,
|
|
14
|
+
11 /* InputAction.IA_ACTION_4 */,
|
|
15
|
+
12 /* InputAction.IA_ACTION_5 */,
|
|
16
|
+
13 /* InputAction.IA_ACTION_6 */
|
|
17
|
+
];
|
|
18
|
+
const InternalInputStateSchema = {
|
|
19
|
+
timestampLastUpdate: Schemas.Number,
|
|
20
|
+
currentTimestamp: Schemas.Number,
|
|
21
|
+
buttonState: Schemas.Array(Schemas.Map({
|
|
22
|
+
value: Schemas.Boolean,
|
|
23
|
+
ts: Schemas.Number
|
|
24
|
+
}))
|
|
25
|
+
};
|
|
26
|
+
const InternalInputStateComponentId = 1500;
|
|
27
|
+
const TimestampUpdateSystemPriority = 1 << 20;
|
|
28
|
+
const ButtonStateUpdateSystemPriority = 0;
|
|
29
|
+
export function createInputSystem(engine) {
|
|
30
|
+
const PointerEventsResult = components.PointerEventsResult(engine);
|
|
31
|
+
const InternalInputStateComponent = engine.defineComponent(InternalInputStateSchema, InternalInputStateComponentId);
|
|
32
|
+
InternalInputStateComponent.create(engine.RootEntity, {
|
|
33
|
+
buttonState: Array.from({ length: InputCommands.length }, () => ({
|
|
34
|
+
ts: 0,
|
|
35
|
+
value: false
|
|
36
|
+
}))
|
|
37
|
+
});
|
|
38
|
+
function timestampUpdateSystem() {
|
|
39
|
+
const state = InternalInputStateComponent.get(engine.RootEntity);
|
|
40
|
+
if (state.currentTimestamp > state.timestampLastUpdate) {
|
|
41
|
+
InternalInputStateComponent.getMutable(engine.RootEntity).timestampLastUpdate = state.currentTimestamp;
|
|
42
|
+
}
|
|
43
|
+
}
|
|
44
|
+
function buttonStateUpdateSystem() {
|
|
45
|
+
const component = PointerEventsResult.getOrNull(engine.RootEntity);
|
|
46
|
+
if (!component)
|
|
47
|
+
return;
|
|
48
|
+
const state = InternalInputStateComponent.getMutable(engine.RootEntity);
|
|
49
|
+
for (const command of component.commands) {
|
|
50
|
+
if (command.timestamp > state.buttonState[command.button].ts) {
|
|
51
|
+
if (command.state === 1 /* PointerEventType.PET_DOWN */) {
|
|
52
|
+
state.buttonState[command.button].value = true;
|
|
53
|
+
}
|
|
54
|
+
else if (command.state === 0 /* PointerEventType.PET_UP */) {
|
|
55
|
+
state.buttonState[command.button].value = false;
|
|
56
|
+
}
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
engine.addSystem(buttonStateUpdateSystem, ButtonStateUpdateSystemPriority, '@dcl/ecs#buttonStateUpdateSystem');
|
|
61
|
+
engine.addSystem(timestampUpdateSystem, TimestampUpdateSystemPriority, '@dcl/ecs#timestampUpdateSystem');
|
|
62
|
+
function getClick(inputAction, entity) {
|
|
63
|
+
if (inputAction !== 3 /* InputAction.IA_ANY */) {
|
|
64
|
+
return findClick(inputAction, entity);
|
|
65
|
+
}
|
|
66
|
+
for (const input of InputCommands) {
|
|
67
|
+
const cmd = findClick(input, entity);
|
|
68
|
+
if (cmd)
|
|
69
|
+
return cmd;
|
|
70
|
+
}
|
|
71
|
+
return null;
|
|
72
|
+
}
|
|
73
|
+
function findClick(inputAction, entity) {
|
|
74
|
+
const component = PointerEventsResult.getOrNull(engine.RootEntity);
|
|
75
|
+
if (!component)
|
|
76
|
+
return null;
|
|
77
|
+
const commands = component.commands;
|
|
78
|
+
// We search the last DOWN command sorted by timestamp
|
|
79
|
+
const down = findLastAction(commands, 1 /* PointerEventType.PET_DOWN */, inputAction, entity);
|
|
80
|
+
// We search the last UP command sorted by timestamp
|
|
81
|
+
if (!down)
|
|
82
|
+
return null;
|
|
83
|
+
const up = findLastAction(commands, 0 /* PointerEventType.PET_UP */, inputAction, entity);
|
|
84
|
+
if (!up)
|
|
85
|
+
return null;
|
|
86
|
+
const state = InternalInputStateComponent.get(engine.RootEntity);
|
|
87
|
+
// If the DOWN command has happen before the UP commands, it means that that a clicked has happen
|
|
88
|
+
if (down.timestamp < up.timestamp &&
|
|
89
|
+
up.timestamp > state.timestampLastUpdate) {
|
|
90
|
+
InternalInputStateComponent.getMutable(engine.RootEntity).currentTimestamp = Math.max(up.timestamp, state.currentTimestamp);
|
|
91
|
+
return { up, down };
|
|
92
|
+
}
|
|
93
|
+
return null;
|
|
94
|
+
}
|
|
95
|
+
function getInputCommand(inputAction, pointerEventType, entity) {
|
|
96
|
+
if (inputAction !== 3 /* InputAction.IA_ANY */) {
|
|
97
|
+
return findInputCommand(inputAction, pointerEventType, entity);
|
|
98
|
+
}
|
|
99
|
+
for (const input of InputCommands) {
|
|
100
|
+
const cmd = findInputCommand(input, pointerEventType, entity);
|
|
101
|
+
if (cmd)
|
|
102
|
+
return cmd;
|
|
103
|
+
}
|
|
104
|
+
return null;
|
|
105
|
+
}
|
|
106
|
+
function findInputCommand(inputAction, pointerEventType, entity) {
|
|
107
|
+
const component = PointerEventsResult.getOrNull(engine.RootEntity);
|
|
108
|
+
if (!component)
|
|
109
|
+
return null;
|
|
110
|
+
// We search the last pointer Event command sorted by timestamp
|
|
111
|
+
const command = findLastAction(component.commands, pointerEventType, inputAction, entity);
|
|
112
|
+
if (!command)
|
|
113
|
+
return null;
|
|
114
|
+
const state = InternalInputStateComponent.get(engine.RootEntity);
|
|
115
|
+
if (command.timestamp > state.timestampLastUpdate) {
|
|
116
|
+
InternalInputStateComponent.getMutable(engine.RootEntity).currentTimestamp = Math.max(command.timestamp, state.currentTimestamp);
|
|
117
|
+
return command;
|
|
118
|
+
}
|
|
119
|
+
else {
|
|
120
|
+
return null;
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
function isClicked(inputAction, entity) {
|
|
124
|
+
return getClick(inputAction, entity) !== null;
|
|
125
|
+
}
|
|
126
|
+
function isTriggered(inputAction, pointerEventType, entity) {
|
|
127
|
+
return getInputCommand(inputAction, pointerEventType, entity) !== null;
|
|
128
|
+
}
|
|
129
|
+
function isPressed(inputAction) {
|
|
130
|
+
return InternalInputStateComponent.get(engine.RootEntity).buttonState[inputAction].value;
|
|
131
|
+
}
|
|
132
|
+
return {
|
|
133
|
+
// @public
|
|
134
|
+
isPressed,
|
|
135
|
+
// @internal
|
|
136
|
+
getClick,
|
|
137
|
+
// @public
|
|
138
|
+
getInputCommand,
|
|
139
|
+
// @internal
|
|
140
|
+
isClicked,
|
|
141
|
+
// @public
|
|
142
|
+
isTriggered
|
|
143
|
+
};
|
|
144
|
+
}
|
|
145
|
+
function findLastAction(commands, pointerEventType, inputAction, entity) {
|
|
146
|
+
let commandToReturn = undefined;
|
|
147
|
+
for (const command of commands) {
|
|
148
|
+
if (command.button === inputAction &&
|
|
149
|
+
command.state === pointerEventType &&
|
|
150
|
+
(!entity || (command.hit && entity === command.hit.entityId))) {
|
|
151
|
+
if (!commandToReturn || command.timestamp >= commandToReturn.timestamp)
|
|
152
|
+
commandToReturn = command;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
return commandToReturn;
|
|
156
|
+
}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { ComponentDefinition } from './component';
|
|
2
|
+
/**
|
|
3
|
+
* @public
|
|
4
|
+
*/
|
|
5
|
+
export declare type DeepReadonlyMap<K, V> = ReadonlyMap<DeepReadonly<K>, DeepReadonly<V>>;
|
|
6
|
+
/**
|
|
7
|
+
* @public
|
|
8
|
+
*/
|
|
9
|
+
export declare type DeepReadonlySet<T> = ReadonlySet<DeepReadonly<T>>;
|
|
10
|
+
/**
|
|
11
|
+
* @public
|
|
12
|
+
*/
|
|
13
|
+
export declare type DeepReadonlyObject<T> = {
|
|
14
|
+
readonly [K in keyof T]: DeepReadonly<T[K]>;
|
|
15
|
+
};
|
|
16
|
+
/**
|
|
17
|
+
* @public
|
|
18
|
+
*/
|
|
19
|
+
export declare type ReadonlyPrimitive = number | string | number[] | string[] | boolean | boolean[];
|
|
20
|
+
/**
|
|
21
|
+
* @public
|
|
22
|
+
*/
|
|
23
|
+
export declare type ReadonlyComponentSchema<T extends [ComponentDefinition<any, any>, ...ComponentDefinition<any, any>[]]> = {
|
|
24
|
+
[K in keyof T]: T[K] extends ComponentDefinition<any, any> ? ReturnType<T[K]['get']> : never;
|
|
25
|
+
};
|
|
26
|
+
/**
|
|
27
|
+
* @public
|
|
28
|
+
*/
|
|
29
|
+
export declare type DeepReadonly<T> = T extends ReadonlyPrimitive ? T : T extends Map<infer K, infer V> ? DeepReadonlyMap<K, V> : T extends Set<infer M> ? DeepReadonlySet<M> : DeepReadonlyObject<T>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @public
|
|
3
|
+
*/
|
|
4
|
+
export declare type SystemFn = (dt: number) => void;
|
|
5
|
+
export declare const SYSTEMS_REGULAR_PRIORITY = 100000;
|
|
6
|
+
declare type System = {
|
|
7
|
+
fn: SystemFn;
|
|
8
|
+
priority: number;
|
|
9
|
+
name?: string;
|
|
10
|
+
};
|
|
11
|
+
export declare function SystemContainer(): {
|
|
12
|
+
add: (fn: SystemFn, priority: number, name?: string) => void;
|
|
13
|
+
remove: (selector: string | SystemFn) => boolean;
|
|
14
|
+
getSystems(): System[];
|
|
15
|
+
};
|
|
16
|
+
export {};
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
export const SYSTEMS_REGULAR_PRIORITY = 100e3;
|
|
2
|
+
export function SystemContainer() {
|
|
3
|
+
const systems = [];
|
|
4
|
+
function sort() {
|
|
5
|
+
// TODO: systems with the same priority should always have the same stable order
|
|
6
|
+
// add a "counter" to the System type to ensure that order
|
|
7
|
+
systems.sort((a, b) => b.priority - a.priority);
|
|
8
|
+
}
|
|
9
|
+
function add(fn, priority, name) {
|
|
10
|
+
const systemName = name ?? fn.name;
|
|
11
|
+
if (systems.find((item) => item.fn === fn)) {
|
|
12
|
+
throw new Error(`System ${JSON.stringify(systemName)} already added to the engine`);
|
|
13
|
+
}
|
|
14
|
+
systems.push({
|
|
15
|
+
fn,
|
|
16
|
+
priority,
|
|
17
|
+
name: systemName
|
|
18
|
+
});
|
|
19
|
+
// TODO: replace this sort by an insertion in the right place
|
|
20
|
+
sort();
|
|
21
|
+
}
|
|
22
|
+
function remove(selector) {
|
|
23
|
+
let index = -1;
|
|
24
|
+
if (typeof selector === 'string') {
|
|
25
|
+
index = systems.findIndex((item) => item.name === selector);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
index = systems.findIndex((item) => item.fn === selector);
|
|
29
|
+
}
|
|
30
|
+
if (index === -1) {
|
|
31
|
+
return false;
|
|
32
|
+
}
|
|
33
|
+
systems.splice(index, 1);
|
|
34
|
+
sort();
|
|
35
|
+
return true;
|
|
36
|
+
}
|
|
37
|
+
return {
|
|
38
|
+
add,
|
|
39
|
+
remove,
|
|
40
|
+
getSystems() {
|
|
41
|
+
return systems;
|
|
42
|
+
}
|
|
43
|
+
};
|
|
44
|
+
}
|
|
@@ -0,0 +1,148 @@
|
|
|
1
|
+
import type { ISchema } from '../schemas/ISchema';
|
|
2
|
+
import { Result, Spec } from '../schemas/Map';
|
|
3
|
+
import { Transport } from '../systems/crdt/types';
|
|
4
|
+
import { ComponentDefinition as CompDef } from './component';
|
|
5
|
+
import { Entity } from './entity';
|
|
6
|
+
import { SystemFn } from './systems';
|
|
7
|
+
import { ReadonlyComponentSchema } from './readonly';
|
|
8
|
+
export { ISchema } from '../schemas/ISchema';
|
|
9
|
+
/**
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export declare type Unpacked<T> = T extends (infer U)[] ? U : T;
|
|
13
|
+
/**
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export declare type ComponentSchema<T extends [CompDef<any>, ...CompDef<any>[]]> = {
|
|
17
|
+
[K in keyof T]: T[K] extends CompDef<any> ? ReturnType<T[K]['getMutable']> : never;
|
|
18
|
+
};
|
|
19
|
+
/**
|
|
20
|
+
* @public
|
|
21
|
+
*/
|
|
22
|
+
export declare type IEngine = {
|
|
23
|
+
/**
|
|
24
|
+
* Increment the used entity counter and return the next one.
|
|
25
|
+
* @param dynamic - whether or no the entity should be considered as Dynamic (vs Static)
|
|
26
|
+
* @returns the next entity unused
|
|
27
|
+
*/
|
|
28
|
+
addEntity(dynamic?: boolean): Entity;
|
|
29
|
+
/**
|
|
30
|
+
* An alias of engine.addEntity(true)
|
|
31
|
+
*/
|
|
32
|
+
addDynamicEntity(): Entity;
|
|
33
|
+
/**
|
|
34
|
+
* Remove all components of an entity
|
|
35
|
+
* @param entity - entity
|
|
36
|
+
*/
|
|
37
|
+
removeEntity(entity: Entity): void;
|
|
38
|
+
/**
|
|
39
|
+
* Remove all components of each entity in the tree made with Transform parenting
|
|
40
|
+
* @param firstEntity - the root entity of the tree
|
|
41
|
+
*/
|
|
42
|
+
removeEntityWithChildren(firstEntity: Entity): void;
|
|
43
|
+
/**
|
|
44
|
+
* Check if an entity exists in the engine
|
|
45
|
+
* @param entity - the entity to validate
|
|
46
|
+
* @returns true if the entity exists in the engine
|
|
47
|
+
*/
|
|
48
|
+
entityExists(entity: Entity): boolean;
|
|
49
|
+
/**
|
|
50
|
+
* Add the system to the engine. It will be called every tick updated.
|
|
51
|
+
* @param system - function that receives the delta time between last tick and current one.
|
|
52
|
+
* @param priority - a number with the priority, big number are called before smaller ones
|
|
53
|
+
* @param name - optional: a unique name to identify it
|
|
54
|
+
*
|
|
55
|
+
* Example:
|
|
56
|
+
* ```ts
|
|
57
|
+
* function mySystem(dt: number) {
|
|
58
|
+
* const entitiesWithMeshRenderer = engine.getEntitiesWith(MeshRenderer, Transform)
|
|
59
|
+
* for (const [entity, _meshRenderer, _transform] of engine.getEntitiesWith(MeshRenderer, Transform)) {
|
|
60
|
+
* // do stuffs
|
|
61
|
+
* }
|
|
62
|
+
* }
|
|
63
|
+
* engine.addSystem(mySystem, 10)
|
|
64
|
+
* ```
|
|
65
|
+
*/
|
|
66
|
+
addSystem(system: SystemFn, priority?: number, name?: string): void;
|
|
67
|
+
/**
|
|
68
|
+
* Remove a system from the engine.
|
|
69
|
+
* @param selector - the function or the unique name to identify
|
|
70
|
+
* @returns if it was found and removed
|
|
71
|
+
*/
|
|
72
|
+
removeSystem(selector: string | SystemFn): boolean;
|
|
73
|
+
/**
|
|
74
|
+
* Define a component and add it to the engine.
|
|
75
|
+
* @param spec - An object with schema fields
|
|
76
|
+
* @param componentId - unique id to identify the component, if the component id already exist, it will fail.
|
|
77
|
+
* @param constructorDefault - the initial value prefilled when a component is created without a value
|
|
78
|
+
* @returns The component definition
|
|
79
|
+
*
|
|
80
|
+
* ```ts
|
|
81
|
+
* const DoorComponentId = 10017
|
|
82
|
+
* const Door = engine.defineComponent({
|
|
83
|
+
* id: Schemas.Int,
|
|
84
|
+
* name: Schemas.String
|
|
85
|
+
* }, DoorComponentId)
|
|
86
|
+
*
|
|
87
|
+
* ```
|
|
88
|
+
*/
|
|
89
|
+
defineComponent<T extends Spec, ConstructorType = Partial<Result<T>>>(spec: T, componentId: number, constructorDefault?: ConstructorType): CompDef<ISchema<Result<T>>, Partial<Result<T>>>;
|
|
90
|
+
/**
|
|
91
|
+
* Define a component and add it to the engine.
|
|
92
|
+
* @param spec - An object with schema fields
|
|
93
|
+
* @param componentId - unique id to identify the component, if the component id already exist, it will fail.
|
|
94
|
+
* @returns The component definition
|
|
95
|
+
*
|
|
96
|
+
* ```ts
|
|
97
|
+
* const StateComponentId = 10023
|
|
98
|
+
* const StateComponent = engine.defineComponent(Schemas.Bool, VisibleComponentId)
|
|
99
|
+
* ```
|
|
100
|
+
*/
|
|
101
|
+
defineComponentFromSchema<T extends ISchema<ConstructorType>, ConstructorType>(spec: T, componentId: number, constructorDefault?: ConstructorType): CompDef<T, ConstructorType>;
|
|
102
|
+
/**
|
|
103
|
+
* Get the component definition from the component id.
|
|
104
|
+
* @param componentId - component number used to identify the component descriptor
|
|
105
|
+
* @returns the component definition, throw an error if it doesn't exist
|
|
106
|
+
* ```ts
|
|
107
|
+
* const StateComponentId = 10023
|
|
108
|
+
* const StateComponent = engine.getComponent(StateComponentId)
|
|
109
|
+
* ```
|
|
110
|
+
*/
|
|
111
|
+
getComponent<T extends ISchema>(componentId: number): CompDef<T>;
|
|
112
|
+
/**
|
|
113
|
+
* Get a iterator of entities that has all the component requested.
|
|
114
|
+
* @param components - a list of component definitions
|
|
115
|
+
* @returns An iterator of an array with the [entity, component1, component2, ...]
|
|
116
|
+
*
|
|
117
|
+
* Example:
|
|
118
|
+
* ```ts
|
|
119
|
+
* for (const [entity, meshRenderer, transform] of engine.getEntitiesWith(MeshRenderer, Transform)) {
|
|
120
|
+
* // the properties of meshRenderer and transform are read only
|
|
121
|
+
* }
|
|
122
|
+
* ```
|
|
123
|
+
*/
|
|
124
|
+
getEntitiesWith<T extends [CompDef<any>, ...CompDef<any>[]]>(...components: T): Iterable<[Entity, ...ReadonlyComponentSchema<T>]>;
|
|
125
|
+
/**
|
|
126
|
+
* @param deltaTime - deltaTime in seconds
|
|
127
|
+
*/
|
|
128
|
+
update(deltaTime: number): void;
|
|
129
|
+
/**
|
|
130
|
+
* @public
|
|
131
|
+
* Refer to the root of the scene, all Transforms without a parent are parenting with RootEntity.
|
|
132
|
+
*/
|
|
133
|
+
readonly RootEntity: Entity;
|
|
134
|
+
/**
|
|
135
|
+
* @public
|
|
136
|
+
* The current player entity
|
|
137
|
+
*/
|
|
138
|
+
readonly PlayerEntity: Entity;
|
|
139
|
+
/**
|
|
140
|
+
* @public
|
|
141
|
+
* Camera entity of current player.
|
|
142
|
+
*/
|
|
143
|
+
readonly CameraEntity: Entity;
|
|
144
|
+
/**
|
|
145
|
+
* @param transport - transport which changes its onmessage to process CRDT messages
|
|
146
|
+
*/
|
|
147
|
+
addTransport(transport: Transport): void;
|
|
148
|
+
};
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|