@zylem/game-lib 0.5.1 → 0.6.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/lib/entities/box.ts","../src/lib/entities/entity.ts","../src/lib/systems/transformable.system.ts","../src/lib/core/flags.ts","../src/lib/core/base-node.ts","../src/lib/entities/builder.ts","../src/lib/collision/collision-builder.ts","../src/lib/graphics/mesh.ts","../src/lib/graphics/material.ts","../src/lib/core/utility/strings.ts","../src/lib/graphics/shaders/fragment/stars.glsl","../src/lib/graphics/shaders/fragment/fire.glsl","../src/lib/graphics/shaders/fragment/standard.glsl","../src/lib/graphics/shaders/fragment/debug.glsl","../src/lib/graphics/shaders/vertex/object-shader.glsl","../src/lib/graphics/shaders/vertex/debug.glsl","../src/lib/core/preset-shader.ts","../src/lib/entities/delegates/debug.ts","../src/lib/entities/delegates/loader.ts","../src/lib/entities/create.ts","../src/lib/entities/sphere.ts","../src/lib/entities/sprite.ts","../src/lib/entities/plane.ts","../src/lib/graphics/geometries/XZPlaneGeometry.ts","../src/lib/entities/zone.ts","../src/lib/game/game-state.ts","../src/lib/entities/actor.ts","../src/lib/core/entity-asset-loader.ts","../src/lib/entities/delegates/animation.ts","../src/lib/entities/text.ts","../src/lib/entities/rect.ts"],"sourcesContent":["import { ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { BoxGeometry, Color } from 'three';\nimport { Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { EntityMeshBuilder } from './builder';\nimport { DebugDelegate } from './delegates/debug';\nimport { createEntity } from './create';\n\ntype ZylemBoxOptions = GameEntityOptions;\n\nconst boxDefaults: ZylemBoxOptions = {\n\tsize: new Vector3(1, 1, 1),\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: false,\n\t},\n\tmaterial: {\n\t\tcolor: new Color('#ffffff'),\n\t\tshader: 'standard'\n\t},\n};\n\nexport class BoxCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: GameEntityOptions): ColliderDesc {\n\t\tconst size = options.size || new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class BoxMeshBuilder extends EntityMeshBuilder {\n\tbuild(options: GameEntityOptions): BoxGeometry {\n\t\tconst size = options.size ?? new Vector3(1, 1, 1);\n\t\treturn new BoxGeometry(size.x, size.y, size.z);\n\t}\n}\n\nexport class BoxBuilder extends EntityBuilder<ZylemBox, ZylemBoxOptions> {\n\tprotected createEntity(options: Partial<ZylemBoxOptions>): ZylemBox {\n\t\treturn new ZylemBox(options);\n\t}\n}\n\nexport const BOX_TYPE = Symbol('Box');\n\nexport class ZylemBox extends GameEntity<ZylemBoxOptions> {\n\tstatic type = BOX_TYPE;\n\n\tconstructor(options?: ZylemBoxOptions) {\n\t\tsuper();\n\t\tthis.options = { ...boxDefaults, ...options };\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\n\t\tconst { x: sizeX, y: sizeY, z: sizeZ } = this.options.size ?? { x: 1, y: 1, z: 1 };\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemBox.type),\n\t\t\tsize: `${sizeX}, ${sizeY}, ${sizeZ}`,\n\t\t};\n\t}\n}\n\ntype BoxOptions = BaseNode | ZylemBoxOptions;\n\nexport async function box(...args: Array<BoxOptions>): Promise<ZylemBox> {\n\treturn createEntity<ZylemBox, ZylemBoxOptions>({\n\t\targs,\n\t\tdefaultConfig: boxDefaults,\n\t\tEntityClass: ZylemBox,\n\t\tBuilderClass: BoxBuilder,\n\t\tMeshBuilderClass: BoxMeshBuilder,\n\t\tCollisionBuilderClass: BoxCollisionBuilder,\n\t\tentityType: ZylemBox.type\n\t});\n}","import { Mesh, Material, ShaderMaterial, Group, Color } from \"three\";\nimport { Collider, ColliderDesc, RigidBody, RigidBodyDesc } from \"@dimforge/rapier3d-compat\";\nimport { position, rotation, scale } from \"../systems/transformable.system\";\nimport { Vec3 } from \"../core/vector\";\nimport { MaterialBuilder, MaterialOptions } from \"../graphics/material\";\nimport { CollisionOptions } from \"../collision/collision\";\nimport { BaseNode } from \"../core/base-node\";\nimport { DestroyContext, SetupContext, UpdateContext, LoadedContext, CleanupContext } from \"../core/base-node-life-cycle\";\nimport type { EntityMeshBuilder, EntityCollisionBuilder } from \"./builder\";\nimport { Behavior } from \"../actions/behaviors/behavior\";\n\nexport interface LifeCycleDelegate<U> {\n\tsetup?: ((params: SetupContext<U>) => void)[];\n\tupdate?: ((params: UpdateContext<U>) => void)[];\n\tdestroy?: ((params: DestroyContext<U>) => void)[];\n}\n\nexport interface CollisionContext<T, O extends GameEntityOptions, TGlobals extends Record<string, unknown> = any> {\n\tentity: T;\n\tother: GameEntity<O>;\n\tglobals: TGlobals;\n}\n\nexport type BehaviorContext<T, O extends GameEntityOptions> =\n\tSetupContext<T, O> |\n\tUpdateContext<T, O> |\n\tCollisionContext<T, O> |\n\tDestroyContext<T, O>;\n\nexport type BehaviorCallback<T, O extends GameEntityOptions> = (params: BehaviorContext<T, O>) => void;\n\nexport interface CollisionDelegate<T, O extends GameEntityOptions> {\n\tcollision?: ((params: CollisionContext<T, O>) => void)[];\n}\n\nexport type IBuilder<BuilderOptions = any> = {\n\tpreBuild: (options: BuilderOptions) => BuilderOptions;\n\tbuild: (options: BuilderOptions) => BuilderOptions;\n\tpostBuild: (options: BuilderOptions) => BuilderOptions;\n}\n\nexport type GameEntityOptions = {\n\tname?: string;\n\tcolor?: Color;\n\tsize?: Vec3;\n\tposition?: Vec3;\n\tbatched?: boolean;\n\tcollision?: Partial<CollisionOptions>;\n\tmaterial?: Partial<MaterialOptions>;\n\tcustom?: { [key: string]: any };\n\tcollisionType?: string;\n\tcollisionGroup?: string;\n\tcollisionFilter?: string[];\n\t_builders?: {\n\t\tmeshBuilder?: IBuilder | EntityMeshBuilder | null;\n\t\tcollisionBuilder?: IBuilder | EntityCollisionBuilder | null;\n\t\tmaterialBuilder?: MaterialBuilder | null;\n\t};\n}\n\nexport abstract class GameEntityLifeCycle {\n\tabstract _setup(params: SetupContext<this>): void;\n\tabstract _update(params: UpdateContext<this>): void;\n\tabstract _destroy(params: DestroyContext<this>): void;\n}\n\nexport interface EntityDebugInfo {\n\tbuildInfo: () => Record<string, string>;\n}\n\nexport type BehaviorCallbackType = 'setup' | 'update' | 'destroy' | 'collision';\n\nexport class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implements\n\tGameEntityLifeCycle,\n\tEntityDebugInfo {\n\tpublic behaviors: Behavior[] = [];\n\tpublic group: Group | undefined;\n\tpublic mesh: Mesh | undefined;\n\tpublic materials: Material[] | undefined;\n\tpublic bodyDesc: RigidBodyDesc | null = null;\n\tpublic body: RigidBody | null = null;\n\tpublic colliderDesc: ColliderDesc | undefined;\n\tpublic collider: Collider | undefined;\n\tpublic custom: Record<string, any> = {};\n\n\tpublic debugInfo: Record<string, any> = {};\n\tpublic debugMaterial: ShaderMaterial | undefined;\n\n\tpublic lifeCycleDelegate: LifeCycleDelegate<O> = {\n\t\tsetup: [],\n\t\tupdate: [],\n\t\tdestroy: [],\n\t};\n\tpublic collisionDelegate: CollisionDelegate<this, O> = {\n\t\tcollision: [],\n\t};\n\tpublic collisionType?: string;\n\n\tpublic behaviorCallbackMap: Record<BehaviorCallbackType, BehaviorCallback<this, O>[]> = {\n\t\tsetup: [],\n\t\tupdate: [],\n\t\tdestroy: [],\n\t\tcollision: [],\n\t};\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tpublic create(): this {\n\t\tconst { position: setupPosition } = this.options;\n\t\tconst { x, y, z } = setupPosition || { x: 0, y: 0, z: 0 };\n\t\tthis.behaviors = [\n\t\t\t{ component: position, values: { x, y, z } },\n\t\t\t{ component: scale, values: { x: 0, y: 0, z: 0 } },\n\t\t\t{ component: rotation, values: { x: 0, y: 0, z: 0, w: 0 } },\n\t\t];\n\t\tthis.name = this.options.name || '';\n\t\treturn this;\n\t}\n\n\tpublic onSetup(...callbacks: ((params: SetupContext<this>) => void)[]): this {\n\t\tconst combineCallbacks = [...(this.lifeCycleDelegate.setup ?? []), ...callbacks];\n\t\tthis.lifeCycleDelegate = {\n\t\t\t...this.lifeCycleDelegate,\n\t\t\tsetup: combineCallbacks as unknown as ((params: SetupContext<O>) => void)[]\n\t\t};\n\t\treturn this;\n\t}\n\n\tpublic onUpdate(...callbacks: ((params: UpdateContext<this>) => void)[]): this {\n\t\tconst combineCallbacks = [...(this.lifeCycleDelegate.update ?? []), ...callbacks];\n\t\tthis.lifeCycleDelegate = {\n\t\t\t...this.lifeCycleDelegate,\n\t\t\tupdate: combineCallbacks as unknown as ((params: UpdateContext<O>) => void)[]\n\t\t};\n\t\treturn this;\n\t}\n\n\tpublic onDestroy(...callbacks: ((params: DestroyContext<this>) => void)[]): this {\n\t\tthis.lifeCycleDelegate = {\n\t\t\t...this.lifeCycleDelegate,\n\t\t\tdestroy: callbacks.length > 0 ? callbacks as unknown as ((params: DestroyContext<O>) => void)[] : undefined\n\t\t};\n\t\treturn this;\n\t}\n\n\tpublic onCollision(...callbacks: ((params: CollisionContext<this, O>) => void)[]): this {\n\t\tthis.collisionDelegate = {\n\t\t\tcollision: callbacks.length > 0 ? callbacks : undefined\n\t\t};\n\t\treturn this;\n\t}\n\n\tpublic _setup(params: SetupContext<this>): void {\n\t\tthis.behaviorCallbackMap.setup.forEach(callback => {\n\t\t\tcallback({ ...params, me: this });\n\t\t});\n\t\tif (this.lifeCycleDelegate.setup?.length) {\n\t\t\tconst callbacks = this.lifeCycleDelegate.setup;\n\t\t\tcallbacks.forEach(callback => {\n\t\t\t\tcallback({ ...params, me: this as unknown as O });\n\t\t\t});\n\t\t}\n\t}\n\n\tprotected async _loaded(_params: LoadedContext<this>): Promise<void> { }\n\n\tpublic _update(params: UpdateContext<this>): void {\n\t\tthis.updateMaterials(params);\n\t\tif (this.lifeCycleDelegate.update?.length) {\n\t\t\tconst callbacks = this.lifeCycleDelegate.update;\n\t\t\tcallbacks.forEach(callback => {\n\t\t\t\tcallback({ ...params, me: this as unknown as O });\n\t\t\t});\n\t\t}\n\t\tthis.behaviorCallbackMap.update.forEach(callback => {\n\t\t\tcallback({ ...params, me: this });\n\t\t});\n\t}\n\n\tpublic _destroy(params: DestroyContext<this>): void {\n\t\tif (this.lifeCycleDelegate.destroy?.length) {\n\t\t\tconst callbacks = this.lifeCycleDelegate.destroy;\n\t\t\tcallbacks.forEach(callback => {\n\t\t\t\tcallback({ ...params, me: this as unknown as O });\n\t\t\t});\n\t\t}\n\t\tthis.behaviorCallbackMap.destroy.forEach(callback => {\n\t\t\tcallback({ ...params, me: this });\n\t\t});\n\t}\n\n\tprotected async _cleanup(_params: CleanupContext<this>): Promise<void> { }\n\n\tpublic _collision(other: GameEntity<O>, globals?: any): void {\n\t\tif (this.collisionDelegate.collision?.length) {\n\t\t\tconst callbacks = this.collisionDelegate.collision;\n\t\t\tcallbacks.forEach(callback => {\n\t\t\t\tcallback({ entity: this, other, globals });\n\t\t\t});\n\t\t}\n\t\tthis.behaviorCallbackMap.collision.forEach(callback => {\n\t\t\tcallback({ entity: this, other, globals });\n\t\t});\n\t}\n\n\tpublic addBehavior(\n\t\tbehaviorCallback: ({ type: BehaviorCallbackType, handler: any })\n\t): this {\n\t\tconst handler = behaviorCallback.handler as unknown as BehaviorCallback<this, O>;\n\t\tif (handler) {\n\t\t\tthis.behaviorCallbackMap[behaviorCallback.type].push(handler);\n\t\t}\n\t\treturn this;\n\t}\n\n\tpublic addBehaviors(\n\t\tbehaviorCallbacks: ({ type: BehaviorCallbackType, handler: any })[]\n\t): this {\n\t\tbehaviorCallbacks.forEach(callback => {\n\t\t\tconst handler = callback.handler as unknown as BehaviorCallback<this, O>;\n\t\t\tif (handler) {\n\t\t\t\tthis.behaviorCallbackMap[callback.type].push(handler);\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\tprotected updateMaterials(params: any) {\n\t\tif (!this.materials?.length) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const material of this.materials) {\n\t\t\tif (material instanceof ShaderMaterial) {\n\t\t\t\tif (material.uniforms) {\n\t\t\t\t\tmaterial.uniforms.iTime && (material.uniforms.iTime.value += params.delta);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic buildInfo(): Record<string, string> {\n\t\tconst info: Record<string, string> = {};\n\t\tinfo.name = this.name;\n\t\tinfo.uuid = this.uuid;\n\t\tinfo.eid = this.eid.toString();\n\t\treturn info;\n\t}\n}\n","import {\n\tdefineSystem,\n\tdefineQuery,\n\tdefineComponent,\n\tTypes,\n} from 'bitecs';\nimport { Quaternion } from 'three';\nimport { StageEntity } from '../interfaces/entity';\nimport RAPIER from '@dimforge/rapier3d-compat';\n\nexport type StageSystem = {\n\t_childrenMap: Map<number, StageEntity & { body: RAPIER.RigidBody }>;\n}\n\nexport const position = defineComponent({\n\tx: Types.f32,\n\ty: Types.f32,\n\tz: Types.f32\n});\n\nexport const rotation = defineComponent({\n\tx: Types.f32,\n\ty: Types.f32,\n\tz: Types.f32,\n\tw: Types.f32\n});\n\nexport const scale = defineComponent({\n\tx: Types.f32,\n\ty: Types.f32,\n\tz: Types.f32\n});\n\nexport default function createTransformSystem(stage: StageSystem) {\n\tconst transformQuery = defineQuery([position, rotation]);\n\tconst stageEntities = stage._childrenMap;\n\treturn defineSystem((world) => {\n\t\tconst entities = transformQuery(world);\n\t\tif (stageEntities === undefined) {\n\t\t\treturn world;\n\t\t};\n\t\tfor (const [key, value] of stageEntities) {\n\t\t\tconst id = entities[key];\n\t\t\tconst stageEntity = value;\n\t\t\tif (stageEntity === undefined || !stageEntity?.body || stageEntity.markedForRemoval) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst { x, y, z } = stageEntity.body.translation();\n\t\t\tposition.x[id] = x;\n\t\t\tposition.y[id] = y;\n\t\t\tposition.z[id] = z;\n\t\t\tif (stageEntity.group) {\n\t\t\t\tstageEntity.group.position.set(position.x[id], position.y[id], position.z[id]);\n\t\t\t} else if (stageEntity.mesh) {\n\t\t\t\tstageEntity.mesh.position.set(position.x[id], position.y[id], position.z[id]);\n\t\t\t}\n\t\t\tif (stageEntity.controlledRotation) {\n\t\t\t\tcontinue;\n\t\t\t}\n\t\t\tconst { x: rx, y: ry, z: rz, w: rw } = stageEntity.body.rotation();\n\t\t\trotation.x[id] = rx;\n\t\t\trotation.y[id] = ry;\n\t\t\trotation.z[id] = rz;\n\t\t\trotation.w[id] = rw;\n\t\t\tconst newRotation = new Quaternion(\n\t\t\t\trotation.x[id],\n\t\t\t\trotation.y[id],\n\t\t\t\trotation.z[id],\n\t\t\t\trotation.w[id]\n\t\t\t);\n\t\t\tif (stageEntity.group) {\n\t\t\t\tstageEntity.group.setRotationFromQuaternion(newRotation);\n\t\t\t} else if (stageEntity.mesh) {\n\t\t\t\tstageEntity.mesh.setRotationFromQuaternion(newRotation);\n\t\t\t}\n\t\t}\n\n\t\treturn world;\n\t});\n}","/** Vite build flags */\nexport const DEBUG_FLAG = import.meta.env.VITE_DEBUG_FLAG === 'true';","import {\n\tCleanupContext,\n\tCleanupFunction,\n\tDestroyContext,\n\tDestroyFunction,\n\tLoadedContext,\n\tLoadedFunction,\n\tSetupContext,\n\tSetupFunction,\n\tUpdateContext,\n\tUpdateFunction,\n} from \"./base-node-life-cycle\";\nimport { DEBUG_FLAG } from \"./flags\";\nimport { nanoid } from \"nanoid\";\nimport { NodeInterface } from \"./node-interface\";\n\nexport type BaseNodeOptions<T = any> = BaseNode | Partial<T>;\n\nexport abstract class BaseNode<Options = any, T = any> implements NodeInterface {\n\tprotected parent: NodeInterface | null = null;\n\tprotected children: NodeInterface[] = [];\n\tpublic options: Options;\n\tpublic eid: number = 0;\n\tpublic uuid: string = '';\n\tpublic name: string = '';\n\tpublic markedForRemoval: boolean = false;\n\n\tsetup: SetupFunction<this> = () => { };\n\tloaded: LoadedFunction<this> = () => { };\n\tupdate: UpdateFunction<this> = () => { };\n\tdestroy: DestroyFunction<this> = () => { };\n\tcleanup: CleanupFunction<this> = () => { };\n\n\tconstructor(args: BaseNodeOptions[] = []) {\n\t\tconst options = args\n\t\t\t.filter(arg => !(arg instanceof BaseNode))\n\t\t\t.reduce((acc, opt) => ({ ...acc, ...opt }), {});\n\t\tthis.options = options as Options;\n\t\tthis.uuid = nanoid();\n\t}\n\n\tpublic setParent(parent: NodeInterface | null): void {\n\t\tthis.parent = parent;\n\t}\n\n\tpublic getParent(): NodeInterface | null {\n\t\treturn this.parent;\n\t}\n\n\tpublic add(baseNode: NodeInterface): void {\n\t\tthis.children.push(baseNode);\n\t\tbaseNode.setParent(this);\n\t}\n\n\tpublic remove(baseNode: NodeInterface): void {\n\t\tconst index = this.children.indexOf(baseNode);\n\t\tif (index !== -1) {\n\t\t\tthis.children.splice(index, 1);\n\t\t\tbaseNode.setParent(null);\n\t\t}\n\t}\n\n\tpublic getChildren(): NodeInterface[] {\n\t\treturn this.children;\n\t}\n\n\tpublic isComposite(): boolean {\n\t\treturn this.children.length > 0;\n\t}\n\n\tpublic abstract create(): T;\n\n\tprotected abstract _setup(params: SetupContext<this>): void;\n\n\tprotected abstract _loaded(params: LoadedContext<this>): Promise<void>;\n\n\tprotected abstract _update(params: UpdateContext<this>): void;\n\n\tprotected abstract _destroy(params: DestroyContext<this>): void;\n\n\tprotected abstract _cleanup(params: CleanupContext<this>): Promise<void>;\n\n\tpublic nodeSetup(params: SetupContext<this>) {\n\t\tif (DEBUG_FLAG) { /** */ }\n\t\tthis.markedForRemoval = false;\n\t\tif (typeof this._setup === 'function') {\n\t\t\tthis._setup(params);\n\t\t}\n\t\tif (this.setup) {\n\t\t\tthis.setup(params);\n\t\t}\n\t\tthis.children.forEach(child => child.nodeSetup(params));\n\t}\n\n\tpublic nodeUpdate(params: UpdateContext<this>): void {\n\t\tif (this.markedForRemoval) {\n\t\t\treturn;\n\t\t}\n\t\tif (typeof this._update === 'function') {\n\t\t\tthis._update(params);\n\t\t}\n\t\tif (this.update) {\n\t\t\tthis.update(params);\n\t\t}\n\t\tthis.children.forEach(child => child.nodeUpdate(params));\n\t}\n\n\tpublic nodeDestroy(params: DestroyContext<this>): void {\n\t\tthis.children.forEach(child => child.nodeDestroy(params));\n\t\tif (this.destroy) {\n\t\t\tthis.destroy(params);\n\t\t}\n\t\tif (typeof this._destroy === 'function') {\n\t\t\tthis._destroy(params);\n\t\t}\n\t\tthis.markedForRemoval = true;\n\t}\n\n\tpublic getOptions(): Options {\n\t\treturn this.options;\n\t}\n\n\tpublic setOptions(options: Partial<Options>): void {\n\t\tthis.options = { ...this.options, ...options };\n\t}\n}","import { ColliderDesc } from \"@dimforge/rapier3d-compat\";\nimport { GameEntity, GameEntityOptions } from \"./entity\";\nimport { BufferGeometry, Group, Material, Mesh, Color } from \"three\";\nimport { CollisionBuilder } from \"../collision/collision-builder\";\nimport { MeshBuilder } from \"../graphics/mesh\";\nimport { MaterialBuilder, MaterialOptions } from \"../graphics/material\";\nimport { Vec3 } from \"../core/vector\";\n\nexport abstract class EntityCollisionBuilder extends CollisionBuilder {\n\tabstract collider(options: GameEntityOptions): ColliderDesc;\n}\n\nexport abstract class EntityMeshBuilder extends MeshBuilder {\n\tbuild(options: GameEntityOptions): BufferGeometry {\n\t\treturn new BufferGeometry();\n\t}\n\n\tpostBuild(): void {\n\t\treturn;\n\t}\n}\n\nexport abstract class EntityBuilder<T extends GameEntity<U> & P, U extends GameEntityOptions, P = any> {\n\tprotected meshBuilder: EntityMeshBuilder | null;\n\tprotected collisionBuilder: EntityCollisionBuilder | null;\n\tprotected materialBuilder: MaterialBuilder | null;\n\tprotected options: Partial<U>;\n\tprotected entity: T;\n\n\tconstructor(\n\t\toptions: Partial<U>,\n\t\tentity: T,\n\t\tmeshBuilder: EntityMeshBuilder | null,\n\t\tcollisionBuilder: EntityCollisionBuilder | null,\n\t) {\n\t\tthis.options = options;\n\t\tthis.entity = entity;\n\t\tthis.meshBuilder = meshBuilder;\n\t\tthis.collisionBuilder = collisionBuilder;\n\t\tthis.materialBuilder = new MaterialBuilder();\n\t\tconst builders: NonNullable<GameEntityOptions[\"_builders\"]> = {\n\t\t\tmeshBuilder: this.meshBuilder,\n\t\t\tcollisionBuilder: this.collisionBuilder,\n\t\t\tmaterialBuilder: this.materialBuilder,\n\t\t};\n\t\t(this.options as Partial<GameEntityOptions>)._builders = builders;\n\t}\n\n\twithPosition(setupPosition: Vec3): this {\n\t\tthis.options.position = setupPosition;\n\t\treturn this;\n\t}\n\n\tasync withMaterial(options: Partial<MaterialOptions>, entityType: symbol): Promise<this> {\n\t\tif (this.materialBuilder) {\n\t\t\tawait this.materialBuilder.build(options, entityType);\n\t\t}\n\t\treturn this;\n\t}\n\n\tapplyMaterialToGroup(group: Group, materials: Material[]): void {\n\t\tgroup.traverse((child) => {\n\t\t\tif (child instanceof Mesh) {\n\t\t\t\tif (child.type === 'SkinnedMesh' && materials[0] && !child.material.map) {\n\t\t\t\t\tchild.material = materials[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\tchild.castShadow = true;\n\t\t\tchild.receiveShadow = true;\n\t\t});\n\t}\n\n\tasync build(): Promise<T> {\n\t\tconst entity = this.entity;\n\t\tif (this.materialBuilder) {\n\t\t\tentity.materials = this.materialBuilder.materials;\n\t\t}\n\t\tif (this.meshBuilder && entity.materials) {\n\t\t\tconst geometry = this.meshBuilder.build(this.options);\n\t\t\tentity.mesh = this.meshBuilder._build(this.options, geometry, entity.materials);\n\t\t\tthis.meshBuilder.postBuild();\n\t\t}\n\n\t\tif (entity.group && entity.materials) {\n\t\t\tthis.applyMaterialToGroup(entity.group, entity.materials);\n\t\t}\n\n\t\tif (this.collisionBuilder) {\n\t\t\tthis.collisionBuilder.withCollision(this.options?.collision || {});\n\t\t\tconst [bodyDesc, colliderDesc] = this.collisionBuilder.build(this.options as any);\n\t\t\tentity.bodyDesc = bodyDesc;\n\t\t\tentity.colliderDesc = colliderDesc;\n\n\t\t\tconst { x, y, z } = this.options.position || { x: 0, y: 0, z: 0 };\n\t\t\tentity.bodyDesc.setTranslation(x, y, z);\n\t\t}\n\t\tif (this.options.collisionType) {\n\t\t\tentity.collisionType = this.options.collisionType;\n\t\t}\n\n\t\tif (this.options.color instanceof Color) {\n\t\t\tconst applyColor = (material: Material) => {\n\t\t\t\tconst anyMat = material as any;\n\t\t\t\tif (anyMat && anyMat.color && anyMat.color.set) {\n\t\t\t\t\tanyMat.color.set(this.options.color as Color);\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (entity.materials?.length) {\n\t\t\t\tfor (const mat of entity.materials) applyColor(mat);\n\t\t\t}\n\t\t\tif (entity.mesh && entity.mesh.material) {\n\t\t\t\tconst mat = entity.mesh.material as any;\n\t\t\t\tif (Array.isArray(mat)) mat.forEach(applyColor); else applyColor(mat);\n\t\t\t}\n\t\t\tif (entity.group) {\n\t\t\t\tentity.group.traverse((child) => {\n\t\t\t\t\tif (child instanceof Mesh && child.material) {\n\t\t\t\t\t\tconst mat = child.material as any;\n\t\t\t\t\t\tif (Array.isArray(mat)) mat.forEach(applyColor); else applyColor(mat);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn entity;\n\t}\n\n\tprotected abstract createEntity(options: Partial<U>): T;\n}","import { ActiveCollisionTypes, ColliderDesc, RigidBodyDesc, RigidBodyType, Vector3 } from \"@dimforge/rapier3d-compat\";\nimport { Vec3 } from \"../core/vector\";\nimport { CollisionOptions } from \"./collision\";\n\nconst typeToGroup = new Map<string, number>();\nlet nextGroupId = 0;\n\nexport function getOrCreateCollisionGroupId(type: string): number {\n\tlet groupId = typeToGroup.get(type);\n\tif (groupId === undefined) {\n\t\tgroupId = nextGroupId++ % 16;\n\t\ttypeToGroup.set(type, groupId);\n\t}\n\treturn groupId;\n}\n\nexport function createCollisionFilter(allowedTypes: string[]): number {\n\tlet filter = 0;\n\tallowedTypes.forEach(type => {\n\t\tconst groupId = getOrCreateCollisionGroupId(type);\n\t\tfilter |= (1 << groupId);\n\t});\n\treturn filter;\n}\n\nexport class CollisionBuilder {\n\tstatic: boolean = false;\n\tsensor: boolean = false;\n\tgravity: Vec3 = new Vector3(0, 0, 0);\n\n\tbuild(options: Partial<CollisionOptions>): [RigidBodyDesc, ColliderDesc] {\n\t\tconst bodyDesc = this.bodyDesc({\n\t\t\tisDynamicBody: !this.static\n\t\t});\n\t\tconst collider = this.collider(options);\n\t\tconst type = options.collisionType;\n\t\tif (type) {\n\t\t\tlet groupId = getOrCreateCollisionGroupId(type);\n\t\t\tlet filter = 0b1111111111111111;\n\t\t\tif (options.collisionFilter) {\n\t\t\t\tfilter = createCollisionFilter(options.collisionFilter);\n\t\t\t}\n\t\t\tcollider.setCollisionGroups((groupId << 16) | filter);\n\t\t}\n\t\tconst { KINEMATIC_FIXED, DEFAULT } = ActiveCollisionTypes;\n\t\tcollider.activeCollisionTypes = (this.sensor) ? KINEMATIC_FIXED : DEFAULT;\n\t\treturn [bodyDesc, collider];\n\t}\n\n\twithCollision(collisionOptions: Partial<CollisionOptions>): this {\n\t\tthis.sensor = collisionOptions?.sensor ?? this.sensor;\n\t\tthis.static = collisionOptions?.static ?? this.static;\n\t\treturn this;\n\t}\n\n\tcollider(options: CollisionOptions): ColliderDesc {\n\t\tconst size = options.size ?? new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\treturn colliderDesc;\n\t}\n\n\tbodyDesc({ isDynamicBody = true }): RigidBodyDesc {\n\t\tconst type = isDynamicBody ? RigidBodyType.Dynamic : RigidBodyType.Fixed;\n\t\tconst bodyDesc = new RigidBodyDesc(type)\n\t\t\t.setTranslation(0, 0, 0)\n\t\t\t.setGravityScale(1.0)\n\t\t\t.setCanSleep(false)\n\t\t\t.setCcdEnabled(true);\n\t\treturn bodyDesc;\n\t}\n}","import { BufferGeometry, Material, Mesh } from 'three';\nimport { GameEntityOptions } from '../entities/entity';\n\n/**\n * TODO: allow for multiple materials requires geometry groups\n * TODO: allow for instanced uniforms\n * TODO: allow for geometry groups\n * TODO: allow for batched meshes\n * import { InstancedUniformsMesh } from 'three-instanced-uniforms-mesh';\n * may not need geometry groups for shaders though\n * setGeometry<T extends BufferGeometry>(geometry: T) {\n * MeshBuilder.bachedMesh = new BatchedMesh(10, 5000, 10000, material);\n * }\n */\n\nexport type MeshBuilderOptions = Partial<Pick<GameEntityOptions, 'batched' | 'material'>>;\n\nexport class MeshBuilder {\n\n\t_build(meshOptions: MeshBuilderOptions, geometry: BufferGeometry, materials: Material[]): Mesh {\n\t\tconst { batched, material } = meshOptions;\n\t\tif (batched) {\n\t\t\tconsole.warn('warning: mesh batching is not implemented');\n\t\t}\n\t\tconst mesh = new Mesh(geometry, materials.at(-1));\n\t\tmesh.position.set(0, 0, 0);\n\t\tmesh.castShadow = true;\n\t\tmesh.receiveShadow = true;\n\t\treturn mesh;\n\t}\n\n\t_postBuild(): void {\n\t\treturn;\n\t}\n}","import {\n\tColor,\n\tMaterial,\n\tMeshPhongMaterial,\n\tMeshStandardMaterial,\n\tRepeatWrapping,\n\tShaderMaterial,\n\tTextureLoader,\n\tVector2,\n\tVector3\n} from 'three';\nimport { shortHash, sortedStringify } from '../core/utility/strings';\nimport shaderMap, { ZylemShaderObject, ZylemShaderType } from '../core/preset-shader';\n\nexport interface MaterialOptions {\n\tpath?: string;\n\trepeat?: Vector2;\n\tshader?: ZylemShaderType;\n\tcolor?: Color;\n}\n\ntype BatchGeometryMap = Map<symbol, number>;\n\ninterface BatchMaterialMapObject {\n\tgeometryMap: BatchGeometryMap;\n\tmaterial: Material;\n};\n\ntype BatchKey = ReturnType<typeof shortHash>;\n\nexport type TexturePath = string | null;\n\nexport class MaterialBuilder {\n\tstatic batchMaterialMap: Map<BatchKey, BatchMaterialMapObject> = new Map();\n\n\tmaterials: Material[] = [];\n\n\tbatchMaterial(options: Partial<MaterialOptions>, entityType: symbol) {\n\t\tconst batchKey = shortHash(sortedStringify(options));\n\t\tconst mappedObject = MaterialBuilder.batchMaterialMap.get(batchKey);\n\t\tif (mappedObject) {\n\t\t\tconst count = mappedObject.geometryMap.get(entityType);\n\t\t\tif (count) {\n\t\t\t\tmappedObject.geometryMap.set(entityType, count + 1);\n\t\t\t} else {\n\t\t\t\tmappedObject.geometryMap.set(entityType, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tMaterialBuilder.batchMaterialMap.set(\n\t\t\t\tbatchKey, {\n\t\t\t\tgeometryMap: new Map([[entityType, 1]]),\n\t\t\t\tmaterial: this.materials[0]\n\t\t\t});\n\t\t}\n\t}\n\n\tasync build(options: Partial<MaterialOptions>, entityType: symbol) {\n\t\tconst { path, repeat, color, shader } = options;\n\t\tif (shader) this.withShader(shader);\n\t\tif (color) this.withColor(color);\n\t\tawait this.setTexture(path ?? null, repeat);\n\t\tif (this.materials.length === 0) {\n\t\t\tthis.setColor(new Color('#ffffff'));\n\t\t}\n\t\tthis.batchMaterial(options, entityType);\n\t}\n\n\twithColor(color: Color): this {\n\t\tthis.setColor(color);\n\t\treturn this;\n\t}\n\n\twithShader(shaderType: ZylemShaderType): this {\n\t\tthis.setShader(shaderType);\n\t\treturn this;\n\t}\n\n\tasync setTexture(texturePath: TexturePath = null, repeat: Vector2 = new Vector2(1, 1)) {\n\t\tif (!texturePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst loader = new TextureLoader();\n\t\tconst texture = await loader.loadAsync(texturePath as string);\n\t\ttexture.repeat = repeat;\n\t\ttexture.wrapS = RepeatWrapping;\n\t\ttexture.wrapT = RepeatWrapping;\n\t\tconst material = new MeshPhongMaterial({\n\t\t\tmap: texture,\n\t\t});\n\t\tthis.materials.push(material);\n\t}\n\n\tsetColor(color: Color) {\n\t\tconst material = new MeshStandardMaterial({\n\t\t\tcolor: color,\n\t\t\temissiveIntensity: 0.5,\n\t\t\tlightMapIntensity: 0.5,\n\t\t\tfog: true,\n\t\t});\n\n\t\tthis.materials.push(material);\n\t}\n\n\tsetShader(customShader: ZylemShaderType) {\n\t\tconst { fragment, vertex } = shaderMap.get(customShader) ?? shaderMap.get('standard') as ZylemShaderObject;\n\n\t\tconst shader = new ShaderMaterial({\n\t\t\tuniforms: {\n\t\t\t\tiResolution: { value: new Vector3(1, 1, 1) },\n\t\t\t\tiTime: { value: 0 },\n\t\t\t\ttDiffuse: { value: null },\n\t\t\t\ttDepth: { value: null },\n\t\t\t\ttNormal: { value: null }\n\t\t\t},\n\t\t\tvertexShader: vertex,\n\t\t\tfragmentShader: fragment,\n\t\t});\n\t\tthis.materials.push(shader);\n\t}\n}\n","export function sortedStringify(obj: Record<string, any>) {\n\tconst sortedObj = Object.keys(obj)\n\t\t.sort()\n\t\t.reduce((acc: Record<string, any>, key: string) => {\n\t\t\tacc[key] = obj[key];\n\t\t\treturn acc;\n\t\t}, {} as Record<string, any>);\n\n\treturn JSON.stringify(sortedObj);\n}\n\nexport function shortHash(objString: string) {\n\tlet hash = 0;\n\tfor (let i = 0; i < objString.length; i++) {\n\t\thash = Math.imul(31, hash) + objString.charCodeAt(i) | 0;\n\t}\n\treturn hash.toString(36);\n}","export default \"#include <common>\\n\\nuniform vec3 iResolution;\\nuniform float iTime;\\nvarying vec2 vUv;\\n\\n// Credit goes to:\\n// https://www.shadertoy.com/view/mtyGWy\\n\\nvec3 palette( float t ) {\\n vec3 a = vec3(0.5, 0.5, 0.5);\\n vec3 b = vec3(0.5, 0.5, 0.5);\\n vec3 c = vec3(1.0, 1.0, 1.0);\\n vec3 d = vec3(0.263,0.416,0.557);\\n\\n return a + b*cos( 6.28318*(c*t+d) );\\n}\\n\\nvoid mainImage( out vec4 fragColor, in vec2 fragCoord ) {\\n vec2 uv = (fragCoord * 2.0 - iResolution.xy) / iResolution.y;\\n vec2 uv0 = uv;\\n vec3 finalColor = vec3(0.0);\\n \\n for (float i = 0.0; i < 4.0; i++) {\\n uv = fract(uv * 1.5) - 0.5;\\n\\n float d = length(uv) * exp(-length(uv0));\\n\\n vec3 col = palette(length(uv0) + i*.4 + iTime*.4);\\n\\n d = sin(d*5. + iTime)/5.;\\n d = abs(d);\\n\\n d = pow(0.01 / d, 1.2);\\n\\n finalColor += col * d;\\n }\\n \\n fragColor = vec4(finalColor, 1.0);\\n}\\n \\nvoid main() {\\n mainImage(gl_FragColor, vUv);\\n}\"","export default \"#include <common>\\n \\nuniform vec3 iResolution;\\nuniform float iTime;\\nuniform vec2 iOffset;\\nvarying vec2 vUv;\\n\\nfloat snoise(vec3 uv, float res)\\n{\\n\\tconst vec3 s = vec3(1e0, 1e2, 1e3);\\n\\t\\n\\tuv *= res;\\n\\t\\n\\tvec3 uv0 = floor(mod(uv, res))*s;\\n\\tvec3 uv1 = floor(mod(uv+vec3(1.), res))*s;\\n\\t\\n\\tvec3 f = fract(uv); f = f*f*(3.0-2.0*f);\\n\\n\\tvec4 v = vec4(uv0.x+uv0.y+uv0.z, uv1.x+uv0.y+uv0.z,\\n\\t\\t \\t uv0.x+uv1.y+uv0.z, uv1.x+uv1.y+uv0.z);\\n\\n\\tvec4 r = fract(sin(v*1e-1)*1e3);\\n\\tfloat r0 = mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y);\\n\\t\\n\\tr = fract(sin((v + uv1.z - uv0.z)*1e-1)*1e3);\\n\\tfloat r1 = mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y);\\n\\t\\n\\treturn mix(r0, r1, f.z)*2.-1.;\\n}\\n\\nvoid mainImage( out vec4 fragColor, in vec2 fragCoord ) {\\n\\tvec2 p = -.5 + fragCoord.xy / iResolution.xy;\\n\\tp.x *= iResolution.x/iResolution.y;\\n\\t\\n\\tfloat color = 3.0 - (3.*length(2.*p));\\n\\t\\n\\tvec3 coord = vec3(atan(p.x,p.y)/6.2832+.5, length(p)*.4, .5);\\n\\t\\n\\tfor(int i = 1; i <= 7; i++)\\n\\t{\\n\\t\\tfloat power = pow(2.0, float(i));\\n\\t\\tcolor += (1.5 / power) * snoise(coord + vec3(0.,-iTime*.05, iTime*.01), power*16.);\\n\\t}\\n\\tfragColor = vec4( color, pow(max(color,0.),2.)*0.4, pow(max(color,0.),3.)*0.15 , 1.0);\\n}\\n\\nvoid main() {\\n mainImage(gl_FragColor, vUv);\\n}\"","export default \"uniform sampler2D tDiffuse;\\nvarying vec2 vUv;\\n\\nvoid main() {\\n\\tvec4 texel = texture2D( tDiffuse, vUv );\\n\\n\\tgl_FragColor = texel;\\n}\"","export default \"varying vec3 vBarycentric;\\nuniform vec3 baseColor;\\nuniform vec3 wireframeColor;\\nuniform float wireframeThickness;\\n\\nfloat edgeFactor() {\\n vec3 d = fwidth(vBarycentric);\\n vec3 a3 = smoothstep(vec3(0.0), d * wireframeThickness, vBarycentric);\\n return min(min(a3.x, a3.y), a3.z);\\n}\\n\\nvoid main() {\\n float edge = edgeFactor();\\n\\n vec3 wireColor = wireframeColor;\\n\\n vec3 finalColor = mix(wireColor, baseColor, edge);\\n \\n gl_FragColor = vec4(finalColor, 1.0);\\n}\\n\"","export default \"uniform vec2 uvScale;\\nvarying vec2 vUv;\\n\\nvoid main() {\\n\\tvUv = uv;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n}\"","export default \"varying vec3 vBarycentric;\\n\\nvoid main() {\\n vec3 barycentric = vec3(0.0);\\n int index = gl_VertexID % 3;\\n if (index == 0) barycentric = vec3(1.0, 0.0, 0.0);\\n else if (index == 1) barycentric = vec3(0.0, 1.0, 0.0);\\n else barycentric = vec3(0.0, 0.0, 1.0);\\n vBarycentric = barycentric;\\n \\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\n}\\n\"","/* Fragment Shaders **/\nimport starsTest from '../graphics/shaders/fragment/stars.glsl';\nimport fireFragment from '../graphics/shaders/fragment/fire.glsl';\nimport fragmentShader from '../graphics/shaders/fragment/standard.glsl';\nimport debugFragment from '../graphics/shaders/fragment/debug.glsl';\n\n/* Vertex Shaders **/\nimport vertexShader from '../graphics/shaders/vertex/object-shader.glsl';\nimport debugVertexShader from '../graphics/shaders/vertex/debug.glsl';\n\nexport type ZylemShaderObject = { fragment: string, vertex: string };\n\nconst starShader: ZylemShaderObject = {\n\tfragment: starsTest,\n\tvertex: vertexShader\n};\n\nconst fireShader: ZylemShaderObject = {\n\tfragment: fireFragment,\n\tvertex: vertexShader\n};\n\nconst standardShader: ZylemShaderObject = {\n\tfragment: fragmentShader,\n\tvertex: vertexShader\n};\n\nconst debugShader: ZylemShaderObject = {\n\tfragment: debugFragment,\n\tvertex: debugVertexShader\n};\n\nexport type ZylemShaderType = 'standard' | 'fire' | 'star' | 'debug';\n\nconst shaderMap: Map<ZylemShaderType, ZylemShaderObject> = new Map();\nshaderMap.set('standard', standardShader);\nshaderMap.set('fire', fireShader);\nshaderMap.set('star', starShader);\nshaderMap.set('debug', debugShader);\n\nexport default shaderMap;","import { GameEntity, GameEntityOptions } from '../entity';\nimport { MeshStandardMaterial, MeshBasicMaterial, MeshPhongMaterial } from 'three';\n\n/**\n * Interface for entities that provide custom debug information\n */\nexport interface DebugInfoProvider {\n\tgetDebugInfo(): Record<string, any>;\n}\n\n/**\n * Helper to check if an object implements DebugInfoProvider\n */\nfunction hasDebugInfo(obj: any): obj is DebugInfoProvider {\n\treturn obj && typeof obj.getDebugInfo === 'function';\n}\n\n/**\n * Debug delegate that provides debug information for entities\n */\nexport class DebugDelegate {\n\tprivate entity: GameEntity<any>;\n\n\tconstructor(entity: GameEntity<any>) {\n\t\tthis.entity = entity;\n\t}\n\n\t/**\n\t * Get formatted position string\n\t */\n\tprivate getPositionString(): string {\n\t\tif (this.entity.mesh) {\n\t\t\tconst { x, y, z } = this.entity.mesh.position;\n\t\t\treturn `${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`;\n\t\t}\n\t\tconst { x, y, z } = this.entity.options.position || { x: 0, y: 0, z: 0 };\n\t\treturn `${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`;\n\t}\n\n\t/**\n\t * Get formatted rotation string (in degrees)\n\t */\n\tprivate getRotationString(): string {\n\t\tif (this.entity.mesh) {\n\t\t\tconst { x, y, z } = this.entity.mesh.rotation;\n\t\t\tconst toDeg = (rad: number) => (rad * 180 / Math.PI).toFixed(1);\n\t\t\treturn `${toDeg(x)}°, ${toDeg(y)}°, ${toDeg(z)}°`;\n\t\t}\n\t\tconst { x, y, z } = this.entity.options.rotation || { x: 0, y: 0, z: 0 };\n\t\tconst toDeg = (rad: number) => (rad * 180 / Math.PI).toFixed(1);\n\t\treturn `${toDeg(x)}°, ${toDeg(y)}°, ${toDeg(z)}°`;\n\t}\n\n\t/**\n\t * Get material information\n\t */\n\tprivate getMaterialInfo(): Record<string, any> {\n\t\tif (!this.entity.mesh || !this.entity.mesh.material) {\n\t\t\treturn { type: 'none' };\n\t\t}\n\n\t\tconst material = Array.isArray(this.entity.mesh.material)\n\t\t\t? this.entity.mesh.material[0]\n\t\t\t: this.entity.mesh.material;\n\n\t\tconst info: Record<string, any> = {\n\t\t\ttype: material.type\n\t\t};\n\n\t\tif (material instanceof MeshStandardMaterial ||\n\t\t\tmaterial instanceof MeshBasicMaterial ||\n\t\t\tmaterial instanceof MeshPhongMaterial) {\n\t\t\tinfo.color = `#${material.color.getHexString()}`;\n\t\t\tinfo.opacity = material.opacity;\n\t\t\tinfo.transparent = material.transparent;\n\t\t}\n\n\t\tif ('roughness' in material) {\n\t\t\tinfo.roughness = material.roughness;\n\t\t}\n\n\t\tif ('metalness' in material) {\n\t\t\tinfo.metalness = material.metalness;\n\t\t}\n\n\t\treturn info;\n\t}\n\n\tprivate getPhysicsInfo(): Record<string, any> | null {\n\t\tif (!this.entity.body) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst info: Record<string, any> = {\n\t\t\ttype: this.entity.body.bodyType(),\n\t\t\tmass: this.entity.body.mass(),\n\t\t\tisEnabled: this.entity.body.isEnabled(),\n\t\t\tisSleeping: this.entity.body.isSleeping()\n\t\t};\n\n\t\tconst velocity = this.entity.body.linvel();\n\t\tinfo.velocity = `${velocity.x.toFixed(2)}, ${velocity.y.toFixed(2)}, ${velocity.z.toFixed(2)}`;\n\n\t\treturn info;\n\t}\n\n\tpublic buildDebugInfo(): Record<string, any> {\n\t\tconst defaultInfo: Record<string, any> = {\n\t\t\tname: this.entity.name || this.entity.uuid,\n\t\t\tuuid: this.entity.uuid,\n\t\t\tposition: this.getPositionString(),\n\t\t\trotation: this.getRotationString(),\n\t\t\tmaterial: this.getMaterialInfo()\n\t\t};\n\n\t\tconst physicsInfo = this.getPhysicsInfo();\n\t\tif (physicsInfo) {\n\t\t\tdefaultInfo.physics = physicsInfo;\n\t\t}\n\n\t\tif (this.entity.behaviors.length > 0) {\n\t\t\tdefaultInfo.behaviors = this.entity.behaviors.map(b => b.constructor.name);\n\t\t}\n\n\t\tif (hasDebugInfo(this.entity)) {\n\t\t\tconst customInfo = this.entity.getDebugInfo();\n\t\t\treturn { ...defaultInfo, ...customInfo };\n\t\t}\n\n\t\treturn defaultInfo;\n\t}\n}\n\nclass EnhancedDebugInfoBuilder {\n\tprivate customBuilder?: (options: GameEntityOptions) => Record<string, any>;\n\n\tconstructor(customBuilder?: (options: GameEntityOptions) => Record<string, any>) {\n\t\tthis.customBuilder = customBuilder;\n\t}\n\n\tbuildInfo(options: GameEntityOptions, entity?: GameEntity<any>): Record<string, any> {\n\t\tif (this.customBuilder) {\n\t\t\treturn this.customBuilder(options);\n\t\t}\n\n\t\tif (entity) {\n\t\t\tconst delegate = new DebugDelegate(entity);\n\t\t\treturn delegate.buildDebugInfo();\n\t\t}\n\n\t\tconst { x, y, z } = options.position || { x: 0, y: 0, z: 0 };\n\t\treturn {\n\t\t\tname: (options as any).name || 'unnamed',\n\t\t\tposition: `${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`\n\t\t};\n\t}\n}\n","// this class is not for asset loading, it is for loading entity specific data\n// this is to keep the entity class focused purely on entity logic\n\nexport function isLoadable(obj: any): obj is EntityLoaderDelegate {\n\treturn typeof obj?.load === \"function\" && typeof obj?.data === \"function\";\n}\n\nexport interface EntityLoaderDelegate {\n\tload(): Promise<void>;\n\tdata(): any;\n}\n\nexport class EntityLoader {\n\tentityReference: EntityLoaderDelegate;\n\n\tconstructor(entity: EntityLoaderDelegate) {\n\t\tthis.entityReference = entity;\n\t}\n\n\tasync load() {\n\t\tif (this.entityReference.load) {\n\t\t\tawait this.entityReference.load();\n\t\t}\n\t}\n\n\tasync data() {\n\t\tif (this.entityReference.data) {\n\t\t\treturn this.entityReference.data();\n\t\t}\n\t\treturn null;\n\t}\n}","import { GameEntityOptions, GameEntity } from \"./entity\";\nimport { BaseNode } from \"../core/base-node\";\nimport { EntityBuilder } from \"./builder\";\nimport { EntityCollisionBuilder } from \"./builder\";\nimport { EntityMeshBuilder } from \"./builder\";\nimport { EntityLoader, isLoadable } from \"./delegates/loader\";\n\nexport interface CreateGameEntityOptions<T extends GameEntity<any>, CreateOptions extends GameEntityOptions> {\n\targs: Array<any>;\n\tdefaultConfig: GameEntityOptions;\n\tEntityClass: new (options: any) => T;\n\tBuilderClass: new (options: any, entity: T, meshBuilder: any, collisionBuilder: any) => EntityBuilder<T, CreateOptions>;\n\tMeshBuilderClass?: new (data: any) => EntityMeshBuilder;\n\tCollisionBuilderClass?: new (data: any) => EntityCollisionBuilder;\n\tentityType: symbol;\n};\n\nexport async function createEntity<T extends GameEntity<any>, CreateOptions extends GameEntityOptions>(params: CreateGameEntityOptions<T, CreateOptions>): Promise<T> {\n\tconst {\n\t\targs,\n\t\tdefaultConfig,\n\t\tEntityClass,\n\t\tBuilderClass,\n\t\tentityType,\n\t\tMeshBuilderClass,\n\t\tCollisionBuilderClass,\n\t} = params;\n\n\tlet builder: EntityBuilder<T, CreateOptions> | null = null;\n\tlet configuration;\n\n\tconst configurationIndex = args.findIndex(node => !(node instanceof BaseNode));\n\tif (configurationIndex !== -1) {\n\t\tconst subArgs = args.splice(configurationIndex, 1);\n\t\tconfiguration = subArgs.find(node => !(node instanceof BaseNode));\n\t}\n\n\tconst mergedConfiguration = configuration ? { ...defaultConfig, ...configuration } : defaultConfig;\n\targs.push(mergedConfiguration);\n\n\tfor (const arg of args) {\n\t\tif (arg instanceof BaseNode) {\n\t\t\tcontinue;\n\t\t}\n\t\tlet entityData = null;\n\t\tconst entity = new EntityClass(arg);\n\t\ttry {\n\t\t\tif (isLoadable(entity)) {\n\t\t\t\tconst loader = new EntityLoader(entity);\n\t\t\t\tawait loader.load();\n\t\t\t\tentityData = await loader.data();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error creating entity with loader:\", error);\n\t\t}\n\t\tbuilder = new BuilderClass(\n\t\t\targ,\n\t\t\tentity,\n\t\t\tMeshBuilderClass ? new MeshBuilderClass(entityData) : null,\n\t\t\tCollisionBuilderClass ? new CollisionBuilderClass(entityData) : null,\n\t\t);\n\t\tif (arg.material) {\n\t\t\tawait builder.withMaterial(arg.material, entityType);\n\t\t}\n\t}\n\n\tif (!builder) {\n\t\tthrow new Error(`missing options for ${String(entityType)}, builder is not initialized.`);\n\t}\n\n\treturn await builder.build();\n}\n\n","import { ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { Color, SphereGeometry } from 'three';\nimport { Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { EntityMeshBuilder } from './builder';\nimport { DebugDelegate } from './delegates/debug';\nimport { createEntity } from './create';\n\ntype ZylemSphereOptions = GameEntityOptions & {\n\tradius?: number;\n};\n\nconst sphereDefaults: ZylemSphereOptions = {\n\tradius: 1,\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: false,\n\t},\n\tmaterial: {\n\t\tcolor: new Color('#ffffff'),\n\t\tshader: 'standard'\n\t},\n};\n\nexport class SphereCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: ZylemSphereOptions): ColliderDesc {\n\t\tconst radius = options.radius ?? 1;\n\t\tlet colliderDesc = ColliderDesc.ball(radius);\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class SphereMeshBuilder extends EntityMeshBuilder {\n\tbuild(options: ZylemSphereOptions): SphereGeometry {\n\t\tconst radius = options.radius ?? 1;\n\t\treturn new SphereGeometry(radius);\n\t}\n}\n\nexport class SphereBuilder extends EntityBuilder<ZylemSphere, ZylemSphereOptions> {\n\tprotected createEntity(options: Partial<ZylemSphereOptions>): ZylemSphere {\n\t\treturn new ZylemSphere(options);\n\t}\n}\n\nexport const SPHERE_TYPE = Symbol('Sphere');\n\nexport class ZylemSphere extends GameEntity<ZylemSphereOptions> {\n\tstatic type = SPHERE_TYPE;\n\n\tconstructor(options?: ZylemSphereOptions) {\n\t\tsuper();\n\t\tthis.options = { ...sphereDefaults, ...options };\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\t\tconst radius = this.options.radius ?? 1;\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemSphere.type),\n\t\t\tradius: radius.toFixed(2),\n\t\t};\n\t}\n}\n\ntype SphereOptions = BaseNode | Partial<ZylemSphereOptions>;\n\nexport async function sphere(...args: Array<SphereOptions>): Promise<ZylemSphere> {\n\treturn createEntity<ZylemSphere, ZylemSphereOptions>({\n\t\targs,\n\t\tdefaultConfig: sphereDefaults,\n\t\tEntityClass: ZylemSphere,\n\t\tBuilderClass: SphereBuilder,\n\t\tMeshBuilderClass: SphereMeshBuilder,\n\t\tCollisionBuilderClass: SphereCollisionBuilder,\n\t\tentityType: ZylemSphere.type\n\t});\n}","import { ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { Color, Euler, Group, Quaternion, Vector3 } from 'three';\nimport {\n\tTextureLoader,\n\tSpriteMaterial,\n\tSprite as ThreeSprite,\n} from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { createEntity } from './create';\nimport { DestroyContext, DestroyFunction, UpdateContext, UpdateFunction } from '../core/base-node-life-cycle';\nimport { DebugDelegate } from './delegates/debug';\n\nexport type SpriteImage = { name: string; file: string };\nexport type SpriteAnimation = {\n\tname: string;\n\tframes: string[];\n\tspeed: number | number[];\n\tloop: boolean;\n};\n\ntype ZylemSpriteOptions = GameEntityOptions & {\n\timages?: SpriteImage[];\n\tanimations?: SpriteAnimation[];\n\tsize?: Vector3;\n\tcollisionSize?: Vector3;\n};\n\nconst spriteDefaults: ZylemSpriteOptions = {\n\tsize: new Vector3(1, 1, 1),\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: false,\n\t},\n\tmaterial: {\n\t\tcolor: new Color('#ffffff'),\n\t\tshader: 'standard'\n\t},\n\timages: [],\n\tanimations: [],\n};\n\nexport class SpriteCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: ZylemSpriteOptions): ColliderDesc {\n\t\tconst size = options.collisionSize || options.size || new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class SpriteBuilder extends EntityBuilder<ZylemSprite, ZylemSpriteOptions> {\n\tprotected createEntity(options: Partial<ZylemSpriteOptions>): ZylemSprite {\n\t\treturn new ZylemSprite(options);\n\t}\n}\n\nexport const SPRITE_TYPE = Symbol('Sprite');\n\nexport class ZylemSprite extends GameEntity<ZylemSpriteOptions> {\n\tstatic type = SPRITE_TYPE;\n\n\tprotected sprites: ThreeSprite[] = [];\n\tprotected spriteMap: Map<string, number> = new Map();\n\tprotected currentSpriteIndex: number = 0;\n\tprotected animations: Map<string, any> = new Map();\n\tprotected currentAnimation: any = null;\n\tprotected currentAnimationFrame: string = '';\n\tprotected currentAnimationIndex: number = 0;\n\tprotected currentAnimationTime: number = 0;\n\n\tconstructor(options?: ZylemSpriteOptions) {\n\t\tsuper();\n\t\tthis.options = { ...spriteDefaults, ...options };\n\t\tthis.createSpritesFromImages(options?.images || []);\n\t\tthis.createAnimations(options?.animations || []);\n\t\tthis.lifeCycleDelegate = {\n\t\t\tupdate: [this.spriteUpdate.bind(this) as UpdateFunction<ZylemSpriteOptions>],\n\t\t\tdestroy: [this.spriteDestroy.bind(this) as DestroyFunction<ZylemSpriteOptions>],\n\t\t};\n\t}\n\n\tprotected createSpritesFromImages(images: SpriteImage[]) {\n\t\tconst textureLoader = new TextureLoader();\n\t\timages.forEach((image, index) => {\n\t\t\tconst spriteMap = textureLoader.load(image.file);\n\t\t\tconst material = new SpriteMaterial({\n\t\t\t\tmap: spriteMap,\n\t\t\t\ttransparent: true,\n\t\t\t});\n\t\t\tconst _sprite = new ThreeSprite(material);\n\t\t\t_sprite.position.normalize();\n\t\t\tthis.sprites.push(_sprite);\n\t\t\tthis.spriteMap.set(image.name, index);\n\t\t});\n\t\tthis.group = new Group();\n\t\tthis.group.add(...this.sprites);\n\t}\n\n\tprotected createAnimations(animations: SpriteAnimation[]) {\n\t\tanimations.forEach(animation => {\n\t\t\tconst { name, frames, loop = false, speed = 1 } = animation;\n\t\t\tconst internalAnimation = {\n\t\t\t\tframes: frames.map((frame, index) => ({\n\t\t\t\t\tkey: frame,\n\t\t\t\t\tindex,\n\t\t\t\t\ttime: (typeof speed === 'number' ? speed : speed[index]) * (index + 1),\n\t\t\t\t\tduration: typeof speed === 'number' ? speed : speed[index]\n\t\t\t\t})),\n\t\t\t\tloop,\n\t\t\t};\n\t\t\tthis.animations.set(name, internalAnimation);\n\t\t});\n\t}\n\n\tsetSprite(key: string) {\n\t\tconst spriteIndex = this.spriteMap.get(key);\n\t\tconst useIndex = spriteIndex ?? 0;\n\t\tthis.currentSpriteIndex = useIndex;\n\t\tthis.sprites.forEach((_sprite, i) => {\n\t\t\t_sprite.visible = this.currentSpriteIndex === i;\n\t\t});\n\t}\n\n\tsetAnimation(name: string, delta: number) {\n\t\tconst animation = this.animations.get(name);\n\t\tif (!animation) return;\n\n\t\tconst { loop, frames } = animation;\n\t\tconst frame = frames[this.currentAnimationIndex];\n\n\t\tif (name === this.currentAnimation) {\n\t\t\tthis.currentAnimationFrame = frame.key;\n\t\t\tthis.currentAnimationTime += delta;\n\t\t\tthis.setSprite(this.currentAnimationFrame);\n\t\t} else {\n\t\t\tthis.currentAnimation = name;\n\t\t}\n\n\t\tif (this.currentAnimationTime > frame.time) {\n\t\t\tthis.currentAnimationIndex++;\n\t\t}\n\n\t\tif (this.currentAnimationIndex >= frames.length) {\n\t\t\tif (loop) {\n\t\t\t\tthis.currentAnimationIndex = 0;\n\t\t\t\tthis.currentAnimationTime = 0;\n\t\t\t} else {\n\t\t\t\tthis.currentAnimationTime = frames[this.currentAnimationIndex].time;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync spriteUpdate(params: UpdateContext<ZylemSpriteOptions>): Promise<void> {\n\t\tthis.sprites.forEach(_sprite => {\n\t\t\tif (_sprite.material) {\n\t\t\t\tconst q = this.body?.rotation();\n\t\t\t\tif (q) {\n\t\t\t\t\tconst quat = new Quaternion(q.x, q.y, q.z, q.w);\n\t\t\t\t\tconst euler = new Euler().setFromQuaternion(quat, 'XYZ');\n\t\t\t\t\t_sprite.material.rotation = euler.z;\n\t\t\t\t}\n\t\t\t\t_sprite.scale.set(this.options.size?.x ?? 1, this.options.size?.y ?? 1, this.options.size?.z ?? 1);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync spriteDestroy(params: DestroyContext<ZylemSpriteOptions>): Promise<void> {\n\t\tthis.sprites.forEach(_sprite => {\n\t\t\t_sprite.removeFromParent();\n\t\t});\n\t\tthis.group?.remove(...this.sprites);\n\t\tthis.group?.removeFromParent();\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemSprite.type),\n\t\t};\n\t}\n}\n\ntype SpriteOptions = BaseNode | Partial<ZylemSpriteOptions>;\n\nexport async function sprite(...args: Array<SpriteOptions>): Promise<ZylemSprite> {\n\treturn createEntity<ZylemSprite, ZylemSpriteOptions>({\n\t\targs,\n\t\tdefaultConfig: spriteDefaults,\n\t\tEntityClass: ZylemSprite,\n\t\tBuilderClass: SpriteBuilder,\n\t\tCollisionBuilderClass: SpriteCollisionBuilder,\n\t\tentityType: ZylemSprite.type\n\t});\n}","import { ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { Color, PlaneGeometry, Vector2, Vector3 } from 'three';\nimport { TexturePath } from '../graphics/material';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { EntityMeshBuilder } from './builder';\nimport { XZPlaneGeometry } from '../graphics/geometries/XZPlaneGeometry';\nimport { createEntity } from './create';\n\ntype ZylemPlaneOptions = GameEntityOptions & {\n\ttile?: Vector2;\n\trepeat?: Vector2;\n\ttexture?: TexturePath;\n\tsubdivisions?: number;\n};\n\nconst DEFAULT_SUBDIVISIONS = 4;\n\nconst planeDefaults: ZylemPlaneOptions = {\n\ttile: new Vector2(10, 10),\n\trepeat: new Vector2(1, 1),\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: true,\n\t},\n\tmaterial: {\n\t\tcolor: new Color('#ffffff'),\n\t\tshader: 'standard'\n\t},\n\tsubdivisions: DEFAULT_SUBDIVISIONS\n};\n\nexport class PlaneCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: ZylemPlaneOptions): ColliderDesc {\n\t\tconst tile = options.tile ?? new Vector2(1, 1);\n\t\tconst subdivisions = options.subdivisions ?? DEFAULT_SUBDIVISIONS;\n\t\tconst size = new Vector3(tile.x, 1, tile.y);\n\n\t\tconst heightData = (options._builders?.meshBuilder as unknown as PlaneMeshBuilder)?.heightData;\n\t\tconst scale = new Vector3(size.x, 1, size.z);\n\t\tlet colliderDesc = ColliderDesc.heightfield(\n\t\t\tsubdivisions,\n\t\t\tsubdivisions,\n\t\t\theightData,\n\t\t\tscale\n\t\t);\n\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class PlaneMeshBuilder extends EntityMeshBuilder {\n\theightData: Float32Array = new Float32Array();\n\tcolumnsRows = new Map();\n\n\tbuild(options: ZylemPlaneOptions): XZPlaneGeometry {\n\t\tconst tile = options.tile ?? new Vector2(1, 1);\n\t\tconst subdivisions = options.subdivisions ?? DEFAULT_SUBDIVISIONS;\n\t\tconst size = new Vector3(tile.x, 1, tile.y);\n\n\t\tconst geometry = new XZPlaneGeometry(size.x, size.z, subdivisions, subdivisions);\n\t\tconst vertexGeometry = new PlaneGeometry(size.x, size.z, subdivisions, subdivisions);\n\t\tconst dx = size.x / subdivisions;\n\t\tconst dy = size.z / subdivisions;\n\t\tconst originalVertices = geometry.attributes.position.array;\n\t\tconst vertices = vertexGeometry.attributes.position.array;\n\t\tconst columsRows = new Map();\n\t\tfor (let i = 0; i < vertices.length; i += 3) {\n\t\t\tlet row = Math.floor(Math.abs((vertices as any)[i] + (size.x / 2)) / dx);\n\t\t\tlet column = Math.floor(Math.abs((vertices as any)[i + 1] - (size.z / 2)) / dy);\n\t\t\tconst randomHeight = Math.random() * 4;\n\t\t\t(vertices as any)[i + 2] = randomHeight;\n\t\t\toriginalVertices[i + 1] = randomHeight;\n\t\t\tif (!columsRows.get(column)) {\n\t\t\t\tcolumsRows.set(column, new Map());\n\t\t\t}\n\t\t\tcolumsRows.get(column).set(row, randomHeight);\n\t\t}\n\t\tthis.columnsRows = columsRows;\n\t\treturn geometry;\n\t}\n\n\tpostBuild(): void {\n\t\tconst heights = [];\n\t\tfor (let i = 0; i <= DEFAULT_SUBDIVISIONS; ++i) {\n\t\t\tfor (let j = 0; j <= DEFAULT_SUBDIVISIONS; ++j) {\n\t\t\t\tconst row = this.columnsRows.get(j);\n\t\t\t\tif (!row) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst data = row.get(i);\n\t\t\t\theights.push(data);\n\t\t\t}\n\t\t}\n\t\tthis.heightData = new Float32Array(heights as unknown as number[]);\n\t}\n}\n\nexport class PlaneBuilder extends EntityBuilder<ZylemPlane, ZylemPlaneOptions> {\n\tprotected createEntity(options: Partial<ZylemPlaneOptions>): ZylemPlane {\n\t\treturn new ZylemPlane(options);\n\t}\n}\n\nexport const PLANE_TYPE = Symbol('Plane');\n\nexport class ZylemPlane extends GameEntity<ZylemPlaneOptions> {\n\tstatic type = PLANE_TYPE;\n\n\tconstructor(options?: ZylemPlaneOptions) {\n\t\tsuper();\n\t\tthis.options = { ...planeDefaults, ...options };\n\t}\n}\n\ntype PlaneOptions = BaseNode | Partial<ZylemPlaneOptions>;\n\nexport async function plane(...args: Array<PlaneOptions>): Promise<ZylemPlane> {\n\treturn createEntity<ZylemPlane, ZylemPlaneOptions>({\n\t\targs,\n\t\tdefaultConfig: planeDefaults,\n\t\tEntityClass: ZylemPlane,\n\t\tBuilderClass: PlaneBuilder,\n\t\tMeshBuilderClass: PlaneMeshBuilder,\n\t\tCollisionBuilderClass: PlaneCollisionBuilder,\n\t\tentityType: ZylemPlane.type\n\t});\n}\n","// @ts-nocheck\nimport { BufferGeometry, Float32BufferAttribute } from 'three';\n\nclass XZPlaneGeometry extends BufferGeometry {\n\n\tconstructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) {\n\n\t\tsuper();\n\n\t\tthis.type = 'XZPlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor(widthSegments);\n\t\tconst gridY = Math.floor(heightSegments);\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor (let iy = 0; iy < gridY1; iy++) {\n\n\t\t\tconst z = iy * segment_height - height_half;\n\n\t\t\tfor (let ix = 0; ix < gridX1; ix++) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push(x, 0, z);\n\n\t\t\t\tnormals.push(0, 1, 0);\n\n\t\t\t\tuvs.push(ix / gridX);\n\t\t\t\tuvs.push(1 - (iy / gridY));\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor (let iy = 0; iy < gridY; iy++) {\n\n\t\t\tfor (let ix = 0; ix < gridX; ix++) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * (iy + 1);\n\t\t\t\tconst c = (ix + 1) + gridX1 * (iy + 1);\n\t\t\t\tconst d = (ix + 1) + gridX1 * iy;\n\n\t\t\t\tindices.push(a, b, d);\n\t\t\t\tindices.push(b, c, d);\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex(indices);\n\t\tthis.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n\t\tthis.setAttribute('normal', new Float32BufferAttribute(normals, 3));\n\t\tthis.setAttribute('uv', new Float32BufferAttribute(uvs, 2));\n\n\t}\n\n\tcopy(source) {\n\n\t\tsuper.copy(source);\n\n\t\tthis.parameters = Object.assign({}, source.parameters);\n\n\t\treturn this;\n\t}\n\n\tstatic fromJSON(data) {\n\t\treturn new XZPlaneGeometry(data.width, data.height, data.widthSegments, data.heightSegments);\n\t}\n\n}\n\nexport { XZPlaneGeometry };","import { ActiveCollisionTypes, ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { createEntity } from './create';\nimport { CollisionHandlerDelegate } from '../collision/collision-delegate';\nimport { state } from '../game/game-state';\n\nexport type OnHeldParams = {\n\tdelta: number;\n\tself: ZylemZone;\n\tvisitor: GameEntity<any>;\n\theldTime: number;\n\tglobals: any;\n}\n\nexport type OnEnterParams = Pick<OnHeldParams, 'self' | 'visitor' | 'globals'>;\nexport type OnExitParams = Pick<OnHeldParams, 'self' | 'visitor' | 'globals'>;\n\ntype ZylemZoneOptions = GameEntityOptions & {\n\tsize?: Vector3;\n\tstatic?: boolean;\n\tonEnter?: (params: OnEnterParams) => void;\n\tonHeld?: (params: OnHeldParams) => void;\n\tonExit?: (params: OnExitParams) => void;\n};\n\nconst zoneDefaults: ZylemZoneOptions = {\n\tsize: new Vector3(1, 1, 1),\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: true,\n\t},\n\tmaterial: {\n\t\tshader: 'standard'\n\t},\n};\n\nexport class ZoneCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: ZylemZoneOptions): ColliderDesc {\n\t\tconst size = options.size || new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\tcolliderDesc.setSensor(true);\n\t\tcolliderDesc.activeCollisionTypes = ActiveCollisionTypes.KINEMATIC_FIXED;\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class ZoneBuilder extends EntityBuilder<ZylemZone, ZylemZoneOptions> {\n\tprotected createEntity(options: Partial<ZylemZoneOptions>): ZylemZone {\n\t\treturn new ZylemZone(options);\n\t}\n}\n\nexport const ZONE_TYPE = Symbol('Zone');\n\nexport class ZylemZone extends GameEntity<ZylemZoneOptions> implements CollisionHandlerDelegate {\n\tstatic type = ZONE_TYPE;\n\n\tprivate _enteredZone: Map<string, number> = new Map();\n\tprivate _exitedZone: Map<string, number> = new Map();\n\tprivate _zoneEntities: Map<string, any> = new Map();\n\n\tconstructor(options?: ZylemZoneOptions) {\n\t\tsuper();\n\t\tthis.options = { ...zoneDefaults, ...options };\n\t}\n\n\tpublic handlePostCollision({ delta }: { delta: number }): boolean {\n\t\tthis._enteredZone.forEach((val, key) => {\n\t\t\tthis.exited(delta, key);\n\t\t});\n\t\treturn this._enteredZone.size > 0;\n\t}\n\n\tpublic handleIntersectionEvent({ other, delta }: { other: any, delta: number }) {\n\t\tconst hasEntered = this._enteredZone.get(other.uuid);\n\t\tif (!hasEntered) {\n\t\t\tthis.entered(other);\n\t\t\tthis._zoneEntities.set(other.uuid, other);\n\t\t} else {\n\t\t\tthis.held(delta, other);\n\t\t}\n\t}\n\n\tonEnter(callback: (params: OnEnterParams) => void) {\n\t\tthis.options.onEnter = callback;\n\t\treturn this;\n\t}\n\n\tonHeld(callback: (params: OnHeldParams) => void) {\n\t\tthis.options.onHeld = callback;\n\t\treturn this;\n\t}\n\n\tonExit(callback: (params: OnExitParams) => void) {\n\t\tthis.options.onExit = callback;\n\t\treturn this;\n\t}\n\n\tentered(other: any) {\n\t\tthis._enteredZone.set(other.uuid, 1);\n\t\tif (this.options.onEnter) {\n\t\t\tthis.options.onEnter({\n\t\t\t\tself: this,\n\t\t\t\tvisitor: other,\n\t\t\t\tglobals: state.globals\n\t\t\t});\n\t\t}\n\t}\n\n\texited(delta: number, key: string) {\n\t\tconst hasExited = this._exitedZone.get(key);\n\t\tif (hasExited && hasExited > 1 + delta) {\n\t\t\tthis._exitedZone.delete(key);\n\t\t\tthis._enteredZone.delete(key);\n\t\t\tconst other = this._zoneEntities.get(key);\n\t\t\tif (this.options.onExit) {\n\t\t\t\tthis.options.onExit({\n\t\t\t\t\tself: this,\n\t\t\t\t\tvisitor: other,\n\t\t\t\t\tglobals: state.globals\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis._exitedZone.set(key, 1 + delta);\n\t}\n\n\theld(delta: number, other: any) {\n\t\tconst heldTime = this._enteredZone.get(other.uuid) ?? 0;\n\t\tthis._enteredZone.set(other.uuid, heldTime + delta);\n\t\tthis._exitedZone.set(other.uuid, 1);\n\t\tif (this.options.onHeld) {\n\t\t\tthis.options.onHeld({\n\t\t\t\tdelta,\n\t\t\t\tself: this,\n\t\t\t\tvisitor: other,\n\t\t\t\tglobals: state.globals,\n\t\t\t\theldTime\n\t\t\t});\n\t\t}\n\t}\n}\n\ntype ZoneOptions = BaseNode | Partial<ZylemZoneOptions>;\n\nexport async function zone(...args: Array<ZoneOptions>): Promise<ZylemZone> {\n\treturn createEntity<ZylemZone, ZylemZoneOptions>({\n\t\targs,\n\t\tdefaultConfig: zoneDefaults,\n\t\tEntityClass: ZylemZone,\n\t\tBuilderClass: ZoneBuilder,\n\t\tCollisionBuilderClass: ZoneCollisionBuilder,\n\t\tentityType: ZylemZone.type\n\t});\n}","import { proxy, subscribe } from 'valtio/vanilla';\nimport { getByPath, setByPath } from '../core/utility/path-utils';\n\n/**\n * Internal game state store using valtio proxy for reactivity.\n */\nconst state = proxy({\n\tid: '',\n\tglobals: {} as Record<string, unknown>,\n\ttime: 0,\n});\n\n/**\n * Set a global value by path.\n * @example setGlobal('score', 100)\n * @example setGlobal('player.health', 50)\n */\nexport function setGlobal(path: string, value: unknown): void {\n\tsetByPath(state.globals, path, value);\n}\n\n/**\n * Create/initialize a global with a default value.\n * Only sets the value if it doesn't already exist.\n * Use this to ensure globals have initial values before game starts.\n * @example createGlobal('score', 0)\n * @example createGlobal('player.health', 100)\n */\nexport function createGlobal<T>(path: string, defaultValue: T): T {\n\tconst existing = getByPath<T>(state.globals, path);\n\tif (existing === undefined) {\n\t\tsetByPath(state.globals, path, defaultValue);\n\t\treturn defaultValue;\n\t}\n\treturn existing;\n}\n\n/**\n * Get a global value by path.\n * @example getGlobal('score') // 100\n * @example getGlobal<number>('player.health') // 50\n */\nexport function getGlobal<T = unknown>(path: string): T | undefined {\n\treturn getByPath<T>(state.globals, path);\n}\n\n/**\n * Subscribe to changes on a global value at a specific path.\n * Returns an unsubscribe function.\n * @example const unsub = onGlobalChange('score', (val) => console.log(val));\n */\nexport function onGlobalChange<T = unknown>(\n\tpath: string,\n\tcallback: (value: T) => void\n): () => void {\n\tlet previous = getByPath<T>(state.globals, path);\n\treturn subscribe(state.globals, () => {\n\t\tconst current = getByPath<T>(state.globals, path);\n\t\tif (current !== previous) {\n\t\t\tprevious = current;\n\t\t\tcallback(current as T);\n\t\t}\n\t});\n}\n\n/**\n * Subscribe to changes on multiple global paths.\n * Callback fires when any of the paths change, receiving all current values.\n * Returns an unsubscribe function.\n * @example const unsub = onGlobalChanges(['score', 'lives'], ([score, lives]) => console.log(score, lives));\n */\nexport function onGlobalChanges<T extends unknown[] = unknown[]>(\n\tpaths: string[],\n\tcallback: (values: T) => void\n): () => void {\n\tlet previousValues = paths.map(p => getByPath(state.globals, p));\n\treturn subscribe(state.globals, () => {\n\t\tconst currentValues = paths.map(p => getByPath(state.globals, p));\n\t\tconst hasChange = currentValues.some((val, i) => val !== previousValues[i]);\n\t\tif (hasChange) {\n\t\t\tpreviousValues = currentValues;\n\t\t\tcallback(currentValues as T);\n\t\t}\n\t});\n}\n\n/**\n * Get the entire globals object (read-only snapshot).\n */\nexport function getGlobals<T = Record<string, unknown>>(): T {\n\treturn state.globals as T;\n}\n\n/**\n * Initialize globals from an object. Used internally during game setup.\n */\nexport function initGlobals(globals: Record<string, unknown>): void {\n\tfor (const [key, value] of Object.entries(globals)) {\n\t\tsetByPath(state.globals, key, value);\n\t}\n}\n\n/**\n * Reset all globals. Used internally on game dispose.\n */\nexport function resetGlobals(): void {\n\tstate.globals = {};\n}\n\nexport { state };","import { ActiveCollisionTypes, ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { BufferGeometry, Object3D, SkinnedMesh, Group, Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { createEntity } from './create';\nimport { UpdateContext, UpdateFunction } from '../core/base-node-life-cycle';\nimport { EntityAssetLoader } from '../core/entity-asset-loader';\nimport { EntityLoaderDelegate } from './delegates/loader';\nimport { Vec3 } from '../core/vector';\nimport { AnimationDelegate, AnimationOptions } from './delegates/animation';\nimport { MaterialOptions } from '../graphics/material';\nimport { DebugInfoProvider } from './delegates/debug';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\n\ntype AnimationObject = {\n\tkey?: string;\n\tpath: string;\n};\n\ntype ZylemActorOptions = GameEntityOptions & {\n\tstatic?: boolean;\n\tanimations?: AnimationObject[];\n\tmodels?: string[];\n\tscale?: Vec3;\n\tmaterial?: MaterialOptions;\n};\n\nconst actorDefaults: ZylemActorOptions = {\n\tposition: { x: 0, y: 0, z: 0 },\n\tcollision: {\n\t\tstatic: false,\n\t\tsize: new Vector3(0.5, 0.5, 0.5),\n\t\tposition: new Vector3(0, 0, 0),\n\t},\n\tmaterial: {\n\t\tshader: 'standard',\n\t},\n\tanimations: [],\n\tmodels: []\n};\n\nclass ActorCollisionBuilder extends EntityCollisionBuilder {\n\tprivate height: number = 1;\n\tprivate objectModel: Group | null = null;\n\n\tconstructor(data: any) {\n\t\tsuper();\n\t\tthis.objectModel = data.objectModel;\n\t}\n\n\tcreateColliderFromObjectModel(objectModel: Group | null): ColliderDesc {\n\t\tif (!objectModel) return ColliderDesc.capsule(1, 1);\n\n\t\tconst skinnedMesh = objectModel.children.find(child => child instanceof SkinnedMesh) as SkinnedMesh;\n\t\tconst geometry = skinnedMesh.geometry as BufferGeometry;\n\n\t\tif (geometry) {\n\t\t\tgeometry.computeBoundingBox();\n\t\t\tif (geometry.boundingBox) {\n\t\t\t\tconst maxY = geometry.boundingBox.max.y;\n\t\t\t\tconst minY = geometry.boundingBox.min.y;\n\t\t\t\tthis.height = maxY - minY;\n\t\t\t}\n\t\t}\n\t\tthis.height = 1;\n\t\tlet colliderDesc = ColliderDesc.capsule(this.height / 2, 1);\n\t\tcolliderDesc.setSensor(false);\n\t\tcolliderDesc.setTranslation(0, this.height + 0.5, 0);\n\t\tcolliderDesc.activeCollisionTypes = ActiveCollisionTypes.DEFAULT;\n\n\t\treturn colliderDesc;\n\t}\n\n\tcollider(options: ZylemActorOptions): ColliderDesc {\n\t\tlet colliderDesc = this.createColliderFromObjectModel(this.objectModel);\n\n\t\treturn colliderDesc;\n\t}\n}\n\nclass ActorBuilder extends EntityBuilder<ZylemActor, ZylemActorOptions> {\n\tprotected createEntity(options: Partial<ZylemActorOptions>): ZylemActor {\n\t\treturn new ZylemActor(options);\n\t}\n}\n\nconst ACTOR_TYPE = Symbol('Actor');\n\nexport class ZylemActor extends GameEntity<ZylemActorOptions> implements EntityLoaderDelegate, DebugInfoProvider {\n\tstatic type = ACTOR_TYPE;\n\n\tprivate _object: Object3D | null = null;\n\tprivate _animationDelegate: AnimationDelegate | null = null;\n\tprivate _modelFileNames: string[] = [];\n\tprivate _assetLoader: EntityAssetLoader = new EntityAssetLoader();\n\n\tcontrolledRotation: boolean = false;\n\n\tconstructor(options?: ZylemActorOptions) {\n\t\tsuper();\n\t\tthis.options = { ...actorDefaults, ...options };\n\t\tthis.lifeCycleDelegate = {\n\t\t\tupdate: [this.actorUpdate.bind(this) as UpdateFunction<ZylemActorOptions>],\n\t\t};\n\t\tthis.controlledRotation = true;\n\t}\n\n\tasync load(): Promise<void> {\n\t\tthis._modelFileNames = this.options.models || [];\n\t\tawait this.loadModels();\n\t\tif (this._object) {\n\t\t\tthis._animationDelegate = new AnimationDelegate(this._object);\n\t\t\tawait this._animationDelegate.loadAnimations(this.options.animations || []);\n\t\t}\n\t}\n\n\tasync data(): Promise<any> {\n\t\treturn {\n\t\t\tanimations: this._animationDelegate?.animations,\n\t\t\tobjectModel: this._object,\n\t\t};\n\t}\n\n\tasync actorUpdate(params: UpdateContext<ZylemActorOptions>): Promise<void> {\n\t\tthis._animationDelegate?.update(params.delta);\n\t}\n\n\tprivate async loadModels(): Promise<void> {\n\t\tif (this._modelFileNames.length === 0) return;\n\t\tconst promises = this._modelFileNames.map(file => this._assetLoader.loadFile(file));\n\t\tconst results = await Promise.all(promises);\n\t\tif (results[0]?.object) {\n\t\t\tthis._object = results[0].object;\n\t\t}\n\t\tif (this._object) {\n\t\t\tthis.group = new Group();\n\t\t\tthis.group.attach(this._object);\n\t\t\tthis.group.scale.set(\n\t\t\t\tthis.options.scale?.x || 1,\n\t\t\t\tthis.options.scale?.y || 1,\n\t\t\t\tthis.options.scale?.z || 1\n\t\t\t);\n\t\t}\n\t}\n\n\tplayAnimation(animationOptions: AnimationOptions) {\n\t\tthis._animationDelegate?.playAnimation(animationOptions);\n\t}\n\n\tget object(): Object3D | null {\n\t\treturn this._object;\n\t}\n\n\t/**\n\t * Provide custom debug information for the actor\n\t * This will be merged with the default debug information\n\t */\n\tgetDebugInfo(): Record<string, any> {\n\t\tconst debugInfo: Record<string, any> = {\n\t\t\ttype: 'Actor',\n\t\t\tmodels: this._modelFileNames.length > 0 ? this._modelFileNames : 'none',\n\t\t\tmodelLoaded: !!this._object,\n\t\t\tscale: this.options.scale ?\n\t\t\t\t`${this.options.scale.x}, ${this.options.scale.y}, ${this.options.scale.z}` :\n\t\t\t\t'1, 1, 1',\n\t\t};\n\n\t\t// Add animation info if available\n\t\tif (this._animationDelegate) {\n\t\t\tdebugInfo.currentAnimation = this._animationDelegate.currentAnimationKey || 'none';\n\t\t\tdebugInfo.animationsCount = this.options.animations?.length || 0;\n\t\t}\n\n\t\t// Add mesh info if model is loaded\n\t\tif (this._object) {\n\t\t\tlet meshCount = 0;\n\t\t\tlet vertexCount = 0;\n\t\t\tthis._object.traverse((child) => {\n\t\t\t\tif ((child as any).isMesh) {\n\t\t\t\t\tmeshCount++;\n\t\t\t\t\tconst geometry = (child as SkinnedMesh).geometry;\n\t\t\t\t\tif (geometry && geometry.attributes.position) {\n\t\t\t\t\t\tvertexCount += geometry.attributes.position.count;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tdebugInfo.meshCount = meshCount;\n\t\t\tdebugInfo.vertexCount = vertexCount;\n\t\t}\n\n\t\treturn debugInfo;\n\t}\n}\n\ntype ActorOptions = BaseNode | ZylemActorOptions;\n\nexport async function actor(...args: Array<ActorOptions>): Promise<ZylemActor> {\n\treturn await createEntity<ZylemActor, ZylemActorOptions>({\n\t\targs,\n\t\tdefaultConfig: actorDefaults,\n\t\tEntityClass: ZylemActor,\n\t\tBuilderClass: ActorBuilder,\n\t\tCollisionBuilderClass: ActorCollisionBuilder,\n\t\tentityType: ZylemActor.type\n\t});\n}","import { AnimationClip, Object3D } from 'three';\nimport { FBXLoader } from 'three/addons/loaders/FBXLoader.js';\nimport { GLTF, GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\n\nenum FileExtensionTypes {\n\tFBX = 'fbx',\n\tGLTF = 'gltf'\n}\n\nexport interface AssetLoaderResult {\n\tobject?: Object3D;\n\tanimation?: AnimationClip;\n\tgltf?: GLTF;\n}\n\nexport interface IAssetLoader {\n\tload(file: string): Promise<AssetLoaderResult>;\n\tisSupported(file: string): boolean;\n}\n\nclass FBXAssetLoader implements IAssetLoader {\n\tprivate loader: FBXLoader = new FBXLoader();\n\n\tisSupported(file: string): boolean {\n\t\treturn file.toLowerCase().endsWith(FileExtensionTypes.FBX);\n\t}\n\n\tasync load(file: string): Promise<AssetLoaderResult> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.loader.load(\n\t\t\t\tfile,\n\t\t\t\t(object: Object3D) => {\n\t\t\t\t\tconst animation = object.animations[0];\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tanimation\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\t}\n}\n\nclass GLTFAssetLoader implements IAssetLoader {\n\tprivate loader: GLTFLoader = new GLTFLoader();\n\n\tisSupported(file: string): boolean {\n\t\treturn file.toLowerCase().endsWith(FileExtensionTypes.GLTF);\n\t}\n\n\tasync load(file: string): Promise<AssetLoaderResult> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.loader.load(\n\t\t\t\tfile,\n\t\t\t\t(gltf: GLTF) => {\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tobject: gltf.scene,\n\t\t\t\t\t\tgltf\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\t}\n}\n\nexport class EntityAssetLoader {\n\tprivate loaders: IAssetLoader[] = [\n\t\tnew FBXAssetLoader(),\n\t\tnew GLTFAssetLoader()\n\t];\n\n\tasync loadFile(file: string): Promise<AssetLoaderResult> {\n\t\tconst loader = this.loaders.find(l => l.isSupported(file));\n\n\t\tif (!loader) {\n\t\t\tthrow new Error(`Unsupported file type: ${file}`);\n\t\t}\n\n\t\treturn loader.load(file);\n\t}\n}\n","import {\n\tAnimationAction,\n\tAnimationClip,\n\tAnimationMixer,\n\tLoopOnce,\n\tLoopRepeat,\n\tObject3D,\n} from 'three';\nimport { EntityAssetLoader, AssetLoaderResult } from '../../core/entity-asset-loader';\n\nexport type AnimationOptions = {\n\tkey: string;\n\tpauseAtEnd?: boolean;\n\tpauseAtPercentage?: number;\n\tfadeToKey?: string;\n\tfadeDuration?: number;\n};\n\ntype AnimationObject = {\n\tkey?: string;\n\tpath: string;\n};\n\nexport class AnimationDelegate {\n\tprivate _mixer: AnimationMixer | null = null;\n\tprivate _actions: Record<string, AnimationAction> = {};\n\tprivate _animations: AnimationClip[] = [];\n\tprivate _currentAction: AnimationAction | null = null;\n\n\tprivate _pauseAtPercentage = 0;\n\tprivate _isPaused = false;\n\tprivate _queuedKey: string | null = null;\n\tprivate _fadeDuration = 0.5;\n\n\tprivate _currentKey: string = '';\n\tprivate _assetLoader = new EntityAssetLoader();\n\n\tconstructor(private target: Object3D) { }\n\n\tasync loadAnimations(animations: AnimationObject[]): Promise<void> {\n\t\tif (!animations.length) return;\n\n\t\tconst results = await Promise.all(animations.map(a => this._assetLoader.loadFile(a.path)));\n\t\tthis._animations = results\n\t\t\t.filter((r): r is AssetLoaderResult => !!r.animation)\n\t\t\t.map(r => r.animation!);\n\n\t\tif (!this._animations.length) return;\n\n\t\tthis._mixer = new AnimationMixer(this.target);\n\t\tthis._animations.forEach((clip, i) => {\n\t\t\tconst key = animations[i].key || i.toString();\n\t\t\tthis._actions[key] = this._mixer!.clipAction(clip);\n\t\t});\n\n\t\tthis.playAnimation({ key: Object.keys(this._actions)[0] });\n\t}\n\n\tupdate(delta: number): void {\n\t\tif (!this._mixer || !this._currentAction) return;\n\n\t\tthis._mixer.update(delta);\n\n\t\tconst pauseAtTime = this._currentAction.getClip().duration * (this._pauseAtPercentage / 100);\n\t\tif (\n\t\t\t!this._isPaused &&\n\t\t\tthis._pauseAtPercentage > 0 &&\n\t\t\tthis._currentAction.time >= pauseAtTime\n\t\t) {\n\t\t\tthis._currentAction.time = pauseAtTime;\n\t\t\tthis._currentAction.paused = true;\n\t\t\tthis._isPaused = true;\n\n\t\t\tif (this._queuedKey !== null) {\n\t\t\t\tconst next = this._actions[this._queuedKey];\n\t\t\t\tnext.reset().play();\n\t\t\t\tthis._currentAction.crossFadeTo(next, this._fadeDuration, false);\n\t\t\t\tthis._currentAction = next;\n\t\t\t\tthis._currentKey = this._queuedKey;\n\t\t\t\tthis._queuedKey = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tplayAnimation(opts: AnimationOptions): void {\n\t\tif (!this._mixer) return;\n\t\tconst { key, pauseAtPercentage = 0, pauseAtEnd = false, fadeToKey, fadeDuration = 0.5 } = opts;\n\t\tif (key === this._currentKey) return;\n\n\t\tthis._queuedKey = fadeToKey || null;\n\t\tthis._fadeDuration = fadeDuration;\n\n\t\tthis._pauseAtPercentage = pauseAtEnd ? 100 : pauseAtPercentage;\n\t\tthis._isPaused = false;\n\n\t\tconst prev = this._currentAction;\n\t\tif (prev) prev.stop();\n\n\t\tconst action = this._actions[key];\n\t\tif (!action) return;\n\n\t\tif (this._pauseAtPercentage > 0) {\n\t\t\taction.setLoop(LoopOnce, Infinity);\n\t\t\taction.clampWhenFinished = true;\n\t\t} else {\n\t\t\taction.setLoop(LoopRepeat, Infinity);\n\t\t\taction.clampWhenFinished = false;\n\t\t}\n\n\t\tif (prev) {\n\t\t\tprev.crossFadeTo(action, fadeDuration, false);\n\t\t}\n\t\taction.reset().play();\n\n\t\tthis._currentAction = action;\n\t\tthis._currentKey = key;\n\t}\n\n\tget currentAnimationKey() { return this._currentKey; }\n\tget animations() { return this._animations; }\n}\n","import { Color, Group, Sprite as ThreeSprite, SpriteMaterial, CanvasTexture, LinearFilter, Vector2, PerspectiveCamera, OrthographicCamera, ClampToEdgeWrapping } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { createEntity } from './create';\nimport { UpdateContext, SetupContext } from '../core/base-node-life-cycle';\nimport { ZylemCamera } from '../camera/zylem-camera';\nimport { DebugDelegate } from './delegates/debug';\n\ntype ZylemTextOptions = GameEntityOptions & {\n\ttext?: string;\n\tfontFamily?: string;\n\tfontSize?: number;\n\tfontColor?: Color | string;\n\tbackgroundColor?: Color | string | null;\n\tpadding?: number;\n\tstickToViewport?: boolean;\n\tscreenPosition?: Vector2;\n\tzDistance?: number;\n};\n\nconst textDefaults: ZylemTextOptions = {\n\tposition: undefined,\n\ttext: '',\n\tfontFamily: 'Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n\tfontSize: 18,\n\tfontColor: '#FFFFFF',\n\tbackgroundColor: null,\n\tpadding: 4,\n\tstickToViewport: true,\n\tscreenPosition: new Vector2(24, 24),\n\tzDistance: 1,\n};\n\nexport class TextBuilder extends EntityBuilder<ZylemText, ZylemTextOptions> {\n\tprotected createEntity(options: Partial<ZylemTextOptions>): ZylemText {\n\t\treturn new ZylemText(options);\n\t}\n}\n\nexport const TEXT_TYPE = Symbol('Text');\n\nexport class ZylemText extends GameEntity<ZylemTextOptions> {\n\tstatic type = TEXT_TYPE;\n\n\tprivate _sprite: ThreeSprite | null = null;\n\tprivate _texture: CanvasTexture | null = null;\n\tprivate _canvas: HTMLCanvasElement | null = null;\n\tprivate _ctx: CanvasRenderingContext2D | null = null;\n\tprivate _cameraRef: ZylemCamera | null = null;\n\tprivate _lastCanvasW: number = 0;\n\tprivate _lastCanvasH: number = 0;\n\n\tconstructor(options?: ZylemTextOptions) {\n\t\tsuper();\n\t\tthis.options = { ...textDefaults, ...options } as ZylemTextOptions;\n\t\tthis.group = new Group();\n\t\tthis.createSprite();\n\t\tthis.lifeCycleDelegate = {\n\t\t\tsetup: [this.textSetup.bind(this) as any],\n\t\t\tupdate: [this.textUpdate.bind(this) as any],\n\t\t};\n\t}\n\n\tprivate createSprite() {\n\t\tthis._canvas = document.createElement('canvas');\n\t\tthis._ctx = this._canvas.getContext('2d');\n\t\tthis._texture = new CanvasTexture(this._canvas);\n\t\tthis._texture.minFilter = LinearFilter;\n\t\tthis._texture.magFilter = LinearFilter;\n\t\tconst material = new SpriteMaterial({\n\t\t\tmap: this._texture,\n\t\t\ttransparent: true,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\talphaTest: 0.5,\n\t\t});\n\t\tthis._sprite = new ThreeSprite(material);\n\t\tthis.group?.add(this._sprite);\n\t\tthis.redrawText(this.options.text ?? '');\n\t}\n\n\tprivate measureAndResizeCanvas(text: string, fontSize: number, fontFamily: string, padding: number) {\n\t\tif (!this._canvas || !this._ctx) return { sizeChanged: false };\n\t\tthis._ctx.font = `${fontSize}px ${fontFamily}`;\n\t\tconst metrics = this._ctx.measureText(text);\n\t\tconst textWidth = Math.ceil(metrics.width);\n\t\tconst textHeight = Math.ceil(fontSize * 1.4);\n\t\tconst nextW = Math.max(2, textWidth + padding * 2);\n\t\tconst nextH = Math.max(2, textHeight + padding * 2);\n\t\tconst sizeChanged = nextW !== this._lastCanvasW || nextH !== this._lastCanvasH;\n\t\tthis._canvas.width = nextW;\n\t\tthis._canvas.height = nextH;\n\t\tthis._lastCanvasW = nextW;\n\t\tthis._lastCanvasH = nextH;\n\t\treturn { sizeChanged };\n\t}\n\n\tprivate drawCenteredText(text: string, fontSize: number, fontFamily: string) {\n\t\tif (!this._canvas || !this._ctx) return;\n\t\tthis._ctx.font = `${fontSize}px ${fontFamily}`;\n\t\tthis._ctx.textAlign = 'center';\n\t\tthis._ctx.textBaseline = 'middle';\n\t\tthis._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n\t\tif (this.options.backgroundColor) {\n\t\t\tthis._ctx.fillStyle = this.toCssColor(this.options.backgroundColor);\n\t\t\tthis._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n\t\t}\n\t\tthis._ctx.fillStyle = this.toCssColor(this.options.fontColor ?? '#FFFFFF');\n\t\tthis._ctx.fillText(text, this._canvas.width / 2, this._canvas.height / 2);\n\t}\n\n\tprivate updateTexture(sizeChanged: boolean) {\n\t\tif (!this._texture || !this._canvas) return;\n\t\tif (sizeChanged) {\n\t\t\tthis._texture.dispose();\n\t\t\tthis._texture = new CanvasTexture(this._canvas);\n\t\t\tthis._texture.minFilter = LinearFilter;\n\t\t\tthis._texture.magFilter = LinearFilter;\n\t\t\tthis._texture.wrapS = ClampToEdgeWrapping;\n\t\t\tthis._texture.wrapT = ClampToEdgeWrapping;\n\t\t}\n\t\tthis._texture.image = this._canvas;\n\t\tthis._texture.needsUpdate = true;\n\t\tif (this._sprite && this._sprite.material) {\n\t\t\t(this._sprite.material as any).map = this._texture;\n\t\t\tthis._sprite.material.needsUpdate = true;\n\t\t}\n\t}\n\n\tprivate redrawText(_text: string) {\n\t\tif (!this._canvas || !this._ctx) return;\n\t\tconst fontSize = this.options.fontSize ?? 18;\n\t\tconst fontFamily = this.options.fontFamily ?? (textDefaults.fontFamily as string);\n\t\tconst padding = this.options.padding ?? 4;\n\n\t\tconst { sizeChanged } = this.measureAndResizeCanvas(_text, fontSize, fontFamily, padding);\n\t\tthis.drawCenteredText(_text, fontSize, fontFamily);\n\t\tthis.updateTexture(Boolean(sizeChanged));\n\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate toCssColor(color: Color | string): string {\n\t\tif (typeof color === 'string') return color;\n\t\tconst c = color instanceof Color ? color : new Color(color as any);\n\t\treturn `#${c.getHexString()}`;\n\t}\n\n\tprivate textSetup(params: SetupContext<ZylemTextOptions>) {\n\t\tthis._cameraRef = (params.camera as unknown) as ZylemCamera | null;\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\t(this._cameraRef.camera as any).add(this.group);\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate textUpdate(params: UpdateContext<ZylemTextOptions>) {\n\t\tif (!this._sprite) return;\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate getResolution() {\n\t\treturn {\n\t\t\twidth: this._cameraRef?.screenResolution.x ?? 1,\n\t\t\theight: this._cameraRef?.screenResolution.y ?? 1,\n\t\t};\n\t}\n\n\tprivate getScreenPixels(sp: Vector2, width: number, height: number) {\n\t\tconst isPercentX = sp.x >= 0 && sp.x <= 1;\n\t\tconst isPercentY = sp.y >= 0 && sp.y <= 1;\n\t\treturn {\n\t\t\tpx: isPercentX ? sp.x * width : sp.x,\n\t\t\tpy: isPercentY ? sp.y * height : sp.y,\n\t\t};\n\t}\n\n\tprivate computeWorldExtents(camera: PerspectiveCamera | OrthographicCamera, zDist: number) {\n\t\tlet worldHalfW = 1;\n\t\tlet worldHalfH = 1;\n\t\tif ((camera as PerspectiveCamera).isPerspectiveCamera) {\n\t\t\tconst pc = camera as PerspectiveCamera;\n\t\t\tconst halfH = Math.tan((pc.fov * Math.PI) / 180 / 2) * zDist;\n\t\t\tconst halfW = halfH * pc.aspect;\n\t\t\tworldHalfW = halfW;\n\t\t\tworldHalfH = halfH;\n\t\t} else if ((camera as OrthographicCamera).isOrthographicCamera) {\n\t\t\tconst oc = camera as OrthographicCamera;\n\t\t\tworldHalfW = (oc.right - oc.left) / 2;\n\t\t\tworldHalfH = (oc.top - oc.bottom) / 2;\n\t\t}\n\t\treturn { worldHalfW, worldHalfH };\n\t}\n\n\tprivate updateSpriteScale(worldHalfH: number, viewportHeight: number) {\n\t\tif (!this._canvas || !this._sprite) return;\n\t\tconst planeH = worldHalfH * 2;\n\t\tconst unitsPerPixel = planeH / viewportHeight;\n\t\tconst pixelH = this._canvas.height;\n\t\tconst scaleY = Math.max(0.0001, pixelH * unitsPerPixel);\n\t\tconst aspect = this._canvas.width / this._canvas.height;\n\t\tconst scaleX = scaleY * aspect;\n\t\tthis._sprite.scale.set(scaleX, scaleY, 1);\n\t}\n\n\tprivate updateStickyTransform() {\n\t\tif (!this._sprite || !this._cameraRef) return;\n\t\tconst camera = this._cameraRef.camera as PerspectiveCamera | OrthographicCamera;\n\t\tconst { width, height } = this.getResolution();\n\t\tconst sp = this.options.screenPosition ?? new Vector2(24, 24);\n\t\tconst { px, py } = this.getScreenPixels(sp, width, height);\n\t\tconst zDist = Math.max(0.001, this.options.zDistance ?? 1);\n\t\tconst { worldHalfW, worldHalfH } = this.computeWorldExtents(camera, zDist);\n\n\t\tconst ndcX = (px / width) * 2 - 1;\n\t\tconst ndcY = 1 - (py / height) * 2;\n\t\tconst localX = ndcX * worldHalfW;\n\t\tconst localY = ndcY * worldHalfH;\n\t\tthis.group?.position.set(localX, localY, -zDist);\n\t\tthis.updateSpriteScale(worldHalfH, height);\n\t}\n\n\tupdateText(_text: string) {\n\t\tthis.options.text = _text;\n\t\tthis.redrawText(_text);\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemText.type),\n\t\t\ttext: this.options.text ?? '',\n\t\t\tsticky: this.options.stickToViewport,\n\t\t};\n\t}\n}\n\ntype TextOptions = BaseNode | Partial<ZylemTextOptions>;\n\nexport async function text(...args: Array<TextOptions>): Promise<ZylemText> {\n\treturn createEntity<ZylemText, ZylemTextOptions>({\n\t\targs,\n\t\tdefaultConfig: { ...textDefaults },\n\t\tEntityClass: ZylemText,\n\t\tBuilderClass: TextBuilder,\n\t\tentityType: ZylemText.type,\n\t});\n}\n\n\n","import { Color, Group, Sprite as ThreeSprite, SpriteMaterial, CanvasTexture, LinearFilter, Vector2, PerspectiveCamera, OrthographicCamera, ClampToEdgeWrapping, ShaderMaterial, Mesh, PlaneGeometry, Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { createEntity } from './create';\nimport { UpdateContext, SetupContext } from '../core/base-node-life-cycle';\nimport { ZylemCamera } from '../camera/zylem-camera';\nimport { DebugDelegate } from './delegates/debug';\n\ntype ZylemRectOptions = GameEntityOptions & {\n\twidth?: number;\n\theight?: number;\n\tfillColor?: Color | string | null;\n\tstrokeColor?: Color | string | null;\n\tstrokeWidth?: number;\n\tradius?: number;\n\tpadding?: number;\n\tstickToViewport?: boolean;\n\tscreenPosition?: Vector2;\n\tzDistance?: number;\n\tanchor?: Vector2; // 0-100 per axis, default top-left (0,0)\n\tbounds?: {\n\t\tscreen?: { x: number; y: number; width: number; height: number };\n\t\tworld?: { left: number; right: number; top: number; bottom: number; z?: number };\n\t};\n};\n\nconst rectDefaults: ZylemRectOptions = {\n\tposition: undefined,\n\twidth: 120,\n\theight: 48,\n\tfillColor: '#FFFFFF',\n\tstrokeColor: null,\n\tstrokeWidth: 0,\n\tradius: 0,\n\tpadding: 0,\n\tstickToViewport: true,\n\tscreenPosition: new Vector2(24, 24),\n\tzDistance: 1,\n\tanchor: new Vector2(0, 0),\n};\n\nexport class RectBuilder extends EntityBuilder<ZylemRect, ZylemRectOptions> {\n\tprotected createEntity(options: Partial<ZylemRectOptions>): ZylemRect {\n\t\treturn new ZylemRect(options);\n\t}\n}\n\nexport const RECT_TYPE = Symbol('Rect');\n\nexport class ZylemRect extends GameEntity<ZylemRectOptions> {\n\tstatic type = RECT_TYPE;\n\n\tprivate _sprite: ThreeSprite | null = null;\n\tprivate _mesh: Mesh | null = null;\n\tprivate _texture: CanvasTexture | null = null;\n\tprivate _canvas: HTMLCanvasElement | null = null;\n\tprivate _ctx: CanvasRenderingContext2D | null = null;\n\tprivate _cameraRef: ZylemCamera | null = null;\n\tprivate _lastCanvasW: number = 0;\n\tprivate _lastCanvasH: number = 0;\n\n\tconstructor(options?: ZylemRectOptions) {\n\t\tsuper();\n\t\tthis.options = { ...rectDefaults, ...options } as ZylemRectOptions;\n\t\tthis.group = new Group();\n\t\tthis.createSprite();\n\t\tthis.lifeCycleDelegate = {\n\t\t\tsetup: [this.rectSetup.bind(this) as any],\n\t\t\tupdate: [this.rectUpdate.bind(this) as any],\n\t\t};\n\t}\n\n\tprivate createSprite() {\n\t\tthis._canvas = document.createElement('canvas');\n\t\tthis._ctx = this._canvas.getContext('2d');\n\t\tthis._texture = new CanvasTexture(this._canvas);\n\t\tthis._texture.minFilter = LinearFilter;\n\t\tthis._texture.magFilter = LinearFilter;\n\t\tconst material = new SpriteMaterial({\n\t\t\tmap: this._texture,\n\t\t\ttransparent: true,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\talphaTest: 0.5,\n\t\t});\n\t\tthis._sprite = new ThreeSprite(material);\n\t\tthis.group?.add(this._sprite);\n\t\tthis.redrawRect();\n\t}\n\n\tprivate redrawRect() {\n\t\tif (!this._canvas || !this._ctx) return;\n\t\tconst width = Math.max(2, Math.floor((this.options.width ?? 120)));\n\t\tconst height = Math.max(2, Math.floor((this.options.height ?? 48)));\n\t\tconst padding = this.options.padding ?? 0;\n\t\tconst strokeWidth = this.options.strokeWidth ?? 0;\n\t\tconst totalW = width + padding * 2 + strokeWidth;\n\t\tconst totalH = height + padding * 2 + strokeWidth;\n\t\tconst nextW = Math.max(2, totalW);\n\t\tconst nextH = Math.max(2, totalH);\n\t\tconst sizeChanged = nextW !== this._lastCanvasW || nextH !== this._lastCanvasH;\n\t\tthis._canvas.width = nextW;\n\t\tthis._canvas.height = nextH;\n\t\tthis._lastCanvasW = nextW;\n\t\tthis._lastCanvasH = nextH;\n\n\t\tthis._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n\n\t\tconst radius = Math.max(0, this.options.radius ?? 0);\n\t\tconst rectX = Math.floor(padding + strokeWidth / 2);\n\t\tconst rectY = Math.floor(padding + strokeWidth / 2);\n\t\tconst rectW = Math.floor(width);\n\t\tconst rectH = Math.floor(height);\n\n\t\tthis._ctx.beginPath();\n\t\tif (radius > 0) {\n\t\t\tthis.roundedRectPath(this._ctx, rectX, rectY, rectW, rectH, radius);\n\t\t} else {\n\t\t\tthis._ctx.rect(rectX, rectY, rectW, rectH);\n\t\t}\n\n\t\tif (this.options.fillColor) {\n\t\t\tthis._ctx.fillStyle = this.toCssColor(this.options.fillColor);\n\t\t\tthis._ctx.fill();\n\t\t}\n\n\t\tif ((this.options.strokeColor && (strokeWidth > 0))) {\n\t\t\tthis._ctx.lineWidth = strokeWidth;\n\t\t\tthis._ctx.strokeStyle = this.toCssColor(this.options.strokeColor);\n\t\t\tthis._ctx.stroke();\n\t\t}\n\n\t\tif (this._texture) {\n\t\t\tif (sizeChanged) {\n\t\t\t\tthis._texture.dispose();\n\t\t\t\tthis._texture = new CanvasTexture(this._canvas);\n\t\t\t\tthis._texture.minFilter = LinearFilter;\n\t\t\t\tthis._texture.magFilter = LinearFilter;\n\t\t\t\tthis._texture.wrapS = ClampToEdgeWrapping;\n\t\t\t\tthis._texture.wrapT = ClampToEdgeWrapping;\n\t\t\t\tif (this._sprite && this._sprite.material instanceof ShaderMaterial) {\n\t\t\t\t\tconst shader = this._sprite.material as ShaderMaterial;\n\t\t\t\t\tif (shader.uniforms?.tDiffuse) shader.uniforms.tDiffuse.value = this._texture;\n\t\t\t\t\tif (shader.uniforms?.iResolution) shader.uniforms.iResolution.value.set(this._canvas.width, this._canvas.height, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._texture.image = this._canvas;\n\t\t\tthis._texture.needsUpdate = true;\n\t\t\tif (this._sprite && this._sprite.material) {\n\t\t\t\t(this._sprite.material as any).map = this._texture;\n\t\t\t\tthis._sprite.material.needsUpdate = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate roundedRectPath(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number) {\n\t\tconst radius = Math.min(r, Math.floor(Math.min(w, h) / 2));\n\t\tctx.moveTo(x + radius, y);\n\t\tctx.lineTo(x + w - radius, y);\n\t\tctx.quadraticCurveTo(x + w, y, x + w, y + radius);\n\t\tctx.lineTo(x + w, y + h - radius);\n\t\tctx.quadraticCurveTo(x + w, y + h, x + w - radius, y + h);\n\t\tctx.lineTo(x + radius, y + h);\n\t\tctx.quadraticCurveTo(x, y + h, x, y + h - radius);\n\t\tctx.lineTo(x, y + radius);\n\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t}\n\n\tprivate toCssColor(color: Color | string): string {\n\t\tif (typeof color === 'string') return color;\n\t\tconst c = color instanceof Color ? color : new Color(color as any);\n\t\treturn `#${c.getHexString()}`;\n\t}\n\n\tprivate rectSetup(params: SetupContext<ZylemRectOptions>) {\n\t\tthis._cameraRef = (params.camera as unknown) as ZylemCamera | null;\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\t(this._cameraRef.camera as any).add(this.group);\n\t\t}\n\n\t\tif (this.materials?.length && this._sprite) {\n\t\t\tconst mat = this.materials[0];\n\t\t\tif (mat instanceof ShaderMaterial) {\n\t\t\t\tmat.transparent = true;\n\t\t\t\tmat.depthTest = false;\n\t\t\t\tmat.depthWrite = false;\n\t\t\t\tif (this._texture) {\n\t\t\t\t\tif (mat.uniforms?.tDiffuse) mat.uniforms.tDiffuse.value = this._texture;\n\t\t\t\t\tif (mat.uniforms?.iResolution && this._canvas) mat.uniforms.iResolution.value.set(this._canvas.width, this._canvas.height, 1);\n\t\t\t\t}\n\t\t\t\tthis._mesh = new Mesh(new PlaneGeometry(1, 1), mat);\n\t\t\t\tthis.group?.add(this._mesh);\n\t\t\t\tthis._sprite.visible = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rectUpdate(params: UpdateContext<ZylemRectOptions>) {\n\t\tif (!this._sprite) return;\n\n\t\t// If bounds provided, compute screen-space rect from it and update size/position\n\t\tif (this._cameraRef && this.options.bounds) {\n\t\t\tconst dom = this._cameraRef.renderer.domElement;\n\t\t\tconst screen = this.computeScreenBoundsFromOptions(this.options.bounds);\n\t\t\tif (screen) {\n\t\t\t\tconst { x, y, width, height } = screen;\n\t\t\t\tconst desiredW = Math.max(2, Math.floor(width));\n\t\t\t\tconst desiredH = Math.max(2, Math.floor(height));\n\t\t\t\tconst changed = desiredW !== (this.options.width ?? 0) || desiredH !== (this.options.height ?? 0);\n\t\t\t\tthis.options.screenPosition = new Vector2(Math.floor(x), Math.floor(y));\n\t\t\t\tthis.options.width = desiredW;\n\t\t\t\tthis.options.height = desiredH;\n\t\t\t\tthis.options.anchor = new Vector2(0, 0);\n\t\t\t\tif (changed) {\n\t\t\t\t\tthis.redrawRect();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate updateStickyTransform() {\n\t\tif (!this._sprite || !this._cameraRef) return;\n\t\tconst camera = this._cameraRef.camera;\n\t\tconst dom = this._cameraRef.renderer.domElement;\n\t\tconst width = dom.clientWidth;\n\t\tconst height = dom.clientHeight;\n\t\tconst px = (this.options.screenPosition ?? new Vector2(24, 24)).x;\n\t\tconst py = (this.options.screenPosition ?? new Vector2(24, 24)).y;\n\t\tconst zDist = Math.max(0.001, this.options.zDistance ?? 1);\n\n\t\tlet worldHalfW = 1;\n\t\tlet worldHalfH = 1;\n\t\tif ((camera as PerspectiveCamera).isPerspectiveCamera) {\n\t\t\tconst pc = camera as PerspectiveCamera;\n\t\t\tconst halfH = Math.tan((pc.fov * Math.PI) / 180 / 2) * zDist;\n\t\t\tconst halfW = halfH * pc.aspect;\n\t\t\tworldHalfW = halfW;\n\t\t\tworldHalfH = halfH;\n\t\t} else if ((camera as OrthographicCamera).isOrthographicCamera) {\n\t\t\tconst oc = camera as OrthographicCamera;\n\t\t\tworldHalfW = (oc.right - oc.left) / 2;\n\t\t\tworldHalfH = (oc.top - oc.bottom) / 2;\n\t\t}\n\n\t\tconst ndcX = (px / width) * 2 - 1;\n\t\tconst ndcY = 1 - (py / height) * 2;\n\t\tconst localX = ndcX * worldHalfW;\n\t\tconst localY = ndcY * worldHalfH;\n\n\t\tlet scaleX = 1;\n\t\tlet scaleY = 1;\n\t\tif (this._canvas) {\n\t\t\tconst planeH = worldHalfH * 2;\n\t\t\tconst unitsPerPixel = planeH / height;\n\t\t\tconst pixelH = this._canvas.height;\n\t\t\tscaleY = Math.max(0.0001, pixelH * unitsPerPixel);\n\t\t\tconst aspect = this._canvas.width / this._canvas.height;\n\t\t\tscaleX = scaleY * aspect;\n\t\t\tthis._sprite.scale.set(scaleX, scaleY, 1);\n\t\t\tif (this._mesh) this._mesh.scale.set(scaleX, scaleY, 1);\n\t\t}\n\n\t\tconst anchor = this.options.anchor ?? new Vector2(0, 0);\n\t\tconst ax = Math.min(100, Math.max(0, anchor.x)) / 100; // 0..1\n\t\tconst ay = Math.min(100, Math.max(0, anchor.y)) / 100; // 0..1\n\t\tconst offsetX = (0.5 - ax) * scaleX;\n\t\tconst offsetY = (ay - 0.5) * scaleY;\n\t\tthis.group?.position.set(localX + offsetX, localY + offsetY, -zDist);\n\t}\n\n\tprivate worldToScreen(point: Vector3) {\n\t\tif (!this._cameraRef) return { x: 0, y: 0 };\n\t\tconst camera = this._cameraRef.camera;\n\t\tconst dom = this._cameraRef.renderer.domElement;\n\t\tconst v = point.clone().project(camera);\n\t\tconst x = (v.x + 1) / 2 * dom.clientWidth;\n\t\tconst y = (1 - v.y) / 2 * dom.clientHeight;\n\t\treturn { x, y };\n\t}\n\n\tprivate computeScreenBoundsFromOptions(bounds: NonNullable<ZylemRectOptions['bounds']>): { x: number; y: number; width: number; height: number } | null {\n\t\tif (!this._cameraRef) return null;\n\t\tconst dom = this._cameraRef.renderer.domElement;\n\t\tif (bounds.screen) {\n\t\t\treturn { ...bounds.screen };\n\t\t}\n\t\tif (bounds.world) {\n\t\t\tconst { left, right, top, bottom, z = 0 } = bounds.world;\n\t\t\tconst tl = this.worldToScreen(new Vector3(left, top, z));\n\t\t\tconst br = this.worldToScreen(new Vector3(right, bottom, z));\n\t\t\tconst x = Math.min(tl.x, br.x);\n\t\t\tconst y = Math.min(tl.y, br.y);\n\t\t\tconst width = Math.abs(br.x - tl.x);\n\t\t\tconst height = Math.abs(br.y - tl.y);\n\t\t\treturn { x, y, width, height };\n\t\t}\n\t\treturn null;\n\t}\n\n\tupdateRect(options?: Partial<Pick<ZylemRectOptions, 'width' | 'height' | 'fillColor' | 'strokeColor' | 'strokeWidth' | 'radius'>>) {\n\t\tthis.options = { ...this.options, ...options } as ZylemRectOptions;\n\t\tthis.redrawRect();\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemRect.type),\n\t\t\twidth: this.options.width ?? 0,\n\t\t\theight: this.options.height ?? 0,\n\t\t\tsticky: this.options.stickToViewport,\n\t\t};\n\t}\n}\n\ntype RectOptions = BaseNode | Partial<ZylemRectOptions>;\n\nexport async function rect(...args: Array<RectOptions>): Promise<ZylemRect> {\n\treturn createEntity<ZylemRect, ZylemRectOptions>({\n\t\targs,\n\t\tdefaultConfig: { ...rectDefaults },\n\t\tEntityClass: ZylemRect,\n\t\tBuilderClass: RectBuilder,\n\t\tentityType: ZylemRect.type,\n\t});\n}\n\n\n"],"mappings":"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","names":["ColliderDesc","Color","Vector3","BufferGeometry","Mesh","Color","Mesh","Color","ShaderMaterial","Vector3","debug_default","debug_default","Color","ShaderMaterial","Vector3","BufferGeometry","Mesh","Color","MeshStandardMaterial","MeshPhongMaterial","x","y","z","toDeg","Vector3","Color","ColliderDesc","ColliderDesc","Color","Vector3","Vector3","Color","ColliderDesc","ColliderDesc","Color","Group","Quaternion","Vector3","TextureLoader","Vector3","Color","ColliderDesc","TextureLoader","Group","Quaternion","ColliderDesc","Color","Vector2","Vector3","BufferGeometry","Vector2","Vector3","Color","scale","ColliderDesc","ActiveCollisionTypes","ColliderDesc","Vector3","Vector3","ColliderDesc","ActiveCollisionTypes","ActiveCollisionTypes","ColliderDesc","Group","Vector3","Vector3","ColliderDesc","ActiveCollisionTypes","Group","Color","Group","ThreeSprite","SpriteMaterial","Vector2","Vector2","Group","SpriteMaterial","ThreeSprite","text","Color","Color","Group","ThreeSprite","SpriteMaterial","CanvasTexture","LinearFilter","Vector2","ClampToEdgeWrapping","ShaderMaterial","Mesh","PlaneGeometry","Vector3","Vector2","Group","CanvasTexture","LinearFilter","SpriteMaterial","ThreeSprite","ClampToEdgeWrapping","ShaderMaterial","Color","Mesh","PlaneGeometry","Vector3"]}
1
+ {"version":3,"sources":["../src/lib/entities/box.ts","../src/lib/entities/entity.ts","../src/lib/systems/transformable.system.ts","../src/lib/core/flags.ts","../src/lib/core/base-node.ts","../src/lib/entities/builder.ts","../src/lib/collision/collision-builder.ts","../src/lib/graphics/mesh.ts","../src/lib/graphics/material.ts","../src/lib/core/utility/strings.ts","../src/lib/graphics/shaders/fragment/stars.glsl","../src/lib/graphics/shaders/fragment/fire.glsl","../src/lib/graphics/shaders/fragment/standard.glsl","../src/lib/graphics/shaders/fragment/debug.glsl","../src/lib/graphics/shaders/vertex/object-shader.glsl","../src/lib/graphics/shaders/vertex/debug.glsl","../src/lib/core/preset-shader.ts","../src/lib/entities/delegates/debug.ts","../src/lib/entities/delegates/loader.ts","../src/lib/entities/create.ts","../src/lib/entities/sphere.ts","../src/lib/entities/sprite.ts","../src/lib/entities/plane.ts","../src/lib/graphics/geometries/XZPlaneGeometry.ts","../src/lib/entities/zone.ts","../src/lib/game/game-state.ts","../src/lib/entities/actor.ts","../src/lib/core/entity-asset-loader.ts","../src/lib/entities/delegates/animation.ts","../src/lib/entities/text.ts","../src/lib/entities/rect.ts"],"sourcesContent":["import { ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { BoxGeometry, Color } from 'three';\nimport { Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { EntityMeshBuilder } from './builder';\nimport { DebugDelegate } from './delegates/debug';\nimport { createEntity } from './create';\n\ntype ZylemBoxOptions = GameEntityOptions;\n\nconst boxDefaults: ZylemBoxOptions = {\n\tsize: new Vector3(1, 1, 1),\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: false,\n\t},\n\tmaterial: {\n\t\tcolor: new Color('#ffffff'),\n\t\tshader: 'standard'\n\t},\n};\n\nexport class BoxCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: GameEntityOptions): ColliderDesc {\n\t\tconst size = options.size || new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class BoxMeshBuilder extends EntityMeshBuilder {\n\tbuild(options: GameEntityOptions): BoxGeometry {\n\t\tconst size = options.size ?? new Vector3(1, 1, 1);\n\t\treturn new BoxGeometry(size.x, size.y, size.z);\n\t}\n}\n\nexport class BoxBuilder extends EntityBuilder<ZylemBox, ZylemBoxOptions> {\n\tprotected createEntity(options: Partial<ZylemBoxOptions>): ZylemBox {\n\t\treturn new ZylemBox(options);\n\t}\n}\n\nexport const BOX_TYPE = Symbol('Box');\n\nexport class ZylemBox extends GameEntity<ZylemBoxOptions> {\n\tstatic type = BOX_TYPE;\n\n\tconstructor(options?: ZylemBoxOptions) {\n\t\tsuper();\n\t\tthis.options = { ...boxDefaults, ...options };\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\n\t\tconst { x: sizeX, y: sizeY, z: sizeZ } = this.options.size ?? { x: 1, y: 1, z: 1 };\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemBox.type),\n\t\t\tsize: `${sizeX}, ${sizeY}, ${sizeZ}`,\n\t\t};\n\t}\n}\n\ntype BoxOptions = BaseNode | ZylemBoxOptions;\n\nexport async function box(...args: Array<BoxOptions>): Promise<ZylemBox> {\n\treturn createEntity<ZylemBox, ZylemBoxOptions>({\n\t\targs,\n\t\tdefaultConfig: boxDefaults,\n\t\tEntityClass: ZylemBox,\n\t\tBuilderClass: BoxBuilder,\n\t\tMeshBuilderClass: BoxMeshBuilder,\n\t\tCollisionBuilderClass: BoxCollisionBuilder,\n\t\tentityType: ZylemBox.type\n\t});\n}","import { Mesh, Material, ShaderMaterial, Group, Color } from \"three\";\nimport { Collider, ColliderDesc, RigidBody, RigidBodyDesc } from \"@dimforge/rapier3d-compat\";\nimport { position, rotation, scale } from \"../systems/transformable.system\";\nimport { Vec3 } from \"../core/vector\";\nimport { MaterialBuilder, MaterialOptions } from \"../graphics/material\";\nimport { CollisionOptions } from \"../collision/collision-builder\";\nimport { BaseNode } from \"../core/base-node\";\nimport { DestroyContext, SetupContext, UpdateContext, LoadedContext, CleanupContext } from \"../core/base-node-life-cycle\";\nimport type { EntityMeshBuilder, EntityCollisionBuilder } from \"./builder\";\nimport { Behavior } from \"../actions/behaviors/behavior\";\n\nexport interface CollisionContext<T, O extends GameEntityOptions, TGlobals extends Record<string, unknown> = any> {\n\tentity: T;\n\tother: GameEntity<O>;\n\tglobals: TGlobals;\n}\n\nexport type BehaviorContext<T, O extends GameEntityOptions> =\n\tSetupContext<T, O> |\n\tUpdateContext<T, O> |\n\tCollisionContext<T, O> |\n\tDestroyContext<T, O>;\n\nexport type BehaviorCallback<T, O extends GameEntityOptions> = (params: BehaviorContext<T, O>) => void;\n\nexport interface CollisionDelegate<T, O extends GameEntityOptions> {\n\tcollision?: ((params: CollisionContext<T, O>) => void)[];\n}\n\nexport type IBuilder<BuilderOptions = any> = {\n\tpreBuild: (options: BuilderOptions) => BuilderOptions;\n\tbuild: (options: BuilderOptions) => BuilderOptions;\n\tpostBuild: (options: BuilderOptions) => BuilderOptions;\n}\n\nexport type GameEntityOptions = {\n\tname?: string;\n\tcolor?: Color;\n\tsize?: Vec3;\n\tposition?: Vec3;\n\tbatched?: boolean;\n\tcollision?: Partial<CollisionOptions>;\n\tmaterial?: Partial<MaterialOptions>;\n\tcustom?: { [key: string]: any };\n\tcollisionType?: string;\n\tcollisionGroup?: string;\n\tcollisionFilter?: string[];\n\t_builders?: {\n\t\tmeshBuilder?: IBuilder | EntityMeshBuilder | null;\n\t\tcollisionBuilder?: IBuilder | EntityCollisionBuilder | null;\n\t\tmaterialBuilder?: MaterialBuilder | null;\n\t};\n}\n\nexport abstract class GameEntityLifeCycle {\n\tabstract _setup(params: SetupContext<this>): void;\n\tabstract _update(params: UpdateContext<this>): void;\n\tabstract _destroy(params: DestroyContext<this>): void;\n}\n\nexport interface EntityDebugInfo {\n\tbuildInfo: () => Record<string, string>;\n}\n\nexport type BehaviorCallbackType = 'setup' | 'update' | 'destroy' | 'collision';\n\nexport class GameEntity<O extends GameEntityOptions> extends BaseNode<O> implements\n\tGameEntityLifeCycle,\n\tEntityDebugInfo {\n\tpublic behaviors: Behavior[] = [];\n\tpublic group: Group | undefined;\n\tpublic mesh: Mesh | undefined;\n\tpublic materials: Material[] | undefined;\n\tpublic bodyDesc: RigidBodyDesc | null = null;\n\tpublic body: RigidBody | null = null;\n\tpublic colliderDesc: ColliderDesc | undefined;\n\tpublic collider: Collider | undefined;\n\tpublic custom: Record<string, any> = {};\n\n\tpublic debugInfo: Record<string, any> = {};\n\tpublic debugMaterial: ShaderMaterial | undefined;\n\n\tpublic collisionDelegate: CollisionDelegate<this, O> = {\n\t\tcollision: [],\n\t};\n\tpublic collisionType?: string;\n\n\tpublic behaviorCallbackMap: Record<BehaviorCallbackType, BehaviorCallback<this, O>[]> = {\n\t\tsetup: [],\n\t\tupdate: [],\n\t\tdestroy: [],\n\t\tcollision: [],\n\t};\n\n\tconstructor() {\n\t\tsuper();\n\t}\n\n\tpublic create(): this {\n\t\tconst { position: setupPosition } = this.options;\n\t\tconst { x, y, z } = setupPosition || { x: 0, y: 0, z: 0 };\n\t\tthis.behaviors = [\n\t\t\t{ component: position, values: { x, y, z } },\n\t\t\t{ component: scale, values: { x: 0, y: 0, z: 0 } },\n\t\t\t{ component: rotation, values: { x: 0, y: 0, z: 0, w: 0 } },\n\t\t];\n\t\tthis.name = this.options.name || '';\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add collision callbacks\n\t */\n\tpublic onCollision(...callbacks: ((params: CollisionContext<this, O>) => void)[]): this {\n\t\tconst existing = this.collisionDelegate.collision ?? [];\n\t\tthis.collisionDelegate.collision = [...existing, ...callbacks];\n\t\treturn this;\n\t}\n\n\t/**\n\t * Entity-specific setup - runs behavior callbacks\n\t * (User callbacks are handled by BaseNode's lifecycleCallbacks.setup)\n\t */\n\tpublic _setup(params: SetupContext<this>): void {\n\t\tthis.behaviorCallbackMap.setup.forEach(callback => {\n\t\t\tcallback({ ...params, me: this });\n\t\t});\n\t}\n\n\tprotected async _loaded(_params: LoadedContext<this>): Promise<void> { }\n\n\t/**\n\t * Entity-specific update - updates materials and runs behavior callbacks\n\t * (User callbacks are handled by BaseNode's lifecycleCallbacks.update)\n\t */\n\tpublic _update(params: UpdateContext<this>): void {\n\t\tthis.updateMaterials(params);\n\t\tthis.behaviorCallbackMap.update.forEach(callback => {\n\t\t\tcallback({ ...params, me: this });\n\t\t});\n\t}\n\n\t/**\n\t * Entity-specific destroy - runs behavior callbacks\n\t * (User callbacks are handled by BaseNode's lifecycleCallbacks.destroy)\n\t */\n\tpublic _destroy(params: DestroyContext<this>): void {\n\t\tthis.behaviorCallbackMap.destroy.forEach(callback => {\n\t\t\tcallback({ ...params, me: this });\n\t\t});\n\t}\n\n\tprotected async _cleanup(_params: CleanupContext<this>): Promise<void> { }\n\n\tpublic _collision(other: GameEntity<O>, globals?: any): void {\n\t\tif (this.collisionDelegate.collision?.length) {\n\t\t\tconst callbacks = this.collisionDelegate.collision;\n\t\t\tcallbacks.forEach(callback => {\n\t\t\t\tcallback({ entity: this, other, globals });\n\t\t\t});\n\t\t}\n\t\tthis.behaviorCallbackMap.collision.forEach(callback => {\n\t\t\tcallback({ entity: this, other, globals });\n\t\t});\n\t}\n\n\tpublic addBehavior(\n\t\tbehaviorCallback: ({ type: BehaviorCallbackType, handler: any })\n\t): this {\n\t\tconst handler = behaviorCallback.handler as unknown as BehaviorCallback<this, O>;\n\t\tif (handler) {\n\t\t\tthis.behaviorCallbackMap[behaviorCallback.type].push(handler);\n\t\t}\n\t\treturn this;\n\t}\n\n\tpublic addBehaviors(\n\t\tbehaviorCallbacks: ({ type: BehaviorCallbackType, handler: any })[]\n\t): this {\n\t\tbehaviorCallbacks.forEach(callback => {\n\t\t\tconst handler = callback.handler as unknown as BehaviorCallback<this, O>;\n\t\t\tif (handler) {\n\t\t\t\tthis.behaviorCallbackMap[callback.type].push(handler);\n\t\t\t}\n\t\t});\n\t\treturn this;\n\t}\n\n\tprotected updateMaterials(params: any) {\n\t\tif (!this.materials?.length) {\n\t\t\treturn;\n\t\t}\n\t\tfor (const material of this.materials) {\n\t\t\tif (material instanceof ShaderMaterial) {\n\t\t\t\tif (material.uniforms) {\n\t\t\t\t\tmaterial.uniforms.iTime && (material.uniforms.iTime.value += params.delta);\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t}\n\n\tpublic buildInfo(): Record<string, string> {\n\t\tconst info: Record<string, string> = {};\n\t\tinfo.name = this.name;\n\t\tinfo.uuid = this.uuid;\n\t\tinfo.eid = this.eid.toString();\n\t\treturn info;\n\t}\n}\n\n","import {\n\tdefineSystem,\n\tdefineQuery,\n\tdefineComponent,\n\tTypes,\n\tremoveQuery,\n\ttype IWorld,\n} from 'bitecs';\nimport { Quaternion } from 'three';\nimport { StageEntity } from '../interfaces/entity';\nimport RAPIER from '@dimforge/rapier3d-compat';\n\nexport type StageSystem = {\n\t_childrenMap: Map<number, StageEntity & { body: RAPIER.RigidBody }>;\n}\n\nexport const position = defineComponent({\n\tx: Types.f32,\n\ty: Types.f32,\n\tz: Types.f32\n});\n\nexport const rotation = defineComponent({\n\tx: Types.f32,\n\ty: Types.f32,\n\tz: Types.f32,\n\tw: Types.f32\n});\n\nexport const scale = defineComponent({\n\tx: Types.f32,\n\ty: Types.f32,\n\tz: Types.f32\n});\n\n// Reusable quaternion to avoid allocations per frame\nconst _tempQuaternion = new Quaternion();\n\nexport type TransformSystemResult = {\n\tsystem: ReturnType<typeof defineSystem>;\n\tdestroy: (world: IWorld) => void;\n};\n\nexport default function createTransformSystem(stage: StageSystem): TransformSystemResult {\n\tconst queryTerms = [position, rotation];\n\tconst transformQuery = defineQuery(queryTerms);\n\tconst stageEntities = stage._childrenMap;\n\n\tconst system = defineSystem((world) => {\n\t\tconst entities = transformQuery(world);\n\t\tif (stageEntities === undefined) {\n\t\t\treturn world;\n\t\t}\n\n\t\tfor (const [key, stageEntity] of stageEntities) {\n\t\t\t// Early bailout - combine conditions\n\t\t\tif (!stageEntity?.body || stageEntity.markedForRemoval) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\tconst id = entities[key];\n\t\t\tconst body = stageEntity.body;\n\t\t\tconst target = stageEntity.group ?? stageEntity.mesh;\n\n\t\t\t// Position sync\n\t\t\tconst translation = body.translation();\n\t\t\tposition.x[id] = translation.x;\n\t\t\tposition.y[id] = translation.y;\n\t\t\tposition.z[id] = translation.z;\n\n\t\t\tif (target) {\n\t\t\t\ttarget.position.set(translation.x, translation.y, translation.z);\n\t\t\t}\n\n\t\t\t// Skip rotation if controlled externally\n\t\t\tif (stageEntity.controlledRotation) {\n\t\t\t\tcontinue;\n\t\t\t}\n\n\t\t\t// Rotation sync - reuse quaternion\n\t\t\tconst rot = body.rotation();\n\t\t\trotation.x[id] = rot.x;\n\t\t\trotation.y[id] = rot.y;\n\t\t\trotation.z[id] = rot.z;\n\t\t\trotation.w[id] = rot.w;\n\n\t\t\tif (target) {\n\t\t\t\t_tempQuaternion.set(rot.x, rot.y, rot.z, rot.w);\n\t\t\t\ttarget.setRotationFromQuaternion(_tempQuaternion);\n\t\t\t}\n\t\t}\n\n\t\treturn world;\n\t});\n\n\tconst destroy = (world: IWorld) => {\n\t\t// Remove the query from bitecs world tracking\n\t\tremoveQuery(world, transformQuery);\n\t};\n\n\treturn { system, destroy };\n}","/** Vite build flags */\nexport const DEBUG_FLAG = import.meta.env.VITE_DEBUG_FLAG === 'true';","import {\n\tCleanupContext,\n\tCleanupFunction,\n\tDestroyContext,\n\tDestroyFunction,\n\tLoadedContext,\n\tLoadedFunction,\n\tSetupContext,\n\tSetupFunction,\n\tUpdateContext,\n\tUpdateFunction,\n} from \"./base-node-life-cycle\";\nimport { DEBUG_FLAG } from \"./flags\";\nimport { nanoid } from \"nanoid\";\nimport { NodeInterface } from \"./node-interface\";\n\nexport type BaseNodeOptions<T = any> = BaseNode | Partial<T>;\n\n/**\n * Lifecycle callback arrays - each lifecycle event can have multiple callbacks\n * that execute in order.\n */\nexport interface LifecycleCallbacks<T> {\n\tsetup: Array<SetupFunction<T>>;\n\tloaded: Array<LoadedFunction<T>>;\n\tupdate: Array<UpdateFunction<T>>;\n\tdestroy: Array<DestroyFunction<T>>;\n\tcleanup: Array<CleanupFunction<T>>;\n}\n\nexport abstract class BaseNode<Options = any, T = any> implements NodeInterface {\n\tprotected parent: NodeInterface | null = null;\n\tprotected children: NodeInterface[] = [];\n\tpublic options: Options;\n\tpublic eid: number = 0;\n\tpublic uuid: string = '';\n\tpublic name: string = '';\n\tpublic markedForRemoval: boolean = false;\n\n\t/**\n\t * Lifecycle callback arrays - use onSetup(), onUpdate(), etc. to add callbacks\n\t */\n\tprotected lifecycleCallbacks: LifecycleCallbacks<this> = {\n\t\tsetup: [],\n\t\tloaded: [],\n\t\tupdate: [],\n\t\tdestroy: [],\n\t\tcleanup: [],\n\t};\n\n\tconstructor(args: BaseNodeOptions[] = []) {\n\t\tconst options = args\n\t\t\t.filter(arg => !(arg instanceof BaseNode))\n\t\t\t.reduce((acc, opt) => ({ ...acc, ...opt }), {});\n\t\tthis.options = options as Options;\n\t\tthis.uuid = nanoid();\n\t}\n\n\t// ─────────────────────────────────────────────────────────────────────────────\n\t// Fluent API for adding lifecycle callbacks\n\t// ─────────────────────────────────────────────────────────────────────────────\n\n\t/**\n\t * Add setup callbacks to be executed in order during nodeSetup\n\t */\n\tpublic onSetup(...callbacks: Array<SetupFunction<this>>): this {\n\t\tthis.lifecycleCallbacks.setup.push(...callbacks);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add loaded callbacks to be executed in order during nodeLoaded\n\t */\n\tpublic onLoaded(...callbacks: Array<LoadedFunction<this>>): this {\n\t\tthis.lifecycleCallbacks.loaded.push(...callbacks);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add update callbacks to be executed in order during nodeUpdate\n\t */\n\tpublic onUpdate(...callbacks: Array<UpdateFunction<this>>): this {\n\t\tthis.lifecycleCallbacks.update.push(...callbacks);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add destroy callbacks to be executed in order during nodeDestroy\n\t */\n\tpublic onDestroy(...callbacks: Array<DestroyFunction<this>>): this {\n\t\tthis.lifecycleCallbacks.destroy.push(...callbacks);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Add cleanup callbacks to be executed in order during nodeCleanup\n\t */\n\tpublic onCleanup(...callbacks: Array<CleanupFunction<this>>): this {\n\t\tthis.lifecycleCallbacks.cleanup.push(...callbacks);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Prepend setup callbacks (run before existing ones)\n\t */\n\tpublic prependSetup(...callbacks: Array<SetupFunction<this>>): this {\n\t\tthis.lifecycleCallbacks.setup.unshift(...callbacks);\n\t\treturn this;\n\t}\n\n\t/**\n\t * Prepend update callbacks (run before existing ones)\n\t */\n\tpublic prependUpdate(...callbacks: Array<UpdateFunction<this>>): this {\n\t\tthis.lifecycleCallbacks.update.unshift(...callbacks);\n\t\treturn this;\n\t}\n\n\t// ─────────────────────────────────────────────────────────────────────────────\n\t// Tree structure\n\t// ─────────────────────────────────────────────────────────────────────────────\n\n\tpublic setParent(parent: NodeInterface | null): void {\n\t\tthis.parent = parent;\n\t}\n\n\tpublic getParent(): NodeInterface | null {\n\t\treturn this.parent;\n\t}\n\n\tpublic add(baseNode: NodeInterface): void {\n\t\tthis.children.push(baseNode);\n\t\tbaseNode.setParent(this);\n\t}\n\n\tpublic remove(baseNode: NodeInterface): void {\n\t\tconst index = this.children.indexOf(baseNode);\n\t\tif (index !== -1) {\n\t\t\tthis.children.splice(index, 1);\n\t\t\tbaseNode.setParent(null);\n\t\t}\n\t}\n\n\tpublic getChildren(): NodeInterface[] {\n\t\treturn this.children;\n\t}\n\n\tpublic isComposite(): boolean {\n\t\treturn this.children.length > 0;\n\t}\n\n\t// ─────────────────────────────────────────────────────────────────────────────\n\t// Abstract methods for subclass implementation\n\t// ─────────────────────────────────────────────────────────────────────────────\n\n\tpublic abstract create(): T;\n\n\tprotected abstract _setup(params: SetupContext<this>): void;\n\n\tprotected abstract _loaded(params: LoadedContext<this>): Promise<void>;\n\n\tprotected abstract _update(params: UpdateContext<this>): void;\n\n\tprotected abstract _destroy(params: DestroyContext<this>): void;\n\n\tprotected abstract _cleanup(params: CleanupContext<this>): Promise<void>;\n\n\t// ─────────────────────────────────────────────────────────────────────────────\n\t// Node lifecycle execution - runs internal + callback arrays\n\t// ─────────────────────────────────────────────────────────────────────────────\n\n\tpublic nodeSetup(params: SetupContext<this>) {\n\t\tif (DEBUG_FLAG) { /** */ }\n\t\tthis.markedForRemoval = false;\n\n\t\t// 1. Internal setup\n\t\tif (typeof this._setup === 'function') {\n\t\t\tthis._setup(params);\n\t\t}\n\n\t\t// 2. Run all setup callbacks in order\n\t\tfor (const callback of this.lifecycleCallbacks.setup) {\n\t\t\tcallback(params);\n\t\t}\n\n\t\t// 3. Setup children\n\t\tthis.children.forEach(child => child.nodeSetup(params));\n\t}\n\n\tpublic nodeUpdate(params: UpdateContext<this>): void {\n\t\tif (this.markedForRemoval) {\n\t\t\treturn;\n\t\t}\n\n\t\t// 1. Internal update\n\t\tif (typeof this._update === 'function') {\n\t\t\tthis._update(params);\n\t\t}\n\n\t\t// 2. Run all update callbacks in order\n\t\tfor (const callback of this.lifecycleCallbacks.update) {\n\t\t\tcallback(params);\n\t\t}\n\n\t\t// 3. Update children\n\t\tthis.children.forEach(child => child.nodeUpdate(params));\n\t}\n\n\tpublic nodeDestroy(params: DestroyContext<this>): void {\n\t\t// 1. Destroy children first\n\t\tthis.children.forEach(child => child.nodeDestroy(params));\n\n\t\t// 2. Run all destroy callbacks in order\n\t\tfor (const callback of this.lifecycleCallbacks.destroy) {\n\t\t\tcallback(params);\n\t\t}\n\n\t\t// 3. Internal destroy\n\t\tif (typeof this._destroy === 'function') {\n\t\t\tthis._destroy(params);\n\t\t}\n\n\t\tthis.markedForRemoval = true;\n\t}\n\n\tpublic async nodeLoaded(params: LoadedContext<this>): Promise<void> {\n\t\t// 1. Internal loaded\n\t\tif (typeof this._loaded === 'function') {\n\t\t\tawait this._loaded(params);\n\t\t}\n\n\t\t// 2. Run all loaded callbacks in order\n\t\tfor (const callback of this.lifecycleCallbacks.loaded) {\n\t\t\tcallback(params);\n\t\t}\n\t}\n\n\tpublic async nodeCleanup(params: CleanupContext<this>): Promise<void> {\n\t\t// 1. Run all cleanup callbacks in order\n\t\tfor (const callback of this.lifecycleCallbacks.cleanup) {\n\t\t\tcallback(params);\n\t\t}\n\n\t\t// 2. Internal cleanup\n\t\tif (typeof this._cleanup === 'function') {\n\t\t\tawait this._cleanup(params);\n\t\t}\n\t}\n\n\t// ─────────────────────────────────────────────────────────────────────────────\n\t// Options\n\t// ─────────────────────────────────────────────────────────────────────────────\n\n\tpublic getOptions(): Options {\n\t\treturn this.options;\n\t}\n\n\tpublic setOptions(options: Partial<Options>): void {\n\t\tthis.options = { ...this.options, ...options };\n\t}\n}","import { ColliderDesc } from \"@dimforge/rapier3d-compat\";\nimport { GameEntity, GameEntityOptions } from \"./entity\";\nimport { BufferGeometry, Group, Material, Mesh, Color } from \"three\";\nimport { CollisionBuilder } from \"../collision/collision-builder\";\nimport { MeshBuilder } from \"../graphics/mesh\";\nimport { MaterialBuilder, MaterialOptions } from \"../graphics/material\";\nimport { Vec3 } from \"../core/vector\";\n\nexport abstract class EntityCollisionBuilder extends CollisionBuilder {\n\tabstract collider(options: GameEntityOptions): ColliderDesc;\n}\n\nexport abstract class EntityMeshBuilder extends MeshBuilder {\n\tbuild(options: GameEntityOptions): BufferGeometry {\n\t\treturn new BufferGeometry();\n\t}\n\n\tpostBuild(): void {\n\t\treturn;\n\t}\n}\n\nexport abstract class EntityBuilder<T extends GameEntity<U> & P, U extends GameEntityOptions, P = any> {\n\tprotected meshBuilder: EntityMeshBuilder | null;\n\tprotected collisionBuilder: EntityCollisionBuilder | null;\n\tprotected materialBuilder: MaterialBuilder | null;\n\tprotected options: Partial<U>;\n\tprotected entity: T;\n\n\tconstructor(\n\t\toptions: Partial<U>,\n\t\tentity: T,\n\t\tmeshBuilder: EntityMeshBuilder | null,\n\t\tcollisionBuilder: EntityCollisionBuilder | null,\n\t) {\n\t\tthis.options = options;\n\t\tthis.entity = entity;\n\t\tthis.meshBuilder = meshBuilder;\n\t\tthis.collisionBuilder = collisionBuilder;\n\t\tthis.materialBuilder = new MaterialBuilder();\n\t\tconst builders: NonNullable<GameEntityOptions[\"_builders\"]> = {\n\t\t\tmeshBuilder: this.meshBuilder,\n\t\t\tcollisionBuilder: this.collisionBuilder,\n\t\t\tmaterialBuilder: this.materialBuilder,\n\t\t};\n\t\t(this.options as Partial<GameEntityOptions>)._builders = builders;\n\t}\n\n\twithPosition(setupPosition: Vec3): this {\n\t\tthis.options.position = setupPosition;\n\t\treturn this;\n\t}\n\n\tasync withMaterial(options: Partial<MaterialOptions>, entityType: symbol): Promise<this> {\n\t\tif (this.materialBuilder) {\n\t\t\tawait this.materialBuilder.build(options, entityType);\n\t\t}\n\t\treturn this;\n\t}\n\n\tapplyMaterialToGroup(group: Group, materials: Material[]): void {\n\t\tgroup.traverse((child) => {\n\t\t\tif (child instanceof Mesh) {\n\t\t\t\tif (child.type === 'SkinnedMesh' && materials[0] && !child.material.map) {\n\t\t\t\t\tchild.material = materials[0];\n\t\t\t\t}\n\t\t\t}\n\t\t\tchild.castShadow = true;\n\t\t\tchild.receiveShadow = true;\n\t\t});\n\t}\n\n\tasync build(): Promise<T> {\n\t\tconst entity = this.entity;\n\t\tif (this.materialBuilder) {\n\t\t\tentity.materials = this.materialBuilder.materials;\n\t\t}\n\t\tif (this.meshBuilder && entity.materials) {\n\t\t\tconst geometry = this.meshBuilder.build(this.options);\n\t\t\tentity.mesh = this.meshBuilder._build(this.options, geometry, entity.materials);\n\t\t\tthis.meshBuilder.postBuild();\n\t\t}\n\n\t\tif (entity.group && entity.materials) {\n\t\t\tthis.applyMaterialToGroup(entity.group, entity.materials);\n\t\t}\n\n\t\tif (this.collisionBuilder) {\n\t\t\tthis.collisionBuilder.withCollision(this.options?.collision || {});\n\t\t\tconst [bodyDesc, colliderDesc] = this.collisionBuilder.build(this.options as any);\n\t\t\tentity.bodyDesc = bodyDesc;\n\t\t\tentity.colliderDesc = colliderDesc;\n\n\t\t\tconst { x, y, z } = this.options.position || { x: 0, y: 0, z: 0 };\n\t\t\tentity.bodyDesc.setTranslation(x, y, z);\n\t\t}\n\t\tif (this.options.collisionType) {\n\t\t\tentity.collisionType = this.options.collisionType;\n\t\t}\n\n\t\tif (this.options.color instanceof Color) {\n\t\t\tconst applyColor = (material: Material) => {\n\t\t\t\tconst anyMat = material as any;\n\t\t\t\tif (anyMat && anyMat.color && anyMat.color.set) {\n\t\t\t\t\tanyMat.color.set(this.options.color as Color);\n\t\t\t\t}\n\t\t\t};\n\t\t\tif (entity.materials?.length) {\n\t\t\t\tfor (const mat of entity.materials) applyColor(mat);\n\t\t\t}\n\t\t\tif (entity.mesh && entity.mesh.material) {\n\t\t\t\tconst mat = entity.mesh.material as any;\n\t\t\t\tif (Array.isArray(mat)) mat.forEach(applyColor); else applyColor(mat);\n\t\t\t}\n\t\t\tif (entity.group) {\n\t\t\t\tentity.group.traverse((child) => {\n\t\t\t\t\tif (child instanceof Mesh && child.material) {\n\t\t\t\t\t\tconst mat = child.material as any;\n\t\t\t\t\t\tif (Array.isArray(mat)) mat.forEach(applyColor); else applyColor(mat);\n\t\t\t\t\t}\n\t\t\t\t});\n\t\t\t}\n\t\t}\n\n\t\treturn entity;\n\t}\n\n\tprotected abstract createEntity(options: Partial<U>): T;\n}","import { ActiveCollisionTypes, ColliderDesc, RigidBodyDesc, RigidBodyType, Vector3 } from \"@dimforge/rapier3d-compat\";\nimport { Vec3 } from \"../core/vector\";\n\n/**\n * Options for configuring entity collision behavior.\n */\nexport interface CollisionOptions {\n\tstatic?: boolean;\n\tsensor?: boolean;\n\tsize?: Vector3;\n\tposition?: Vector3;\n\tcollisionType?: string;\n\tcollisionFilter?: string[];\n}\n\nconst typeToGroup = new Map<string, number>();\nlet nextGroupId = 0;\n\nexport function getOrCreateCollisionGroupId(type: string): number {\n\tlet groupId = typeToGroup.get(type);\n\tif (groupId === undefined) {\n\t\tgroupId = nextGroupId++ % 16;\n\t\ttypeToGroup.set(type, groupId);\n\t}\n\treturn groupId;\n}\n\nexport function createCollisionFilter(allowedTypes: string[]): number {\n\tlet filter = 0;\n\tallowedTypes.forEach(type => {\n\t\tconst groupId = getOrCreateCollisionGroupId(type);\n\t\tfilter |= (1 << groupId);\n\t});\n\treturn filter;\n}\n\nexport class CollisionBuilder {\n\tstatic: boolean = false;\n\tsensor: boolean = false;\n\tgravity: Vec3 = new Vector3(0, 0, 0);\n\n\tbuild(options: Partial<CollisionOptions>): [RigidBodyDesc, ColliderDesc] {\n\t\tconst bodyDesc = this.bodyDesc({\n\t\t\tisDynamicBody: !this.static\n\t\t});\n\t\tconst collider = this.collider(options);\n\t\tconst type = options.collisionType;\n\t\tif (type) {\n\t\t\tlet groupId = getOrCreateCollisionGroupId(type);\n\t\t\tlet filter = 0b1111111111111111;\n\t\t\tif (options.collisionFilter) {\n\t\t\t\tfilter = createCollisionFilter(options.collisionFilter);\n\t\t\t}\n\t\t\tcollider.setCollisionGroups((groupId << 16) | filter);\n\t\t}\n\t\tconst { KINEMATIC_FIXED, DEFAULT } = ActiveCollisionTypes;\n\t\tcollider.activeCollisionTypes = (this.sensor) ? KINEMATIC_FIXED : DEFAULT;\n\t\treturn [bodyDesc, collider];\n\t}\n\n\twithCollision(collisionOptions: Partial<CollisionOptions>): this {\n\t\tthis.sensor = collisionOptions?.sensor ?? this.sensor;\n\t\tthis.static = collisionOptions?.static ?? this.static;\n\t\treturn this;\n\t}\n\n\tcollider(options: CollisionOptions): ColliderDesc {\n\t\tconst size = options.size ?? new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\treturn colliderDesc;\n\t}\n\n\tbodyDesc({ isDynamicBody = true }): RigidBodyDesc {\n\t\tconst type = isDynamicBody ? RigidBodyType.Dynamic : RigidBodyType.Fixed;\n\t\tconst bodyDesc = new RigidBodyDesc(type)\n\t\t\t.setTranslation(0, 0, 0)\n\t\t\t.setGravityScale(1.0)\n\t\t\t.setCanSleep(false)\n\t\t\t.setCcdEnabled(true);\n\t\treturn bodyDesc;\n\t}\n}","import { BufferGeometry, Material, Mesh } from 'three';\nimport { GameEntityOptions } from '../entities/entity';\n\n/**\n * TODO: allow for multiple materials requires geometry groups\n * TODO: allow for instanced uniforms\n * TODO: allow for geometry groups\n * TODO: allow for batched meshes\n * import { InstancedUniformsMesh } from 'three-instanced-uniforms-mesh';\n * may not need geometry groups for shaders though\n * setGeometry<T extends BufferGeometry>(geometry: T) {\n * MeshBuilder.bachedMesh = new BatchedMesh(10, 5000, 10000, material);\n * }\n */\n\nexport type MeshBuilderOptions = Partial<Pick<GameEntityOptions, 'batched' | 'material'>>;\n\nexport class MeshBuilder {\n\n\t_build(meshOptions: MeshBuilderOptions, geometry: BufferGeometry, materials: Material[]): Mesh {\n\t\tconst { batched, material } = meshOptions;\n\t\tif (batched) {\n\t\t\tconsole.warn('warning: mesh batching is not implemented');\n\t\t}\n\t\tconst mesh = new Mesh(geometry, materials.at(-1));\n\t\tmesh.position.set(0, 0, 0);\n\t\tmesh.castShadow = true;\n\t\tmesh.receiveShadow = true;\n\t\treturn mesh;\n\t}\n\n\t_postBuild(): void {\n\t\treturn;\n\t}\n}","import {\n\tColor,\n\tMaterial,\n\tMeshPhongMaterial,\n\tMeshStandardMaterial,\n\tRepeatWrapping,\n\tShaderMaterial,\n\tTextureLoader,\n\tVector2,\n\tVector3\n} from 'three';\nimport { shortHash, sortedStringify } from '../core/utility/strings';\nimport shaderMap, { ZylemShaderObject, ZylemShaderType } from '../core/preset-shader';\n\nexport interface MaterialOptions {\n\tpath?: string;\n\trepeat?: Vector2;\n\tshader?: ZylemShaderType;\n\tcolor?: Color;\n}\n\ntype BatchGeometryMap = Map<symbol, number>;\n\ninterface BatchMaterialMapObject {\n\tgeometryMap: BatchGeometryMap;\n\tmaterial: Material;\n};\n\ntype BatchKey = ReturnType<typeof shortHash>;\n\nexport type TexturePath = string | null;\n\nexport class MaterialBuilder {\n\tstatic batchMaterialMap: Map<BatchKey, BatchMaterialMapObject> = new Map();\n\n\tmaterials: Material[] = [];\n\n\tbatchMaterial(options: Partial<MaterialOptions>, entityType: symbol) {\n\t\tconst batchKey = shortHash(sortedStringify(options));\n\t\tconst mappedObject = MaterialBuilder.batchMaterialMap.get(batchKey);\n\t\tif (mappedObject) {\n\t\t\tconst count = mappedObject.geometryMap.get(entityType);\n\t\t\tif (count) {\n\t\t\t\tmappedObject.geometryMap.set(entityType, count + 1);\n\t\t\t} else {\n\t\t\t\tmappedObject.geometryMap.set(entityType, 1);\n\t\t\t}\n\t\t} else {\n\t\t\tMaterialBuilder.batchMaterialMap.set(\n\t\t\t\tbatchKey, {\n\t\t\t\tgeometryMap: new Map([[entityType, 1]]),\n\t\t\t\tmaterial: this.materials[0]\n\t\t\t});\n\t\t}\n\t}\n\n\tasync build(options: Partial<MaterialOptions>, entityType: symbol) {\n\t\tconst { path, repeat, color, shader } = options;\n\t\tif (shader) this.withShader(shader);\n\t\tif (color) this.withColor(color);\n\t\tawait this.setTexture(path ?? null, repeat);\n\t\tif (this.materials.length === 0) {\n\t\t\tthis.setColor(new Color('#ffffff'));\n\t\t}\n\t\tthis.batchMaterial(options, entityType);\n\t}\n\n\twithColor(color: Color): this {\n\t\tthis.setColor(color);\n\t\treturn this;\n\t}\n\n\twithShader(shaderType: ZylemShaderType): this {\n\t\tthis.setShader(shaderType);\n\t\treturn this;\n\t}\n\n\tasync setTexture(texturePath: TexturePath = null, repeat: Vector2 = new Vector2(1, 1)) {\n\t\tif (!texturePath) {\n\t\t\treturn;\n\t\t}\n\t\tconst loader = new TextureLoader();\n\t\tconst texture = await loader.loadAsync(texturePath as string);\n\t\ttexture.repeat = repeat;\n\t\ttexture.wrapS = RepeatWrapping;\n\t\ttexture.wrapT = RepeatWrapping;\n\t\tconst material = new MeshPhongMaterial({\n\t\t\tmap: texture,\n\t\t});\n\t\tthis.materials.push(material);\n\t}\n\n\tsetColor(color: Color) {\n\t\tconst material = new MeshStandardMaterial({\n\t\t\tcolor: color,\n\t\t\temissiveIntensity: 0.5,\n\t\t\tlightMapIntensity: 0.5,\n\t\t\tfog: true,\n\t\t});\n\n\t\tthis.materials.push(material);\n\t}\n\n\tsetShader(customShader: ZylemShaderType) {\n\t\tconst { fragment, vertex } = shaderMap.get(customShader) ?? shaderMap.get('standard') as ZylemShaderObject;\n\n\t\tconst shader = new ShaderMaterial({\n\t\t\tuniforms: {\n\t\t\t\tiResolution: { value: new Vector3(1, 1, 1) },\n\t\t\t\tiTime: { value: 0 },\n\t\t\t\ttDiffuse: { value: null },\n\t\t\t\ttDepth: { value: null },\n\t\t\t\ttNormal: { value: null }\n\t\t\t},\n\t\t\tvertexShader: vertex,\n\t\t\tfragmentShader: fragment,\n\t\t});\n\t\tthis.materials.push(shader);\n\t}\n}\n","export function sortedStringify(obj: Record<string, any>) {\n\tconst sortedObj = Object.keys(obj)\n\t\t.sort()\n\t\t.reduce((acc: Record<string, any>, key: string) => {\n\t\t\tacc[key] = obj[key];\n\t\t\treturn acc;\n\t\t}, {} as Record<string, any>);\n\n\treturn JSON.stringify(sortedObj);\n}\n\nexport function shortHash(objString: string) {\n\tlet hash = 0;\n\tfor (let i = 0; i < objString.length; i++) {\n\t\thash = Math.imul(31, hash) + objString.charCodeAt(i) | 0;\n\t}\n\treturn hash.toString(36);\n}","export default \"#include <common>\\n\\nuniform vec3 iResolution;\\nuniform float iTime;\\nvarying vec2 vUv;\\n\\n// Credit goes to:\\n// https://www.shadertoy.com/view/mtyGWy\\n\\nvec3 palette( float t ) {\\n vec3 a = vec3(0.5, 0.5, 0.5);\\n vec3 b = vec3(0.5, 0.5, 0.5);\\n vec3 c = vec3(1.0, 1.0, 1.0);\\n vec3 d = vec3(0.263,0.416,0.557);\\n\\n return a + b*cos( 6.28318*(c*t+d) );\\n}\\n\\nvoid mainImage( out vec4 fragColor, in vec2 fragCoord ) {\\n vec2 uv = (fragCoord * 2.0 - iResolution.xy) / iResolution.y;\\n vec2 uv0 = uv;\\n vec3 finalColor = vec3(0.0);\\n \\n for (float i = 0.0; i < 4.0; i++) {\\n uv = fract(uv * 1.5) - 0.5;\\n\\n float d = length(uv) * exp(-length(uv0));\\n\\n vec3 col = palette(length(uv0) + i*.4 + iTime*.4);\\n\\n d = sin(d*5. + iTime)/5.;\\n d = abs(d);\\n\\n d = pow(0.01 / d, 1.2);\\n\\n finalColor += col * d;\\n }\\n \\n fragColor = vec4(finalColor, 1.0);\\n}\\n \\nvoid main() {\\n mainImage(gl_FragColor, vUv);\\n}\"","export default \"#include <common>\\n \\nuniform vec3 iResolution;\\nuniform float iTime;\\nuniform vec2 iOffset;\\nvarying vec2 vUv;\\n\\nfloat snoise(vec3 uv, float res)\\n{\\n\\tconst vec3 s = vec3(1e0, 1e2, 1e3);\\n\\t\\n\\tuv *= res;\\n\\t\\n\\tvec3 uv0 = floor(mod(uv, res))*s;\\n\\tvec3 uv1 = floor(mod(uv+vec3(1.), res))*s;\\n\\t\\n\\tvec3 f = fract(uv); f = f*f*(3.0-2.0*f);\\n\\n\\tvec4 v = vec4(uv0.x+uv0.y+uv0.z, uv1.x+uv0.y+uv0.z,\\n\\t\\t \\t uv0.x+uv1.y+uv0.z, uv1.x+uv1.y+uv0.z);\\n\\n\\tvec4 r = fract(sin(v*1e-1)*1e3);\\n\\tfloat r0 = mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y);\\n\\t\\n\\tr = fract(sin((v + uv1.z - uv0.z)*1e-1)*1e3);\\n\\tfloat r1 = mix(mix(r.x, r.y, f.x), mix(r.z, r.w, f.x), f.y);\\n\\t\\n\\treturn mix(r0, r1, f.z)*2.-1.;\\n}\\n\\nvoid mainImage( out vec4 fragColor, in vec2 fragCoord ) {\\n\\tvec2 p = -.5 + fragCoord.xy / iResolution.xy;\\n\\tp.x *= iResolution.x/iResolution.y;\\n\\t\\n\\tfloat color = 3.0 - (3.*length(2.*p));\\n\\t\\n\\tvec3 coord = vec3(atan(p.x,p.y)/6.2832+.5, length(p)*.4, .5);\\n\\t\\n\\tfor(int i = 1; i <= 7; i++)\\n\\t{\\n\\t\\tfloat power = pow(2.0, float(i));\\n\\t\\tcolor += (1.5 / power) * snoise(coord + vec3(0.,-iTime*.05, iTime*.01), power*16.);\\n\\t}\\n\\tfragColor = vec4( color, pow(max(color,0.),2.)*0.4, pow(max(color,0.),3.)*0.15 , 1.0);\\n}\\n\\nvoid main() {\\n mainImage(gl_FragColor, vUv);\\n}\"","export default \"uniform sampler2D tDiffuse;\\nvarying vec2 vUv;\\n\\nvoid main() {\\n\\tvec4 texel = texture2D( tDiffuse, vUv );\\n\\n\\tgl_FragColor = texel;\\n}\"","export default \"varying vec3 vBarycentric;\\nuniform vec3 baseColor;\\nuniform vec3 wireframeColor;\\nuniform float wireframeThickness;\\n\\nfloat edgeFactor() {\\n vec3 d = fwidth(vBarycentric);\\n vec3 a3 = smoothstep(vec3(0.0), d * wireframeThickness, vBarycentric);\\n return min(min(a3.x, a3.y), a3.z);\\n}\\n\\nvoid main() {\\n float edge = edgeFactor();\\n\\n vec3 wireColor = wireframeColor;\\n\\n vec3 finalColor = mix(wireColor, baseColor, edge);\\n \\n gl_FragColor = vec4(finalColor, 1.0);\\n}\\n\"","export default \"uniform vec2 uvScale;\\nvarying vec2 vUv;\\n\\nvoid main() {\\n\\tvUv = uv;\\n\\tvec4 mvPosition = modelViewMatrix * vec4( position, 1.0 );\\n\\tgl_Position = projectionMatrix * mvPosition;\\n}\"","export default \"varying vec3 vBarycentric;\\n\\nvoid main() {\\n vec3 barycentric = vec3(0.0);\\n int index = gl_VertexID % 3;\\n if (index == 0) barycentric = vec3(1.0, 0.0, 0.0);\\n else if (index == 1) barycentric = vec3(0.0, 1.0, 0.0);\\n else barycentric = vec3(0.0, 0.0, 1.0);\\n vBarycentric = barycentric;\\n \\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\\n}\\n\"","/* Fragment Shaders **/\nimport starsTest from '../graphics/shaders/fragment/stars.glsl';\nimport fireFragment from '../graphics/shaders/fragment/fire.glsl';\nimport fragmentShader from '../graphics/shaders/fragment/standard.glsl';\nimport debugFragment from '../graphics/shaders/fragment/debug.glsl';\n\n/* Vertex Shaders **/\nimport vertexShader from '../graphics/shaders/vertex/object-shader.glsl';\nimport debugVertexShader from '../graphics/shaders/vertex/debug.glsl';\n\nexport type ZylemShaderObject = { fragment: string, vertex: string };\n\nconst starShader: ZylemShaderObject = {\n\tfragment: starsTest,\n\tvertex: vertexShader\n};\n\nconst fireShader: ZylemShaderObject = {\n\tfragment: fireFragment,\n\tvertex: vertexShader\n};\n\nconst standardShader: ZylemShaderObject = {\n\tfragment: fragmentShader,\n\tvertex: vertexShader\n};\n\nconst debugShader: ZylemShaderObject = {\n\tfragment: debugFragment,\n\tvertex: debugVertexShader\n};\n\nexport type ZylemShaderType = 'standard' | 'fire' | 'star' | 'debug';\n\nconst shaderMap: Map<ZylemShaderType, ZylemShaderObject> = new Map();\nshaderMap.set('standard', standardShader);\nshaderMap.set('fire', fireShader);\nshaderMap.set('star', starShader);\nshaderMap.set('debug', debugShader);\n\nexport default shaderMap;","import { GameEntity, GameEntityOptions } from '../entity';\nimport { MeshStandardMaterial, MeshBasicMaterial, MeshPhongMaterial } from 'three';\n\n/**\n * Interface for entities that provide custom debug information\n */\nexport interface DebugInfoProvider {\n\tgetDebugInfo(): Record<string, any>;\n}\n\n/**\n * Helper to check if an object implements DebugInfoProvider\n */\nfunction hasDebugInfo(obj: any): obj is DebugInfoProvider {\n\treturn obj && typeof obj.getDebugInfo === 'function';\n}\n\n/**\n * Debug delegate that provides debug information for entities\n */\nexport class DebugDelegate {\n\tprivate entity: GameEntity<any>;\n\n\tconstructor(entity: GameEntity<any>) {\n\t\tthis.entity = entity;\n\t}\n\n\t/**\n\t * Get formatted position string\n\t */\n\tprivate getPositionString(): string {\n\t\tif (this.entity.mesh) {\n\t\t\tconst { x, y, z } = this.entity.mesh.position;\n\t\t\treturn `${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`;\n\t\t}\n\t\tconst { x, y, z } = this.entity.options.position || { x: 0, y: 0, z: 0 };\n\t\treturn `${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`;\n\t}\n\n\t/**\n\t * Get formatted rotation string (in degrees)\n\t */\n\tprivate getRotationString(): string {\n\t\tif (this.entity.mesh) {\n\t\t\tconst { x, y, z } = this.entity.mesh.rotation;\n\t\t\tconst toDeg = (rad: number) => (rad * 180 / Math.PI).toFixed(1);\n\t\t\treturn `${toDeg(x)}°, ${toDeg(y)}°, ${toDeg(z)}°`;\n\t\t}\n\t\tconst { x, y, z } = this.entity.options.rotation || { x: 0, y: 0, z: 0 };\n\t\tconst toDeg = (rad: number) => (rad * 180 / Math.PI).toFixed(1);\n\t\treturn `${toDeg(x)}°, ${toDeg(y)}°, ${toDeg(z)}°`;\n\t}\n\n\t/**\n\t * Get material information\n\t */\n\tprivate getMaterialInfo(): Record<string, any> {\n\t\tif (!this.entity.mesh || !this.entity.mesh.material) {\n\t\t\treturn { type: 'none' };\n\t\t}\n\n\t\tconst material = Array.isArray(this.entity.mesh.material)\n\t\t\t? this.entity.mesh.material[0]\n\t\t\t: this.entity.mesh.material;\n\n\t\tconst info: Record<string, any> = {\n\t\t\ttype: material.type\n\t\t};\n\n\t\tif (material instanceof MeshStandardMaterial ||\n\t\t\tmaterial instanceof MeshBasicMaterial ||\n\t\t\tmaterial instanceof MeshPhongMaterial) {\n\t\t\tinfo.color = `#${material.color.getHexString()}`;\n\t\t\tinfo.opacity = material.opacity;\n\t\t\tinfo.transparent = material.transparent;\n\t\t}\n\n\t\tif ('roughness' in material) {\n\t\t\tinfo.roughness = material.roughness;\n\t\t}\n\n\t\tif ('metalness' in material) {\n\t\t\tinfo.metalness = material.metalness;\n\t\t}\n\n\t\treturn info;\n\t}\n\n\tprivate getPhysicsInfo(): Record<string, any> | null {\n\t\tif (!this.entity.body) {\n\t\t\treturn null;\n\t\t}\n\n\t\tconst info: Record<string, any> = {\n\t\t\ttype: this.entity.body.bodyType(),\n\t\t\tmass: this.entity.body.mass(),\n\t\t\tisEnabled: this.entity.body.isEnabled(),\n\t\t\tisSleeping: this.entity.body.isSleeping()\n\t\t};\n\n\t\tconst velocity = this.entity.body.linvel();\n\t\tinfo.velocity = `${velocity.x.toFixed(2)}, ${velocity.y.toFixed(2)}, ${velocity.z.toFixed(2)}`;\n\n\t\treturn info;\n\t}\n\n\tpublic buildDebugInfo(): Record<string, any> {\n\t\tconst defaultInfo: Record<string, any> = {\n\t\t\tname: this.entity.name || this.entity.uuid,\n\t\t\tuuid: this.entity.uuid,\n\t\t\tposition: this.getPositionString(),\n\t\t\trotation: this.getRotationString(),\n\t\t\tmaterial: this.getMaterialInfo()\n\t\t};\n\n\t\tconst physicsInfo = this.getPhysicsInfo();\n\t\tif (physicsInfo) {\n\t\t\tdefaultInfo.physics = physicsInfo;\n\t\t}\n\n\t\tif (this.entity.behaviors.length > 0) {\n\t\t\tdefaultInfo.behaviors = this.entity.behaviors.map(b => b.constructor.name);\n\t\t}\n\n\t\tif (hasDebugInfo(this.entity)) {\n\t\t\tconst customInfo = this.entity.getDebugInfo();\n\t\t\treturn { ...defaultInfo, ...customInfo };\n\t\t}\n\n\t\treturn defaultInfo;\n\t}\n}\n\nclass EnhancedDebugInfoBuilder {\n\tprivate customBuilder?: (options: GameEntityOptions) => Record<string, any>;\n\n\tconstructor(customBuilder?: (options: GameEntityOptions) => Record<string, any>) {\n\t\tthis.customBuilder = customBuilder;\n\t}\n\n\tbuildInfo(options: GameEntityOptions, entity?: GameEntity<any>): Record<string, any> {\n\t\tif (this.customBuilder) {\n\t\t\treturn this.customBuilder(options);\n\t\t}\n\n\t\tif (entity) {\n\t\t\tconst delegate = new DebugDelegate(entity);\n\t\t\treturn delegate.buildDebugInfo();\n\t\t}\n\n\t\tconst { x, y, z } = options.position || { x: 0, y: 0, z: 0 };\n\t\treturn {\n\t\t\tname: (options as any).name || 'unnamed',\n\t\t\tposition: `${x.toFixed(2)}, ${y.toFixed(2)}, ${z.toFixed(2)}`\n\t\t};\n\t}\n}\n","// this class is not for asset loading, it is for loading entity specific data\n// this is to keep the entity class focused purely on entity logic\n\nexport function isLoadable(obj: any): obj is EntityLoaderDelegate {\n\treturn typeof obj?.load === \"function\" && typeof obj?.data === \"function\";\n}\n\nexport interface EntityLoaderDelegate {\n\tload(): Promise<void>;\n\tdata(): any;\n}\n\nexport class EntityLoader {\n\tentityReference: EntityLoaderDelegate;\n\n\tconstructor(entity: EntityLoaderDelegate) {\n\t\tthis.entityReference = entity;\n\t}\n\n\tasync load() {\n\t\tif (this.entityReference.load) {\n\t\t\tawait this.entityReference.load();\n\t\t}\n\t}\n\n\tasync data() {\n\t\tif (this.entityReference.data) {\n\t\t\treturn this.entityReference.data();\n\t\t}\n\t\treturn null;\n\t}\n}","import { GameEntityOptions, GameEntity } from \"./entity\";\nimport { BaseNode } from \"../core/base-node\";\nimport { EntityBuilder } from \"./builder\";\nimport { EntityCollisionBuilder } from \"./builder\";\nimport { EntityMeshBuilder } from \"./builder\";\nimport { EntityLoader, isLoadable } from \"./delegates/loader\";\n\nexport interface CreateGameEntityOptions<T extends GameEntity<any>, CreateOptions extends GameEntityOptions> {\n\targs: Array<any>;\n\tdefaultConfig: GameEntityOptions;\n\tEntityClass: new (options: any) => T;\n\tBuilderClass: new (options: any, entity: T, meshBuilder: any, collisionBuilder: any) => EntityBuilder<T, CreateOptions>;\n\tMeshBuilderClass?: new (data: any) => EntityMeshBuilder;\n\tCollisionBuilderClass?: new (data: any) => EntityCollisionBuilder;\n\tentityType: symbol;\n};\n\nexport async function createEntity<T extends GameEntity<any>, CreateOptions extends GameEntityOptions>(params: CreateGameEntityOptions<T, CreateOptions>): Promise<T> {\n\tconst {\n\t\targs,\n\t\tdefaultConfig,\n\t\tEntityClass,\n\t\tBuilderClass,\n\t\tentityType,\n\t\tMeshBuilderClass,\n\t\tCollisionBuilderClass,\n\t} = params;\n\n\tlet builder: EntityBuilder<T, CreateOptions> | null = null;\n\tlet configuration;\n\n\tconst configurationIndex = args.findIndex(node => !(node instanceof BaseNode));\n\tif (configurationIndex !== -1) {\n\t\tconst subArgs = args.splice(configurationIndex, 1);\n\t\tconfiguration = subArgs.find(node => !(node instanceof BaseNode));\n\t}\n\n\tconst mergedConfiguration = configuration ? { ...defaultConfig, ...configuration } : defaultConfig;\n\targs.push(mergedConfiguration);\n\n\tfor (const arg of args) {\n\t\tif (arg instanceof BaseNode) {\n\t\t\tcontinue;\n\t\t}\n\t\tlet entityData = null;\n\t\tconst entity = new EntityClass(arg);\n\t\ttry {\n\t\t\tif (isLoadable(entity)) {\n\t\t\t\tconst loader = new EntityLoader(entity);\n\t\t\t\tawait loader.load();\n\t\t\t\tentityData = await loader.data();\n\t\t\t}\n\t\t} catch (error) {\n\t\t\tconsole.error(\"Error creating entity with loader:\", error);\n\t\t}\n\t\tbuilder = new BuilderClass(\n\t\t\targ,\n\t\t\tentity,\n\t\t\tMeshBuilderClass ? new MeshBuilderClass(entityData) : null,\n\t\t\tCollisionBuilderClass ? new CollisionBuilderClass(entityData) : null,\n\t\t);\n\t\tif (arg.material) {\n\t\t\tawait builder.withMaterial(arg.material, entityType);\n\t\t}\n\t}\n\n\tif (!builder) {\n\t\tthrow new Error(`missing options for ${String(entityType)}, builder is not initialized.`);\n\t}\n\n\treturn await builder.build();\n}\n\n","import { ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { Color, SphereGeometry } from 'three';\nimport { Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { EntityMeshBuilder } from './builder';\nimport { DebugDelegate } from './delegates/debug';\nimport { createEntity } from './create';\n\ntype ZylemSphereOptions = GameEntityOptions & {\n\tradius?: number;\n};\n\nconst sphereDefaults: ZylemSphereOptions = {\n\tradius: 1,\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: false,\n\t},\n\tmaterial: {\n\t\tcolor: new Color('#ffffff'),\n\t\tshader: 'standard'\n\t},\n};\n\nexport class SphereCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: ZylemSphereOptions): ColliderDesc {\n\t\tconst radius = options.radius ?? 1;\n\t\tlet colliderDesc = ColliderDesc.ball(radius);\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class SphereMeshBuilder extends EntityMeshBuilder {\n\tbuild(options: ZylemSphereOptions): SphereGeometry {\n\t\tconst radius = options.radius ?? 1;\n\t\treturn new SphereGeometry(radius);\n\t}\n}\n\nexport class SphereBuilder extends EntityBuilder<ZylemSphere, ZylemSphereOptions> {\n\tprotected createEntity(options: Partial<ZylemSphereOptions>): ZylemSphere {\n\t\treturn new ZylemSphere(options);\n\t}\n}\n\nexport const SPHERE_TYPE = Symbol('Sphere');\n\nexport class ZylemSphere extends GameEntity<ZylemSphereOptions> {\n\tstatic type = SPHERE_TYPE;\n\n\tconstructor(options?: ZylemSphereOptions) {\n\t\tsuper();\n\t\tthis.options = { ...sphereDefaults, ...options };\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\t\tconst radius = this.options.radius ?? 1;\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemSphere.type),\n\t\t\tradius: radius.toFixed(2),\n\t\t};\n\t}\n}\n\ntype SphereOptions = BaseNode | Partial<ZylemSphereOptions>;\n\nexport async function sphere(...args: Array<SphereOptions>): Promise<ZylemSphere> {\n\treturn createEntity<ZylemSphere, ZylemSphereOptions>({\n\t\targs,\n\t\tdefaultConfig: sphereDefaults,\n\t\tEntityClass: ZylemSphere,\n\t\tBuilderClass: SphereBuilder,\n\t\tMeshBuilderClass: SphereMeshBuilder,\n\t\tCollisionBuilderClass: SphereCollisionBuilder,\n\t\tentityType: ZylemSphere.type\n\t});\n}","import { ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { Color, Euler, Group, Quaternion, Vector3 } from 'three';\nimport {\n\tTextureLoader,\n\tSpriteMaterial,\n\tSprite as ThreeSprite,\n} from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { createEntity } from './create';\nimport { DestroyContext, DestroyFunction, UpdateContext, UpdateFunction } from '../core/base-node-life-cycle';\nimport { DebugDelegate } from './delegates/debug';\n\nexport type SpriteImage = { name: string; file: string };\nexport type SpriteAnimation = {\n\tname: string;\n\tframes: string[];\n\tspeed: number | number[];\n\tloop: boolean;\n};\n\ntype ZylemSpriteOptions = GameEntityOptions & {\n\timages?: SpriteImage[];\n\tanimations?: SpriteAnimation[];\n\tsize?: Vector3;\n\tcollisionSize?: Vector3;\n};\n\nconst spriteDefaults: ZylemSpriteOptions = {\n\tsize: new Vector3(1, 1, 1),\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: false,\n\t},\n\tmaterial: {\n\t\tcolor: new Color('#ffffff'),\n\t\tshader: 'standard'\n\t},\n\timages: [],\n\tanimations: [],\n};\n\nexport class SpriteCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: ZylemSpriteOptions): ColliderDesc {\n\t\tconst size = options.collisionSize || options.size || new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class SpriteBuilder extends EntityBuilder<ZylemSprite, ZylemSpriteOptions> {\n\tprotected createEntity(options: Partial<ZylemSpriteOptions>): ZylemSprite {\n\t\treturn new ZylemSprite(options);\n\t}\n}\n\nexport const SPRITE_TYPE = Symbol('Sprite');\n\nexport class ZylemSprite extends GameEntity<ZylemSpriteOptions> {\n\tstatic type = SPRITE_TYPE;\n\n\tprotected sprites: ThreeSprite[] = [];\n\tprotected spriteMap: Map<string, number> = new Map();\n\tprotected currentSpriteIndex: number = 0;\n\tprotected animations: Map<string, any> = new Map();\n\tprotected currentAnimation: any = null;\n\tprotected currentAnimationFrame: string = '';\n\tprotected currentAnimationIndex: number = 0;\n\tprotected currentAnimationTime: number = 0;\n\n\tconstructor(options?: ZylemSpriteOptions) {\n\t\tsuper();\n\t\tthis.options = { ...spriteDefaults, ...options };\n\t\t// Add sprite-specific lifecycle callbacks (only registered once)\n\t\tthis.prependUpdate(this.spriteUpdate.bind(this) as any);\n\t\tthis.onDestroy(this.spriteDestroy.bind(this) as any);\n\t}\n\n\tpublic create(): this {\n\t\t// Clear previous state to prevent accumulation on reload\n\t\tthis.sprites = [];\n\t\tthis.spriteMap.clear();\n\t\tthis.animations.clear();\n\t\tthis.currentAnimation = null;\n\t\tthis.currentAnimationFrame = '';\n\t\tthis.currentAnimationIndex = 0;\n\t\tthis.currentAnimationTime = 0;\n\t\tthis.group = undefined;\n\t\t\n\t\t// Recreate sprites and animations\n\t\tthis.createSpritesFromImages(this.options?.images || []);\n\t\tthis.createAnimations(this.options?.animations || []);\n\t\t\n\t\t// Call parent create\n\t\treturn super.create();\n\t}\n\n\tprotected createSpritesFromImages(images: SpriteImage[]) {\n\t\tconst textureLoader = new TextureLoader();\n\t\timages.forEach((image, index) => {\n\t\t\tconst spriteMap = textureLoader.load(image.file);\n\t\t\tconst material = new SpriteMaterial({\n\t\t\t\tmap: spriteMap,\n\t\t\t\ttransparent: true,\n\t\t\t});\n\t\t\tconst _sprite = new ThreeSprite(material);\n\t\t\t_sprite.position.normalize();\n\t\t\tthis.sprites.push(_sprite);\n\t\t\tthis.spriteMap.set(image.name, index);\n\t\t});\n\t\tthis.group = new Group();\n\t\tthis.group.add(...this.sprites);\n\t}\n\n\tprotected createAnimations(animations: SpriteAnimation[]) {\n\t\tanimations.forEach(animation => {\n\t\t\tconst { name, frames, loop = false, speed = 1 } = animation;\n\t\t\tconst internalAnimation = {\n\t\t\t\tframes: frames.map((frame, index) => ({\n\t\t\t\t\tkey: frame,\n\t\t\t\t\tindex,\n\t\t\t\t\ttime: (typeof speed === 'number' ? speed : speed[index]) * (index + 1),\n\t\t\t\t\tduration: typeof speed === 'number' ? speed : speed[index]\n\t\t\t\t})),\n\t\t\t\tloop,\n\t\t\t};\n\t\t\tthis.animations.set(name, internalAnimation);\n\t\t});\n\t}\n\n\tsetSprite(key: string) {\n\t\tconst spriteIndex = this.spriteMap.get(key);\n\t\tconst useIndex = spriteIndex ?? 0;\n\t\tthis.currentSpriteIndex = useIndex;\n\t\tthis.sprites.forEach((_sprite, i) => {\n\t\t\t_sprite.visible = this.currentSpriteIndex === i;\n\t\t});\n\t}\n\n\tsetAnimation(name: string, delta: number) {\n\t\tconst animation = this.animations.get(name);\n\t\tif (!animation) return;\n\n\t\tconst { loop, frames } = animation;\n\t\tconst frame = frames[this.currentAnimationIndex];\n\n\t\tif (name === this.currentAnimation) {\n\t\t\tthis.currentAnimationFrame = frame.key;\n\t\t\tthis.currentAnimationTime += delta;\n\t\t\tthis.setSprite(this.currentAnimationFrame);\n\t\t} else {\n\t\t\tthis.currentAnimation = name;\n\t\t}\n\n\t\tif (this.currentAnimationTime > frame.time) {\n\t\t\tthis.currentAnimationIndex++;\n\t\t}\n\n\t\tif (this.currentAnimationIndex >= frames.length) {\n\t\t\tif (loop) {\n\t\t\t\tthis.currentAnimationIndex = 0;\n\t\t\t\tthis.currentAnimationTime = 0;\n\t\t\t} else {\n\t\t\t\tthis.currentAnimationTime = frames[this.currentAnimationIndex].time;\n\t\t\t}\n\t\t}\n\t}\n\n\tasync spriteUpdate(params: UpdateContext<ZylemSpriteOptions>): Promise<void> {\n\t\tthis.sprites.forEach(_sprite => {\n\t\t\tif (_sprite.material) {\n\t\t\t\tconst q = this.body?.rotation();\n\t\t\t\tif (q) {\n\t\t\t\t\tconst quat = new Quaternion(q.x, q.y, q.z, q.w);\n\t\t\t\t\tconst euler = new Euler().setFromQuaternion(quat, 'XYZ');\n\t\t\t\t\t_sprite.material.rotation = euler.z;\n\t\t\t\t}\n\t\t\t\t_sprite.scale.set(this.options.size?.x ?? 1, this.options.size?.y ?? 1, this.options.size?.z ?? 1);\n\t\t\t}\n\t\t});\n\t}\n\n\tasync spriteDestroy(params: DestroyContext<ZylemSpriteOptions>): Promise<void> {\n\t\tthis.sprites.forEach(_sprite => {\n\t\t\t_sprite.removeFromParent();\n\t\t});\n\t\tthis.group?.remove(...this.sprites);\n\t\tthis.group?.removeFromParent();\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemSprite.type),\n\t\t};\n\t}\n}\n\ntype SpriteOptions = BaseNode | Partial<ZylemSpriteOptions>;\n\nexport async function sprite(...args: Array<SpriteOptions>): Promise<ZylemSprite> {\n\treturn createEntity<ZylemSprite, ZylemSpriteOptions>({\n\t\targs,\n\t\tdefaultConfig: spriteDefaults,\n\t\tEntityClass: ZylemSprite,\n\t\tBuilderClass: SpriteBuilder,\n\t\tCollisionBuilderClass: SpriteCollisionBuilder,\n\t\tentityType: ZylemSprite.type\n\t});\n}","import { ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { Color, PlaneGeometry, Vector2, Vector3 } from 'three';\nimport { TexturePath } from '../graphics/material';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { EntityMeshBuilder } from './builder';\nimport { XZPlaneGeometry } from '../graphics/geometries/XZPlaneGeometry';\nimport { createEntity } from './create';\n\ntype ZylemPlaneOptions = GameEntityOptions & {\n\ttile?: Vector2;\n\trepeat?: Vector2;\n\ttexture?: TexturePath;\n\tsubdivisions?: number;\n};\n\nconst DEFAULT_SUBDIVISIONS = 4;\n\nconst planeDefaults: ZylemPlaneOptions = {\n\ttile: new Vector2(10, 10),\n\trepeat: new Vector2(1, 1),\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: true,\n\t},\n\tmaterial: {\n\t\tcolor: new Color('#ffffff'),\n\t\tshader: 'standard'\n\t},\n\tsubdivisions: DEFAULT_SUBDIVISIONS\n};\n\nexport class PlaneCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: ZylemPlaneOptions): ColliderDesc {\n\t\tconst tile = options.tile ?? new Vector2(1, 1);\n\t\tconst subdivisions = options.subdivisions ?? DEFAULT_SUBDIVISIONS;\n\t\tconst size = new Vector3(tile.x, 1, tile.y);\n\n\t\tconst heightData = (options._builders?.meshBuilder as unknown as PlaneMeshBuilder)?.heightData;\n\t\tconst scale = new Vector3(size.x, 1, size.z);\n\t\tlet colliderDesc = ColliderDesc.heightfield(\n\t\t\tsubdivisions,\n\t\t\tsubdivisions,\n\t\t\theightData,\n\t\t\tscale\n\t\t);\n\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class PlaneMeshBuilder extends EntityMeshBuilder {\n\theightData: Float32Array = new Float32Array();\n\tcolumnsRows = new Map();\n\n\tbuild(options: ZylemPlaneOptions): XZPlaneGeometry {\n\t\tconst tile = options.tile ?? new Vector2(1, 1);\n\t\tconst subdivisions = options.subdivisions ?? DEFAULT_SUBDIVISIONS;\n\t\tconst size = new Vector3(tile.x, 1, tile.y);\n\n\t\tconst geometry = new XZPlaneGeometry(size.x, size.z, subdivisions, subdivisions);\n\t\tconst vertexGeometry = new PlaneGeometry(size.x, size.z, subdivisions, subdivisions);\n\t\tconst dx = size.x / subdivisions;\n\t\tconst dy = size.z / subdivisions;\n\t\tconst originalVertices = geometry.attributes.position.array;\n\t\tconst vertices = vertexGeometry.attributes.position.array;\n\t\tconst columsRows = new Map();\n\t\tfor (let i = 0; i < vertices.length; i += 3) {\n\t\t\tlet row = Math.floor(Math.abs((vertices as any)[i] + (size.x / 2)) / dx);\n\t\t\tlet column = Math.floor(Math.abs((vertices as any)[i + 1] - (size.z / 2)) / dy);\n\t\t\tconst randomHeight = Math.random() * 4;\n\t\t\t(vertices as any)[i + 2] = randomHeight;\n\t\t\toriginalVertices[i + 1] = randomHeight;\n\t\t\tif (!columsRows.get(column)) {\n\t\t\t\tcolumsRows.set(column, new Map());\n\t\t\t}\n\t\t\tcolumsRows.get(column).set(row, randomHeight);\n\t\t}\n\t\tthis.columnsRows = columsRows;\n\t\treturn geometry;\n\t}\n\n\tpostBuild(): void {\n\t\tconst heights = [];\n\t\tfor (let i = 0; i <= DEFAULT_SUBDIVISIONS; ++i) {\n\t\t\tfor (let j = 0; j <= DEFAULT_SUBDIVISIONS; ++j) {\n\t\t\t\tconst row = this.columnsRows.get(j);\n\t\t\t\tif (!row) {\n\t\t\t\t\tcontinue;\n\t\t\t\t}\n\t\t\t\tconst data = row.get(i);\n\t\t\t\theights.push(data);\n\t\t\t}\n\t\t}\n\t\tthis.heightData = new Float32Array(heights as unknown as number[]);\n\t}\n}\n\nexport class PlaneBuilder extends EntityBuilder<ZylemPlane, ZylemPlaneOptions> {\n\tprotected createEntity(options: Partial<ZylemPlaneOptions>): ZylemPlane {\n\t\treturn new ZylemPlane(options);\n\t}\n}\n\nexport const PLANE_TYPE = Symbol('Plane');\n\nexport class ZylemPlane extends GameEntity<ZylemPlaneOptions> {\n\tstatic type = PLANE_TYPE;\n\n\tconstructor(options?: ZylemPlaneOptions) {\n\t\tsuper();\n\t\tthis.options = { ...planeDefaults, ...options };\n\t}\n}\n\ntype PlaneOptions = BaseNode | Partial<ZylemPlaneOptions>;\n\nexport async function plane(...args: Array<PlaneOptions>): Promise<ZylemPlane> {\n\treturn createEntity<ZylemPlane, ZylemPlaneOptions>({\n\t\targs,\n\t\tdefaultConfig: planeDefaults,\n\t\tEntityClass: ZylemPlane,\n\t\tBuilderClass: PlaneBuilder,\n\t\tMeshBuilderClass: PlaneMeshBuilder,\n\t\tCollisionBuilderClass: PlaneCollisionBuilder,\n\t\tentityType: ZylemPlane.type\n\t});\n}\n","// @ts-nocheck\nimport { BufferGeometry, Float32BufferAttribute } from 'three';\n\nclass XZPlaneGeometry extends BufferGeometry {\n\n\tconstructor(width = 1, height = 1, widthSegments = 1, heightSegments = 1) {\n\n\t\tsuper();\n\n\t\tthis.type = 'XZPlaneGeometry';\n\n\t\tthis.parameters = {\n\t\t\twidth: width,\n\t\t\theight: height,\n\t\t\twidthSegments: widthSegments,\n\t\t\theightSegments: heightSegments\n\t\t};\n\n\t\tconst width_half = width / 2;\n\t\tconst height_half = height / 2;\n\n\t\tconst gridX = Math.floor(widthSegments);\n\t\tconst gridY = Math.floor(heightSegments);\n\n\t\tconst gridX1 = gridX + 1;\n\t\tconst gridY1 = gridY + 1;\n\n\t\tconst segment_width = width / gridX;\n\t\tconst segment_height = height / gridY;\n\n\t\tconst indices = [];\n\t\tconst vertices = [];\n\t\tconst normals = [];\n\t\tconst uvs = [];\n\n\t\tfor (let iy = 0; iy < gridY1; iy++) {\n\n\t\t\tconst z = iy * segment_height - height_half;\n\n\t\t\tfor (let ix = 0; ix < gridX1; ix++) {\n\n\t\t\t\tconst x = ix * segment_width - width_half;\n\n\t\t\t\tvertices.push(x, 0, z);\n\n\t\t\t\tnormals.push(0, 1, 0);\n\n\t\t\t\tuvs.push(ix / gridX);\n\t\t\t\tuvs.push(1 - (iy / gridY));\n\n\t\t\t}\n\n\t\t}\n\n\t\tfor (let iy = 0; iy < gridY; iy++) {\n\n\t\t\tfor (let ix = 0; ix < gridX; ix++) {\n\n\t\t\t\tconst a = ix + gridX1 * iy;\n\t\t\t\tconst b = ix + gridX1 * (iy + 1);\n\t\t\t\tconst c = (ix + 1) + gridX1 * (iy + 1);\n\t\t\t\tconst d = (ix + 1) + gridX1 * iy;\n\n\t\t\t\tindices.push(a, b, d);\n\t\t\t\tindices.push(b, c, d);\n\n\t\t\t}\n\n\t\t}\n\n\t\tthis.setIndex(indices);\n\t\tthis.setAttribute('position', new Float32BufferAttribute(vertices, 3));\n\t\tthis.setAttribute('normal', new Float32BufferAttribute(normals, 3));\n\t\tthis.setAttribute('uv', new Float32BufferAttribute(uvs, 2));\n\n\t}\n\n\tcopy(source) {\n\n\t\tsuper.copy(source);\n\n\t\tthis.parameters = Object.assign({}, source.parameters);\n\n\t\treturn this;\n\t}\n\n\tstatic fromJSON(data) {\n\t\treturn new XZPlaneGeometry(data.width, data.height, data.widthSegments, data.heightSegments);\n\t}\n\n}\n\nexport { XZPlaneGeometry };","import { ActiveCollisionTypes, ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\nimport { createEntity } from './create';\nimport { CollisionHandlerDelegate } from '../collision/world';\nimport { state } from '../game/game-state';\n\nexport type OnHeldParams = {\n\tdelta: number;\n\tself: ZylemZone;\n\tvisitor: GameEntity<any>;\n\theldTime: number;\n\tglobals: any;\n}\n\nexport type OnEnterParams = Pick<OnHeldParams, 'self' | 'visitor' | 'globals'>;\nexport type OnExitParams = Pick<OnHeldParams, 'self' | 'visitor' | 'globals'>;\n\ntype ZylemZoneOptions = GameEntityOptions & {\n\tsize?: Vector3;\n\tstatic?: boolean;\n\tonEnter?: (params: OnEnterParams) => void;\n\tonHeld?: (params: OnHeldParams) => void;\n\tonExit?: (params: OnExitParams) => void;\n};\n\nconst zoneDefaults: ZylemZoneOptions = {\n\tsize: new Vector3(1, 1, 1),\n\tposition: new Vector3(0, 0, 0),\n\tcollision: {\n\t\tstatic: true,\n\t},\n\tmaterial: {\n\t\tshader: 'standard'\n\t},\n};\n\nexport class ZoneCollisionBuilder extends EntityCollisionBuilder {\n\tcollider(options: ZylemZoneOptions): ColliderDesc {\n\t\tconst size = options.size || new Vector3(1, 1, 1);\n\t\tconst half = { x: size.x / 2, y: size.y / 2, z: size.z / 2 };\n\t\tlet colliderDesc = ColliderDesc.cuboid(half.x, half.y, half.z);\n\t\tcolliderDesc.setSensor(true);\n\t\tcolliderDesc.activeCollisionTypes = ActiveCollisionTypes.KINEMATIC_FIXED;\n\t\treturn colliderDesc;\n\t}\n}\n\nexport class ZoneBuilder extends EntityBuilder<ZylemZone, ZylemZoneOptions> {\n\tprotected createEntity(options: Partial<ZylemZoneOptions>): ZylemZone {\n\t\treturn new ZylemZone(options);\n\t}\n}\n\nexport const ZONE_TYPE = Symbol('Zone');\n\nexport class ZylemZone extends GameEntity<ZylemZoneOptions> implements CollisionHandlerDelegate {\n\tstatic type = ZONE_TYPE;\n\n\tprivate _enteredZone: Map<string, number> = new Map();\n\tprivate _exitedZone: Map<string, number> = new Map();\n\tprivate _zoneEntities: Map<string, any> = new Map();\n\n\tconstructor(options?: ZylemZoneOptions) {\n\t\tsuper();\n\t\tthis.options = { ...zoneDefaults, ...options };\n\t}\n\n\tpublic handlePostCollision({ delta }: { delta: number }): boolean {\n\t\tthis._enteredZone.forEach((val, key) => {\n\t\t\tthis.exited(delta, key);\n\t\t});\n\t\treturn this._enteredZone.size > 0;\n\t}\n\n\tpublic handleIntersectionEvent({ other, delta }: { other: any, delta: number }) {\n\t\tconst hasEntered = this._enteredZone.get(other.uuid);\n\t\tif (!hasEntered) {\n\t\t\tthis.entered(other);\n\t\t\tthis._zoneEntities.set(other.uuid, other);\n\t\t} else {\n\t\t\tthis.held(delta, other);\n\t\t}\n\t}\n\n\tonEnter(callback: (params: OnEnterParams) => void) {\n\t\tthis.options.onEnter = callback;\n\t\treturn this;\n\t}\n\n\tonHeld(callback: (params: OnHeldParams) => void) {\n\t\tthis.options.onHeld = callback;\n\t\treturn this;\n\t}\n\n\tonExit(callback: (params: OnExitParams) => void) {\n\t\tthis.options.onExit = callback;\n\t\treturn this;\n\t}\n\n\tentered(other: any) {\n\t\tthis._enteredZone.set(other.uuid, 1);\n\t\tif (this.options.onEnter) {\n\t\t\tthis.options.onEnter({\n\t\t\t\tself: this,\n\t\t\t\tvisitor: other,\n\t\t\t\tglobals: state.globals\n\t\t\t});\n\t\t}\n\t}\n\n\texited(delta: number, key: string) {\n\t\tconst hasExited = this._exitedZone.get(key);\n\t\tif (hasExited && hasExited > 1 + delta) {\n\t\t\tthis._exitedZone.delete(key);\n\t\t\tthis._enteredZone.delete(key);\n\t\t\tconst other = this._zoneEntities.get(key);\n\t\t\tif (this.options.onExit) {\n\t\t\t\tthis.options.onExit({\n\t\t\t\t\tself: this,\n\t\t\t\t\tvisitor: other,\n\t\t\t\t\tglobals: state.globals\n\t\t\t\t});\n\t\t\t}\n\t\t\treturn;\n\t\t}\n\t\tthis._exitedZone.set(key, 1 + delta);\n\t}\n\n\theld(delta: number, other: any) {\n\t\tconst heldTime = this._enteredZone.get(other.uuid) ?? 0;\n\t\tthis._enteredZone.set(other.uuid, heldTime + delta);\n\t\tthis._exitedZone.set(other.uuid, 1);\n\t\tif (this.options.onHeld) {\n\t\t\tthis.options.onHeld({\n\t\t\t\tdelta,\n\t\t\t\tself: this,\n\t\t\t\tvisitor: other,\n\t\t\t\tglobals: state.globals,\n\t\t\t\theldTime\n\t\t\t});\n\t\t}\n\t}\n}\n\ntype ZoneOptions = BaseNode | Partial<ZylemZoneOptions>;\n\nexport async function zone(...args: Array<ZoneOptions>): Promise<ZylemZone> {\n\treturn createEntity<ZylemZone, ZylemZoneOptions>({\n\t\targs,\n\t\tdefaultConfig: zoneDefaults,\n\t\tEntityClass: ZylemZone,\n\t\tBuilderClass: ZoneBuilder,\n\t\tCollisionBuilderClass: ZoneCollisionBuilder,\n\t\tentityType: ZylemZone.type\n\t});\n}","import { proxy, subscribe } from 'valtio/vanilla';\nimport { getByPath, setByPath } from '../core/utility/path-utils';\nimport { gameEventBus } from './game-event-bus';\n\n/**\n * Internal game state store using valtio proxy for reactivity.\n */\nconst state = proxy({\n\tid: '',\n\tglobals: {} as Record<string, unknown>,\n\ttime: 0,\n});\n\n/**\n * Track active subscriptions for cleanup on game dispose.\n */\nconst activeSubscriptions: Set<() => void> = new Set();\n\n/**\n * Set a global value by path.\n * Emits a 'game:state:updated' event when the value changes.\n * @example setGlobal('score', 100)\n * @example setGlobal('player.health', 50)\n */\nexport function setGlobal(path: string, value: unknown): void {\n\tconst previousValue = getByPath(state.globals, path);\n\tsetByPath(state.globals, path, value);\n\n\tgameEventBus.emit('game:state:updated', {\n\t\tpath,\n\t\tvalue,\n\t\tpreviousValue,\n\t});\n}\n\n/**\n * Create/initialize a global with a default value.\n * Only sets the value if it doesn't already exist.\n * Use this to ensure globals have initial values before game starts.\n * @example createGlobal('score', 0)\n * @example createGlobal('player.health', 100)\n */\nexport function createGlobal<T>(path: string, defaultValue: T): T {\n\tconst existing = getByPath<T>(state.globals, path);\n\tif (existing === undefined) {\n\t\tsetByPath(state.globals, path, defaultValue);\n\t\treturn defaultValue;\n\t}\n\treturn existing;\n}\n\n/**\n * Get a global value by path.\n * @example getGlobal('score') // 100\n * @example getGlobal<number>('player.health') // 50\n */\nexport function getGlobal<T = unknown>(path: string): T | undefined {\n\treturn getByPath<T>(state.globals, path);\n}\n\n/**\n * Subscribe to changes on a global value at a specific path.\n * Returns an unsubscribe function. Subscriptions are automatically\n * cleaned up when the game is disposed.\n * @example const unsub = onGlobalChange('score', (val) => console.log(val));\n */\nexport function onGlobalChange<T = unknown>(\n\tpath: string,\n\tcallback: (value: T) => void\n): () => void {\n\tlet previous = getByPath<T>(state.globals, path);\n\tconst unsub = subscribe(state.globals, () => {\n\t\tconst current = getByPath<T>(state.globals, path);\n\t\tif (current !== previous) {\n\t\t\tprevious = current;\n\t\t\tcallback(current as T);\n\t\t}\n\t});\n\tactiveSubscriptions.add(unsub);\n\treturn () => {\n\t\tunsub();\n\t\tactiveSubscriptions.delete(unsub);\n\t};\n}\n\n/**\n * Subscribe to changes on multiple global paths.\n * Callback fires when any of the paths change, receiving all current values.\n * Subscriptions are automatically cleaned up when the game is disposed.\n * @example const unsub = onGlobalChanges(['score', 'lives'], ([score, lives]) => console.log(score, lives));\n */\nexport function onGlobalChanges<T extends unknown[] = unknown[]>(\n\tpaths: string[],\n\tcallback: (values: T) => void\n): () => void {\n\tlet previousValues = paths.map(p => getByPath(state.globals, p));\n\tconst unsub = subscribe(state.globals, () => {\n\t\tconst currentValues = paths.map(p => getByPath(state.globals, p));\n\t\tconst hasChange = currentValues.some((val, i) => val !== previousValues[i]);\n\t\tif (hasChange) {\n\t\t\tpreviousValues = currentValues;\n\t\t\tcallback(currentValues as T);\n\t\t}\n\t});\n\tactiveSubscriptions.add(unsub);\n\treturn () => {\n\t\tunsub();\n\t\tactiveSubscriptions.delete(unsub);\n\t};\n}\n\n/**\n * Get the entire globals object (read-only snapshot).\n */\nexport function getGlobals<T = Record<string, unknown>>(): T {\n\treturn state.globals as T;\n}\n\n/**\n * Initialize globals from an object. Used internally during game setup.\n */\nexport function initGlobals(globals: Record<string, unknown>): void {\n\tfor (const [key, value] of Object.entries(globals)) {\n\t\tsetByPath(state.globals, key, value);\n\t}\n}\n\n/**\n * Reset all globals. Used internally on game dispose.\n */\nexport function resetGlobals(): void {\n\tstate.globals = {};\n}\n\n/**\n * Unsubscribe all active global subscriptions.\n * Used internally on game dispose to prevent old callbacks from firing.\n */\nexport function clearGlobalSubscriptions(): void {\n\tfor (const unsub of activeSubscriptions) {\n\t\tunsub();\n\t}\n\tactiveSubscriptions.clear();\n}\n\nexport { state };","import { ActiveCollisionTypes, ColliderDesc } from '@dimforge/rapier3d-compat';\nimport { BufferGeometry, Object3D, SkinnedMesh, Group, Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { createEntity } from './create';\nimport { UpdateContext, UpdateFunction } from '../core/base-node-life-cycle';\nimport { EntityAssetLoader } from '../core/entity-asset-loader';\nimport { EntityLoaderDelegate } from './delegates/loader';\nimport { Vec3 } from '../core/vector';\nimport { AnimationDelegate, AnimationOptions } from './delegates/animation';\nimport { MaterialOptions } from '../graphics/material';\nimport { DebugInfoProvider } from './delegates/debug';\nimport { EntityBuilder } from './builder';\nimport { EntityCollisionBuilder } from './builder';\n\ntype AnimationObject = {\n\tkey?: string;\n\tpath: string;\n};\n\ntype ZylemActorOptions = GameEntityOptions & {\n\tstatic?: boolean;\n\tanimations?: AnimationObject[];\n\tmodels?: string[];\n\tscale?: Vec3;\n\tmaterial?: MaterialOptions;\n};\n\nconst actorDefaults: ZylemActorOptions = {\n\tposition: { x: 0, y: 0, z: 0 },\n\tcollision: {\n\t\tstatic: false,\n\t\tsize: new Vector3(0.5, 0.5, 0.5),\n\t\tposition: new Vector3(0, 0, 0),\n\t},\n\tmaterial: {\n\t\tshader: 'standard',\n\t},\n\tanimations: [],\n\tmodels: []\n};\n\nclass ActorCollisionBuilder extends EntityCollisionBuilder {\n\tprivate height: number = 1;\n\tprivate objectModel: Group | null = null;\n\n\tconstructor(data: any) {\n\t\tsuper();\n\t\tthis.objectModel = data.objectModel;\n\t}\n\n\tcreateColliderFromObjectModel(objectModel: Group | null): ColliderDesc {\n\t\tif (!objectModel) return ColliderDesc.capsule(1, 1);\n\n\t\tconst skinnedMesh = objectModel.children.find(child => child instanceof SkinnedMesh) as SkinnedMesh;\n\t\tconst geometry = skinnedMesh.geometry as BufferGeometry;\n\n\t\tif (geometry) {\n\t\t\tgeometry.computeBoundingBox();\n\t\t\tif (geometry.boundingBox) {\n\t\t\t\tconst maxY = geometry.boundingBox.max.y;\n\t\t\t\tconst minY = geometry.boundingBox.min.y;\n\t\t\t\tthis.height = maxY - minY;\n\t\t\t}\n\t\t}\n\t\tthis.height = 1;\n\t\tlet colliderDesc = ColliderDesc.capsule(this.height / 2, 1);\n\t\tcolliderDesc.setSensor(false);\n\t\tcolliderDesc.setTranslation(0, this.height + 0.5, 0);\n\t\tcolliderDesc.activeCollisionTypes = ActiveCollisionTypes.DEFAULT;\n\n\t\treturn colliderDesc;\n\t}\n\n\tcollider(options: ZylemActorOptions): ColliderDesc {\n\t\tlet colliderDesc = this.createColliderFromObjectModel(this.objectModel);\n\n\t\treturn colliderDesc;\n\t}\n}\n\nclass ActorBuilder extends EntityBuilder<ZylemActor, ZylemActorOptions> {\n\tprotected createEntity(options: Partial<ZylemActorOptions>): ZylemActor {\n\t\treturn new ZylemActor(options);\n\t}\n}\n\nexport const ACTOR_TYPE = Symbol('Actor');\n\nexport class ZylemActor extends GameEntity<ZylemActorOptions> implements EntityLoaderDelegate, DebugInfoProvider {\n\tstatic type = ACTOR_TYPE;\n\n\tprivate _object: Object3D | null = null;\n\tprivate _animationDelegate: AnimationDelegate | null = null;\n\tprivate _modelFileNames: string[] = [];\n\tprivate _assetLoader: EntityAssetLoader = new EntityAssetLoader();\n\n\tcontrolledRotation: boolean = false;\n\n\tconstructor(options?: ZylemActorOptions) {\n\t\tsuper();\n\t\tthis.options = { ...actorDefaults, ...options };\n\t\t// Add actor-specific update to the lifecycle callbacks\n\t\tthis.prependUpdate(this.actorUpdate.bind(this) as UpdateFunction<this>);\n\t\tthis.controlledRotation = true;\n\t}\n\n\tasync load(): Promise<void> {\n\t\tthis._modelFileNames = this.options.models || [];\n\t\tawait this.loadModels();\n\t\tif (this._object) {\n\t\t\tthis._animationDelegate = new AnimationDelegate(this._object);\n\t\t\tawait this._animationDelegate.loadAnimations(this.options.animations || []);\n\t\t}\n\t}\n\n\tasync data(): Promise<any> {\n\t\treturn {\n\t\t\tanimations: this._animationDelegate?.animations,\n\t\t\tobjectModel: this._object,\n\t\t};\n\t}\n\n\tasync actorUpdate(params: UpdateContext<ZylemActorOptions>): Promise<void> {\n\t\tthis._animationDelegate?.update(params.delta);\n\t}\n\n\t/**\n\t * Clean up actor resources including animations, models, and groups\n\t */\n\tactorDestroy(): void {\n\t\t// Stop and dispose animation delegate\n\t\tif (this._animationDelegate) {\n\t\t\tthis._animationDelegate.dispose();\n\t\t\tthis._animationDelegate = null;\n\t\t}\n\n\t\t// Dispose geometries and materials from loaded object\n\t\tif (this._object) {\n\t\t\tthis._object.traverse((child) => {\n\t\t\t\tif ((child as any).isMesh) {\n\t\t\t\t\tconst mesh = child as SkinnedMesh;\n\t\t\t\t\tmesh.geometry?.dispose();\n\t\t\t\t\tif (Array.isArray(mesh.material)) {\n\t\t\t\t\t\tmesh.material.forEach(m => m.dispose());\n\t\t\t\t\t} else if (mesh.material) {\n\t\t\t\t\t\tmesh.material.dispose();\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tthis._object = null;\n\t\t}\n\n\t\t// Clear group reference\n\t\tif (this.group) {\n\t\t\tthis.group.clear();\n\t\t\tthis.group = null as any;\n\t\t}\n\n\t\t// Clear file name references\n\t\tthis._modelFileNames = [];\n\t}\n\n\tprivate async loadModels(): Promise<void> {\n\t\tif (this._modelFileNames.length === 0) return;\n\t\tconst promises = this._modelFileNames.map(file => this._assetLoader.loadFile(file));\n\t\tconst results = await Promise.all(promises);\n\t\tif (results[0]?.object) {\n\t\t\tthis._object = results[0].object;\n\t\t}\n\t\tif (this._object) {\n\t\t\tthis.group = new Group();\n\t\t\tthis.group.attach(this._object);\n\t\t\tthis.group.scale.set(\n\t\t\t\tthis.options.scale?.x || 1,\n\t\t\t\tthis.options.scale?.y || 1,\n\t\t\t\tthis.options.scale?.z || 1\n\t\t\t);\n\t\t}\n\t}\n\n\tplayAnimation(animationOptions: AnimationOptions) {\n\t\tthis._animationDelegate?.playAnimation(animationOptions);\n\t}\n\n\tget object(): Object3D | null {\n\t\treturn this._object;\n\t}\n\n\t/**\n\t * Provide custom debug information for the actor\n\t * This will be merged with the default debug information\n\t */\n\tgetDebugInfo(): Record<string, any> {\n\t\tconst debugInfo: Record<string, any> = {\n\t\t\ttype: 'Actor',\n\t\t\tmodels: this._modelFileNames.length > 0 ? this._modelFileNames : 'none',\n\t\t\tmodelLoaded: !!this._object,\n\t\t\tscale: this.options.scale ?\n\t\t\t\t`${this.options.scale.x}, ${this.options.scale.y}, ${this.options.scale.z}` :\n\t\t\t\t'1, 1, 1',\n\t\t};\n\n\t\t// Add animation info if available\n\t\tif (this._animationDelegate) {\n\t\t\tdebugInfo.currentAnimation = this._animationDelegate.currentAnimationKey || 'none';\n\t\t\tdebugInfo.animationsCount = this.options.animations?.length || 0;\n\t\t}\n\n\t\t// Add mesh info if model is loaded\n\t\tif (this._object) {\n\t\t\tlet meshCount = 0;\n\t\t\tlet vertexCount = 0;\n\t\t\tthis._object.traverse((child) => {\n\t\t\t\tif ((child as any).isMesh) {\n\t\t\t\t\tmeshCount++;\n\t\t\t\t\tconst geometry = (child as SkinnedMesh).geometry;\n\t\t\t\t\tif (geometry && geometry.attributes.position) {\n\t\t\t\t\t\tvertexCount += geometry.attributes.position.count;\n\t\t\t\t\t}\n\t\t\t\t}\n\t\t\t});\n\t\t\tdebugInfo.meshCount = meshCount;\n\t\t\tdebugInfo.vertexCount = vertexCount;\n\t\t}\n\n\t\treturn debugInfo;\n\t}\n}\n\ntype ActorOptions = BaseNode | ZylemActorOptions;\n\nexport async function actor(...args: Array<ActorOptions>): Promise<ZylemActor> {\n\treturn await createEntity<ZylemActor, ZylemActorOptions>({\n\t\targs,\n\t\tdefaultConfig: actorDefaults,\n\t\tEntityClass: ZylemActor,\n\t\tBuilderClass: ActorBuilder,\n\t\tCollisionBuilderClass: ActorCollisionBuilder,\n\t\tentityType: ZylemActor.type\n\t});\n}","import { AnimationClip, Object3D } from 'three';\nimport { FBXLoader } from 'three/addons/loaders/FBXLoader.js';\nimport { GLTF, GLTFLoader } from 'three/addons/loaders/GLTFLoader.js';\n\nenum FileExtensionTypes {\n\tFBX = 'fbx',\n\tGLTF = 'gltf'\n}\n\nexport interface AssetLoaderResult {\n\tobject?: Object3D;\n\tanimation?: AnimationClip;\n\tgltf?: GLTF;\n}\n\nexport interface IAssetLoader {\n\tload(file: string): Promise<AssetLoaderResult>;\n\tisSupported(file: string): boolean;\n}\n\nclass FBXAssetLoader implements IAssetLoader {\n\tprivate loader: FBXLoader = new FBXLoader();\n\n\tisSupported(file: string): boolean {\n\t\treturn file.toLowerCase().endsWith(FileExtensionTypes.FBX);\n\t}\n\n\tasync load(file: string): Promise<AssetLoaderResult> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.loader.load(\n\t\t\t\tfile,\n\t\t\t\t(object: Object3D) => {\n\t\t\t\t\tconst animation = object.animations[0];\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tobject,\n\t\t\t\t\t\tanimation\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\t}\n}\n\nclass GLTFAssetLoader implements IAssetLoader {\n\tprivate loader: GLTFLoader = new GLTFLoader();\n\n\tisSupported(file: string): boolean {\n\t\treturn file.toLowerCase().endsWith(FileExtensionTypes.GLTF);\n\t}\n\n\tasync load(file: string): Promise<AssetLoaderResult> {\n\t\treturn new Promise((resolve, reject) => {\n\t\t\tthis.loader.load(\n\t\t\t\tfile,\n\t\t\t\t(gltf: GLTF) => {\n\t\t\t\t\tresolve({\n\t\t\t\t\t\tobject: gltf.scene,\n\t\t\t\t\t\tgltf\n\t\t\t\t\t});\n\t\t\t\t},\n\t\t\t\tundefined,\n\t\t\t\treject\n\t\t\t);\n\t\t});\n\t}\n}\n\nexport class EntityAssetLoader {\n\tprivate loaders: IAssetLoader[] = [\n\t\tnew FBXAssetLoader(),\n\t\tnew GLTFAssetLoader()\n\t];\n\n\tasync loadFile(file: string): Promise<AssetLoaderResult> {\n\t\tconst loader = this.loaders.find(l => l.isSupported(file));\n\n\t\tif (!loader) {\n\t\t\tthrow new Error(`Unsupported file type: ${file}`);\n\t\t}\n\n\t\treturn loader.load(file);\n\t}\n}\n","import {\n\tAnimationAction,\n\tAnimationClip,\n\tAnimationMixer,\n\tLoopOnce,\n\tLoopRepeat,\n\tObject3D,\n} from 'three';\nimport { EntityAssetLoader, AssetLoaderResult } from '../../core/entity-asset-loader';\n\nexport type AnimationOptions = {\n\tkey: string;\n\tpauseAtEnd?: boolean;\n\tpauseAtPercentage?: number;\n\tfadeToKey?: string;\n\tfadeDuration?: number;\n};\n\ntype AnimationObject = {\n\tkey?: string;\n\tpath: string;\n};\n\nexport class AnimationDelegate {\n\tprivate _mixer: AnimationMixer | null = null;\n\tprivate _actions: Record<string, AnimationAction> = {};\n\tprivate _animations: AnimationClip[] = [];\n\tprivate _currentAction: AnimationAction | null = null;\n\n\tprivate _pauseAtPercentage = 0;\n\tprivate _isPaused = false;\n\tprivate _queuedKey: string | null = null;\n\tprivate _fadeDuration = 0.5;\n\n\tprivate _currentKey: string = '';\n\tprivate _assetLoader = new EntityAssetLoader();\n\n\tconstructor(private target: Object3D) { }\n\n\tasync loadAnimations(animations: AnimationObject[]): Promise<void> {\n\t\tif (!animations.length) return;\n\n\t\tconst results = await Promise.all(animations.map(a => this._assetLoader.loadFile(a.path)));\n\t\tthis._animations = results\n\t\t\t.filter((r): r is AssetLoaderResult => !!r.animation)\n\t\t\t.map(r => r.animation!);\n\n\t\tif (!this._animations.length) return;\n\n\t\tthis._mixer = new AnimationMixer(this.target);\n\t\tthis._animations.forEach((clip, i) => {\n\t\t\tconst key = animations[i].key || i.toString();\n\t\t\tthis._actions[key] = this._mixer!.clipAction(clip);\n\t\t});\n\n\t\tthis.playAnimation({ key: Object.keys(this._actions)[0] });\n\t}\n\n\tupdate(delta: number): void {\n\t\tif (!this._mixer || !this._currentAction) return;\n\n\t\tthis._mixer.update(delta);\n\n\t\tconst pauseAtTime = this._currentAction.getClip().duration * (this._pauseAtPercentage / 100);\n\t\tif (\n\t\t\t!this._isPaused &&\n\t\t\tthis._pauseAtPercentage > 0 &&\n\t\t\tthis._currentAction.time >= pauseAtTime\n\t\t) {\n\t\t\tthis._currentAction.time = pauseAtTime;\n\t\t\tthis._currentAction.paused = true;\n\t\t\tthis._isPaused = true;\n\n\t\t\tif (this._queuedKey !== null) {\n\t\t\t\tconst next = this._actions[this._queuedKey];\n\t\t\t\tnext.reset().play();\n\t\t\t\tthis._currentAction.crossFadeTo(next, this._fadeDuration, false);\n\t\t\t\tthis._currentAction = next;\n\t\t\t\tthis._currentKey = this._queuedKey;\n\t\t\t\tthis._queuedKey = null;\n\t\t\t}\n\t\t}\n\t}\n\n\tplayAnimation(opts: AnimationOptions): void {\n\t\tif (!this._mixer) return;\n\t\tconst { key, pauseAtPercentage = 0, pauseAtEnd = false, fadeToKey, fadeDuration = 0.5 } = opts;\n\t\tif (key === this._currentKey) return;\n\n\t\tthis._queuedKey = fadeToKey || null;\n\t\tthis._fadeDuration = fadeDuration;\n\n\t\tthis._pauseAtPercentage = pauseAtEnd ? 100 : pauseAtPercentage;\n\t\tthis._isPaused = false;\n\n\t\tconst prev = this._currentAction;\n\t\tif (prev) prev.stop();\n\n\t\tconst action = this._actions[key];\n\t\tif (!action) return;\n\n\t\tif (this._pauseAtPercentage > 0) {\n\t\t\taction.setLoop(LoopOnce, Infinity);\n\t\t\taction.clampWhenFinished = true;\n\t\t} else {\n\t\t\taction.setLoop(LoopRepeat, Infinity);\n\t\t\taction.clampWhenFinished = false;\n\t\t}\n\n\t\tif (prev) {\n\t\t\tprev.crossFadeTo(action, fadeDuration, false);\n\t\t}\n\t\taction.reset().play();\n\n\t\tthis._currentAction = action;\n\t\tthis._currentKey = key;\n\t}\n\n\t/**\n\t * Dispose of all animation resources\n\t */\n\tdispose(): void {\n\t\t// Stop all actions\n\t\tObject.values(this._actions).forEach(action => {\n\t\t\taction.stop();\n\t\t});\n\n\t\t// Stop and uncache mixer\n\t\tif (this._mixer) {\n\t\t\tthis._mixer.stopAllAction();\n\t\t\tthis._mixer.uncacheRoot(this.target);\n\t\t\tthis._mixer = null;\n\t\t}\n\n\t\t// Clear references\n\t\tthis._actions = {};\n\t\tthis._animations = [];\n\t\tthis._currentAction = null;\n\t\tthis._currentKey = '';\n\t}\n\n\tget currentAnimationKey() { return this._currentKey; }\n\tget animations() { return this._animations; }\n}\n","import { Color, Group, Sprite as ThreeSprite, SpriteMaterial, CanvasTexture, LinearFilter, Vector2, PerspectiveCamera, OrthographicCamera, ClampToEdgeWrapping } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { createEntity } from './create';\nimport { UpdateContext, SetupContext } from '../core/base-node-life-cycle';\nimport { ZylemCamera } from '../camera/zylem-camera';\nimport { DebugDelegate } from './delegates/debug';\n\ntype ZylemTextOptions = GameEntityOptions & {\n\ttext?: string;\n\tfontFamily?: string;\n\tfontSize?: number;\n\tfontColor?: Color | string;\n\tbackgroundColor?: Color | string | null;\n\tpadding?: number;\n\tstickToViewport?: boolean;\n\tscreenPosition?: Vector2;\n\tzDistance?: number;\n};\n\nconst textDefaults: ZylemTextOptions = {\n\tposition: undefined,\n\ttext: '',\n\tfontFamily: 'Menlo, Monaco, Consolas, \"Liberation Mono\", \"Courier New\", monospace',\n\tfontSize: 18,\n\tfontColor: '#FFFFFF',\n\tbackgroundColor: null,\n\tpadding: 4,\n\tstickToViewport: true,\n\tscreenPosition: new Vector2(24, 24),\n\tzDistance: 1,\n};\n\nexport class TextBuilder extends EntityBuilder<ZylemText, ZylemTextOptions> {\n\tprotected createEntity(options: Partial<ZylemTextOptions>): ZylemText {\n\t\treturn new ZylemText(options);\n\t}\n}\n\nexport const TEXT_TYPE = Symbol('Text');\n\nexport class ZylemText extends GameEntity<ZylemTextOptions> {\n\tstatic type = TEXT_TYPE;\n\n\tprivate _sprite: ThreeSprite | null = null;\n\tprivate _texture: CanvasTexture | null = null;\n\tprivate _canvas: HTMLCanvasElement | null = null;\n\tprivate _ctx: CanvasRenderingContext2D | null = null;\n\tprivate _cameraRef: ZylemCamera | null = null;\n\tprivate _lastCanvasW: number = 0;\n\tprivate _lastCanvasH: number = 0;\n\n\tconstructor(options?: ZylemTextOptions) {\n\t\tsuper();\n\t\tthis.options = { ...textDefaults, ...options } as ZylemTextOptions;\n\t\t// Add text-specific lifecycle callbacks (only registered once)\n\t\tthis.prependSetup(this.textSetup.bind(this) as any);\n\t\tthis.prependUpdate(this.textUpdate.bind(this) as any);\n\t\tthis.onDestroy(this.textDestroy.bind(this) as any);\n\t}\n\n\tpublic create(): this {\n\t\t// Clear previous state to prevent issues on reload\n\t\tthis._sprite = null;\n\t\tthis._texture = null;\n\t\tthis._canvas = null;\n\t\tthis._ctx = null;\n\t\tthis._lastCanvasW = 0;\n\t\tthis._lastCanvasH = 0;\n\t\tthis.group = new Group();\n\t\t\n\t\t// Recreate the sprite\n\t\tthis.createSprite();\n\t\t\n\t\t// Call parent create\n\t\treturn super.create();\n\t}\n\n\tprivate createSprite() {\n\t\tthis._canvas = document.createElement('canvas');\n\t\tthis._ctx = this._canvas.getContext('2d');\n\t\tthis._texture = new CanvasTexture(this._canvas);\n\t\tthis._texture.minFilter = LinearFilter;\n\t\tthis._texture.magFilter = LinearFilter;\n\t\tconst material = new SpriteMaterial({\n\t\t\tmap: this._texture,\n\t\t\ttransparent: true,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\talphaTest: 0.5,\n\t\t});\n\t\tthis._sprite = new ThreeSprite(material);\n\t\tthis.group?.add(this._sprite);\n\t\tthis.redrawText(this.options.text ?? '');\n\t}\n\n\tprivate measureAndResizeCanvas(text: string, fontSize: number, fontFamily: string, padding: number) {\n\t\tif (!this._canvas || !this._ctx) return { sizeChanged: false };\n\t\tthis._ctx.font = `${fontSize}px ${fontFamily}`;\n\t\tconst metrics = this._ctx.measureText(text);\n\t\tconst textWidth = Math.ceil(metrics.width);\n\t\tconst textHeight = Math.ceil(fontSize * 1.4);\n\t\tconst nextW = Math.max(2, textWidth + padding * 2);\n\t\tconst nextH = Math.max(2, textHeight + padding * 2);\n\t\tconst sizeChanged = nextW !== this._lastCanvasW || nextH !== this._lastCanvasH;\n\t\tthis._canvas.width = nextW;\n\t\tthis._canvas.height = nextH;\n\t\tthis._lastCanvasW = nextW;\n\t\tthis._lastCanvasH = nextH;\n\t\treturn { sizeChanged };\n\t}\n\n\tprivate drawCenteredText(text: string, fontSize: number, fontFamily: string) {\n\t\tif (!this._canvas || !this._ctx) return;\n\t\tthis._ctx.font = `${fontSize}px ${fontFamily}`;\n\t\tthis._ctx.textAlign = 'center';\n\t\tthis._ctx.textBaseline = 'middle';\n\t\tthis._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n\t\tif (this.options.backgroundColor) {\n\t\t\tthis._ctx.fillStyle = this.toCssColor(this.options.backgroundColor);\n\t\t\tthis._ctx.fillRect(0, 0, this._canvas.width, this._canvas.height);\n\t\t}\n\t\tthis._ctx.fillStyle = this.toCssColor(this.options.fontColor ?? '#FFFFFF');\n\t\tthis._ctx.fillText(text, this._canvas.width / 2, this._canvas.height / 2);\n\t}\n\n\tprivate updateTexture(sizeChanged: boolean) {\n\t\tif (!this._texture || !this._canvas) return;\n\t\tif (sizeChanged) {\n\t\t\tthis._texture.dispose();\n\t\t\tthis._texture = new CanvasTexture(this._canvas);\n\t\t\tthis._texture.minFilter = LinearFilter;\n\t\t\tthis._texture.magFilter = LinearFilter;\n\t\t\tthis._texture.wrapS = ClampToEdgeWrapping;\n\t\t\tthis._texture.wrapT = ClampToEdgeWrapping;\n\t\t}\n\t\tthis._texture.image = this._canvas;\n\t\tthis._texture.needsUpdate = true;\n\t\tif (this._sprite && this._sprite.material) {\n\t\t\t(this._sprite.material as any).map = this._texture;\n\t\t\tthis._sprite.material.needsUpdate = true;\n\t\t}\n\t}\n\n\tprivate redrawText(_text: string) {\n\t\tif (!this._canvas || !this._ctx) return;\n\t\tconst fontSize = this.options.fontSize ?? 18;\n\t\tconst fontFamily = this.options.fontFamily ?? (textDefaults.fontFamily as string);\n\t\tconst padding = this.options.padding ?? 4;\n\n\t\tconst { sizeChanged } = this.measureAndResizeCanvas(_text, fontSize, fontFamily, padding);\n\t\tthis.drawCenteredText(_text, fontSize, fontFamily);\n\t\tthis.updateTexture(Boolean(sizeChanged));\n\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate toCssColor(color: Color | string): string {\n\t\tif (typeof color === 'string') return color;\n\t\tconst c = color instanceof Color ? color : new Color(color as any);\n\t\treturn `#${c.getHexString()}`;\n\t}\n\n\tprivate textSetup(params: SetupContext<ZylemTextOptions>) {\n\t\tthis._cameraRef = (params.camera as unknown) as ZylemCamera | null;\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\t(this._cameraRef.camera as any).add(this.group);\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate textUpdate(params: UpdateContext<ZylemTextOptions>) {\n\t\tif (!this._sprite) return;\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate getResolution() {\n\t\treturn {\n\t\t\twidth: this._cameraRef?.screenResolution.x ?? 1,\n\t\t\theight: this._cameraRef?.screenResolution.y ?? 1,\n\t\t};\n\t}\n\n\tprivate getScreenPixels(sp: Vector2, width: number, height: number) {\n\t\tconst isPercentX = sp.x >= 0 && sp.x <= 1;\n\t\tconst isPercentY = sp.y >= 0 && sp.y <= 1;\n\t\treturn {\n\t\t\tpx: isPercentX ? sp.x * width : sp.x,\n\t\t\tpy: isPercentY ? sp.y * height : sp.y,\n\t\t};\n\t}\n\n\tprivate computeWorldExtents(camera: PerspectiveCamera | OrthographicCamera, zDist: number) {\n\t\tlet worldHalfW = 1;\n\t\tlet worldHalfH = 1;\n\t\tif ((camera as PerspectiveCamera).isPerspectiveCamera) {\n\t\t\tconst pc = camera as PerspectiveCamera;\n\t\t\tconst halfH = Math.tan((pc.fov * Math.PI) / 180 / 2) * zDist;\n\t\t\tconst halfW = halfH * pc.aspect;\n\t\t\tworldHalfW = halfW;\n\t\t\tworldHalfH = halfH;\n\t\t} else if ((camera as OrthographicCamera).isOrthographicCamera) {\n\t\t\tconst oc = camera as OrthographicCamera;\n\t\t\tworldHalfW = (oc.right - oc.left) / 2;\n\t\t\tworldHalfH = (oc.top - oc.bottom) / 2;\n\t\t}\n\t\treturn { worldHalfW, worldHalfH };\n\t}\n\n\tprivate updateSpriteScale(worldHalfH: number, viewportHeight: number) {\n\t\tif (!this._canvas || !this._sprite) return;\n\t\tconst planeH = worldHalfH * 2;\n\t\tconst unitsPerPixel = planeH / viewportHeight;\n\t\tconst pixelH = this._canvas.height;\n\t\tconst scaleY = Math.max(0.0001, pixelH * unitsPerPixel);\n\t\tconst aspect = this._canvas.width / this._canvas.height;\n\t\tconst scaleX = scaleY * aspect;\n\t\tthis._sprite.scale.set(scaleX, scaleY, 1);\n\t}\n\n\tprivate updateStickyTransform() {\n\t\tif (!this._sprite || !this._cameraRef) return;\n\t\tconst camera = this._cameraRef.camera as PerspectiveCamera | OrthographicCamera;\n\t\tconst { width, height } = this.getResolution();\n\t\tconst sp = this.options.screenPosition ?? new Vector2(24, 24);\n\t\tconst { px, py } = this.getScreenPixels(sp, width, height);\n\t\tconst zDist = Math.max(0.001, this.options.zDistance ?? 1);\n\t\tconst { worldHalfW, worldHalfH } = this.computeWorldExtents(camera, zDist);\n\n\t\tconst ndcX = (px / width) * 2 - 1;\n\t\tconst ndcY = 1 - (py / height) * 2;\n\t\tconst localX = ndcX * worldHalfW;\n\t\tconst localY = ndcY * worldHalfH;\n\t\tthis.group?.position.set(localX, localY, -zDist);\n\t\tthis.updateSpriteScale(worldHalfH, height);\n\t}\n\n\tupdateText(_text: string) {\n\t\tthis.options.text = _text;\n\t\tthis.redrawText(_text);\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemText.type),\n\t\t\ttext: this.options.text ?? '',\n\t\t\tsticky: this.options.stickToViewport,\n\t\t};\n\t}\n\n\t/**\n\t * Dispose of Three.js resources when the entity is destroyed.\n\t */\n\tprivate async textDestroy(): Promise<void> {\n\t\t// Dispose texture\n\t\tthis._texture?.dispose();\n\t\t\n\t\t// Dispose sprite material\n\t\tif (this._sprite?.material) {\n\t\t\t(this._sprite.material as SpriteMaterial).dispose();\n\t\t}\n\t\t\n\t\t// Remove sprite from group\n\t\tif (this._sprite) {\n\t\t\tthis._sprite.removeFromParent();\n\t\t}\n\t\t\n\t\t// Remove group from parent (camera or scene)\n\t\tthis.group?.removeFromParent();\n\t\t\n\t\t// Clear references\n\t\tthis._sprite = null;\n\t\tthis._texture = null;\n\t\tthis._canvas = null;\n\t\tthis._ctx = null;\n\t\tthis._cameraRef = null;\n\t}\n}\n\ntype TextOptions = BaseNode | Partial<ZylemTextOptions>;\n\nexport async function text(...args: Array<TextOptions>): Promise<ZylemText> {\n\treturn createEntity<ZylemText, ZylemTextOptions>({\n\t\targs,\n\t\tdefaultConfig: { ...textDefaults },\n\t\tEntityClass: ZylemText,\n\t\tBuilderClass: TextBuilder,\n\t\tentityType: ZylemText.type,\n\t});\n}\n\n\n","import { Color, Group, Sprite as ThreeSprite, SpriteMaterial, CanvasTexture, LinearFilter, Vector2, PerspectiveCamera, OrthographicCamera, ClampToEdgeWrapping, ShaderMaterial, Mesh, PlaneGeometry, Vector3 } from 'three';\nimport { BaseNode } from '../core/base-node';\nimport { GameEntityOptions, GameEntity } from './entity';\nimport { EntityBuilder } from './builder';\nimport { createEntity } from './create';\nimport { UpdateContext, SetupContext } from '../core/base-node-life-cycle';\nimport { ZylemCamera } from '../camera/zylem-camera';\nimport { DebugDelegate } from './delegates/debug';\n\ntype ZylemRectOptions = GameEntityOptions & {\n\twidth?: number;\n\theight?: number;\n\tfillColor?: Color | string | null;\n\tstrokeColor?: Color | string | null;\n\tstrokeWidth?: number;\n\tradius?: number;\n\tpadding?: number;\n\tstickToViewport?: boolean;\n\tscreenPosition?: Vector2;\n\tzDistance?: number;\n\tanchor?: Vector2; // 0-100 per axis, default top-left (0,0)\n\tbounds?: {\n\t\tscreen?: { x: number; y: number; width: number; height: number };\n\t\tworld?: { left: number; right: number; top: number; bottom: number; z?: number };\n\t};\n};\n\nconst rectDefaults: ZylemRectOptions = {\n\tposition: undefined,\n\twidth: 120,\n\theight: 48,\n\tfillColor: '#FFFFFF',\n\tstrokeColor: null,\n\tstrokeWidth: 0,\n\tradius: 0,\n\tpadding: 0,\n\tstickToViewport: true,\n\tscreenPosition: new Vector2(24, 24),\n\tzDistance: 1,\n\tanchor: new Vector2(0, 0),\n};\n\nexport class RectBuilder extends EntityBuilder<ZylemRect, ZylemRectOptions> {\n\tprotected createEntity(options: Partial<ZylemRectOptions>): ZylemRect {\n\t\treturn new ZylemRect(options);\n\t}\n}\n\nexport const RECT_TYPE = Symbol('Rect');\n\nexport class ZylemRect extends GameEntity<ZylemRectOptions> {\n\tstatic type = RECT_TYPE;\n\n\tprivate _sprite: ThreeSprite | null = null;\n\tprivate _mesh: Mesh | null = null;\n\tprivate _texture: CanvasTexture | null = null;\n\tprivate _canvas: HTMLCanvasElement | null = null;\n\tprivate _ctx: CanvasRenderingContext2D | null = null;\n\tprivate _cameraRef: ZylemCamera | null = null;\n\tprivate _lastCanvasW: number = 0;\n\tprivate _lastCanvasH: number = 0;\n\n\tconstructor(options?: ZylemRectOptions) {\n\t\tsuper();\n\t\tthis.options = { ...rectDefaults, ...options } as ZylemRectOptions;\n\t\tthis.group = new Group();\n\t\tthis.createSprite();\n\t\t// Add rect-specific lifecycle callbacks\n\t\tthis.prependSetup(this.rectSetup.bind(this) as any);\n\t\tthis.prependUpdate(this.rectUpdate.bind(this) as any);\n\t}\n\n\tprivate createSprite() {\n\t\tthis._canvas = document.createElement('canvas');\n\t\tthis._ctx = this._canvas.getContext('2d');\n\t\tthis._texture = new CanvasTexture(this._canvas);\n\t\tthis._texture.minFilter = LinearFilter;\n\t\tthis._texture.magFilter = LinearFilter;\n\t\tconst material = new SpriteMaterial({\n\t\t\tmap: this._texture,\n\t\t\ttransparent: true,\n\t\t\tdepthTest: false,\n\t\t\tdepthWrite: false,\n\t\t\talphaTest: 0.5,\n\t\t});\n\t\tthis._sprite = new ThreeSprite(material);\n\t\tthis.group?.add(this._sprite);\n\t\tthis.redrawRect();\n\t}\n\n\tprivate redrawRect() {\n\t\tif (!this._canvas || !this._ctx) return;\n\t\tconst width = Math.max(2, Math.floor((this.options.width ?? 120)));\n\t\tconst height = Math.max(2, Math.floor((this.options.height ?? 48)));\n\t\tconst padding = this.options.padding ?? 0;\n\t\tconst strokeWidth = this.options.strokeWidth ?? 0;\n\t\tconst totalW = width + padding * 2 + strokeWidth;\n\t\tconst totalH = height + padding * 2 + strokeWidth;\n\t\tconst nextW = Math.max(2, totalW);\n\t\tconst nextH = Math.max(2, totalH);\n\t\tconst sizeChanged = nextW !== this._lastCanvasW || nextH !== this._lastCanvasH;\n\t\tthis._canvas.width = nextW;\n\t\tthis._canvas.height = nextH;\n\t\tthis._lastCanvasW = nextW;\n\t\tthis._lastCanvasH = nextH;\n\n\t\tthis._ctx.clearRect(0, 0, this._canvas.width, this._canvas.height);\n\n\t\tconst radius = Math.max(0, this.options.radius ?? 0);\n\t\tconst rectX = Math.floor(padding + strokeWidth / 2);\n\t\tconst rectY = Math.floor(padding + strokeWidth / 2);\n\t\tconst rectW = Math.floor(width);\n\t\tconst rectH = Math.floor(height);\n\n\t\tthis._ctx.beginPath();\n\t\tif (radius > 0) {\n\t\t\tthis.roundedRectPath(this._ctx, rectX, rectY, rectW, rectH, radius);\n\t\t} else {\n\t\t\tthis._ctx.rect(rectX, rectY, rectW, rectH);\n\t\t}\n\n\t\tif (this.options.fillColor) {\n\t\t\tthis._ctx.fillStyle = this.toCssColor(this.options.fillColor);\n\t\t\tthis._ctx.fill();\n\t\t}\n\n\t\tif ((this.options.strokeColor && (strokeWidth > 0))) {\n\t\t\tthis._ctx.lineWidth = strokeWidth;\n\t\t\tthis._ctx.strokeStyle = this.toCssColor(this.options.strokeColor);\n\t\t\tthis._ctx.stroke();\n\t\t}\n\n\t\tif (this._texture) {\n\t\t\tif (sizeChanged) {\n\t\t\t\tthis._texture.dispose();\n\t\t\t\tthis._texture = new CanvasTexture(this._canvas);\n\t\t\t\tthis._texture.minFilter = LinearFilter;\n\t\t\t\tthis._texture.magFilter = LinearFilter;\n\t\t\t\tthis._texture.wrapS = ClampToEdgeWrapping;\n\t\t\t\tthis._texture.wrapT = ClampToEdgeWrapping;\n\t\t\t\tif (this._sprite && this._sprite.material instanceof ShaderMaterial) {\n\t\t\t\t\tconst shader = this._sprite.material as ShaderMaterial;\n\t\t\t\t\tif (shader.uniforms?.tDiffuse) shader.uniforms.tDiffuse.value = this._texture;\n\t\t\t\t\tif (shader.uniforms?.iResolution) shader.uniforms.iResolution.value.set(this._canvas.width, this._canvas.height, 1);\n\t\t\t\t}\n\t\t\t}\n\t\t\tthis._texture.image = this._canvas;\n\t\t\tthis._texture.needsUpdate = true;\n\t\t\tif (this._sprite && this._sprite.material) {\n\t\t\t\t(this._sprite.material as any).map = this._texture;\n\t\t\t\tthis._sprite.material.needsUpdate = true;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate roundedRectPath(ctx: CanvasRenderingContext2D, x: number, y: number, w: number, h: number, r: number) {\n\t\tconst radius = Math.min(r, Math.floor(Math.min(w, h) / 2));\n\t\tctx.moveTo(x + radius, y);\n\t\tctx.lineTo(x + w - radius, y);\n\t\tctx.quadraticCurveTo(x + w, y, x + w, y + radius);\n\t\tctx.lineTo(x + w, y + h - radius);\n\t\tctx.quadraticCurveTo(x + w, y + h, x + w - radius, y + h);\n\t\tctx.lineTo(x + radius, y + h);\n\t\tctx.quadraticCurveTo(x, y + h, x, y + h - radius);\n\t\tctx.lineTo(x, y + radius);\n\t\tctx.quadraticCurveTo(x, y, x + radius, y);\n\t}\n\n\tprivate toCssColor(color: Color | string): string {\n\t\tif (typeof color === 'string') return color;\n\t\tconst c = color instanceof Color ? color : new Color(color as any);\n\t\treturn `#${c.getHexString()}`;\n\t}\n\n\tprivate rectSetup(params: SetupContext<ZylemRectOptions>) {\n\t\tthis._cameraRef = (params.camera as unknown) as ZylemCamera | null;\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\t(this._cameraRef.camera as any).add(this.group);\n\t\t}\n\n\t\tif (this.materials?.length && this._sprite) {\n\t\t\tconst mat = this.materials[0];\n\t\t\tif (mat instanceof ShaderMaterial) {\n\t\t\t\tmat.transparent = true;\n\t\t\t\tmat.depthTest = false;\n\t\t\t\tmat.depthWrite = false;\n\t\t\t\tif (this._texture) {\n\t\t\t\t\tif (mat.uniforms?.tDiffuse) mat.uniforms.tDiffuse.value = this._texture;\n\t\t\t\t\tif (mat.uniforms?.iResolution && this._canvas) mat.uniforms.iResolution.value.set(this._canvas.width, this._canvas.height, 1);\n\t\t\t\t}\n\t\t\t\tthis._mesh = new Mesh(new PlaneGeometry(1, 1), mat);\n\t\t\t\tthis.group?.add(this._mesh);\n\t\t\t\tthis._sprite.visible = false;\n\t\t\t}\n\t\t}\n\t}\n\n\tprivate rectUpdate(params: UpdateContext<ZylemRectOptions>) {\n\t\tif (!this._sprite) return;\n\n\t\t// If bounds provided, compute screen-space rect from it and update size/position\n\t\tif (this._cameraRef && this.options.bounds) {\n\t\t\tconst dom = this._cameraRef.renderer.domElement;\n\t\t\tconst screen = this.computeScreenBoundsFromOptions(this.options.bounds);\n\t\t\tif (screen) {\n\t\t\t\tconst { x, y, width, height } = screen;\n\t\t\t\tconst desiredW = Math.max(2, Math.floor(width));\n\t\t\t\tconst desiredH = Math.max(2, Math.floor(height));\n\t\t\t\tconst changed = desiredW !== (this.options.width ?? 0) || desiredH !== (this.options.height ?? 0);\n\t\t\t\tthis.options.screenPosition = new Vector2(Math.floor(x), Math.floor(y));\n\t\t\t\tthis.options.width = desiredW;\n\t\t\t\tthis.options.height = desiredH;\n\t\t\t\tthis.options.anchor = new Vector2(0, 0);\n\t\t\t\tif (changed) {\n\t\t\t\t\tthis.redrawRect();\n\t\t\t\t}\n\t\t\t}\n\t\t}\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tprivate updateStickyTransform() {\n\t\tif (!this._sprite || !this._cameraRef) return;\n\t\tconst camera = this._cameraRef.camera;\n\t\tconst dom = this._cameraRef.renderer.domElement;\n\t\tconst width = dom.clientWidth;\n\t\tconst height = dom.clientHeight;\n\t\tconst px = (this.options.screenPosition ?? new Vector2(24, 24)).x;\n\t\tconst py = (this.options.screenPosition ?? new Vector2(24, 24)).y;\n\t\tconst zDist = Math.max(0.001, this.options.zDistance ?? 1);\n\n\t\tlet worldHalfW = 1;\n\t\tlet worldHalfH = 1;\n\t\tif ((camera as PerspectiveCamera).isPerspectiveCamera) {\n\t\t\tconst pc = camera as PerspectiveCamera;\n\t\t\tconst halfH = Math.tan((pc.fov * Math.PI) / 180 / 2) * zDist;\n\t\t\tconst halfW = halfH * pc.aspect;\n\t\t\tworldHalfW = halfW;\n\t\t\tworldHalfH = halfH;\n\t\t} else if ((camera as OrthographicCamera).isOrthographicCamera) {\n\t\t\tconst oc = camera as OrthographicCamera;\n\t\t\tworldHalfW = (oc.right - oc.left) / 2;\n\t\t\tworldHalfH = (oc.top - oc.bottom) / 2;\n\t\t}\n\n\t\tconst ndcX = (px / width) * 2 - 1;\n\t\tconst ndcY = 1 - (py / height) * 2;\n\t\tconst localX = ndcX * worldHalfW;\n\t\tconst localY = ndcY * worldHalfH;\n\n\t\tlet scaleX = 1;\n\t\tlet scaleY = 1;\n\t\tif (this._canvas) {\n\t\t\tconst planeH = worldHalfH * 2;\n\t\t\tconst unitsPerPixel = planeH / height;\n\t\t\tconst pixelH = this._canvas.height;\n\t\t\tscaleY = Math.max(0.0001, pixelH * unitsPerPixel);\n\t\t\tconst aspect = this._canvas.width / this._canvas.height;\n\t\t\tscaleX = scaleY * aspect;\n\t\t\tthis._sprite.scale.set(scaleX, scaleY, 1);\n\t\t\tif (this._mesh) this._mesh.scale.set(scaleX, scaleY, 1);\n\t\t}\n\n\t\tconst anchor = this.options.anchor ?? new Vector2(0, 0);\n\t\tconst ax = Math.min(100, Math.max(0, anchor.x)) / 100; // 0..1\n\t\tconst ay = Math.min(100, Math.max(0, anchor.y)) / 100; // 0..1\n\t\tconst offsetX = (0.5 - ax) * scaleX;\n\t\tconst offsetY = (ay - 0.5) * scaleY;\n\t\tthis.group?.position.set(localX + offsetX, localY + offsetY, -zDist);\n\t}\n\n\tprivate worldToScreen(point: Vector3) {\n\t\tif (!this._cameraRef) return { x: 0, y: 0 };\n\t\tconst camera = this._cameraRef.camera;\n\t\tconst dom = this._cameraRef.renderer.domElement;\n\t\tconst v = point.clone().project(camera);\n\t\tconst x = (v.x + 1) / 2 * dom.clientWidth;\n\t\tconst y = (1 - v.y) / 2 * dom.clientHeight;\n\t\treturn { x, y };\n\t}\n\n\tprivate computeScreenBoundsFromOptions(bounds: NonNullable<ZylemRectOptions['bounds']>): { x: number; y: number; width: number; height: number } | null {\n\t\tif (!this._cameraRef) return null;\n\t\tconst dom = this._cameraRef.renderer.domElement;\n\t\tif (bounds.screen) {\n\t\t\treturn { ...bounds.screen };\n\t\t}\n\t\tif (bounds.world) {\n\t\t\tconst { left, right, top, bottom, z = 0 } = bounds.world;\n\t\t\tconst tl = this.worldToScreen(new Vector3(left, top, z));\n\t\t\tconst br = this.worldToScreen(new Vector3(right, bottom, z));\n\t\t\tconst x = Math.min(tl.x, br.x);\n\t\t\tconst y = Math.min(tl.y, br.y);\n\t\t\tconst width = Math.abs(br.x - tl.x);\n\t\t\tconst height = Math.abs(br.y - tl.y);\n\t\t\treturn { x, y, width, height };\n\t\t}\n\t\treturn null;\n\t}\n\n\tupdateRect(options?: Partial<Pick<ZylemRectOptions, 'width' | 'height' | 'fillColor' | 'strokeColor' | 'strokeWidth' | 'radius'>>) {\n\t\tthis.options = { ...this.options, ...options } as ZylemRectOptions;\n\t\tthis.redrawRect();\n\t\tif (this.options.stickToViewport && this._cameraRef) {\n\t\t\tthis.updateStickyTransform();\n\t\t}\n\t}\n\n\tbuildInfo(): Record<string, any> {\n\t\tconst delegate = new DebugDelegate(this as any);\n\t\tconst baseInfo = delegate.buildDebugInfo();\n\n\t\treturn {\n\t\t\t...baseInfo,\n\t\t\ttype: String(ZylemRect.type),\n\t\t\twidth: this.options.width ?? 0,\n\t\t\theight: this.options.height ?? 0,\n\t\t\tsticky: this.options.stickToViewport,\n\t\t};\n\t}\n}\n\ntype RectOptions = BaseNode | Partial<ZylemRectOptions>;\n\nexport async function rect(...args: Array<RectOptions>): Promise<ZylemRect> {\n\treturn createEntity<ZylemRect, ZylemRectOptions>({\n\t\targs,\n\t\tdefaultConfig: { ...rectDefaults },\n\t\tEntityClass: ZylemRect,\n\t\tBuilderClass: RectBuilder,\n\t\tentityType: ZylemRect.type,\n\t});\n}\n\n\n"],"mappings":"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","names":["ColliderDesc","Color","Vector3","BufferGeometry","Mesh","Color","Mesh","Color","ShaderMaterial","Vector3","debug_default","debug_default","Color","ShaderMaterial","Vector3","BufferGeometry","Mesh","Color","MeshStandardMaterial","MeshPhongMaterial","x","y","z","toDeg","Vector3","Color","ColliderDesc","ColliderDesc","Color","Vector3","Vector3","Color","ColliderDesc","ColliderDesc","Color","Group","Quaternion","Vector3","TextureLoader","Vector3","Color","ColliderDesc","TextureLoader","Group","Quaternion","ColliderDesc","Color","Vector2","Vector3","BufferGeometry","Vector2","Vector3","Color","scale","ColliderDesc","ActiveCollisionTypes","ColliderDesc","Vector3","Vector3","ColliderDesc","ActiveCollisionTypes","ActiveCollisionTypes","ColliderDesc","Group","Vector3","Vector3","ColliderDesc","ActiveCollisionTypes","Group","Color","Group","ThreeSprite","SpriteMaterial","Vector2","Vector2","Group","SpriteMaterial","ThreeSprite","text","Color","Color","Group","ThreeSprite","SpriteMaterial","CanvasTexture","LinearFilter","Vector2","ClampToEdgeWrapping","ShaderMaterial","Mesh","PlaneGeometry","Vector3","Vector2","Group","CanvasTexture","LinearFilter","SpriteMaterial","ThreeSprite","ClampToEdgeWrapping","ShaderMaterial","Color","Mesh","PlaneGeometry","Vector3"]}