From 68432fd34834faa0ddac234ecf3e4d29192bea36 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Sat, 23 Mar 2024 17:15:17 -0600 Subject: [PATCH 01/17] Added mechanisms --- fission/src/mirabuf/MirabufParser.ts | 12 ++--- fission/src/mirabuf/MirabufSceneObject.ts | 15 +++--- fission/src/systems/physics/Mechanism.ts | 30 +++++++++++ fission/src/systems/physics/PhysicsSystem.ts | 52 ++++++++++++++------ fission/src/util/debug/DebugPrint.ts | 2 +- 5 files changed, 83 insertions(+), 28 deletions(-) create mode 100644 fission/src/systems/physics/Mechanism.ts diff --git a/fission/src/mirabuf/MirabufParser.ts b/fission/src/mirabuf/MirabufParser.ts index 9ae2dde91d..7052e8362f 100644 --- a/fission/src/mirabuf/MirabufParser.ts +++ b/fission/src/mirabuf/MirabufParser.ts @@ -137,7 +137,7 @@ class MirabufParser { const currentRn = this._partToNodeMap.get(y)!; if (!rn) { rn = currentRn; - } else if (currentRn.name != rn.name) { + } else if (currentRn.id != rn.id) { rn = this.MergeRigidNodes(currentRn, rn); } }); @@ -326,12 +326,12 @@ class MirabufParser { * Collection of mirabuf parts that are bound together */ class RigidNode { - public name: string; + public id: string; public parts: Set = new Set(); public isDynamic: boolean; - public constructor(name: string, isDynamic?: boolean) { - this.name = name; + public constructor(id: string, isDynamic?: boolean) { + this.id = id; this.isDynamic = isDynamic ?? true; } } @@ -339,8 +339,8 @@ class RigidNode { export class RigidNodeReadOnly { private _original: RigidNode; - public get name(): string { - return this._original.name; + public get id(): string { + return this._original.id; } public get parts(): ReadonlySet { diff --git a/fission/src/mirabuf/MirabufSceneObject.ts b/fission/src/mirabuf/MirabufSceneObject.ts index 71b8d41e18..a560f40203 100644 --- a/fission/src/mirabuf/MirabufSceneObject.ts +++ b/fission/src/mirabuf/MirabufSceneObject.ts @@ -9,6 +9,7 @@ import { JoltMat44_ThreeMatrix4 } from "@/util/TypeConversions"; import * as THREE from 'three'; import JOLT from "@/util/loading/JoltSyncLoader"; import { LayerReserve } from "@/systems/physics/PhysicsSystem"; +import Mechanism from "@/systems/physics/Mechanism"; const DEBUG_BODIES = true; @@ -20,7 +21,7 @@ interface RnDebugMeshes { class MirabufSceneObject extends SceneObject { private _mirabufInstance: MirabufInstance; - private _bodies: Map; + private _mechanism: Mechanism; private _debugBodies: Map | null; private _physicsLayerReserve: LayerReserve | undefined = undefined; @@ -32,8 +33,8 @@ class MirabufSceneObject extends SceneObject { if (this._mirabufInstance.parser.assembly.dynamic) { this._physicsLayerReserve = new LayerReserve(); } - this._bodies = World.PhysicsSystem.CreateBodiesFromParser(mirabufInstance.parser, this._physicsLayerReserve); - World.PhysicsSystem.CreateJointsFromParser(mirabufInstance.parser, this._bodies); + + this._mechanism = World.PhysicsSystem.CreateMechanismFromParser(this._mirabufInstance.parser); this._debugBodies = null; } @@ -43,7 +44,7 @@ class MirabufSceneObject extends SceneObject { if (DEBUG_BODIES) { this._debugBodies = new Map(); - this._bodies.forEach((bodyId, rnName) => { + this._mechanism.nodeToBody.forEach((bodyId, rnName) => { const body = World.PhysicsSystem.GetBody(bodyId); @@ -59,7 +60,7 @@ class MirabufSceneObject extends SceneObject { public Update(): void { this._mirabufInstance.parser.rigidNodes.forEach(rn => { - const body = World.PhysicsSystem.GetBody(this._bodies.get(rn.name)!); + const body = World.PhysicsSystem.GetBody(this._mechanism.GetBodyByNodeId(rn.id)!); const transform = JoltMat44_ThreeMatrix4(body.GetWorldTransform()); rn.parts.forEach(part => { const partTransform = this._mirabufInstance.parser.globalTransforms.get(part)!.clone().premultiply(transform); @@ -77,7 +78,7 @@ class MirabufSceneObject extends SceneObject { // console.debug(`POSITION: ${body.GetPosition().GetX()}, ${body.GetPosition().GetY()}, ${body.GetPosition().GetZ()}`) if (this._debugBodies) { - const { colliderMesh, comMesh } = this._debugBodies.get(rn.name)!; + const { colliderMesh, comMesh } = this._debugBodies.get(rn.id)!; colliderMesh.position.setFromMatrixPosition(transform); colliderMesh.rotation.setFromRotationMatrix(transform); @@ -89,7 +90,7 @@ class MirabufSceneObject extends SceneObject { } public Dispose(): void { - World.PhysicsSystem.DestroyBodyIds(...this._bodies.values()); + World.PhysicsSystem.DestroyMechanism(this._mechanism); this._mirabufInstance.Dispose(World.SceneRenderer.scene); this._debugBodies?.forEach(x => { World.SceneRenderer.scene.remove(x.colliderMesh, x.comMesh); diff --git a/fission/src/systems/physics/Mechanism.ts b/fission/src/systems/physics/Mechanism.ts new file mode 100644 index 0000000000..9ac5218f9c --- /dev/null +++ b/fission/src/systems/physics/Mechanism.ts @@ -0,0 +1,30 @@ +import Jolt from "@barclah/jolt-physics"; +import { LayerReserve } from "./PhysicsSystem"; + +export interface MechanismConstraint { + parentBody: Jolt.BodyID, + childBody: Jolt.BodyID, + constraint: Jolt.Constraint +} + +class Mechanism { + public nodeToBody: Map; + public constraints: Array; + public layerReserve: LayerReserve | undefined; + + public constructor(bodyMap: Map, layerReserve?: LayerReserve) { + this.nodeToBody = bodyMap; + this.constraints = []; + this.layerReserve = layerReserve; + } + + public AddConstraint(mechConstraint: MechanismConstraint) { + this.constraints.push(mechConstraint); + } + + public GetBodyByNodeId(nodeId: string) { + return this.nodeToBody.get(nodeId); + } +} + +export default Mechanism; \ No newline at end of file diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index bd152e5124..37adc9a2af 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -5,6 +5,7 @@ import * as THREE from 'three'; import { mirabuf } from '../../proto/mirabuf'; import MirabufParser, { GAMEPIECE_SUFFIX, GROUNDED_JOINT_ID, RigidNodeReadOnly } from "../../mirabuf/MirabufParser"; import WorldSystem from "../WorldSystem"; +import Mechanism from "./Mechanism"; /** * Layers used for determining enabled/disabled collisions. @@ -152,13 +153,21 @@ class PhysicsSystem extends WorldSystem { return settings.Create(); } + public CreateMechanismFromParser(parser: MirabufParser) { + const layer = parser.assembly.dynamic ? new LayerReserve(): undefined; + const bodyMap = this.CreateBodiesFromParser(parser, layer); + const mechanism = new Mechanism(bodyMap, layer); + this.CreateJointsFromParser(parser, mechanism); + return mechanism; + } + /** * Creates all the joints for a mirabuf assembly given an already compiled mapping of rigid nodes to bodies. * * @param parser Mirabuf parser with complete set of rigid nodes and assembly data. - * @param rnMapping Mapping of the name of rigid groups to Jolt bodies. Retrieved from CreateBodiesFromParser. + * @param mechainsm Mapping of the name of rigid groups to Jolt bodies. Retrieved from CreateBodiesFromParser. */ - public CreateJointsFromParser(parser: MirabufParser, rnMapping: Map) { + public CreateJointsFromParser(parser: MirabufParser, mechanism: Mechanism) { const jointData = parser.assembly.data!.joints!; for (const [jGuid, jInst] of (Object.entries(jointData.jointInstances!) as [string, mirabuf.joint.JointInstance][])) { if (jGuid == GROUNDED_JOINT_ID) @@ -170,14 +179,14 @@ class PhysicsSystem extends WorldSystem { if (!rnA || !rnB) { console.warn(`Skipping joint '${jInst.info!.name!}'. Couldn't find associated rigid nodes.`); continue; - } else if (rnA.name == rnB.name) { + } else if (rnA.id == rnB.id) { console.warn(`Skipping joint '${jInst.info!.name!}'. Jointing the same parts. Likely in issue with Fusion Design structure.`); continue; } const jDef = parser.assembly.data!.joints!.jointDefinitions![jInst.jointReference!]! as mirabuf.joint.Joint; - const bodyIdA = rnMapping.get(rnA.name); - const bodyIdB = rnMapping.get(rnB.name); + const bodyIdA = mechanism.GetBodyByNodeId(rnA.id); + const bodyIdB = mechanism.GetBodyByNodeId(rnB.id); if (!bodyIdA || !bodyIdB) { console.warn(`Skipping joint '${jInst.info!.name!}'. Failed to find rigid nodes' associated bodies.`); continue; @@ -185,17 +194,22 @@ class PhysicsSystem extends WorldSystem { const bodyA = this.GetBody(bodyIdA); const bodyB = this.GetBody(bodyIdB); + let constraint: Jolt.Constraint | undefined = undefined; + switch (jDef.jointMotionType!) { case mirabuf.joint.JointMotion.REVOLUTE: - this.CreateHingeConstraint(jInst, jDef, bodyA, bodyB, parser.assembly.info!.version!); + constraint = this.CreateHingeConstraint(jInst, jDef, bodyA, bodyB, parser.assembly.info!.version!); break; case mirabuf.joint.JointMotion.SLIDER: - this.CreateSliderConstraint(jInst, jDef, bodyA, bodyB); + constraint = this.CreateSliderConstraint(jInst, jDef, bodyA, bodyB); break; default: console.debug('Unsupported joint detected. Skipping...'); break; } + + if (constraint) + mechanism.AddConstraint({ parentBody: bodyIdA, childBody: bodyIdB, constraint: constraint }); } } @@ -211,7 +225,7 @@ class PhysicsSystem extends WorldSystem { */ private CreateHingeConstraint( jointInstance: mirabuf.joint.JointInstance, jointDefinition: mirabuf.joint.Joint, - bodyA: Jolt.Body, bodyB: Jolt.Body, versionNum: number): Jolt.HingeConstraint { + bodyA: Jolt.Body, bodyB: Jolt.Body, versionNum: number): Jolt.Constraint { // HINGE CONSTRAINT const hingeConstraintSettings = new JOLT.HingeConstraintSettings(); @@ -257,7 +271,8 @@ class PhysicsSystem extends WorldSystem { const constraint = hingeConstraintSettings.Create(bodyA, bodyB); this._joltPhysSystem.AddConstraint(constraint); - return JOLT.castObject(constraint, JOLT.HingeConstraint); + return constraint; + // return JOLT.castObject(, JOLT.HingeConstraint); } /** @@ -272,7 +287,7 @@ class PhysicsSystem extends WorldSystem { */ private CreateSliderConstraint( jointInstance: mirabuf.joint.JointInstance, jointDefinition: mirabuf.joint.Joint, - bodyA: Jolt.Body, bodyB: Jolt.Body): Jolt.SliderConstraint { + bodyA: Jolt.Body, bodyB: Jolt.Body): Jolt.Constraint { const sliderConstraintSettings = new JOLT.SliderConstraintSettings(); @@ -323,7 +338,8 @@ class PhysicsSystem extends WorldSystem { this._constraints.push(constraint); this._joltPhysSystem.AddConstraint(constraint); - return JOLT.castObject(constraint, JOLT.SliderConstraint); + return constraint; + // return JOLT.castObject(constraint, JOLT.SliderConstraint); } /** @@ -354,7 +370,7 @@ class PhysicsSystem extends WorldSystem { const rnLayer: number = reservedLayer ? reservedLayer - : (rn.name.endsWith(GAMEPIECE_SUFFIX) ? LAYER_GENERAL_DYNAMIC : LAYER_FIELD); + : (rn.id.endsWith(GAMEPIECE_SUFFIX) ? LAYER_GENERAL_DYNAMIC : LAYER_FIELD); rn.parts.forEach(partId => { const partInstance = parser.assembly.data!.parts!.partInstances![partId]!; @@ -401,7 +417,7 @@ class PhysicsSystem extends WorldSystem { const shapeResult = compoundShapeSettings.Create(); if (!shapeResult.IsValid || shapeResult.HasError()) { - console.error(`Failed to create shape for RigidNode ${rn.name}\n${shapeResult.GetError().c_str()}`); + console.error(`Failed to create shape for RigidNode ${rn.id}\n${shapeResult.GetError().c_str()}`); } const shape = shapeResult.Get(); @@ -419,7 +435,7 @@ class PhysicsSystem extends WorldSystem { ); const body = this._joltBodyInterface.CreateBody(bodySettings); this._joltBodyInterface.AddBody(body.GetID(), JOLT.EActivation_Activate); - rnToBodies.set(rn.name, body.GetID()); + rnToBodies.set(rn.id, body.GetID()); // Little testing components body.SetRestitution(0.4); @@ -512,6 +528,14 @@ class PhysicsSystem extends WorldSystem { }); } + public DestroyMechanism(mech: Mechanism) { + mech.constraints.forEach(x => this._joltPhysSystem.RemoveConstraint(x.constraint)); + mech.nodeToBody.forEach(x => { + this._joltBodyInterface.RemoveBody(x); + this._joltBodyInterface.DestroyBody(x); + }); + } + public GetBody(bodyId: Jolt.BodyID) { return this._joltPhysSystem.GetBodyLockInterface().TryGetBody(bodyId); } diff --git a/fission/src/util/debug/DebugPrint.ts b/fission/src/util/debug/DebugPrint.ts index d920822152..19070973b1 100644 --- a/fission/src/util/debug/DebugPrint.ts +++ b/fission/src/util/debug/DebugPrint.ts @@ -4,7 +4,7 @@ import Jolt from "@barclah/jolt-physics"; export function printRigidNodeParts(nodes: RigidNodeReadOnly[], mira: mirabuf.Assembly) { nodes.forEach(x => { - console.log(`[ ${x.name} ]:`); + console.log(`[ ${x.id} ]:`); x.parts.forEach(y => console.log(`-> '${mira.data!.parts!.partInstances![y]!.info!.name!}'`)); console.log(''); }); From 1dcd858e9ca2cae703d9316535e9bbc2dfb4158c Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Wed, 27 Mar 2024 02:54:19 -0600 Subject: [PATCH 02/17] Adding a ton of files --- fission/src/mirabuf/MirabufSceneObject.ts | 12 +++- fission/src/systems/World.ts | 10 ++- fission/src/systems/simulation/Brain.ts | 17 +++++ fission/src/systems/simulation/Driver.ts | 5 ++ .../systems/simulation/SimulationSystem.ts | 67 +++++++++++++++++++ fission/src/systems/simulation/Stimulus.ts | 5 ++ .../simulation/synthesis_brain/Behavior.ts | 15 +++++ .../synthesis_brain/SynthesisBrain.ts | 25 +++++++ 8 files changed, 152 insertions(+), 4 deletions(-) create mode 100644 fission/src/systems/simulation/Brain.ts create mode 100644 fission/src/systems/simulation/Driver.ts create mode 100644 fission/src/systems/simulation/SimulationSystem.ts create mode 100644 fission/src/systems/simulation/Stimulus.ts create mode 100644 fission/src/systems/simulation/synthesis_brain/Behavior.ts create mode 100644 fission/src/systems/simulation/synthesis_brain/SynthesisBrain.ts diff --git a/fission/src/mirabuf/MirabufSceneObject.ts b/fission/src/mirabuf/MirabufSceneObject.ts index a560f40203..59e8bb7b89 100644 --- a/fission/src/mirabuf/MirabufSceneObject.ts +++ b/fission/src/mirabuf/MirabufSceneObject.ts @@ -10,6 +10,7 @@ import * as THREE from 'three'; import JOLT from "@/util/loading/JoltSyncLoader"; import { LayerReserve } from "@/systems/physics/PhysicsSystem"; import Mechanism from "@/systems/physics/Mechanism"; +import SynthesisBrain from "@/systems/simulation/synthesis_brain/SynthesisBrain"; const DEBUG_BODIES = true; @@ -21,10 +22,11 @@ interface RnDebugMeshes { class MirabufSceneObject extends SceneObject { private _mirabufInstance: MirabufInstance; - private _mechanism: Mechanism; private _debugBodies: Map | null; private _physicsLayerReserve: LayerReserve | undefined = undefined; + private _mechanism: Mechanism; + public constructor(mirabufInstance: MirabufInstance) { super(); @@ -35,11 +37,12 @@ class MirabufSceneObject extends SceneObject { } this._mechanism = World.PhysicsSystem.CreateMechanismFromParser(this._mirabufInstance.parser); - + this._debugBodies = null; } public Setup(): void { + // Rendering this._mirabufInstance.AddToScene(World.SceneRenderer.scene); if (DEBUG_BODIES) { @@ -56,6 +59,11 @@ class MirabufSceneObject extends SceneObject { this._debugBodies!.set(rnName, { colliderMesh: colliderMesh, comMesh: comMesh }); }); } + + // Simulation + World.SimulationSystem.RegisterMechanism(this._mechanism); + const simLayer = World.SimulationSystem.GetSimulationLayer(this._mechanism)!; + const brain = new SynthesisBrain(this._mechanism); } public Update(): void { diff --git a/fission/src/systems/World.ts b/fission/src/systems/World.ts index 68a2c6c52f..4b25755a52 100644 --- a/fission/src/systems/World.ts +++ b/fission/src/systems/World.ts @@ -2,6 +2,7 @@ import * as THREE from "three"; import PhysicsSystem from "./physics/PhysicsSystem"; import SceneRenderer from "./scene/SceneRenderer"; +import SimulationSystem from "./simulation/SimulationSystem"; class World { @@ -10,11 +11,13 @@ class World { private static _sceneRenderer: SceneRenderer; private static _physicsSystem: PhysicsSystem; + private static _simulationSystem: SimulationSystem; public static get isAlive() { return World._isAlive; } public static get SceneRenderer() { return World._sceneRenderer; } public static get PhysicsSystem() { return World._physicsSystem; } + public static get SimulationSystem() { return World._simulationSystem; } public static InitWorld() { if (World._isAlive) @@ -25,6 +28,7 @@ class World { World._sceneRenderer = new SceneRenderer(); World._physicsSystem = new PhysicsSystem(); + World._simulationSystem = new SimulationSystem(); } public static DestroyWorld() { @@ -35,12 +39,14 @@ class World { World._physicsSystem.Destroy(); World._sceneRenderer.Destroy(); + World._simulationSystem.Destroy(); } public static UpdateWorld() { const deltaT = World._clock.getDelta(); - this._physicsSystem.Update(deltaT); - this._sceneRenderer.Update(deltaT); + World._simulationSystem.Update(deltaT); + World._physicsSystem.Update(deltaT); + World._sceneRenderer.Update(deltaT); } } diff --git a/fission/src/systems/simulation/Brain.ts b/fission/src/systems/simulation/Brain.ts new file mode 100644 index 0000000000..82bcf94dd9 --- /dev/null +++ b/fission/src/systems/simulation/Brain.ts @@ -0,0 +1,17 @@ +import Mechanism from "../physics/Mechanism"; + +abstract class Brain { + + protected _mechanism: Mechanism; + + constructor(mechansim: Mechanism) { + this._mechanism = mechansim; + } + + public abstract Update(deltaT: number): void; + + public abstract Enable(): void; + public abstract Disable(): void; +} + +export default Brain; \ No newline at end of file diff --git a/fission/src/systems/simulation/Driver.ts b/fission/src/systems/simulation/Driver.ts new file mode 100644 index 0000000000..ee95e833d3 --- /dev/null +++ b/fission/src/systems/simulation/Driver.ts @@ -0,0 +1,5 @@ +abstract class Driver { + +} + +export default Driver; \ No newline at end of file diff --git a/fission/src/systems/simulation/SimulationSystem.ts b/fission/src/systems/simulation/SimulationSystem.ts new file mode 100644 index 0000000000..d3a4ffbc90 --- /dev/null +++ b/fission/src/systems/simulation/SimulationSystem.ts @@ -0,0 +1,67 @@ +import Mechanism from "../physics/Mechanism"; +import WorldSystem from "../WorldSystem"; +import Brain from "./Brain"; +import Driver from "./Driver"; +import Stimulus from "./Stimulus"; + +class SimulationSystem extends WorldSystem { + + private _simMechanisms: Map; + + constructor() { + super(); + + this._simMechanisms = new Map(); + } + + public RegisterMechanism(mechanism: Mechanism) { + if (this._simMechanisms.has(mechanism)) + return; + + this._simMechanisms.set(mechanism, new SimulationLayer(mechanism)); + } + + public GetSimulationLayer(mechanism: Mechanism): SimulationLayer | undefined { + return this._simMechanisms.get(mechanism); + } + + public Update(deltaT: number): void { + this._simMechanisms.forEach(simLayer => simLayer.brain?.Update(deltaT)); + } + + public Destroy(): void { + this._simMechanisms.forEach(simLayer => simLayer.SetBrain(undefined)); + this._simMechanisms.clear(); + } + +} + +class SimulationLayer { + private _mechanism: Mechanism; + private _brain?: Brain; + + private _drivers: Driver[]; + private _stimuli: Stimulus[]; + + public get brain() { return this._brain; } + + constructor(mechanism: Mechanism) { + this._mechanism = mechanism; + + // Generate standard drivers and stimuli + this._drivers = []; + this._stimuli = []; + } + + public SetBrain(brain: T | undefined) { + if (this._brain) + this._brain.Disable(); + + this._brain = brain; + + if (this._brain) + this._brain.Enable(); + } +} + +export default SimulationSystem; \ No newline at end of file diff --git a/fission/src/systems/simulation/Stimulus.ts b/fission/src/systems/simulation/Stimulus.ts new file mode 100644 index 0000000000..c52ea23e99 --- /dev/null +++ b/fission/src/systems/simulation/Stimulus.ts @@ -0,0 +1,5 @@ +abstract class Stimulus { + +} + +export default Stimulus; \ No newline at end of file diff --git a/fission/src/systems/simulation/synthesis_brain/Behavior.ts b/fission/src/systems/simulation/synthesis_brain/Behavior.ts new file mode 100644 index 0000000000..bd52b14e59 --- /dev/null +++ b/fission/src/systems/simulation/synthesis_brain/Behavior.ts @@ -0,0 +1,15 @@ +import Driver from "../Driver"; +import Stimulus from "../Stimulus"; + +abstract class Behavior { + + private _drivers: Driver[]; + private _stimuli: Stimulus[]; + + constructor(drivers: Driver[], stimuli: Stimulus[]) { + this._drivers = drivers; + this._stimuli = stimuli; + } +} + +export default Behavior; \ No newline at end of file diff --git a/fission/src/systems/simulation/synthesis_brain/SynthesisBrain.ts b/fission/src/systems/simulation/synthesis_brain/SynthesisBrain.ts new file mode 100644 index 0000000000..3674f74ee6 --- /dev/null +++ b/fission/src/systems/simulation/synthesis_brain/SynthesisBrain.ts @@ -0,0 +1,25 @@ +import Mechanism from "@/systems/physics/Mechanism"; +import Brain from "../Brain"; +import Behavior from "./Behavior"; + +class SynthesisBrain extends Brain { + + public _behaviors: Behavior[] = []; + + public constructor(mechanism: Mechanism) { + super(mechanism); + } + + public Update(deltaT: number): void { + throw new Error("Method not implemented."); + } + public Enable(): void { + throw new Error("Method not implemented."); + } + public Disable(): void { + this._behaviors = []; + } + +} + +export default SynthesisBrain; \ No newline at end of file From a38c51599879e74a414d4c708b0c624e70d9d3ee Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Fri, 29 Mar 2024 12:23:37 -0600 Subject: [PATCH 03/17] Working hinge driving --- fission/src/mirabuf/MirabufSceneObject.ts | 3 +- fission/src/systems/physics/PhysicsSystem.ts | 13 +++--- fission/src/systems/simulation/Driver.ts | 5 --- .../systems/simulation/SimulationSystem.ts | 22 ++++++++-- .../src/systems/simulation/driver/Driver.ts | 5 +++ .../systems/simulation/driver/HingeDriver.ts | 40 +++++++++++++++++++ .../simulation/{ => stimulus}/Stimulus.ts | 2 +- .../simulation/synthesis_brain/Behavior.ts | 4 +- .../synthesis_brain/SynthesisBrain.ts | 8 +--- 9 files changed, 79 insertions(+), 23 deletions(-) delete mode 100644 fission/src/systems/simulation/Driver.ts create mode 100644 fission/src/systems/simulation/driver/Driver.ts create mode 100644 fission/src/systems/simulation/driver/HingeDriver.ts rename fission/src/systems/simulation/{ => stimulus}/Stimulus.ts (51%) diff --git a/fission/src/mirabuf/MirabufSceneObject.ts b/fission/src/mirabuf/MirabufSceneObject.ts index 59e8bb7b89..24989d2874 100644 --- a/fission/src/mirabuf/MirabufSceneObject.ts +++ b/fission/src/mirabuf/MirabufSceneObject.ts @@ -12,7 +12,7 @@ import { LayerReserve } from "@/systems/physics/PhysicsSystem"; import Mechanism from "@/systems/physics/Mechanism"; import SynthesisBrain from "@/systems/simulation/synthesis_brain/SynthesisBrain"; -const DEBUG_BODIES = true; +const DEBUG_BODIES = false; interface RnDebugMeshes { colliderMesh: THREE.Mesh; @@ -64,6 +64,7 @@ class MirabufSceneObject extends SceneObject { World.SimulationSystem.RegisterMechanism(this._mechanism); const simLayer = World.SimulationSystem.GetSimulationLayer(this._mechanism)!; const brain = new SynthesisBrain(this._mechanism); + simLayer.SetBrain(brain); } public Update(): void { diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index 37adc9a2af..0a9f69f8a4 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -19,7 +19,7 @@ const RobotLayers: number[] = [ // Reserved layers for robots. Robot layers have // Please update this accordingly. const COUNT_OBJECT_LAYERS = 10; -const STANDARD_TIME_STEP = 1.0 / 120.0; +export const SIMULATION_PERIOD = 1.0 / 120.0; const STANDARD_SUB_STEPS = 3; /** @@ -53,6 +53,8 @@ class PhysicsSystem extends WorldSystem { this._joltPhysSystem = this._joltInterface.GetPhysicsSystem(); this._joltBodyInterface = this._joltPhysSystem.GetBodyInterface(); + this._joltPhysSystem.SetGravity(new JOLT.Vec3(0, -9.8, 0)); + const ground = this.CreateBox(new THREE.Vector3(5.0, 0.5, 5.0), undefined, new THREE.Vector3(0.0, -2.0, 0.0), undefined); this._joltBodyInterface.AddBody(ground.GetID(), JOLT.EActivation_Activate); } @@ -435,13 +437,14 @@ class PhysicsSystem extends WorldSystem { ); const body = this._joltBodyInterface.CreateBody(bodySettings); this._joltBodyInterface.AddBody(body.GetID(), JOLT.EActivation_Activate); + body.SetAllowSleeping(false); rnToBodies.set(rn.id, body.GetID()); // Little testing components body.SetRestitution(0.4); - const angVelocity = new JOLT.Vec3(0, 3, 0); - body.SetAngularVelocity(angVelocity); - JOLT.destroy(angVelocity); + // const angVelocity = new JOLT.Vec3(0, 3, 0); + // body.SetAngularVelocity(angVelocity); + // JOLT.destroy(angVelocity); } // Cleanup @@ -541,7 +544,7 @@ class PhysicsSystem extends WorldSystem { } public Update(_: number): void { - this._joltInterface.Step(STANDARD_TIME_STEP, STANDARD_SUB_STEPS); + this._joltInterface.Step(SIMULATION_PERIOD, STANDARD_SUB_STEPS); } public Destroy(): void { diff --git a/fission/src/systems/simulation/Driver.ts b/fission/src/systems/simulation/Driver.ts deleted file mode 100644 index ee95e833d3..0000000000 --- a/fission/src/systems/simulation/Driver.ts +++ /dev/null @@ -1,5 +0,0 @@ -abstract class Driver { - -} - -export default Driver; \ No newline at end of file diff --git a/fission/src/systems/simulation/SimulationSystem.ts b/fission/src/systems/simulation/SimulationSystem.ts index d3a4ffbc90..d9acb12815 100644 --- a/fission/src/systems/simulation/SimulationSystem.ts +++ b/fission/src/systems/simulation/SimulationSystem.ts @@ -1,8 +1,10 @@ +import JOLT from "@/util/loading/JoltSyncLoader"; import Mechanism from "../physics/Mechanism"; import WorldSystem from "../WorldSystem"; import Brain from "./Brain"; -import Driver from "./Driver"; -import Stimulus from "./Stimulus"; +import Driver from "./driver/Driver"; +import Stimulus from "./stimulus/Stimulus"; +import HingeDriver from "./driver/HingeDriver"; class SimulationSystem extends WorldSystem { @@ -26,7 +28,7 @@ class SimulationSystem extends WorldSystem { } public Update(deltaT: number): void { - this._simMechanisms.forEach(simLayer => simLayer.brain?.Update(deltaT)); + this._simMechanisms.forEach(simLayer => simLayer.Update(deltaT)); } public Destroy(): void { @@ -50,9 +52,23 @@ class SimulationLayer { // Generate standard drivers and stimuli this._drivers = []; + this._mechanism.constraints.forEach(x => { + if (x.constraint.GetSubType() == JOLT.EConstraintSubType_Hinge) { + const hinge = JOLT.castObject(x.constraint, JOLT.HingeConstraint); + const driver = new HingeDriver(hinge); + this._drivers.push(driver); + } + }); + this._stimuli = []; } + public Update(deltaT: number) { + this._brain?.Update(deltaT); + this._drivers.forEach(x => x.Update(deltaT)); + this._stimuli.forEach(x => x.Update(deltaT)); + } + public SetBrain(brain: T | undefined) { if (this._brain) this._brain.Disable(); diff --git a/fission/src/systems/simulation/driver/Driver.ts b/fission/src/systems/simulation/driver/Driver.ts new file mode 100644 index 0000000000..19361c0361 --- /dev/null +++ b/fission/src/systems/simulation/driver/Driver.ts @@ -0,0 +1,5 @@ +abstract class Driver { + public abstract Update(deltaT: number): void; +} + +export default Driver; \ No newline at end of file diff --git a/fission/src/systems/simulation/driver/HingeDriver.ts b/fission/src/systems/simulation/driver/HingeDriver.ts new file mode 100644 index 0000000000..17d81e5c91 --- /dev/null +++ b/fission/src/systems/simulation/driver/HingeDriver.ts @@ -0,0 +1,40 @@ +import Jolt from "@barclah/jolt-physics"; +import Driver from "./Driver"; +import { SIMULATION_PERIOD } from "@/systems/physics/PhysicsSystem"; +import JOLT from "@/util/loading/JoltSyncLoader"; + +class HingeDriver extends Driver { + + private _constraint: Jolt.HingeConstraint; + + public constructor(constraint: Jolt.HingeConstraint) { + super(); + + this._constraint = constraint; + + const motorSettings = this._constraint.GetMotorSettings(); + const springSettings = motorSettings.mSpringSettings; + springSettings.mFrequency = 20 * (1.0 / SIMULATION_PERIOD); + springSettings.mDamping = 0.995; + + motorSettings.mSpringSettings = springSettings; + motorSettings.mMinTorqueLimit = -125.0; + motorSettings.mMaxTorqueLimit = 125.0; + + this._constraint.SetMotorState(JOLT.EMotorState_Velocity); + } + + private _timeAccum = 0; + public Update(deltaT: number): void { + this._timeAccum += deltaT; + const vel = Math.sin(this._timeAccum * 0.8) * 0.5; + console.log(`Ang Vel: ${vel}`); + this._constraint.SetTargetAngularVelocity(vel); + + if (!this._constraint.GetBody2().IsActive()) { + console.log("Asleep"); + } + } +} + +export default HingeDriver; \ No newline at end of file diff --git a/fission/src/systems/simulation/Stimulus.ts b/fission/src/systems/simulation/stimulus/Stimulus.ts similarity index 51% rename from fission/src/systems/simulation/Stimulus.ts rename to fission/src/systems/simulation/stimulus/Stimulus.ts index c52ea23e99..576cf632f8 100644 --- a/fission/src/systems/simulation/Stimulus.ts +++ b/fission/src/systems/simulation/stimulus/Stimulus.ts @@ -1,5 +1,5 @@ abstract class Stimulus { - + public abstract Update(deltaT: number): void; } export default Stimulus; \ No newline at end of file diff --git a/fission/src/systems/simulation/synthesis_brain/Behavior.ts b/fission/src/systems/simulation/synthesis_brain/Behavior.ts index bd52b14e59..0daa06c083 100644 --- a/fission/src/systems/simulation/synthesis_brain/Behavior.ts +++ b/fission/src/systems/simulation/synthesis_brain/Behavior.ts @@ -1,5 +1,5 @@ -import Driver from "../Driver"; -import Stimulus from "../Stimulus"; +import Driver from "../driver/Driver"; +import Stimulus from "../stimulus/Stimulus"; abstract class Behavior { diff --git a/fission/src/systems/simulation/synthesis_brain/SynthesisBrain.ts b/fission/src/systems/simulation/synthesis_brain/SynthesisBrain.ts index 3674f74ee6..d17a1e993f 100644 --- a/fission/src/systems/simulation/synthesis_brain/SynthesisBrain.ts +++ b/fission/src/systems/simulation/synthesis_brain/SynthesisBrain.ts @@ -10,12 +10,8 @@ class SynthesisBrain extends Brain { super(mechanism); } - public Update(deltaT: number): void { - throw new Error("Method not implemented."); - } - public Enable(): void { - throw new Error("Method not implemented."); - } + public Update(_: number): void { } + public Enable(): void { } public Disable(): void { this._behaviors = []; } From aa80f74e7e9df55a134798114a383a9867bb675f Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Sat, 30 Mar 2024 21:47:16 -0600 Subject: [PATCH 04/17] Experimenting with wheels --- fission/src/systems/physics/PhysicsSystem.ts | 42 ++++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index 0a9f69f8a4..9bd5bd8e2c 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -344,6 +344,48 @@ class PhysicsSystem extends WorldSystem { // return JOLT.castObject(constraint, JOLT.SliderConstraint); } + + public CreateWheelConstraint( + jointInstance: mirabuf.joint.JointInstance, jointDefinition: mirabuf.joint.Joint, + bodyA: Jolt.Body, bodyB: Jolt.Body, versionNum: number): [Jolt.TwoBodyConstraint, Jolt.VehicleConstraint] { + // HINGE CONSTRAINT + const fixedSettings = new JOLT.FixedConstraintSettings(); + + const jointOrigin = jointDefinition.origin + ? MirabufVector3_JoltVec3(jointDefinition.origin as mirabuf.Vector3) + : new JOLT.Vec3(0, 0, 0); + // TODO: Offset transformation for robot builder. + const jointOriginOffset = jointInstance.offset + ? MirabufVector3_JoltVec3(jointInstance.offset as mirabuf.Vector3) + : new JOLT.Vec3(0, 0, 0); + + const anchorPoint = jointOrigin.Add(jointOriginOffset); + fixedSettings.mPoint1 = fixedSettings.mPoint2 = anchorPoint; + + const rotationalFreedom = jointDefinition.rotational!.rotationalFreedom!; + + const miraAxis = rotationalFreedom.axis! as mirabuf.Vector3; + let axis: Jolt.Vec3; + // No scaling, these are unit vectors + if (versionNum < 5) { + axis = new JOLT.Vec3(-miraAxis.x ?? 0, miraAxis.y ?? 0, miraAxis.z! ?? 0); + } else { + axis = new JOLT.Vec3(miraAxis.x! ?? 0, miraAxis.y! ?? 0, miraAxis.z! ?? 0); + } + + // Assigned Axes + // hingeConstraintSettings.mHingeAxis1 = hingeConstraintSettings.mHingeAxis2 + // = axis.Normalized(); + // hingeConstraintSettings.mNormalAxis1 = hingeConstraintSettings.mNormalAxis2 + // = getPerpendicular(hingeConstraintSettings.mHingeAxis1); + + const fixedConstraint = JOLT.castObject(fixedSettings.Create(bodyA, bodyB), JOLT.TwoBodyConstraint); + + const wheelSettings = new JOLT.WheelSettings(); + + const vehicleSettings = new JOLT.VehicleConstraintSettings(); + } + /** * Creates a map, mapping the name of RigidNodes to Jolt BodyIDs * From 368d7dfb773cda9f890974824caddd9228c06c5b Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Tue, 2 Apr 2024 16:53:14 -0600 Subject: [PATCH 05/17] Well its not throwing an error, but it isn't working either --- fission/package-lock.json | 16 +++---- fission/package.json | 2 +- fission/src/systems/physics/PhysicsSystem.ts | 44 ++++++++++++++++++-- 3 files changed, 50 insertions(+), 12 deletions(-) diff --git a/fission/package-lock.json b/fission/package-lock.json index b96a67ab3c..8ec835d1af 100644 --- a/fission/package-lock.json +++ b/fission/package-lock.json @@ -1,14 +1,14 @@ { - "name": "vite-proj", - "version": "0.0.0", + "name": "synthesis-fission", + "version": "0.0.1", "lockfileVersion": 3, "requires": true, "packages": { "": { - "name": "vite-proj", - "version": "0.0.0", + "name": "synthesis-fission", + "version": "0.0.1", "dependencies": { - "@barclah/jolt-physics": "^0.19.1", + "@barclah/jolt-physics": "^0.19.3", "@react-three/drei": "^9.96.5", "@react-three/fiber": "^8.15.15", "colord": "^2.9.3", @@ -615,9 +615,9 @@ } }, "node_modules/@barclah/jolt-physics": { - "version": "0.19.1", - "resolved": "https://registry.npmjs.org/@barclah/jolt-physics/-/jolt-physics-0.19.1.tgz", - "integrity": "sha512-bUqUovgZrGb3JEuylX7BXbfBdXu5RXhEWoS/+mALzvh8aO4VhMBBaQuBt/HF05IZLQLkZ584EBkwPBHmNfyOOQ==" + "version": "0.19.3", + "resolved": "https://registry.npmjs.org/@barclah/jolt-physics/-/jolt-physics-0.19.3.tgz", + "integrity": "sha512-J74f6brh/aYqox9ACcY7K77Y5bFDBrH5UVH2aN0w1n6BzAS5RCO0NN+SHepNmdcc6PhP/74M2MwjeeLHHm++PQ==" }, "node_modules/@emotion/babel-plugin": { "version": "11.11.0", diff --git a/fission/package.json b/fission/package.json index 38bbaad6af..c9279294a7 100644 --- a/fission/package.json +++ b/fission/package.json @@ -15,7 +15,7 @@ "format": "npm run prettier:fix && npm run lint:fix" }, "dependencies": { - "@barclah/jolt-physics": "^0.19.1", + "@barclah/jolt-physics": "^0.19.3", "@react-three/drei": "^9.96.5", "@react-three/fiber": "^8.15.15", "colord": "^2.9.3", diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index 9bd5bd8e2c..dafb96b2a5 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -200,7 +200,10 @@ class PhysicsSystem extends WorldSystem { switch (jDef.jointMotionType!) { case mirabuf.joint.JointMotion.REVOLUTE: - constraint = this.CreateHingeConstraint(jInst, jDef, bodyA, bodyB, parser.assembly.info!.version!); + if (this.IsWheel(jDef)) + constraint = this.CreateWheelConstraint(jInst, jDef, bodyA, bodyB, parser.assembly.info!.version!)[1]; + else + constraint = this.CreateHingeConstraint(jInst, jDef, bodyA, bodyB, parser.assembly.info!.version!); break; case mirabuf.joint.JointMotion.SLIDER: constraint = this.CreateSliderConstraint(jInst, jDef, bodyA, bodyB); @@ -379,11 +382,46 @@ class PhysicsSystem extends WorldSystem { // hingeConstraintSettings.mNormalAxis1 = hingeConstraintSettings.mNormalAxis2 // = getPerpendicular(hingeConstraintSettings.mHingeAxis1); + const wheelSettings = new JOLT.WheelSettingsWV(); + wheelSettings.mPosition = new JOLT.Vec3(0, 0, 0); + wheelSettings.mMaxSteerAngle = 1.0; + wheelSettings.mMaxHandBrakeTorque = 0.0; + wheelSettings.mRadius = 0.102; + wheelSettings.mWidth = 0.05; + // wheelSettings.mSuspensionMinLength = 0; + // wheelSettings.mSuspensionMaxLength = 0; + + const vehicleSettings = new JOLT.VehicleConstraintSettings(); + + vehicleSettings.mWheels.clear(); + vehicleSettings.mWheels.push_back(wheelSettings); + + const controllerSettings = new JOLT.WheeledVehicleControllerSettings(); + controllerSettings.mEngine.mMaxTorque = 500.0; + controllerSettings.mTransmission.mClutchStrength = 10.0; + vehicleSettings.mController = controllerSettings; + + controllerSettings.mDifferentials.clear(); + vehicleSettings.mAntiRollBars.clear(); + + console.log("Before creating contraint"); + const vehicleConstraint = new JOLT.VehicleConstraint(bodyB, vehicleSettings); + console.log("After creating constraint"); + const fixedConstraint = JOLT.castObject(fixedSettings.Create(bodyA, bodyB), JOLT.TwoBodyConstraint); - const wheelSettings = new JOLT.WheelSettings(); + - const vehicleSettings = new JOLT.VehicleConstraintSettings(); + // const helper = new JOLT.SynthesisHelper(); + + + + this._constraints.push(fixedConstraint, vehicleConstraint); + return [fixedConstraint, vehicleConstraint]; + } + + private IsWheel(jDef: mirabuf.joint.Joint) { + return (jDef.info!.name! != 'grounded') && (jDef.userData) && ((new Map(Object.entries(jDef.userData.data!)).get('wheel') ?? 'false') == 'true') } /** From 223e107ab07e672bffebbe470840a983b811f249 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Sat, 6 Apr 2024 13:25:47 -0600 Subject: [PATCH 06/17] Wheels are existing? --- fission/src/systems/physics/PhysicsSystem.ts | 20 ++++++--------- .../systems/simulation/SimulationSystem.ts | 5 ++++ .../systems/simulation/driver/HingeDriver.ts | 8 +++--- .../systems/simulation/driver/WheelDriver.ts | 25 +++++++++++++++++++ 4 files changed, 41 insertions(+), 17 deletions(-) create mode 100644 fission/src/systems/simulation/driver/WheelDriver.ts diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index dafb96b2a5..3435019e88 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -350,7 +350,7 @@ class PhysicsSystem extends WorldSystem { public CreateWheelConstraint( jointInstance: mirabuf.joint.JointInstance, jointDefinition: mirabuf.joint.Joint, - bodyA: Jolt.Body, bodyB: Jolt.Body, versionNum: number): [Jolt.TwoBodyConstraint, Jolt.VehicleConstraint] { + bodyA: Jolt.Body, bodyB: Jolt.Body, versionNum: number): [Jolt.Constraint, Jolt.VehicleConstraint] { // HINGE CONSTRAINT const fixedSettings = new JOLT.FixedConstraintSettings(); @@ -386,10 +386,10 @@ class PhysicsSystem extends WorldSystem { wheelSettings.mPosition = new JOLT.Vec3(0, 0, 0); wheelSettings.mMaxSteerAngle = 1.0; wheelSettings.mMaxHandBrakeTorque = 0.0; - wheelSettings.mRadius = 0.102; - wheelSettings.mWidth = 0.05; - // wheelSettings.mSuspensionMinLength = 0; - // wheelSettings.mSuspensionMaxLength = 0; + wheelSettings.mRadius = 2; + wheelSettings.mWidth = 0.2; + wheelSettings.mSuspensionMinLength = 0.1; + wheelSettings.mSuspensionMaxLength = 0.2; const vehicleSettings = new JOLT.VehicleConstraintSettings(); @@ -404,17 +404,11 @@ class PhysicsSystem extends WorldSystem { controllerSettings.mDifferentials.clear(); vehicleSettings.mAntiRollBars.clear(); - console.log("Before creating contraint"); const vehicleConstraint = new JOLT.VehicleConstraint(bodyB, vehicleSettings); - console.log("After creating constraint"); - const fixedConstraint = JOLT.castObject(fixedSettings.Create(bodyA, bodyB), JOLT.TwoBodyConstraint); - - - // const helper = new JOLT.SynthesisHelper(); - - + this._joltPhysSystem.AddConstraint(vehicleConstraint); + this._joltPhysSystem.AddConstraint(fixedConstraint); this._constraints.push(fixedConstraint, vehicleConstraint); return [fixedConstraint, vehicleConstraint]; diff --git a/fission/src/systems/simulation/SimulationSystem.ts b/fission/src/systems/simulation/SimulationSystem.ts index d9acb12815..e95aee6acc 100644 --- a/fission/src/systems/simulation/SimulationSystem.ts +++ b/fission/src/systems/simulation/SimulationSystem.ts @@ -5,6 +5,7 @@ import Brain from "./Brain"; import Driver from "./driver/Driver"; import Stimulus from "./stimulus/Stimulus"; import HingeDriver from "./driver/HingeDriver"; +import WheelDriver from "./driver/WheelDriver"; class SimulationSystem extends WorldSystem { @@ -57,6 +58,10 @@ class SimulationLayer { const hinge = JOLT.castObject(x.constraint, JOLT.HingeConstraint); const driver = new HingeDriver(hinge); this._drivers.push(driver); + } else if (x.constraint.GetSubType() == JOLT.EConstraintSubType_Vehicle) { + const vehicle = JOLT.castObject(x.constraint, JOLT.VehicleConstraint); + const driver = new WheelDriver(vehicle); + this._drivers.push(driver); } }); diff --git a/fission/src/systems/simulation/driver/HingeDriver.ts b/fission/src/systems/simulation/driver/HingeDriver.ts index 17d81e5c91..772bbf7f60 100644 --- a/fission/src/systems/simulation/driver/HingeDriver.ts +++ b/fission/src/systems/simulation/driver/HingeDriver.ts @@ -28,12 +28,12 @@ class HingeDriver extends Driver { public Update(deltaT: number): void { this._timeAccum += deltaT; const vel = Math.sin(this._timeAccum * 0.8) * 0.5; - console.log(`Ang Vel: ${vel}`); + // console.log(`Ang Vel: ${vel}`); this._constraint.SetTargetAngularVelocity(vel); - if (!this._constraint.GetBody2().IsActive()) { - console.log("Asleep"); - } + // if (!this._constraint.GetBody2().IsActive()) { + // console.log("Asleep"); + // } } } diff --git a/fission/src/systems/simulation/driver/WheelDriver.ts b/fission/src/systems/simulation/driver/WheelDriver.ts new file mode 100644 index 0000000000..972c8f3e94 --- /dev/null +++ b/fission/src/systems/simulation/driver/WheelDriver.ts @@ -0,0 +1,25 @@ +import Jolt from "@barclah/jolt-physics"; +import Driver from "./Driver"; +import { SIMULATION_PERIOD } from "@/systems/physics/PhysicsSystem"; +import JOLT from "@/util/loading/JoltSyncLoader"; + +class WheelDriver extends Driver { + + private _constraint: Jolt.VehicleConstraint; + private _controller: Jolt.WheeledVehicleController; + + public constructor(constraint: Jolt.VehicleConstraint) { + super(); + + this._constraint = constraint; + + this._controller = JOLT.castObject(this._constraint.GetController(), JOLT.WheeledVehicleController); + } + + private _timeAccum = 0; + public Update(deltaT: number): void { + this._controller.SetForwardInput(50); + } +} + +export default WheelDriver; \ No newline at end of file From f67426e2a009f3bd66d74a3bfb5cacebd87639f5 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Sat, 6 Apr 2024 16:35:59 -0600 Subject: [PATCH 07/17] Wheels still aren't colliding --- fission/src/systems/physics/PhysicsSystem.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index 3435019e88..cd3f266d87 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -407,6 +407,10 @@ class PhysicsSystem extends WorldSystem { const vehicleConstraint = new JOLT.VehicleConstraint(bodyB, vehicleSettings); const fixedConstraint = JOLT.castObject(fixedSettings.Create(bodyA, bodyB), JOLT.TwoBodyConstraint); + // Wheel Collision Tester + const tester = new JOLT.VehicleCollisionTesterCastSphere(LAYER_GENERAL_DYNAMIC, 1); + vehicleConstraint.SetVehicleCollisionTester(tester); + this._joltPhysSystem.AddConstraint(vehicleConstraint); this._joltPhysSystem.AddConstraint(fixedConstraint); From f1d1cee69201be13803bfc67efd23f006f1726d8 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Sat, 6 Apr 2024 17:18:55 -0600 Subject: [PATCH 08/17] Love finding all the little issues with physics engines --- fission/src/systems/physics/PhysicsSystem.ts | 21 ++++++++++++++++---- 1 file changed, 17 insertions(+), 4 deletions(-) diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index cd3f266d87..b54fed775a 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -383,10 +383,10 @@ class PhysicsSystem extends WorldSystem { // = getPerpendicular(hingeConstraintSettings.mHingeAxis1); const wheelSettings = new JOLT.WheelSettingsWV(); - wheelSettings.mPosition = new JOLT.Vec3(0, 0, 0); - wheelSettings.mMaxSteerAngle = 1.0; + wheelSettings.mPosition = new JOLT.Vec3(0, -0.1, 0); + wheelSettings.mMaxSteerAngle = 0.0; wheelSettings.mMaxHandBrakeTorque = 0.0; - wheelSettings.mRadius = 2; + wheelSettings.mRadius = 0.4; wheelSettings.mWidth = 0.2; wheelSettings.mSuspensionMinLength = 0.1; wheelSettings.mSuspensionMaxLength = 0.2; @@ -408,9 +408,22 @@ class PhysicsSystem extends WorldSystem { const fixedConstraint = JOLT.castObject(fixedSettings.Create(bodyA, bodyB), JOLT.TwoBodyConstraint); // Wheel Collision Tester - const tester = new JOLT.VehicleCollisionTesterCastSphere(LAYER_GENERAL_DYNAMIC, 1); + const tester = new JOLT.VehicleCollisionTesterRay(LAYER_GENERAL_DYNAMIC); vehicleConstraint.SetVehicleCollisionTester(tester); + + // const callbacks = new JOLT.VehicleConstraintCallbacksJS(); + // callbacks.GetCombinedFriction = (wheelIndex, tireFrictionDirection, tireFriction, body2, subShapeID2) => { + // const b = JOLT.wrapPointer(body2, Jolt.Body); + // return Math.sqrt(tireFriction * b.GetFriction()); // This is the default calculation + // }; + // callbacks.OnPreStepCallback = (vehicle, deltaTime, physicsSystem) => { }; + // callbacks.OnPostCollideCallback = (vehicle, deltaTime, physicsSystem) => { console.log('Collision'); }; + // callbacks.OnPostStepCallback = (vehicle, deltaTime, physicsSystem) => { }; + // JOLT.castObject(callbacks, JOLT.VehicleConstraintCallbacksEm).SetVehicleConstraint(vehicleConstraint); + this._joltPhysSystem.AddStepListener(new JOLT.VehicleConstraintStepListener(vehicleConstraint)); + + this._joltPhysSystem.AddConstraint(vehicleConstraint); this._joltPhysSystem.AddConstraint(fixedConstraint); From e028245b90b2f238ff2f3dfe8514181cc7159c8d Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Sat, 6 Apr 2024 18:01:53 -0600 Subject: [PATCH 09/17] Little tweaks --- fission/src/systems/physics/PhysicsSystem.ts | 16 ++++++++-------- .../src/systems/simulation/driver/WheelDriver.ts | 5 ++++- 2 files changed, 12 insertions(+), 9 deletions(-) diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index b54fed775a..b95fa0dabc 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -371,9 +371,9 @@ class PhysicsSystem extends WorldSystem { let axis: Jolt.Vec3; // No scaling, these are unit vectors if (versionNum < 5) { - axis = new JOLT.Vec3(-miraAxis.x ?? 0, miraAxis.y ?? 0, miraAxis.z! ?? 0); + axis = new JOLT.Vec3(-miraAxis.x ?? 0, miraAxis.y ?? 0, miraAxis.z ?? 0); } else { - axis = new JOLT.Vec3(miraAxis.x! ?? 0, miraAxis.y! ?? 0, miraAxis.z! ?? 0); + axis = new JOLT.Vec3(miraAxis.x ?? 0, miraAxis.y ?? 0, miraAxis.z ?? 0); } // Assigned Axes @@ -383,13 +383,13 @@ class PhysicsSystem extends WorldSystem { // = getPerpendicular(hingeConstraintSettings.mHingeAxis1); const wheelSettings = new JOLT.WheelSettingsWV(); - wheelSettings.mPosition = new JOLT.Vec3(0, -0.1, 0); + wheelSettings.mPosition = anchorPoint; wheelSettings.mMaxSteerAngle = 0.0; wheelSettings.mMaxHandBrakeTorque = 0.0; - wheelSettings.mRadius = 0.4; + wheelSettings.mRadius = 0.1; wheelSettings.mWidth = 0.2; - wheelSettings.mSuspensionMinLength = 0.1; - wheelSettings.mSuspensionMaxLength = 0.2; + wheelSettings.mSuspensionMinLength = 0.00003; + wheelSettings.mSuspensionMaxLength = 0.00006; const vehicleSettings = new JOLT.VehicleConstraintSettings(); @@ -408,7 +408,7 @@ class PhysicsSystem extends WorldSystem { const fixedConstraint = JOLT.castObject(fixedSettings.Create(bodyA, bodyB), JOLT.TwoBodyConstraint); // Wheel Collision Tester - const tester = new JOLT.VehicleCollisionTesterRay(LAYER_GENERAL_DYNAMIC); + const tester = new JOLT.VehicleCollisionTesterCastCylinder(bodyB.GetObjectLayer(), 0.05); vehicleConstraint.SetVehicleCollisionTester(tester); @@ -423,7 +423,7 @@ class PhysicsSystem extends WorldSystem { // JOLT.castObject(callbacks, JOLT.VehicleConstraintCallbacksEm).SetVehicleConstraint(vehicleConstraint); this._joltPhysSystem.AddStepListener(new JOLT.VehicleConstraintStepListener(vehicleConstraint)); - + this._joltPhysSystem.AddConstraint(vehicleConstraint); this._joltPhysSystem.AddConstraint(fixedConstraint); diff --git a/fission/src/systems/simulation/driver/WheelDriver.ts b/fission/src/systems/simulation/driver/WheelDriver.ts index 972c8f3e94..d92f0d5b93 100644 --- a/fission/src/systems/simulation/driver/WheelDriver.ts +++ b/fission/src/systems/simulation/driver/WheelDriver.ts @@ -18,7 +18,10 @@ class WheelDriver extends Driver { private _timeAccum = 0; public Update(deltaT: number): void { - this._controller.SetForwardInput(50); + this._controller.SetDriverInput(1.0, 0.0, 0.0, 0.0); + if (!this._constraint.GetVehicleBody().IsActive()) { + console.log("Asleep"); + } } } From 26cb1affd28dfa8f95e17a457f06ed3e003e84a4 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Mon, 8 Apr 2024 23:42:07 -0600 Subject: [PATCH 10/17] Better I think? --- fission/package-lock.json | 2036 +++++++++-------- fission/src/systems/physics/PhysicsSystem.ts | 37 +- .../systems/simulation/SimulationSystem.ts | 5 + .../systems/simulation/driver/HingeDriver.ts | 6 +- .../systems/simulation/driver/SliderDriver.ts | 44 + .../systems/simulation/driver/WheelDriver.ts | 10 +- 6 files changed, 1213 insertions(+), 925 deletions(-) create mode 100644 fission/src/systems/simulation/driver/SliderDriver.ts diff --git a/fission/package-lock.json b/fission/package-lock.json index 8ec835d1af..59ecd18dbb 100644 --- a/fission/package-lock.json +++ b/fission/package-lock.json @@ -87,113 +87,42 @@ } }, "node_modules/@babel/code-frame": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz", - "integrity": "sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", + "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", "dev": true, "dependencies": { - "@babel/highlight": "^7.23.4", - "chalk": "^2.4.2" + "@babel/highlight": "^7.24.2", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/code-frame/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/code-frame/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/code-frame/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/code-frame/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/code-frame/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/compat-data": { - "version": "7.23.5", - "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz", - "integrity": "sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.4.tgz", + "integrity": "sha512-vg8Gih2MLK+kOkHJp4gBEIkyaIi00jgWot2D9QOmmfLC8jINSOzmCLta6Bvz/JSBCqnegV0L80jhxkol5GWNfQ==", "dev": true, "engines": { "node": ">=6.9.0" } }, "node_modules/@babel/core": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.0.tgz", - "integrity": "sha512-fQfkg0Gjkza3nf0c7/w6Xf34BW4YvzNfACRLmmb7XRLa6XHdR+K9AlJlxneFfWYf6uhOzuzZVTjF/8KfndZANw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.4.tgz", + "integrity": "sha512-MBVlMXP+kkl5394RBLSxxk/iLTeVGuXTV3cIDXavPpMMqnSnt6apKgan/U8O3USWZCWZT/TbgfEpKa4uMgN4Dg==", "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.2", + "@babel/generator": "^7.24.4", "@babel/helper-compilation-targets": "^7.23.6", "@babel/helper-module-transforms": "^7.23.3", - "@babel/helpers": "^7.24.0", - "@babel/parser": "^7.24.0", + "@babel/helpers": "^7.24.4", + "@babel/parser": "^7.24.4", "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0", "convert-source-map": "^2.0.0", "debug": "^4.1.0", @@ -225,14 +154,14 @@ } }, "node_modules/@babel/generator": { - "version": "7.23.6", - "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.23.6.tgz", - "integrity": "sha512-qrSfCYxYQB5owCmGLbl8XRpX1ytXlpueOb0N0UmQwA073KZxejgQTzAmJezxvpwQD9uGtK2shHdi55QT+MbjIw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.4.tgz", + "integrity": "sha512-Xd6+v6SnjWVx/nus+y0l1sxMOTOMBkyL4+BIdbALyatQnAe/SRVjANeDPSCYaX+i1iJmuGSKf3Z+E+V/va1Hvw==", "dev": true, "dependencies": { - "@babel/types": "^7.23.6", - "@jridgewell/gen-mapping": "^0.3.2", - "@jridgewell/trace-mapping": "^0.3.17", + "@babel/types": "^7.24.0", + "@jridgewell/gen-mapping": "^0.3.5", + "@jridgewell/trace-mapping": "^0.3.25", "jsesc": "^2.5.1" }, "engines": { @@ -255,15 +184,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/lru-cache": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", - "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, - "dependencies": { - "yallist": "^3.0.2" - } - }, "node_modules/@babel/helper-compilation-targets/node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -273,12 +193,6 @@ "semver": "bin/semver.js" } }, - "node_modules/@babel/helper-compilation-targets/node_modules/yallist": { - "version": "3.1.1", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true - }, "node_modules/@babel/helper-environment-visitor": { "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", @@ -314,12 +228,12 @@ } }, "node_modules/@babel/helper-module-imports": { - "version": "7.22.15", - "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.22.15.tgz", - "integrity": "sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==", + "version": "7.24.3", + "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", + "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", "dev": true, "dependencies": { - "@babel/types": "^7.22.15" + "@babel/types": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -378,9 +292,9 @@ } }, "node_modules/@babel/helper-string-parser": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.23.4.tgz", - "integrity": "sha512-803gmbQdqwdf4olxrX4AJyFBV/RTr3rSmOj0rKwesmzlfhYNDEs+/iOcznzpNWlJlIlTJC2QfPFcHB6DlzdVLQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", + "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", "dev": true, "engines": { "node": ">=6.9.0" @@ -405,13 +319,13 @@ } }, "node_modules/@babel/helpers": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.0.tgz", - "integrity": "sha512-ulDZdc0Aj5uLc5nETsa7EPx2L7rM0YJM8r7ck7U73AXi7qOV44IHHRAYZHY6iU1rr3C5N4NtTmMRUJP6kwCWeA==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.4.tgz", + "integrity": "sha512-FewdlZbSiwaVGlgT1DPANDuCHaDMiOo+D/IDYRFYjHOuv66xMSJ7fQwwODwRNAPkADIO/z1EoF/l2BCWlWABDw==", "dev": true, "dependencies": { "@babel/template": "^7.24.0", - "@babel/traverse": "^7.24.0", + "@babel/traverse": "^7.24.1", "@babel/types": "^7.24.0" }, "engines": { @@ -419,94 +333,24 @@ } }, "node_modules/@babel/highlight": { - "version": "7.23.4", - "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.23.4.tgz", - "integrity": "sha512-acGdbYSfp2WheJoJm/EBBBLh/ID8KDc64ISZ9DYtBmC8/Q204PZJLHyzeB5qMzJ5trcOkybd78M4x2KWsUq++A==", + "version": "7.24.2", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", + "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", - "js-tokens": "^4.0.0" + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" }, "engines": { "node": ">=6.9.0" } }, - "node_modules/@babel/highlight/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "dev": true, - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/@babel/highlight/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "dev": true - }, - "node_modules/@babel/highlight/node_modules/escape-string-regexp": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", - "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/@babel/highlight/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/@babel/highlight/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/parser": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.0.tgz", - "integrity": "sha512-QuP/FxEAzMSjXygs8v4N9dvdXzEHN4W1oF3PxuWAtPo08UdM17u89RDMgjLn/mlc56iM0HlLmVkO/wgR+rDgHg==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.4.tgz", + "integrity": "sha512-zTvEBcghmeBma9QIGunWevvBAp4/Qu9Bdq+2k0Ot4fVMD6v3dsC9WOcRSKk7tRRyBM/53yKMJko9xOatGQAwSg==", "dev": true, "bin": { "parser": "bin/babel-parser.js" @@ -516,12 +360,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-self": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.23.3.tgz", - "integrity": "sha512-qXRvbeKDSfwnlJnanVRp0SfuWE5DQhwQr5xtLBzp56Wabyo+4CMosF6Kfp+eOD/4FYpql64XVJ2W0pVLlJZxOQ==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-self/-/plugin-transform-react-jsx-self-7.24.1.tgz", + "integrity": "sha512-kDJgnPujTmAZ/9q2CN4m2/lRsUUPDvsG3+tSHWUJIzMGTt5U/b/fwWd3RO3n+5mjLrsBrVa5eKFRVSQbi3dF1w==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -531,12 +375,12 @@ } }, "node_modules/@babel/plugin-transform-react-jsx-source": { - "version": "7.23.3", - "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.23.3.tgz", - "integrity": "sha512-91RS0MDnAWDNvGC6Wio5XYkyWI39FMFO+JK9+4AlgaTH+yWwVTsw7/sn6LK0lH7c5F+TFkpv/3LfCJ1Ydwof/g==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/plugin-transform-react-jsx-source/-/plugin-transform-react-jsx-source-7.24.1.tgz", + "integrity": "sha512-1v202n7aUq4uXAieRTKcwPzNyphlCuqHHDcdSNc+vdhoTEZcFMh+L5yZuCmGaIO7bs1nJUNfHB89TZyoL48xNA==", "dev": true, "dependencies": { - "@babel/helper-plugin-utils": "^7.22.5" + "@babel/helper-plugin-utils": "^7.24.0" }, "engines": { "node": ">=6.9.0" @@ -546,9 +390,9 @@ } }, "node_modules/@babel/runtime": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.0.tgz", - "integrity": "sha512-Chk32uHMg6TnQdvw2e9IlqPpFX/6NLuK0Ys2PqLb7/gL5uFn9mXvK715FGLlOLQrcO4qIkNHkvPGktzzXexsFw==", + "version": "7.24.4", + "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz", + "integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==", "dependencies": { "regenerator-runtime": "^0.14.0" }, @@ -571,18 +415,18 @@ } }, "node_modules/@babel/traverse": { - "version": "7.24.0", - "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.0.tgz", - "integrity": "sha512-HfuJlI8qq3dEDmNU5ChzzpZRWq+oxCZQyMzIMEqLho+AQnhMnKQUzH6ydo3RBl/YjPCuk68Y6s0Gx0AeyULiWw==", + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", + "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", "dev": true, "dependencies": { - "@babel/code-frame": "^7.23.5", - "@babel/generator": "^7.23.6", + "@babel/code-frame": "^7.24.1", + "@babel/generator": "^7.24.1", "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-function-name": "^7.23.0", "@babel/helper-hoist-variables": "^7.22.5", "@babel/helper-split-export-declaration": "^7.22.6", - "@babel/parser": "^7.24.0", + "@babel/parser": "^7.24.1", "@babel/types": "^7.24.0", "debug": "^4.3.1", "globals": "^11.1.0" @@ -591,15 +435,6 @@ "node": ">=6.9.0" } }, - "node_modules/@babel/traverse/node_modules/globals": { - "version": "11.12.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", - "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, - "engines": { - "node": ">=4" - } - }, "node_modules/@babel/types": { "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", @@ -697,9 +532,9 @@ } }, "node_modules/@emotion/serialize": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.3.tgz", - "integrity": "sha512-iD4D6QVZFDhcbH0RAG1uVu1CwVLMWUkCvAqqlewO/rxf8+87yIBAlt4+AxMiiKPLs5hFc0owNk/sLLAOROw3cA==", + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", "dev": true, "dependencies": { "@emotion/hash": "^0.9.1", @@ -716,15 +551,15 @@ "dev": true }, "node_modules/@emotion/styled": { - "version": "11.11.0", - "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.0.tgz", - "integrity": "sha512-hM5Nnvu9P3midq5aaXj4I+lnSfNi7Pmd4EWk1fOZ3pxookaQTNew6bp4JaCBYM4HVFZF9g7UjJmsUmC2JlxOng==", + "version": "11.11.5", + "resolved": "https://registry.npmjs.org/@emotion/styled/-/styled-11.11.5.tgz", + "integrity": "sha512-/ZjjnaNKvuMPxcIiUkf/9SHoG4Q196DRl1w82hQ3WCsjo1IUR8uaGWrC6a87CrYAW0Kb/pK7hk8BnLgLRi9KoQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.18.3", "@emotion/babel-plugin": "^11.11.0", - "@emotion/is-prop-valid": "^1.2.1", - "@emotion/serialize": "^1.1.2", + "@emotion/is-prop-valid": "^1.2.2", + "@emotion/serialize": "^1.1.4", "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", "@emotion/utils": "^1.2.1" }, @@ -766,9 +601,9 @@ "dev": true }, "node_modules/@esbuild/aix-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.19.12.tgz", - "integrity": "sha512-bmoCYyWdEL3wDQIVbcyzRyeKLgk2WtWLTWz1ZIAZF/EGbNOwSA6ew3PftJ1PqMiOOGu0OyFMzG53L0zqIpPeNA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.20.2.tgz", + "integrity": "sha512-D+EBOJHXdNZcLJRBkhENNG8Wji2kgc9AZ9KiPr1JuZjsNtyHzrsfLRrY0tk2H2aoFu6RANO1y1iPPUCDYWkb5g==", "cpu": [ "ppc64" ], @@ -782,9 +617,9 @@ } }, "node_modules/@esbuild/android-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.19.12.tgz", - "integrity": "sha512-qg/Lj1mu3CdQlDEEiWrlC4eaPZ1KztwGJ9B6J+/6G+/4ewxJg7gqj8eVYWvao1bXrqGiW2rsBZFSX3q2lcW05w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.20.2.tgz", + "integrity": "sha512-t98Ra6pw2VaDhqNWO2Oph2LXbz/EJcnLmKLGBJwEwXX/JAN83Fym1rU8l0JUWK6HkIbWONCSSatf4sf2NBRx/w==", "cpu": [ "arm" ], @@ -798,9 +633,9 @@ } }, "node_modules/@esbuild/android-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.19.12.tgz", - "integrity": "sha512-P0UVNGIienjZv3f5zq0DP3Nt2IE/3plFzuaS96vihvD0Hd6H/q4WXUGpCxD/E8YrSXfNyRPbpTq+T8ZQioSuPA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.20.2.tgz", + "integrity": "sha512-mRzjLacRtl/tWU0SvD8lUEwb61yP9cqQo6noDZP/O8VkwafSYwZ4yWy24kan8jE/IMERpYncRt2dw438LP3Xmg==", "cpu": [ "arm64" ], @@ -814,9 +649,9 @@ } }, "node_modules/@esbuild/android-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.19.12.tgz", - "integrity": "sha512-3k7ZoUW6Q6YqhdhIaq/WZ7HwBpnFBlW905Fa4s4qWJyiNOgT1dOqDiVAQFwBH7gBRZr17gLrlFCRzF6jFh7Kew==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.20.2.tgz", + "integrity": "sha512-btzExgV+/lMGDDa194CcUQm53ncxzeBrWJcncOBxuC6ndBkKxnHdFJn86mCIgTELsooUmwUm9FkhSp5HYu00Rg==", "cpu": [ "x64" ], @@ -830,9 +665,9 @@ } }, "node_modules/@esbuild/darwin-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.19.12.tgz", - "integrity": "sha512-B6IeSgZgtEzGC42jsI+YYu9Z3HKRxp8ZT3cqhvliEHovq8HSX2YX8lNocDn79gCKJXOSaEot9MVYky7AKjCs8g==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.20.2.tgz", + "integrity": "sha512-4J6IRT+10J3aJH3l1yzEg9y3wkTDgDk7TSDFX+wKFiWjqWp/iCfLIYzGyasx9l0SAFPT1HwSCR+0w/h1ES/MjA==", "cpu": [ "arm64" ], @@ -846,9 +681,9 @@ } }, "node_modules/@esbuild/darwin-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.19.12.tgz", - "integrity": "sha512-hKoVkKzFiToTgn+41qGhsUJXFlIjxI/jSYeZf3ugemDYZldIXIxhvwN6erJGlX4t5h417iFuheZ7l+YVn05N3A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.20.2.tgz", + "integrity": "sha512-tBcXp9KNphnNH0dfhv8KYkZhjc+H3XBkF5DKtswJblV7KlT9EI2+jeA8DgBjp908WEuYll6pF+UStUCfEpdysA==", "cpu": [ "x64" ], @@ -862,9 +697,9 @@ } }, "node_modules/@esbuild/freebsd-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.19.12.tgz", - "integrity": "sha512-4aRvFIXmwAcDBw9AueDQ2YnGmz5L6obe5kmPT8Vd+/+x/JMVKCgdcRwH6APrbpNXsPz+K653Qg8HB/oXvXVukA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.20.2.tgz", + "integrity": "sha512-d3qI41G4SuLiCGCFGUrKsSeTXyWG6yem1KcGZVS+3FYlYhtNoNgYrWcvkOoaqMhwXSMrZRl69ArHsGJ9mYdbbw==", "cpu": [ "arm64" ], @@ -878,9 +713,9 @@ } }, "node_modules/@esbuild/freebsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.19.12.tgz", - "integrity": "sha512-EYoXZ4d8xtBoVN7CEwWY2IN4ho76xjYXqSXMNccFSx2lgqOG/1TBPW0yPx1bJZk94qu3tX0fycJeeQsKovA8gg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.20.2.tgz", + "integrity": "sha512-d+DipyvHRuqEeM5zDivKV1KuXn9WeRX6vqSqIDgwIfPQtwMP4jaDsQsDncjTDDsExT4lR/91OLjRo8bmC1e+Cw==", "cpu": [ "x64" ], @@ -894,9 +729,9 @@ } }, "node_modules/@esbuild/linux-arm": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.19.12.tgz", - "integrity": "sha512-J5jPms//KhSNv+LO1S1TX1UWp1ucM6N6XuL6ITdKWElCu8wXP72l9MM0zDTzzeikVyqFE6U8YAV9/tFyj0ti+w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.20.2.tgz", + "integrity": "sha512-VhLPeR8HTMPccbuWWcEUD1Az68TqaTYyj6nfE4QByZIQEQVWBB8vup8PpR7y1QHL3CpcF6xd5WVBU/+SBEvGTg==", "cpu": [ "arm" ], @@ -910,9 +745,9 @@ } }, "node_modules/@esbuild/linux-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.19.12.tgz", - "integrity": "sha512-EoTjyYyLuVPfdPLsGVVVC8a0p1BFFvtpQDB/YLEhaXyf/5bczaGeN15QkR+O4S5LeJ92Tqotve7i1jn35qwvdA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.20.2.tgz", + "integrity": "sha512-9pb6rBjGvTFNira2FLIWqDk/uaf42sSyLE8j1rnUpuzsODBq7FvpwHYZxQ/It/8b+QOS1RYfqgGFNLRI+qlq2A==", "cpu": [ "arm64" ], @@ -926,9 +761,9 @@ } }, "node_modules/@esbuild/linux-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.19.12.tgz", - "integrity": "sha512-Thsa42rrP1+UIGaWz47uydHSBOgTUnwBwNq59khgIwktK6x60Hivfbux9iNR0eHCHzOLjLMLfUMLCypBkZXMHA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.20.2.tgz", + "integrity": "sha512-o10utieEkNPFDZFQm9CoP7Tvb33UutoJqg3qKf1PWVeeJhJw0Q347PxMvBgVVFgouYLGIhFYG0UGdBumROyiig==", "cpu": [ "ia32" ], @@ -942,9 +777,9 @@ } }, "node_modules/@esbuild/linux-loong64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.19.12.tgz", - "integrity": "sha512-LiXdXA0s3IqRRjm6rV6XaWATScKAXjI4R4LoDlvO7+yQqFdlr1Bax62sRwkVvRIrwXxvtYEHHI4dm50jAXkuAA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.20.2.tgz", + "integrity": "sha512-PR7sp6R/UC4CFVomVINKJ80pMFlfDfMQMYynX7t1tNTeivQ6XdX5r2XovMmha/VjR1YN/HgHWsVcTRIMkymrgQ==", "cpu": [ "loong64" ], @@ -958,9 +793,9 @@ } }, "node_modules/@esbuild/linux-mips64el": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.19.12.tgz", - "integrity": "sha512-fEnAuj5VGTanfJ07ff0gOA6IPsvrVHLVb6Lyd1g2/ed67oU1eFzL0r9WL7ZzscD+/N6i3dWumGE1Un4f7Amf+w==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.20.2.tgz", + "integrity": "sha512-4BlTqeutE/KnOiTG5Y6Sb/Hw6hsBOZapOVF6njAESHInhlQAghVVZL1ZpIctBOoTFbQyGW+LsVYZ8lSSB3wkjA==", "cpu": [ "mips64el" ], @@ -974,9 +809,9 @@ } }, "node_modules/@esbuild/linux-ppc64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.19.12.tgz", - "integrity": "sha512-nYJA2/QPimDQOh1rKWedNOe3Gfc8PabU7HT3iXWtNUbRzXS9+vgB0Fjaqr//XNbd82mCxHzik2qotuI89cfixg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.20.2.tgz", + "integrity": "sha512-rD3KsaDprDcfajSKdn25ooz5J5/fWBylaaXkuotBDGnMnDP1Uv5DLAN/45qfnf3JDYyJv/ytGHQaziHUdyzaAg==", "cpu": [ "ppc64" ], @@ -990,9 +825,9 @@ } }, "node_modules/@esbuild/linux-riscv64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.19.12.tgz", - "integrity": "sha512-2MueBrlPQCw5dVJJpQdUYgeqIzDQgw3QtiAHUC4RBz9FXPrskyyU3VI1hw7C0BSKB9OduwSJ79FTCqtGMWqJHg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.20.2.tgz", + "integrity": "sha512-snwmBKacKmwTMmhLlz/3aH1Q9T8v45bKYGE3j26TsaOVtjIag4wLfWSiZykXzXuE1kbCE+zJRmwp+ZbIHinnVg==", "cpu": [ "riscv64" ], @@ -1006,9 +841,9 @@ } }, "node_modules/@esbuild/linux-s390x": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.19.12.tgz", - "integrity": "sha512-+Pil1Nv3Umes4m3AZKqA2anfhJiVmNCYkPchwFJNEJN5QxmTs1uzyy4TvmDrCRNT2ApwSari7ZIgrPeUx4UZDg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.20.2.tgz", + "integrity": "sha512-wcWISOobRWNm3cezm5HOZcYz1sKoHLd8VL1dl309DiixxVFoFe/o8HnwuIwn6sXre88Nwj+VwZUvJf4AFxkyrQ==", "cpu": [ "s390x" ], @@ -1022,9 +857,9 @@ } }, "node_modules/@esbuild/linux-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.19.12.tgz", - "integrity": "sha512-B71g1QpxfwBvNrfyJdVDexenDIt1CiDN1TIXLbhOw0KhJzE78KIFGX6OJ9MrtC0oOqMWf+0xop4qEU8JrJTwCg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.20.2.tgz", + "integrity": "sha512-1MdwI6OOTsfQfek8sLwgyjOXAu+wKhLEoaOLTjbijk6E2WONYpH9ZU2mNtR+lZ2B4uwr+usqGuVfFT9tMtGvGw==", "cpu": [ "x64" ], @@ -1038,9 +873,9 @@ } }, "node_modules/@esbuild/netbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.19.12.tgz", - "integrity": "sha512-3ltjQ7n1owJgFbuC61Oj++XhtzmymoCihNFgT84UAmJnxJfm4sYCiSLTXZtE00VWYpPMYc+ZQmB6xbSdVh0JWA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.20.2.tgz", + "integrity": "sha512-K8/DhBxcVQkzYc43yJXDSyjlFeHQJBiowJ0uVL6Tor3jGQfSGHNNJcWxNbOI8v5k82prYqzPuwkzHt3J1T1iZQ==", "cpu": [ "x64" ], @@ -1054,9 +889,9 @@ } }, "node_modules/@esbuild/openbsd-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.19.12.tgz", - "integrity": "sha512-RbrfTB9SWsr0kWmb9srfF+L933uMDdu9BIzdA7os2t0TXhCRjrQyCeOt6wVxr79CKD4c+p+YhCj31HBkYcXebw==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.20.2.tgz", + "integrity": "sha512-eMpKlV0SThJmmJgiVyN9jTPJ2VBPquf6Kt/nAoo6DgHAoN57K15ZghiHaMvqjCye/uU4X5u3YSMgVBI1h3vKrQ==", "cpu": [ "x64" ], @@ -1070,9 +905,9 @@ } }, "node_modules/@esbuild/sunos-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.19.12.tgz", - "integrity": "sha512-HKjJwRrW8uWtCQnQOz9qcU3mUZhTUQvi56Q8DPTLLB+DawoiQdjsYq+j+D3s9I8VFtDr+F9CjgXKKC4ss89IeA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.20.2.tgz", + "integrity": "sha512-2UyFtRC6cXLyejf/YEld4Hajo7UHILetzE1vsRcGL3earZEW77JxrFjH4Ez2qaTiEfMgAXxfAZCm1fvM/G/o8w==", "cpu": [ "x64" ], @@ -1086,9 +921,9 @@ } }, "node_modules/@esbuild/win32-arm64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.19.12.tgz", - "integrity": "sha512-URgtR1dJnmGvX864pn1B2YUYNzjmXkuJOIqG2HdU62MVS4EHpU2946OZoTMnRUHklGtJdJZ33QfzdjGACXhn1A==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.20.2.tgz", + "integrity": "sha512-GRibxoawM9ZCnDxnP3usoUDO9vUkpAxIIZ6GQI+IlVmr5kP3zUq+l17xELTHMWTWzjxa2guPNyrpq1GWmPvcGQ==", "cpu": [ "arm64" ], @@ -1102,9 +937,9 @@ } }, "node_modules/@esbuild/win32-ia32": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.19.12.tgz", - "integrity": "sha512-+ZOE6pUkMOJfmxmBZElNOx72NKpIa/HFOMGzu8fqzQJ5kgf6aTGrcJaFsNiVMH4JKpMipyK+7k0n2UXN7a8YKQ==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.20.2.tgz", + "integrity": "sha512-HfLOfn9YWmkSKRQqovpnITazdtquEW8/SoHW7pWpuEeguaZI4QnCRW6b+oZTztdBnZOS2hqJ6im/D5cPzBTTlQ==", "cpu": [ "ia32" ], @@ -1118,9 +953,9 @@ } }, "node_modules/@esbuild/win32-x64": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.19.12.tgz", - "integrity": "sha512-T1QyPSDCyMXaO3pzBkF96E8xMkiRYbUEZADd29SyPGabqxMViNoii+NcK7eWJAEoU6RZyEm5lVSIjTmcdoB9HA==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.20.2.tgz", + "integrity": "sha512-N49X4lJX27+l9jbLKSqZ6bKNjzQvHaT8IIFUy+YIqmXQdjYCToGWwOItDrfby14c78aDd5NHQl29xingXfCdLQ==", "cpu": [ "x64" ], @@ -1190,6 +1025,21 @@ "concat-map": "0.0.1" } }, + "node_modules/@eslint/eslintrc/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/@eslint/eslintrc/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -1299,9 +1149,9 @@ } }, "node_modules/@humanwhocodes/object-schema": { - "version": "2.0.2", - "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.3.tgz", + "integrity": "sha512-93zYdMES/c1D69yZiKDBj0V24vqNzB/koF26KPaagAfd3P/4gUlh3Dys5ogAK+Exi9QyzlD8x/08Zt7wIKcDcA==", "dev": true }, "node_modules/@isaacs/cliui": { @@ -1425,16 +1275,27 @@ "resolved": "https://registry.npmjs.org/@mediapipe/tasks-vision/-/tasks-vision-0.10.8.tgz", "integrity": "sha512-Rp7ll8BHrKB3wXaRFKhrltwZl1CiXGdibPxuWXvqGnKTnv8fqa/nvftYNuSbf+pbJWKYCXdBtYTITdAUTGGh0Q==" }, + "node_modules/@monogrid/gainmap-js": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/@monogrid/gainmap-js/-/gainmap-js-3.0.5.tgz", + "integrity": "sha512-53sCTG4FaJBaAq/tcufARtVYDMDGqyBT9i7F453pWGhZ5LqubDHDWtYoHo9VhQqMcHTEexdJqSsR58y+9HVmQA==", + "dependencies": { + "promise-worker-transferable": "^1.0.4" + }, + "peerDependencies": { + "three": ">= 0.159.0" + } + }, "node_modules/@mui/base": { - "version": "5.0.0-beta.37", - "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.37.tgz", - "integrity": "sha512-/o3anbb+DeCng8jNsd3704XtmmLDZju1Fo8R2o7ugrVtPQ/QpcqddwKNzKPZwa0J5T8YNW3ZVuHyQgbTnQLisQ==", + "version": "5.0.0-beta.40", + "resolved": "https://registry.npmjs.org/@mui/base/-/base-5.0.0-beta.40.tgz", + "integrity": "sha512-I/lGHztkCzvwlXpjD2+SNmvNQvB4227xBXhISPjEaJUXGImOQ9f3D2Yj/T3KasSI/h0MLWy74X0J6clhPmsRbQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9", "@floating-ui/react-dom": "^2.0.8", - "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.11", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "@popperjs/core": "^2.11.8", "clsx": "^2.1.0", "prop-types": "^15.8.1" @@ -1458,9 +1319,9 @@ } }, "node_modules/@mui/core-downloads-tracker": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.11.tgz", - "integrity": "sha512-JVrJ9Jo4gyU707ujnRzmE8ABBWpXd6FwL9GYULmwZRtfPg89ggXs/S3MStQkpJ1JRWfdLL6S5syXmgQGq5EDAw==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/core-downloads-tracker/-/core-downloads-tracker-5.15.15.tgz", + "integrity": "sha512-aXnw29OWQ6I5A47iuWEI6qSSUfH6G/aCsW9KmW3LiFqr7uXZBK4Ks+z8G+qeIub8k0T5CMqlT2q0L+ZJTMrqpg==", "dev": true, "funding": { "type": "opencollective", @@ -1468,17 +1329,17 @@ } }, "node_modules/@mui/material": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.11.tgz", - "integrity": "sha512-FA3eEuEZaDaxgN3CgfXezMWbCZ4VCeU/sv0F0/PK5n42qIgsPVD6q+j71qS7/62sp6wRFMHtDMpXRlN+tT/7NA==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/material/-/material-5.15.15.tgz", + "integrity": "sha512-3zvWayJ+E1kzoIsvwyEvkTUKVKt1AjchFFns+JtluHCuvxgKcLSRJTADw37k0doaRtVAsyh8bz9Afqzv+KYrIA==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/base": "5.0.0-beta.37", - "@mui/core-downloads-tracker": "^5.15.11", - "@mui/system": "^5.15.11", - "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.11", + "@mui/base": "5.0.0-beta.40", + "@mui/core-downloads-tracker": "^5.15.15", + "@mui/system": "^5.15.15", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "@types/react-transition-group": "^4.4.10", "clsx": "^2.1.0", "csstype": "^3.1.3", @@ -1513,13 +1374,13 @@ } }, "node_modules/@mui/private-theming": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.11.tgz", - "integrity": "sha512-jY/696SnSxSzO1u86Thym7ky5T9CgfidU3NFJjguldqK4f3Z5S97amZ6nffg8gTD0HBjY9scB+4ekqDEUmxZOA==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/private-theming/-/private-theming-5.15.14.tgz", + "integrity": "sha512-UH0EiZckOWcxiXLX3Jbb0K7rC8mxTr9L9l6QhOZxYc4r8FHUkefltV9VDGLrzCaWh30SQiJvAEd7djX3XXY6Xw==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/utils": "^5.15.11", + "@mui/utils": "^5.15.14", "prop-types": "^15.8.1" }, "engines": { @@ -1540,9 +1401,9 @@ } }, "node_modules/@mui/styled-engine": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.11.tgz", - "integrity": "sha512-So21AhAngqo07ces4S/JpX5UaMU2RHXpEA6hNzI6IQjd/1usMPxpgK8wkGgTe3JKmC2KDmH8cvoycq5H3Ii7/w==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/styled-engine/-/styled-engine-5.15.14.tgz", + "integrity": "sha512-RILkuVD8gY6PvjZjqnWhz8fu68dVkqhM5+jYWfB5yhlSQKg+2rHkmEwm75XIeAqI3qwOndK6zELK5H6Zxn4NHw==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9", @@ -1572,16 +1433,16 @@ } }, "node_modules/@mui/system": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.11.tgz", - "integrity": "sha512-9j35suLFq+MgJo5ktVSHPbkjDLRMBCV17NMBdEQurh6oWyGnLM4uhU4QGZZQ75o0vuhjJghOCA1jkO3+79wKsA==", + "version": "5.15.15", + "resolved": "https://registry.npmjs.org/@mui/system/-/system-5.15.15.tgz", + "integrity": "sha512-aulox6N1dnu5PABsfxVGOZffDVmlxPOVgj56HrUnJE8MCSh8lOvvkd47cebIVQQYAjpwieXQXiDPj5pwM40jTQ==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9", - "@mui/private-theming": "^5.15.11", - "@mui/styled-engine": "^5.15.11", - "@mui/types": "^7.2.13", - "@mui/utils": "^5.15.11", + "@mui/private-theming": "^5.15.14", + "@mui/styled-engine": "^5.15.14", + "@mui/types": "^7.2.14", + "@mui/utils": "^5.15.14", "clsx": "^2.1.0", "csstype": "^3.1.3", "prop-types": "^15.8.1" @@ -1612,9 +1473,9 @@ } }, "node_modules/@mui/types": { - "version": "7.2.13", - "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.13.tgz", - "integrity": "sha512-qP9OgacN62s+l8rdDhSFRe05HWtLLJ5TGclC9I1+tQngbssu0m2dmFZs+Px53AcOs9fD7TbYd4gc9AXzVqO/+g==", + "version": "7.2.14", + "resolved": "https://registry.npmjs.org/@mui/types/-/types-7.2.14.tgz", + "integrity": "sha512-MZsBZ4q4HfzBsywtXgM1Ksj6HDThtiwmOKUXH1pKYISI9gAVXCNHNpo7TlGoGrBaYWZTdNoirIN7JsQcQUjmQQ==", "dev": true, "peerDependencies": { "@types/react": "^17.0.0 || ^18.0.0" @@ -1626,9 +1487,9 @@ } }, "node_modules/@mui/utils": { - "version": "5.15.11", - "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.11.tgz", - "integrity": "sha512-D6bwqprUa9Stf8ft0dcMqWyWDKEo7D+6pB1k8WajbqlYIRA8J8Kw9Ra7PSZKKePGBGWO+/xxrX1U8HpG/aXQCw==", + "version": "5.15.14", + "resolved": "https://registry.npmjs.org/@mui/utils/-/utils-5.15.14.tgz", + "integrity": "sha512-0lF/7Hh/ezDv5X7Pry6enMsbYyGKjADzvHyo3Qrc/SSlTsQ1VkbDMbH0m2t3OR5iIVLwMoxwM7yGd+6FCMtTFA==", "dev": true, "dependencies": { "@babel/runtime": "^7.23.9", @@ -1841,18 +1702,20 @@ "integrity": "sha512-POu8Mk0hIU3lRXB3bGIGe4VHIwwDsQyoD1F394OK7STTiX9w4dG3cTLljjYswkQN+hDSHRrj4O36kuVa7KPU8Q==" }, "node_modules/@react-three/drei": { - "version": "9.99.6", - "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.99.6.tgz", - "integrity": "sha512-K5EyoHf+NF6YW4HGA0VN00VkmCV/3uspKXxvs6W1zZDAz2TqQEfiV8+Gc7FHgMjvsoU5QbrmPg36+CJ2gLrc7Q==", + "version": "9.105.2", + "resolved": "https://registry.npmjs.org/@react-three/drei/-/drei-9.105.2.tgz", + "integrity": "sha512-u11SXqeQrIk6gLC5jgTJ0ROD5bbmNkS7UKrnWrpcarLvZS3MBtmUdgzY2djSdIez5dx35ptWc/TI1EBLwnroEQ==", "dependencies": { "@babel/runtime": "^7.11.2", "@mediapipe/tasks-vision": "0.10.8", + "@monogrid/gainmap-js": "^3.0.5", "@react-spring/three": "~9.6.1", "@use-gesture/react": "^10.2.24", "camera-controls": "^2.4.2", "cross-env": "^7.0.3", "detect-gpu": "^5.0.28", "glsl-noise": "^0.0.0", + "hls.js": "1.3.5", "maath": "^0.10.7", "meshline": "^3.1.6", "react-composer": "^5.0.3", @@ -1880,9 +1743,9 @@ } }, "node_modules/@react-three/fiber": { - "version": "8.15.19", - "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.15.19.tgz", - "integrity": "sha512-WbFU7T6485v8Onnp+JJnrzKFvvGP7OFyJmHlqXiXc2RcXl9Sax+ykJxiNwEXWjGjcgF9/KTfv0+pAVkP0vZlKg==", + "version": "8.16.1", + "resolved": "https://registry.npmjs.org/@react-three/fiber/-/fiber-8.16.1.tgz", + "integrity": "sha512-Rgjn+xcR+6Do2Ic4b6RROIvCGs3RhoVJEamfmtMSfkgIRH3PeiPdqRxcfJlO9y6KDvYA5fIUGruz9h/sTeLlpw==", "dependencies": { "@babel/runtime": "^7.17.8", "@types/react-reconciler": "^0.26.7", @@ -1927,18 +1790,10 @@ } } }, - "node_modules/@react-three/fiber/node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/@rollup/rollup-android-arm-eabi": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.12.0.tgz", - "integrity": "sha512-+ac02NL/2TCKRrJu2wffk1kZ+RyqxVUlbjSagNgPm94frxtr+XDL12E5Ll1enWskLrtrZ2r8L3wED1orIibV/w==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm-eabi/-/rollup-android-arm-eabi-4.14.1.tgz", + "integrity": "sha512-fH8/o8nSUek8ceQnT7K4EQbSiV7jgkHq81m9lWZFIXjJ7lJzpWXbQFpT/Zh6OZYnpFykvzC3fbEvEAFZu03dPA==", "cpu": [ "arm" ], @@ -1949,9 +1804,9 @@ ] }, "node_modules/@rollup/rollup-android-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.12.0.tgz", - "integrity": "sha512-OBqcX2BMe6nvjQ0Nyp7cC90cnumt8PXmO7Dp3gfAju/6YwG0Tj74z1vKrfRz7qAv23nBcYM8BCbhrsWqO7PzQQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-android-arm64/-/rollup-android-arm64-4.14.1.tgz", + "integrity": "sha512-Y/9OHLjzkunF+KGEoJr3heiD5X9OLa8sbT1lm0NYeKyaM3oMhhQFvPB0bNZYJwlq93j8Z6wSxh9+cyKQaxS7PQ==", "cpu": [ "arm64" ], @@ -1962,9 +1817,9 @@ ] }, "node_modules/@rollup/rollup-darwin-arm64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.12.0.tgz", - "integrity": "sha512-X64tZd8dRE/QTrBIEs63kaOBG0b5GVEd3ccoLtyf6IdXtHdh8h+I56C2yC3PtC9Ucnv0CpNFJLqKFVgCYe0lOQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-arm64/-/rollup-darwin-arm64-4.14.1.tgz", + "integrity": "sha512-+kecg3FY84WadgcuSVm6llrABOdQAEbNdnpi5X3UwWiFVhZIZvKgGrF7kmLguvxHNQy+UuRV66cLVl3S+Rkt+Q==", "cpu": [ "arm64" ], @@ -1975,9 +1830,9 @@ ] }, "node_modules/@rollup/rollup-darwin-x64": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.12.0.tgz", - "integrity": "sha512-cc71KUZoVbUJmGP2cOuiZ9HSOP14AzBAThn3OU+9LcA1+IUqswJyR1cAJj3Mg55HbjZP6OLAIscbQsQLrpgTOg==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-darwin-x64/-/rollup-darwin-x64-4.14.1.tgz", + "integrity": "sha512-2pYRzEjVqq2TB/UNv47BV/8vQiXkFGVmPFwJb+1E0IFFZbIX8/jo1olxqqMbo6xCXf8kabANhp5bzCij2tFLUA==", "cpu": [ "x64" ], @@ -1988,9 +1843,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm-gnueabihf": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.12.0.tgz", - "integrity": "sha512-a6w/Y3hyyO6GlpKL2xJ4IOh/7d+APaqLYdMf86xnczU3nurFTaVN9s9jOXQg97BE4nYm/7Ga51rjec5nfRdrvA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm-gnueabihf/-/rollup-linux-arm-gnueabihf-4.14.1.tgz", + "integrity": "sha512-mS6wQ6Do6/wmrF9aTFVpIJ3/IDXhg1EZcQFYHZLHqw6AzMBjTHWnCG35HxSqUNphh0EHqSM6wRTT8HsL1C0x5g==", "cpu": [ "arm" ], @@ -2001,9 +1856,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.12.0.tgz", - "integrity": "sha512-0fZBq27b+D7Ar5CQMofVN8sggOVhEtzFUwOwPppQt0k+VR+7UHMZZY4y+64WJ06XOhBTKXtQB/Sv0NwQMXyNAA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-gnu/-/rollup-linux-arm64-gnu-4.14.1.tgz", + "integrity": "sha512-p9rGKYkHdFMzhckOTFubfxgyIO1vw//7IIjBBRVzyZebWlzRLeNhqxuSaZ7kCEKVkm/kuC9fVRW9HkC/zNRG2w==", "cpu": [ "arm64" ], @@ -2014,9 +1869,9 @@ ] }, "node_modules/@rollup/rollup-linux-arm64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.12.0.tgz", - "integrity": "sha512-eTvzUS3hhhlgeAv6bfigekzWZjaEX9xP9HhxB0Dvrdbkk5w/b+1Sxct2ZuDxNJKzsRStSq1EaEkVSEe7A7ipgQ==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-arm64-musl/-/rollup-linux-arm64-musl-4.14.1.tgz", + "integrity": "sha512-nDY6Yz5xS/Y4M2i9JLQd3Rofh5OR8Bn8qe3Mv/qCVpHFlwtZSBYSPaU4mrGazWkXrdQ98GB//H0BirGR/SKFSw==", "cpu": [ "arm64" ], @@ -2026,10 +1881,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-powerpc64le-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-powerpc64le-gnu/-/rollup-linux-powerpc64le-gnu-4.14.1.tgz", + "integrity": "sha512-im7HE4VBL+aDswvcmfx88Mp1soqL9OBsdDBU8NqDEYtkri0qV0THhQsvZtZeNNlLeCUQ16PZyv7cqutjDF35qw==", + "cpu": [ + "ppc64le" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-riscv64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.12.0.tgz", - "integrity": "sha512-ix+qAB9qmrCRiaO71VFfY8rkiAZJL8zQRXveS27HS+pKdjwUfEhqo2+YF2oI+H/22Xsiski+qqwIBxVewLK7sw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-riscv64-gnu/-/rollup-linux-riscv64-gnu-4.14.1.tgz", + "integrity": "sha512-RWdiHuAxWmzPJgaHJdpvUUlDz8sdQz4P2uv367T2JocdDa98iRw2UjIJ4QxSyt077mXZT2X6pKfT2iYtVEvOFw==", "cpu": [ "riscv64" ], @@ -2039,10 +1907,23 @@ "linux" ] }, + "node_modules/@rollup/rollup-linux-s390x-gnu": { + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-s390x-gnu/-/rollup-linux-s390x-gnu-4.14.1.tgz", + "integrity": "sha512-VMgaGQ5zRX6ZqV/fas65/sUGc9cPmsntq2FiGmayW9KMNfWVG/j0BAqImvU4KTeOOgYSf1F+k6at1UfNONuNjA==", + "cpu": [ + "s390x" + ], + "dev": true, + "optional": true, + "os": [ + "linux" + ] + }, "node_modules/@rollup/rollup-linux-x64-gnu": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.12.0.tgz", - "integrity": "sha512-TenQhZVOtw/3qKOPa7d+QgkeM6xY0LtwzR8OplmyL5LrgTWIXpTQg2Q2ycBf8jm+SFW2Wt/DTn1gf7nFp3ssVA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-gnu/-/rollup-linux-x64-gnu-4.14.1.tgz", + "integrity": "sha512-9Q7DGjZN+hTdJomaQ3Iub4m6VPu1r94bmK2z3UeWP3dGUecRC54tmVu9vKHTm1bOt3ASoYtEz6JSRLFzrysKlA==", "cpu": [ "x64" ], @@ -2053,9 +1934,9 @@ ] }, "node_modules/@rollup/rollup-linux-x64-musl": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.12.0.tgz", - "integrity": "sha512-LfFdRhNnW0zdMvdCb5FNuWlls2WbbSridJvxOvYWgSBOYZtgBfW9UGNJG//rwMqTX1xQE9BAodvMH9tAusKDUw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-linux-x64-musl/-/rollup-linux-x64-musl-4.14.1.tgz", + "integrity": "sha512-JNEG/Ti55413SsreTguSx0LOVKX902OfXIKVg+TCXO6Gjans/k9O6ww9q3oLGjNDaTLxM+IHFMeXy/0RXL5R/g==", "cpu": [ "x64" ], @@ -2066,9 +1947,9 @@ ] }, "node_modules/@rollup/rollup-win32-arm64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.12.0.tgz", - "integrity": "sha512-JPDxovheWNp6d7AHCgsUlkuCKvtu3RB55iNEkaQcf0ttsDU/JZF+iQnYcQJSk/7PtT4mjjVG8N1kpwnI9SLYaw==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-arm64-msvc/-/rollup-win32-arm64-msvc-4.14.1.tgz", + "integrity": "sha512-ryS22I9y0mumlLNwDFYZRDFLwWh3aKaC72CWjFcFvxK0U6v/mOkM5Up1bTbCRAhv3kEIwW2ajROegCIQViUCeA==", "cpu": [ "arm64" ], @@ -2079,9 +1960,9 @@ ] }, "node_modules/@rollup/rollup-win32-ia32-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.12.0.tgz", - "integrity": "sha512-fjtuvMWRGJn1oZacG8IPnzIV6GF2/XG+h71FKn76OYFqySXInJtseAqdprVTDTyqPxQOG9Exak5/E9Z3+EJ8ZA==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-ia32-msvc/-/rollup-win32-ia32-msvc-4.14.1.tgz", + "integrity": "sha512-TdloItiGk+T0mTxKx7Hp279xy30LspMso+GzQvV2maYePMAWdmrzqSNZhUpPj3CGw12aGj57I026PgLCTu8CGg==", "cpu": [ "ia32" ], @@ -2092,9 +1973,9 @@ ] }, "node_modules/@rollup/rollup-win32-x64-msvc": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.12.0.tgz", - "integrity": "sha512-ZYmr5mS2wd4Dew/JjT0Fqi2NPB/ZhZ2VvPp7SmvPZb4Y1CG/LRcS6tcRo2cYU7zLK5A7cdbhWnnWmUjoI4qapg==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/@rollup/rollup-win32-x64-msvc/-/rollup-win32-x64-msvc-4.14.1.tgz", + "integrity": "sha512-wQGI+LY/Py20zdUPq+XCem7JcPOyzIJBm3dli+56DJsQOHbnXZFEwgmnC6el1TPAfC8lBT3m+z69RmLykNUbew==", "cpu": [ "x64" ], @@ -2111,9 +1992,9 @@ "dev": true }, "node_modules/@swc/core": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.2.tgz", - "integrity": "sha512-vWgY07R/eqj1/a0vsRKLI9o9klGZfpLNOVEnrv4nrccxBgYPjcf22IWwAoaBJ+wpA7Q4fVjCUM8lP0m01dpxcg==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core/-/core-1.4.12.tgz", + "integrity": "sha512-QljRxTaUajSLB9ui93cZ38/lmThwIw/BPxjn+TphrYN6LPU3vu9/ykjgHtlpmaXDDcngL4K5i396E7iwwEUxYg==", "dev": true, "hasInstallScript": true, "dependencies": { @@ -2128,16 +2009,16 @@ "url": "https://opencollective.com/swc" }, "optionalDependencies": { - "@swc/core-darwin-arm64": "1.4.2", - "@swc/core-darwin-x64": "1.4.2", - "@swc/core-linux-arm-gnueabihf": "1.4.2", - "@swc/core-linux-arm64-gnu": "1.4.2", - "@swc/core-linux-arm64-musl": "1.4.2", - "@swc/core-linux-x64-gnu": "1.4.2", - "@swc/core-linux-x64-musl": "1.4.2", - "@swc/core-win32-arm64-msvc": "1.4.2", - "@swc/core-win32-ia32-msvc": "1.4.2", - "@swc/core-win32-x64-msvc": "1.4.2" + "@swc/core-darwin-arm64": "1.4.12", + "@swc/core-darwin-x64": "1.4.12", + "@swc/core-linux-arm-gnueabihf": "1.4.12", + "@swc/core-linux-arm64-gnu": "1.4.12", + "@swc/core-linux-arm64-musl": "1.4.12", + "@swc/core-linux-x64-gnu": "1.4.12", + "@swc/core-linux-x64-musl": "1.4.12", + "@swc/core-win32-arm64-msvc": "1.4.12", + "@swc/core-win32-ia32-msvc": "1.4.12", + "@swc/core-win32-x64-msvc": "1.4.12" }, "peerDependencies": { "@swc/helpers": "^0.5.0" @@ -2149,9 +2030,9 @@ } }, "node_modules/@swc/core-darwin-arm64": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.2.tgz", - "integrity": "sha512-1uSdAn1MRK5C1m/TvLZ2RDvr0zLvochgrZ2xL+lRzugLlCTlSA+Q4TWtrZaOz+vnnFVliCpw7c7qu0JouhgQIw==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.4.12.tgz", + "integrity": "sha512-BZUUq91LGJsLI2BQrhYL3yARkcdN4TS3YGNS6aRYUtyeWrGCTKHL90erF2BMU2rEwZLLkOC/U899R4o4oiSHfA==", "cpu": [ "arm64" ], @@ -2165,9 +2046,9 @@ } }, "node_modules/@swc/core-darwin-x64": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.2.tgz", - "integrity": "sha512-TYD28+dCQKeuxxcy7gLJUCFLqrwDZnHtC2z7cdeGfZpbI2mbfppfTf2wUPzqZk3gEC96zHd4Yr37V3Tvzar+lQ==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.4.12.tgz", + "integrity": "sha512-Wkk8rq1RwCOgg5ybTlfVtOYXLZATZ+QjgiBNM7pIn03A5/zZicokNTYd8L26/mifly2e74Dz34tlIZBT4aTGDA==", "cpu": [ "x64" ], @@ -2181,9 +2062,9 @@ } }, "node_modules/@swc/core-linux-arm-gnueabihf": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.2.tgz", - "integrity": "sha512-Eyqipf7ZPGj0vplKHo8JUOoU1un2sg5PjJMpEesX0k+6HKE2T8pdyeyXODN0YTFqzndSa/J43EEPXm+rHAsLFQ==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.4.12.tgz", + "integrity": "sha512-8jb/SN67oTQ5KSThWlKLchhU6xnlAlnmnLCCOKK1xGtFS6vD+By9uL+qeEY2krV98UCRTf68WSmC0SLZhVoz5A==", "cpu": [ "arm" ], @@ -2197,9 +2078,9 @@ } }, "node_modules/@swc/core-linux-arm64-gnu": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.2.tgz", - "integrity": "sha512-wZn02DH8VYPv3FC0ub4my52Rttsus/rFw+UUfzdb3tHMHXB66LqN+rR0ssIOZrH6K+VLN6qpTw9VizjyoH0BxA==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.4.12.tgz", + "integrity": "sha512-DhW47DQEZKCdSq92v5F03rqdpjRXdDMqxfu4uAlZ9Uo1wJEGvY23e1SNmhji2sVHsZbBjSvoXoBLk0v00nSG8w==", "cpu": [ "arm64" ], @@ -2213,9 +2094,9 @@ } }, "node_modules/@swc/core-linux-arm64-musl": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.2.tgz", - "integrity": "sha512-3G0D5z9hUj9bXNcwmA1eGiFTwe5rWkuL3DsoviTj73TKLpk7u64ND0XjEfO0huVv4vVu9H1jodrKb7nvln/dlw==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.4.12.tgz", + "integrity": "sha512-PR57pT3TssnCRvdsaKNsxZy9N8rFg9AKA1U7W+LxbZ/7Z7PHc5PjxF0GgZpE/aLmU6xOn5VyQTlzjoamVkt05g==", "cpu": [ "arm64" ], @@ -2229,9 +2110,9 @@ } }, "node_modules/@swc/core-linux-x64-gnu": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.2.tgz", - "integrity": "sha512-LFxn9U8cjmYHw3jrdPNqPAkBGglKE3tCZ8rA7hYyp0BFxuo7L2ZcEnPm4RFpmSCCsExFH+LEJWuMGgWERoktvg==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.4.12.tgz", + "integrity": "sha512-HLZIWNHWuFIlH+LEmXr1lBiwGQeCshKOGcqbJyz7xpqTh7m2IPAxPWEhr/qmMTMsjluGxeIsLrcsgreTyXtgNA==", "cpu": [ "x64" ], @@ -2245,9 +2126,9 @@ } }, "node_modules/@swc/core-linux-x64-musl": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.2.tgz", - "integrity": "sha512-dp0fAmreeVVYTUcb4u9njTPrYzKnbIH0EhH2qvC9GOYNNREUu2GezSIDgonjOXkHiTCvopG4xU7y56XtXj4VrQ==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.4.12.tgz", + "integrity": "sha512-M5fBAtoOcpz2YQAFtNemrPod5BqmzAJc8pYtT3dVTn1MJllhmLHlphU8BQytvoGr1PHgJL8ZJBlBGdt70LQ7Mw==", "cpu": [ "x64" ], @@ -2261,9 +2142,9 @@ } }, "node_modules/@swc/core-win32-arm64-msvc": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.2.tgz", - "integrity": "sha512-HlVIiLMQkzthAdqMslQhDkoXJ5+AOLUSTV6fm6shFKZKqc/9cJvr4S8UveNERL9zUficA36yM3bbfo36McwnvQ==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.4.12.tgz", + "integrity": "sha512-K8LjjgZ7VQFtM+eXqjfAJ0z+TKVDng3r59QYn7CL6cyxZI2brLU3lNknZcUFSouZD+gsghZI/Zb8tQjVk7aKDQ==", "cpu": [ "arm64" ], @@ -2277,9 +2158,9 @@ } }, "node_modules/@swc/core-win32-ia32-msvc": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.2.tgz", - "integrity": "sha512-WCF8faPGjCl4oIgugkp+kL9nl3nUATlzKXCEGFowMEmVVCFM0GsqlmGdPp1pjZoWc9tpYanoXQDnp5IvlDSLhA==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.4.12.tgz", + "integrity": "sha512-hflO5LCxozngoOmiQbDPyvt6ODc5Cu9AwTJP9uH/BSMPdEQ6PCnefuUOJLAKew2q9o+NmDORuJk+vgqQz9Uzpg==", "cpu": [ "ia32" ], @@ -2293,9 +2174,9 @@ } }, "node_modules/@swc/core-win32-x64-msvc": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.2.tgz", - "integrity": "sha512-oV71rwiSpA5xre2C5570BhCsg1HF97SNLsZ/12xv7zayGzqr3yvFALFJN8tHKpqUdCB4FGPjoP3JFdV3i+1wUw==", + "version": "1.4.12", + "resolved": "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.4.12.tgz", + "integrity": "sha512-3A4qMtddBDbtprV5edTB/SgJn9L+X5TL7RGgS3eWtEgn/NG8gA80X/scjf1v2MMeOsrcxiYhnemI2gXCKuQN2g==", "cpu": [ "x64" ], @@ -2315,10 +2196,13 @@ "dev": true }, "node_modules/@swc/types": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.5.tgz", - "integrity": "sha512-myfUej5naTBWnqOCc/MdVOLVjXUXtIA+NpDrDBKJtLLg2shUjBu3cZmB/85RyitKc55+lUUyl7oRfLOvkr2hsw==", - "dev": true + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/@swc/types/-/types-0.1.6.tgz", + "integrity": "sha512-/JLo/l2JsT/LRd80C3HfbmVpxOAJ11FO2RCEslFrgzLltoP9j8XIbsyDcfCt2WWyX+CM96rBoNM+IToAkFOugg==", + "dev": true, + "dependencies": { + "@swc/counter": "^0.1.3" + } }, "node_modules/@trysound/sax": { "version": "0.2.0", @@ -2329,6 +2213,11 @@ "node": ">=10.13.0" } }, + "node_modules/@tweenjs/tween.js": { + "version": "23.1.1", + "resolved": "https://registry.npmjs.org/@tweenjs/tween.js/-/tween.js-23.1.1.tgz", + "integrity": "sha512-ZpboH7pCPPeyBWKf8c7TJswtCEQObFo3bOBYalm99NzZarATALYCo5OhbCa/n4RQyJyHfhkdx+hNrdL5ByFYDw==" + }, "node_modules/@types/babel__core": { "version": "7.20.5", "resolved": "https://registry.npmjs.org/@types/babel__core/-/babel__core-7.20.5.tgz", @@ -2417,9 +2306,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.11.24", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.11.24.tgz", - "integrity": "sha512-Kza43ewS3xoLgCEpQrsT+xRo/EJej1y0kVYGiLFE1NEODXGzTfwiC6tXTLMQskn1X4/Rjlh0MQUvx9W+L9long==", + "version": "20.12.6", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.6.tgz", + "integrity": "sha512-3KurE8taB8GCvZBPngVbp0lk5CKi8M9f9k1rsADh0Evdz5SzJ+Q+Hx9uHoFGsLnLnd1xmkDQr2hVhlA0Mn0lKQ==", "dev": true, "dependencies": { "undici-types": "~5.26.4" @@ -2443,24 +2332,23 @@ "dev": true }, "node_modules/@types/prop-types": { - "version": "15.7.11", - "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.11.tgz", - "integrity": "sha512-ga8y9v9uyeiLdpKddhxYQkxNDrfvuPrlFb0N1qnZZByvcElJaXthF1UhvCh9TLWJBEHeNtdnbysW7Y6Uq8CVng==" + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" }, "node_modules/@types/react": { - "version": "18.2.61", - "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.61.tgz", - "integrity": "sha512-NURTN0qNnJa7O/k4XUkEW2yfygA+NxS0V5h1+kp9jPwhzZy95q3ADoGMP0+JypMhrZBTTgjKAUlTctde1zzeQA==", + "version": "18.2.75", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.2.75.tgz", + "integrity": "sha512-+DNnF7yc5y0bHkBTiLKqXFe+L4B3nvOphiMY3tuA5X10esmjqk7smyBZzbGTy2vsiy/Bnzj8yFIBL8xhRacoOg==", "dependencies": { "@types/prop-types": "*", - "@types/scheduler": "*", "csstype": "^3.0.2" } }, "node_modules/@types/react-dom": { - "version": "18.2.19", - "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.19.tgz", - "integrity": "sha512-aZvQL6uUbIJpjZk4U8JZGbau9KDeAwMfmhyWorxgBkqDIEf6ROjRozcmPIicqsUwPUjbkDfHKgGee1Lq65APcA==", + "version": "18.2.24", + "resolved": "https://registry.npmjs.org/@types/react-dom/-/react-dom-18.2.24.tgz", + "integrity": "sha512-cN6upcKd8zkGy4HU9F1+/s98Hrp6D4MOcippK4PoE8OZRngohHZpbJn1GsaDLz87MqvHNoT13nHvNqM9ocRHZg==", "dev": true, "dependencies": { "@types/react": "*" @@ -2483,11 +2371,6 @@ "@types/react": "*" } }, - "node_modules/@types/scheduler": { - "version": "0.16.8", - "resolved": "https://registry.npmjs.org/@types/scheduler/-/scheduler-0.16.8.tgz", - "integrity": "sha512-WZLiwShhwLRmeV6zH+GkbOFT6Z6VklCItrDioxUnv+u4Ll+8vKeFySoFyK/0ctcRpOmwAicELfmys1sDc/Rw+A==" - }, "node_modules/@types/semver": { "version": "7.5.8", "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", @@ -2511,30 +2394,30 @@ } }, "node_modules/@types/webxr": { - "version": "0.5.14", - "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.14.tgz", - "integrity": "sha512-UEMMm/Xn3DtEa+gpzUrOcDj+SJS1tk5YodjwOxcqStNhCfPcwgyC5Srg2ToVKyg2Fhq16Ffpb0UWUQHqoT9AMA==" + "version": "0.5.15", + "resolved": "https://registry.npmjs.org/@types/webxr/-/webxr-0.5.15.tgz", + "integrity": "sha512-nC9116Gd4N+CqTxqo6gvCfhAMAzgRcfS8ZsciNodHq8uwW4JCVKwhagw8yN0XmC7mHrLnWqniJpoVEiR+72Drw==" }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.1.1.tgz", - "integrity": "sha512-zioDz623d0RHNhvx0eesUmGfIjzrk18nSBC8xewepKXbBvN/7c1qImV7Hg8TI1URTxKax7/zxfxj3Uph8Chcuw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.6.0.tgz", + "integrity": "sha512-gKmTNwZnblUdnTIJu3e9kmeRRzV2j1a/LUO27KNNAnIC5zjy1aSvXSRp4rVNlmAoHlQ7HzX42NbKpcSr4jF80A==", "dev": true, "dependencies": { - "@eslint-community/regexpp": "^4.5.1", - "@typescript-eslint/scope-manager": "7.1.1", - "@typescript-eslint/type-utils": "7.1.1", - "@typescript-eslint/utils": "7.1.1", - "@typescript-eslint/visitor-keys": "7.1.1", + "@eslint-community/regexpp": "^4.10.0", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/type-utils": "7.6.0", + "@typescript-eslint/utils": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4", "graphemer": "^1.4.0", - "ignore": "^5.2.4", + "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2551,19 +2434,19 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.1.1.tgz", - "integrity": "sha512-ZWUFyL0z04R1nAEgr9e79YtV5LbafdOtN7yapNbn1ansMyaegl2D4bL7vHoJ4HPSc4CaLwuCVas8CVuneKzplQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.6.0.tgz", + "integrity": "sha512-usPMPHcwX3ZoPWnBnhhorc14NJw9J4HpSXQX4urF2TPKG0au0XhJoZyX62fmvdHONUkmyUe74Hzm1//XA+BoYg==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.1.1", - "@typescript-eslint/types": "7.1.1", - "@typescript-eslint/typescript-estree": "7.1.1", - "@typescript-eslint/visitor-keys": "7.1.1", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2579,16 +2462,16 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.1.1.tgz", - "integrity": "sha512-cirZpA8bJMRb4WZ+rO6+mnOJrGFDd38WoXCEI57+CYBqta8Yc8aJym2i7vyqLL1vVYljgw0X27axkUXz32T8TA==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.6.0.tgz", + "integrity": "sha512-ngttyfExA5PsHSx0rdFgnADMYQi+Zkeiv4/ZxGYUWd0nLs63Ha0ksmp8VMxAIC0wtCFxMos7Lt3PszJssG/E6w==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.1", - "@typescript-eslint/visitor-keys": "7.1.1" + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2596,18 +2479,18 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.1.1.tgz", - "integrity": "sha512-5r4RKze6XHEEhlZnJtR3GYeCh1IueUHdbrukV2KSlLXaTjuSfeVF8mZUVPLovidCuZfbVjfhi4c0DNSa/Rdg5g==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.6.0.tgz", + "integrity": "sha512-NxAfqAPNLG6LTmy7uZgpK8KcuiS2NZD/HlThPXQRGwz6u7MDBWRVliEEl1Gj6U7++kVJTpehkhZzCJLMK66Scw==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.1.1", - "@typescript-eslint/utils": "7.1.1", + "@typescript-eslint/typescript-estree": "7.6.0", + "@typescript-eslint/utils": "7.6.0", "debug": "^4.3.4", - "ts-api-utils": "^1.0.1" + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2623,12 +2506,12 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.1.1.tgz", - "integrity": "sha512-KhewzrlRMrgeKm1U9bh2z5aoL4s7K3tK5DwHDn8MHv0yQfWFz/0ZR6trrIHHa5CsF83j/GgHqzdbzCXJ3crx0Q==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.6.0.tgz", + "integrity": "sha512-h02rYQn8J+MureCvHVVzhl69/GAfQGPQZmOMjG1KfCl7o3HtMSlPaPUAPu6lLctXI5ySRGIYk94clD/AUMCUgQ==", "dev": true, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2636,22 +2519,22 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.1.1.tgz", - "integrity": "sha512-9ZOncVSfr+sMXVxxca2OJOPagRwT0u/UHikM2Rd6L/aB+kL/QAuTnsv6MeXtjzCJYb8PzrXarypSGIPx3Jemxw==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.6.0.tgz", + "integrity": "sha512-+7Y/GP9VuYibecrCQWSKgl3GvUM5cILRttpWtnAu8GNL9j11e4tbuGZmZjJ8ejnKYyBRb2ddGQ3rEFCq3QjMJw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.1", - "@typescript-eslint/visitor-keys": "7.1.1", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/visitor-keys": "7.6.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", - "minimatch": "9.0.3", - "semver": "^7.5.4", - "ts-api-utils": "^1.0.1" + "minimatch": "^9.0.4", + "semver": "^7.6.0", + "ts-api-utils": "^1.3.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2664,21 +2547,21 @@ } }, "node_modules/@typescript-eslint/utils": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.1.1.tgz", - "integrity": "sha512-thOXM89xA03xAE0lW7alstvnyoBUbBX38YtY+zAUcpRPcq9EIhXPuJ0YTv948MbzmKh6e1AUszn5cBFK49Umqg==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.6.0.tgz", + "integrity": "sha512-x54gaSsRRI+Nwz59TXpCsr6harB98qjXYzsRxGqvA5Ue3kQH+FxS7FYU81g/omn22ML2pZJkisy6Q+ElK8pBCA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.12", - "@types/semver": "^7.5.0", - "@typescript-eslint/scope-manager": "7.1.1", - "@typescript-eslint/types": "7.1.1", - "@typescript-eslint/typescript-estree": "7.1.1", - "semver": "^7.5.4" + "@types/json-schema": "^7.0.15", + "@types/semver": "^7.5.8", + "@typescript-eslint/scope-manager": "7.6.0", + "@typescript-eslint/types": "7.6.0", + "@typescript-eslint/typescript-estree": "7.6.0", + "semver": "^7.6.0" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2689,16 +2572,16 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.1.1.tgz", - "integrity": "sha512-yTdHDQxY7cSoCcAtiBzVzxleJhkGB9NncSIyMYe2+OGON1ZsP9zOPws/Pqgopa65jvknOjlk/w7ulPlZ78PiLQ==", + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.6.0.tgz", + "integrity": "sha512-4eLB7t+LlNUmXzfOu1VAIAdkjbu5xNSerURS9X/S5TUKWFRpXRQZbmtPqgKmYx8bj3J0irtQXSiWAOY82v+cgw==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.1.1", - "eslint-visitor-keys": "^3.4.1" + "@typescript-eslint/types": "7.6.0", + "eslint-visitor-keys": "^3.4.3" }, "engines": { - "node": "^16.0.0 || >=18.0.0" + "node": "^18.18.0 || >=20.0.0" }, "funding": { "type": "opencollective", @@ -2712,16 +2595,16 @@ "dev": true }, "node_modules/@use-gesture/core": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.0.tgz", - "integrity": "sha512-rh+6MND31zfHcy9VU3dOZCqGY511lvGcfyJenN4cWZe0u1BH6brBpBddLVXhF2r4BMqWbvxfsbL7D287thJU2A==" + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/core/-/core-10.3.1.tgz", + "integrity": "sha512-WcINiDt8WjqBdUXye25anHiNxPc0VOrlT8F6LLkU6cycrOGUDyY/yyFmsg3k8i5OLvv25llc0QC45GhR/C8llw==" }, "node_modules/@use-gesture/react": { - "version": "10.3.0", - "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.0.tgz", - "integrity": "sha512-3zc+Ve99z4usVP6l9knYVbVnZgfqhKah7sIG+PS2w+vpig2v2OLct05vs+ZXMzwxdNCMka8B+8WlOo0z6Pn6DA==", + "version": "10.3.1", + "resolved": "https://registry.npmjs.org/@use-gesture/react/-/react-10.3.1.tgz", + "integrity": "sha512-Yy19y6O2GJq8f7CHf7L0nxL8bf4PZCPaVOCgJrusOeFHY1LvHgYXnmnXg6N5iwAnbgbZCDjo60SiM6IPJi9C5g==", "dependencies": { - "@use-gesture/core": "10.3.0" + "@use-gesture/core": "10.3.1" }, "peerDependencies": { "react": ">= 16.8.0" @@ -2759,13 +2642,13 @@ } }, "node_modules/@vitest/expect": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.3.1.tgz", - "integrity": "sha512-xofQFwIzfdmLLlHa6ag0dPV8YsnKOCP1KdAeVVh34vSjN2dcUiXYCD9htu/9eM7t8Xln4v03U9HLxLpPlsXdZw==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/expect/-/expect-1.4.0.tgz", + "integrity": "sha512-Jths0sWCJZ8BxjKe+p+eKsoqev1/T8lYcrjavEaz8auEJ4jAVY0GwW3JKmdVU4mmNPLPHixh4GNXP7GFtAiDHA==", "dev": true, "dependencies": { - "@vitest/spy": "1.3.1", - "@vitest/utils": "1.3.1", + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", "chai": "^4.3.10" }, "funding": { @@ -2773,12 +2656,12 @@ } }, "node_modules/@vitest/runner": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.3.1.tgz", - "integrity": "sha512-5FzF9c3jG/z5bgCnjr8j9LNq/9OxV2uEBAITOXfoe3rdZJTdO7jzThth7FXv/6b+kdY65tpRQB7WaKhNZwX+Kg==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/runner/-/runner-1.4.0.tgz", + "integrity": "sha512-EDYVSmesqlQ4RD2VvWo3hQgTJ7ZrFQ2VSJdfiJiArkCerDAGeyF1i6dHkmySqk573jLp6d/cfqCN+7wUB5tLgg==", "dev": true, "dependencies": { - "@vitest/utils": "1.3.1", + "@vitest/utils": "1.4.0", "p-limit": "^5.0.0", "pathe": "^1.1.1" }, @@ -2814,9 +2697,9 @@ } }, "node_modules/@vitest/snapshot": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.3.1.tgz", - "integrity": "sha512-EF++BZbt6RZmOlE3SuTPu/NfwBF6q4ABS37HHXzs2LUVPBLx2QoY/K0fKpRChSo8eLiuxcbCVfqKgx/dplCDuQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/snapshot/-/snapshot-1.4.0.tgz", + "integrity": "sha512-saAFnt5pPIA5qDGxOHxJ/XxhMFKkUSBJmVt5VgDsAqPTX6JP326r5C/c9UuCMPoXNzuudTPsYDZCoJ5ilpqG2A==", "dev": true, "dependencies": { "magic-string": "^0.30.5", @@ -2828,9 +2711,9 @@ } }, "node_modules/@vitest/spy": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.3.1.tgz", - "integrity": "sha512-xAcW+S099ylC9VLU7eZfdT9myV67Nor9w9zhf0mGCYJSO+zM2839tOeROTdikOi/8Qeusffvxb/MyBSOja1Uig==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/spy/-/spy-1.4.0.tgz", + "integrity": "sha512-Ywau/Qs1DzM/8Uc+yA77CwSegizMlcgTJuYGAi0jujOteJOUf1ujunHThYo243KG9nAyWT3L9ifPYZ5+As/+6Q==", "dev": true, "dependencies": { "tinyspy": "^2.2.0" @@ -2840,9 +2723,9 @@ } }, "node_modules/@vitest/utils": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.3.1.tgz", - "integrity": "sha512-d3Waie/299qqRyHTm2DjADeTaNdNSVsnwHPWrs20JMpjh6eiVq7ggggweO8rc4arhf6rRkWuHKwvxGvejUXZZQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/@vitest/utils/-/utils-1.4.0.tgz", + "integrity": "sha512-mx3Yd1/6e2Vt/PUC98DcqTirtfxUyAZ32uK82r8rZzbtBeBo+nqgnjx/LvqQdWsrvNtm14VmurNgcf4nqY5gJg==", "dev": true, "dependencies": { "diff-sequences": "^29.6.3", @@ -2910,18 +2793,15 @@ } }, "node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "dev": true, "dependencies": { - "color-convert": "^2.0.1" + "color-convert": "^1.9.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, "node_modules/any-promise": { @@ -2973,16 +2853,17 @@ } }, "node_modules/array-includes": { - "version": "3.1.7", - "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.7.tgz", - "integrity": "sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==", + "version": "3.1.8", + "resolved": "https://registry.npmjs.org/array-includes/-/array-includes-3.1.8.tgz", + "integrity": "sha512-itaWrbYbqpGXkGhZPGUulwnhVf5Hpy1xiCFsGqyIGglbBxmG5vSjxQen3/WGOjPpNEv1RtBLKxbmVXm8HpJStQ==", "dev": true, "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "get-intrinsic": "^1.2.1", + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0", + "get-intrinsic": "^1.2.4", "is-string": "^1.0.7" }, "engines": { @@ -3001,37 +2882,18 @@ "node": ">=8" } }, - "node_modules/array.prototype.filter": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/array.prototype.filter/-/array.prototype.filter-1.0.3.tgz", - "integrity": "sha512-VizNcj/RGJiUyQBgzwxzE5oHdeuXY5hSbbmKMlphj1cy1Vl7Pn2asCGbSrru6hSQjmCzqTBPVWAF/whmEOVHbw==", - "dev": true, - "peer": true, - "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1", - "es-array-method-boxes-properly": "^1.0.0", - "is-string": "^1.0.7" - }, - "engines": { - "node": ">= 0.4" - }, - "funding": { - "url": "https://github.com/sponsors/ljharb" - } - }, "node_modules/array.prototype.findlastindex": { - "version": "1.2.4", - "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.4.tgz", - "integrity": "sha512-hzvSHUshSpCflDR1QMUBLHGHP1VIEBegT4pix9H/Z92Xw3ySoy6c2qh7lJWTJnRJ8JCZ9bJNCgTyYaJGcJu6xQ==", + "version": "1.2.5", + "resolved": "https://registry.npmjs.org/array.prototype.findlastindex/-/array.prototype.findlastindex-1.2.5.tgz", + "integrity": "sha512-zfETvRFA8o7EiNn++N5f/kaCw221hrpGsDmcpndVupkPzEc1Wuf3VgC0qby1BbHs7f5DVYjgtEU2LLh5bqeGfQ==", "dev": true, "peer": true, "dependencies": { - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", + "es-abstract": "^1.23.2", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-shim-unscopables": "^1.0.2" }, "engines": { @@ -3112,9 +2974,9 @@ } }, "node_modules/autoprefixer": { - "version": "10.4.18", - "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.18.tgz", - "integrity": "sha512-1DKbDfsr6KUElM6wg+0zRNkB/Q7WcKYAaK+pzXn+Xqmszm/5Xa9coeNdtP88Vi+dPzZnMjhge8GIV49ZQkDa+g==", + "version": "10.4.19", + "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", + "integrity": "sha512-BaENR2+zBZ8xXhM4pUaKUxlVdxZ0EZhjvbopwnXmxRUfqDmwSpC2lAi/QXvx7NRdPCo1WKEcEF6mV64si1z4Ew==", "dev": true, "funding": [ { @@ -3132,7 +2994,7 @@ ], "dependencies": { "browserslist": "^4.23.0", - "caniuse-lite": "^1.0.30001591", + "caniuse-lite": "^1.0.30001599", "fraction.js": "^4.3.7", "normalize-range": "^0.1.2", "picocolors": "^1.0.0", @@ -3380,9 +3242,9 @@ } }, "node_modules/caniuse-lite": { - "version": "1.0.30001597", - "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001597.tgz", - "integrity": "sha512-7LjJvmQU6Sj7bL0j5b5WY/3n7utXUJvAe1lxhsHDbLmwX9mdL86Yjtr+5SRCyf8qME4M7pU2hswj0FpyBVCv9w==", + "version": "1.0.30001607", + "resolved": "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001607.tgz", + "integrity": "sha512-WcvhVRjXLKFB/kmOFVwELtMxyhq3iM/MvmXcyCe2PNf166c39mptscOc/45TTS96n2gpNV2z7+NakArTWZCQ3w==", "dev": true, "funding": [ { @@ -3430,19 +3292,26 @@ } }, "node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "dev": true, "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" + } + }, + "node_modules/chalk/node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "dev": true, + "engines": { + "node": ">=0.8.0" } }, "node_modules/check-error": { @@ -3503,21 +3372,18 @@ } }, "node_modules/color-convert": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", - "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "dev": true, "dependencies": { - "color-name": "~1.1.4" - }, - "engines": { - "node": ">=7.0.0" + "color-name": "1.1.3" } }, "node_modules/color-name": { - "version": "1.1.4", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", - "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", "dev": true }, "node_modules/colord": { @@ -3593,9 +3459,9 @@ } }, "node_modules/css-declaration-sorter": { - "version": "7.1.1", - "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.1.1.tgz", - "integrity": "sha512-dZ3bVTEEc1vxr3Bek9vGwfB5Z6ESPULhcRvO472mfjVnj8jRcTnKO8/JTczlvxM10Myb+wBM++1MtdO76eWcaQ==", + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/css-declaration-sorter/-/css-declaration-sorter-7.2.0.tgz", + "integrity": "sha512-h70rUM+3PNFuaBDTLe8wF/cdWu+dOZmb7pJt8Z2sedYbAcQVQV/tEchueg3GWxwqS0cxtbxmaHEdkNACqcvsow==", "dev": true, "engines": { "node": "^14 || ^16 || >=18" @@ -3658,12 +3524,12 @@ } }, "node_modules/cssnano": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.0.tgz", - "integrity": "sha512-e2v4w/t3OFM6HTuSweI4RSdABaqgVgHlJp5FZrQsopHnKKHLFIvK2D3C4kHWeFIycN/1L1J5VIrg5KlDzn3r/g==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano/-/cssnano-6.1.2.tgz", + "integrity": "sha512-rYk5UeX7VAM/u0lNqewCdasdtPK81CgX8wJFLEIXHbV2oldWRgJAsZrdhRXkV1NJzA2g850KiFm9mMU2HxNxMA==", "dev": true, "dependencies": { - "cssnano-preset-default": "^6.1.0", + "cssnano-preset-default": "^6.1.2", "lilconfig": "^3.1.1" }, "engines": { @@ -3678,13 +3544,13 @@ } }, "node_modules/cssnano-preset-default": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.0.tgz", - "integrity": "sha512-4DUXZoDj+PI3fRl3MqMjl9DwLGjcsFP4qt+92nLUcN1RGfw2TY+GwNoG2B38Usu1BrcTs8j9pxNfSusmvtSjfg==", + "version": "6.1.2", + "resolved": "https://registry.npmjs.org/cssnano-preset-default/-/cssnano-preset-default-6.1.2.tgz", + "integrity": "sha512-1C0C+eNaeN8OcHQa193aRgYexyJtU8XwbdieEjClw+J9d94E41LwT6ivKH0WT+fYwYWB0Zp3I3IZ7tI/BbUbrg==", "dev": true, "dependencies": { "browserslist": "^4.23.0", - "css-declaration-sorter": "^7.1.1", + "css-declaration-sorter": "^7.2.0", "cssnano-utils": "^4.0.2", "postcss-calc": "^9.0.1", "postcss-colormin": "^6.1.0", @@ -3693,12 +3559,12 @@ "postcss-discard-duplicates": "^6.0.3", "postcss-discard-empty": "^6.0.3", "postcss-discard-overridden": "^6.0.2", - "postcss-merge-longhand": "^6.0.4", - "postcss-merge-rules": "^6.1.0", - "postcss-minify-font-values": "^6.0.3", + "postcss-merge-longhand": "^6.0.5", + "postcss-merge-rules": "^6.1.1", + "postcss-minify-font-values": "^6.1.0", "postcss-minify-gradients": "^6.0.3", "postcss-minify-params": "^6.1.0", - "postcss-minify-selectors": "^6.0.3", + "postcss-minify-selectors": "^6.0.4", "postcss-normalize-charset": "^6.0.2", "postcss-normalize-display-values": "^6.0.2", "postcss-normalize-positions": "^6.0.2", @@ -3712,7 +3578,7 @@ "postcss-reduce-initial": "^6.1.0", "postcss-reduce-transforms": "^6.0.2", "postcss-svgo": "^6.0.3", - "postcss-unique-selectors": "^6.0.3" + "postcss-unique-selectors": "^6.0.4" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -3771,6 +3637,60 @@ "resolved": "https://registry.npmjs.org/csstype/-/csstype-3.1.3.tgz", "integrity": "sha512-M1uQkMl8rQK/szD0LNhtqxIPLpimGm8sOBwU7lLnCpSbTyY3yeU1Vc7l4KT5zT4s/yOxHH5O7tIuuLOCnLADRw==" }, + "node_modules/data-view-buffer": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.1.tgz", + "integrity": "sha512-0lht7OugA5x3iJLOWFhWK/5ehONdprk0ISXqVFn/NFrDu+cuc8iADFrGQz5BnRK7LLU3JmkbXSxaqX+/mXYtUA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-length": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/data-view-byte-length/-/data-view-byte-length-1.0.1.tgz", + "integrity": "sha512-4J7wRJD3ABAzr8wP+OcIcqq2dlUKp4DVflx++hs5h5ZKydWMI6/D/fAot+yh6g2tHh8fLFTvNOaVN357NvSrOQ==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.7", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, + "node_modules/data-view-byte-offset": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/data-view-byte-offset/-/data-view-byte-offset-1.0.0.tgz", + "integrity": "sha512-t/Ygsytq+R995EJ5PZlD4Cu56sWa8InXySaViRzw9apusqsOO2bQP+SbYzAhR0pFKoB+43lYy8rWban9JSuXnA==", + "dev": true, + "peer": true, + "dependencies": { + "call-bind": "^1.0.6", + "es-errors": "^1.3.0", + "is-data-view": "^1.0.1" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/debounce": { "version": "1.2.1", "resolved": "https://registry.npmjs.org/debounce/-/debounce-1.2.1.tgz", @@ -3989,9 +3909,9 @@ "dev": true }, "node_modules/electron-to-chromium": { - "version": "1.4.708", - "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.708.tgz", - "integrity": "sha512-iWgEEvREL4GTXXHKohhh33+6Y8XkPI5eHihDmm8zUk5Zo7HICEW+wI/j5kJ2tbuNUCXJ/sNXa03ajW635DiJXA==", + "version": "1.4.730", + "resolved": "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.730.tgz", + "integrity": "sha512-oJRPo82XEqtQAobHpJIR3zW5YO3sSRRkPz2an4yxi1UvqhsGm54vR/wzTFV74a3soDOJ8CKW7ajOOX5ESzddwg==", "dev": true }, "node_modules/emoji-regex": { @@ -4019,9 +3939,9 @@ } }, "node_modules/es-abstract": { - "version": "1.22.5", - "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.22.5.tgz", - "integrity": "sha512-oW69R+4q2wG+Hc3KZePPZxOiisRIqfKBVo/HLx94QcJeWGU/8sZhCvc829rd1kS366vlJbzBfXf9yWwf0+Ko7w==", + "version": "1.23.3", + "resolved": "https://registry.npmjs.org/es-abstract/-/es-abstract-1.23.3.tgz", + "integrity": "sha512-e+HfNH61Bj1X9/jLc5v1owaLYuHdeHHSQlkhCBiTK8rBvKaULl/beGMxwrMXjpYrv4pz22BlY570vVePA2ho4A==", "dev": true, "peer": true, "dependencies": { @@ -4029,8 +3949,12 @@ "arraybuffer.prototype.slice": "^1.0.3", "available-typed-arrays": "^1.0.7", "call-bind": "^1.0.7", + "data-view-buffer": "^1.0.1", + "data-view-byte-length": "^1.0.1", + "data-view-byte-offset": "^1.0.0", "es-define-property": "^1.0.0", "es-errors": "^1.3.0", + "es-object-atoms": "^1.0.0", "es-set-tostringtag": "^2.0.3", "es-to-primitive": "^1.2.1", "function.prototype.name": "^1.1.6", @@ -4041,10 +3965,11 @@ "has-property-descriptors": "^1.0.2", "has-proto": "^1.0.3", "has-symbols": "^1.0.3", - "hasown": "^2.0.1", + "hasown": "^2.0.2", "internal-slot": "^1.0.7", "is-array-buffer": "^3.0.4", "is-callable": "^1.2.7", + "is-data-view": "^1.0.1", "is-negative-zero": "^2.0.3", "is-regex": "^1.1.4", "is-shared-array-buffer": "^1.0.3", @@ -4055,17 +3980,17 @@ "object-keys": "^1.1.1", "object.assign": "^4.1.5", "regexp.prototype.flags": "^1.5.2", - "safe-array-concat": "^1.1.0", + "safe-array-concat": "^1.1.2", "safe-regex-test": "^1.0.3", - "string.prototype.trim": "^1.2.8", - "string.prototype.trimend": "^1.0.7", - "string.prototype.trimstart": "^1.0.7", + "string.prototype.trim": "^1.2.9", + "string.prototype.trimend": "^1.0.8", + "string.prototype.trimstart": "^1.0.8", "typed-array-buffer": "^1.0.2", "typed-array-byte-length": "^1.0.1", "typed-array-byte-offset": "^1.0.2", - "typed-array-length": "^1.0.5", + "typed-array-length": "^1.0.6", "unbox-primitive": "^1.0.2", - "which-typed-array": "^1.1.14" + "which-typed-array": "^1.1.15" }, "engines": { "node": ">= 0.4" @@ -4074,13 +3999,6 @@ "url": "https://github.com/sponsors/ljharb" } }, - "node_modules/es-array-method-boxes-properly": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/es-array-method-boxes-properly/-/es-array-method-boxes-properly-1.0.0.tgz", - "integrity": "sha512-wd6JXUmyHmt8T5a2xreUwKcGPq6f1f+WwIJkijUqiGcJz1qqnZgP6XIK+QyIWU5lT7imeNxUll48bziG+TSYcA==", - "dev": true, - "peer": true - }, "node_modules/es-define-property": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/es-define-property/-/es-define-property-1.0.0.tgz", @@ -4104,6 +4022,19 @@ "node": ">= 0.4" } }, + "node_modules/es-object-atoms": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/es-object-atoms/-/es-object-atoms-1.0.0.tgz", + "integrity": "sha512-MZ4iQ6JwHOBQjahnjwaC1ZtIBH+2ohjamzAO3oaHcXYup7qxjF2fixyH+Q71voWHeOkI2q/TnJao/KfXYIZWbw==", + "dev": true, + "peer": true, + "dependencies": { + "es-errors": "^1.3.0" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/es-set-tostringtag": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/es-set-tostringtag/-/es-set-tostringtag-2.0.3.tgz", @@ -4148,9 +4079,9 @@ } }, "node_modules/esbuild": { - "version": "0.19.12", - "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.19.12.tgz", - "integrity": "sha512-aARqgq8roFBj054KvQr5f1sFu0D65G+miZRCuJyJ0G13Zwx7vRar5Zhn2tkQNzIXcBrNVsv/8stehpj+GAjgbg==", + "version": "0.20.2", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.20.2.tgz", + "integrity": "sha512-WdOOppmUNU+IbZ0PaDiTst80zjnrOkyJNHoKupIcVyU8Lvla3Ugx94VzkQ32Ijqd7UhHJy75gNWDMUekcrSJ6g==", "dev": true, "hasInstallScript": true, "bin": { @@ -4160,29 +4091,29 @@ "node": ">=12" }, "optionalDependencies": { - "@esbuild/aix-ppc64": "0.19.12", - "@esbuild/android-arm": "0.19.12", - "@esbuild/android-arm64": "0.19.12", - "@esbuild/android-x64": "0.19.12", - "@esbuild/darwin-arm64": "0.19.12", - "@esbuild/darwin-x64": "0.19.12", - "@esbuild/freebsd-arm64": "0.19.12", - "@esbuild/freebsd-x64": "0.19.12", - "@esbuild/linux-arm": "0.19.12", - "@esbuild/linux-arm64": "0.19.12", - "@esbuild/linux-ia32": "0.19.12", - "@esbuild/linux-loong64": "0.19.12", - "@esbuild/linux-mips64el": "0.19.12", - "@esbuild/linux-ppc64": "0.19.12", - "@esbuild/linux-riscv64": "0.19.12", - "@esbuild/linux-s390x": "0.19.12", - "@esbuild/linux-x64": "0.19.12", - "@esbuild/netbsd-x64": "0.19.12", - "@esbuild/openbsd-x64": "0.19.12", - "@esbuild/sunos-x64": "0.19.12", - "@esbuild/win32-arm64": "0.19.12", - "@esbuild/win32-ia32": "0.19.12", - "@esbuild/win32-x64": "0.19.12" + "@esbuild/aix-ppc64": "0.20.2", + "@esbuild/android-arm": "0.20.2", + "@esbuild/android-arm64": "0.20.2", + "@esbuild/android-x64": "0.20.2", + "@esbuild/darwin-arm64": "0.20.2", + "@esbuild/darwin-x64": "0.20.2", + "@esbuild/freebsd-arm64": "0.20.2", + "@esbuild/freebsd-x64": "0.20.2", + "@esbuild/linux-arm": "0.20.2", + "@esbuild/linux-arm64": "0.20.2", + "@esbuild/linux-ia32": "0.20.2", + "@esbuild/linux-loong64": "0.20.2", + "@esbuild/linux-mips64el": "0.20.2", + "@esbuild/linux-ppc64": "0.20.2", + "@esbuild/linux-riscv64": "0.20.2", + "@esbuild/linux-s390x": "0.20.2", + "@esbuild/linux-x64": "0.20.2", + "@esbuild/netbsd-x64": "0.20.2", + "@esbuild/openbsd-x64": "0.20.2", + "@esbuild/sunos-x64": "0.20.2", + "@esbuild/win32-arm64": "0.20.2", + "@esbuild/win32-ia32": "0.20.2", + "@esbuild/win32-x64": "0.20.2" } }, "node_modules/escalade": { @@ -4555,9 +4486,9 @@ } }, "node_modules/eslint-plugin-react-refresh": { - "version": "0.4.5", - "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.5.tgz", - "integrity": "sha512-D53FYKJa+fDmZMtriODxvhwrO+IOqrxoEo21gMA0sjHdU6dPVH4OhyFip9ypl8HOF5RV5KdTo+rBQLvnY2cO8w==", + "version": "0.4.6", + "resolved": "https://registry.npmjs.org/eslint-plugin-react-refresh/-/eslint-plugin-react-refresh-0.4.6.tgz", + "integrity": "sha512-NjGXdm7zgcKRkKMua34qVO9doI7VOxZ6ancSvBELJSSoX97jyndXcSoa8XBh69JoB31dNz3EEzlMcizZl7LaMA==", "dev": true, "peerDependencies": { "eslint": ">=7" @@ -4591,6 +4522,21 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/eslint/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, "node_modules/eslint/node_modules/brace-expansion": { "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", @@ -4601,6 +4547,64 @@ "concat-map": "0.0.1" } }, + "node_modules/eslint/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "dev": true, + "dependencies": { + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/eslint/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/eslint/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/eslint/node_modules/globals": { + "version": "13.24.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", + "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "dev": true, + "dependencies": { + "type-fest": "^0.20.2" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/eslint/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, "node_modules/eslint/node_modules/minimatch": { "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", @@ -4613,6 +4617,18 @@ "node": "*" } }, + "node_modules/eslint/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" + } + }, "node_modules/espree": { "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", @@ -5047,20 +5063,19 @@ } }, "node_modules/glob": { - "version": "7.2.3", - "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", - "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "version": "8.1.0", + "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", + "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", "inherits": "2", - "minimatch": "^3.1.1", - "once": "^1.3.0", - "path-is-absolute": "^1.0.0" + "minimatch": "^5.0.1", + "once": "^1.3.0" }, "engines": { - "node": "*" + "node": ">=12" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5078,41 +5093,25 @@ "node": ">=10.13.0" } }, - "node_modules/glob/node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" - } - }, "node_modules/glob/node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "5.1.6", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", + "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=10" } }, "node_modules/globals": { - "version": "13.24.0", - "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", - "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", + "version": "11.12.0", + "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", + "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", "dev": true, - "dependencies": { - "type-fest": "^0.20.2" - }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "node": ">=4" } }, "node_modules/globalthis": { @@ -5192,12 +5191,12 @@ } }, "node_modules/has-flag": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", - "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", + "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", "dev": true, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/has-property-descriptors": { @@ -5256,9 +5255,9 @@ } }, "node_modules/hasown": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.1.tgz", - "integrity": "sha512-1/th4MHjnwncwXsIW6QMzlvYL9kG5e/CpVvLRZe4XPa8TOUNbCELqmvhDmnkNsAjwaG4+I8gJJL0JBvTTLO9qA==", + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/hasown/-/hasown-2.0.2.tgz", + "integrity": "sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==", "dev": true, "dependencies": { "function-bind": "^1.1.2" @@ -5267,6 +5266,11 @@ "node": ">= 0.4" } }, + "node_modules/hls.js": { + "version": "1.3.5", + "resolved": "https://registry.npmjs.org/hls.js/-/hls.js-1.3.5.tgz", + "integrity": "sha512-uybAvKS6uDe0MnWNEPnO0krWVr+8m2R0hJ/viql8H3MVK+itq8gGQuIYoFHL3rECkIpNH98Lw8YuuWMKZxp3Ew==" + }, "node_modules/hoist-non-react-statics": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", @@ -5319,6 +5323,11 @@ "node": ">= 4" } }, + "node_modules/immediate": { + "version": "3.0.6", + "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" + }, "node_modules/import-fresh": { "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", @@ -5465,6 +5474,22 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-data-view": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/is-data-view/-/is-data-view-1.0.1.tgz", + "integrity": "sha512-AHkaJrsUVW6wq6JS8y3JnM/GJF/9cf+k20+iDzlSaJrinEo5+7vRiteOSwBhHRiAyQATN1AmY4hwzxJKPmYf+w==", + "dev": true, + "peer": true, + "dependencies": { + "is-typed-array": "^1.1.13" + }, + "engines": { + "node": ">= 0.4" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/is-date-object": { "version": "1.0.5", "resolved": "https://registry.npmjs.org/is-date-object/-/is-date-object-1.0.5.tgz", @@ -5558,6 +5583,11 @@ "node": ">=8" } }, + "node_modules/is-promise": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-2.2.2.tgz", + "integrity": "sha512-+lP4/6lKUBfQjZ2pdxThZvLUAafmZb8OAxFb8XXtiQmS35INgr85hdOGoEs124ez1FCnZJt6jau/T+alh58QFQ==" + }, "node_modules/is-regex": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/is-regex/-/is-regex-1.1.4.tgz", @@ -5677,9 +5707,9 @@ "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/its-fine": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.1.1.tgz", - "integrity": "sha512-v1Ia1xl20KbuSGlwoaGsW0oxsw8Be+TrXweidxD9oT/1lAh6O3K3/GIM95Tt6WCiv6W+h2M7RB1TwdoAjQyyKw==", + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/its-fine/-/its-fine-1.1.3.tgz", + "integrity": "sha512-mncCA+yb6tuh5zK26cHqKlsSyxm4zdm4YgJpxycyx6p9fgxgK5PLu3iDVpKhzTn57Yrv3jk/r0aK0RFTT1OjFw==", "dependencies": { "@types/react-reconciler": "^0.28.0" }, @@ -5871,6 +5901,14 @@ "node": ">= 0.8.0" } }, + "node_modules/lie": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/lie/-/lie-3.3.0.tgz", + "integrity": "sha512-UaiMJzeWRlEujzAuw5LokY1L5ecNQYZKfmyZ9L7wDHb/p5etKaxXhohBcrw0EYby+G/NA52vRSN4N39dxHAIwQ==", + "dependencies": { + "immediate": "~3.0.5" + } + }, "node_modules/lilconfig": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/lilconfig/-/lilconfig-3.1.1.tgz", @@ -5980,15 +6018,12 @@ } }, "node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", + "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", "dev": true, "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "yallist": "^3.0.2" } }, "node_modules/maath": { @@ -6001,9 +6036,9 @@ } }, "node_modules/magic-string": { - "version": "0.30.8", - "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.8.tgz", - "integrity": "sha512-ISQTe55T2ao7XtlAStud6qwYPZjE4GK1S/BeVPus4jrq6JuOnQ00YKQC581RWhR122W7msZV263KzVeLoqidyQ==", + "version": "0.30.9", + "resolved": "https://registry.npmjs.org/magic-string/-/magic-string-0.30.9.tgz", + "integrity": "sha512-S1+hd+dIrC8EZqKyT9DstTH/0Z+f76kmmvZnkfQVmOpDEF9iVgdYif3Q/pIWHmCoo59bQVGW0kVL3e2nl+9+Sw==", "dev": true, "dependencies": { "@jridgewell/sourcemap-codec": "^1.4.15" @@ -6078,9 +6113,9 @@ } }, "node_modules/meshline": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.2.0.tgz", - "integrity": "sha512-ZaJkC967GTuef7UBdO0rGPX544oIWaNo7tYedVHSoR2lje6RR16fX8IsgMxgxoYYERtjqsRWIYBSPBxG4QR84Q==", + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/meshline/-/meshline-3.3.0.tgz", + "integrity": "sha512-EKKf2TLnfyqUeA7ryWFKgT9HchTMATvECGZnMQjtlcyxK0sB8shVLVkemBUp9dB3tkDEmoqQDLJCPStjkH8D7A==", "peerDependencies": { "three": ">=0.137" } @@ -6116,9 +6151,9 @@ } }, "node_modules/minimatch": { - "version": "9.0.3", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", - "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", "dev": true, "dependencies": { "brace-expansion": "^2.0.1" @@ -6333,15 +6368,16 @@ } }, "node_modules/object.fromentries": { - "version": "2.0.7", - "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.7.tgz", - "integrity": "sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==", + "version": "2.0.8", + "resolved": "https://registry.npmjs.org/object.fromentries/-/object.fromentries-2.0.8.tgz", + "integrity": "sha512-k6E21FzySsSK5a21KRADBd/NGneRegFO5pLHfdQLpRDETUNJueLXs3WCzyQ3tFRDYgbq3KHGXfTbi2bs8WQ6rQ==", "dev": true, "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.2", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6351,29 +6387,30 @@ } }, "node_modules/object.groupby": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.2.tgz", - "integrity": "sha512-bzBq58S+x+uo0VjurFT0UktpKHOZmv4/xePiOA1nbB9pMqpGK7rUPNgf+1YC+7mE+0HzhTMqNUuCqvKhj6FnBw==", + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/object.groupby/-/object.groupby-1.0.3.tgz", + "integrity": "sha512-+Lhy3TQTuzXI5hevh8sBGqbmurHbbIjAi0Z4S63nthVLmLxfbj4T54a4CfZrXIrt9iP4mVAPYMo/v99taj3wjQ==", "dev": true, "peer": true, "dependencies": { - "array.prototype.filter": "^1.0.3", - "call-bind": "^1.0.5", + "call-bind": "^1.0.7", "define-properties": "^1.2.1", - "es-abstract": "^1.22.3", - "es-errors": "^1.0.0" + "es-abstract": "^1.23.2" + }, + "engines": { + "node": ">= 0.4" } }, "node_modules/object.values": { - "version": "1.1.7", - "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.1.7.tgz", - "integrity": "sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/object.values/-/object.values-1.2.0.tgz", + "integrity": "sha512-yBYjY9QX2hnRmZHAjG/f13MzmBzxzYgQhFrke06TTyKY5zSTEqkOeukBzIdVA3j3ulu8Qa3MbVFShV7T2RmGtQ==", "dev": true, "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -6522,12 +6559,12 @@ "dev": true }, "node_modules/path-scurry": { - "version": "1.10.1", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.1.tgz", - "integrity": "sha512-MkhCqzzBEpPvxxQ71Md0b1Kk51W01lrYvlMzSUaIzNsODdd7mqhiimSZlr+VegAz5Z6Vzt9Xg2ttE//XBhH3EQ==", + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", + "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", "dev": true, "dependencies": { - "lru-cache": "^9.1.1 || ^10.0.0", + "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { @@ -6628,9 +6665,9 @@ } }, "node_modules/postcss": { - "version": "8.4.35", - "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.35.tgz", - "integrity": "sha512-u5U8qYpBCpN13BsiEB0CbR1Hhh4Gc0zLFuedrHJKMctHCHAGrMdG0PRM/KErzAL3CU6/eckEtmHNB3x6e3c0vA==", + "version": "8.4.38", + "resolved": "https://registry.npmjs.org/postcss/-/postcss-8.4.38.tgz", + "integrity": "sha512-Wglpdk03BSfXkHoQa3b/oulrotAkwrlLDRSOb9D0bN86FdRyE9lppSp33aHNPgBa0JKCoB+drFLZkQoRRYae5A==", "dev": true, "funding": [ { @@ -6649,7 +6686,7 @@ "dependencies": { "nanoid": "^3.3.7", "picocolors": "^1.0.0", - "source-map-js": "^1.0.2" + "source-map-js": "^1.2.0" }, "engines": { "node": "^10 || ^12 || >=14" @@ -6837,13 +6874,13 @@ } }, "node_modules/postcss-merge-longhand": { - "version": "6.0.4", - "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.4.tgz", - "integrity": "sha512-vAfWGcxUUGlFiPM3nDMZA+/Yo9sbpc3JNkcYZez8FfJDv41Dh7tAgA3QGVTocaHCZZL6aXPXPOaBMJsjujodsA==", + "version": "6.0.5", + "resolved": "https://registry.npmjs.org/postcss-merge-longhand/-/postcss-merge-longhand-6.0.5.tgz", + "integrity": "sha512-5LOiordeTfi64QhICp07nzzuTDjNSO8g5Ksdibt44d+uvIIAE1oZdRn8y/W5ZtYgRH/lnLDlvi9F8btZcVzu3w==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0", - "stylehacks": "^6.1.0" + "stylehacks": "^6.1.1" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -6853,15 +6890,15 @@ } }, "node_modules/postcss-merge-rules": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.0.tgz", - "integrity": "sha512-lER+W3Gr6XOvxOYk1Vi/6UsAgKMg6MDBthmvbNqi2XxAk/r9XfhdYZSigfWjuWWn3zYw2wLelvtM8XuAEFqRkA==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/postcss-merge-rules/-/postcss-merge-rules-6.1.1.tgz", + "integrity": "sha512-KOdWF0gju31AQPZiD+2Ar9Qjowz1LTChSjFFbS+e2sFgc4uHOp3ZvVX4sNeTlk0w2O31ecFGgrFzhO0RSWbWwQ==", "dev": true, "dependencies": { "browserslist": "^4.23.0", "caniuse-api": "^3.0.0", "cssnano-utils": "^4.0.2", - "postcss-selector-parser": "^6.0.15" + "postcss-selector-parser": "^6.0.16" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -6871,9 +6908,9 @@ } }, "node_modules/postcss-minify-font-values": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.0.3.tgz", - "integrity": "sha512-SmAeTA1We5rMnN3F8X9YBNo9bj9xB4KyDHnaNJnBfQIPi+60fNiR9OTRnIaMqkYzAQX0vObIw4Pn0vuKEOettg==", + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/postcss-minify-font-values/-/postcss-minify-font-values-6.1.0.tgz", + "integrity": "sha512-gklfI/n+9rTh8nYaSJXlCo3nOKqMNkxuGpTn/Qm0gstL3ywTr9/WRKznE+oy6fvfolH6dF+QM4nCo8yPLdvGJg==", "dev": true, "dependencies": { "postcss-value-parser": "^4.2.0" @@ -6920,12 +6957,12 @@ } }, "node_modules/postcss-minify-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.3.tgz", - "integrity": "sha512-IcV7ZQJcaXyhx4UBpWZMsinGs2NmiUC60rJSkyvjPCPqhNjVGsrJUM+QhAtCaikZ0w0/AbZuH4wVvF/YMuMhvA==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-minify-selectors/-/postcss-minify-selectors-6.0.4.tgz", + "integrity": "sha512-L8dZSwNLgK7pjTto9PzWRoMbnLq5vsZSTu8+j1P/2GB8qdtGQfn+K1uSvFgYvgh83cbyxT5m43ZZhUMTJDSClQ==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.15" + "postcss-selector-parser": "^6.0.16" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -7163,12 +7200,12 @@ } }, "node_modules/postcss-unique-selectors": { - "version": "6.0.3", - "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.3.tgz", - "integrity": "sha512-NFXbYr8qdmCr/AFceaEfdcsKGCvWTeGO6QVC9h2GvtWgj0/0dklKQcaMMVzs6tr8bY+ase8hOtHW8OBTTRvS8A==", + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/postcss-unique-selectors/-/postcss-unique-selectors-6.0.4.tgz", + "integrity": "sha512-K38OCaIrO8+PzpArzkLKB42dSARtC2tmG6PvD4b1o1Q2E9Os8jzfWFfSy/rixsHwohtsDdFtAWGjFVFUdwYaMg==", "dev": true, "dependencies": { - "postcss-selector-parser": "^6.0.15" + "postcss-selector-parser": "^6.0.16" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -7238,6 +7275,15 @@ "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, + "node_modules/promise-worker-transferable": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/promise-worker-transferable/-/promise-worker-transferable-1.0.4.tgz", + "integrity": "sha512-bN+0ehEnrXfxV2ZQvU2PetO0n4gqBD4ulq3MI1WOPLgr7/Mg9yRQkX5+0v1vagr74ZTsl7XtzlaYDo2EuCeYJw==", + "dependencies": { + "is-promise": "^2.1.0", + "lie": "^3.0.2" + } + }, "node_modules/prop-types": { "version": "15.8.1", "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", @@ -7305,35 +7351,74 @@ "protobufjs": "^7.0.0" } }, - "node_modules/protobufjs-cli/node_modules/glob": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/glob/-/glob-8.1.0.tgz", - "integrity": "sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==", + "node_modules/protobufjs-cli/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "dev": true, "dependencies": { - "fs.realpath": "^1.0.0", - "inflight": "^1.0.4", - "inherits": "2", - "minimatch": "^5.0.1", - "once": "^1.3.0" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/isaacs" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/protobufjs-cli/node_modules/minimatch": { - "version": "5.1.6", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-5.1.6.tgz", - "integrity": "sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==", + "node_modules/protobufjs-cli/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "dev": true, "dependencies": { - "brace-expansion": "^2.0.1" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, "engines": { "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, + "node_modules/protobufjs-cli/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/protobufjs-cli/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, + "node_modules/protobufjs-cli/node_modules/has-flag": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", + "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", + "dev": true, + "engines": { + "node": ">=8" + } + }, + "node_modules/protobufjs-cli/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "dev": true, + "dependencies": { + "has-flag": "^4.0.0" + }, + "engines": { + "node": ">=8" } }, "node_modules/punycode": { @@ -7408,6 +7493,14 @@ "react": "^18.2.0" } }, + "node_modules/react-dom/node_modules/scheduler": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", + "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/react-icons": { "version": "4.12.0", "resolved": "https://registry.npmjs.org/react-icons/-/react-icons-4.12.0.tgz", @@ -7437,14 +7530,6 @@ "react": "^18.0.0" } }, - "node_modules/react-reconciler/node_modules/scheduler": { - "version": "0.21.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", - "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", - "dependencies": { - "loose-envify": "^1.1.0" - } - }, "node_modules/react-refresh": { "version": "0.14.0", "resolved": "https://registry.npmjs.org/react-refresh/-/react-refresh-0.14.0.tgz", @@ -7595,10 +7680,52 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/rimraf/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dev": true, + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/rimraf/node_modules/glob": { + "version": "7.2.3", + "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", + "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", + "dev": true, + "dependencies": { + "fs.realpath": "^1.0.0", + "inflight": "^1.0.4", + "inherits": "2", + "minimatch": "^3.1.1", + "once": "^1.3.0", + "path-is-absolute": "^1.0.0" + }, + "engines": { + "node": "*" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/rimraf/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dev": true, + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/rollup": { - "version": "4.12.0", - "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.12.0.tgz", - "integrity": "sha512-wz66wn4t1OHIJw3+XU7mJJQV/2NAfw5OAk6G6Hoo3zcvz/XOfQ52Vgi+AN4Uxoxi0KBBwk2g8zPrTDA4btSB/Q==", + "version": "4.14.1", + "resolved": "https://registry.npmjs.org/rollup/-/rollup-4.14.1.tgz", + "integrity": "sha512-4LnHSdd3QK2pa1J6dFbfm1HN0D7vSK/ZuZTsdyUAlA6Rr1yTouUTL13HaDOGJVgby461AhrNGBS7sCGXXtT+SA==", "dev": true, "dependencies": { "@types/estree": "1.0.5" @@ -7611,19 +7738,21 @@ "npm": ">=8.0.0" }, "optionalDependencies": { - "@rollup/rollup-android-arm-eabi": "4.12.0", - "@rollup/rollup-android-arm64": "4.12.0", - "@rollup/rollup-darwin-arm64": "4.12.0", - "@rollup/rollup-darwin-x64": "4.12.0", - "@rollup/rollup-linux-arm-gnueabihf": "4.12.0", - "@rollup/rollup-linux-arm64-gnu": "4.12.0", - "@rollup/rollup-linux-arm64-musl": "4.12.0", - "@rollup/rollup-linux-riscv64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-gnu": "4.12.0", - "@rollup/rollup-linux-x64-musl": "4.12.0", - "@rollup/rollup-win32-arm64-msvc": "4.12.0", - "@rollup/rollup-win32-ia32-msvc": "4.12.0", - "@rollup/rollup-win32-x64-msvc": "4.12.0", + "@rollup/rollup-android-arm-eabi": "4.14.1", + "@rollup/rollup-android-arm64": "4.14.1", + "@rollup/rollup-darwin-arm64": "4.14.1", + "@rollup/rollup-darwin-x64": "4.14.1", + "@rollup/rollup-linux-arm-gnueabihf": "4.14.1", + "@rollup/rollup-linux-arm64-gnu": "4.14.1", + "@rollup/rollup-linux-arm64-musl": "4.14.1", + "@rollup/rollup-linux-powerpc64le-gnu": "4.14.1", + "@rollup/rollup-linux-riscv64-gnu": "4.14.1", + "@rollup/rollup-linux-s390x-gnu": "4.14.1", + "@rollup/rollup-linux-x64-gnu": "4.14.1", + "@rollup/rollup-linux-x64-musl": "4.14.1", + "@rollup/rollup-win32-arm64-msvc": "4.14.1", + "@rollup/rollup-win32-ia32-msvc": "4.14.1", + "@rollup/rollup-win32-x64-msvc": "4.14.1", "fsevents": "~2.3.2" } }, @@ -7688,9 +7817,9 @@ } }, "node_modules/scheduler": { - "version": "0.23.0", - "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.0.tgz", - "integrity": "sha512-CtuThmgHNg7zIZWAXi3AsyIzA3n4xx7aNyjwC2VJldO2LMVDhFK+63xGqq6CsJH4rTAt6/M+N4GhZiDYPx9eUw==", + "version": "0.21.0", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.21.0.tgz", + "integrity": "sha512-1r87x5fz9MXqswA2ERLo0EbOAU74DpIUO090gIasYTqlVoJeMcl+Z1Rg7WHz+qtPujhS/hGIt9kxZOYBV3faRQ==", "dependencies": { "loose-envify": "^1.1.0" } @@ -7710,6 +7839,24 @@ "node": ">=10" } }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "dev": true, + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "dev": true + }, "node_modules/set-function-length": { "version": "1.2.2", "resolved": "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.2.tgz", @@ -7819,9 +7966,9 @@ } }, "node_modules/source-map-js": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.0.2.tgz", - "integrity": "sha512-R0XvVJ9WusLiqTCEiGCmICCMplcCkIwwR11mOSD9CR5u+IXYdiseeEuXCVAjS54zqwkLcPNnmU4OeJ6tUrWhDw==", + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/source-map-js/-/source-map-js-1.2.0.tgz", + "integrity": "sha512-itJW8lvSA0TXEphiRoawsCksnlf8SyvmFzIhltqAHluXd88pkCd+cXJVHTDwdCr0IzwptSm035IHQktUu1QUMg==", "dev": true, "engines": { "node": ">=0.10.0" @@ -7834,9 +7981,29 @@ "dev": true }, "node_modules/stats-gl": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.0.1.tgz", - "integrity": "sha512-EhFm1AxoSBK3MflkFawZ4jmOX1dWu0nBAtCpvGxGsondEvCpsohbpRpM8pi8UAcxG5eRsDsCiRcxdH20j3Rp9A==" + "version": "2.2.8", + "resolved": "https://registry.npmjs.org/stats-gl/-/stats-gl-2.2.8.tgz", + "integrity": "sha512-94G5nZvduDmzxBS7K0lYnynYwreZpkknD8g5dZmU6mpwIhy3caCrjAm11Qm1cbyx7mqix7Fp00RkbsonzKWnoQ==", + "dependencies": { + "@types/three": "^0.163.0" + } + }, + "node_modules/stats-gl/node_modules/@types/three": { + "version": "0.163.0", + "resolved": "https://registry.npmjs.org/@types/three/-/three-0.163.0.tgz", + "integrity": "sha512-uIdDhsXRpQiBUkflBS/i1l3JX14fW6Ot9csed60nfbZNXHDTRsnV2xnTVwXcgbvTiboAR4IW+t+lTL5f1rqIqA==", + "dependencies": { + "@tweenjs/tween.js": "~23.1.1", + "@types/stats.js": "*", + "@types/webxr": "*", + "fflate": "~0.8.2", + "meshoptimizer": "~0.18.1" + } + }, + "node_modules/stats-gl/node_modules/fflate": { + "version": "0.8.2", + "resolved": "https://registry.npmjs.org/fflate/-/fflate-0.8.2.tgz", + "integrity": "sha512-cPJU47OaAoCbg0pBvzsgpTPhmhqI5eJjh/JIu8tPj5q+T7iLvW/JAYUqmE7KOB4R1ZyEhzBaIQpQpardBF5z8A==" }, "node_modules/stats.js": { "version": "0.17.0", @@ -7915,15 +8082,16 @@ } }, "node_modules/string.prototype.trim": { - "version": "1.2.8", - "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.8.tgz", - "integrity": "sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==", + "version": "1.2.9", + "resolved": "https://registry.npmjs.org/string.prototype.trim/-/string.prototype.trim-1.2.9.tgz", + "integrity": "sha512-klHuCNxiMZ8MlsOihJhJEBJAiMVqU3Z2nEXWfWnIqjN0gEFS9J9+IxKozWWtQGcgoa1WUZzLjKPTr4ZHNFTFxw==", "dev": true, "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-abstract": "^1.23.0", + "es-object-atoms": "^1.0.0" }, "engines": { "node": ">= 0.4" @@ -7933,30 +8101,33 @@ } }, "node_modules/string.prototype.trimend": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.7.tgz", - "integrity": "sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimend/-/string.prototype.trimend-1.0.8.tgz", + "integrity": "sha512-p73uL5VCHCO2BZZ6krwwQE3kCzM7NKmis8S//xEC6fQonchbum4eP6kR4DLEjQFO3Wnj3Fuo8NM0kOSjVdHjZQ==", "dev": true, "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" }, "funding": { "url": "https://github.com/sponsors/ljharb" } }, "node_modules/string.prototype.trimstart": { - "version": "1.0.7", - "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.7.tgz", - "integrity": "sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==", + "version": "1.0.8", + "resolved": "https://registry.npmjs.org/string.prototype.trimstart/-/string.prototype.trimstart-1.0.8.tgz", + "integrity": "sha512-UXSH262CSZY1tfu3G3Secr6uGLCFVPMhIqHjlgCUtCCcgihYc/xKs9djMTMUOb2j1mVSeU8EU6NWc/iQKU6Gfg==", "dev": true, "peer": true, "dependencies": { - "call-bind": "^1.0.2", - "define-properties": "^1.2.0", - "es-abstract": "^1.22.1" + "call-bind": "^1.0.7", + "define-properties": "^1.2.1", + "es-object-atoms": "^1.0.0" + }, + "engines": { + "node": ">= 0.4" }, "funding": { "url": "https://github.com/sponsors/ljharb" @@ -8021,31 +8192,31 @@ } }, "node_modules/strip-literal": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.0.0.tgz", - "integrity": "sha512-f9vHgsCWBq2ugHAkGMiiYY+AYG0D/cbloKKg0nhaaaSNsujdGIpVXCNsrJpCKr5M0f4aI31mr13UjY6GAuXCKA==", + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/strip-literal/-/strip-literal-2.1.0.tgz", + "integrity": "sha512-Op+UycaUt/8FbN/Z2TWPBLge3jWrP3xj10f3fnYxf052bKuS3EKs1ZQcVGjnEMdsNVAM+plXRdmjrZ/KgG3Skw==", "dev": true, "dependencies": { - "js-tokens": "^8.0.2" + "js-tokens": "^9.0.0" }, "funding": { "url": "https://github.com/sponsors/antfu" } }, "node_modules/strip-literal/node_modules/js-tokens": { - "version": "8.0.3", - "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-8.0.3.tgz", - "integrity": "sha512-UfJMcSJc+SEXEl9lH/VLHSZbThQyLpw1vLO1Lb+j4RWDvG3N2f7yj3PVQA3cmkTBNldJ9eFnM+xEXxHIXrYiJw==", + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-9.0.0.tgz", + "integrity": "sha512-WriZw1luRMlmV3LGJaR6QOJjWwgLUTf89OwT2lUOyjX2dJGBwgmIkbcz+7WFZjrZM635JOIR517++e/67CP9dQ==", "dev": true }, "node_modules/stylehacks": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.0.tgz", - "integrity": "sha512-ETErsPFgwlfYZ/CSjMO2Ddf+TsnkCVPBPaoB99Ro8WMAxf7cglzmFsRBhRmKObFjibtcvlNxFFPHuyr3sNlNUQ==", + "version": "6.1.1", + "resolved": "https://registry.npmjs.org/stylehacks/-/stylehacks-6.1.1.tgz", + "integrity": "sha512-gSTTEQ670cJNoaeIp9KX6lZmm8LJ3jPB5yJmX8Zq/wQxOsAFXV3qjWzHas3YYk1qesuVIyYWWUpZ0vSE/dTSGg==", "dev": true, "dependencies": { "browserslist": "^4.23.0", - "postcss-selector-parser": "^6.0.15" + "postcss-selector-parser": "^6.0.16" }, "engines": { "node": "^14 || ^16 || >=18.0" @@ -8092,16 +8263,16 @@ } }, "node_modules/sucrase/node_modules/glob": { - "version": "10.3.10", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.10.tgz", - "integrity": "sha512-fa46+tv1Ak0UPK1TOy/pZrIybNNt4HCv7SDzwyfiOZkvZLEbjsZkJBPtDHVshZjbecAoAGSC20MjLDG/qr679g==", + "version": "10.3.12", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", + "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", - "jackspeak": "^2.3.5", + "jackspeak": "^2.3.6", "minimatch": "^9.0.1", - "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0", - "path-scurry": "^1.10.1" + "minipass": "^7.0.4", + "path-scurry": "^1.10.2" }, "bin": { "glob": "dist/esm/bin.mjs" @@ -8114,15 +8285,15 @@ } }, "node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "version": "5.5.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", + "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", "dev": true, "dependencies": { - "has-flag": "^4.0.0" + "has-flag": "^3.0.0" }, "engines": { - "node": ">=8" + "node": ">=4" } }, "node_modules/supports-preserve-symlinks-flag": { @@ -8171,9 +8342,9 @@ } }, "node_modules/tailwindcss": { - "version": "3.4.1", - "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.1.tgz", - "integrity": "sha512-qAYmXRfk3ENzuPBakNK0SRrUDipP8NQnEY6772uDhflcQz5EhRdD7JNZxyrFHVQNCwULPBn6FNPp9brpO7ctcA==", + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/tailwindcss/-/tailwindcss-3.4.3.tgz", + "integrity": "sha512-U7sxQk/n397Bmx4JHbJx/iSOOv5G+II3f1kpLpY2QeUv5DcPdcTsYLlusZfq1NthHS1c1cZoyFmmkex1rzke0A==", "dev": true, "dependencies": { "@alloc/quick-lru": "^5.2.0", @@ -8184,7 +8355,7 @@ "fast-glob": "^3.3.0", "glob-parent": "^6.0.2", "is-glob": "^4.0.3", - "jiti": "^1.19.1", + "jiti": "^1.21.0", "lilconfig": "^2.1.0", "micromatch": "^4.0.5", "normalize-path": "^3.0.0", @@ -8257,9 +8428,9 @@ } }, "node_modules/three-stdlib": { - "version": "2.29.5", - "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.29.5.tgz", - "integrity": "sha512-p9IQsH7gT9wVqAuMsimX2JTtEoCGHlwgm3HsAeXwWqP/PWV9DjYldbggLCr0B1TMzofi/58GG1X5KTQnG6ijpw==", + "version": "2.29.6", + "resolved": "https://registry.npmjs.org/three-stdlib/-/three-stdlib-2.29.6.tgz", + "integrity": "sha512-nj9bHkzhhwfmqQcM/keC2RDb0bHhbw6bRXTy81ehzi8F1rtp6pJ5eS0/vl1Eg5RMFqXOMyxJ6sDHPoLU+IrVZg==", "dependencies": { "@types/draco3d": "^1.4.0", "@types/offscreencanvas": "^2019.6.4", @@ -8279,9 +8450,9 @@ "dev": true }, "node_modules/tinypool": { - "version": "0.8.2", - "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.2.tgz", - "integrity": "sha512-SUszKYe5wgsxnNOVlBYO6IC+8VGWdVGZWAqUxp3UErNBtptZvWbwyUOyzNL59zigz2rCA92QiL3wvG+JDSdJdQ==", + "version": "0.8.3", + "resolved": "https://registry.npmjs.org/tinypool/-/tinypool-0.8.3.tgz", + "integrity": "sha512-Ud7uepAklqRH1bvwy22ynrliC7Dljz7Tm8M/0RBUW+YRa4YHhZ6e4PpgE+fu1zr/WqB1kbeuVrdfeuyIBpy4tw==", "dev": true, "engines": { "node": ">=14.0.0" @@ -8354,9 +8525,9 @@ "integrity": "sha512-1xZHoJrG0HFfCvT/iyN41DvI/nRykiBtHqFkGaGgJwq5iXfIZFBiPPEHFpPpgyKM3Oo5ITHXP5wM2TNQszYdVg==" }, "node_modules/ts-api-utils": { - "version": "1.2.1", - "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.2.1.tgz", - "integrity": "sha512-RIYA36cJn2WiH9Hy77hdF9r7oEwxAtB/TS9/S4Qd90Ap4z5FSiin5zEiTL44OII1Y3IIlEvxwxFUVgrHSZ/UpA==", + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", "dev": true, "engines": { "node": ">=16" @@ -8515,9 +8686,9 @@ } }, "node_modules/typed-array-length": { - "version": "1.0.5", - "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.5.tgz", - "integrity": "sha512-yMi0PlwuznKHxKmcpoOdeLwxBoVPkqZxd7q2FgMkmD3bNwvF5VW0+UlUQ1k1vmktTu4Yu13Q0RIxEP8+B+wloA==", + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/typed-array-length/-/typed-array-length-1.0.6.tgz", + "integrity": "sha512-/OxDN6OtAk5KBpGb28T+HZc2M+ADtvRxXrKKbUwtsLgdoxgX13hyy7ek6bFRl5+aBs2yZzB0c4CnQfAtVypW/g==", "dev": true, "peer": true, "dependencies": { @@ -8536,9 +8707,9 @@ } }, "node_modules/typescript": { - "version": "5.3.3", - "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz", - "integrity": "sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw==", + "version": "5.4.4", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.4.tgz", + "integrity": "sha512-dGE2Vv8cpVvw28v8HCPqyb08EzbBURxDpuhJvTrusShUfGnhHBafDsLdS1EhhxyL6BJQE+2cT3dDPAv+MQ6oLw==", "dev": true, "bin": { "tsc": "bin/tsc", @@ -8555,9 +8726,9 @@ "dev": true }, "node_modules/ufo": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.4.0.tgz", - "integrity": "sha512-Hhy+BhRBleFjpJ2vchUNN40qgkh0366FWJGqVLYBHev0vpHTrXSA0ryT+74UiW6KWsldNurQMKGqCm1M2zBciQ==", + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", "dev": true }, "node_modules/uglify-js": { @@ -8674,14 +8845,14 @@ } }, "node_modules/vite": { - "version": "5.1.4", - "resolved": "https://registry.npmjs.org/vite/-/vite-5.1.4.tgz", - "integrity": "sha512-n+MPqzq+d9nMVTKyewqw6kSt+R3CkvF9QAKY8obiQn8g1fwTscKxyfaYnC632HtBXAQGc1Yjomphwn1dtwGAHg==", + "version": "5.2.8", + "resolved": "https://registry.npmjs.org/vite/-/vite-5.2.8.tgz", + "integrity": "sha512-OyZR+c1CE8yeHw5V5t59aXsUPPVTHMDjEZz8MgguLL/Q7NblxhZUlTu9xSPqlsUO/y+X7dlU05jdhvyycD55DA==", "dev": true, "dependencies": { - "esbuild": "^0.19.3", - "postcss": "^8.4.35", - "rollup": "^4.2.0" + "esbuild": "^0.20.1", + "postcss": "^8.4.38", + "rollup": "^4.13.0" }, "bin": { "vite": "bin/vite.js" @@ -8729,9 +8900,9 @@ } }, "node_modules/vite-node": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.3.1.tgz", - "integrity": "sha512-azbRrqRxlWTJEVbzInZCTchx0X69M/XPTCz4H+TLvlTcR/xH/3hkRqhOakT41fMJCMzXTu4UvegkZiEoJAWvng==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vite-node/-/vite-node-1.4.0.tgz", + "integrity": "sha512-VZDAseqjrHgNd4Kh8icYHWzTKSCZMhia7GyHfhtzLW33fZlG9SwsB6CEhgyVOWkJfJ2pFLrp/Gj1FSfAiqH9Lw==", "dev": true, "dependencies": { "cac": "^6.7.14", @@ -8767,16 +8938,16 @@ } }, "node_modules/vitest": { - "version": "1.3.1", - "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.3.1.tgz", - "integrity": "sha512-/1QJqXs8YbCrfv/GPQ05wAZf2eakUPLPa18vkJAKE7RXOKfVHqMZZ1WlTjiwl6Gcn65M5vpNUB6EFLnEdRdEXQ==", + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/vitest/-/vitest-1.4.0.tgz", + "integrity": "sha512-gujzn0g7fmwf83/WzrDTnncZt2UiXP41mHuFYFrdwaLRVQ6JYQEiME2IfEjU3vcFL3VKa75XhI3lFgn+hfVsQw==", "dev": true, "dependencies": { - "@vitest/expect": "1.3.1", - "@vitest/runner": "1.3.1", - "@vitest/snapshot": "1.3.1", - "@vitest/spy": "1.3.1", - "@vitest/utils": "1.3.1", + "@vitest/expect": "1.4.0", + "@vitest/runner": "1.4.0", + "@vitest/snapshot": "1.4.0", + "@vitest/spy": "1.4.0", + "@vitest/utils": "1.4.0", "acorn-walk": "^8.3.2", "chai": "^4.3.10", "debug": "^4.3.4", @@ -8790,7 +8961,7 @@ "tinybench": "^2.5.1", "tinypool": "^0.8.2", "vite": "^5.0.0", - "vite-node": "1.3.1", + "vite-node": "1.4.0", "why-is-node-running": "^2.2.2" }, "bin": { @@ -8805,8 +8976,8 @@ "peerDependencies": { "@edge-runtime/vm": "*", "@types/node": "^18.0.0 || >=20.0.0", - "@vitest/browser": "1.3.1", - "@vitest/ui": "1.3.1", + "@vitest/browser": "1.4.0", + "@vitest/ui": "1.4.0", "happy-dom": "*", "jsdom": "*" }, @@ -8952,6 +9123,39 @@ "url": "https://github.com/chalk/wrap-ansi?sponsor=1" } }, + "node_modules/wrap-ansi-cjs/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "dev": true, + "dependencies": { + "color-convert": "^2.0.1" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/chalk/ansi-styles?sponsor=1" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "dev": true, + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi-cjs/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "dev": true + }, "node_modules/wrap-ansi-cjs/node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -9024,9 +9228,9 @@ "dev": true }, "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", "dev": true }, "node_modules/yaml": { diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index b95fa0dabc..2c078ceb76 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -383,25 +383,54 @@ class PhysicsSystem extends WorldSystem { // = getPerpendicular(hingeConstraintSettings.mHingeAxis1); const wheelSettings = new JOLT.WheelSettingsWV(); - wheelSettings.mPosition = anchorPoint; + wheelSettings.mPosition = anchorPoint.Add(axis.Mul(0.1)); wheelSettings.mMaxSteerAngle = 0.0; wheelSettings.mMaxHandBrakeTorque = 0.0; wheelSettings.mRadius = 0.1; - wheelSettings.mWidth = 0.2; + wheelSettings.mWidth = 0.1; wheelSettings.mSuspensionMinLength = 0.00003; wheelSettings.mSuspensionMaxLength = 0.00006; + wheelSettings.mInertia = 1; + + const friction = new JOLT.LinearCurve(); + friction.Clear(); + friction.AddPoint(1,1); + friction.AddPoint(0,1); + wheelSettings.mLongitudinalFriction = friction; + + const wheelSettingsB = new JOLT.WheelSettingsWV(); + wheelSettingsB.mPosition = anchorPoint.Sub(axis.Mul(0.1)); + wheelSettingsB.mMaxSteerAngle = 0.0; + wheelSettingsB.mMaxHandBrakeTorque = 0.0; + wheelSettingsB.mRadius = 0.1; + wheelSettingsB.mWidth = 0.1; + wheelSettingsB.mSuspensionMinLength = 0.00003; + wheelSettingsB.mSuspensionMaxLength = 0.00006; + wheelSettingsB.mInertia = 1; + + wheelSettingsB.mLongitudinalFriction = friction; const vehicleSettings = new JOLT.VehicleConstraintSettings(); vehicleSettings.mWheels.clear(); vehicleSettings.mWheels.push_back(wheelSettings); + vehicleSettings.mWheels.push_back(wheelSettingsB); const controllerSettings = new JOLT.WheeledVehicleControllerSettings(); - controllerSettings.mEngine.mMaxTorque = 500.0; + controllerSettings.mEngine.mMaxTorque = 1500.0; controllerSettings.mTransmission.mClutchStrength = 10.0; + controllerSettings.mTransmission.mGearRatios.clear(); + controllerSettings.mTransmission.mGearRatios.push_back(2); + controllerSettings.mTransmission.mMode = JOLT.ETransmissionMode_Auto; vehicleSettings.mController = controllerSettings; - controllerSettings.mDifferentials.clear(); + // controllerSettings.mDifferentials.clear(); + // const differential = new JOLT.VehicleDifferentialSettings(); + // differential.mLeftWheel = -1; + // differential.mRightWheel = 1; + // differential.mDifferentialRatio = 1.93 * 40.0 / 16.0; + // controllerSettings.mDifferentials.push_back(differential); + vehicleSettings.mAntiRollBars.clear(); const vehicleConstraint = new JOLT.VehicleConstraint(bodyB, vehicleSettings); diff --git a/fission/src/systems/simulation/SimulationSystem.ts b/fission/src/systems/simulation/SimulationSystem.ts index e95aee6acc..7b2ba8fdc8 100644 --- a/fission/src/systems/simulation/SimulationSystem.ts +++ b/fission/src/systems/simulation/SimulationSystem.ts @@ -6,6 +6,7 @@ import Driver from "./driver/Driver"; import Stimulus from "./stimulus/Stimulus"; import HingeDriver from "./driver/HingeDriver"; import WheelDriver from "./driver/WheelDriver"; +import SliderDriver from "./driver/SliderDriver"; class SimulationSystem extends WorldSystem { @@ -62,6 +63,10 @@ class SimulationLayer { const vehicle = JOLT.castObject(x.constraint, JOLT.VehicleConstraint); const driver = new WheelDriver(vehicle); this._drivers.push(driver); + } else if (x.constraint.GetSubType() == JOLT.EConstraintSubType_Slider) { + const slider = JOLT.castObject(x.constraint, JOLT.SliderConstraint); + const driver = new SliderDriver(slider); + this._drivers.push(driver); } }); diff --git a/fission/src/systems/simulation/driver/HingeDriver.ts b/fission/src/systems/simulation/driver/HingeDriver.ts index 772bbf7f60..2c992bfe78 100644 --- a/fission/src/systems/simulation/driver/HingeDriver.ts +++ b/fission/src/systems/simulation/driver/HingeDriver.ts @@ -18,8 +18,8 @@ class HingeDriver extends Driver { springSettings.mDamping = 0.995; motorSettings.mSpringSettings = springSettings; - motorSettings.mMinTorqueLimit = -125.0; - motorSettings.mMaxTorqueLimit = 125.0; + motorSettings.mMinTorqueLimit = -50.0; + motorSettings.mMaxTorqueLimit = 50.0; this._constraint.SetMotorState(JOLT.EMotorState_Velocity); } @@ -29,7 +29,7 @@ class HingeDriver extends Driver { this._timeAccum += deltaT; const vel = Math.sin(this._timeAccum * 0.8) * 0.5; // console.log(`Ang Vel: ${vel}`); - this._constraint.SetTargetAngularVelocity(vel); + // this._constraint.SetTargetAngularVelocity(vel); // if (!this._constraint.GetBody2().IsActive()) { // console.log("Asleep"); diff --git a/fission/src/systems/simulation/driver/SliderDriver.ts b/fission/src/systems/simulation/driver/SliderDriver.ts new file mode 100644 index 0000000000..1de8964676 --- /dev/null +++ b/fission/src/systems/simulation/driver/SliderDriver.ts @@ -0,0 +1,44 @@ +import Jolt from "@barclah/jolt-physics"; +import Driver from "./Driver"; +import { SIMULATION_PERIOD } from "@/systems/physics/PhysicsSystem"; +import JOLT from "@/util/loading/JoltSyncLoader"; + +class SliderDriver extends Driver { + + private _constraint: Jolt.SliderConstraint; + + public constructor(constraint: Jolt.SliderConstraint) { + super(); + + this._constraint = constraint; + + const motorSettings = this._constraint.GetMotorSettings(); + const springSettings = motorSettings.mSpringSettings; + springSettings.mFrequency = 20 * (1.0 / SIMULATION_PERIOD); + springSettings.mDamping = 0.995; + + motorSettings.mSpringSettings = springSettings; + motorSettings.mMinTorqueLimit = -125.0; + motorSettings.mMaxTorqueLimit = 125.0; + + this._constraint.SetMotorState(JOLT.EMotorState_Position); + this._constraint.SetTargetPosition(this._constraint.GetCurrentPosition()); + } + + private _flip = 1; + public Update(deltaT: number): void { + + let targetPosition = this._constraint.GetTargetPosition() + (this._flip * deltaT * 0.05); + if (targetPosition < this._constraint.GetLimitsMin()) { + targetPosition = this._constraint.GetLimitsMin(); + this._flip *= -1; + } else if (targetPosition > this._constraint.GetLimitsMax()) { + targetPosition = this._constraint.GetLimitsMax(); + this._flip *= -1; + } + + this._constraint.SetTargetPosition(targetPosition); + } +} + +export default SliderDriver; \ No newline at end of file diff --git a/fission/src/systems/simulation/driver/WheelDriver.ts b/fission/src/systems/simulation/driver/WheelDriver.ts index d92f0d5b93..36fd83d979 100644 --- a/fission/src/systems/simulation/driver/WheelDriver.ts +++ b/fission/src/systems/simulation/driver/WheelDriver.ts @@ -16,9 +16,15 @@ class WheelDriver extends Driver { this._controller = JOLT.castObject(this._constraint.GetController(), JOLT.WheeledVehicleController); } - private _timeAccum = 0; public Update(deltaT: number): void { - this._controller.SetDriverInput(1.0, 0.0, 0.0, 0.0); + // this._controller.GetEngine().SetCurrentRPM(1000); + // this._controller.SetDriverInput(1.0, 0.0, 0.0, 0.0); + + // this._constraint.GetWheel(0).SetAngularVelocity(10); + + const current = this._constraint.GetVehicleBody().GetLinearVelocity(); + console.log(`Speed: ${current.Length()}`); + if (!this._constraint.GetVehicleBody().IsActive()) { console.log("Asleep"); } From 200b551d5bcf3ae61b8f3e2b4ee6fcd855c63c0c Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Tue, 9 Apr 2024 23:23:32 -0600 Subject: [PATCH 11/17] Starting to flush out drivers and stimuli --- fission/README.md | 24 ++++++++++- .../systems/simulation/SimulationSystem.ts | 12 +++++- .../systems/simulation/driver/HingeDriver.ts | 12 +++--- .../systems/simulation/driver/WheelDriver.ts | 22 ++++++---- .../simulation/stimulus/EncoderStimulus.ts | 14 +++++++ .../simulation/stimulus/HingeStimulus.ts | 39 +++++++++++++++++ .../simulation/stimulus/SliderStimulus.ts | 21 ++++++++++ .../simulation/stimulus/WheelStimulus.ts | 42 +++++++++++++++++++ 8 files changed, 171 insertions(+), 15 deletions(-) create mode 100644 fission/src/systems/simulation/stimulus/EncoderStimulus.ts create mode 100644 fission/src/systems/simulation/stimulus/HingeStimulus.ts create mode 100644 fission/src/systems/simulation/stimulus/SliderStimulus.ts create mode 100644 fission/src/systems/simulation/stimulus/WheelStimulus.ts diff --git a/fission/README.md b/fission/README.md index 1f5486ae17..5a98a1d65e 100644 --- a/fission/README.md +++ b/fission/README.md @@ -27,4 +27,26 @@ npm run preview To run unit tests, run the following package script: ```bash npm run test -``` \ No newline at end of file +``` + +## Core Systems +These core systems make up the bulk of the vital technologies to make Synthesis work. The idea is that these systems will serve as a +jumping off point for anything requiring real-time simulation. + +### World + +### Scene Renderer + +### Physics System +[Jolt Physics Architecture](https://jrouwe.github.io/JoltPhysics/) + +### Input System + +### UI System + +## Additional Systems +These systems will extend off of the core systems to build out features in Synthesis. + +### Simulation System + +### Mode System diff --git a/fission/src/systems/simulation/SimulationSystem.ts b/fission/src/systems/simulation/SimulationSystem.ts index 7b2ba8fdc8..abf7ba5a58 100644 --- a/fission/src/systems/simulation/SimulationSystem.ts +++ b/fission/src/systems/simulation/SimulationSystem.ts @@ -7,6 +7,9 @@ import Stimulus from "./stimulus/Stimulus"; import HingeDriver from "./driver/HingeDriver"; import WheelDriver from "./driver/WheelDriver"; import SliderDriver from "./driver/SliderDriver"; +import HingeStimulus from "./stimulus/HingeStimulus"; +import WheelRotationStimulus from "./stimulus/WheelStimulus"; +import SliderStimulus from "./stimulus/SliderStimulus"; class SimulationSystem extends WorldSystem { @@ -54,23 +57,28 @@ class SimulationLayer { // Generate standard drivers and stimuli this._drivers = []; + this._stimuli = []; this._mechanism.constraints.forEach(x => { if (x.constraint.GetSubType() == JOLT.EConstraintSubType_Hinge) { const hinge = JOLT.castObject(x.constraint, JOLT.HingeConstraint); const driver = new HingeDriver(hinge); this._drivers.push(driver); + const stim = new HingeStimulus(hinge); + this._stimuli.push(stim); } else if (x.constraint.GetSubType() == JOLT.EConstraintSubType_Vehicle) { const vehicle = JOLT.castObject(x.constraint, JOLT.VehicleConstraint); const driver = new WheelDriver(vehicle); this._drivers.push(driver); + const stim = new WheelRotationStimulus(vehicle.GetWheel(0)); + this._stimuli.push(stim); } else if (x.constraint.GetSubType() == JOLT.EConstraintSubType_Slider) { const slider = JOLT.castObject(x.constraint, JOLT.SliderConstraint); const driver = new SliderDriver(slider); this._drivers.push(driver); + const stim = new SliderStimulus(slider); + this._stimuli.push(stim); } }); - - this._stimuli = []; } public Update(deltaT: number) { diff --git a/fission/src/systems/simulation/driver/HingeDriver.ts b/fission/src/systems/simulation/driver/HingeDriver.ts index 2c992bfe78..981b0fc32f 100644 --- a/fission/src/systems/simulation/driver/HingeDriver.ts +++ b/fission/src/systems/simulation/driver/HingeDriver.ts @@ -7,6 +7,12 @@ class HingeDriver extends Driver { private _constraint: Jolt.HingeConstraint; + private _targetVelocity: number = 0.0; + + public set targetVelocity(radsPerSec: number) { + this._targetVelocity = radsPerSec; + } + public constructor(constraint: Jolt.HingeConstraint) { super(); @@ -28,12 +34,8 @@ class HingeDriver extends Driver { public Update(deltaT: number): void { this._timeAccum += deltaT; const vel = Math.sin(this._timeAccum * 0.8) * 0.5; - // console.log(`Ang Vel: ${vel}`); - // this._constraint.SetTargetAngularVelocity(vel); + this._constraint.SetTargetAngularVelocity(this._targetVelocity); - // if (!this._constraint.GetBody2().IsActive()) { - // console.log("Asleep"); - // } } } diff --git a/fission/src/systems/simulation/driver/WheelDriver.ts b/fission/src/systems/simulation/driver/WheelDriver.ts index 36fd83d979..79a1bc2dcd 100644 --- a/fission/src/systems/simulation/driver/WheelDriver.ts +++ b/fission/src/systems/simulation/driver/WheelDriver.ts @@ -6,21 +6,29 @@ import JOLT from "@/util/loading/JoltSyncLoader"; class WheelDriver extends Driver { private _constraint: Jolt.VehicleConstraint; - private _controller: Jolt.WheeledVehicleController; + private _wheel: Jolt.WheelWV; + + private _targetWheelSpeed: number = 0.0; + + public get actualWheelSpeed(): number { + return this._wheel.GetAngularVelocity(); + } + public get targetWheelSpeed(): number { + return this._targetWheelSpeed; + } + public set targetWheelSpeed(radsPerSec: number) { + this._wheel.SetAngularVelocity(radsPerSec); + } public constructor(constraint: Jolt.VehicleConstraint) { super(); this._constraint = constraint; - - this._controller = JOLT.castObject(this._constraint.GetController(), JOLT.WheeledVehicleController); + this._wheel = JOLT.castObject(this._constraint.GetWheel(0), JOLT.WheelWV); } public Update(deltaT: number): void { - // this._controller.GetEngine().SetCurrentRPM(1000); - // this._controller.SetDriverInput(1.0, 0.0, 0.0, 0.0); - - // this._constraint.GetWheel(0).SetAngularVelocity(10); + this._wheel.SetAngularVelocity(this._targetWheelSpeed); const current = this._constraint.GetVehicleBody().GetLinearVelocity(); console.log(`Speed: ${current.Length()}`); diff --git a/fission/src/systems/simulation/stimulus/EncoderStimulus.ts b/fission/src/systems/simulation/stimulus/EncoderStimulus.ts new file mode 100644 index 0000000000..97018660fb --- /dev/null +++ b/fission/src/systems/simulation/stimulus/EncoderStimulus.ts @@ -0,0 +1,14 @@ +import Stimulus from "./Stimulus"; + +abstract class EncoderStimulus extends Stimulus { + + public abstract get value(): number; + + protected constructor() { + super(); + } + + public abstract Update(_: number): void; +} + +export default EncoderStimulus; \ No newline at end of file diff --git a/fission/src/systems/simulation/stimulus/HingeStimulus.ts b/fission/src/systems/simulation/stimulus/HingeStimulus.ts new file mode 100644 index 0000000000..1ab01a88fc --- /dev/null +++ b/fission/src/systems/simulation/stimulus/HingeStimulus.ts @@ -0,0 +1,39 @@ +import Jolt from "@barclah/jolt-physics"; +import EncoderStimulus from "./EncoderStimulus"; + +class HingeStimulus extends EncoderStimulus { + private _accum: boolean = false; + private _hingeAngleAccum = 0.0; + private _hinge: Jolt.HingeConstraint; + + public get value(): number { + if (this._accum) { + return this._hingeAngleAccum; + } else { + return this._hinge.GetCurrentAngle(); + } + } + + public set accum(shouldAccum: boolean) { + if (!this._accum && shouldAccum) { + this.resetAccum(); + } + this._accum = shouldAccum; + } + + public constructor(hinge: Jolt.HingeConstraint) { + super(); + + this._hinge = hinge; + } + + public Update(deltaT: number): void { + if (this._accum) { + this._hingeAngleAccum += this._hinge.GetTargetAngularVelocity() * deltaT; + } + } + + public resetAccum() { this._hingeAngleAccum = 0.0; } +} + +export default HingeStimulus; \ No newline at end of file diff --git a/fission/src/systems/simulation/stimulus/SliderStimulus.ts b/fission/src/systems/simulation/stimulus/SliderStimulus.ts new file mode 100644 index 0000000000..d084ec8a20 --- /dev/null +++ b/fission/src/systems/simulation/stimulus/SliderStimulus.ts @@ -0,0 +1,21 @@ +import Jolt from "@barclah/jolt-physics"; +import EncoderStimulus from "./EncoderStimulus"; + +class SliderStimulus extends EncoderStimulus { + + private _slider: Jolt.SliderConstraint; + + public get value(): number { + return this._slider.GetCurrentPosition(); + } + + public constructor(slider: Jolt.SliderConstraint) { + super(); + + this._slider = slider; + } + + public Update(_: number): void { } +} + +export default SliderStimulus; \ No newline at end of file diff --git a/fission/src/systems/simulation/stimulus/WheelStimulus.ts b/fission/src/systems/simulation/stimulus/WheelStimulus.ts new file mode 100644 index 0000000000..354c1d2b60 --- /dev/null +++ b/fission/src/systems/simulation/stimulus/WheelStimulus.ts @@ -0,0 +1,42 @@ +import Jolt from "@barclah/jolt-physics"; +import EncoderStimulus from "./EncoderStimulus"; + +/** + * + */ +class WheelRotationStimulus extends EncoderStimulus { + private _accum: boolean = true; + private _wheelRotationAccum = 0.0; + private _wheel: Jolt.Wheel; + + public get value(): number { + if (this._accum) { + return this._wheelRotationAccum; + } else { + return this._wheel.GetRotationAngle(); + } + } + + public set accum(shouldAccum: boolean) { + if (!this._accum && shouldAccum) { + this.resetAccum(); + } + this._accum = shouldAccum; + } + + public constructor(wheel: Jolt.Wheel) { + super(); + + this._wheel = wheel; + } + + public Update(deltaT: number): void { + if (this._accum) { + this._wheelRotationAccum += this._wheel.GetAngularVelocity() * deltaT; + } + } + + public resetAccum() { this._wheelRotationAccum = 0.0; } +} + +export default WheelRotationStimulus; \ No newline at end of file From edf1e8765f536883a99906c14326cb83daba425f Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Thu, 11 Apr 2024 19:14:12 -0600 Subject: [PATCH 12/17] Wheels are too big --- fission/src/mirabuf/MirabufParser.ts | 10 +++++ fission/src/systems/physics/Mechanism.ts | 4 +- fission/src/systems/physics/PhysicsSystem.ts | 16 ++++++-- .../systems/simulation/driver/HingeDriver.ts | 17 ++++++-- .../systems/simulation/driver/SliderDriver.ts | 39 +++++++++++-------- .../systems/simulation/driver/WheelDriver.ts | 9 +---- .../simulation/stimulus/ChassisStimulus.ts | 29 ++++++++++++++ 7 files changed, 91 insertions(+), 33 deletions(-) create mode 100644 fission/src/systems/simulation/stimulus/ChassisStimulus.ts diff --git a/fission/src/mirabuf/MirabufParser.ts b/fission/src/mirabuf/MirabufParser.ts index 7052e8362f..ae58b9a165 100644 --- a/fission/src/mirabuf/MirabufParser.ts +++ b/fission/src/mirabuf/MirabufParser.ts @@ -153,6 +153,12 @@ class MirabufParser { if (!assembly.dynamic && this._groundedNode) { this._groundedNode.isDynamic = false; } + + // 7. Update root RigidNode + const rootNode = this._partToNodeMap.get(gInst.parts!.nodes!.at(0)!.value!); + if (rootNode) { + rootNode.isRoot = true; + } } private NewRigidNode(suffix?: string): RigidNode { @@ -326,6 +332,7 @@ class MirabufParser { * Collection of mirabuf parts that are bound together */ class RigidNode { + public isRoot: boolean; public id: string; public parts: Set = new Set(); public isDynamic: boolean; @@ -333,6 +340,7 @@ class RigidNode { public constructor(id: string, isDynamic?: boolean) { this.id = id; this.isDynamic = isDynamic ?? true; + this.isRoot = false; } } @@ -351,6 +359,8 @@ export class RigidNodeReadOnly { return this._original.isDynamic; } + public get isRoot(): boolean { return this._original.isRoot; } + public constructor(original: RigidNode) { this._original = original; } diff --git a/fission/src/systems/physics/Mechanism.ts b/fission/src/systems/physics/Mechanism.ts index 9ac5218f9c..9a0a40ca4b 100644 --- a/fission/src/systems/physics/Mechanism.ts +++ b/fission/src/systems/physics/Mechanism.ts @@ -8,11 +8,13 @@ export interface MechanismConstraint { } class Mechanism { + public rootBody: string; public nodeToBody: Map; public constraints: Array; public layerReserve: LayerReserve | undefined; - public constructor(bodyMap: Map, layerReserve?: LayerReserve) { + public constructor(rootBody: string, bodyMap: Map, layerReserve?: LayerReserve) { + this.rootBody = rootBody; this.nodeToBody = bodyMap; this.constraints = []; this.layerReserve = layerReserve; diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index 2c078ceb76..979cf535e5 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -158,7 +158,8 @@ class PhysicsSystem extends WorldSystem { public CreateMechanismFromParser(parser: MirabufParser) { const layer = parser.assembly.dynamic ? new LayerReserve(): undefined; const bodyMap = this.CreateBodiesFromParser(parser, layer); - const mechanism = new Mechanism(bodyMap, layer); + const rootBody = (parser.rigidNodes.find(x => x.isRoot) ?? parser.rigidNodes[0]).id; + const mechanism = new Mechanism(rootBody, bodyMap, layer); this.CreateJointsFromParser(parser, mechanism); return mechanism; } @@ -200,10 +201,11 @@ class PhysicsSystem extends WorldSystem { switch (jDef.jointMotionType!) { case mirabuf.joint.JointMotion.REVOLUTE: - if (this.IsWheel(jDef)) + if (this.IsWheel(jDef)) { constraint = this.CreateWheelConstraint(jInst, jDef, bodyA, bodyB, parser.assembly.info!.version!)[1]; - else + } else { constraint = this.CreateHingeConstraint(jInst, jDef, bodyA, bodyB, parser.assembly.info!.version!); + } break; case mirabuf.joint.JointMotion.SLIDER: constraint = this.CreateSliderConstraint(jInst, jDef, bodyA, bodyB); @@ -382,11 +384,17 @@ class PhysicsSystem extends WorldSystem { // hingeConstraintSettings.mNormalAxis1 = hingeConstraintSettings.mNormalAxis2 // = getPerpendicular(hingeConstraintSettings.mHingeAxis1); + const bounds = bodyA.GetShape().GetLocalBounds(); + const radius = bounds.mMax.GetY() - bounds.mMin.GetY(); + console.log(`Max: (${bounds.mMax.GetX()}, ${bounds.mMax.GetY()}, ${bounds.mMax.GetZ()})`); + console.log(`Min: (${bounds.mMin.GetX()}, ${bounds.mMin.GetY()}, ${bounds.mMin.GetZ()})`); + console.log(`Radius: ${radius}`); + const wheelSettings = new JOLT.WheelSettingsWV(); wheelSettings.mPosition = anchorPoint.Add(axis.Mul(0.1)); wheelSettings.mMaxSteerAngle = 0.0; wheelSettings.mMaxHandBrakeTorque = 0.0; - wheelSettings.mRadius = 0.1; + wheelSettings.mRadius = radius + 0.0001; wheelSettings.mWidth = 0.1; wheelSettings.mSuspensionMinLength = 0.00003; wheelSettings.mSuspensionMaxLength = 0.00006; diff --git a/fission/src/systems/simulation/driver/HingeDriver.ts b/fission/src/systems/simulation/driver/HingeDriver.ts index 981b0fc32f..1c82a5e5b2 100644 --- a/fission/src/systems/simulation/driver/HingeDriver.ts +++ b/fission/src/systems/simulation/driver/HingeDriver.ts @@ -9,10 +9,22 @@ class HingeDriver extends Driver { private _targetVelocity: number = 0.0; + public get targetVelocity(): number { + return this._targetVelocity; + } public set targetVelocity(radsPerSec: number) { this._targetVelocity = radsPerSec; } + public set minTorqueLimit(nm: number) { + const motorSettings = this._constraint.GetMotorSettings(); + motorSettings.mMinTorqueLimit = nm; + } + public set maxTorqueLimit(nm: number) { + const motorSettings = this._constraint.GetMotorSettings(); + motorSettings.mMaxTorqueLimit = nm; + } + public constructor(constraint: Jolt.HingeConstraint) { super(); @@ -30,10 +42,7 @@ class HingeDriver extends Driver { this._constraint.SetMotorState(JOLT.EMotorState_Velocity); } - private _timeAccum = 0; - public Update(deltaT: number): void { - this._timeAccum += deltaT; - const vel = Math.sin(this._timeAccum * 0.8) * 0.5; + public Update(_: number): void { this._constraint.SetTargetAngularVelocity(this._targetVelocity); } diff --git a/fission/src/systems/simulation/driver/SliderDriver.ts b/fission/src/systems/simulation/driver/SliderDriver.ts index 1de8964676..9e6891f974 100644 --- a/fission/src/systems/simulation/driver/SliderDriver.ts +++ b/fission/src/systems/simulation/driver/SliderDriver.ts @@ -6,6 +6,23 @@ import JOLT from "@/util/loading/JoltSyncLoader"; class SliderDriver extends Driver { private _constraint: Jolt.SliderConstraint; + private _targetPosition: number = 0.0; + + public get targetPosition(): number { + return this._targetPosition; + } + public set targetPosition(position: number) { + this._targetPosition = Math.max(this._constraint.GetLimitsMin(), Math.min(this._constraint.GetLimitsMax(), position)); + } + + public set minForceLimit(newtons: number) { + const motorSettings = this._constraint.GetMotorSettings(); + motorSettings.mMinForceLimit = newtons; + } + public set maxForceLimit(newtons: number) { + const motorSettings = this._constraint.GetMotorSettings(); + motorSettings.mMaxForceLimit = newtons; + } public constructor(constraint: Jolt.SliderConstraint) { super(); @@ -18,26 +35,16 @@ class SliderDriver extends Driver { springSettings.mDamping = 0.995; motorSettings.mSpringSettings = springSettings; - motorSettings.mMinTorqueLimit = -125.0; - motorSettings.mMaxTorqueLimit = 125.0; + motorSettings.mMinForceLimit = -125.0; + motorSettings.mMaxForceLimit = 125.0; this._constraint.SetMotorState(JOLT.EMotorState_Position); - this._constraint.SetTargetPosition(this._constraint.GetCurrentPosition()); - } - private _flip = 1; - public Update(deltaT: number): void { - - let targetPosition = this._constraint.GetTargetPosition() + (this._flip * deltaT * 0.05); - if (targetPosition < this._constraint.GetLimitsMin()) { - targetPosition = this._constraint.GetLimitsMin(); - this._flip *= -1; - } else if (targetPosition > this._constraint.GetLimitsMax()) { - targetPosition = this._constraint.GetLimitsMax(); - this._flip *= -1; - } + this.targetPosition = this._constraint.GetCurrentPosition(); + } - this._constraint.SetTargetPosition(targetPosition); + public Update(_: number): void { + this._constraint.SetTargetPosition(this._targetPosition); } } diff --git a/fission/src/systems/simulation/driver/WheelDriver.ts b/fission/src/systems/simulation/driver/WheelDriver.ts index 79a1bc2dcd..69676c182d 100644 --- a/fission/src/systems/simulation/driver/WheelDriver.ts +++ b/fission/src/systems/simulation/driver/WheelDriver.ts @@ -27,15 +27,8 @@ class WheelDriver extends Driver { this._wheel = JOLT.castObject(this._constraint.GetWheel(0), JOLT.WheelWV); } - public Update(deltaT: number): void { + public Update(_: number): void { this._wheel.SetAngularVelocity(this._targetWheelSpeed); - - const current = this._constraint.GetVehicleBody().GetLinearVelocity(); - console.log(`Speed: ${current.Length()}`); - - if (!this._constraint.GetVehicleBody().IsActive()) { - console.log("Asleep"); - } } } diff --git a/fission/src/systems/simulation/stimulus/ChassisStimulus.ts b/fission/src/systems/simulation/stimulus/ChassisStimulus.ts new file mode 100644 index 0000000000..d8c010b71f --- /dev/null +++ b/fission/src/systems/simulation/stimulus/ChassisStimulus.ts @@ -0,0 +1,29 @@ +import Jolt from "@barclah/jolt-physics"; +import Stimulus from "./Stimulus"; + +class ChassisStimulus extends Stimulus { + private _body: Jolt.Body; + private _mass: number; + + public get linearVelocity(): Jolt.Vec3 { + return this._body.GetLinearVelocity(); + } + public get angularVelocity(): Jolt.Vec3 { + return this._body.GetAngularVelocity(); + } + public get acceleration(): Jolt.Vec3 { + return this._body.GetAccumulatedForce().Div(this._mass); + } + public get rotation(): Jolt.Vec3 { + return this._body.GetRotation().GetEulerAngles(); + } + + public constructor(body: Jolt.Body) { + super(); + + this._body = body; + this._mass = body.GetShape().GetMassProperties().mMass; + } + + public Update(_: number): void { } +} \ No newline at end of file From 1a374197c6dd106441295b63d5ffbee172b36fab Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Sat, 13 Apr 2024 19:09:55 -0600 Subject: [PATCH 13/17] Joint graph construction for determining wheels --- fission/src/mirabuf/MirabufParser.ts | 87 ++++++++++++++++++- fission/src/systems/physics/PhysicsSystem.ts | 16 ++-- .../systems/simulation/SimulationSystem.ts | 1 + 3 files changed, 95 insertions(+), 9 deletions(-) diff --git a/fission/src/mirabuf/MirabufParser.ts b/fission/src/mirabuf/MirabufParser.ts index ae58b9a165..7b132824db 100644 --- a/fission/src/mirabuf/MirabufParser.ts +++ b/fission/src/mirabuf/MirabufParser.ts @@ -25,6 +25,8 @@ class MirabufParser { private _assembly: mirabuf.Assembly; private _errors: Array; + private _directedGraph: Graph; + private _rootNode: string; protected _partTreeValues: Map = new Map(); private _designHierarchyRoot: mirabuf.INode = new mirabuf.Node(); @@ -43,9 +45,8 @@ class MirabufParser { public get partToNodeMap() { return this._partToNodeMap; } public get globalTransforms() { return this._globalTransforms; } public get groundedNode() { return this._groundedNode ? new RigidNodeReadOnly(this._groundedNode) : undefined; } - public get rigidNodes(): Array { - return this._rigidNodes.map(x => new RigidNodeReadOnly(x)); - } + public get rigidNodes(): Array { return this._rigidNodes.map(x => new RigidNodeReadOnly(x)); } + public get directedGraph() { return this._directedGraph; } public constructor(assembly: mirabuf.Assembly) { this._assembly = assembly; @@ -158,7 +159,48 @@ class MirabufParser { const rootNode = this._partToNodeMap.get(gInst.parts!.nodes!.at(0)!.value!); if (rootNode) { rootNode.isRoot = true; + this._rootNode = rootNode.id; + } else { + this._rootNode = this._rigidNodes[0].id; + } + + // 8. Generate Rigid Node Graph + // Build undirected graph + const graph = new Graph(); + graph.AddNode(rootNode ? rootNode.id : this._rigidNodes[0].id); + (Object.values(assembly.data!.joints!.jointInstances!) as mirabuf.joint.JointInstance[]).forEach(x => { + const rA = this._partToNodeMap.get(x.parentPart); + const rB = this._partToNodeMap.get(x.childPart); + + if (rA && rB && rA.id != rB.id) { + graph.AddNode(rA.id); + graph.AddNode(rB.id); + graph.AddEdgeUndirected(rA.id, rB.id); + } + }); + const directedGraph = new Graph(); + const whiteGreyBlackMap = new Map(); + this._rigidNodes.forEach(x => { + whiteGreyBlackMap.set(x.id, false); + directedGraph.AddNode(x.id); + }); + function directedRecursive(node: string) { + graph.GetAdjacencyList(node).forEach(x => { + if (whiteGreyBlackMap.has(x)) { + directedGraph.AddEdgeDirected(node, x); + whiteGreyBlackMap.delete(x); + directedRecursive(x); + } + }); + } + if (rootNode) { + whiteGreyBlackMap.delete(rootNode.id); + directedRecursive(rootNode.id); + } else { + whiteGreyBlackMap.delete(this._rigidNodes[0].id); + directedRecursive(this._rigidNodes[0].id); } + this._directedGraph = directedGraph; } private NewRigidNode(suffix?: string): RigidNode { @@ -366,4 +408,43 @@ export class RigidNodeReadOnly { } } +export class Graph { + private _adjacencyMap: Map; + + public get nodes() { + return this._adjacencyMap.keys(); + } + + public constructor() { + this._adjacencyMap = new Map(); + } + + public AddNode(node: string) { + if (!this._adjacencyMap.has(node)) + this._adjacencyMap.set(node, new Array()); + } + + public AddEdgeUndirected(nodeA: string, nodeB: string) { + if (!this._adjacencyMap.has(nodeA) || !this._adjacencyMap.has(nodeB)) + throw new Error("Nodes aren't in graph"); + + this._adjacencyMap.get(nodeA)!.push(nodeB); + this._adjacencyMap.get(nodeB)!.push(nodeA); + } + + public AddEdgeDirected(nodeA: string, nodeB: string) { + if (!this._adjacencyMap.has(nodeA) || !this._adjacencyMap.has(nodeB)) + throw new Error("Nodes aren't in graph"); + + this._adjacencyMap.get(nodeA)!.push(nodeB); + } + + public GetAdjacencyList(node: string) { + if (!this._adjacencyMap.has(node)) { // Don't remove this. Without this check initially, Map.get *randomly* fails. I have no clue why... + throw new Error(`Node '${node}' is not in adjacency list`); + } + return this._adjacencyMap.get(node)!; + } +} + export default MirabufParser; diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index 979cf535e5..226b99b149 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -202,7 +202,11 @@ class PhysicsSystem extends WorldSystem { switch (jDef.jointMotionType!) { case mirabuf.joint.JointMotion.REVOLUTE: if (this.IsWheel(jDef)) { - constraint = this.CreateWheelConstraint(jInst, jDef, bodyA, bodyB, parser.assembly.info!.version!)[1]; + if (parser.directedGraph.GetAdjacencyList(rnA.id).length > 0) { + constraint = this.CreateWheelConstraint(jInst, jDef, bodyA, bodyB, parser.assembly.info!.version!)[1]; + } else { + constraint = this.CreateWheelConstraint(jInst, jDef, bodyB, bodyA, parser.assembly.info!.version!)[1]; + } } else { constraint = this.CreateHingeConstraint(jInst, jDef, bodyA, bodyB, parser.assembly.info!.version!); } @@ -352,7 +356,7 @@ class PhysicsSystem extends WorldSystem { public CreateWheelConstraint( jointInstance: mirabuf.joint.JointInstance, jointDefinition: mirabuf.joint.Joint, - bodyA: Jolt.Body, bodyB: Jolt.Body, versionNum: number): [Jolt.Constraint, Jolt.VehicleConstraint] { + bodyMain: Jolt.Body, bodyWheel: Jolt.Body, versionNum: number): [Jolt.Constraint, Jolt.VehicleConstraint] { // HINGE CONSTRAINT const fixedSettings = new JOLT.FixedConstraintSettings(); @@ -384,7 +388,7 @@ class PhysicsSystem extends WorldSystem { // hingeConstraintSettings.mNormalAxis1 = hingeConstraintSettings.mNormalAxis2 // = getPerpendicular(hingeConstraintSettings.mHingeAxis1); - const bounds = bodyA.GetShape().GetLocalBounds(); + const bounds = bodyWheel.GetShape().GetLocalBounds(); const radius = bounds.mMax.GetY() - bounds.mMin.GetY(); console.log(`Max: (${bounds.mMax.GetX()}, ${bounds.mMax.GetY()}, ${bounds.mMax.GetZ()})`); console.log(`Min: (${bounds.mMin.GetX()}, ${bounds.mMin.GetY()}, ${bounds.mMin.GetZ()})`); @@ -441,11 +445,11 @@ class PhysicsSystem extends WorldSystem { vehicleSettings.mAntiRollBars.clear(); - const vehicleConstraint = new JOLT.VehicleConstraint(bodyB, vehicleSettings); - const fixedConstraint = JOLT.castObject(fixedSettings.Create(bodyA, bodyB), JOLT.TwoBodyConstraint); + const vehicleConstraint = new JOLT.VehicleConstraint(bodyWheel, vehicleSettings); + const fixedConstraint = JOLT.castObject(fixedSettings.Create(bodyMain, bodyWheel), JOLT.TwoBodyConstraint); // Wheel Collision Tester - const tester = new JOLT.VehicleCollisionTesterCastCylinder(bodyB.GetObjectLayer(), 0.05); + const tester = new JOLT.VehicleCollisionTesterCastCylinder(bodyWheel.GetObjectLayer(), 0.05); vehicleConstraint.SetVehicleCollisionTester(tester); diff --git a/fission/src/systems/simulation/SimulationSystem.ts b/fission/src/systems/simulation/SimulationSystem.ts index abf7ba5a58..2e3351220a 100644 --- a/fission/src/systems/simulation/SimulationSystem.ts +++ b/fission/src/systems/simulation/SimulationSystem.ts @@ -79,6 +79,7 @@ class SimulationLayer { this._stimuli.push(stim); } }); + } public Update(deltaT: number) { From 51981b4e051e8bcd7b6cb6a920e8d0e9a56d2dd4 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Sun, 14 Apr 2024 14:27:13 -0600 Subject: [PATCH 14/17] I think wheel radi are working correctly now --- fission/src/mirabuf/MirabufSceneObject.ts | 2 +- fission/src/systems/physics/PhysicsSystem.ts | 41 ++++++++++--------- .../systems/simulation/driver/WheelDriver.ts | 11 ++++- 3 files changed, 33 insertions(+), 21 deletions(-) diff --git a/fission/src/mirabuf/MirabufSceneObject.ts b/fission/src/mirabuf/MirabufSceneObject.ts index 24989d2874..189941cba5 100644 --- a/fission/src/mirabuf/MirabufSceneObject.ts +++ b/fission/src/mirabuf/MirabufSceneObject.ts @@ -82,7 +82,7 @@ class MirabufSceneObject extends SceneObject { if (isNaN(body.GetPosition().GetX())) { const vel = body.GetLinearVelocity(); const pos = body.GetPosition(); - console.debug(`Invalid Position.\nPosition => ${pos.GetX()}, ${pos.GetY()}, ${pos.GetZ()}\nVelocity => ${vel.GetX()}, ${vel.GetY()}, ${vel.GetZ()}`); + console.warn(`Invalid Position.\nPosition => ${pos.GetX()}, ${pos.GetY()}, ${pos.GetZ()}\nVelocity => ${vel.GetX()}, ${vel.GetY()}, ${vel.GetZ()}`); } // console.debug(`POSITION: ${body.GetPosition().GetX()}, ${body.GetPosition().GetY()}, ${body.GetPosition().GetZ()}`) diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index 226b99b149..0162c02094 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -389,19 +389,19 @@ class PhysicsSystem extends WorldSystem { // = getPerpendicular(hingeConstraintSettings.mHingeAxis1); const bounds = bodyWheel.GetShape().GetLocalBounds(); - const radius = bounds.mMax.GetY() - bounds.mMin.GetY(); - console.log(`Max: (${bounds.mMax.GetX()}, ${bounds.mMax.GetY()}, ${bounds.mMax.GetZ()})`); - console.log(`Min: (${bounds.mMin.GetX()}, ${bounds.mMin.GetY()}, ${bounds.mMin.GetZ()})`); - console.log(`Radius: ${radius}`); + const radius = (bounds.mMax.GetY() - bounds.mMin.GetY()) / 2.0; + // console.log(`Max: (${bounds.mMax.GetX()}, ${bounds.mMax.GetY()}, ${bounds.mMax.GetZ()})`); + // console.log(`Min: (${bounds.mMin.GetX()}, ${bounds.mMin.GetY()}, ${bounds.mMin.GetZ()})`); + // console.log(`Radius: ${radius}`); const wheelSettings = new JOLT.WheelSettingsWV(); wheelSettings.mPosition = anchorPoint.Add(axis.Mul(0.1)); wheelSettings.mMaxSteerAngle = 0.0; wheelSettings.mMaxHandBrakeTorque = 0.0; - wheelSettings.mRadius = radius + 0.0001; + wheelSettings.mRadius = radius * 1.05; wheelSettings.mWidth = 0.1; - wheelSettings.mSuspensionMinLength = 0.00003; - wheelSettings.mSuspensionMaxLength = 0.00006; + wheelSettings.mSuspensionMinLength = 0.0000003; + wheelSettings.mSuspensionMaxLength = 0.0000006; wheelSettings.mInertia = 1; const friction = new JOLT.LinearCurve(); @@ -410,23 +410,23 @@ class PhysicsSystem extends WorldSystem { friction.AddPoint(0,1); wheelSettings.mLongitudinalFriction = friction; - const wheelSettingsB = new JOLT.WheelSettingsWV(); - wheelSettingsB.mPosition = anchorPoint.Sub(axis.Mul(0.1)); - wheelSettingsB.mMaxSteerAngle = 0.0; - wheelSettingsB.mMaxHandBrakeTorque = 0.0; - wheelSettingsB.mRadius = 0.1; - wheelSettingsB.mWidth = 0.1; - wheelSettingsB.mSuspensionMinLength = 0.00003; - wheelSettingsB.mSuspensionMaxLength = 0.00006; - wheelSettingsB.mInertia = 1; + // const wheelSettingsB = new JOLT.WheelSettingsWV(); + // wheelSettingsB.mPosition = anchorPoint.Sub(axis.Mul(0.1)); + // wheelSettingsB.mMaxSteerAngle = 0.0; + // wheelSettingsB.mMaxHandBrakeTorque = 0.0; + // wheelSettingsB.mRadius = ; + // wheelSettingsB.mWidth = 0.1; + // wheelSettingsB.mSuspensionMinLength = 0.00003; + // wheelSettingsB.mSuspensionMaxLength = 0.00006; + // wheelSettingsB.mInertia = 1; - wheelSettingsB.mLongitudinalFriction = friction; + // wheelSettingsB.mLongitudinalFriction = friction; const vehicleSettings = new JOLT.VehicleConstraintSettings(); vehicleSettings.mWheels.clear(); vehicleSettings.mWheels.push_back(wheelSettings); - vehicleSettings.mWheels.push_back(wheelSettingsB); + // vehicleSettings.mWheels.push_back(wheelSettingsB); const controllerSettings = new JOLT.WheeledVehicleControllerSettings(); controllerSettings.mEngine.mMaxTorque = 1500.0; @@ -443,9 +443,12 @@ class PhysicsSystem extends WorldSystem { // differential.mDifferentialRatio = 1.93 * 40.0 / 16.0; // controllerSettings.mDifferentials.push_back(differential); + // console.log(`Wheel Volume: ${bodyWheel.GetShape().GetVolume()}`); + // console.log(`Main Volume: ${bodyMain.GetShape().GetVolume()}`); + vehicleSettings.mAntiRollBars.clear(); - const vehicleConstraint = new JOLT.VehicleConstraint(bodyWheel, vehicleSettings); + const vehicleConstraint = new JOLT.VehicleConstraint(bodyMain, vehicleSettings); const fixedConstraint = JOLT.castObject(fixedSettings.Create(bodyMain, bodyWheel), JOLT.TwoBodyConstraint); // Wheel Collision Tester diff --git a/fission/src/systems/simulation/driver/WheelDriver.ts b/fission/src/systems/simulation/driver/WheelDriver.ts index 69676c182d..b23b304ac9 100644 --- a/fission/src/systems/simulation/driver/WheelDriver.ts +++ b/fission/src/systems/simulation/driver/WheelDriver.ts @@ -17,7 +17,7 @@ class WheelDriver extends Driver { return this._targetWheelSpeed; } public set targetWheelSpeed(radsPerSec: number) { - this._wheel.SetAngularVelocity(radsPerSec); + this._targetWheelSpeed = radsPerSec; } public constructor(constraint: Jolt.VehicleConstraint) { @@ -25,6 +25,15 @@ class WheelDriver extends Driver { this._constraint = constraint; this._wheel = JOLT.castObject(this._constraint.GetWheel(0), JOLT.WheelWV); + + // this._wheel. + + console.log(`Wheel X: ${constraint.GetVehicleBody().GetCenterOfMassPosition().GetX().toFixed(5)}`); + if (constraint.GetVehicleBody().GetCenterOfMassPosition().GetX() < 0) { + this._targetWheelSpeed = 10.0; + } else { + this._targetWheelSpeed = 10.0; + } } public Update(_: number): void { From 6462ea91355c93d615ec70164e4bddf2ddaf5c01 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Mon, 15 Apr 2024 10:26:16 -0600 Subject: [PATCH 15/17] Adding getters and setters. Hinge velocity is disabled for right now because there isn't a good way of doing it with accum position. Accum position needs to be changed --- .../systems/simulation/driver/HingeDriver.ts | 42 ++++++++++++++++++- .../systems/simulation/driver/WheelDriver.ts | 7 +--- .../simulation/stimulus/EncoderStimulus.ts | 3 +- .../simulation/stimulus/HingeStimulus.ts | 8 +++- .../simulation/stimulus/SliderStimulus.ts | 14 +++++-- .../simulation/stimulus/WheelStimulus.ts | 6 ++- 6 files changed, 65 insertions(+), 15 deletions(-) diff --git a/fission/src/systems/simulation/driver/HingeDriver.ts b/fission/src/systems/simulation/driver/HingeDriver.ts index 1c82a5e5b2..e0da346559 100644 --- a/fission/src/systems/simulation/driver/HingeDriver.ts +++ b/fission/src/systems/simulation/driver/HingeDriver.ts @@ -7,7 +7,9 @@ class HingeDriver extends Driver { private _constraint: Jolt.HingeConstraint; + private _controlMode: DriverControlMode = DriverControlMode.Velocity; private _targetVelocity: number = 0.0; + private _targetAngle: number; public get targetVelocity(): number { return this._targetVelocity; @@ -16,6 +18,13 @@ class HingeDriver extends Driver { this._targetVelocity = radsPerSec; } + public get targetAngle(): number { + return this._targetAngle; + } + public set targetAngle(rads: number) { + this._targetAngle = rads; + } + public set minTorqueLimit(nm: number) { const motorSettings = this._constraint.GetMotorSettings(); motorSettings.mMinTorqueLimit = nm; @@ -25,6 +34,24 @@ class HingeDriver extends Driver { motorSettings.mMaxTorqueLimit = nm; } + public get controlMode(): DriverControlMode { + return this._controlMode; + } + public set controlMode(mode: DriverControlMode) { + this._controlMode = mode; + switch (mode) { + case DriverControlMode.Velocity: + this._constraint.SetMotorState(JOLT.EMotorState_Velocity); + break; + case DriverControlMode.Position: + this._constraint.SetMotorState(JOLT.EMotorState_Position); + break; + default: + // idk + break; + } + } + public constructor(constraint: Jolt.HingeConstraint) { super(); @@ -39,13 +66,24 @@ class HingeDriver extends Driver { motorSettings.mMinTorqueLimit = -50.0; motorSettings.mMaxTorqueLimit = 50.0; - this._constraint.SetMotorState(JOLT.EMotorState_Velocity); + this._targetAngle = this._constraint.GetCurrentAngle(); + + this.controlMode = DriverControlMode.Velocity; } public Update(_: number): void { - this._constraint.SetTargetAngularVelocity(this._targetVelocity); + if (this._controlMode == DriverControlMode.Velocity) { + this._constraint.SetTargetAngularVelocity(this._targetVelocity); + } else if (this._controlMode == DriverControlMode.Position) { + this._constraint.SetTargetAngle(this._targetAngle); + } } } +export enum DriverControlMode { + Velocity = 0, + Position = 1 +} + export default HingeDriver; \ No newline at end of file diff --git a/fission/src/systems/simulation/driver/WheelDriver.ts b/fission/src/systems/simulation/driver/WheelDriver.ts index b23b304ac9..2379c50d48 100644 --- a/fission/src/systems/simulation/driver/WheelDriver.ts +++ b/fission/src/systems/simulation/driver/WheelDriver.ts @@ -9,10 +9,7 @@ class WheelDriver extends Driver { private _wheel: Jolt.WheelWV; private _targetWheelSpeed: number = 0.0; - - public get actualWheelSpeed(): number { - return this._wheel.GetAngularVelocity(); - } + public get targetWheelSpeed(): number { return this._targetWheelSpeed; } @@ -25,8 +22,6 @@ class WheelDriver extends Driver { this._constraint = constraint; this._wheel = JOLT.castObject(this._constraint.GetWheel(0), JOLT.WheelWV); - - // this._wheel. console.log(`Wheel X: ${constraint.GetVehicleBody().GetCenterOfMassPosition().GetX().toFixed(5)}`); if (constraint.GetVehicleBody().GetCenterOfMassPosition().GetX() < 0) { diff --git a/fission/src/systems/simulation/stimulus/EncoderStimulus.ts b/fission/src/systems/simulation/stimulus/EncoderStimulus.ts index 97018660fb..1daf39b438 100644 --- a/fission/src/systems/simulation/stimulus/EncoderStimulus.ts +++ b/fission/src/systems/simulation/stimulus/EncoderStimulus.ts @@ -2,7 +2,8 @@ import Stimulus from "./Stimulus"; abstract class EncoderStimulus extends Stimulus { - public abstract get value(): number; + public abstract get positionValue(): number; + public abstract get velocityValue(): number; protected constructor() { super(); diff --git a/fission/src/systems/simulation/stimulus/HingeStimulus.ts b/fission/src/systems/simulation/stimulus/HingeStimulus.ts index 1ab01a88fc..91770de696 100644 --- a/fission/src/systems/simulation/stimulus/HingeStimulus.ts +++ b/fission/src/systems/simulation/stimulus/HingeStimulus.ts @@ -3,10 +3,10 @@ import EncoderStimulus from "./EncoderStimulus"; class HingeStimulus extends EncoderStimulus { private _accum: boolean = false; - private _hingeAngleAccum = 0.0; + private _hingeAngleAccum: number = 0.0; private _hinge: Jolt.HingeConstraint; - public get value(): number { + public get positionValue(): number { if (this._accum) { return this._hingeAngleAccum; } else { @@ -14,6 +14,10 @@ class HingeStimulus extends EncoderStimulus { } } + public get velocityValue(): number { + return 0.0; + } + public set accum(shouldAccum: boolean) { if (!this._accum && shouldAccum) { this.resetAccum(); diff --git a/fission/src/systems/simulation/stimulus/SliderStimulus.ts b/fission/src/systems/simulation/stimulus/SliderStimulus.ts index d084ec8a20..6567aed629 100644 --- a/fission/src/systems/simulation/stimulus/SliderStimulus.ts +++ b/fission/src/systems/simulation/stimulus/SliderStimulus.ts @@ -4,18 +4,26 @@ import EncoderStimulus from "./EncoderStimulus"; class SliderStimulus extends EncoderStimulus { private _slider: Jolt.SliderConstraint; + private _velocity: number = 0.0; - public get value(): number { + public get positionValue(): number { return this._slider.GetCurrentPosition(); } + public get velocityValue(): number { + return this._velocity; + } public constructor(slider: Jolt.SliderConstraint) { super(); this._slider = slider; } - - public Update(_: number): void { } + + private _lastPosition: number = 0.0; + public Update(deltaT: number): void { + this._velocity = (this._slider.GetCurrentPosition() - this._lastPosition) / deltaT; + this._lastPosition = this._slider.GetCurrentPosition(); + } } export default SliderStimulus; \ No newline at end of file diff --git a/fission/src/systems/simulation/stimulus/WheelStimulus.ts b/fission/src/systems/simulation/stimulus/WheelStimulus.ts index 354c1d2b60..4edce43cd1 100644 --- a/fission/src/systems/simulation/stimulus/WheelStimulus.ts +++ b/fission/src/systems/simulation/stimulus/WheelStimulus.ts @@ -9,7 +9,7 @@ class WheelRotationStimulus extends EncoderStimulus { private _wheelRotationAccum = 0.0; private _wheel: Jolt.Wheel; - public get value(): number { + public get positionValue(): number { if (this._accum) { return this._wheelRotationAccum; } else { @@ -17,6 +17,10 @@ class WheelRotationStimulus extends EncoderStimulus { } } + public get velocityValue(): number { + return this._wheel.GetAngularVelocity(); + } + public set accum(shouldAccum: boolean) { if (!this._accum && shouldAccum) { this.resetAccum(); From d2fb54757e38886b1b2091a6ceac3c6deac31c21 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Mon, 15 Apr 2024 10:55:45 -0600 Subject: [PATCH 16/17] Cleanups --- fission/package.json | 6 ++- fission/src/mirabuf/MirabufParser.ts | 1 + fission/src/systems/physics/PhysicsSystem.ts | 54 +------------------ .../systems/simulation/SimulationSystem.ts | 3 +- .../systems/simulation/driver/HingeDriver.ts | 2 + .../systems/simulation/driver/WheelDriver.ts | 3 +- .../simulation/stimulus/ChassisStimulus.ts | 11 ++-- .../simulation/synthesis_brain/Behavior.ts | 3 ++ fission/vite.config.ts | 1 - 9 files changed, 21 insertions(+), 63 deletions(-) diff --git a/fission/package.json b/fission/package.json index c9279294a7..cba4d7a649 100644 --- a/fission/package.json +++ b/fission/package.json @@ -7,12 +7,14 @@ "dev": "vite", "build": "tsc && vite build", "lint": "eslint . --ext ts,tsx --report-unused-disable-directives", - "preview": "vite preview", + "preview": "vite preview --base=/fission/", "test": "vitest", "lint:fix": "npm run lint --fix", "prettier": "npx prettier src --check", "prettier:fix": "npm run prettier --write", - "format": "npm run prettier:fix && npm run lint:fix" + "format": "npm run prettier:fix && npm run lint:fix", + "build:hidden-prod": "tsc && vite build --base=/h1dd3n/fission/", + "build:prod": "tsc && vite build --base=/fission/" }, "dependencies": { "@barclah/jolt-physics": "^0.19.3", diff --git a/fission/src/mirabuf/MirabufParser.ts b/fission/src/mirabuf/MirabufParser.ts index 7b132824db..f2be5033be 100644 --- a/fission/src/mirabuf/MirabufParser.ts +++ b/fission/src/mirabuf/MirabufParser.ts @@ -47,6 +47,7 @@ class MirabufParser { public get groundedNode() { return this._groundedNode ? new RigidNodeReadOnly(this._groundedNode) : undefined; } public get rigidNodes(): Array { return this._rigidNodes.map(x => new RigidNodeReadOnly(x)); } public get directedGraph() { return this._directedGraph; } + public get rootNode() { return this._rootNode; } public constructor(assembly: mirabuf.Assembly) { this._assembly = assembly; diff --git a/fission/src/systems/physics/PhysicsSystem.ts b/fission/src/systems/physics/PhysicsSystem.ts index 0162c02094..a50f82350f 100644 --- a/fission/src/systems/physics/PhysicsSystem.ts +++ b/fission/src/systems/physics/PhysicsSystem.ts @@ -158,7 +158,7 @@ class PhysicsSystem extends WorldSystem { public CreateMechanismFromParser(parser: MirabufParser) { const layer = parser.assembly.dynamic ? new LayerReserve(): undefined; const bodyMap = this.CreateBodiesFromParser(parser, layer); - const rootBody = (parser.rigidNodes.find(x => x.isRoot) ?? parser.rigidNodes[0]).id; + const rootBody = parser.rootNode; const mechanism = new Mechanism(rootBody, bodyMap, layer); this.CreateJointsFromParser(parser, mechanism); return mechanism; @@ -283,7 +283,6 @@ class PhysicsSystem extends WorldSystem { this._joltPhysSystem.AddConstraint(constraint); return constraint; - // return JOLT.castObject(, JOLT.HingeConstraint); } /** @@ -340,9 +339,6 @@ class PhysicsSystem extends WorldSystem { sliderConstraintSettings.mLimitsMax = halfRange; sliderConstraintSettings.mLimitsMin = -halfRange; } - - // sliderConstraintSettings.mLimitsMax = 1.0; - // sliderConstraintSettings.mLimitsMin = 0.0; const constraint = sliderConstraintSettings.Create(bodyA, bodyB); @@ -350,7 +346,6 @@ class PhysicsSystem extends WorldSystem { this._joltPhysSystem.AddConstraint(constraint); return constraint; - // return JOLT.castObject(constraint, JOLT.SliderConstraint); } @@ -363,7 +358,6 @@ class PhysicsSystem extends WorldSystem { const jointOrigin = jointDefinition.origin ? MirabufVector3_JoltVec3(jointDefinition.origin as mirabuf.Vector3) : new JOLT.Vec3(0, 0, 0); - // TODO: Offset transformation for robot builder. const jointOriginOffset = jointInstance.offset ? MirabufVector3_JoltVec3(jointInstance.offset as mirabuf.Vector3) : new JOLT.Vec3(0, 0, 0); @@ -382,17 +376,8 @@ class PhysicsSystem extends WorldSystem { axis = new JOLT.Vec3(miraAxis.x ?? 0, miraAxis.y ?? 0, miraAxis.z ?? 0); } - // Assigned Axes - // hingeConstraintSettings.mHingeAxis1 = hingeConstraintSettings.mHingeAxis2 - // = axis.Normalized(); - // hingeConstraintSettings.mNormalAxis1 = hingeConstraintSettings.mNormalAxis2 - // = getPerpendicular(hingeConstraintSettings.mHingeAxis1); - const bounds = bodyWheel.GetShape().GetLocalBounds(); const radius = (bounds.mMax.GetY() - bounds.mMin.GetY()) / 2.0; - // console.log(`Max: (${bounds.mMax.GetX()}, ${bounds.mMax.GetY()}, ${bounds.mMax.GetZ()})`); - // console.log(`Min: (${bounds.mMin.GetX()}, ${bounds.mMin.GetY()}, ${bounds.mMin.GetZ()})`); - // console.log(`Radius: ${radius}`); const wheelSettings = new JOLT.WheelSettingsWV(); wheelSettings.mPosition = anchorPoint.Add(axis.Mul(0.1)); @@ -410,23 +395,10 @@ class PhysicsSystem extends WorldSystem { friction.AddPoint(0,1); wheelSettings.mLongitudinalFriction = friction; - // const wheelSettingsB = new JOLT.WheelSettingsWV(); - // wheelSettingsB.mPosition = anchorPoint.Sub(axis.Mul(0.1)); - // wheelSettingsB.mMaxSteerAngle = 0.0; - // wheelSettingsB.mMaxHandBrakeTorque = 0.0; - // wheelSettingsB.mRadius = ; - // wheelSettingsB.mWidth = 0.1; - // wheelSettingsB.mSuspensionMinLength = 0.00003; - // wheelSettingsB.mSuspensionMaxLength = 0.00006; - // wheelSettingsB.mInertia = 1; - - // wheelSettingsB.mLongitudinalFriction = friction; - const vehicleSettings = new JOLT.VehicleConstraintSettings(); vehicleSettings.mWheels.clear(); vehicleSettings.mWheels.push_back(wheelSettings); - // vehicleSettings.mWheels.push_back(wheelSettingsB); const controllerSettings = new JOLT.WheeledVehicleControllerSettings(); controllerSettings.mEngine.mMaxTorque = 1500.0; @@ -436,16 +408,6 @@ class PhysicsSystem extends WorldSystem { controllerSettings.mTransmission.mMode = JOLT.ETransmissionMode_Auto; vehicleSettings.mController = controllerSettings; - // controllerSettings.mDifferentials.clear(); - // const differential = new JOLT.VehicleDifferentialSettings(); - // differential.mLeftWheel = -1; - // differential.mRightWheel = 1; - // differential.mDifferentialRatio = 1.93 * 40.0 / 16.0; - // controllerSettings.mDifferentials.push_back(differential); - - // console.log(`Wheel Volume: ${bodyWheel.GetShape().GetVolume()}`); - // console.log(`Main Volume: ${bodyMain.GetShape().GetVolume()}`); - vehicleSettings.mAntiRollBars.clear(); const vehicleConstraint = new JOLT.VehicleConstraint(bodyMain, vehicleSettings); @@ -454,17 +416,6 @@ class PhysicsSystem extends WorldSystem { // Wheel Collision Tester const tester = new JOLT.VehicleCollisionTesterCastCylinder(bodyWheel.GetObjectLayer(), 0.05); vehicleConstraint.SetVehicleCollisionTester(tester); - - - // const callbacks = new JOLT.VehicleConstraintCallbacksJS(); - // callbacks.GetCombinedFriction = (wheelIndex, tireFrictionDirection, tireFriction, body2, subShapeID2) => { - // const b = JOLT.wrapPointer(body2, Jolt.Body); - // return Math.sqrt(tireFriction * b.GetFriction()); // This is the default calculation - // }; - // callbacks.OnPreStepCallback = (vehicle, deltaTime, physicsSystem) => { }; - // callbacks.OnPostCollideCallback = (vehicle, deltaTime, physicsSystem) => { console.log('Collision'); }; - // callbacks.OnPostStepCallback = (vehicle, deltaTime, physicsSystem) => { }; - // JOLT.castObject(callbacks, JOLT.VehicleConstraintCallbacksEm).SetVehicleConstraint(vehicleConstraint); this._joltPhysSystem.AddStepListener(new JOLT.VehicleConstraintStepListener(vehicleConstraint)); @@ -577,9 +528,6 @@ class PhysicsSystem extends WorldSystem { // Little testing components body.SetRestitution(0.4); - // const angVelocity = new JOLT.Vec3(0, 3, 0); - // body.SetAngularVelocity(angVelocity); - // JOLT.destroy(angVelocity); } // Cleanup diff --git a/fission/src/systems/simulation/SimulationSystem.ts b/fission/src/systems/simulation/SimulationSystem.ts index 2e3351220a..5580f8001f 100644 --- a/fission/src/systems/simulation/SimulationSystem.ts +++ b/fission/src/systems/simulation/SimulationSystem.ts @@ -10,6 +10,7 @@ import SliderDriver from "./driver/SliderDriver"; import HingeStimulus from "./stimulus/HingeStimulus"; import WheelRotationStimulus from "./stimulus/WheelStimulus"; import SliderStimulus from "./stimulus/SliderStimulus"; +import ChassisStimulus from "./stimulus/ChassisStimulus"; class SimulationSystem extends WorldSystem { @@ -79,7 +80,7 @@ class SimulationLayer { this._stimuli.push(stim); } }); - + this._stimuli.push(new ChassisStimulus(mechanism.nodeToBody.get(mechanism.rootBody)!)); } public Update(deltaT: number) { diff --git a/fission/src/systems/simulation/driver/HingeDriver.ts b/fission/src/systems/simulation/driver/HingeDriver.ts index e0da346559..5e5c680baf 100644 --- a/fission/src/systems/simulation/driver/HingeDriver.ts +++ b/fission/src/systems/simulation/driver/HingeDriver.ts @@ -59,6 +59,8 @@ class HingeDriver extends Driver { const motorSettings = this._constraint.GetMotorSettings(); const springSettings = motorSettings.mSpringSettings; + + // These values were selected based on the suggestions of the documentation for stiff control. springSettings.mFrequency = 20 * (1.0 / SIMULATION_PERIOD); springSettings.mDamping = 0.995; diff --git a/fission/src/systems/simulation/driver/WheelDriver.ts b/fission/src/systems/simulation/driver/WheelDriver.ts index 2379c50d48..d2b8c492ee 100644 --- a/fission/src/systems/simulation/driver/WheelDriver.ts +++ b/fission/src/systems/simulation/driver/WheelDriver.ts @@ -1,6 +1,5 @@ import Jolt from "@barclah/jolt-physics"; import Driver from "./Driver"; -import { SIMULATION_PERIOD } from "@/systems/physics/PhysicsSystem"; import JOLT from "@/util/loading/JoltSyncLoader"; class WheelDriver extends Driver { @@ -9,7 +8,7 @@ class WheelDriver extends Driver { private _wheel: Jolt.WheelWV; private _targetWheelSpeed: number = 0.0; - + public get targetWheelSpeed(): number { return this._targetWheelSpeed; } diff --git a/fission/src/systems/simulation/stimulus/ChassisStimulus.ts b/fission/src/systems/simulation/stimulus/ChassisStimulus.ts index d8c010b71f..6149ec2779 100644 --- a/fission/src/systems/simulation/stimulus/ChassisStimulus.ts +++ b/fission/src/systems/simulation/stimulus/ChassisStimulus.ts @@ -1,5 +1,6 @@ import Jolt from "@barclah/jolt-physics"; import Stimulus from "./Stimulus"; +import World from "@/systems/World"; class ChassisStimulus extends Stimulus { private _body: Jolt.Body; @@ -18,12 +19,14 @@ class ChassisStimulus extends Stimulus { return this._body.GetRotation().GetEulerAngles(); } - public constructor(body: Jolt.Body) { + public constructor(bodyId: Jolt.BodyID) { super(); - this._body = body; - this._mass = body.GetShape().GetMassProperties().mMass; + this._body = World.PhysicsSystem.GetBody(bodyId); + this._mass = this._body.GetShape().GetMassProperties().mMass; } public Update(_: number): void { } -} \ No newline at end of file +} + +export default ChassisStimulus; \ No newline at end of file diff --git a/fission/src/systems/simulation/synthesis_brain/Behavior.ts b/fission/src/systems/simulation/synthesis_brain/Behavior.ts index 0daa06c083..90fb1b1bdc 100644 --- a/fission/src/systems/simulation/synthesis_brain/Behavior.ts +++ b/fission/src/systems/simulation/synthesis_brain/Behavior.ts @@ -6,6 +6,9 @@ abstract class Behavior { private _drivers: Driver[]; private _stimuli: Stimulus[]; + protected get drivers() { return this._drivers; } + protected get stimuli() { return this._stimuli; } + constructor(drivers: Driver[], stimuli: Stimulus[]) { this._drivers = drivers; this._stimuli = stimuli; diff --git a/fission/vite.config.ts b/fission/vite.config.ts index b1e2517549..d1c8adda34 100644 --- a/fission/vite.config.ts +++ b/fission/vite.config.ts @@ -1,7 +1,6 @@ import { defineConfig } from 'vite' import * as path from 'path' import react from '@vitejs/plugin-react-swc' -import { viteSingleFile } from 'vite-plugin-singlefile' // https://vitejs.dev/config/ export default defineConfig({ From 22d71224e0c8346d5eb50630d038fe44e2ad2173 Mon Sep 17 00:00:00 2001 From: KyroVibe Date: Mon, 15 Apr 2024 11:20:03 -0600 Subject: [PATCH 17/17] Docs --- fission/README.md | 45 ++++++++++++++++++++++++++++---------------- fission/package.json | 1 - 2 files changed, 29 insertions(+), 17 deletions(-) diff --git a/fission/README.md b/fission/README.md index 5a98a1d65e..515e8f5f3d 100644 --- a/fission/README.md +++ b/fission/README.md @@ -11,33 +11,34 @@ To build, install all dependencies: ```bash npm i ``` -#### Development Server -To run the development server, run the following package script: -```bash -npm run dev -``` - -#### Production Preview -To preview the production build, run the following package script: -```bash -npm run preview -``` +### NPM Scripts -#### Testing -To run unit tests, run the following package script: -```bash -npm run test -``` +| Script | Description | +| ------ | ----------- | +| `dev` | Starts the development server used for testing. Supports hotloading (though finicky with WASM module loading). | +| `test` | Runs the unit tests via vitest. | +| `build` | Builds the project into it's packaged form. Uses root base path. | +| `build:prod` | Builds the project into it's packaged form. Uses the `/fission/` base path. | +| `preview` | Runs the built project for preview locally before deploying. | +| `lint` | Runs eslint on the project. | +| `lint:fix` | Attempts to fix issues found with eslint. | +| `prettier` | Runs prettier on the project as a check. | +| `prettier:fix` | Runs prettier on the project to fix any issues with formating. **DO NOT USE**, I don't like the current format it uses. | +| `format` | Runs `prettier:fix` and `lint:fix`. **Do not use** for the same reasons as `prettier:fix`. | ## Core Systems These core systems make up the bulk of the vital technologies to make Synthesis work. The idea is that these systems will serve as a jumping off point for anything requiring real-time simulation. ### World +The world serves as a hub for all of the core systems. It is a static class that handles system update execution order and lifetime. ### Scene Renderer +The Scene Renderer is our interface with rendering within the Canvas. This is primarily done via ThreeJS, however can be extended later on. ### Physics System +This Physics System is our interface with Jolt, ensuring objects are properly handled and provides utility functions that are more custom fit to our purposes. + [Jolt Physics Architecture](https://jrouwe.github.io/JoltPhysics/) ### Input System @@ -48,5 +49,17 @@ jumping off point for anything requiring real-time simulation. These systems will extend off of the core systems to build out features in Synthesis. ### Simulation System +The Simulation System articulates dynamic elements of the scene via the Physics System. At it's core there are 3 main components: + +#### Driver +Drivers are mostly write-only. They take in values to know how to articulate the physics objects and contraints. + +#### Stimulus +Stimulu are mostly read-only. They read values from given physics objects and constraints. + +#### Brain +Brains are the controllers of the mechanisms. They use a combination of Drivers and Stimuli to control a given mechanism. + +For basic user control of the mechanisms, we'll have a Synthesis Brain. By the end of Summer 2024, I hope to have an additional brain, the WPIBrain for facilitating WPILib code control over the mechanisms inside of Synthesis. ### Mode System diff --git a/fission/package.json b/fission/package.json index cba4d7a649..76547f1c81 100644 --- a/fission/package.json +++ b/fission/package.json @@ -13,7 +13,6 @@ "prettier": "npx prettier src --check", "prettier:fix": "npm run prettier --write", "format": "npm run prettier:fix && npm run lint:fix", - "build:hidden-prod": "tsc && vite build --base=/h1dd3n/fission/", "build:prod": "tsc && vite build --base=/fission/" }, "dependencies": {