@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,6 @@
|
|
|
1
|
+
export type { Position as PBPosition, Vector2 as PBVector2, Vector3 as PBVector3 } from './pb/decentraland/common/vectors.gen';
|
|
2
|
+
export type { Color3 as PBColor3, Color4 as PBColor4 } from './pb/decentraland/common/colors.gen';
|
|
3
|
+
export * from './pb/decentraland/sdk/components/common/camera_type.gen';
|
|
4
|
+
export * from './pb/decentraland/sdk/components/common/input_action.gen';
|
|
5
|
+
export * from './pb/decentraland/sdk/components/common/texts.gen';
|
|
6
|
+
export * from './pb/decentraland/common/texture.gen';
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
export * from './pb/decentraland/sdk/components/common/camera_type.gen';
|
|
2
|
+
// export { PbCameraType }
|
|
3
|
+
export * from './pb/decentraland/sdk/components/common/input_action.gen';
|
|
4
|
+
// export { PbInputAction }
|
|
5
|
+
export * from './pb/decentraland/sdk/components/common/texts.gen';
|
|
6
|
+
// export { PbTexts }
|
|
7
|
+
export * from './pb/decentraland/common/texture.gen';
|
|
8
|
+
// export { PbTexture }
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
import { ISchema } from '../engine';
|
|
2
|
+
import { ComponentGetter } from './generated/index.gen';
|
|
3
|
+
export * from './generated/index.gen';
|
|
4
|
+
import { TransformComponent } from './legacy/Transform';
|
|
5
|
+
import { AnimatorComponentDefinitionExtended } from './extended/Animator';
|
|
6
|
+
import { MeshColliderComponentDefinitionExtended } from './extended/MeshCollider';
|
|
7
|
+
import { MeshRendererComponentDefinitionExtended } from './extended/MeshRenderer';
|
|
8
|
+
import { MaterialComponentDefinitionExtended } from './extended/Material';
|
|
9
|
+
import { ComponentDefinition } from '../engine/component';
|
|
10
|
+
export { ISchema, ComponentDefinition };
|
|
11
|
+
export declare const Transform: ComponentGetter<TransformComponent>;
|
|
12
|
+
export declare const Material: ComponentGetter<MaterialComponentDefinitionExtended>;
|
|
13
|
+
export declare const Animator: ComponentGetter<AnimatorComponentDefinitionExtended>;
|
|
14
|
+
export declare const MeshRenderer: ComponentGetter<MeshRendererComponentDefinitionExtended>;
|
|
15
|
+
export declare const MeshCollider: ComponentGetter<MeshColliderComponentDefinitionExtended>;
|
|
@@ -0,0 +1,16 @@
|
|
|
1
|
+
export * from './generated/index.gen';
|
|
2
|
+
import { defineTransformComponent } from './legacy/Transform';
|
|
3
|
+
import { defineAnimatorComponent } from './extended/Animator';
|
|
4
|
+
import { defineMeshColliderComponent } from './extended/MeshCollider';
|
|
5
|
+
import { defineMeshRendererComponent } from './extended/MeshRenderer';
|
|
6
|
+
import { defineMaterialComponent } from './extended/Material';
|
|
7
|
+
/*#__PURE__*/
|
|
8
|
+
export const Transform = (engine) => defineTransformComponent(engine);
|
|
9
|
+
/*#__PURE__*/
|
|
10
|
+
export const Material = (engine) => defineMaterialComponent(engine);
|
|
11
|
+
/*#__PURE__*/
|
|
12
|
+
export const Animator = (engine) => defineAnimatorComponent(engine);
|
|
13
|
+
/*#__PURE__*/
|
|
14
|
+
export const MeshRenderer = (engine) => defineMeshRendererComponent(engine);
|
|
15
|
+
/*#__PURE__*/
|
|
16
|
+
export const MeshCollider = (engine) => defineMeshColliderComponent(engine);
|
|
@@ -0,0 +1,27 @@
|
|
|
1
|
+
import type { ISchema } from '../../schemas/ISchema';
|
|
2
|
+
import { Entity } from '../../engine/entity';
|
|
3
|
+
import { ComponentDefinition, IEngine } from '../../engine';
|
|
4
|
+
export declare type TransformComponent = ComponentDefinition<ISchema<TransformType>, Partial<TransformType>>;
|
|
5
|
+
/**
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export declare type TransformType = {
|
|
9
|
+
position: {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
z: number;
|
|
13
|
+
};
|
|
14
|
+
rotation: {
|
|
15
|
+
x: number;
|
|
16
|
+
y: number;
|
|
17
|
+
z: number;
|
|
18
|
+
w: number;
|
|
19
|
+
};
|
|
20
|
+
scale: {
|
|
21
|
+
x: number;
|
|
22
|
+
y: number;
|
|
23
|
+
z: number;
|
|
24
|
+
};
|
|
25
|
+
parent?: Entity;
|
|
26
|
+
};
|
|
27
|
+
export declare function defineTransformComponent(engine: Pick<IEngine, 'defineComponentFromSchema'>): ComponentDefinition<ISchema<TransformType>, Partial<TransformType>>;
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @internal
|
|
3
|
+
*/
|
|
4
|
+
export const COMPONENT_ID = 1;
|
|
5
|
+
/** @internal */
|
|
6
|
+
export const TRANSFORM_LENGTH = 44;
|
|
7
|
+
/** @internal */
|
|
8
|
+
export const TransformSchema = {
|
|
9
|
+
serialize(value, builder) {
|
|
10
|
+
const ptr = builder.incrementWriteOffset(TRANSFORM_LENGTH);
|
|
11
|
+
builder.setFloat32(ptr, value.position.x);
|
|
12
|
+
builder.setFloat32(ptr + 4, value.position.y);
|
|
13
|
+
builder.setFloat32(ptr + 8, value.position.z);
|
|
14
|
+
builder.setFloat32(ptr + 12, value.rotation.x);
|
|
15
|
+
builder.setFloat32(ptr + 16, value.rotation.y);
|
|
16
|
+
builder.setFloat32(ptr + 20, value.rotation.z);
|
|
17
|
+
builder.setFloat32(ptr + 24, value.rotation.w);
|
|
18
|
+
builder.setFloat32(ptr + 28, value.scale.x);
|
|
19
|
+
builder.setFloat32(ptr + 32, value.scale.y);
|
|
20
|
+
builder.setFloat32(ptr + 36, value.scale.z);
|
|
21
|
+
builder.setUint32(ptr + 40, value.parent || 0);
|
|
22
|
+
},
|
|
23
|
+
deserialize(reader) {
|
|
24
|
+
const ptr = reader.incrementReadOffset(TRANSFORM_LENGTH);
|
|
25
|
+
return {
|
|
26
|
+
position: {
|
|
27
|
+
x: reader.getFloat32(ptr),
|
|
28
|
+
y: reader.getFloat32(ptr + 4),
|
|
29
|
+
z: reader.getFloat32(ptr + 8)
|
|
30
|
+
},
|
|
31
|
+
rotation: {
|
|
32
|
+
x: reader.getFloat32(ptr + 12),
|
|
33
|
+
y: reader.getFloat32(ptr + 16),
|
|
34
|
+
z: reader.getFloat32(ptr + 20),
|
|
35
|
+
w: reader.getFloat32(ptr + 24)
|
|
36
|
+
},
|
|
37
|
+
scale: {
|
|
38
|
+
x: reader.getFloat32(ptr + 28),
|
|
39
|
+
y: reader.getFloat32(ptr + 32),
|
|
40
|
+
z: reader.getFloat32(ptr + 36)
|
|
41
|
+
},
|
|
42
|
+
parent: reader.getUint32(ptr + 40)
|
|
43
|
+
};
|
|
44
|
+
},
|
|
45
|
+
create() {
|
|
46
|
+
return {
|
|
47
|
+
position: { x: 0, y: 0, z: 0 },
|
|
48
|
+
scale: { x: 1, y: 1, z: 1 },
|
|
49
|
+
rotation: { x: 0, y: 0, z: 0, w: 1 }
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
export function defineTransformComponent(engine) {
|
|
54
|
+
return engine.defineComponentFromSchema(TransformSchema, COMPONENT_ID);
|
|
55
|
+
}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
export type { AnimatorComponentDefinition, AnimatorComponentDefinitionExtended } from './extended/Animator';
|
|
2
|
+
export type { MeshRendererComponentDefinition, MeshRendererComponentDefinitionExtended } from './extended/MeshRenderer';
|
|
3
|
+
export type { MeshColliderComponentDefinition, MeshColliderComponentDefinitionExtended } from './extended/MeshCollider';
|
|
4
|
+
export type { TextureHelper, MaterialComponentDefinition, MaterialComponentDefinitionExtended } from './extended/Material';
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export {};
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
import type { ISchema } from '../schemas/ISchema';
|
|
2
|
+
import { ByteBuffer } from '../serialization/ByteBuffer';
|
|
3
|
+
import { Entity } from './entity';
|
|
4
|
+
import { DeepReadonly } from './readonly';
|
|
5
|
+
/**
|
|
6
|
+
* @public
|
|
7
|
+
*/
|
|
8
|
+
export declare type EcsResult<T extends ISchema> = T extends ISchema ? ReturnType<T['deserialize']> : never;
|
|
9
|
+
/**
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export declare type ComponentType<T extends ISchema> = EcsResult<T>;
|
|
13
|
+
/**
|
|
14
|
+
* @public
|
|
15
|
+
*/
|
|
16
|
+
export declare type ComponentDefinition<T extends ISchema<ConstructorType>, ConstructorType = any> = {
|
|
17
|
+
_id: number;
|
|
18
|
+
/**
|
|
19
|
+
* Return the default value of the current component
|
|
20
|
+
*/
|
|
21
|
+
default(): DeepReadonly<ComponentType<T>>;
|
|
22
|
+
/**
|
|
23
|
+
* Get if the entity has this component
|
|
24
|
+
* @param entity - entity to test
|
|
25
|
+
*/
|
|
26
|
+
has(entity: Entity): boolean;
|
|
27
|
+
/**
|
|
28
|
+
* Get the readonly component of the entity (to mutate it, use getMutable instead), throw an error if the entity doesn't have the component.
|
|
29
|
+
* @param entity - Entity that will be used to get the component
|
|
30
|
+
* @returns
|
|
31
|
+
*/
|
|
32
|
+
get(entity: Entity): DeepReadonly<ComponentType<T>>;
|
|
33
|
+
/**
|
|
34
|
+
* Get the readonly component of the entity (to mutate it, use getMutable instead), or null if the entity doesn't have the component.
|
|
35
|
+
* @param entity - Entity that will be used to try to get the component
|
|
36
|
+
*/
|
|
37
|
+
getOrNull(entity: Entity): DeepReadonly<ComponentType<T>> | null;
|
|
38
|
+
/**
|
|
39
|
+
* Add the current component to an entity, throw an error if the component already exists (use `createOrReplace` instead).
|
|
40
|
+
* - Internal comment: This method adds the <entity,component> to the list to be reviewed next frame
|
|
41
|
+
* @param entity - Entity that will be used to create the component
|
|
42
|
+
* @param val - The initial value
|
|
43
|
+
*/
|
|
44
|
+
create(entity: Entity, val?: ConstructorType): ComponentType<T>;
|
|
45
|
+
/**
|
|
46
|
+
* Add the current component to an entity or replace the content if the entity already has the component
|
|
47
|
+
* - Internal comment: This method adds the <entity,component> to the list to be reviewed next frame
|
|
48
|
+
* @param entity - Entity that will be used to create or replace the component
|
|
49
|
+
* @param val - The initial or new value
|
|
50
|
+
*/
|
|
51
|
+
createOrReplace(entity: Entity, val?: ConstructorType): ComponentType<T>;
|
|
52
|
+
/**
|
|
53
|
+
* Delete the current component to an entity, return null if the entity doesn't have the current component.
|
|
54
|
+
* - Internal comment: This method adds the <entity,component> to the list to be reviewed next frame
|
|
55
|
+
* @param entity - Entity to delete the component from
|
|
56
|
+
*/
|
|
57
|
+
deleteFrom(entity: Entity): ComponentType<T> | null;
|
|
58
|
+
/**
|
|
59
|
+
* Get the mutable component of the entity, throw an error if the entity doesn't have the component.
|
|
60
|
+
* - Internal comment: This method adds the <entity,component> to the list to be reviewed next frame
|
|
61
|
+
* @param entity - Entity to get the component from
|
|
62
|
+
*/
|
|
63
|
+
getMutable(entity: Entity): ComponentType<T>;
|
|
64
|
+
/**
|
|
65
|
+
* Get the mutable component of the entity, return null if the entity doesn't have the component.
|
|
66
|
+
* - Internal comment: This method adds the <entity,component> to the list to be reviewed next frame
|
|
67
|
+
* @param entity - Entity to get the component from
|
|
68
|
+
*/
|
|
69
|
+
getMutableOrNull(entity: Entity): ComponentType<T> | null;
|
|
70
|
+
writeToByteBuffer(entity: Entity, buffer: ByteBuffer): void;
|
|
71
|
+
};
|
|
72
|
+
export declare function defineComponent<T extends ISchema, ConstructorType = ComponentType<T>>(componentId: number, spec: T, constructorDefault?: ConstructorType): ComponentDefinition<T, ConstructorType>;
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
import { createByteBuffer } from '../serialization/ByteBuffer';
|
|
2
|
+
import { deepReadonly } from './readonly';
|
|
3
|
+
export function defineComponent(componentId, spec, constructorDefault
|
|
4
|
+
// meta: { syncFlags }
|
|
5
|
+
) {
|
|
6
|
+
const data = new Map();
|
|
7
|
+
const dirtyIterator = new Set();
|
|
8
|
+
const defaultBuffer = createByteBuffer();
|
|
9
|
+
if (constructorDefault) {
|
|
10
|
+
spec.serialize(constructorDefault, defaultBuffer);
|
|
11
|
+
}
|
|
12
|
+
function getDefaultValue() {
|
|
13
|
+
if (constructorDefault) {
|
|
14
|
+
return spec.deserialize(createByteBuffer({
|
|
15
|
+
writing: {
|
|
16
|
+
buffer: defaultBuffer.buffer(),
|
|
17
|
+
currentOffset: defaultBuffer.currentWriteOffset()
|
|
18
|
+
}
|
|
19
|
+
}));
|
|
20
|
+
}
|
|
21
|
+
else {
|
|
22
|
+
return spec.create();
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
function prefillValue(value) {
|
|
26
|
+
return { ...getDefaultValue(), ...value };
|
|
27
|
+
}
|
|
28
|
+
return {
|
|
29
|
+
_id: componentId,
|
|
30
|
+
default() {
|
|
31
|
+
return getDefaultValue();
|
|
32
|
+
},
|
|
33
|
+
isDirty(entity) {
|
|
34
|
+
return dirtyIterator.has(entity);
|
|
35
|
+
},
|
|
36
|
+
has(entity) {
|
|
37
|
+
return data.has(entity);
|
|
38
|
+
},
|
|
39
|
+
deleteFrom(entity) {
|
|
40
|
+
const component = data.get(entity);
|
|
41
|
+
data.delete(entity);
|
|
42
|
+
dirtyIterator.add(entity);
|
|
43
|
+
return component || null;
|
|
44
|
+
},
|
|
45
|
+
getOrNull(entity) {
|
|
46
|
+
const component = data.get(entity);
|
|
47
|
+
return component ? deepReadonly(component) : null;
|
|
48
|
+
},
|
|
49
|
+
get(entity) {
|
|
50
|
+
const component = data.get(entity);
|
|
51
|
+
if (!component) {
|
|
52
|
+
throw new Error(`[getFrom] Component ${componentId} for entity #${entity} not found`);
|
|
53
|
+
}
|
|
54
|
+
return deepReadonly(component);
|
|
55
|
+
},
|
|
56
|
+
create(entity, value) {
|
|
57
|
+
const component = data.get(entity);
|
|
58
|
+
if (component) {
|
|
59
|
+
throw new Error(`[create] Component ${componentId} for ${entity} already exists`);
|
|
60
|
+
}
|
|
61
|
+
const usedValue = value === undefined ? getDefaultValue() : prefillValue(value);
|
|
62
|
+
data.set(entity, usedValue);
|
|
63
|
+
dirtyIterator.add(entity);
|
|
64
|
+
return usedValue;
|
|
65
|
+
},
|
|
66
|
+
createOrReplace(entity, value) {
|
|
67
|
+
const usedValue = value === undefined ? getDefaultValue() : prefillValue(value);
|
|
68
|
+
data.set(entity, usedValue);
|
|
69
|
+
dirtyIterator.add(entity);
|
|
70
|
+
return usedValue;
|
|
71
|
+
},
|
|
72
|
+
getMutableOrNull(entity) {
|
|
73
|
+
const component = data.get(entity);
|
|
74
|
+
if (!component) {
|
|
75
|
+
return null;
|
|
76
|
+
}
|
|
77
|
+
dirtyIterator.add(entity);
|
|
78
|
+
return component;
|
|
79
|
+
},
|
|
80
|
+
getMutable(entity) {
|
|
81
|
+
const component = this.getMutableOrNull(entity);
|
|
82
|
+
if (component === null) {
|
|
83
|
+
throw new Error(`[mutable] Component ${componentId} for ${entity} not found`);
|
|
84
|
+
}
|
|
85
|
+
return component;
|
|
86
|
+
},
|
|
87
|
+
*iterator() {
|
|
88
|
+
for (const [entity, component] of data) {
|
|
89
|
+
yield [entity, component];
|
|
90
|
+
}
|
|
91
|
+
},
|
|
92
|
+
*dirtyIterator() {
|
|
93
|
+
for (const entity of dirtyIterator) {
|
|
94
|
+
yield entity;
|
|
95
|
+
}
|
|
96
|
+
},
|
|
97
|
+
toBinary(entity) {
|
|
98
|
+
const component = data.get(entity);
|
|
99
|
+
if (!component) {
|
|
100
|
+
throw new Error(`[toBinary] Component ${componentId} for ${entity} not found`);
|
|
101
|
+
}
|
|
102
|
+
const writeBuffer = createByteBuffer();
|
|
103
|
+
spec.serialize(component, writeBuffer);
|
|
104
|
+
return writeBuffer;
|
|
105
|
+
},
|
|
106
|
+
writeToByteBuffer(entity, buffer) {
|
|
107
|
+
const component = data.get(entity);
|
|
108
|
+
if (!component) {
|
|
109
|
+
throw new Error(`[writeToByteBuffer] Component ${componentId} for entity #${entity} not found`);
|
|
110
|
+
}
|
|
111
|
+
spec.serialize(component, buffer);
|
|
112
|
+
},
|
|
113
|
+
updateFromBinary(entity, buffer) {
|
|
114
|
+
const component = data.get(entity);
|
|
115
|
+
if (!component) {
|
|
116
|
+
throw new Error(`[updateFromBinary] Component ${componentId} for ${entity} not found`);
|
|
117
|
+
}
|
|
118
|
+
return this.upsertFromBinary(entity, buffer);
|
|
119
|
+
},
|
|
120
|
+
upsertFromBinary(entity, buffer) {
|
|
121
|
+
const newValue = spec.deserialize(buffer);
|
|
122
|
+
data.set(entity, newValue);
|
|
123
|
+
dirtyIterator.add(entity);
|
|
124
|
+
return newValue;
|
|
125
|
+
},
|
|
126
|
+
clearDirty() {
|
|
127
|
+
dirtyIterator.clear();
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import { Entity } from './entity';
|
|
2
|
+
export declare namespace EntityUtils {
|
|
3
|
+
/**
|
|
4
|
+
* Range is the first element and the last possible element, they both are included in the interval.
|
|
5
|
+
* [start, end]
|
|
6
|
+
*/
|
|
7
|
+
type EntityRange = readonly [number, number];
|
|
8
|
+
const MAX_ENTITIES = 4294967295;
|
|
9
|
+
const DYNAMIC_ENTITIES_START_AT = 100000;
|
|
10
|
+
const RESERVED_STATIC_ENTITIES = 512;
|
|
11
|
+
const RESERVED_ENTITIES_RANGE: EntityRange;
|
|
12
|
+
const STATIC_ENTITIES_RANGE: EntityRange;
|
|
13
|
+
const DYNAMIC_ENTITIES_RANGE: EntityRange;
|
|
14
|
+
function isDynamicEntity(entity: Entity): boolean;
|
|
15
|
+
function isStaticEntity(entity: Entity): boolean;
|
|
16
|
+
function isReservedEntity(entity: Entity): boolean;
|
|
17
|
+
}
|
|
18
|
+
export default EntityUtils;
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
export var EntityUtils;
|
|
2
|
+
(function (EntityUtils) {
|
|
3
|
+
EntityUtils.MAX_ENTITIES = 0xffffffff;
|
|
4
|
+
EntityUtils.DYNAMIC_ENTITIES_START_AT = 100e3;
|
|
5
|
+
EntityUtils.RESERVED_STATIC_ENTITIES = 512;
|
|
6
|
+
EntityUtils.RESERVED_ENTITIES_RANGE = [
|
|
7
|
+
0,
|
|
8
|
+
EntityUtils.RESERVED_STATIC_ENTITIES - 1
|
|
9
|
+
];
|
|
10
|
+
EntityUtils.STATIC_ENTITIES_RANGE = [
|
|
11
|
+
EntityUtils.RESERVED_STATIC_ENTITIES,
|
|
12
|
+
EntityUtils.DYNAMIC_ENTITIES_START_AT - 1
|
|
13
|
+
];
|
|
14
|
+
EntityUtils.DYNAMIC_ENTITIES_RANGE = [
|
|
15
|
+
EntityUtils.DYNAMIC_ENTITIES_START_AT,
|
|
16
|
+
EntityUtils.MAX_ENTITIES
|
|
17
|
+
];
|
|
18
|
+
function isInRange(entity, range) {
|
|
19
|
+
return entity >= range[0] && entity <= range[1];
|
|
20
|
+
}
|
|
21
|
+
function isDynamicEntity(entity) {
|
|
22
|
+
return isInRange(entity, EntityUtils.DYNAMIC_ENTITIES_RANGE);
|
|
23
|
+
}
|
|
24
|
+
EntityUtils.isDynamicEntity = isDynamicEntity;
|
|
25
|
+
function isStaticEntity(entity) {
|
|
26
|
+
return isInRange(entity, EntityUtils.STATIC_ENTITIES_RANGE);
|
|
27
|
+
}
|
|
28
|
+
EntityUtils.isStaticEntity = isStaticEntity;
|
|
29
|
+
function isReservedEntity(entity) {
|
|
30
|
+
return isInRange(entity, EntityUtils.RESERVED_ENTITIES_RANGE);
|
|
31
|
+
}
|
|
32
|
+
EntityUtils.isReservedEntity = isReservedEntity;
|
|
33
|
+
})(EntityUtils || (EntityUtils = {}));
|
|
34
|
+
export default EntityUtils;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import { EntityUtils } from './entity-utils';
|
|
2
|
+
/**
|
|
3
|
+
* @public
|
|
4
|
+
*/
|
|
5
|
+
export declare type Entity = unknown;
|
|
6
|
+
export declare function EntityContainer(): {
|
|
7
|
+
generateEntity(dynamic?: boolean): Entity;
|
|
8
|
+
removeEntity(entity: Entity): boolean;
|
|
9
|
+
entityExists(entity: Entity): boolean;
|
|
10
|
+
getExistingEntities(): Set<Entity>;
|
|
11
|
+
};
|
|
12
|
+
declare function Entity(range: EntityUtils.EntityRange): {
|
|
13
|
+
getExistingEntities(): Set<unknown>;
|
|
14
|
+
generateEntity: () => Entity;
|
|
15
|
+
removeEntity: (entity: Entity) => boolean;
|
|
16
|
+
};
|
|
17
|
+
export {};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { EntityUtils } from './entity-utils';
|
|
2
|
+
export function EntityContainer() {
|
|
3
|
+
const staticEntity = Entity(EntityUtils.STATIC_ENTITIES_RANGE);
|
|
4
|
+
const dynamicEntity = Entity(EntityUtils.DYNAMIC_ENTITIES_RANGE);
|
|
5
|
+
return {
|
|
6
|
+
generateEntity(dynamic = false) {
|
|
7
|
+
if (dynamic) {
|
|
8
|
+
return dynamicEntity.generateEntity();
|
|
9
|
+
}
|
|
10
|
+
else {
|
|
11
|
+
return staticEntity.generateEntity();
|
|
12
|
+
}
|
|
13
|
+
},
|
|
14
|
+
removeEntity(entity) {
|
|
15
|
+
return (staticEntity.removeEntity(entity) || dynamicEntity.removeEntity(entity));
|
|
16
|
+
},
|
|
17
|
+
entityExists(entity) {
|
|
18
|
+
return (EntityUtils.isReservedEntity(entity) ||
|
|
19
|
+
staticEntity.getExistingEntities().has(entity) ||
|
|
20
|
+
dynamicEntity.getExistingEntities().has(entity));
|
|
21
|
+
},
|
|
22
|
+
getExistingEntities() {
|
|
23
|
+
return new Set([
|
|
24
|
+
...staticEntity.getExistingEntities(),
|
|
25
|
+
...dynamicEntity.getExistingEntities()
|
|
26
|
+
]);
|
|
27
|
+
}
|
|
28
|
+
};
|
|
29
|
+
}
|
|
30
|
+
function Entity(range) {
|
|
31
|
+
function createEntity(entity) {
|
|
32
|
+
return entity;
|
|
33
|
+
}
|
|
34
|
+
let entityCounter = range[0];
|
|
35
|
+
const usedEntities = new Set();
|
|
36
|
+
function generateEntity() {
|
|
37
|
+
if (entityCounter >= range[1]) {
|
|
38
|
+
throw new Error(`It fails trying to generate an entity out of range [${range[0]}, ${range[1]}].`);
|
|
39
|
+
}
|
|
40
|
+
const entity = createEntity(entityCounter);
|
|
41
|
+
entityCounter++;
|
|
42
|
+
usedEntities.add(entity);
|
|
43
|
+
return entity;
|
|
44
|
+
}
|
|
45
|
+
function removeEntity(entity) {
|
|
46
|
+
return usedEntities.delete(entity);
|
|
47
|
+
}
|
|
48
|
+
return {
|
|
49
|
+
getExistingEntities() {
|
|
50
|
+
return new Set(usedEntities);
|
|
51
|
+
},
|
|
52
|
+
generateEntity,
|
|
53
|
+
removeEntity
|
|
54
|
+
};
|
|
55
|
+
}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { ByteBuffer } from '../serialization/ByteBuffer';
|
|
2
|
+
import { ComponentDefinition, ComponentType } from './component';
|
|
3
|
+
import { Entity } from './entity';
|
|
4
|
+
import type { IEngine } from './types';
|
|
5
|
+
export * from './input';
|
|
6
|
+
export * from './readonly';
|
|
7
|
+
export * from './types';
|
|
8
|
+
export { ComponentType, Entity, ByteBuffer, ComponentDefinition };
|
|
9
|
+
/**
|
|
10
|
+
* @public
|
|
11
|
+
*/
|
|
12
|
+
export declare function Engine(): IEngine;
|
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
import * as components from '../components';
|
|
2
|
+
import { Schemas } from '../schemas';
|
|
3
|
+
import { crdtSceneSystem } from '../systems/crdt';
|
|
4
|
+
import { defineComponent as defComponent } from './component';
|
|
5
|
+
import { EntityContainer } from './entity';
|
|
6
|
+
import { SystemContainer, SYSTEMS_REGULAR_PRIORITY } from './systems';
|
|
7
|
+
export * from './input';
|
|
8
|
+
export * from './readonly';
|
|
9
|
+
export * from './types';
|
|
10
|
+
function preEngine() {
|
|
11
|
+
const entityContainer = EntityContainer();
|
|
12
|
+
const componentsDefinition = new Map();
|
|
13
|
+
const systems = SystemContainer();
|
|
14
|
+
function addSystem(fn, priority = SYSTEMS_REGULAR_PRIORITY, name) {
|
|
15
|
+
systems.add(fn, priority, name);
|
|
16
|
+
}
|
|
17
|
+
function removeSystem(selector) {
|
|
18
|
+
return systems.remove(selector);
|
|
19
|
+
}
|
|
20
|
+
function addEntity(dynamic = false) {
|
|
21
|
+
// entitiesCompnonent.set(entity, new Set())
|
|
22
|
+
const entity = entityContainer.generateEntity(dynamic);
|
|
23
|
+
return entity;
|
|
24
|
+
}
|
|
25
|
+
function entityExists(entity) {
|
|
26
|
+
return entityContainer.entityExists(entity);
|
|
27
|
+
}
|
|
28
|
+
function addDynamicEntity() {
|
|
29
|
+
return addEntity(true);
|
|
30
|
+
}
|
|
31
|
+
function removeEntity(entity) {
|
|
32
|
+
for (const [, component] of componentsDefinition) {
|
|
33
|
+
if (component.has(entity)) {
|
|
34
|
+
component.deleteFrom(entity);
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
return entityContainer.removeEntity(entity);
|
|
38
|
+
}
|
|
39
|
+
function defineComponentFromSchema(spec, componentId, constructorDefault) {
|
|
40
|
+
const prev = componentsDefinition.get(componentId);
|
|
41
|
+
if (prev) {
|
|
42
|
+
// TODO: assert spec === prev.spec
|
|
43
|
+
return prev;
|
|
44
|
+
}
|
|
45
|
+
const newComponent = defComponent(componentId, spec, constructorDefault);
|
|
46
|
+
componentsDefinition.set(componentId, newComponent);
|
|
47
|
+
return newComponent;
|
|
48
|
+
}
|
|
49
|
+
function defineComponent(spec, componentId, constructorDefault) {
|
|
50
|
+
return defineComponentFromSchema(Schemas.Map(spec), componentId, constructorDefault);
|
|
51
|
+
}
|
|
52
|
+
function getComponent(componentId) {
|
|
53
|
+
const component = componentsDefinition.get(componentId);
|
|
54
|
+
if (!component) {
|
|
55
|
+
throw new Error(`Component ${componentId} not found. You need to declare the components at the beginnig of the engine declaration`);
|
|
56
|
+
}
|
|
57
|
+
return component;
|
|
58
|
+
}
|
|
59
|
+
function* getEntitiesWith(...components) {
|
|
60
|
+
for (const [entity, ...groupComp] of getComponentDefGroup(...components)) {
|
|
61
|
+
yield [entity, ...groupComp.map((c) => c.get(entity))];
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
function* getComponentDefGroup(...args) {
|
|
65
|
+
const [firstComponentDef, ...componentDefinitions] = args;
|
|
66
|
+
for (const [entity] of firstComponentDef.iterator()) {
|
|
67
|
+
let matches = true;
|
|
68
|
+
for (const componentDef of componentDefinitions) {
|
|
69
|
+
if (!componentDef.has(entity)) {
|
|
70
|
+
matches = false;
|
|
71
|
+
break;
|
|
72
|
+
}
|
|
73
|
+
}
|
|
74
|
+
if (matches) {
|
|
75
|
+
yield [entity, ...args];
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
}
|
|
79
|
+
function getSystems() {
|
|
80
|
+
return systems.getSystems();
|
|
81
|
+
}
|
|
82
|
+
function removeComponentDefinition(componentId) {
|
|
83
|
+
componentsDefinition.delete(componentId);
|
|
84
|
+
}
|
|
85
|
+
return {
|
|
86
|
+
entityExists,
|
|
87
|
+
componentsDefinition,
|
|
88
|
+
addEntity,
|
|
89
|
+
addDynamicEntity,
|
|
90
|
+
removeEntity,
|
|
91
|
+
addSystem,
|
|
92
|
+
getSystems,
|
|
93
|
+
removeSystem,
|
|
94
|
+
defineComponent,
|
|
95
|
+
defineComponentFromSchema,
|
|
96
|
+
getEntitiesWith,
|
|
97
|
+
getComponent,
|
|
98
|
+
removeComponentDefinition
|
|
99
|
+
};
|
|
100
|
+
}
|
|
101
|
+
/**
|
|
102
|
+
* @public
|
|
103
|
+
*/
|
|
104
|
+
export function Engine() {
|
|
105
|
+
const engine = preEngine();
|
|
106
|
+
const crdtSystem = crdtSceneSystem(engine);
|
|
107
|
+
function update(dt) {
|
|
108
|
+
crdtSystem.receiveMessages();
|
|
109
|
+
for (const system of engine.getSystems()) {
|
|
110
|
+
const ret = system.fn(dt);
|
|
111
|
+
if (globalThis.DEBUG) {
|
|
112
|
+
if (ret && typeof ret === 'object' && typeof ret.then === 'function') {
|
|
113
|
+
throw new Error(`A system (${system.name || 'anonymous'}) returned a thenable. Systems cannot be async functions. Documentation: https://dcl.gg/sdk/sync-systems`);
|
|
114
|
+
}
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
// TODO: Perf tip
|
|
118
|
+
// Should we add some dirtyIteratorSet at engine level so we dont have
|
|
119
|
+
// to iterate all the component definitions to get the dirty ones ?
|
|
120
|
+
const dirtySet = new Map();
|
|
121
|
+
for (const [componentId, definition] of engine.componentsDefinition) {
|
|
122
|
+
for (const entity of definition.dirtyIterator()) {
|
|
123
|
+
if (!dirtySet.has(entity)) {
|
|
124
|
+
dirtySet.set(entity, new Set());
|
|
125
|
+
}
|
|
126
|
+
dirtySet.get(entity).add(componentId);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
crdtSystem.createMessages(dirtySet);
|
|
130
|
+
for (const [_componentId, definition] of engine.componentsDefinition) {
|
|
131
|
+
definition.clearDirty();
|
|
132
|
+
}
|
|
133
|
+
}
|
|
134
|
+
const Transform = components.Transform(engine);
|
|
135
|
+
function* getTreeEntityArray(firstEntity, proccesedEntities) {
|
|
136
|
+
// This avoid infinite loop when there is a cyclic parenting
|
|
137
|
+
if (proccesedEntities.find((value) => firstEntity === value))
|
|
138
|
+
return;
|
|
139
|
+
proccesedEntities.push(firstEntity);
|
|
140
|
+
for (const [entity, value] of engine.getEntitiesWith(Transform)) {
|
|
141
|
+
if (value.parent === firstEntity) {
|
|
142
|
+
yield* getTreeEntityArray(entity, proccesedEntities);
|
|
143
|
+
}
|
|
144
|
+
}
|
|
145
|
+
yield firstEntity;
|
|
146
|
+
}
|
|
147
|
+
function removeEntityWithChildren(firstEntity) {
|
|
148
|
+
for (const entity of getTreeEntityArray(firstEntity, [])) {
|
|
149
|
+
engine.removeEntity(entity);
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
return {
|
|
153
|
+
addEntity: engine.addEntity,
|
|
154
|
+
addDynamicEntity: engine.addDynamicEntity,
|
|
155
|
+
removeEntity: engine.removeEntity,
|
|
156
|
+
removeEntityWithChildren,
|
|
157
|
+
addSystem: engine.addSystem,
|
|
158
|
+
removeSystem: engine.removeSystem,
|
|
159
|
+
// TODO: fix this type
|
|
160
|
+
defineComponent: engine.defineComponent,
|
|
161
|
+
defineComponentFromSchema: engine.defineComponentFromSchema,
|
|
162
|
+
getEntitiesWith: engine.getEntitiesWith,
|
|
163
|
+
getComponent: engine.getComponent,
|
|
164
|
+
removeComponentDefinition: engine.removeComponentDefinition,
|
|
165
|
+
update,
|
|
166
|
+
RootEntity: 0,
|
|
167
|
+
PlayerEntity: 1,
|
|
168
|
+
CameraEntity: 2,
|
|
169
|
+
entityExists: engine.entityExists,
|
|
170
|
+
addTransport: crdtSystem.addTransport
|
|
171
|
+
};
|
|
172
|
+
}
|