From 86b8bd24aa47c433bcfc7f63976213e1f46ffe93 Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Sun, 29 Mar 2026 11:22:05 +0300 Subject: [PATCH 1/2] Register `copy` and `clone` methods of components to type registry --- src/animation/systems/types.js | 6 ++++++ src/audio/systems/types.js | 4 ++++ src/broadphase/systems/types.js | 2 ++ src/color/systems/types.js | 1 + src/geometry/systems/types.js | 2 ++ src/hierarchy/systems/types.js | 4 ++++ src/movable/systems/types.js | 16 ++++++++++++++++ src/name/systems/types.js | 2 ++ src/physics/systems/types.js | 8 ++++++++ src/render-core/systems/types.js | 14 ++++++++++++++ src/time/systems/types.js | 2 ++ src/transform/systems/types.js | 20 ++++++++++++++++++++ src/tween/systems/types.js | 6 ++++++ src/window/systems/types.js | 4 ++++ 14 files changed, 91 insertions(+) diff --git a/src/animation/systems/types.js b/src/animation/systems/types.js index c667b3b2..32537dab 100644 --- a/src/animation/systems/types.js +++ b/src/animation/systems/types.js @@ -40,12 +40,18 @@ export function registerAnimationTypes(world) { repeatMode: new Field(playbackRepeatId), paused: new Field(typeid(Boolean)) })) + registry.get(Playback)?.setMethod(Playback.copy) + registry.get(Playback)?.setMethod(Playback.clone) registry.register(AnimationPlayer, new StructInfo({ animations: new Field(playbackMapId), current: new Field(typeid(Number), true) })) + registry.get(AnimationPlayer)?.setMethod(AnimationPlayer.copy) + registry.get(AnimationPlayer)?.setMethod(AnimationPlayer.clone) registry.register(AnimationTarget, new StructInfo({ player: new Field(typeid(Entity)), id: new Field(typeid(String)) })) + registry.get(AnimationTarget)?.setMethod(AnimationTarget.copy) + registry.get(AnimationTarget)?.setMethod(AnimationTarget.clone) } diff --git a/src/audio/systems/types.js b/src/audio/systems/types.js index 0ea69863..e64983fd 100644 --- a/src/audio/systems/types.js +++ b/src/audio/systems/types.js @@ -29,6 +29,8 @@ export function registerAudioTypes(world) { attach: new Field(typeid(Number), true), audio: new Field(typeidGeneric(Handle, [Audio]), true) })) + registry.get(AudioPlayer)?.setMethod(AudioPlayer.copy) + registry.get(AudioPlayer)?.setMethod(AudioPlayer.clone) registry.register(AudioOscillator, new StructInfo({ sourceNode: new Field(typeid(Number), true), type: new Field(oscillatorTypeId), @@ -36,6 +38,8 @@ export function registerAudioTypes(world) { detune: new Field(typeid(Number)), frequency: new Field(typeid(Number)) })) + registry.get(AudioOscillator)?.setMethod(AudioOscillator.copy) + registry.get(AudioOscillator)?.setMethod(AudioOscillator.clone) registry.register(AudioGraph, new StructInfo({ graph: new Field(typeid(GraphList)) })) diff --git a/src/broadphase/systems/types.js b/src/broadphase/systems/types.js index 917b4f89..6b915c7d 100644 --- a/src/broadphase/systems/types.js +++ b/src/broadphase/systems/types.js @@ -22,6 +22,8 @@ export function registerBroadphaseTypes2D(world) { max: new Field(typeid(Vector2)), min: new Field(typeid(Vector2)) })) + registry.get(PhysicsHitbox)?.setMethod(PhysicsHitbox.copy) + registry.get(PhysicsHitbox)?.setMethod(PhysicsHitbox.clone) registry.register(Broadphase2D, new StructInfo({})) registry.register(CollisionPairs, new ArrayInfo(typeid(CollisionPair))) } diff --git a/src/color/systems/types.js b/src/color/systems/types.js index aae91b71..d55560c2 100644 --- a/src/color/systems/types.js +++ b/src/color/systems/types.js @@ -16,4 +16,5 @@ export function registerColorTypes(world) { b: new Field(typeid(Number)), a: new Field(typeid(Number)) })) + registry.get(Color)?.setMethod(Color.copy) } diff --git a/src/geometry/systems/types.js b/src/geometry/systems/types.js index 24f77d6d..97ad9e78 100644 --- a/src/geometry/systems/types.js +++ b/src/geometry/systems/types.js @@ -21,9 +21,11 @@ export function registerGeometryTypes(world) { max: new Field(typeid(Vector2)), min: new Field(typeid(Vector2)) })) + registry.get(BoundingBox2D)?.setMethod(BoundingBox2D.copy) registry.register(BoundingCircle, new StructInfo({ type: new Field(boundTypeId), r: new Field(typeid(Number)), pos: new Field(typeid(Vector2)) })) + registry.get(BoundingCircle)?.setMethod(BoundingCircle.copy) } diff --git a/src/hierarchy/systems/types.js b/src/hierarchy/systems/types.js index 53668a90..87e65c85 100644 --- a/src/hierarchy/systems/types.js +++ b/src/hierarchy/systems/types.js @@ -17,7 +17,11 @@ export function registerHierarchyTypes(world) { registry.register(Children, new StructInfo({ list: new Field(entityArrayId) })) + registry.get(Children)?.setMethod(Children.copy) + registry.get(Children)?.setMethod(Children.clone) registry.register(Parent, new StructInfo({ entity: new Field(typeid(Entity)) })) + registry.get(Parent)?.setMethod(Parent.copy) + registry.get(Parent)?.setMethod(Parent.clone) } diff --git a/src/movable/systems/types.js b/src/movable/systems/types.js index eb1190bf..996a31e6 100644 --- a/src/movable/systems/types.js +++ b/src/movable/systems/types.js @@ -14,16 +14,24 @@ export function registerMovable2DTypes(world) { x: new Field(typeid(Number)), y: new Field(typeid(Number)) })) + registry.get(Velocity2D)?.setMethod(Velocity2D.copy) + registry.get(Velocity2D)?.setMethod(Velocity2D.clone) registry.register(Rotation2D, new StructInfo({ value: new Field(typeid(Number)) })) + registry.get(Rotation2D)?.setMethod(Rotation2D.copy) + registry.get(Rotation2D)?.setMethod(Rotation2D.clone) registry.register(Acceleration2D, new StructInfo({ x: new Field(typeid(Number)), y: new Field(typeid(Number)) })) + registry.get(Acceleration2D)?.setMethod(Acceleration2D.copy) + registry.get(Acceleration2D)?.setMethod(Acceleration2D.clone) registry.register(Torque2D, new StructInfo({ value: new Field(typeid(Number)) })) + registry.get(Torque2D)?.setMethod(Torque2D.copy) + registry.get(Torque2D)?.setMethod(Torque2D.clone) } /** @@ -37,19 +45,27 @@ export function registerMovable3DTypes(world) { y: new Field(typeid(Number)), z: new Field(typeid(Number)) })) + registry.get(Velocity3D)?.setMethod(Velocity3D.copy) + registry.get(Velocity3D)?.setMethod(Velocity3D.clone) registry.register(Rotation3D, new StructInfo({ x: new Field(typeid(Number)), y: new Field(typeid(Number)), z: new Field(typeid(Number)) })) + registry.get(Rotation3D)?.setMethod(Rotation3D.copy) + registry.get(Rotation3D)?.setMethod(Rotation3D.clone) registry.register(Acceleration3D, new StructInfo({ x: new Field(typeid(Number)), y: new Field(typeid(Number)), z: new Field(typeid(Number)) })) + registry.get(Acceleration3D)?.setMethod(Acceleration3D.copy) + registry.get(Acceleration3D)?.setMethod(Acceleration3D.clone) registry.register(Torque3D, new StructInfo({ x: new Field(typeid(Number)), y: new Field(typeid(Number)), z: new Field(typeid(Number)) })) + registry.get(Torque3D)?.setMethod(Torque3D.copy) + registry.get(Torque3D)?.setMethod(Torque3D.clone) } diff --git a/src/name/systems/types.js b/src/name/systems/types.js index 4e5ba0d4..f0b0bf1c 100644 --- a/src/name/systems/types.js +++ b/src/name/systems/types.js @@ -13,4 +13,6 @@ export function registerNameTypes(world) { registry.register(Name, new StructInfo({ value: new Field(typeid(String)) })) + registry.get(Name)?.setMethod(Name.copy) + registry.get(Name)?.setMethod(Name.clone) } diff --git a/src/physics/systems/types.js b/src/physics/systems/types.js index c6a5f04d..6b368712 100644 --- a/src/physics/systems/types.js +++ b/src/physics/systems/types.js @@ -26,6 +26,8 @@ export function registerPhysicsTypes(world) { vertices: new Field(vector2ArrayId), geometry: new Field(typeid(Geometry)) })) + registry.get(Collider2D)?.setMethod(Collider2D.copy) + registry.get(Collider2D)?.setMethod(Collider2D.clone) registry.register(PhysicsProperties, new StructInfo({ invinertia: new Field(typeid(Number)), invmass: new Field(typeid(Number)), @@ -35,6 +37,12 @@ export function registerPhysicsTypes(world) { restitution: new Field(typeid(Number)), kineticFriction: new Field(typeid(Number)) })) + registry.get(PhysicsProperties)?.setMethod(PhysicsProperties.copy) + registry.get(PhysicsProperties)?.setMethod(PhysicsProperties.clone) registry.register(SoftBody2D, new StructInfo({})) + registry.get(SoftBody2D)?.setMethod(SoftBody2D.copy) + registry.get(SoftBody2D)?.setMethod(SoftBody2D.clone) registry.register(SoftBody3D, new StructInfo({})) + registry.get(SoftBody3D)?.setMethod(SoftBody3D.copy) + registry.get(SoftBody3D)?.setMethod(SoftBody3D.clone) } diff --git a/src/render-core/systems/types.js b/src/render-core/systems/types.js index a92e3c6c..1108a925 100644 --- a/src/render-core/systems/types.js +++ b/src/render-core/systems/types.js @@ -47,17 +47,25 @@ export function registerRenderCoreTypes(world) { registry.register(Meshed, new StructInfo({ handle: new Field(typeidGeneric(Handle, [Mesh])) })) + registry.get(Meshed)?.setMethod(Meshed.copy) + registry.get(Meshed)?.setMethod(Meshed.clone) registry.register(BasicMaterial2D, new StructInfo({ handle: new Field(basicMaterialHandleId) })) + registry.get(BasicMaterial2D)?.setMethod(BasicMaterial2D.copy) + registry.get(BasicMaterial2D)?.setMethod(BasicMaterial2D.clone) registry.register(BasicMaterial3D, new StructInfo({ handle: new Field(basicMaterialHandleId) })) + registry.get(BasicMaterial3D)?.setMethod(BasicMaterial3D.copy) + registry.get(BasicMaterial3D)?.setMethod(BasicMaterial3D.clone) registry.register(Camera, new StructInfo({ projection: new Field(typeid(Projection)), near: new Field(typeid(Number)), far: new Field(typeid(Number)) })) + registry.get(Camera)?.setMethod(Camera.copy) + registry.get(Camera)?.setMethod(Camera.clone) } /** @@ -81,5 +89,11 @@ export function registerMaterialTypes(component, material) { registry.register(component, new StructInfo({ handle: new Field(handleTypeId) })) + if ("copy" in component && typeof component["copy"] === 'function') { + registry.get(component)?.setMethod(component["copy"]) + } + if ("clone" in component && typeof component["clone"] === 'function') { + registry.get(component)?.setMethod(component["clone"]) + } } } diff --git a/src/time/systems/types.js b/src/time/systems/types.js index efdf26d8..6062a335 100644 --- a/src/time/systems/types.js +++ b/src/time/systems/types.js @@ -23,6 +23,8 @@ export function registerTimeTypes(world) { speed: new Field(typeid(Number)), paused: new Field(typeid(Boolean)) })) + registry.get(Timer)?.setMethod(Timer.copy) + registry.get(Timer)?.setMethod(Timer.clone) registry.register(Clock, new StructInfo({ elapsed: new Field(typeid(Number)), lastTick: new Field(typeid(Number)), diff --git a/src/transform/systems/types.js b/src/transform/systems/types.js index 1ecaf9ae..9554ba3b 100644 --- a/src/transform/systems/types.js +++ b/src/transform/systems/types.js @@ -26,14 +26,20 @@ export function registerTransform2DTypes(world) { x: new Field(typeid(Number)), y: new Field(typeid(Number)) })) + registry.get(Position2D)?.setMethod(Position2D.copy) + registry.get(Position2D)?.setMethod(Position2D.clone) registry.register(Orientation2D, new StructInfo({ cos: new Field(typeid(Number)), sin: new Field(typeid(Number)) })) + registry.get(Orientation2D)?.setMethod(Orientation2D.copy) + registry.get(Orientation2D)?.setMethod(Orientation2D.clone) registry.register(Scale2D, new StructInfo({ x: new Field(typeid(Number)), y: new Field(typeid(Number)) })) + registry.get(Scale2D)?.setMethod(Scale2D.copy) + registry.get(Scale2D)?.setMethod(Scale2D.clone) registry.register(GlobalTransform2D, new StructInfo({ a: new Field(typeid(Number)), b: new Field(typeid(Number)), @@ -42,6 +48,8 @@ export function registerTransform2DTypes(world) { x: new Field(typeid(Number)), y: new Field(typeid(Number)) })) + registry.get(GlobalTransform2D)?.setMethod(GlobalTransform2D.copy) + registry.get(GlobalTransform2D)?.setMethod(GlobalTransform2D.clone) } /** @@ -55,17 +63,23 @@ export function registerTransform3DTypes(world) { y: new Field(typeid(Number)), z: new Field(typeid(Number)) })) + registry.get(Position3D)?.setMethod(Position3D.copy) + registry.get(Position3D)?.setMethod(Position3D.clone) registry.register(Orientation3D, new StructInfo({ x: new Field(typeid(Number)), y: new Field(typeid(Number)), z: new Field(typeid(Number)), w: new Field(typeid(Number)) })) + registry.get(Orientation3D)?.setMethod(Orientation3D.copy) + registry.get(Orientation3D)?.setMethod(Orientation3D.clone) registry.register(Scale3D, new StructInfo({ x: new Field(typeid(Number)), y: new Field(typeid(Number)), z: new Field(typeid(Number)) })) + registry.get(Scale3D)?.setMethod(Scale3D.copy) + registry.get(Scale3D)?.setMethod(Scale3D.clone) registry.register(GlobalTransform3D, new StructInfo({ a: new Field(typeid(Number)), b: new Field(typeid(Number)), @@ -80,6 +94,8 @@ export function registerTransform3DTypes(world) { y: new Field(typeid(Number)), z: new Field(typeid(Number)) })) + registry.get(GlobalTransform3D)?.setMethod(GlobalTransform3D.copy) + registry.get(GlobalTransform3D)?.setMethod(GlobalTransform3D.clone) } /** @@ -95,6 +111,8 @@ export function registerRemoteTransform2DTypes(world) { entity: new Field(typeid(Entity)), offsetTransform: new Field(typeid(Affine2)) })) + registry.get(RemoteTransform2D)?.setMethod(RemoteTransform2D.copy) + registry.get(RemoteTransform2D)?.setMethod(RemoteTransform2D.clone) } /** @@ -110,4 +128,6 @@ export function registerRemoteTransform3DTypes(world) { entity: new Field(typeid(Entity)), offsetTransform: new Field(typeid(Affine3)) })) + registry.get(RemoteTransform3D)?.setMethod(RemoteTransform3D.copy) + registry.get(RemoteTransform3D)?.setMethod(RemoteTransform3D.clone) } diff --git a/src/tween/systems/types.js b/src/tween/systems/types.js index cdd1f258..4778bce3 100644 --- a/src/tween/systems/types.js +++ b/src/tween/systems/types.js @@ -24,6 +24,8 @@ export function registerTweenTypes(tween, valueType) { repeat: new Field(typeid(Boolean)), flip: new Field(typeid(Boolean)) })) + registry.get(tween)?.setMethod(tween.copy) + registry.get(tween)?.setMethod(tween.clone) } } @@ -36,5 +38,9 @@ export function registerTweenMarkerTypes() { registry.register(TweenFlip, new StructInfo({})) registry.register(TweenRepeat, new StructInfo({})) + registry.get(TweenFlip)?.setMethod(TweenFlip.copy) + registry.get(TweenFlip)?.setMethod(TweenFlip.clone) + registry.get(TweenRepeat)?.setMethod(TweenRepeat.copy) + registry.get(TweenRepeat)?.setMethod(TweenRepeat.clone) } } diff --git a/src/window/systems/types.js b/src/window/systems/types.js index f16104fd..202e7db9 100644 --- a/src/window/systems/types.js +++ b/src/window/systems/types.js @@ -25,7 +25,11 @@ export function registerWindowTypes(world) { height: new Field(typeid(Number)), selector: new Field(typeid(String), true) })) + registry.get(Window)?.setMethod(Window.copy) + registry.get(Window)?.setMethod(Window.clone) registry.register(MainWindow, new StructInfo({})) + registry.get(MainWindow)?.setMethod(MainWindow.copy) + registry.get(MainWindow)?.setMethod(MainWindow.clone) registry.register(Windows, new StructInfo({ entities: new Field(entityWindowMapId) })) From b199eecbacf13c39bf62b63385f8a7538492ed7a Mon Sep 17 00:00:00 2001 From: waynemwashuma <94756970+waynemwashuma@users.noreply.github.com> Date: Sun, 29 Mar 2026 13:44:01 +0300 Subject: [PATCH 2/2] Lint files --- src/render-core/systems/types.js | 9 +++++---- 1 file changed, 5 insertions(+), 4 deletions(-) diff --git a/src/render-core/systems/types.js b/src/render-core/systems/types.js index 1108a925..dea999df 100644 --- a/src/render-core/systems/types.js +++ b/src/render-core/systems/types.js @@ -89,11 +89,12 @@ export function registerMaterialTypes(component, material) { registry.register(component, new StructInfo({ handle: new Field(handleTypeId) })) - if ("copy" in component && typeof component["copy"] === 'function') { - registry.get(component)?.setMethod(component["copy"]) + + if ('copy' in component && typeof component.copy === 'function') { + registry.get(component)?.setMethod(component.copy) } - if ("clone" in component && typeof component["clone"] === 'function') { - registry.get(component)?.setMethod(component["clone"]) + if ('clone' in component && typeof component.clone === 'function') { + registry.get(component)?.setMethod(component.clone) } } }