string-tune-3d 0.0.5 → 0.0.6

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/index.ts","../src/modules/String3D.ts","../src/core/String3DCamera.ts","../src/core/String3DRenderer.ts","../src/core/String3DObject.ts","../src/core/String3DScene.ts","../src/core/synchronizer/GroupSynchronizer.ts","../src/core/synchronizer/LightSynchronizer.ts","../src/core/synchronizer/MeshSynchronizer.ts","../src/core/synchronizer/String3DSynchronizer.ts","../src/core/transform/TransformWorkerClient.ts","../src/adapters/ThreeJSProvider.ts"],"sourcesContent":["export { String3D } from \"./modules/String3D\";\r\nexport type { String3DOptions } from \"./modules/String3D\";\r\n\r\nexport type {\r\n I3DEngine,\r\n I3DVector3,\r\n I3DVector2,\r\n I3DQuaternion,\r\n I3DEuler,\r\n I3DMatrix4,\r\n I3DBox3,\r\n I3DObject,\r\n I3DMesh,\r\n I3DGeometry,\r\n I3DMaterial,\r\n I3DLight,\r\n I3DCamera,\r\n I3DPerspectiveCamera,\r\n I3DOrthographicCamera,\r\n I3DScene,\r\n I3DRenderer,\r\n I3DTextureLoader,\r\n I3DModelLoader,\r\n} from \"./core/abstractions/I3DEngine\";\r\n\r\nexport type { CameraMode } from \"./core/String3DCamera\";\r\nexport type { I3DEngineProvider } from \"./core/abstractions/I3DEngineProvider\";\r\n\r\nexport { String3DCamera } from \"./core/String3DCamera\";\r\nexport { String3DRenderer } from \"./core/String3DRenderer\";\r\nexport { String3DScene } from \"./core/String3DScene\";\r\nexport { String3DObject } from \"./core/String3DObject\";\r\nexport { String3DSynchronizer } from \"./core/synchronizer/String3DSynchronizer\";\r\n\r\nexport { ThreeJSProvider, ThreeJSEngine } from \"./adapters/ThreeJSProvider\";\r\n","import { StringModule } from \"@fiddle-digital/string-tune\";\nimport { StringObject } from \"@fiddle-digital/string-tune\";\nimport { StringData } from \"@fiddle-digital/string-tune\";\nimport { StringContext } from \"@fiddle-digital/string-tune\";\nimport { String3DCamera } from \"../core/String3DCamera\";\nimport { String3DRenderer } from \"../core/String3DRenderer\";\nimport { String3DScene } from \"../core/String3DScene\";\nimport { String3DSynchronizer } from \"../core/synchronizer/String3DSynchronizer\";\nimport { I3DEngineProvider } from \"../core/abstractions/I3DEngineProvider\";\nimport { I3DEngine, I3DModelLoader } from \"../core/abstractions/I3DEngine\";\nimport { frameDOM } from \"@fiddle-digital/string-tune\";\nimport { MeshSynchronizer } from \"../core/synchronizer/MeshSynchronizer\";\nimport { String3DObject } from \"../core/String3DObject\";\nimport {\n TransformWorkerClient,\n TransformWorkerInput,\n TransformWorkerCamera,\n TransformWorkerResult,\n} from \"../core/transform/TransformWorkerClient\";\n\nexport interface String3DOptions {\n hideHTML?: boolean;\n container?: string | HTMLElement;\n zIndex?: number;\n modelLoaderType?: string;\n modelLoader?: I3DModelLoader;\n modelLoaderFactory?: (engine: I3DEngine, type?: string) => I3DModelLoader;\n useDirtySync?: boolean;\n useTransformWorker?: boolean;\n transformWorkerWasmUrl?: string;\n}\n\nexport class String3D extends StringModule {\n private static provider: I3DEngineProvider | null = null;\n\n private renderer: String3DRenderer | null = null;\n private camera: String3DCamera | null = null;\n private scene: String3DScene | null = null;\n private synchronizer: String3DSynchronizer | null = null;\n private engine: I3DEngine | null = null;\n private canvasContainer: HTMLElement | null = null;\n private isLoading: Map<string, boolean> = new Map();\n private options: String3DOptions;\n private useDirtySync = false;\n private dirtyElements: Set<HTMLElement> = new Set();\n private observedElements: Set<HTMLElement> = new Set();\n private resizeObserver: ResizeObserver | null = null;\n private mutationObserver: MutationObserver | null = null;\n private lastSyncData: WeakMap<String3DObject, { scale: number }> = new WeakMap();\n private transformWorker: TransformWorkerClient | null = null;\n private workerHasResult = false;\n private workerObjectMap: Map<string, { object: String3DObject; el: HTMLElement }> = new Map();\n private domVersion = 0;\n private lastSubmittedVersion = 0;\n private scrollTicking = false;\n private onScrollBound = () => this.handleScroll();\n\n public static setProvider(provider: I3DEngineProvider): void {\n String3D.provider = provider;\n }\n\n constructor(context: StringContext) {\n super(context);\n this.htmlKey = \"3d\";\n this.options = this.buildOptionsFromSettings();\n\n this.attributesToMap = [\n ...this.attributesToMap,\n { key: \"3d\", type: \"string\", fallback: \"box\" },\n { key: \"3d-material\", type: \"string\", fallback: \"basic[#ffffff]\" },\n { key: \"3d-color\", type: \"string\", fallback: \"#ffffff\" },\n { key: \"3d-opacity\", type: \"number\", fallback: 1 },\n { key: \"3d-intensity\", type: \"number\", fallback: 1 },\n { key: \"3d-distance\", type: \"number\", fallback: 1000 },\n { key: \"3d-decay\", type: \"number\", fallback: 0 },\n { key: \"3d-model\", type: \"string\", fallback: \"\" },\n { key: \"3d-segments\", type: \"number\", fallback: 32 },\n { key: \"3d-segments-width\", type: \"number\", fallback: 32 },\n { key: \"3d-segments-height\", type: \"number\", fallback: 32 },\n { key: \"3d-model-loader\", type: \"string\", fallback: \"\" },\n { key: \"3d-model-scale\", type: \"number\", fallback: 1 },\n { key: \"3d-model-center\", type: \"boolean\", fallback: false },\n { key: \"3d-model-fit\", type: \"string\", fallback: \"contain\" },\n { key: \"3d-metalness\", type: \"number\", fallback: 0 },\n { key: \"3d-roughness\", type: \"number\", fallback: 1 },\n { key: \"3d-texture-flipY\", type: \"boolean\", fallback: true },\n { key: \"3d-colorSpace\", type: \"string\", fallback: \"\" },\n { key: \"3d-cast-shadow\", type: \"boolean\", fallback: false },\n { key: \"3d-receive-shadow\", type: \"boolean\", fallback: false },\n { key: \"3d-shadow-bias\", type: \"number\", fallback: 0 },\n { key: \"3d-shadow-map-size\", type: \"number\", fallback: 512 },\n { key: \"3d-angle\", type: \"number\", fallback: Math.PI / 3 },\n { key: \"3d-penumbra\", type: \"number\", fallback: 0 },\n { key: \"3d-ground-color\", type: \"string\", fallback: \"#ffffff\" },\n { key: \"3d-target\", type: \"string\", fallback: \"\" },\n ];\n }\n\n override canConnect(object: StringObject): boolean {\n const result = super.canConnect(object);\n console.log(\n \"[String3D] canConnect:\",\n object.id,\n \"keys:\",\n object.keys,\n \"htmlKey:\",\n this.htmlKey,\n \"result:\",\n result\n );\n return result;\n }\n\n override initializeObject(\n globalId: number,\n object: StringObject,\n element: HTMLElement,\n attributes: Record<string, any>\n ): void {\n super.initializeObject(globalId, object, element, attributes);\n\n object.setProperty(\"parentId\", null);\n const parentElement = element.parentElement?.closest(\n '[string-3d=\"group\"]'\n ) as HTMLElement | null;\n if (parentElement) {\n const parentId = parentElement.getAttribute(\"string-id\");\n if (parentId) {\n object.setProperty(\"parentId\", parentId);\n object.setProperty(\"parent\", parentElement);\n }\n }\n }\n\n override onResize(): void {\n if (this.renderer && this.camera && this.synchronizer) {\n this.renderer.resize(this.camera);\n this.synchronizer.updateViewportSize(this.renderer.width, this.renderer.height);\n this.camera.clearScaleCache();\n if (this.useDirtySync) {\n this.markAllDirty();\n }\n }\n }\n\n override onInit(): void {\n this.options = this.buildOptionsFromSettings();\n if (!String3D.provider) {\n console.error(\"[String3D] No provider set. Call String3D.setProvider() before use.\");\n return;\n }\n\n this.engine = String3D.provider.getEngine();\n this.canvasContainer = this.createOrGetContainer();\n this.registerTypedProperties();\n this.injectCSS();\n this.useDirtySync = !!this.options.useDirtySync;\n if (this.useDirtySync) {\n this.setupObservers();\n this.setupScrollListeners();\n }\n\n this.renderer = new String3DRenderer(this.canvasContainer, this.engine);\n this.renderer.attach();\n\n this.camera = new String3DCamera(this.engine, \"orthographic\");\n this.camera.setPosition(0, 0, 1000);\n this.camera.resize(this.renderer.width, this.renderer.height);\n\n const modelLoader = this.resolveModelLoader();\n const modelLoaderFactory = this.resolveModelLoaderFactory();\n this.scene = new String3DScene(this.engine, {\n modelLoader,\n modelLoaderFactory,\n });\n this.scene.getScene().add(this.camera.camera);\n\n this.synchronizer = new String3DSynchronizer(\n this.camera,\n this.renderer.width,\n this.renderer.height,\n this.engine\n );\n\n if (this.options.useTransformWorker) {\n this.transformWorker = new TransformWorkerClient({\n wasmUrl: this.options.transformWorkerWasmUrl,\n });\n }\n\n console.info(`[String3D] Initialized with: ${String3D.provider.getName()}`);\n }\n\n override onSettingsChange(): void {\n this.options = this.buildOptionsFromSettings();\n const shouldUseDirtySync = !!this.options.useDirtySync;\n if (shouldUseDirtySync && !this.useDirtySync) {\n this.useDirtySync = true;\n this.setupObservers();\n this.setupScrollListeners();\n this.observeSceneElements();\n this.markAllDirty();\n } else if (!shouldUseDirtySync && this.useDirtySync) {\n this.useDirtySync = false;\n this.removeScrollListeners();\n this.resizeObserver?.disconnect();\n this.mutationObserver?.disconnect();\n this.dirtyElements.clear();\n }\n\n const shouldUseWorker = !!this.options.useTransformWorker;\n if (shouldUseWorker && !this.transformWorker) {\n this.transformWorker = new TransformWorkerClient({\n wasmUrl: this.options.transformWorkerWasmUrl,\n });\n this.workerHasResult = false;\n } else if (!shouldUseWorker && this.transformWorker) {\n this.transformWorker.destroy();\n this.transformWorker = null;\n this.workerHasResult = false;\n }\n }\n\n private buildOptionsFromSettings(): String3DOptions {\n return {\n hideHTML: this.getSettingValue(\"hideHTML\", false),\n container: this.getSettingValue(\"container\", undefined),\n zIndex: this.getSettingValue(\"zIndex\", 1),\n modelLoaderType: this.getSettingValue(\"modelLoaderType\", undefined),\n modelLoader: this.getSettingValue(\"modelLoader\", undefined),\n modelLoaderFactory: this.getSettingValue(\"modelLoaderFactory\", undefined),\n useDirtySync: this.getSettingValue(\"useDirtySync\", false),\n useTransformWorker: this.getSettingValue(\"useTransformWorker\", false),\n transformWorkerWasmUrl: this.getSettingValue(\"transformWorkerWasmUrl\", undefined),\n };\n }\n\n private getSettingValue<T>(key: string, fallback: T): T {\n if (!this.settings || !(key in this.settings)) return fallback;\n return this.settings[key] as T;\n }\n\n private resolveModelLoader(): I3DModelLoader | undefined {\n if (!this.engine) return undefined;\n if (this.options.modelLoader) return this.options.modelLoader;\n if (this.options.modelLoaderFactory) return undefined;\n if (this.options.modelLoaderType) {\n try {\n return this.engine.createModelLoader(this.options.modelLoaderType);\n } catch (error) {\n console.warn(\"[String3D] Failed to create model loader:\", error);\n }\n }\n return undefined;\n }\n\n private resolveModelLoaderFactory():\n | ((engine: I3DEngine, type?: string) => I3DModelLoader)\n | undefined {\n if (!this.engine) return undefined;\n if (this.options.modelLoaderFactory) return this.options.modelLoaderFactory;\n if (this.options.modelLoaderType) {\n return (engine: I3DEngine, type?: string) => {\n const loaderType = type || this.options.modelLoaderType;\n if (!loaderType) {\n throw new Error(\"[String3D] Model loader type not provided\");\n }\n return engine.createModelLoader(loaderType);\n };\n }\n return undefined;\n }\n\n private createOrGetContainer(): HTMLElement {\n if (this.options.container instanceof HTMLElement) {\n this.applyContainerStyles(this.options.container);\n return this.options.container;\n }\n\n if (typeof this.options.container === \"string\") {\n const existing = document.getElementById(this.options.container);\n if (existing) {\n this.applyContainerStyles(existing);\n return existing;\n }\n }\n\n const container = document.createElement(\"div\");\n container.id = \"string-3d-canvas\";\n this.applyContainerStyles(container);\n document.body.insertBefore(container, document.body.firstChild);\n return container;\n }\n\n private applyContainerStyles(el: HTMLElement): void {\n Object.assign(el.style, {\n position: \"fixed\",\n left: \"0\",\n top: \"0\",\n width: \"100vw\",\n height: \"100lvh\",\n zIndex: String(this.options.zIndex),\n pointerEvents: \"none\",\n });\n }\n\n override onObjectConnected(object: StringObject): void {\n if (this.isLoading.has(object.id) || !this.scene) return;\n this.isLoading.set(object.id, true);\n\n this.scene.createFromElement(object);\n\n if (this.useDirtySync && object.htmlElement) {\n this.observeElement(object.htmlElement);\n this.markDirty(object.htmlElement);\n }\n\n if (this.options.hideHTML && object.htmlElement) {\n object.htmlElement.style.opacity = \"0\";\n object.htmlElement.style.pointerEvents = \"none\";\n }\n }\n\n override onFrame(data: StringData): void {\n if (!this.renderer || !this.scene || !this.camera || !this.synchronizer) return;\n\n const workerResults = this.transformWorker?.takeLastResult();\n if (\n workerResults &&\n workerResults.frameId === this.lastSubmittedVersion &&\n workerResults.frameId >= this.domVersion\n ) {\n this.workerHasResult = true;\n this.applyWorkerResults(workerResults.results);\n }\n\n const dirtySet = this.useDirtySync ? this.dirtyElements : null;\n // If dirty sync is enabled but nothing is marked dirty, we still sync everything to keep CSS-driven effects (hover/animations) fluid.\n const forceSync = !dirtySet || dirtySet.size === 0;\n const worker = this.transformWorker;\n\n // Collect and submit worker inputs only when the worker is free\n if (worker?.isReady() && !worker.isPending()) {\n const inputs: TransformWorkerInput[] = [];\n this.workerObjectMap.clear();\n this.scene!.rootObjects.forEach((obj) => {\n this.collectWorkerInputs(obj, { scale: 1 }, forceSync, dirtySet, inputs);\n });\n if (inputs.length > 0) {\n const frameId = this.domVersion;\n this.lastSubmittedVersion = frameId;\n worker.submit(inputs, this.buildWorkerCameraData(), frameId);\n }\n }\n\n // Always do immediate CPU sync to avoid frame lag while worker is pending\n this.scene!.rootObjects.forEach((obj) => {\n this.syncRecursive(obj.el, obj, { scale: 1 }, forceSync, dirtySet);\n });\n\n if (this.useDirtySync) {\n this.dirtyElements.clear();\n }\n\n this.renderer!.render(this.scene!, this.camera!);\n }\n\n private syncRecursive(\n el: HTMLElement | undefined,\n object: String3DObject,\n parentData: any,\n forceSync: boolean,\n dirtySet: Set<HTMLElement> | null\n ): void {\n if (!this.synchronizer || !el) return;\n const shouldSync = forceSync || !dirtySet || dirtySet.has(el);\n let nextParentData = parentData;\n\n if (shouldSync) {\n const data = this.synchronizer.syncElement(el, object, parentData);\n if (data && typeof data.scale === \"number\") {\n this.lastSyncData.set(object, data);\n nextParentData = data;\n }\n } else {\n const cached = this.lastSyncData.get(object);\n if (cached) {\n nextParentData = cached;\n }\n }\n\n const forceChildren = forceSync || shouldSync;\n object.children.forEach((child) =>\n this.syncRecursive(child.el, child, nextParentData, forceChildren, dirtySet)\n );\n }\n\n private injectCSS(): void {\n if (document.getElementById(\"string-3d-styles\")) return;\n\n const style = document.createElement(\"style\");\n style.id = \"string-3d-styles\";\n style.textContent = `\n @property --translate-x { syntax: \"<number>\"; inherits: false; initial-value: 0; }\n @property --translate-y { syntax: \"<number>\"; inherits: false; initial-value: 0; }\n @property --translate-z { syntax: \"<number>\"; inherits: false; initial-value: 0; }\n @property --rotate-x { syntax: \"<number>\"; inherits: false; initial-value: 0; }\n @property --rotate-y { syntax: \"<number>\"; inherits: false; initial-value: 0; }\n @property --rotate-z { syntax: \"<number>\"; inherits: false; initial-value: 0; }\n @property --scale { syntax: \"<number>\"; inherits: false; initial-value: 1; }\n @property --scale-x { syntax: \"<number>\"; inherits: false; initial-value: 1; }\n @property --scale-y { syntax: \"<number>\"; inherits: false; initial-value: 1; }\n @property --scale-z { syntax: \"<number>\"; inherits: false; initial-value: 1; }\n @property --opacity { syntax: \"<number>\"; inherits: false; initial-value: 1; }\n\n [string-3d] {\n --translate-x: 0; --translate-y: 0; --translate-z: 0;\n --rotate-x: 0; --rotate-y: 0; --rotate-z: 0;\n --scale: 1; --scale-x: 1; --scale-y: 1; --scale-z: 1;--opacity: 1;\n transform-style: preserve-3d;\n }\n\n [string-3d-visual=\"true\"] {\n transform:\n translate3d(calc(var(--translate-x) * 1px), calc(var(--translate-y) * 1px), calc(var(--translate-z) * 1px))\n rotateX(calc(var(--rotate-x) * 1deg))\n rotateY(calc(var(--rotate-y) * 1deg))\n rotateZ(calc(var(--rotate-z) * 1deg))\n scale3d(calc(var(--scale) * var(--scale-x)), calc(var(--scale) * var(--scale-y)), calc(var(--scale) * var(--scale-z)));\n }\n `;\n document.head.appendChild(style);\n }\n\n private registerTypedProperties(): void {\n const css = (globalThis as any).CSS;\n if (!css?.registerProperty) return;\n\n const props: Array<{ name: string; initialValue: string }> = [\n { name: \"--translate-x\", initialValue: \"0\" },\n { name: \"--translate-y\", initialValue: \"0\" },\n { name: \"--translate-z\", initialValue: \"0\" },\n { name: \"--rotate-x\", initialValue: \"0\" },\n { name: \"--rotate-y\", initialValue: \"0\" },\n { name: \"--rotate-z\", initialValue: \"0\" },\n { name: \"--scale\", initialValue: \"1\" },\n { name: \"--scale-x\", initialValue: \"1\" },\n { name: \"--scale-y\", initialValue: \"1\" },\n { name: \"--scale-z\", initialValue: \"1\" },\n { name: \"--opacity\", initialValue: \"1\" },\n ];\n\n props.forEach(({ name, initialValue }) => {\n try {\n css.registerProperty({\n name,\n syntax: \"<number>\",\n inherits: false,\n initialValue,\n });\n } catch {\n // Property may already be registered; ignore.\n }\n });\n }\n\n private setupObservers(): void {\n if (typeof ResizeObserver !== \"undefined\") {\n this.resizeObserver = new ResizeObserver((entries) => {\n entries.forEach((entry) => {\n if (entry.target instanceof HTMLElement) {\n this.markDirty(entry.target);\n }\n });\n });\n }\n\n if (typeof MutationObserver !== \"undefined\") {\n this.mutationObserver = new MutationObserver((mutations) => {\n mutations.forEach((mutation) => {\n if (mutation.target instanceof HTMLElement) {\n this.markDirty(mutation.target);\n }\n });\n });\n }\n }\n\n private setupScrollListeners(): void {\n window.addEventListener(\"scroll\", this.onScrollBound, { passive: true });\n window.addEventListener(\"resize\", this.onScrollBound, { passive: true });\n if (window.visualViewport) {\n window.visualViewport.addEventListener(\"scroll\", this.onScrollBound, { passive: true });\n window.visualViewport.addEventListener(\"resize\", this.onScrollBound, { passive: true });\n }\n }\n\n private removeScrollListeners(): void {\n window.removeEventListener(\"scroll\", this.onScrollBound);\n window.removeEventListener(\"resize\", this.onScrollBound);\n if (window.visualViewport) {\n window.visualViewport.removeEventListener(\"scroll\", this.onScrollBound);\n window.visualViewport.removeEventListener(\"resize\", this.onScrollBound);\n }\n }\n\n private handleScroll(): void {\n if (!this.useDirtySync) return;\n this.markAllDirty();\n }\n\n private observeElement(el: HTMLElement): void {\n if (this.observedElements.has(el)) return;\n this.observedElements.add(el);\n\n this.resizeObserver?.observe(el);\n this.mutationObserver?.observe(el, {\n attributes: true,\n attributeFilter: [\n \"style\",\n \"class\",\n \"string-3d\",\n \"string-3d-model-fit\",\n \"string-3d-model-scale\",\n \"string-3d-cast-shadow\",\n \"string-3d-receive-shadow\",\n \"string-3d-opacity\",\n \"string-3d-target\",\n ],\n });\n }\n\n private observeSceneElements(): void {\n if (!this.scene) return;\n this.scene.rootObjects.forEach((obj) => {\n this.observeRecursive(obj);\n });\n }\n\n private observeRecursive(object: String3DObject): void {\n if (object.el instanceof HTMLElement) {\n this.observeElement(object.el);\n }\n object.children.forEach((child) => this.observeRecursive(child));\n }\n\n private markDirty(el: HTMLElement): void {\n this.dirtyElements.add(el);\n this.domVersion += 1;\n }\n\n private markAllDirty(): void {\n this.observedElements.forEach((el) => this.dirtyElements.add(el));\n this.domVersion += 1;\n }\n\n private readNumberStyle(el: HTMLElement, prop: string, fallback: number): number {\n const styleMap = (el as any).computedStyleMap?.();\n const mapValue = styleMap?.get?.(prop);\n if (mapValue !== undefined) {\n if (typeof mapValue === \"number\") return mapValue;\n if (typeof mapValue === \"string\") {\n const parsed = Number.parseFloat(mapValue);\n if (!Number.isNaN(parsed)) return parsed;\n }\n if (mapValue && typeof mapValue === \"object\") {\n const value = (mapValue as any).value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n }\n\n const style = getComputedStyle(el);\n const raw = style.getPropertyValue(prop);\n const parsed = Number.parseFloat(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n }\n\n private buildWorkerCameraData(): TransformWorkerCamera {\n return {\n mode: this.camera!.getMode(),\n width: this.renderer!.width,\n height: this.renderer!.height,\n cameraZ: this.camera!.getPositionZ(),\n fov: this.camera!.getPerspectiveFov(),\n aspect: this.renderer!.width / this.renderer!.height,\n };\n }\n\n private collectWorkerInputs(\n object: String3DObject,\n parentData: { scale: number },\n forceSync: boolean,\n dirtySet: Set<HTMLElement> | null,\n inputs: TransformWorkerInput[]\n ): void {\n if (!this.synchronizer || !object.el) return;\n const el = object.el as HTMLElement;\n const shouldSync = forceSync || !dirtySet || dirtySet.has(el);\n let nextParentData = parentData;\n\n if (object.type.endsWith(\"Light\")) {\n if (shouldSync) {\n this.synchronizer.syncElement(el, object, parentData);\n }\n return;\n }\n\n if (shouldSync) {\n const rect = el.getBoundingClientRect();\n const layoutWidth = el.offsetWidth || rect.width;\n const layoutHeight = el.offsetHeight || rect.height;\n const translateZ = this.readNumberStyle(el, \"--translate-z\", 0);\n const scale = this.readNumberStyle(el, \"--scale\", 1);\n const scaleZ = this.readNumberStyle(el, \"--scale-z\", 1);\n const rotateX = this.readNumberStyle(el, \"--rotate-x\", 0);\n const rotateY = this.readNumberStyle(el, \"--rotate-y\", 0);\n const rotateZ = this.readNumberStyle(el, \"--rotate-z\", 0);\n const opacity = this.readNumberStyle(el, \"--opacity\", NaN);\n\n if (object.type !== \"group\") {\n MeshSynchronizer.applyVisualProps(el, object, opacity);\n }\n\n let modelSizeX: number | undefined;\n let modelSizeY: number | undefined;\n let modelScale: number | undefined;\n let fitMode: string | undefined;\n\n if (object.type === \"model\") {\n const bbox = object.getOriginalBoundingBox();\n const size = bbox.getSize(this.engine!.createVector3());\n modelSizeX = size.x;\n modelSizeY = size.y;\n const modelScaleAttr = parseFloat(el.getAttribute(\"string-3d-model-scale\") || \"1\");\n modelScale = Number.isFinite(modelScaleAttr) ? modelScaleAttr : 1;\n fitMode = (el.getAttribute(\"string-3d-model-fit\") || \"contain\").toLowerCase().trim();\n }\n\n const returnScale = object.type === \"group\" ? scale : scale * parentData.scale;\n this.lastSyncData.set(object, { scale: returnScale });\n nextParentData = { scale: returnScale };\n\n this.workerObjectMap.set(object.id, { object, el });\n inputs.push({\n id: object.id,\n type: object.type,\n rectLeft: rect.left,\n rectTop: rect.top,\n rectWidth: layoutWidth,\n rectHeight: layoutHeight,\n translateZ,\n scale,\n scaleZ,\n rotateX,\n rotateY,\n rotateZ,\n parentScale: parentData.scale,\n modelSizeX,\n modelSizeY,\n modelScale,\n fitMode,\n });\n } else {\n const cached = this.lastSyncData.get(object);\n if (cached) {\n nextParentData = cached;\n }\n }\n\n const forceChildren = forceSync || shouldSync;\n object.children.forEach((child) => {\n this.collectWorkerInputs(child, nextParentData, forceChildren, dirtySet, inputs);\n });\n }\n\n private applyWorkerResults(results: TransformWorkerResult[]): void {\n if (!this.engine) return;\n results.forEach((result) => {\n const entry = this.workerObjectMap.get(result.id);\n if (!entry) return;\n const object = entry.object;\n object.position = this.engine!.createVector3(result.posX, result.posY, result.posZ);\n object.rotation = this.engine!.createEuler(result.rotX, result.rotY, result.rotZ, \"XYZ\");\n object.scale = this.engine!.createVector3(result.scaleX, result.scaleY, result.scaleZ);\n if (object.type === \"group\") {\n object.object.updateMatrixWorld(true);\n }\n });\n }\n\n override destroy(): void {\n this.renderer?.destroy();\n this.scene?.destroy();\n this.isLoading.clear();\n this.transformWorker?.destroy();\n this.transformWorker = null;\n this.removeScrollListeners();\n this.resizeObserver?.disconnect();\n this.mutationObserver?.disconnect();\n this.observedElements.clear();\n this.dirtyElements.clear();\n this.workerObjectMap.clear();\n this.lastSyncData = new WeakMap();\n\n const styleEl = document.getElementById(\"string-3d-styles\");\n styleEl?.remove();\n\n if (this.canvasContainer?.id === \"string-3d-canvas\") {\n this.canvasContainer.remove();\n }\n\n super.destroy();\n }\n}\n","import { I3DEngine, I3DVector3, I3DCamera } from \"./abstractions/I3DEngine\";\r\n\r\nexport type CameraMode = \"orthographic\" | \"perspective\";\r\n\r\nexport class String3DCamera {\r\n private scaleCache = new Map<number, number>();\r\n private _camera: I3DCamera;\r\n private _position: I3DVector3;\r\n private _width = 1;\r\n private _height = 1;\r\n private engine: I3DEngine;\r\n private mode: CameraMode;\r\n private perspectiveFov: number;\r\n\r\n constructor(\r\n engine: I3DEngine,\r\n mode: CameraMode = \"orthographic\",\r\n fov = 50,\r\n near = 0.1,\r\n far = 10000\r\n ) {\r\n this.engine = engine;\r\n this.mode = mode;\r\n this.perspectiveFov = fov;\r\n\r\n if (mode === \"orthographic\") {\r\n this._camera = engine.createOrthographicCamera(-1, 1, 1, -1, near, far);\r\n } else {\r\n this._camera = engine.createPerspectiveCamera(fov, 1, near, far);\r\n }\r\n\r\n this._position = engine.createVector3(0, 0, 1000);\r\n this.update();\r\n }\r\n\r\n public get camera(): I3DCamera {\r\n return this._camera;\r\n }\r\n\r\n public resize(width: number, height: number): void {\r\n this._width = width;\r\n this._height = height;\r\n\r\n if (this.mode === \"orthographic\") {\r\n const ortho = this._camera as any;\r\n ortho.left = -width / 2;\r\n ortho.right = width / 2;\r\n ortho.top = height / 2;\r\n ortho.bottom = -height / 2;\r\n } else {\r\n this._camera.aspect = width / height;\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n public setPosition(x: number, y: number, z: number): void {\r\n this._position.set(x, y, z);\r\n this._camera.position.copy(this._position);\r\n this.update();\r\n }\r\n\r\n public lookAt(x: number, y: number, z: number): void {\r\n this._camera.lookAt(x, y, z);\r\n this.update();\r\n }\r\n\r\n public update(): void {\r\n this._camera.updateProjectionMatrix();\r\n (this._camera as any).updateMatrixWorld?.();\r\n }\r\n\r\n public screenToWorld(screenX: number, screenY: number, z = 0): I3DVector3 {\r\n if (this.mode === \"orthographic\") {\r\n const x = screenX - this._width / 2;\r\n const y = -(screenY - this._height / 2);\r\n return this.engine.createVector3(x, y, z);\r\n } else {\r\n const { width, height } = this.getFrustumSizeAt(z);\r\n const normalizedX = screenX / this._width;\r\n const normalizedY = screenY / this._height;\r\n const x = (normalizedX - 0.5) * width;\r\n const y = -(normalizedY - 0.5) * height;\r\n return this.engine.createVector3(x, y, z);\r\n }\r\n }\r\n\r\n public getFrustumSizeAt(z: number): { width: number; height: number } {\r\n if (this.mode === \"orthographic\") {\r\n return { width: this._width, height: this._height };\r\n }\r\n\r\n const fov = this.engine.degToRad(this.perspectiveFov);\r\n const distance = Math.abs(z - this._camera.position.z);\r\n const height = 2 * Math.tan(fov / 2) * distance;\r\n const width = height * this._camera.aspect;\r\n return { width, height };\r\n }\r\n\r\n public getScaleAtZ(z: number, viewportHeight: number): number {\r\n if (this.mode === \"orthographic\") {\r\n return 1;\r\n }\r\n\r\n const roundedZ = Math.round(z * 1000) / 1000;\r\n if (this.scaleCache.has(roundedZ)) {\r\n return this.scaleCache.get(roundedZ)!;\r\n }\r\n\r\n const { height } = this.getFrustumSizeAt(z);\r\n const scale = height / viewportHeight;\r\n this.scaleCache.set(roundedZ, scale);\r\n return scale;\r\n }\r\n\r\n public clearScaleCache(): void {\r\n this.scaleCache.clear();\r\n }\r\n\r\n public getMode(): CameraMode {\n return this.mode;\n }\n\n public getPerspectiveFov(): number {\n return this.perspectiveFov;\n }\n\n public getPositionZ(): number {\n return this._position.z;\n }\n}\n","import { I3DEngine, I3DRenderer } from \"./abstractions/I3DEngine\";\r\nimport { String3DCamera } from \"./String3DCamera\";\r\nimport { String3DScene } from \"./String3DScene\";\r\n\r\nexport class String3DRenderer {\r\n private _container: HTMLElement;\r\n private _renderer: I3DRenderer;\r\n private _width: number;\r\n private _height: number;\r\n private engine: I3DEngine;\r\n\r\n constructor(container: HTMLElement, engine: I3DEngine) {\r\n this.engine = engine;\r\n this._container = container;\r\n const { width, height } = container.getBoundingClientRect();\r\n this._width = width;\r\n this._height = height;\r\n\r\n this._renderer = engine.createRenderer({\r\n antialias: true,\r\n alpha: true,\r\n logarithmicDepthBuffer: true,\r\n });\r\n this._renderer.setPixelRatio(window.devicePixelRatio);\r\n this._renderer.setSize(width, height);\r\n\r\n if (this._renderer.shadowMap) {\r\n this._renderer.shadowMap.enabled = true;\r\n }\r\n }\r\n\r\n public attach(): void {\r\n this._container.appendChild(this._renderer.domElement);\r\n }\r\n\r\n public render(scene: String3DScene, camera: String3DCamera): void {\r\n this._renderer.render(scene.getScene(), camera.camera);\r\n }\r\n\r\n public resize(camera: String3DCamera): void {\r\n const { width, height } = this._container.getBoundingClientRect();\r\n this._width = width;\r\n this._height = height;\r\n this._renderer.setSize(width, height);\r\n camera.resize(width, height);\r\n }\r\n\r\n public get width(): number {\r\n return this._width;\r\n }\r\n\r\n public get height(): number {\r\n return this._height;\r\n }\r\n\r\n public get renderer(): I3DRenderer {\r\n return this._renderer;\r\n }\r\n\r\n public destroy(): void {\r\n this._renderer.dispose();\r\n }\r\n}\r\n","import {\r\n I3DEngine,\r\n I3DObject,\r\n I3DMaterial,\r\n I3DGeometry,\r\n I3DQuaternion,\r\n I3DVector3,\r\n I3DEuler,\r\n I3DMatrix4,\r\n I3DBox3,\r\n} from \"./abstractions/I3DEngine\";\r\n\r\nexport class String3DObject {\n public id: string;\n public type: string;\n private _object: I3DObject;\n private _material?: I3DMaterial;\n private _geometry?: I3DGeometry;\n private _texture?: any;\n private _uniforms: Record<string, { value: any }> = {};\r\n private _originalBoundingBox?: I3DBox3 | null;\r\n private _quaternion: I3DQuaternion;\r\n private _originalSize: I3DVector3;\r\n private _bbox: I3DBox3;\r\n public el: any;\r\n private _children: String3DObject[] = [];\r\n private engine: I3DEngine;\r\n\r\n public get children(): String3DObject[] {\r\n return this._children;\r\n }\r\n\r\n constructor(\n id: string,\n type: string,\n object: I3DObject,\n engine: I3DEngine,\n options: { material?: I3DMaterial; geometry?: I3DGeometry; texture?: any } = {}\n ) {\n this.id = id;\n this.type = type;\n this._object = object;\n this.engine = engine;\n this._material = options.material;\n this._geometry = options.geometry;\n this._texture = options.texture;\n this._quaternion = engine.createQuaternion();\n this._originalSize = engine.createVector3();\n this._bbox = engine.createBox3();\n this.updateBoundingBox();\n }\n\r\n public get object(): I3DObject {\r\n return this._object;\r\n }\r\n\r\n public get material(): I3DMaterial | undefined {\r\n return this._material;\r\n }\r\n\r\n public get originalSize(): I3DVector3 {\r\n return this._originalSize.clone();\r\n }\r\n\r\n public get boundingBox(): I3DBox3 {\r\n return this._bbox.clone();\r\n }\r\n\r\n public addChild(child: String3DObject): void {\r\n this._children.push(child);\r\n this.object.add(child.object);\r\n }\r\n\r\n public getWorldMatrix(): I3DMatrix4 {\r\n return this._object.matrixWorld.clone();\r\n }\r\n\r\n public getWorldPosition(): I3DVector3 {\r\n return this.engine.createVector3().setFromMatrixPosition(this._object.matrixWorld);\r\n }\r\n\r\n public getOriginalBoundingBox(): I3DBox3 {\r\n if (!this._originalBoundingBox) {\r\n const originalScale = this.object.scale.clone();\r\n this.object.scale.set(1, 1, 1);\r\n this.object.updateMatrixWorld(true);\r\n this._originalBoundingBox = this.engine.computeBoundingBoxRecursively(this.object);\r\n this.object.scale.copy(originalScale);\r\n this.object.updateMatrixWorld(true);\r\n }\r\n return this._originalBoundingBox!.clone();\r\n }\r\n\r\n public syncTransformFromMatrix(matrix: I3DMatrix4): void {\r\n const pos = this.engine.createVector3();\r\n const quat = this.engine.createQuaternion();\r\n const scale = this.engine.createVector3();\r\n matrix.decompose(pos, quat, scale);\r\n this._object.position.copy(pos);\r\n this._object.quaternion.copy(quat);\r\n this._object.scale.copy(scale);\r\n this._object.updateMatrix();\r\n this._object.updateMatrixWorld();\r\n }\r\n\r\n public applyWorldTransform(\r\n position: I3DVector3,\r\n quaternion: I3DQuaternion,\r\n scale: I3DVector3\r\n ): void {\r\n this._object.position.copy(position);\r\n this._object.quaternion.copy(quaternion);\r\n this._object.scale.copy(scale);\r\n this._object.updateMatrix();\r\n this._object.updateMatrixWorld();\r\n }\r\n\r\n public set quaternion(quaternion: I3DQuaternion) {\r\n this._quaternion.copy(quaternion);\r\n this._object.quaternion.copy(this._quaternion);\r\n this._object.updateMatrixWorld();\r\n }\r\n\r\n public set position(position: I3DVector3) {\r\n this._object.position.copy(position);\r\n }\r\n\r\n public set scale(scale: I3DVector3) {\r\n this._object.scale.copy(scale);\r\n }\r\n\r\n public set rotation(euler: I3DEuler) {\r\n this._object.rotation.copy(euler);\r\n }\r\n\r\n public set opacity(value: number) {\r\n const mat = this._object as any;\r\n if (mat.material && \"opacity\" in mat.material) {\r\n mat.material.opacity = value;\r\n }\r\n }\r\n\r\n public set metalness(value: number) {\r\n const mat = this._object as any;\r\n if (mat.material && \"metalness\" in mat.material) {\r\n mat.material.metalness = value;\r\n }\r\n }\r\n\r\n public set roughness(value: number) {\r\n const mat = this._object as any;\r\n if (mat.material && \"roughness\" in mat.material) {\r\n mat.material.roughness = value;\r\n }\r\n }\r\n\r\n public set texture(texture: any) {\n this._texture = texture;\n if ((this._object as any).isMesh && texture?.applyTexture) {\n texture.applyTexture(this._object);\n }\n }\n\n public set material(material: I3DMaterial | undefined) {\n this._material = material;\n }\n\n public set geometry(geometry: I3DGeometry | undefined) {\n this._geometry = geometry;\n }\n\n public updateBoundingBox(): void {\n this._bbox.setFromObject(this._object);\n this._bbox.getSize(this._originalSize);\n }\n\n public destroy(): void {\n this.disposeObjectResources(this._object);\n this._texture?.dispose?.();\n this._material?.dispose();\n this._geometry?.dispose();\n }\n\n private disposeObjectResources(object: I3DObject): void {\n const anyObj = object as any;\n if (anyObj?.geometry?.dispose) {\n anyObj.geometry.dispose();\n }\n const material = anyObj?.material;\n if (Array.isArray(material)) {\n material.forEach((mat) => mat?.dispose?.());\n } else if (material?.dispose) {\n material.dispose();\n }\n if (typeof anyObj?.traverse === \"function\") {\n anyObj.traverse((child: any) => {\n if (child?.geometry?.dispose) {\n child.geometry.dispose();\n }\n const childMat = child?.material;\n if (Array.isArray(childMat)) {\n childMat.forEach((mat: any) => mat?.dispose?.());\n } else if (childMat?.dispose) {\n childMat.dispose();\n }\n });\n }\n }\n}\n","import {\n I3DEngine,\n I3DScene,\n I3DLight,\n I3DMaterial,\n I3DModelLoader,\n I3DVector3,\n} from \"./abstractions/I3DEngine\";\nimport { String3DObject } from \"./String3DObject\";\nimport { StringObject } from \"@fiddle-digital/string-tune\";\n\nexport interface String3DSceneOptions {\n modelLoader?: I3DModelLoader;\n modelLoaderFactory?: (engine: I3DEngine, type?: string) => I3DModelLoader;\n}\n\nexport class String3DScene {\n private _scene: I3DScene;\n private _objects: Map<string, String3DObject> = new Map();\n private _rootObjects: String3DObject[] = [];\n private _elementMap: Map<string, HTMLElement> = new Map();\n private engine: I3DEngine;\n private _modelLoader?: I3DModelLoader;\n private _modelLoaderFactory?: (engine: I3DEngine, type?: string) => I3DModelLoader;\n private _modelLoaderCache: Map<string, I3DModelLoader> = new Map();\n\n public get rootObjects(): String3DObject[] {\n return this._rootObjects;\n }\n\n constructor(engine: I3DEngine, options: String3DSceneOptions = {}) {\n this.engine = engine;\n this._modelLoader = options.modelLoader;\n this._modelLoaderFactory = options.modelLoaderFactory;\n this._scene = engine.createScene();\n }\n\n public getScene(): I3DScene {\n return this._scene;\n }\n\n public getObject(id: string): String3DObject | undefined {\n return this._objects.get(id);\n }\n\n public hasObject(id: string): boolean {\n return this._objects.has(id);\n }\n\n public deleteObject(id: string): boolean {\n const obj = this._objects.get(id);\n if (obj) {\n this._scene.remove(obj.object);\n this._objects.delete(id);\n obj.destroy();\n return true;\n }\n return false;\n }\n\n public createFromElement(object: StringObject): void {\n const type = object.getProperty<string>(\"3d\");\n if (!type) return;\n\n const element = object.htmlElement;\n if (!element) return;\n\n const onAdd = (added3DObject: String3DObject) => {\n if (added3DObject) {\n const parentId = object.getProperty<string>(\"parentId\");\n if (parentId == null) {\n this._scene.add(added3DObject.object);\n this._rootObjects.push(added3DObject);\n } else {\n this._objects.get(parentId)?.addChild(added3DObject);\n }\n this._objects.set(object.id, added3DObject);\n this._elementMap.set(object.id, element);\n added3DObject.el = element;\n }\n };\n\n switch (type) {\n case \"group\":\n this.createGroup(object, onAdd);\n break;\n case \"pointLight\":\n this.createLight(object, \"point\", onAdd);\n break;\n case \"ambientLight\":\n this.createLight(object, \"ambient\", onAdd);\n break;\n case \"directionalLight\":\n this.createLight(object, \"directional\", onAdd);\n break;\n case \"spotLight\":\n this.createLight(object, \"spot\", onAdd);\n break;\n case \"hemisphereLight\":\n this.createLight(object, \"hemisphere\", onAdd);\n break;\n case \"model\":\n this.createModel(object, onAdd);\n break;\n case \"box\":\n this.createBox(object, onAdd);\n break;\n case \"sphere\":\n this.createSphere(object, onAdd);\n break;\n case \"plane\":\n this.createPlane(object, onAdd);\n break;\n case \"cylinder\":\n this.createCylinder(object, onAdd);\n break;\n }\n }\n\n private createGroup(object: StringObject, onAdd: (obj: String3DObject) => void): String3DObject {\n const group = this.engine.createGroup();\n const obj = new String3DObject(object.id, \"group\", group, this.engine);\n onAdd(obj);\n return obj;\n }\n\n private createLight(\n object: StringObject,\n kind: \"point\" | \"ambient\" | \"directional\" | \"spot\" | \"hemisphere\",\n onAdd: (obj: String3DObject) => void\n ): String3DObject {\n const color = object.getProperty<string>(\"3d-color\") || \"#ffffff\";\n const intensity = object.getProperty<number>(\"3d-intensity\") ?? 1;\n\n let light: I3DLight;\n if (kind === \"point\") {\n const distance = object.getProperty<number>(\"3d-distance\") ?? 1000;\n const decay = object.getProperty<number>(\"3d-decay\") ?? 0;\n light = this.engine.createPointLight(color, intensity, distance, decay);\n } else if (kind === \"directional\") {\n light = this.engine.createDirectionalLight(color, intensity);\n } else if (kind === \"spot\") {\n const distance = object.getProperty<number>(\"3d-distance\") ?? 0;\n const angle = object.getProperty<number>(\"3d-angle\") ?? Math.PI / 3;\n const penumbra = object.getProperty<number>(\"3d-penumbra\") ?? 0;\n const decay = object.getProperty<number>(\"3d-decay\") ?? 1;\n light = this.engine.createSpotLight(color, intensity, distance, angle, penumbra, decay);\n } else if (kind === \"hemisphere\") {\n const groundColor = object.getProperty<string>(\"3d-ground-color\") || \"#ffffff\";\n light = this.engine.createHemisphereLight(color, groundColor, intensity);\n } else {\n light = this.engine.createAmbientLight(color, intensity);\n }\n\n const castShadow = object.getProperty<boolean>(\"3d-cast-shadow\") ?? false;\n if (castShadow && light.shadow) {\n light.castShadow = true;\n const bias = object.getProperty<number>(\"3d-shadow-bias\") ?? 0;\n const mapSize = object.getProperty<number>(\"3d-shadow-map-size\") ?? 512;\n light.shadow.bias = bias;\n light.shadow.mapSize.width = mapSize;\n light.shadow.mapSize.height = mapSize;\n }\n\n const obj = new String3DObject(object.id, kind + \"Light\", light, this.engine);\n onAdd(obj);\n return obj;\n }\n\n private applyShadowProps(object: StringObject, mesh: any): void {\n const castShadow = object.getProperty<boolean>(\"3d-cast-shadow\") ?? false;\n const receiveShadow = object.getProperty<boolean>(\"3d-receive-shadow\") ?? false;\n mesh.castShadow = castShadow;\n mesh.receiveShadow = receiveShadow;\n }\n\n private createBox(object: StringObject, onAdd: (obj: String3DObject) => void): String3DObject {\n const geometry = this.engine.createBoxGeometry(1, 1, 1);\n const material = this.createMaterialFromObject(object);\n const mesh = this.engine.createMesh(geometry, material);\n this.applyShadowProps(object, mesh);\n const obj = new String3DObject(object.id, \"box\", mesh, this.engine, {\n geometry,\n material,\n });\n onAdd(obj);\n return obj;\n }\n\n private createSphere(object: StringObject, onAdd: (obj: String3DObject) => void): String3DObject {\n const widthSegments = object.getProperty<number>(\"3d-segments-width\") ?? 32;\n const heightSegments = object.getProperty<number>(\"3d-segments-height\") ?? 32;\n const geometry = this.engine.createSphereGeometry(0.5, widthSegments, heightSegments);\n const material = this.createMaterialFromObject(object);\n const mesh = this.engine.createMesh(geometry, material);\n this.applyShadowProps(object, mesh);\n const obj = new String3DObject(object.id, \"sphere\", mesh, this.engine, {\n geometry,\n material,\n });\n onAdd(obj);\n return obj;\n }\n\n private createPlane(object: StringObject, onAdd: (obj: String3DObject) => void): String3DObject {\n const geometry = this.engine.createPlaneGeometry(1, 1);\n const material = this.createMaterialFromObject(object);\n const mesh = this.engine.createMesh(geometry, material);\n this.applyShadowProps(object, mesh);\n const obj = new String3DObject(object.id, \"plane\", mesh, this.engine, {\n geometry,\n material,\n });\n onAdd(obj);\n return obj;\n }\n\n private createCylinder(\n object: StringObject,\n onAdd: (obj: String3DObject) => void\n ): String3DObject {\n const segments = object.getProperty<number>(\"3d-segments\") ?? 32;\n const geometry = this.engine.createCylinderGeometry(0.5, 0.5, 1, segments);\n const material = this.createMaterialFromObject(object);\n const mesh = this.engine.createMesh(geometry, material);\n this.applyShadowProps(object, mesh);\n const obj = new String3DObject(object.id, \"cylinder\", mesh, this.engine, {\n geometry,\n material,\n });\n onAdd(obj);\n return obj;\n }\n\n private createModel(object: StringObject, onAdd: (obj: String3DObject) => void): void {\n const modelPath = object.getProperty<string>(\"3d-model\");\n if (!modelPath) return;\n\n const loaderType = object.getProperty<string>(\"3d-model-loader\") || undefined;\n const loader = this.resolveModelLoader(loaderType);\n if (!loader) {\n console.warn(\"[String3D] Model loader not configured\");\n return;\n }\n\n const element = object.htmlElement;\n if (element) {\n this.applyModelTextureRemap(loader, element);\n }\n const shouldCenter = object.getProperty<boolean>(\"3d-model-center\") ?? false;\n\n loader.load(\n modelPath,\n (gltf: any) => {\n const root = gltf?.scene || gltf?.object || gltf;\n if (!root) {\n console.warn(\"[String3D] Model loader returned empty result\");\n return;\n }\n\n const overrideMaterial =\n element && this.shouldOverrideModelMaterial(element)\n ? this.createMaterialFromElement(element, object)\n : null;\n\n if (typeof root.traverse === \"function\") {\n root.traverse((child: any) => {\n if (child.isMesh) {\n if (overrideMaterial) {\n child.material = overrideMaterial;\n }\n this.applyShadowProps(object, child);\n }\n });\n }\n\n if (shouldCenter) {\n this.centerObject(root);\n }\n const obj = new String3DObject(object.id, \"model\", root, this.engine);\n onAdd(obj);\n },\n (xhr: any) => {\n console.log((xhr.loaded / xhr.total) * 100 + \"% loaded\");\n },\n (error: any) => {\n console.error(\"[String3D] Model loading error:\", error);\n }\n );\n }\n\n private resolveModelLoader(type?: string): I3DModelLoader | undefined {\n if (type) {\n if (this._modelLoaderCache.has(type)) {\n return this._modelLoaderCache.get(type);\n }\n if (!this._modelLoaderFactory) {\n console.warn(`[String3D] No model loader factory for type \"${type}\"`);\n return undefined;\n }\n const loader = this._modelLoaderFactory(this.engine, type);\n this._modelLoaderCache.set(type, loader);\n return loader;\n }\n\n if (this._modelLoader) {\n return this._modelLoader;\n }\n\n if (this._modelLoaderFactory) {\n return this._modelLoaderFactory(this.engine);\n }\n\n return undefined;\n }\n\n private centerObject(object: any): void {\n if (!object) return;\n const bbox = this.engine.computeBoundingBoxRecursively(object);\n const center = this.getBoxCenter(bbox);\n if (object.position?.set) {\n object.position.set(-center.x, -center.y, -center.z);\n }\n object.updateMatrixWorld(true);\n }\n\n private getBoxCenter(box: any): I3DVector3 {\n const center = this.engine.createVector3();\n center.x = (box.min.x + box.max.x) / 2;\n center.y = (box.min.y + box.max.y) / 2;\n center.z = (box.min.z + box.max.z) / 2;\n return center;\n }\n\n private createMaterialFromObject(object: StringObject): I3DMaterial {\n return this.createMaterialFromElement(object.htmlElement, object);\n }\n\n private createMaterialFromElement(\n element: HTMLElement | null,\n object?: StringObject\n ): I3DMaterial {\n const attr = object?.getProperty<string>(\"3d-material\") || \"basic[#ffffff]\";\n let [type, colorRaw] = attr.split(/\\[|\\]/);\n const color = colorRaw || \"#ffffff\";\n const opacity = object?.getProperty<number>(\"3d-opacity\") ?? 1;\n const metalness = object?.getProperty<number>(\"3d-metalness\");\n const roughness = object?.getProperty<number>(\"3d-roughness\");\n const params: any = {\n color,\n transparent: opacity < 1,\n opacity: opacity,\n };\n\n const mapSrc = element?.getAttribute(\"string-3d-map\");\n const normalMapSrc = element?.getAttribute(\"string-3d-normalMap\");\n const roughnessMapSrc = element?.getAttribute(\"string-3d-roughnessMap\");\n const metalnessMapSrc = element?.getAttribute(\"string-3d-metalnessMap\");\n const aoMapSrc = element?.getAttribute(\"string-3d-aoMap\");\n const flipY = this.parseFlipY(object, element);\n const colorSpace =\n object?.getProperty<string>(\"3d-colorSpace\") ||\n element?.getAttribute(\"string-3d-colorSpace\") ||\n \"\";\n\n const hasMaps = !!(mapSrc || normalMapSrc || roughnessMapSrc || metalnessMapSrc || aoMapSrc);\n if (type !== \"standard\" && hasMaps) {\n type = \"standard\";\n }\n\n if (type === \"standard\") {\n if (mapSrc) {\n params.map = this.loadTexture(mapSrc, { flipY, colorSpace });\n }\n if (normalMapSrc) params.normalMap = this.loadTexture(normalMapSrc, { flipY });\n if (roughnessMapSrc) params.roughnessMap = this.loadTexture(roughnessMapSrc, { flipY });\n if (metalnessMapSrc) params.metalnessMap = this.loadTexture(metalnessMapSrc, { flipY });\n if (aoMapSrc) params.aoMap = this.loadTexture(aoMapSrc, { flipY });\n if (typeof metalness === \"number\") params.metalness = metalness;\n if (typeof roughness === \"number\") params.roughness = roughness;\n return this.engine.createMeshStandardMaterial(params);\n }\n\n return this.engine.createMeshBasicMaterial(params);\n }\n\n private loadTexture(src: string, options: { flipY?: boolean; colorSpace?: string } = {}): any {\n const textureLoader = this.engine.createTextureLoader();\n const texture = textureLoader.load(src);\n if (typeof options.flipY === \"boolean\") {\n texture.flipY = options.flipY;\n }\n const colorSpace = (options.colorSpace || \"\").toLowerCase().trim();\n if (colorSpace && \"colorSpace\" in texture) {\n texture.colorSpace = colorSpace === \"srgb\" ? \"srgb\" : \"linear\";\n }\n texture.needsUpdate = true;\n return texture;\n }\n\n private parseFlipY(object?: StringObject, element?: HTMLElement | null): boolean | undefined {\n const value =\n object?.getProperty<boolean>(\"3d-texture-flipY\") ??\n element?.getAttribute(\"string-3d-texture-flipY\");\n if (value === undefined || value === null || value === \"\") return undefined;\n if (typeof value === \"boolean\") return value;\n const normalized = String(value).toLowerCase().trim();\n if (normalized === \"false\" || normalized === \"0\" || normalized === \"no\") return false;\n if (normalized === \"true\" || normalized === \"1\" || normalized === \"yes\") return true;\n return undefined;\n }\n\n private shouldOverrideModelMaterial(element: HTMLElement): boolean {\n const attrs = [\n \"string-3d-material\",\n \"string-3d-color\",\n \"string-3d-opacity\",\n \"string-3d-map\",\n \"string-3d-normalMap\",\n \"string-3d-roughnessMap\",\n \"string-3d-metalnessMap\",\n \"string-3d-aoMap\",\n \"string-3d-metalness\",\n \"string-3d-roughness\",\n ];\n return attrs.some((attr) => element.hasAttribute(attr));\n }\n\n private applyModelTextureRemap(loader: any, element: HTMLElement): void {\n const baseRaw = (element.getAttribute(\"string-3d-model-texture-base\") || \"\").trim();\n const base = baseRaw ? baseRaw.replace(/\\/?$/, \"/\") : \"\";\n const mappingRaw = element.getAttribute(\"string-3d-model-textures\");\n let mapping: Record<string, string> | null = null;\n\n if (mappingRaw) {\n try {\n mapping = JSON.parse(mappingRaw);\n } catch (error) {\n console.warn(\"[String3D] Invalid model texture mapping JSON:\", error);\n }\n }\n\n const manager = loader?.manager;\n if (!manager || typeof manager.setURLModifier !== \"function\") {\n if (mapping || base) {\n console.warn(\"[String3D] Model loader does not support URL remap.\");\n }\n return;\n }\n\n manager.setURLModifier((url: string) => {\n const mapped = mapping && url in mapping ? mapping[url] : url;\n if (!base) return mapped;\n if (/^(blob:|data:|https?:|file:|\\/)/i.test(mapped)) return mapped;\n return base + mapped.replace(/^\\.?\\//, \"\");\n });\n }\n\n public destroy(): void {\n this._objects.forEach((obj) => obj.destroy());\n this._objects.clear();\n this._rootObjects = [];\n }\n}\n","import { String3DObject } from \"../String3DObject\";\nimport type { String3DObjectSyncStrategy } from \"./String3DObjectSyncStrategy\";\nimport type { SyncContext } from \"./SyncContext\";\n\ntype StyleMap = {\n get?: (prop: string) => any;\n};\n\nexport class GroupSynchronizer implements String3DObjectSyncStrategy {\n sync(el: HTMLElement, object: String3DObject, ctx: SyncContext, parentData: any): any {\n const rect = el.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n const styleMap = (el as any).computedStyleMap?.() as StyleMap | undefined;\n let style: CSSStyleDeclaration | null = null;\n const getStyle = () => {\n if (!style) style = getComputedStyle(el);\n return style;\n };\n\n const readNumberStyle = (prop: string, fallback: number): number => {\n const mapValue = styleMap?.get?.(prop);\n if (mapValue !== undefined) {\n if (typeof mapValue === \"number\") return mapValue;\n if (typeof mapValue === \"string\") {\n const parsed = Number.parseFloat(mapValue);\n if (!Number.isNaN(parsed)) return parsed;\n }\n if (mapValue && typeof mapValue === \"object\") {\n const value = (mapValue as any).value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n }\n\n const raw = getStyle().getPropertyValue(prop);\n const parsed = Number.parseFloat(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n };\n\n const translateZ = readNumberStyle(\"--translate-z\", 0);\n const position = ctx.camera.screenToWorld(centerX, centerY, translateZ);\n object.position = position;\n\n const scale = readNumberStyle(\"--scale\", 1);\n object.scale = ctx.engine.createVector3(scale, scale, scale);\n\n const rotateX = -ctx.engine.degToRad(readNumberStyle(\"--rotate-x\", 0));\n const rotateY = ctx.engine.degToRad(readNumberStyle(\"--rotate-y\", 0));\n const rotateZ = -ctx.engine.degToRad(readNumberStyle(\"--rotate-z\", 0));\n object.rotation = ctx.engine.createEuler(rotateX, rotateY, rotateZ, \"XYZ\");\n\r\n object.object.updateMatrixWorld(true);\r\n\r\n return { scale };\r\n }\r\n}\r\n","import { String3DObject } from \"../String3DObject\";\r\nimport type { String3DObjectSyncStrategy } from \"./String3DObjectSyncStrategy\";\r\nimport type { SyncContext } from \"./SyncContext\";\r\nimport { I3DLight } from \"../abstractions/I3DEngine\";\r\n\r\nexport class LightSynchronizer implements String3DObjectSyncStrategy {\r\n sync(el: HTMLElement, object: String3DObject, ctx: SyncContext, parentData: any): any {\r\n const rect = el.getBoundingClientRect();\r\n const centerX = rect.left + rect.width / 2;\r\n const centerY = rect.top + rect.height / 2;\r\n\r\n const translateZ = parseFloat(getComputedStyle(el).getPropertyValue(\"--translate-z\") || \"0\");\r\n const position = ctx.camera.screenToWorld(centerX, centerY, translateZ);\r\n object.position = position;\r\n\r\n const light = object.object as I3DLight;\r\n\r\n // Color\r\n const color = el.getAttribute(\"string-3d-color\");\r\n if (color && light.color && typeof light.color.set === \"function\") {\r\n light.color.set(color);\r\n }\r\n\r\n // Intensity\r\n const intensity = el.getAttribute(\"string-3d-intensity\");\r\n if (intensity) {\r\n light.intensity = parseFloat(intensity);\r\n }\r\n\r\n // Distance & Decay\r\n const distance = el.getAttribute(\"string-3d-distance\");\r\n if (distance && typeof light.distance !== \"undefined\") {\r\n light.distance = parseFloat(distance);\r\n }\r\n const decay = el.getAttribute(\"string-3d-decay\");\r\n if (decay && typeof light.decay !== \"undefined\") {\r\n light.decay = parseFloat(decay);\r\n }\r\n\r\n // SpotLight specific\r\n const angle = el.getAttribute(\"string-3d-angle\");\r\n if (angle && typeof light.angle !== \"undefined\") {\r\n light.angle = parseFloat(angle);\r\n }\r\n const penumbra = el.getAttribute(\"string-3d-penumbra\");\r\n if (penumbra && typeof light.penumbra !== \"undefined\") {\r\n light.penumbra = parseFloat(penumbra);\r\n }\r\n\r\n // Hemisphere specific\r\n const groundColor = el.getAttribute(\"string-3d-ground-color\");\r\n if (\r\n groundColor &&\r\n (light as any).groundColor &&\r\n typeof (light as any).groundColor.set === \"function\"\r\n ) {\r\n (light as any).groundColor.set(groundColor);\r\n }\r\n\r\n // Shadows\r\n const castShadow = el.getAttribute(\"string-3d-cast-shadow\") === \"true\";\r\n if (light.castShadow !== castShadow) {\r\n light.castShadow = castShadow;\r\n }\r\n if (castShadow && light.shadow) {\r\n const bias = el.getAttribute(\"string-3d-shadow-bias\");\r\n if (bias) light.shadow.bias = parseFloat(bias);\r\n\r\n const mapSize = el.getAttribute(\"string-3d-shadow-map-size\");\r\n if (mapSize) {\r\n const size = parseFloat(mapSize);\r\n if (light.shadow.mapSize.width !== size) {\r\n light.shadow.mapSize.width = size;\r\n light.shadow.mapSize.height = size;\r\n }\r\n }\r\n }\r\n\r\n // Target (Directional, Spot)\r\n const targetId = el.getAttribute(\"string-3d-target\");\r\n if (targetId && light.target) {\r\n const targetEl = document.querySelector(`[string-id=\"${targetId}\"]`);\r\n if (targetEl) {\r\n const tRect = targetEl.getBoundingClientRect();\r\n const tCenterX = tRect.left + tRect.width / 2;\r\n const tCenterY = tRect.top + tRect.height / 2;\r\n const tTranslateZ = parseFloat(\r\n getComputedStyle(targetEl).getPropertyValue(\"--translate-z\") || \"0\"\r\n );\r\n const tPos = ctx.camera.screenToWorld(tCenterX, tCenterY, tTranslateZ);\r\n\r\n light.target.position.copy(tPos);\r\n light.target.updateMatrixWorld(true);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { String3DObject } from \"../String3DObject\";\nimport type { SyncContext } from \"./SyncContext\";\nimport type { String3DObjectSyncStrategy } from \"./String3DObjectSyncStrategy\";\n\ntype StyleMap = {\n get?: (prop: string) => any;\n};\n\nexport class MeshSynchronizer implements String3DObjectSyncStrategy {\n static applyVisualProps(el: HTMLElement, object: String3DObject, opacityValue?: number): void {\n const castShadow = el.getAttribute(\"string-3d-cast-shadow\") === \"true\";\n const receiveShadow = el.getAttribute(\"string-3d-receive-shadow\") === \"true\";\n\n const opacity = typeof opacityValue === \"number\" ? opacityValue : NaN;\n\n if (object.object.traverse) {\n object.object.traverse((child: any) => {\n if (child.isMesh) {\n if (child.castShadow !== castShadow) child.castShadow = castShadow;\n if (child.receiveShadow !== receiveShadow) child.receiveShadow = receiveShadow;\n\n if (!isNaN(opacity)) {\n const materials = Array.isArray(child.material) ? child.material : [child.material];\n materials.forEach((mat: any) => {\n if (mat) {\n mat.opacity = opacity;\n mat.transparent = opacity < 1;\n }\n });\n }\n }\n });\n } else if ((object.object as any).isMesh) {\n const mesh = object.object as any;\n if (mesh.castShadow !== castShadow) mesh.castShadow = castShadow;\n if (mesh.receiveShadow !== receiveShadow) mesh.receiveShadow = receiveShadow;\n\n if (!isNaN(opacity)) {\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n materials.forEach((mat: any) => {\n if (mat) {\n mat.opacity = opacity;\n mat.transparent = opacity < 1;\n }\n });\n }\n }\n }\n\n sync(el: HTMLElement, object: String3DObject, ctx: SyncContext, parentData: any): any {\n const styleMap = (el as any).computedStyleMap?.() as StyleMap | undefined;\n let style: CSSStyleDeclaration | null = null;\n const getStyle = () => {\n if (!style) style = getComputedStyle(el);\n return style;\n };\n\n const rect = el.getBoundingClientRect();\n const originalWidth = el.offsetWidth || rect.width;\n const originalHeight = el.offsetHeight || rect.height;\n\n const readNumberStyle = (prop: string, fallback: number): number => {\n const mapValue = styleMap?.get?.(prop);\n if (mapValue !== undefined) {\n if (typeof mapValue === \"number\") return mapValue;\n if (typeof mapValue === \"string\") {\n const parsed = Number.parseFloat(mapValue);\n if (!Number.isNaN(parsed)) return parsed;\n }\n if (mapValue && typeof mapValue === \"object\") {\n const value = (mapValue as any).value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n }\n\n const raw = getStyle().getPropertyValue(prop);\n const parsed = Number.parseFloat(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n };\n\n const translateZ = readNumberStyle(\"--translate-z\", 0);\n const cssScale = readNumberStyle(\"--scale\", 1);\n\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n const worldPos = ctx.camera.screenToWorld(centerX, centerY, translateZ);\n object.position = worldPos;\n\n const rotateX = -ctx.engine.degToRad(readNumberStyle(\"--rotate-x\", 0));\n const rotateY = ctx.engine.degToRad(readNumberStyle(\"--rotate-y\", 0));\n const rotateZ = -ctx.engine.degToRad(readNumberStyle(\"--rotate-z\", 0));\n object.rotation = ctx.engine.createEuler(rotateX, rotateY, rotateZ, \"XYZ\");\n\n const targetWidth = originalWidth * cssScale;\n const targetHeight = originalHeight * cssScale;\n const cssScaleZ = readNumberStyle(\"--scale-z\", 1);\n const parentScale = parentData?.scale || 1;\n\n const objectType = object.type;\n let scaleX: number, scaleY: number, scaleZ: number;\n\n switch (objectType) {\n case \"box\":\n case \"sphere\": {\n const uniformSize = Math.min(targetWidth, targetHeight);\n scaleX = uniformSize * parentScale;\n scaleY = uniformSize * parentScale;\n scaleZ = uniformSize * cssScaleZ * parentScale;\n break;\n }\n case \"model\": {\n const bbox = object.getOriginalBoundingBox();\n const size = bbox.getSize(ctx.engine.createVector3());\n const fitMode = (el.getAttribute(\"string-3d-model-fit\") || \"contain\").toLowerCase().trim();\n const modelScaleAttr = parseFloat(el.getAttribute(\"string-3d-model-scale\") || \"1\");\n const modelScale = Number.isFinite(modelScaleAttr) ? modelScaleAttr : 1;\n\n if (size.x > 0 && size.y > 0) {\n const scaleToWidth = targetWidth / size.x;\n const scaleToHeight = targetHeight / size.y;\n const uniformScale =\n fitMode === \"cover\"\n ? Math.max(scaleToWidth, scaleToHeight)\n : Math.min(scaleToWidth, scaleToHeight);\n\n scaleX = uniformScale * modelScale * parentScale;\n scaleY = uniformScale * modelScale * parentScale;\n scaleZ = uniformScale * modelScale * cssScaleZ * parentScale;\n } else {\n const fallbackSize = Math.min(targetWidth, targetHeight);\n scaleX = fallbackSize * modelScale * parentScale;\n scaleY = fallbackSize * modelScale * parentScale;\n scaleZ = fallbackSize * modelScale * cssScaleZ * parentScale;\n }\n break;\n }\n case \"cylinder\": {\n const cylRadius = targetWidth;\n scaleX = cylRadius * parentScale;\n scaleY = targetHeight * parentScale;\n scaleZ = cylRadius * cssScaleZ * parentScale;\n break;\n }\n case \"plane\":\n default:\n scaleX = targetWidth * parentScale;\n scaleY = targetHeight * parentScale;\n scaleZ = Math.min(targetWidth, targetHeight) * 0.5 * cssScaleZ * parentScale;\n break;\n }\n\n object.scale = ctx.engine.createVector3(scaleX, scaleY, scaleZ);\n\n const opacity = readNumberStyle(\"--opacity\", NaN);\n MeshSynchronizer.applyVisualProps(el, object, opacity);\n\n return { scale: cssScale * parentScale };\n }\n}\n","import { String3DCamera } from \"../String3DCamera\";\r\nimport { String3DObject } from \"../String3DObject\";\r\nimport { I3DEngine } from \"../abstractions/I3DEngine\";\r\nimport { GroupSynchronizer } from \"./GroupSynchronizer\";\r\nimport { LightSynchronizer } from \"./LightSynchronizer\";\r\nimport { MeshSynchronizer } from \"./MeshSynchronizer\";\r\nimport type { String3DObjectSyncStrategy } from \"./String3DObjectSyncStrategy\";\r\n\r\nexport class String3DSynchronizer {\r\n private strategies: Map<string, String3DObjectSyncStrategy> = new Map();\r\n\r\n constructor(\r\n public camera: String3DCamera,\r\n public viewportWidth: number,\r\n public viewportHeight: number,\r\n public engine: I3DEngine\r\n ) {\r\n this.strategies.set(\"box\", new MeshSynchronizer());\r\n this.strategies.set(\"sphere\", new MeshSynchronizer());\r\n this.strategies.set(\"plane\", new MeshSynchronizer());\r\n this.strategies.set(\"cylinder\", new MeshSynchronizer());\r\n this.strategies.set(\"model\", new MeshSynchronizer());\r\n this.strategies.set(\"group\", new GroupSynchronizer());\r\n this.strategies.set(\"pointLight\", new LightSynchronizer());\r\n this.strategies.set(\"ambientLight\", new LightSynchronizer());\r\n this.strategies.set(\"directionalLight\", new LightSynchronizer());\r\n this.strategies.set(\"spotLight\", new LightSynchronizer());\r\n this.strategies.set(\"hemisphereLight\", new LightSynchronizer());\r\n }\r\n\r\n public syncElement(el: HTMLElement, object: String3DObject, parentData: any): any {\r\n const strategy = this.strategies.get(object.type);\r\n if (!strategy) {\r\n console.warn(`[String3D Sync] No strategy for type \"${object.type}\"`);\r\n return null;\r\n }\r\n\r\n return strategy.sync(\r\n el,\r\n object,\r\n {\r\n camera: this.camera,\r\n viewportWidth: this.viewportWidth,\r\n viewportHeight: this.viewportHeight,\r\n engine: this.engine,\r\n },\r\n parentData\r\n );\r\n }\r\n\r\n public updateViewportSize(width: number, height: number): void {\r\n this.viewportWidth = width;\r\n this.viewportHeight = height;\r\n }\r\n}\r\n","export type TransformWorkerInput = {\n id: string;\n type: string;\n rectLeft: number;\n rectTop: number;\n rectWidth: number;\n rectHeight: number;\n translateZ: number;\n scale: number;\n scaleZ: number;\n rotateX: number;\n rotateY: number;\n rotateZ: number;\n parentScale: number;\n modelSizeX?: number;\n modelSizeY?: number;\n modelScale?: number;\n fitMode?: string;\n};\n\nexport type TransformWorkerCamera = {\n mode: \"orthographic\" | \"perspective\";\n width: number;\n height: number;\n cameraZ: number;\n fov: number;\n aspect: number;\n};\n\nexport type TransformWorkerResult = {\n id: string;\n posX: number;\n posY: number;\n posZ: number;\n rotX: number;\n rotY: number;\n rotZ: number;\n scaleX: number;\n scaleY: number;\n scaleZ: number;\n};\n\nexport type TransformWorkerJobResult = {\n frameId: number;\n results: TransformWorkerResult[];\n};\n\nexport type TransformWorkerOptions = {\n wasmUrl?: string;\n};\n\nconst WORKER_SOURCE = `\nlet wasm = null;\nlet wasmReady = false;\n\nfunction degToRad(deg) {\n return (deg * Math.PI) / 180;\n}\n\nfunction computeTransform(item, camera) {\n const centerX = item.rectLeft + item.rectWidth / 2;\n const centerY = item.rectTop + item.rectHeight / 2;\n\n let posX = 0;\n let posY = 0;\n let posZ = item.translateZ;\n\n if (camera.mode === \"orthographic\") {\n posX = centerX - camera.width / 2;\n posY = -(centerY - camera.height / 2);\n } else {\n const fov = degToRad(camera.fov);\n const distance = Math.abs(item.translateZ - camera.cameraZ);\n const height = 2 * Math.tan(fov / 2) * distance;\n const width = height * camera.aspect;\n const normalizedX = centerX / camera.width;\n const normalizedY = centerY / camera.height;\n posX = (normalizedX - 0.5) * width;\n posY = -(normalizedY - 0.5) * height;\n }\n\n const rotX = -degToRad(item.rotateX);\n const rotY = degToRad(item.rotateY);\n const rotZ = -degToRad(item.rotateZ);\n\n let scaleX = 1;\n let scaleY = 1;\n let scaleZ = 1;\n\n if (item.type === \"group\") {\n scaleX = item.scale;\n scaleY = item.scale;\n scaleZ = item.scale;\n } else {\n const targetWidth = item.rectWidth * item.scale;\n const targetHeight = item.rectHeight * item.scale;\n const parentScale = item.parentScale || 1;\n const cssScaleZ = item.scaleZ || 1;\n\n if (item.type === \"box\" || item.type === \"sphere\") {\n const uniformSize = Math.min(targetWidth, targetHeight);\n scaleX = uniformSize * parentScale;\n scaleY = uniformSize * parentScale;\n scaleZ = uniformSize * cssScaleZ * parentScale;\n } else if (item.type === \"model\") {\n const sizeX = item.modelSizeX || 0;\n const sizeY = item.modelSizeY || 0;\n const fitMode = (item.fitMode || \"contain\").toLowerCase().trim();\n const modelScale = Number.isFinite(item.modelScale) ? item.modelScale : 1;\n\n if (sizeX > 0 && sizeY > 0) {\n const scaleToWidth = targetWidth / sizeX;\n const scaleToHeight = targetHeight / sizeY;\n const uniformScale = fitMode === \"cover\"\n ? Math.max(scaleToWidth, scaleToHeight)\n : Math.min(scaleToWidth, scaleToHeight);\n scaleX = uniformScale * modelScale * parentScale;\n scaleY = uniformScale * modelScale * parentScale;\n scaleZ = uniformScale * modelScale * cssScaleZ * parentScale;\n } else {\n const fallbackSize = Math.min(targetWidth, targetHeight);\n scaleX = fallbackSize * modelScale * parentScale;\n scaleY = fallbackSize * modelScale * parentScale;\n scaleZ = fallbackSize * modelScale * cssScaleZ * parentScale;\n }\n } else if (item.type === \"cylinder\") {\n const cylRadius = targetWidth;\n scaleX = cylRadius * parentScale;\n scaleY = targetHeight * parentScale;\n scaleZ = cylRadius * cssScaleZ * parentScale;\n } else {\n scaleX = targetWidth * parentScale;\n scaleY = targetHeight * parentScale;\n scaleZ = Math.min(targetWidth, targetHeight) * 0.5 * cssScaleZ * parentScale;\n }\n }\n\n return {\n id: item.id,\n posX,\n posY,\n posZ,\n rotX,\n rotY,\n rotZ,\n scaleX,\n scaleY,\n scaleZ,\n };\n}\n\nasync function initWasm(url) {\n try {\n const res = await fetch(url);\n const bytes = await res.arrayBuffer();\n const mod = await WebAssembly.instantiate(bytes, {});\n wasm = mod.instance;\n wasmReady = true;\n } catch (error) {\n wasm = null;\n wasmReady = false;\n }\n}\n\nself.onmessage = async (event) => {\n const data = event.data || {};\n if (data.type === \"init\") {\n if (data.wasmUrl) {\n await initWasm(data.wasmUrl);\n }\n self.postMessage({ type: \"ready\", wasmReady });\n return;\n }\n\n if (data.type === \"compute\") {\n const items = data.items || [];\n const camera = data.camera || {};\n const results = new Array(items.length);\n for (let i = 0; i < items.length; i += 1) {\n results[i] = computeTransform(items[i], camera);\n }\n self.postMessage({ type: \"result\", frameId: data.frameId, results });\n }\n};\n`;\n\nexport class TransformWorkerClient {\n private worker: Worker | null = null;\n private ready = false;\n private lastResult: TransformWorkerJobResult | null = null;\n private pending = false;\n\n constructor(options: TransformWorkerOptions = {}) {\n if (typeof Worker === \"undefined\") return;\n const blob = new Blob([WORKER_SOURCE], { type: \"text/javascript\" });\n this.worker = new Worker(URL.createObjectURL(blob));\n this.worker.onmessage = (event) => {\n const data = event.data || {};\n if (data.type === \"ready\") {\n this.ready = true;\n return;\n }\n if (data.type === \"result\") {\n this.lastResult = {\n frameId: typeof data.frameId === \"number\" ? data.frameId : 0,\n results: data.results || [],\n };\n this.pending = false;\n }\n };\n this.worker.postMessage({ type: \"init\", wasmUrl: options.wasmUrl });\n }\n\n public isReady(): boolean {\n return this.ready;\n }\n\n public isPending(): boolean {\n return this.pending;\n }\n\n public submit(\n items: TransformWorkerInput[],\n camera: TransformWorkerCamera,\n frameId: number\n ): void {\n if (!this.worker || !this.ready || this.pending) return;\n this.pending = true;\n this.worker.postMessage({\n type: \"compute\",\n frameId,\n items,\n camera,\n });\n }\n\n public takeLastResult(): TransformWorkerJobResult | null {\n const result = this.lastResult;\n this.lastResult = null;\n return result;\n }\n\n public destroy(): void {\n this.worker?.terminate();\n this.worker = null;\n this.ready = false;\n this.pending = false;\n this.lastResult = null;\n }\n}\n","import {\r\n I3DEngine,\r\n I3DVector3,\r\n I3DVector2,\r\n I3DQuaternion,\r\n I3DEuler,\r\n I3DMatrix4,\r\n I3DBox3,\r\n I3DScene,\r\n I3DRenderer,\r\n I3DPerspectiveCamera,\r\n I3DOrthographicCamera,\r\n I3DObject,\r\n I3DMesh,\r\n I3DGeometry,\r\n I3DMaterial,\r\n I3DLight,\r\n I3DTextureLoader,\r\n I3DModelLoader,\r\n} from \"../core/abstractions/I3DEngine\";\r\nimport { I3DEngineProvider } from \"../core/abstractions/I3DEngineProvider\";\r\n\r\nexport class ThreeJSEngine implements I3DEngine {\r\n private THREE: any;\r\n private loaders: Record<string, any>;\r\n\r\n constructor(THREE: any, loaders: Record<string, any> = {}) {\r\n this.THREE = THREE;\r\n this.loaders = loaders;\r\n }\r\n\r\n createVector3(x = 0, y = 0, z = 0): I3DVector3 {\r\n return new this.THREE.Vector3(x, y, z);\r\n }\r\n\r\n createVector2(x = 0, y = 0): I3DVector2 {\r\n return new this.THREE.Vector2(x, y);\r\n }\r\n\r\n createQuaternion(x = 0, y = 0, z = 0, w = 1): I3DQuaternion {\r\n return new this.THREE.Quaternion(x, y, z, w);\r\n }\r\n\r\n createEuler(x = 0, y = 0, z = 0, order = \"XYZ\"): I3DEuler {\r\n return new this.THREE.Euler(x, y, z, order);\r\n }\r\n\r\n createMatrix4(): I3DMatrix4 {\r\n return new this.THREE.Matrix4();\r\n }\r\n\r\n createBox3(min?: I3DVector3, max?: I3DVector3): I3DBox3 {\r\n return new this.THREE.Box3(min, max);\r\n }\r\n\r\n createScene(): I3DScene {\r\n return new this.THREE.Scene();\r\n }\r\n\r\n createRenderer(options?: {\r\n antialias?: boolean;\r\n alpha?: boolean;\r\n logarithmicDepthBuffer?: boolean;\r\n }): I3DRenderer {\r\n const renderer = new this.THREE.WebGLRenderer(options);\r\n renderer.outputEncoding = this.THREE.sRGBEncoding;\r\n return renderer;\r\n }\r\n\r\n createPerspectiveCamera(fov = 45, aspect = 1, near = 0.1, far = 2000): I3DPerspectiveCamera {\r\n return new this.THREE.PerspectiveCamera(fov, aspect, near, far);\r\n }\r\n\r\n createOrthographicCamera(\r\n left: number,\r\n right: number,\r\n top: number,\r\n bottom: number,\r\n near = 0.1,\r\n far = 10000\r\n ): I3DOrthographicCamera {\r\n return new this.THREE.OrthographicCamera(left, right, top, bottom, near, far);\r\n }\r\n\r\n createGroup(): I3DObject {\r\n return new this.THREE.Group();\r\n }\r\n\r\n createMesh(geometry: I3DGeometry, material: I3DMaterial): I3DMesh {\r\n return new this.THREE.Mesh(geometry, material);\r\n }\r\n\r\n createBoxGeometry(width: number, height: number, depth: number): I3DGeometry {\r\n return new this.THREE.BoxGeometry(width, height, depth);\r\n }\r\n\r\n createSphereGeometry(radius: number, widthSegments = 32, heightSegments = 32): I3DGeometry {\r\n return new this.THREE.SphereGeometry(radius, widthSegments, heightSegments);\r\n }\r\n\r\n createPlaneGeometry(width: number, height: number): I3DGeometry {\r\n return new this.THREE.PlaneGeometry(width, height);\r\n }\r\n\r\n createCylinderGeometry(\r\n radiusTop: number,\r\n radiusBottom: number,\r\n height: number,\r\n segments = 32\r\n ): I3DGeometry {\r\n return new this.THREE.CylinderGeometry(radiusTop, radiusBottom, height, segments);\r\n }\r\n\r\n createMeshBasicMaterial(params?: any): I3DMaterial {\r\n return new this.THREE.MeshBasicMaterial(params);\r\n }\r\n\r\n createMeshStandardMaterial(params?: any): I3DMaterial {\r\n return new this.THREE.MeshStandardMaterial(params);\r\n }\r\n\r\n createPointLight(color?: string | number, intensity = 1, distance = 0, decay = 2): I3DLight {\r\n return new this.THREE.PointLight(color, intensity, distance, decay);\r\n }\r\n\r\n createSpotLight(\r\n color?: string | number,\r\n intensity = 1,\r\n distance = 0,\r\n angle = Math.PI / 3,\r\n penumbra = 0,\r\n decay = 1\r\n ): I3DLight {\r\n return new this.THREE.SpotLight(color, intensity, distance, angle, penumbra, decay);\r\n }\r\n\r\n createHemisphereLight(\r\n skyColor?: string | number,\r\n groundColor?: string | number,\r\n intensity = 1\r\n ): I3DLight {\r\n return new this.THREE.HemisphereLight(skyColor, groundColor, intensity);\r\n }\r\n\r\n createAmbientLight(color?: string | number, intensity = 1): I3DLight {\r\n return new this.THREE.AmbientLight(color, intensity);\r\n }\r\n\r\n createDirectionalLight(color?: string | number, intensity = 1): I3DLight {\r\n return new this.THREE.DirectionalLight(color, intensity);\r\n }\r\n\r\n createTextureLoader(): I3DTextureLoader {\r\n return new this.THREE.TextureLoader();\r\n }\r\n\r\n createModelLoader(type: string): I3DModelLoader {\r\n const LoaderClass = this.loaders[type];\r\n if (!LoaderClass) {\r\n throw new Error(`[ThreeJSEngine] Model loader \"${type}\" not registered`);\r\n }\r\n return new LoaderClass();\r\n }\r\n\r\n degToRad(degrees: number): number {\r\n return this.THREE.MathUtils.degToRad(degrees);\r\n }\r\n\r\n radToDeg(radians: number): number {\r\n return this.THREE.MathUtils.radToDeg(radians);\r\n }\r\n\r\n computeBoundingBoxRecursively(object: I3DObject): I3DBox3 {\r\n const boundingBox = new this.THREE.Box3();\r\n let hasBox = false;\r\n\r\n if (object.traverse) {\r\n object.traverse((child: any) => {\r\n if (!child.visible) return;\r\n if (child.geometry) {\r\n if (typeof child.geometry.computeBoundingBox === \"function\") {\r\n child.geometry.computeBoundingBox();\r\n }\r\n const box = child.geometry.boundingBox;\r\n if (box) {\r\n const childBox = box.clone().applyMatrix4(child.matrixWorld);\r\n boundingBox.union(childBox);\r\n hasBox = true;\r\n }\r\n }\r\n });\r\n }\r\n\r\n return hasBox ? boundingBox : new this.THREE.Box3();\r\n }\r\n}\r\n\r\nexport class ThreeJSProvider implements I3DEngineProvider {\r\n private engine: ThreeJSEngine;\r\n\r\n constructor(THREE: any, loaders: Record<string, any> = {}) {\r\n this.engine = new ThreeJSEngine(THREE, loaders);\r\n }\r\n\r\n getEngine(): I3DEngine {\r\n return this.engine;\r\n }\r\n\r\n getName(): string {\r\n return \"Three.js\";\r\n }\r\n}\r\n"],"mappings":"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","names":["index_exports","__export","String3D","String3DCamera","String3DObject","String3DRenderer","String3DScene","String3DSynchronizer","ThreeJSEngine","ThreeJSProvider","__toCommonJS","import_string_tune","String3DCamera","engine","mode","fov","near","far","width","height","ortho","x","y","z","screenX","screenY","normalizedX","normalizedY","distance","viewportHeight","roundedZ","scale","String3DRenderer","container","engine","width","height","scene","camera","String3DObject","id","type","object","engine","options","child","originalScale","matrix","pos","quat","scale","position","quaternion","euler","value","mat","texture","material","geometry","anyObj","childMat","String3DScene","engine","options","id","obj","object","type","element","onAdd","added3DObject","parentId","group","String3DObject","kind","color","intensity","light","distance","decay","angle","penumbra","groundColor","bias","mapSize","mesh","castShadow","receiveShadow","geometry","material","widthSegments","heightSegments","segments","modelPath","loaderType","loader","shouldCenter","gltf","root","overrideMaterial","child","xhr","error","bbox","center","box","attr","colorRaw","opacity","metalness","roughness","params","mapSrc","normalMapSrc","roughnessMapSrc","metalnessMapSrc","aoMapSrc","flipY","colorSpace","src","texture","value","normalized","baseRaw","base","mappingRaw","mapping","manager","url","mapped","GroupSynchronizer","el","object","ctx","parentData","rect","centerX","centerY","styleMap","style","getStyle","readNumberStyle","prop","fallback","mapValue","parsed","value","raw","translateZ","position","scale","rotateX","rotateY","rotateZ","LightSynchronizer","el","object","ctx","parentData","rect","centerX","centerY","translateZ","position","light","color","intensity","distance","decay","angle","penumbra","groundColor","castShadow","bias","mapSize","size","targetId","targetEl","tRect","tCenterX","tCenterY","tTranslateZ","tPos","MeshSynchronizer","_MeshSynchronizer","el","object","opacityValue","castShadow","receiveShadow","opacity","child","mat","mesh","ctx","parentData","styleMap","style","getStyle","rect","originalWidth","originalHeight","readNumberStyle","prop","fallback","mapValue","parsed","value","raw","translateZ","cssScale","centerX","centerY","worldPos","rotateX","rotateY","rotateZ","targetWidth","targetHeight","cssScaleZ","parentScale","objectType","scaleX","scaleY","scaleZ","uniformSize","size","fitMode","modelScaleAttr","modelScale","scaleToWidth","scaleToHeight","uniformScale","fallbackSize","cylRadius","String3DSynchronizer","camera","viewportWidth","viewportHeight","engine","MeshSynchronizer","GroupSynchronizer","LightSynchronizer","el","object","parentData","strategy","width","height","WORKER_SOURCE","TransformWorkerClient","options","blob","event","data","items","camera","frameId","result","_String3D","context","provider","object","result","globalId","element","attributes","parentElement","parentId","String3DRenderer","String3DCamera","modelLoader","modelLoaderFactory","String3DScene","String3DSynchronizer","TransformWorkerClient","shouldUseDirtySync","shouldUseWorker","key","fallback","error","engine","type","loaderType","existing","container","el","data","workerResults","dirtySet","forceSync","worker","inputs","obj","frameId","parentData","shouldSync","nextParentData","cached","forceChildren","child","style","css","name","initialValue","entries","entry","mutations","mutation","prop","mapValue","parsed","value","raw","rect","layoutWidth","layoutHeight","translateZ","scale","scaleZ","rotateX","rotateY","rotateZ","opacity","MeshSynchronizer","modelSizeX","modelSizeY","modelScale","fitMode","size","modelScaleAttr","returnScale","results","String3D","ThreeJSEngine","THREE","loaders","x","y","z","w","order","min","max","options","renderer","fov","aspect","near","far","left","right","top","bottom","geometry","material","width","height","depth","radius","widthSegments","heightSegments","radiusTop","radiusBottom","segments","params","color","intensity","distance","decay","angle","penumbra","skyColor","groundColor","type","LoaderClass","degrees","radians","object","boundingBox","hasBox","child","box","childBox","ThreeJSProvider"]}
1
+ {"version":3,"sources":["../src/index.ts","../src/modules/String3D.ts","../src/core/String3DCamera.ts","../src/core/filters/String3DCustomFilter.ts","../src/core/filters/String3DFilterPipeline.ts","../src/core/String3DRenderer.ts","../src/core/String3DObject.ts","../src/core/String3DScene.ts","../src/core/synchronizer/GroupSynchronizer.ts","../src/core/synchronizer/LightSynchronizer.ts","../src/core/synchronizer/MeshSynchronizer.ts","../src/core/synchronizer/String3DSynchronizer.ts","../src/core/transform/TransformWorkerClient.ts","../src/adapters/ThreeJSProvider.ts"],"sourcesContent":["export { String3D } from \"./modules/String3D\";\r\nexport type { String3DOptions } from \"./modules/String3D\";\r\n\r\nexport type {\r\n I3DEngine,\r\n I3DVector3,\r\n I3DVector2,\r\n I3DQuaternion,\r\n I3DEuler,\r\n I3DMatrix4,\r\n I3DBox3,\r\n I3DObject,\r\n I3DMesh,\r\n I3DGeometry,\r\n I3DMaterial,\n I3DRenderTarget,\n I3DLight,\n I3DCamera,\r\n I3DPerspectiveCamera,\r\n I3DOrthographicCamera,\r\n I3DScene,\r\n I3DRenderer,\r\n I3DTextureLoader,\r\n I3DModelLoader,\r\n} from \"./core/abstractions/I3DEngine\";\r\n\r\nexport type { CameraMode } from \"./core/String3DCamera\";\r\nexport type { I3DEngineProvider } from \"./core/abstractions/I3DEngineProvider\";\r\n\r\nexport { String3DCamera } from \"./core/String3DCamera\";\r\nexport { String3DRenderer } from \"./core/String3DRenderer\";\r\nexport { String3DScene } from \"./core/String3DScene\";\r\nexport { String3DObject } from \"./core/String3DObject\";\r\nexport { String3DSynchronizer } from \"./core/synchronizer/String3DSynchronizer\";\nexport {\n String3DCustomFilterRegistry,\n type String3DCustomFilterDefinition,\n} from \"./core/filters/String3DCustomFilter\";\n\r\nexport { ThreeJSProvider, ThreeJSEngine } from \"./adapters/ThreeJSProvider\";\r\n","import { StringModule } from \"@fiddle-digital/string-tune\";\r\nimport { StringObject } from \"@fiddle-digital/string-tune\";\r\nimport { StringData } from \"@fiddle-digital/string-tune\";\r\nimport { StringContext } from \"@fiddle-digital/string-tune\";\r\nimport { String3DCamera } from \"../core/String3DCamera\";\r\nimport { String3DRenderer } from \"../core/String3DRenderer\";\r\nimport { String3DScene } from \"../core/String3DScene\";\r\nimport { String3DSynchronizer } from \"../core/synchronizer/String3DSynchronizer\";\r\nimport { I3DEngineProvider } from \"../core/abstractions/I3DEngineProvider\";\r\nimport { I3DEngine, I3DModelLoader } from \"../core/abstractions/I3DEngine\";\r\nimport { frameDOM } from \"@fiddle-digital/string-tune\";\r\nimport { MeshSynchronizer } from \"../core/synchronizer/MeshSynchronizer\";\r\nimport { String3DObject } from \"../core/String3DObject\";\r\nimport type {\r\n String3DFilterChain,\r\n String3DFilterTarget,\r\n String3DFilterEffect,\r\n} from \"../core/filters/String3DFilterTypes\";\r\nimport { String3DCustomFilterRegistry } from \"../core/filters/String3DCustomFilter\";\r\nimport {\r\n TransformWorkerClient,\r\n TransformWorkerInput,\r\n TransformWorkerCamera,\r\n TransformWorkerResult,\r\n} from \"../core/transform/TransformWorkerClient\";\r\n\r\nexport interface String3DOptions {\r\n hideHTML?: boolean;\r\n container?: string | HTMLElement;\r\n zIndex?: number;\r\n modelLoaderType?: string;\r\n modelLoader?: I3DModelLoader;\r\n modelLoaderFactory?: (engine: I3DEngine, type?: string) => I3DModelLoader;\r\n useDirtySync?: boolean;\r\n useTransformWorker?: boolean;\r\n transformWorkerWasmUrl?: string;\r\n}\r\n\r\ntype FilterTransitionState = {\n raw: string;\n effects: String3DFilterChain;\n animating: boolean;\n from: String3DFilterChain;\n to: String3DFilterChain;\n startTime: number;\n duration: number;\n easing: (t: number) => number;\n clearOnComplete: boolean;\n lastDuration: number;\n lastDelay: number;\n lastEasing: (t: number) => number;\n pendingRaw?: string;\n pendingEffects?: String3DFilterChain;\n effectsKey?: string;\n};\n\r\nexport class String3D extends StringModule {\r\n private static provider: I3DEngineProvider | null = null;\r\n\r\n private renderer: String3DRenderer | null = null;\r\n private camera: String3DCamera | null = null;\r\n private scene: String3DScene | null = null;\r\n private synchronizer: String3DSynchronizer | null = null;\r\n private engine: I3DEngine | null = null;\r\n private canvasContainer: HTMLElement | null = null;\r\n private isLoading: Map<string, boolean> = new Map();\r\n private options: String3DOptions;\r\n private useDirtySync = false;\r\n private dirtyElements: Set<HTMLElement> = new Set();\r\n private observedElements: Set<HTMLElement> = new Set();\r\n private resizeObserver: ResizeObserver | null = null;\r\n private mutationObserver: MutationObserver | null = null;\r\n private lastSyncData: WeakMap<String3DObject, { scale: number }> = new WeakMap();\r\n private transformWorker: TransformWorkerClient | null = null;\r\n private workerHasResult = false;\r\n private workerObjectMap: Map<string, { object: String3DObject; el: HTMLElement }> = new Map();\r\n private domVersion = 0;\r\n private lastSubmittedVersion = 0;\r\n private scrollTicking = false;\r\n private onScrollBound = () => this.handleScroll();\r\n private filterStates: WeakMap<HTMLElement, FilterTransitionState> = new WeakMap();\r\n private filterWarnings: WeakMap<HTMLElement, string> = new WeakMap();\r\n\r\n public static setProvider(provider: I3DEngineProvider): void {\r\n String3D.provider = provider;\r\n }\r\n\r\n constructor(context: StringContext) {\r\n super(context);\r\n this.htmlKey = \"3d\";\r\n this.options = this.buildOptionsFromSettings();\r\n\r\n this.attributesToMap = [\r\n ...this.attributesToMap,\r\n { key: \"3d\", type: \"string\", fallback: \"box\" },\r\n { key: \"3d-material\", type: \"string\", fallback: \"basic[#ffffff]\" },\r\n { key: \"3d-color\", type: \"string\", fallback: \"#ffffff\" },\r\n { key: \"3d-opacity\", type: \"number\", fallback: 1 },\r\n { key: \"3d-intensity\", type: \"number\", fallback: 1 },\r\n { key: \"3d-distance\", type: \"number\", fallback: 1000 },\r\n { key: \"3d-decay\", type: \"number\", fallback: 0 },\r\n { key: \"3d-model\", type: \"string\", fallback: \"\" },\r\n { key: \"3d-segments\", type: \"number\", fallback: 32 },\r\n { key: \"3d-segments-width\", type: \"number\", fallback: 32 },\r\n { key: \"3d-segments-height\", type: \"number\", fallback: 32 },\r\n { key: \"3d-model-loader\", type: \"string\", fallback: \"\" },\r\n { key: \"3d-model-scale\", type: \"number\", fallback: 1 },\r\n { key: \"3d-model-center\", type: \"boolean\", fallback: false },\r\n { key: \"3d-model-fit\", type: \"string\", fallback: \"contain\" },\r\n { key: \"3d-metalness\", type: \"number\", fallback: 0 },\r\n { key: \"3d-roughness\", type: \"number\", fallback: 1 },\r\n { key: \"3d-texture-flipY\", type: \"boolean\", fallback: true },\r\n { key: \"3d-colorSpace\", type: \"string\", fallback: \"\" },\r\n { key: \"3d-cast-shadow\", type: \"boolean\", fallback: false },\r\n { key: \"3d-receive-shadow\", type: \"boolean\", fallback: false },\r\n { key: \"3d-shadow-bias\", type: \"number\", fallback: 0 },\r\n { key: \"3d-shadow-map-size\", type: \"number\", fallback: 512 },\r\n { key: \"3d-angle\", type: \"number\", fallback: Math.PI / 3 },\r\n { key: \"3d-penumbra\", type: \"number\", fallback: 0 },\r\n { key: \"3d-ground-color\", type: \"string\", fallback: \"#ffffff\" },\r\n { key: \"3d-target\", type: \"string\", fallback: \"\" },\r\n ];\r\n }\r\n\r\n override canConnect(object: StringObject): boolean {\r\n const result = super.canConnect(object);\r\n console.log(\r\n \"[String3D] canConnect:\",\r\n object.id,\r\n \"keys:\",\r\n object.keys,\r\n \"htmlKey:\",\r\n this.htmlKey,\r\n \"result:\",\r\n result\r\n );\r\n return result;\r\n }\r\n\r\n override initializeObject(\r\n globalId: number,\r\n object: StringObject,\r\n element: HTMLElement,\r\n attributes: Record<string, any>\r\n ): void {\r\n super.initializeObject(globalId, object, element, attributes);\r\n\r\n object.setProperty(\"parentId\", null);\r\n const parentElement = element.parentElement?.closest(\r\n '[string-3d=\"group\"]'\r\n ) as HTMLElement | null;\r\n if (parentElement) {\r\n const parentId = parentElement.getAttribute(\"string-id\");\r\n if (parentId) {\r\n object.setProperty(\"parentId\", parentId);\r\n object.setProperty(\"parent\", parentElement);\r\n }\r\n }\r\n }\r\n\r\n override onResize(): void {\r\n if (this.renderer && this.camera && this.synchronizer) {\r\n this.renderer.resize(this.camera);\r\n this.synchronizer.updateViewportSize(this.renderer.width, this.renderer.height);\r\n this.camera.clearScaleCache();\r\n if (this.useDirtySync) {\r\n this.markAllDirty();\r\n }\r\n }\r\n }\r\n\r\n override onInit(): void {\r\n this.options = this.buildOptionsFromSettings();\r\n if (!String3D.provider) {\r\n console.error(\"[String3D] No provider set. Call String3D.setProvider() before use.\");\r\n return;\r\n }\r\n\r\n this.engine = String3D.provider.getEngine();\r\n this.canvasContainer = this.createOrGetContainer();\r\n this.registerTypedProperties();\r\n this.injectCSS();\r\n this.useDirtySync = !!this.options.useDirtySync;\r\n if (this.useDirtySync) {\r\n this.setupObservers();\r\n this.setupScrollListeners();\r\n }\r\n\r\n this.renderer = new String3DRenderer(this.canvasContainer, this.engine);\r\n this.renderer.attach();\r\n\r\n this.camera = new String3DCamera(this.engine, \"orthographic\");\r\n this.camera.setPosition(0, 0, 1000);\r\n this.camera.resize(this.renderer.width, this.renderer.height);\r\n\r\n const modelLoader = this.resolveModelLoader();\r\n const modelLoaderFactory = this.resolveModelLoaderFactory();\r\n this.scene = new String3DScene(this.engine, {\r\n modelLoader,\r\n modelLoaderFactory,\r\n });\r\n this.scene.getScene().add(this.camera.camera);\r\n\r\n this.synchronizer = new String3DSynchronizer(\r\n this.camera,\r\n this.renderer.width,\r\n this.renderer.height,\r\n this.engine\r\n );\r\n\r\n if (this.options.useTransformWorker) {\r\n this.transformWorker = new TransformWorkerClient({\r\n wasmUrl: this.options.transformWorkerWasmUrl,\r\n });\r\n }\r\n\r\n console.info(`[String3D] Initialized with: ${String3D.provider.getName()}`);\r\n }\r\n\r\n override onSettingsChange(): void {\r\n this.options = this.buildOptionsFromSettings();\r\n const shouldUseDirtySync = !!this.options.useDirtySync;\r\n if (shouldUseDirtySync && !this.useDirtySync) {\r\n this.useDirtySync = true;\r\n this.setupObservers();\r\n this.setupScrollListeners();\r\n this.observeSceneElements();\r\n this.markAllDirty();\r\n } else if (!shouldUseDirtySync && this.useDirtySync) {\r\n this.useDirtySync = false;\r\n this.removeScrollListeners();\r\n this.resizeObserver?.disconnect();\r\n this.mutationObserver?.disconnect();\r\n this.dirtyElements.clear();\r\n }\r\n\r\n const shouldUseWorker = !!this.options.useTransformWorker;\r\n if (shouldUseWorker && !this.transformWorker) {\r\n this.transformWorker = new TransformWorkerClient({\r\n wasmUrl: this.options.transformWorkerWasmUrl,\r\n });\r\n this.workerHasResult = false;\r\n } else if (!shouldUseWorker && this.transformWorker) {\r\n this.transformWorker.destroy();\r\n this.transformWorker = null;\r\n this.workerHasResult = false;\r\n }\r\n }\r\n\r\n private buildOptionsFromSettings(): String3DOptions {\r\n return {\r\n hideHTML: this.getSettingValue(\"hideHTML\", false),\r\n container: this.getSettingValue(\"container\", undefined),\r\n zIndex: this.getSettingValue(\"zIndex\", 1),\r\n modelLoaderType: this.getSettingValue(\"modelLoaderType\", undefined),\r\n modelLoader: this.getSettingValue(\"modelLoader\", undefined),\r\n modelLoaderFactory: this.getSettingValue(\"modelLoaderFactory\", undefined),\r\n useDirtySync: this.getSettingValue(\"useDirtySync\", false),\r\n useTransformWorker: this.getSettingValue(\"useTransformWorker\", false),\r\n transformWorkerWasmUrl: this.getSettingValue(\"transformWorkerWasmUrl\", undefined),\r\n };\r\n }\r\n\r\n private getSettingValue<T>(key: string, fallback: T): T {\r\n if (!this.settings || !(key in this.settings)) return fallback;\r\n return this.settings[key] as T;\r\n }\r\n\r\n private resolveModelLoader(): I3DModelLoader | undefined {\r\n if (!this.engine) return undefined;\r\n if (this.options.modelLoader) return this.options.modelLoader;\r\n if (this.options.modelLoaderFactory) return undefined;\r\n if (this.options.modelLoaderType) {\r\n try {\r\n return this.engine.createModelLoader(this.options.modelLoaderType);\r\n } catch (error) {\r\n console.warn(\"[String3D] Failed to create model loader:\", error);\r\n }\r\n }\r\n return undefined;\r\n }\r\n\r\n private resolveModelLoaderFactory():\r\n | ((engine: I3DEngine, type?: string) => I3DModelLoader)\r\n | undefined {\r\n if (!this.engine) return undefined;\r\n if (this.options.modelLoaderFactory) return this.options.modelLoaderFactory;\r\n if (this.options.modelLoaderType) {\r\n return (engine: I3DEngine, type?: string) => {\r\n const loaderType = type || this.options.modelLoaderType;\r\n if (!loaderType) {\r\n throw new Error(\"[String3D] Model loader type not provided\");\r\n }\r\n return engine.createModelLoader(loaderType);\r\n };\r\n }\r\n return undefined;\r\n }\r\n\r\n private createOrGetContainer(): HTMLElement {\r\n if (this.options.container instanceof HTMLElement) {\r\n this.applyContainerStyles(this.options.container);\r\n return this.options.container;\r\n }\r\n\r\n if (typeof this.options.container === \"string\") {\r\n const existing = document.getElementById(this.options.container);\r\n if (existing) {\r\n this.applyContainerStyles(existing);\r\n return existing;\r\n }\r\n }\r\n\r\n const container = document.createElement(\"div\");\r\n container.id = \"string-3d-canvas\";\r\n this.applyContainerStyles(container);\r\n document.body.insertBefore(container, document.body.firstChild);\r\n return container;\r\n }\r\n\r\n private applyContainerStyles(el: HTMLElement): void {\r\n Object.assign(el.style, {\r\n position: \"fixed\",\r\n left: \"0\",\r\n top: \"0\",\r\n width: \"100vw\",\r\n height: \"100lvh\",\r\n zIndex: String(this.options.zIndex),\r\n pointerEvents: \"none\",\r\n });\r\n }\r\n\r\n override onObjectConnected(object: StringObject): void {\r\n if (this.isLoading.has(object.id) || !this.scene) return;\r\n this.isLoading.set(object.id, true);\r\n\r\n this.scene.createFromElement(object);\r\n\r\n if (this.useDirtySync && object.htmlElement) {\r\n this.observeElement(object.htmlElement);\r\n this.markDirty(object.htmlElement);\r\n }\r\n\r\n if (this.options.hideHTML && object.htmlElement) {\r\n object.htmlElement.style.opacity = \"0\";\r\n object.htmlElement.style.pointerEvents = \"none\";\r\n }\r\n }\r\n\r\n override onFrame(data: StringData): void {\r\n if (!this.renderer || !this.scene || !this.camera || !this.synchronizer) return;\r\n\r\n const workerResults = this.transformWorker?.takeLastResult();\r\n if (\r\n workerResults &&\r\n workerResults.frameId === this.lastSubmittedVersion &&\r\n workerResults.frameId >= this.domVersion\r\n ) {\r\n this.workerHasResult = true;\r\n this.applyWorkerResults(workerResults.results);\r\n }\r\n\r\n const dirtySet = this.useDirtySync ? this.dirtyElements : null;\r\n // If dirty sync is enabled but nothing is marked dirty, we still sync everything to keep CSS-driven effects (hover/animations) fluid.\r\n const forceSync = !dirtySet || dirtySet.size === 0;\r\n const worker = this.transformWorker;\r\n\r\n // Collect and submit worker inputs only when the worker is free\r\n if (worker?.isReady() && !worker.isPending()) {\r\n const inputs: TransformWorkerInput[] = [];\r\n this.workerObjectMap.clear();\r\n this.scene!.rootObjects.forEach((obj) => {\r\n this.collectWorkerInputs(obj, { scale: 1 }, forceSync, dirtySet, inputs);\r\n });\r\n if (inputs.length > 0) {\r\n const frameId = this.domVersion;\r\n this.lastSubmittedVersion = frameId;\r\n worker.submit(inputs, this.buildWorkerCameraData(), frameId);\r\n }\r\n }\r\n\r\n // Always do immediate CPU sync to avoid frame lag while worker is pending\r\n this.scene!.rootObjects.forEach((obj) => {\r\n this.syncRecursive(obj.el, obj, { scale: 1 }, forceSync, dirtySet);\r\n });\r\n\r\n const filterTargets = this.collectFilterTargets(performance.now(), forceSync, dirtySet);\r\n this.renderer!.render(this.scene!, this.camera!, filterTargets);\r\n\r\n if (this.useDirtySync) {\r\n this.dirtyElements.clear();\r\n }\r\n }\r\n\r\n private syncRecursive(\r\n el: HTMLElement | undefined,\r\n object: String3DObject,\r\n parentData: any,\r\n forceSync: boolean,\r\n dirtySet: Set<HTMLElement> | null\r\n ): void {\r\n if (!this.synchronizer || !el) return;\r\n const shouldSync = forceSync || !dirtySet || dirtySet.has(el);\r\n let nextParentData = parentData;\r\n\r\n if (shouldSync) {\r\n const data = this.synchronizer.syncElement(el, object, parentData);\r\n if (data && typeof data.scale === \"number\") {\r\n this.lastSyncData.set(object, data);\r\n nextParentData = data;\r\n }\r\n } else {\r\n const cached = this.lastSyncData.get(object);\r\n if (cached) {\r\n nextParentData = cached;\r\n }\r\n }\r\n\r\n const forceChildren = forceSync || shouldSync;\r\n object.children.forEach((child) =>\r\n this.syncRecursive(child.el, child, nextParentData, forceChildren, dirtySet)\r\n );\r\n }\r\n\r\n private injectCSS(): void {\r\n if (document.getElementById(\"string-3d-styles\")) return;\r\n\r\n const style = document.createElement(\"style\");\r\n style.id = \"string-3d-styles\";\r\n style.textContent = `\r\n @property --translate-x { syntax: \"<number>\"; inherits: false; initial-value: 0; }\r\n @property --translate-y { syntax: \"<number>\"; inherits: false; initial-value: 0; }\r\n @property --translate-z { syntax: \"<number>\"; inherits: false; initial-value: 0; }\r\n @property --rotate-x { syntax: \"<number>\"; inherits: false; initial-value: 0; }\r\n @property --rotate-y { syntax: \"<number>\"; inherits: false; initial-value: 0; }\r\n @property --rotate-z { syntax: \"<number>\"; inherits: false; initial-value: 0; }\r\n @property --scale { syntax: \"<number>\"; inherits: false; initial-value: 1; }\r\n @property --scale-x { syntax: \"<number>\"; inherits: false; initial-value: 1; }\r\n @property --scale-y { syntax: \"<number>\"; inherits: false; initial-value: 1; }\r\n @property --scale-z { syntax: \"<number>\"; inherits: false; initial-value: 1; }\r\n @property --opacity { syntax: \"<number>\"; inherits: false; initial-value: 1; }\r\n @property --filter { syntax: \"*\"; inherits: false; initial-value: none; }\r\n\r\n [string-3d] {\r\n --translate-x: 0; --translate-y: 0; --translate-z: 0;\r\n --rotate-x: 0; --rotate-y: 0; --rotate-z: 0;\r\n --scale: 1; --scale-x: 1; --scale-y: 1; --scale-z: 1;--opacity: 1; --filter: none;\r\n transform-style: preserve-3d;\r\n }\r\n\r\n [string-3d-visual=\"true\"] {\r\n transform:\r\n translate3d(calc(var(--translate-x) * 1px), calc(var(--translate-y) * 1px), calc(var(--translate-z) * 1px))\r\n rotateX(calc(var(--rotate-x) * 1deg))\r\n rotateY(calc(var(--rotate-y) * 1deg))\r\n rotateZ(calc(var(--rotate-z) * 1deg))\r\n scale3d(calc(var(--scale) * var(--scale-x)), calc(var(--scale) * var(--scale-y)), calc(var(--scale) * var(--scale-z)));\r\n }\r\n `;\r\n document.head.appendChild(style);\r\n }\r\n\r\n private registerTypedProperties(): void {\r\n const css = (globalThis as any).CSS;\r\n if (!css?.registerProperty) return;\r\n\r\n const props: Array<{ name: string; initialValue: string }> = [\r\n { name: \"--translate-x\", initialValue: \"0\" },\r\n { name: \"--translate-y\", initialValue: \"0\" },\r\n { name: \"--translate-z\", initialValue: \"0\" },\r\n { name: \"--rotate-x\", initialValue: \"0\" },\r\n { name: \"--rotate-y\", initialValue: \"0\" },\r\n { name: \"--rotate-z\", initialValue: \"0\" },\r\n { name: \"--scale\", initialValue: \"1\" },\r\n { name: \"--scale-x\", initialValue: \"1\" },\r\n { name: \"--scale-y\", initialValue: \"1\" },\r\n { name: \"--scale-z\", initialValue: \"1\" },\r\n { name: \"--opacity\", initialValue: \"1\" },\r\n { name: \"--filter\", initialValue: \"none\" },\r\n ];\r\n\r\n props.forEach(({ name, initialValue }) => {\r\n try {\r\n css.registerProperty({\r\n name,\r\n syntax: name === \"--filter\" ? \"*\" : \"<number>\",\r\n inherits: false,\r\n initialValue,\r\n });\r\n } catch {\r\n // Property may already be registered; ignore.\r\n }\r\n });\r\n }\r\n\r\n private setupObservers(): void {\r\n if (typeof ResizeObserver !== \"undefined\") {\r\n this.resizeObserver = new ResizeObserver((entries) => {\r\n entries.forEach((entry) => {\r\n if (entry.target instanceof HTMLElement) {\r\n this.markDirty(entry.target);\r\n }\r\n });\r\n });\r\n }\r\n\r\n if (typeof MutationObserver !== \"undefined\") {\r\n this.mutationObserver = new MutationObserver((mutations) => {\r\n mutations.forEach((mutation) => {\r\n if (mutation.target instanceof HTMLElement) {\r\n this.markDirty(mutation.target);\r\n }\r\n });\r\n });\r\n }\r\n }\r\n\r\n private setupScrollListeners(): void {\r\n window.addEventListener(\"scroll\", this.onScrollBound, { passive: true });\r\n window.addEventListener(\"resize\", this.onScrollBound, { passive: true });\r\n if (window.visualViewport) {\r\n window.visualViewport.addEventListener(\"scroll\", this.onScrollBound, { passive: true });\r\n window.visualViewport.addEventListener(\"resize\", this.onScrollBound, { passive: true });\r\n }\r\n }\r\n\r\n private removeScrollListeners(): void {\r\n window.removeEventListener(\"scroll\", this.onScrollBound);\r\n window.removeEventListener(\"resize\", this.onScrollBound);\r\n if (window.visualViewport) {\r\n window.visualViewport.removeEventListener(\"scroll\", this.onScrollBound);\r\n window.visualViewport.removeEventListener(\"resize\", this.onScrollBound);\r\n }\r\n }\r\n\r\n private handleScroll(): void {\r\n if (!this.useDirtySync) return;\r\n this.markAllDirty();\r\n }\r\n\r\n private observeElement(el: HTMLElement): void {\r\n if (this.observedElements.has(el)) return;\r\n this.observedElements.add(el);\r\n\r\n this.resizeObserver?.observe(el);\r\n this.mutationObserver?.observe(el, {\r\n attributes: true,\r\n attributeFilter: [\r\n \"style\",\r\n \"class\",\r\n \"string-3d\",\r\n \"string-3d-model-fit\",\r\n \"string-3d-model-scale\",\r\n \"string-3d-cast-shadow\",\r\n \"string-3d-receive-shadow\",\r\n \"string-3d-opacity\",\r\n \"string-3d-target\",\r\n ],\r\n });\r\n }\r\n\r\n private observeSceneElements(): void {\r\n if (!this.scene) return;\r\n this.scene.rootObjects.forEach((obj) => {\r\n this.observeRecursive(obj);\r\n });\r\n }\r\n\r\n private observeRecursive(object: String3DObject): void {\r\n if (object.el instanceof HTMLElement) {\r\n this.observeElement(object.el);\r\n }\r\n object.children.forEach((child) => this.observeRecursive(child));\r\n }\r\n\r\n private markDirty(el: HTMLElement): void {\r\n this.dirtyElements.add(el);\r\n this.domVersion += 1;\r\n }\r\n\r\n private markAllDirty(): void {\r\n this.observedElements.forEach((el) => this.dirtyElements.add(el));\r\n this.domVersion += 1;\r\n }\r\n\r\n private readNumberStyle(el: HTMLElement, prop: string, fallback: number): number {\r\n const styleMap = (el as any).computedStyleMap?.();\r\n const mapValue = styleMap?.get?.(prop);\r\n if (mapValue !== undefined) {\r\n if (typeof mapValue === \"number\") return mapValue;\r\n if (typeof mapValue === \"string\") {\r\n const parsed = Number.parseFloat(mapValue);\r\n if (!Number.isNaN(parsed)) return parsed;\r\n }\r\n if (mapValue && typeof mapValue === \"object\") {\r\n const value = (mapValue as any).value;\r\n if (typeof value === \"number\") return value;\r\n if (typeof value === \"string\") {\r\n const parsed = Number.parseFloat(value);\r\n if (!Number.isNaN(parsed)) return parsed;\r\n }\r\n }\r\n }\r\n\r\n const style = getComputedStyle(el);\r\n const raw = style.getPropertyValue(prop);\r\n const parsed = Number.parseFloat(raw);\r\n return Number.isNaN(parsed) ? fallback : parsed;\r\n }\r\n\r\n private readFilterRaw(el: HTMLElement): string {\r\n const styleMap = (el as any).computedStyleMap?.();\r\n let raw = \"\";\r\n const mapValue = styleMap?.get?.(\"--filter\");\r\n if (mapValue !== undefined) {\r\n if (typeof mapValue === \"string\") {\r\n raw = mapValue;\r\n } else if (mapValue && typeof mapValue === \"object\") {\r\n const value = (mapValue as any).value;\r\n if (typeof value === \"string\") raw = value;\r\n }\r\n }\r\n if (!raw) {\r\n raw = getComputedStyle(el).getPropertyValue(\"--filter\") || \"\";\r\n }\r\n raw = raw.trim();\r\n return raw;\r\n }\r\n\r\n private parseFilterChain(raw: string): { effects: String3DFilterChain; warnings: string[] } {\r\n const warnings: string[] = [];\r\n const effects: String3DFilterChain = [];\r\n\r\n const parseNumber = (value: string): number | null => {\r\n const cleaned = value.trim().toLowerCase();\r\n const match = cleaned.match(/^(-?\\d*\\.?\\d+)(px)?$/);\r\n if (!match) return null;\r\n const num = Number.parseFloat(match[1]);\r\n return Number.isFinite(num) ? num : null;\r\n };\r\n\r\n const parseRatio = (value: string): number | null => {\r\n const cleaned = value.trim().toLowerCase();\r\n if (!cleaned) return null;\r\n if (cleaned.endsWith(\"%\")) {\r\n const num = Number.parseFloat(cleaned.slice(0, -1));\r\n return Number.isFinite(num) ? num / 100 : null;\r\n }\r\n const num = Number.parseFloat(cleaned);\r\n return Number.isFinite(num) ? num : null;\r\n };\r\n\r\n const parseAngle = (value: string): number | null => {\r\n const cleaned = value.trim().toLowerCase();\r\n if (!cleaned) return null;\r\n if (cleaned.endsWith(\"rad\")) {\r\n const num = Number.parseFloat(cleaned.slice(0, -3));\r\n return Number.isFinite(num) ? num : null;\r\n }\r\n const stripped = cleaned.endsWith(\"deg\") ? cleaned.slice(0, -3) : cleaned;\r\n const num = Number.parseFloat(stripped);\r\n return Number.isFinite(num) ? (num * Math.PI) / 180 : null;\r\n };\r\n\r\n const parseBloom = (value: string): { intensity: number; threshold: number } | null => {\r\n const parts = value.split(\",\").map((part) => part.trim());\r\n const intensity = parseNumber(parts[0] || \"\");\r\n if (intensity === null) return null;\r\n const threshold = parts[1] ? parseRatio(parts[1]) : null;\r\n return {\r\n intensity: Math.max(0, intensity),\r\n threshold: threshold === null ? 0.8 : Math.max(0, Math.min(1, threshold)),\r\n };\r\n };\r\n\r\n const parseAmount = (value: string, name: string, allowZero = false): number | null => {\r\n const amount = parseNumber(value);\r\n if (amount === null) {\r\n warnings.push(`[String3D] Invalid ${name} value \"${value}\".`);\r\n return null;\r\n }\r\n if (!allowZero && amount <= 0) {\r\n warnings.push(`[String3D] ${name} must be > 0.`);\r\n return null;\r\n }\r\n return amount;\r\n };\r\n\r\n const parseRatioAmount = (value: string, name: string): number | null => {\r\n const amount = parseRatio(value);\r\n if (amount === null) {\r\n warnings.push(`[String3D] Invalid ${name} value \"${value}\".`);\r\n return null;\r\n }\r\n return amount;\r\n };\r\n\r\n const re = /([a-zA-Z-]+)\\(([^)]*)\\)/g;\r\n let match: RegExpExecArray | null;\r\n while ((match = re.exec(raw))) {\r\n const name = match[1].toLowerCase();\r\n const args = (match[2] || \"\").trim();\r\n\r\n if (name === \"blur\") {\r\n const amount = parseAmount(args, \"blur\", true);\r\n if (amount !== null) effects.push({ type: \"blur\", amount });\r\n } else if (name === \"pixel\" || name === \"pixelate\") {\r\n const size = parseAmount(args, \"pixel\", true);\r\n if (size !== null) effects.push({ type: \"pixel\", size });\r\n } else if (name === \"bloom\") {\r\n const bloom = parseBloom(args);\r\n if (bloom) effects.push({ type: \"bloom\", ...bloom });\r\n else warnings.push(`[String3D] Invalid bloom value \"${args}\".`);\r\n } else if (name === \"brightness\") {\r\n const amount = parseRatioAmount(args, \"brightness\");\r\n if (amount !== null) effects.push({ type: \"brightness\", amount: Math.max(0, amount) });\r\n } else if (name === \"contrast\") {\r\n const amount = parseRatioAmount(args, \"contrast\");\r\n if (amount !== null) effects.push({ type: \"contrast\", amount: Math.max(0, amount) });\r\n } else if (name === \"saturate\") {\r\n const amount = parseRatioAmount(args, \"saturate\");\r\n if (amount !== null) effects.push({ type: \"saturate\", amount: Math.max(0, amount) });\r\n } else if (name === \"grayscale\") {\r\n const amount = parseRatioAmount(args, \"grayscale\");\r\n if (amount !== null)\r\n effects.push({ type: \"grayscale\", amount: Math.max(0, Math.min(1, amount)) });\r\n } else if (name === \"sepia\") {\r\n const amount = parseRatioAmount(args, \"sepia\");\r\n if (amount !== null)\r\n effects.push({ type: \"sepia\", amount: Math.max(0, Math.min(1, amount)) });\r\n } else if (name === \"invert\") {\r\n const amount = parseRatioAmount(args, \"invert\");\r\n if (amount !== null)\r\n effects.push({ type: \"invert\", amount: Math.max(0, Math.min(1, amount)) });\r\n } else if (name === \"hue-rotate\") {\r\n const angle = parseAngle(args);\r\n if (angle !== null) effects.push({ type: \"hue-rotate\", angle });\r\n else warnings.push(`[String3D] Invalid hue-rotate value \"${args}\".`);\r\n } else if (name) {\r\n const custom = String3DCustomFilterRegistry.get(name);\r\n if (custom) {\r\n const parsed = custom.parse ? custom.parse(args) : {};\r\n if (parsed === null) {\r\n warnings.push(`[String3D] Invalid custom filter \"${name}\" args \"${args}\".`);\r\n } else {\r\n effects.push({ type: \"custom\", name, uniforms: parsed });\r\n }\r\n } else {\r\n warnings.push(`[String3D] Unknown filter \"${name}\".`);\r\n }\r\n }\r\n }\r\n\r\n if (effects.length === 0) {\r\n warnings.push(\"[String3D] No valid filters parsed from --filter.\");\r\n }\r\n\r\n return { effects, warnings };\r\n }\r\n\r\n private warnFilterIssues(el: HTMLElement, raw: string, warnings: string[]): void {\r\n if (warnings.length === 0) return;\r\n const lastRaw = this.filterWarnings.get(el);\r\n if (lastRaw === raw) return;\r\n warnings.forEach((warning) => console.warn(warning, el));\r\n this.filterWarnings.set(el, raw);\r\n }\r\n\r\n private readFilterChain(\n el: HTMLElement,\n now: number,\n shouldReadStyle: boolean\n ): String3DFilterChain | null {\n const existing = this.filterStates.get(el);\n if (!shouldReadStyle && existing) {\n if (existing.animating) {\n return this.sampleTransition(existing, now);\n }\n return existing.effects;\n }\n\n const raw = this.readFilterRaw(el);\n if (!raw || raw === \"none\") {\n if (existing) {\n if (existing.animating && existing.clearOnComplete) {\n const current = this.sampleTransition(existing, now);\n if (!existing.animating) {\n this.filterStates.delete(el);\n return null;\n }\n return current;\n }\n let { duration, delay, easing } = this.getFilterTransition(el);\n if (duration <= 0 && existing.lastDuration > 0) {\n duration = existing.lastDuration;\n delay = existing.lastDelay;\n easing = existing.lastEasing;\n }\n if (duration > 0) {\n const zero = this.makeZeroChain(existing.effects);\n existing.from = existing.effects;\n existing.to = zero;\n existing.startTime = now + delay;\n existing.duration = duration;\n existing.easing = easing;\n existing.animating = true;\n existing.clearOnComplete = true;\n existing.lastDuration = duration;\n existing.lastDelay = delay;\n existing.lastEasing = easing;\n return this.sampleTransition(existing, now);\n }\n }\n this.filterStates.delete(el);\n return null;\n }\n\r\n const { effects, warnings } = this.parseFilterChain(raw);\n this.warnFilterIssues(el, raw, warnings);\n if (effects.length === 0) return null;\n\r\n const state = this.filterStates.get(el);\r\n if (!state) {\n const { duration, delay, easing } = this.getFilterTransition(el);\n if (duration > 0) {\n const zero = this.makeZeroChain(effects);\n const newState: FilterTransitionState = {\n raw,\n effects,\n animating: true,\n from: zero,\n to: effects,\n startTime: now + delay,\n duration,\n easing,\n clearOnComplete: false,\n lastDuration: duration,\n lastDelay: delay,\n lastEasing: easing,\n };\n newState.effectsKey = this.stringifyFilterChain(effects);\n this.filterStates.set(el, newState);\n return this.sampleTransition(newState, now);\n }\n this.filterStates.set(el, {\n raw,\n effects,\n animating: false,\n from: effects,\n to: effects,\n startTime: 0,\n duration: 0,\n easing: (t) => t,\n clearOnComplete: false,\n lastDuration: 0,\n lastDelay: 0,\n lastEasing: (t) => t,\n effectsKey: this.stringifyFilterChain(effects),\n });\n return effects;\n }\n\r\n if (state.raw === raw) {\n if (state.animating) {\n const current = this.sampleTransition(state, now);\n if (!state.animating && state.clearOnComplete) {\n this.filterStates.delete(el);\n return null;\n }\n return current;\n }\n return state.effects;\n }\n\n state.pendingEffects = undefined;\n state.pendingRaw = undefined;\n\n let { duration, delay, easing } = this.getFilterTransition(el);\n if (duration <= 0 && state.lastDuration > 0) {\n duration = state.lastDuration;\n delay = state.lastDelay;\n easing = state.lastEasing;\n }\n if (duration > 0) {\n const canTween = this.canInterpolate(state.effects, effects);\n const current = state.animating ? this.getCurrentChain(state, now) : state.effects;\n if (!canTween && this.isZeroChain(effects)) {\n state.pendingRaw = raw;\n state.pendingEffects = effects;\n state.raw = raw;\n state.effects = current;\n state.from = current;\n state.to = this.makeZeroChain(current);\n state.startTime = now + delay;\n state.duration = duration;\n state.easing = easing;\n state.animating = true;\n state.clearOnComplete = false;\n state.lastDuration = duration;\n state.lastDelay = delay;\n state.lastEasing = easing;\n state.effectsKey = this.stringifyFilterChain(effects);\n return this.sampleTransition(state, now);\n }\n\n const fromChain = canTween ? current : this.makeZeroChain(effects);\n state.raw = raw;\n state.effects = effects;\n state.from = fromChain;\n state.to = effects;\n state.startTime = now + delay;\n state.duration = duration;\n state.easing = easing;\n state.animating = true;\n state.clearOnComplete = false;\n state.lastDuration = duration;\n state.lastDelay = delay;\n state.lastEasing = easing;\n state.effectsKey = this.stringifyFilterChain(effects);\n return this.sampleTransition(state, now);\n }\n\n state.raw = raw;\n state.effects = effects;\n state.animating = false;\n state.clearOnComplete = false;\n state.effectsKey = this.stringifyFilterChain(effects);\n return effects;\n }\n\r\n private collectFilterTargets(\n now: number,\n forceSync: boolean,\n dirtySet: Set<HTMLElement> | null\n ): String3DFilterTarget[] {\n if (!this.scene) return [];\n const targets: String3DFilterTarget[] = [];\n const walk = (obj: String3DObject): void => {\n const el = obj.el as HTMLElement | undefined;\n if (el) {\n const shouldReadStyle =\n !this.useDirtySync ||\n !dirtySet ||\n dirtySet.has(el) ||\n this.filterStates.get(el)?.animating === true;\n const chain = this.readFilterChain(el, now, shouldReadStyle);\n if (chain && chain.length > 0) {\n const dirty =\n !this.useDirtySync ||\n !dirtySet ||\n dirtySet.has(el) ||\n this.filterStates.get(el)?.animating === true;\n const effectsKey =\n this.filterStates.get(el)?.effectsKey || this.stringifyFilterChain(chain);\n targets.push({\n object: obj,\n effects: chain,\n effectsKey,\n dirty,\n });\n return;\n }\n }\n obj.children.forEach((child) => walk(child));\r\n };\r\n this.scene.rootObjects.forEach((obj) => walk(obj));\r\n return targets;\r\n }\r\n\r\n private stringifyFilterChain(chain: String3DFilterChain): string {\r\n const parts = chain.map((effect) => {\r\n if (effect.type === \"blur\") return `blur:${effect.amount}`;\r\n if (effect.type === \"pixel\") return `pixel:${effect.size}`;\r\n if (effect.type === \"bloom\") return `bloom:${effect.intensity},${effect.threshold}`;\r\n if (effect.type === \"brightness\") return `brightness:${effect.amount}`;\r\n if (effect.type === \"contrast\") return `contrast:${effect.amount}`;\r\n if (effect.type === \"saturate\") return `saturate:${effect.amount}`;\r\n if (effect.type === \"grayscale\") return `grayscale:${effect.amount}`;\r\n if (effect.type === \"sepia\") return `sepia:${effect.amount}`;\r\n if (effect.type === \"invert\") return `invert:${effect.amount}`;\r\n if (effect.type === \"hue-rotate\") return `hue-rotate:${effect.angle}`;\r\n if (effect.type === \"custom\") {\r\n const uniforms = Object.keys(effect.uniforms || {})\r\n .sort()\r\n .map((key) => `${key}=${effect.uniforms[key]}`)\r\n .join(\",\");\r\n return `custom:${effect.name}:${uniforms}`;\r\n }\r\n return \"unknown\";\r\n });\r\n return parts.join(\"|\");\r\n }\r\n\r\n private getFilterTransition(el: HTMLElement): {\n duration: number;\n delay: number;\n easing: (t: number) => number;\n } {\n const style = getComputedStyle(el);\n const properties = this.splitTransitionList(style.transitionProperty);\n const durations = this.splitTransitionList(style.transitionDuration);\r\n const delays = this.splitTransitionList(style.transitionDelay);\r\n const timings = this.splitTransitionList(style.transitionTimingFunction);\r\n\r\n const index = this.findTransitionIndex(properties, \"--filter\");\n if (index === -1) {\n const shorthand = this.parseTransitionShorthand(style.transition);\n const fallback = shorthand.get(\"--filter\") || shorthand.get(\"all\");\n if (fallback) {\n return fallback;\n }\n return { duration: 0, delay: 0, easing: (t) => t };\n }\n\r\n const duration = this.parseTime(durations[index] || durations[durations.length - 1] || \"0s\");\r\n const delay = this.parseTime(delays[index] || delays[delays.length - 1] || \"0s\");\r\n const easingRaw = timings[index] || timings[timings.length - 1] || \"linear\";\n return { duration, delay, easing: this.parseEasing(easingRaw) };\n }\n\r\n private splitTransitionList(value: string): string[] {\r\n const result: string[] = [];\r\n let current = \"\";\r\n let depth = 0;\r\n for (let i = 0; i < value.length; i += 1) {\r\n const ch = value[i];\r\n if (ch === \"(\") depth += 1;\r\n if (ch === \")\") depth = Math.max(0, depth - 1);\r\n if (ch === \",\" && depth === 0) {\r\n result.push(current.trim());\r\n current = \"\";\r\n } else {\r\n current += ch;\r\n }\r\n }\r\n if (current.trim()) result.push(current.trim());\r\n return result.length > 0 ? result : [\"all\"];\r\n }\r\n\r\n private findTransitionIndex(properties: string[], name: string): number {\r\n const normalized = properties.map((prop) => prop.trim().toLowerCase());\r\n let index = normalized.indexOf(name);\r\n if (index === -1) {\r\n index = normalized.indexOf(\"all\");\r\n }\r\n return index;\r\n }\r\n\r\n private parseTime(value: string): number {\n const raw = value.trim().toLowerCase();\r\n if (raw.endsWith(\"ms\")) {\r\n const num = Number.parseFloat(raw.slice(0, -2));\r\n return Number.isFinite(num) ? num : 0;\r\n }\r\n if (raw.endsWith(\"s\")) {\r\n const num = Number.parseFloat(raw.slice(0, -1));\r\n return Number.isFinite(num) ? num * 1000 : 0;\r\n }\r\n const num = Number.parseFloat(raw);\r\n return Number.isFinite(num) ? num : 0;\n }\n\n private parseTransitionShorthand(\n value: string\n ): Map<string, { duration: number; delay: number; easing: (t: number) => number }> {\n const map = new Map<\n string,\n { duration: number; delay: number; easing: (t: number) => number }\n >();\n const parts = this.splitTransitionList(value);\n parts.forEach((part) => {\n if (!part) return;\n const tokens = part.trim().split(/\\s+(?![^()]*\\))/g);\n let prop = \"\";\n let duration = \"\";\n let delay = \"\";\n let easing = \"\";\n tokens.forEach((token) => {\n const lower = token.toLowerCase();\n if (\n lower.endsWith(\"ms\") ||\n lower.endsWith(\"s\") ||\n /^[0-9.]+$/.test(lower)\n ) {\n if (!duration) duration = lower;\n else if (!delay) delay = lower;\n } else if (\n lower.startsWith(\"cubic-bezier\") ||\n lower.startsWith(\"steps\") ||\n lower === \"linear\" ||\n lower === \"ease\" ||\n lower === \"ease-in\" ||\n lower === \"ease-out\" ||\n lower === \"ease-in-out\"\n ) {\n easing = token;\n } else if (!prop) {\n prop = token;\n }\n });\n if (!prop) return;\n map.set(prop.trim().toLowerCase(), {\n duration: this.parseTime(duration || \"0s\"),\n delay: this.parseTime(delay || \"0s\"),\n easing: this.parseEasing(easing || \"linear\"),\n });\n });\n return map;\n }\n\r\n private parseEasing(value: string): (t: number) => number {\r\n const raw = value.trim().toLowerCase();\r\n if (raw === \"linear\") return (t) => t;\r\n if (raw === \"ease\") return this.cubicBezier(0.25, 0.1, 0.25, 1);\r\n if (raw === \"ease-in\") return this.cubicBezier(0.42, 0, 1, 1);\r\n if (raw === \"ease-out\") return this.cubicBezier(0, 0, 0.58, 1);\r\n if (raw === \"ease-in-out\") return this.cubicBezier(0.42, 0, 0.58, 1);\r\n if (raw.startsWith(\"cubic-bezier\")) {\r\n const match = raw.match(/cubic-bezier\\(([^)]+)\\)/);\r\n if (match) {\r\n const parts = match[1].split(\",\").map((p) => Number.parseFloat(p.trim()));\r\n if (parts.length === 4 && parts.every((n) => Number.isFinite(n))) {\r\n return this.cubicBezier(parts[0], parts[1], parts[2], parts[3]);\r\n }\r\n }\r\n }\r\n return (t) => t;\r\n }\r\n\r\n private cubicBezier(p1x: number, p1y: number, p2x: number, p2y: number): (t: number) => number {\r\n const sampleCurveX = (t: number) => {\r\n const inv = 1 - t;\r\n return 3 * inv * inv * t * p1x + 3 * inv * t * t * p2x + t * t * t;\r\n };\r\n const sampleCurveY = (t: number) => {\r\n const inv = 1 - t;\r\n return 3 * inv * inv * t * p1y + 3 * inv * t * t * p2y + t * t * t;\r\n };\r\n const solveCurveX = (x: number) => {\r\n let t = x;\r\n for (let i = 0; i < 5; i += 1) {\r\n const x2 = sampleCurveX(t) - x;\r\n const d2 =\r\n 3 * (1 - t) * (1 - t) * p1x + 6 * (1 - t) * t * (p2x - p1x) + 3 * t * t * (1 - p2x);\r\n if (Math.abs(x2) < 1e-5 || d2 === 0) break;\r\n t -= x2 / d2;\r\n }\r\n return t;\r\n };\r\n return (t: number) => {\r\n const x = Math.min(1, Math.max(0, t));\r\n const solved = solveCurveX(x);\r\n return Math.min(1, Math.max(0, sampleCurveY(solved)));\r\n };\r\n }\r\n\r\n private canInterpolate(from: String3DFilterChain, to: String3DFilterChain): boolean {\r\n if (from.length !== to.length) return false;\r\n return from.every((effect, index) => {\r\n const other = to[index];\r\n if (effect.type !== other.type) return false;\r\n if (effect.type === \"custom\" && other.type === \"custom\") {\r\n if (effect.name !== other.name) return false;\r\n const keys = Object.keys(effect.uniforms || {});\r\n const otherKeys = Object.keys(other.uniforms || {});\r\n if (keys.length !== otherKeys.length) return false;\r\n return keys.every((key) => key in other.uniforms && this.isNumeric(effect.uniforms[key]));\r\n }\r\n return true;\r\n });\r\n }\r\n\r\n private makeZeroChain(chain: String3DFilterChain): String3DFilterChain {\r\n return chain.map((effect) => {\r\n switch (effect.type) {\r\n case \"blur\":\r\n return { type: \"blur\", amount: 0 };\r\n case \"pixel\":\r\n return { type: \"pixel\", size: 0 };\r\n case \"bloom\":\r\n return { type: \"bloom\", intensity: 0, threshold: effect.threshold };\r\n case \"brightness\":\r\n return { type: \"brightness\", amount: 1 };\r\n case \"contrast\":\r\n return { type: \"contrast\", amount: 1 };\r\n case \"saturate\":\r\n return { type: \"saturate\", amount: 1 };\r\n case \"grayscale\":\r\n return { type: \"grayscale\", amount: 0 };\r\n case \"sepia\":\r\n return { type: \"sepia\", amount: 0 };\r\n case \"invert\":\r\n return { type: \"invert\", amount: 0 };\r\n case \"hue-rotate\":\r\n return { type: \"hue-rotate\", angle: 0 };\r\n case \"custom\": {\r\n const uniforms: Record<string, any> = {};\r\n Object.entries(effect.uniforms || {}).forEach(([key, value]) => {\r\n uniforms[key] = this.isNumeric(value) ? 0 : value;\r\n });\r\n return { type: \"custom\", name: effect.name, uniforms };\r\n }\r\n default:\r\n return effect;\r\n }\r\n });\r\n }\r\n\r\n private sampleTransition(state: FilterTransitionState, now: number): String3DFilterChain {\n if (!state.animating) return state.effects;\n if (now < state.startTime) {\n return state.from;\n }\n const elapsed = now - state.startTime;\n const duration = Math.max(1, state.duration);\n const t = Math.min(1, Math.max(0, elapsed / duration));\n const eased = state.easing(t);\n const interpolated = this.interpolateChain(state.from, state.to, eased);\n if (t >= 1) {\n state.animating = false;\n state.from = state.to;\n if (state.pendingEffects && state.pendingRaw === state.raw) {\n state.effects = state.pendingEffects;\n state.raw = state.pendingRaw || state.raw;\n state.pendingEffects = undefined;\n state.pendingRaw = undefined;\n } else if (state.pendingEffects) {\n state.pendingEffects = undefined;\n state.pendingRaw = undefined;\n }\n }\n return interpolated;\n }\n\n private getCurrentChain(state: FilterTransitionState, now: number): String3DFilterChain {\n if (!state.animating) return state.effects;\n if (now < state.startTime) return state.from;\n const elapsed = now - state.startTime;\n const duration = Math.max(1, state.duration);\n const t = Math.min(1, Math.max(0, elapsed / duration));\n const eased = state.easing(t);\n return this.interpolateChain(state.from, state.to, eased);\n }\n\r\n private interpolateChain(\n from: String3DFilterChain,\n to: String3DFilterChain,\n t: number\n ): String3DFilterChain {\n if (!this.canInterpolate(from, to)) return to;\r\n return from.map((effect, index) => this.interpolateEffect(effect, to[index], t));\r\n }\r\n\r\n private interpolateEffect(\n from: String3DFilterEffect,\n to: String3DFilterEffect,\n t: number\n ): String3DFilterEffect {\n const lerp = (a: number, b: number) => a + (b - a) * t;\r\n if (from.type === \"blur\" && to.type === \"blur\") {\r\n return { type: \"blur\", amount: lerp(from.amount, to.amount) };\r\n }\r\n if (from.type === \"pixel\" && to.type === \"pixel\") {\r\n return { type: \"pixel\", size: lerp(from.size, to.size) };\r\n }\r\n if (from.type === \"bloom\" && to.type === \"bloom\") {\r\n return {\r\n type: \"bloom\",\r\n intensity: lerp(from.intensity, to.intensity),\r\n threshold: lerp(from.threshold, to.threshold),\r\n };\r\n }\r\n if (from.type === \"brightness\" && to.type === \"brightness\") {\r\n return { type: \"brightness\", amount: lerp(from.amount, to.amount) };\r\n }\r\n if (from.type === \"contrast\" && to.type === \"contrast\") {\r\n return { type: \"contrast\", amount: lerp(from.amount, to.amount) };\r\n }\r\n if (from.type === \"saturate\" && to.type === \"saturate\") {\r\n return { type: \"saturate\", amount: lerp(from.amount, to.amount) };\r\n }\r\n if (from.type === \"grayscale\" && to.type === \"grayscale\") {\r\n return { type: \"grayscale\", amount: lerp(from.amount, to.amount) };\r\n }\r\n if (from.type === \"sepia\" && to.type === \"sepia\") {\r\n return { type: \"sepia\", amount: lerp(from.amount, to.amount) };\r\n }\r\n if (from.type === \"invert\" && to.type === \"invert\") {\r\n return { type: \"invert\", amount: lerp(from.amount, to.amount) };\r\n }\r\n if (from.type === \"hue-rotate\" && to.type === \"hue-rotate\") {\r\n return { type: \"hue-rotate\", angle: lerp(from.angle, to.angle) };\r\n }\r\n if (from.type === \"custom\" && to.type === \"custom\" && from.name === to.name) {\r\n const uniforms: Record<string, any> = {};\r\n Object.entries(to.uniforms || {}).forEach(([key, value]) => {\r\n const fromValue = from.uniforms?.[key];\r\n if (this.isNumeric(fromValue) && this.isNumeric(value)) {\r\n uniforms[key] = lerp(fromValue, value);\r\n } else {\r\n uniforms[key] = value;\r\n }\r\n });\r\n return { type: \"custom\", name: to.name, uniforms };\r\n }\r\n return to;\n }\n\n private isNumeric(value: unknown): value is number {\n return typeof value === \"number\" && Number.isFinite(value);\n }\n\n private isZeroChain(chain: String3DFilterChain): boolean {\n return chain.every((effect) => {\n switch (effect.type) {\n case \"blur\":\n return effect.amount <= 0;\n case \"pixel\":\n return effect.size <= 0;\n case \"bloom\":\n return effect.intensity <= 0;\n case \"brightness\":\n return effect.amount === 1;\n case \"contrast\":\n return effect.amount === 1;\n case \"saturate\":\n return effect.amount === 1;\n case \"grayscale\":\n return effect.amount === 0;\n case \"sepia\":\n return effect.amount === 0;\n case \"invert\":\n return effect.amount === 0;\n case \"hue-rotate\":\n return effect.angle === 0;\n case \"custom\":\n return false;\n default:\n return false;\n }\n });\n }\n\r\n private buildWorkerCameraData(): TransformWorkerCamera {\r\n return {\r\n mode: this.camera!.getMode(),\r\n width: this.renderer!.width,\r\n height: this.renderer!.height,\r\n cameraZ: this.camera!.getPositionZ(),\r\n fov: this.camera!.getPerspectiveFov(),\r\n aspect: this.renderer!.width / this.renderer!.height,\r\n };\r\n }\r\n\r\n private collectWorkerInputs(\r\n object: String3DObject,\r\n parentData: { scale: number },\r\n forceSync: boolean,\r\n dirtySet: Set<HTMLElement> | null,\r\n inputs: TransformWorkerInput[]\r\n ): void {\r\n if (!this.synchronizer || !object.el) return;\r\n const el = object.el as HTMLElement;\r\n const shouldSync = forceSync || !dirtySet || dirtySet.has(el);\r\n let nextParentData = parentData;\r\n\r\n if (object.type.endsWith(\"Light\")) {\r\n if (shouldSync) {\r\n this.synchronizer.syncElement(el, object, parentData);\r\n }\r\n return;\r\n }\r\n\r\n if (shouldSync) {\r\n const rect = el.getBoundingClientRect();\r\n const layoutWidth = el.offsetWidth || rect.width;\r\n const layoutHeight = el.offsetHeight || rect.height;\r\n const translateZ = this.readNumberStyle(el, \"--translate-z\", 0);\r\n const scale = this.readNumberStyle(el, \"--scale\", 1);\r\n const scaleZ = this.readNumberStyle(el, \"--scale-z\", 1);\r\n const rotateX = this.readNumberStyle(el, \"--rotate-x\", 0);\r\n const rotateY = this.readNumberStyle(el, \"--rotate-y\", 0);\r\n const rotateZ = this.readNumberStyle(el, \"--rotate-z\", 0);\r\n const opacity = this.readNumberStyle(el, \"--opacity\", NaN);\r\n\r\n if (object.type !== \"group\") {\r\n MeshSynchronizer.applyVisualProps(el, object, opacity);\r\n }\r\n\r\n let modelSizeX: number | undefined;\r\n let modelSizeY: number | undefined;\r\n let modelScale: number | undefined;\r\n let fitMode: string | undefined;\r\n\r\n if (object.type === \"model\") {\r\n const bbox = object.getOriginalBoundingBox();\r\n const size = bbox.getSize(this.engine!.createVector3());\r\n modelSizeX = size.x;\r\n modelSizeY = size.y;\r\n const modelScaleAttr = parseFloat(el.getAttribute(\"string-3d-model-scale\") || \"1\");\r\n modelScale = Number.isFinite(modelScaleAttr) ? modelScaleAttr : 1;\r\n fitMode = (el.getAttribute(\"string-3d-model-fit\") || \"contain\").toLowerCase().trim();\r\n }\r\n\r\n const returnScale = object.type === \"group\" ? scale : scale * parentData.scale;\r\n this.lastSyncData.set(object, { scale: returnScale });\r\n nextParentData = { scale: returnScale };\r\n\r\n this.workerObjectMap.set(object.id, { object, el });\r\n inputs.push({\r\n id: object.id,\r\n type: object.type,\r\n rectLeft: rect.left,\r\n rectTop: rect.top,\r\n rectWidth: layoutWidth,\r\n rectHeight: layoutHeight,\r\n translateZ,\r\n scale,\r\n scaleZ,\r\n rotateX,\r\n rotateY,\r\n rotateZ,\r\n parentScale: parentData.scale,\r\n modelSizeX,\r\n modelSizeY,\r\n modelScale,\r\n fitMode,\r\n });\r\n } else {\r\n const cached = this.lastSyncData.get(object);\r\n if (cached) {\r\n nextParentData = cached;\r\n }\r\n }\r\n\r\n const forceChildren = forceSync || shouldSync;\r\n object.children.forEach((child) => {\r\n this.collectWorkerInputs(child, nextParentData, forceChildren, dirtySet, inputs);\r\n });\r\n }\r\n\r\n private applyWorkerResults(results: TransformWorkerResult[]): void {\r\n if (!this.engine) return;\r\n results.forEach((result) => {\r\n const entry = this.workerObjectMap.get(result.id);\r\n if (!entry) return;\r\n const object = entry.object;\r\n object.position = this.engine!.createVector3(result.posX, result.posY, result.posZ);\r\n object.rotation = this.engine!.createEuler(result.rotX, result.rotY, result.rotZ, \"XYZ\");\r\n object.scale = this.engine!.createVector3(result.scaleX, result.scaleY, result.scaleZ);\r\n if (object.type === \"group\") {\r\n object.object.updateMatrixWorld(true);\r\n }\r\n });\r\n }\r\n\r\n override destroy(): void {\r\n this.renderer?.destroy();\r\n this.scene?.destroy();\r\n this.isLoading.clear();\r\n this.transformWorker?.destroy();\r\n this.transformWorker = null;\r\n this.removeScrollListeners();\r\n this.resizeObserver?.disconnect();\r\n this.mutationObserver?.disconnect();\r\n this.observedElements.clear();\r\n this.dirtyElements.clear();\r\n this.workerObjectMap.clear();\r\n this.lastSyncData = new WeakMap();\r\n\r\n const styleEl = document.getElementById(\"string-3d-styles\");\r\n styleEl?.remove();\r\n\r\n if (this.canvasContainer?.id === \"string-3d-canvas\") {\r\n this.canvasContainer.remove();\r\n }\r\n\r\n super.destroy();\r\n }\r\n}\r\n","import { I3DEngine, I3DVector3, I3DCamera } from \"./abstractions/I3DEngine\";\r\n\r\nexport type CameraMode = \"orthographic\" | \"perspective\";\r\n\r\nexport class String3DCamera {\r\n private scaleCache = new Map<number, number>();\r\n private _camera: I3DCamera;\r\n private _position: I3DVector3;\r\n private _width = 1;\r\n private _height = 1;\r\n private engine: I3DEngine;\r\n private mode: CameraMode;\r\n private perspectiveFov: number;\r\n\r\n constructor(\r\n engine: I3DEngine,\r\n mode: CameraMode = \"orthographic\",\r\n fov = 50,\r\n near = 0.1,\r\n far = 10000\r\n ) {\r\n this.engine = engine;\r\n this.mode = mode;\r\n this.perspectiveFov = fov;\r\n\r\n if (mode === \"orthographic\") {\r\n this._camera = engine.createOrthographicCamera(-1, 1, 1, -1, near, far);\r\n } else {\r\n this._camera = engine.createPerspectiveCamera(fov, 1, near, far);\r\n }\r\n\r\n this._position = engine.createVector3(0, 0, 1000);\r\n this.update();\r\n }\r\n\r\n public get camera(): I3DCamera {\r\n return this._camera;\r\n }\r\n\r\n public resize(width: number, height: number): void {\r\n this._width = width;\r\n this._height = height;\r\n\r\n if (this.mode === \"orthographic\") {\r\n const ortho = this._camera as any;\r\n ortho.left = -width / 2;\r\n ortho.right = width / 2;\r\n ortho.top = height / 2;\r\n ortho.bottom = -height / 2;\r\n } else {\r\n this._camera.aspect = width / height;\r\n }\r\n\r\n this.update();\r\n }\r\n\r\n public setPosition(x: number, y: number, z: number): void {\r\n this._position.set(x, y, z);\r\n this._camera.position.copy(this._position);\r\n this.update();\r\n }\r\n\r\n public lookAt(x: number, y: number, z: number): void {\r\n this._camera.lookAt(x, y, z);\r\n this.update();\r\n }\r\n\r\n public update(): void {\r\n this._camera.updateProjectionMatrix();\r\n (this._camera as any).updateMatrixWorld?.();\r\n }\r\n\r\n public screenToWorld(screenX: number, screenY: number, z = 0): I3DVector3 {\r\n if (this.mode === \"orthographic\") {\r\n const x = screenX - this._width / 2;\r\n const y = -(screenY - this._height / 2);\r\n return this.engine.createVector3(x, y, z);\r\n } else {\r\n const { width, height } = this.getFrustumSizeAt(z);\r\n const normalizedX = screenX / this._width;\r\n const normalizedY = screenY / this._height;\r\n const x = (normalizedX - 0.5) * width;\r\n const y = -(normalizedY - 0.5) * height;\r\n return this.engine.createVector3(x, y, z);\r\n }\r\n }\r\n\r\n public getFrustumSizeAt(z: number): { width: number; height: number } {\r\n if (this.mode === \"orthographic\") {\r\n return { width: this._width, height: this._height };\r\n }\r\n\r\n const fov = this.engine.degToRad(this.perspectiveFov);\r\n const distance = Math.abs(z - this._camera.position.z);\r\n const height = 2 * Math.tan(fov / 2) * distance;\r\n const width = height * this._camera.aspect;\r\n return { width, height };\r\n }\r\n\r\n public getScaleAtZ(z: number, viewportHeight: number): number {\r\n if (this.mode === \"orthographic\") {\r\n return 1;\r\n }\r\n\r\n const roundedZ = Math.round(z * 1000) / 1000;\r\n if (this.scaleCache.has(roundedZ)) {\r\n return this.scaleCache.get(roundedZ)!;\r\n }\r\n\r\n const { height } = this.getFrustumSizeAt(z);\r\n const scale = height / viewportHeight;\r\n this.scaleCache.set(roundedZ, scale);\r\n return scale;\r\n }\r\n\r\n public clearScaleCache(): void {\r\n this.scaleCache.clear();\r\n }\r\n\r\n public getMode(): CameraMode {\n return this.mode;\n }\n\n public getPerspectiveFov(): number {\n return this.perspectiveFov;\n }\n\n public getPositionZ(): number {\n return this._position.z;\n }\n}\n","export type String3DCustomFilterDefinition = {\n name: string;\n fragmentShader: string;\n uniforms?: Record<string, any>;\n parse?: (args: string) => Record<string, any> | null;\n};\n\nexport class String3DCustomFilterRegistry {\n private static filters: Map<string, String3DCustomFilterDefinition> = new Map();\n\n static register(definition: String3DCustomFilterDefinition): void {\n const name = definition.name.trim().toLowerCase();\n if (!name) {\n throw new Error(\"[String3D] Custom filter name is required.\");\n }\n this.filters.set(name, { ...definition, name });\n }\n\n static get(name: string): String3DCustomFilterDefinition | undefined {\n return this.filters.get(name.trim().toLowerCase());\n }\n\n static has(name: string): boolean {\n return this.filters.has(name.trim().toLowerCase());\n }\n\n static list(): String3DCustomFilterDefinition[] {\n return Array.from(this.filters.values());\n }\n}\n","import {\n I3DEngine,\n I3DRenderer,\n I3DRenderTarget,\n I3DScene,\n I3DCamera,\n I3DMaterial,\n I3DObject,\n} from \"../abstractions/I3DEngine\";\nimport type { String3DFilterChain } from \"./String3DFilterTypes\";\nimport { String3DCustomFilterRegistry } from \"./String3DCustomFilter\";\n\ntype RenderTargetFactory = (width: number, height: number) => I3DRenderTarget;\n\nclass RenderTargetPool {\n private pool: I3DRenderTarget[] = [];\n private create: RenderTargetFactory;\n\n constructor(create: RenderTargetFactory) {\n this.create = create;\n }\n\n acquire(width: number, height: number): I3DRenderTarget {\n const target = this.pool.pop() || this.create(width, height);\n if (target.width !== width || target.height !== height) {\n target.setSize(width, height);\n }\n return target;\n }\n\n release(target: I3DRenderTarget): void {\n this.pool.push(target);\n }\n\n dispose(): void {\n this.pool.forEach((target) => target.dispose());\n this.pool = [];\n }\n}\n\nexport class String3DFilterPipeline {\n private engine: I3DEngine;\n private renderer: I3DRenderer;\n private width: number;\n private height: number;\n private scale = 1;\n private scene: I3DScene;\n private camera: I3DCamera;\n private quad: I3DObject;\n private copyMaterial: I3DMaterial;\n private blurMaterial: I3DMaterial;\n private pixelMaterial: I3DMaterial;\n private bloomExtractMaterial: I3DMaterial;\n private bloomAddMaterial: I3DMaterial;\n private colorMaterial: I3DMaterial;\n private customMaterials: Map<string, I3DMaterial> = new Map();\n private pool: RenderTargetPool;\n\n constructor(engine: I3DEngine, renderer: I3DRenderer, width: number, height: number) {\n this.engine = engine;\n this.renderer = renderer;\n this.width = width;\n this.height = height;\n\n this.scene = engine.createScene();\n this.camera = engine.createOrthographicCamera(-1, 1, 1, -1, 0, 1);\n\n const geometry = engine.createPlaneGeometry(2, 2);\n this.copyMaterial = this.createCopyMaterial();\n this.blurMaterial = this.createBlurMaterial();\n this.pixelMaterial = this.createPixelMaterial();\n this.bloomExtractMaterial = this.createBloomExtractMaterial();\n this.bloomAddMaterial = this.createBloomAddMaterial();\n this.colorMaterial = this.createColorMaterial();\n\n this.quad = engine.createMesh(geometry, this.copyMaterial);\n this.scene.add(this.quad);\n\n const create = (w: number, h: number) => {\n if (!this.engine.createRenderTarget) {\n throw new Error(\"[String3DFilterPipeline] Render target support missing.\");\n }\n return this.engine.createRenderTarget(w, h);\n };\n this.pool = new RenderTargetPool(create);\n }\n\n public isSupported(): boolean {\n return (\n !!this.engine.createRenderTarget &&\n !!this.engine.createShaderMaterial &&\n !!this.renderer.setRenderTarget\n );\n }\n\n public resize(width: number, height: number): void {\n this.width = width;\n this.height = height;\n }\n\n public setScale(scale: number): void {\n const next = Math.max(0.75, Math.min(1, scale));\n this.scale = next;\n }\n\n public applyFilters(\n input: I3DRenderTarget,\n effects: String3DFilterChain,\n quality = 1\n ): I3DRenderTarget {\n let current = input;\n const locals: I3DRenderTarget[] = [];\n\n const releaseLocal = (target: I3DRenderTarget): void => {\n const idx = locals.indexOf(target);\n if (idx >= 0) {\n locals.splice(idx, 1);\n this.pool.release(target);\n }\n };\n\n const acquire = (): I3DRenderTarget => {\n const { width, height } = this.getScaledSize();\n const target = this.pool.acquire(width, height);\n locals.push(target);\n return target;\n };\n\n effects.forEach((effect) => {\n if (effect.type === \"blur\") {\n const radius = effect.amount * quality;\n if (radius <= 0.0001) return;\n const first = acquire();\n this.renderPass(this.blurMaterial, current, first, {\n uDirection: [1, 0],\n uRadius: radius,\n });\n const second = acquire();\n this.renderPass(this.blurMaterial, first, second, {\n uDirection: [0, 1],\n uRadius: radius,\n });\n releaseLocal(first);\n if (current !== input) {\n releaseLocal(current);\n }\n current = second;\n } else if (effect.type === \"pixel\") {\n if (effect.size <= 0.5) return;\n const output = acquire();\n this.renderPass(this.pixelMaterial, current, output, {\n uPixelSize: effect.size,\n });\n if (current !== input) {\n releaseLocal(current);\n }\n current = output;\n } else if (effect.type === \"bloom\") {\n const intensity = effect.intensity;\n if (intensity <= 0.0001) return;\n if (effect.threshold >= 0.99) return;\n const blurRadius = Math.max(1, 4 * quality);\n const extracted = acquire();\n this.renderPass(this.bloomExtractMaterial, current, extracted, {\n uThreshold: effect.threshold,\n });\n\n const blur1 = acquire();\n this.renderPass(this.blurMaterial, extracted, blur1, {\n uDirection: [1, 0],\n uRadius: blurRadius,\n });\n const blur2 = acquire();\n this.renderPass(this.blurMaterial, blur1, blur2, {\n uDirection: [0, 1],\n uRadius: blurRadius,\n });\n\n releaseLocal(extracted);\n releaseLocal(blur1);\n\n const combined = acquire();\n this.renderAddPass(current, blur2, combined, intensity);\n releaseLocal(blur2);\n\n if (current !== input) {\n releaseLocal(current);\n }\n current = combined;\n } else if (\n effect.type === \"brightness\" ||\n effect.type === \"contrast\" ||\n effect.type === \"saturate\" ||\n effect.type === \"grayscale\" ||\n effect.type === \"sepia\" ||\n effect.type === \"invert\" ||\n effect.type === \"hue-rotate\"\n ) {\n const output = acquire();\n const mode = this.getColorMode(effect.type);\n const amount = effect.type === \"hue-rotate\" ? effect.angle : effect.amount;\n this.renderPass(this.colorMaterial, current, output, {\n uMode: mode,\n uAmount: amount,\n });\n if (current !== input) {\n releaseLocal(current);\n }\n current = output;\n } else if (effect.type === \"custom\") {\n const output = acquire();\n const material = this.getCustomMaterial(effect.name);\n if (material) {\n this.renderPass(material, current, output, effect.uniforms);\n if (current !== input) {\n releaseLocal(current);\n }\n current = output;\n } else {\n releaseLocal(output);\n }\n }\n });\n\n locals.forEach((target) => {\n if (target !== current) {\n this.pool.release(target);\n }\n });\n\n return current;\n }\n\n public acquireTarget(): I3DRenderTarget {\n const { width, height } = this.getScaledSize();\n return this.pool.acquire(width, height);\n }\n\n public releaseTarget(target: I3DRenderTarget): void {\n this.pool.release(target);\n }\n\n public renderToScreen(input: I3DRenderTarget): void {\n this.renderPass(this.copyMaterial, input, null, {}, false);\n }\n\n public dispose(): void {\n this.pool.dispose();\n this.customMaterials.forEach((material) => material.dispose());\n this.customMaterials.clear();\n }\n\n private renderPass(\n material: I3DMaterial,\n input: I3DRenderTarget,\n output: I3DRenderTarget | null,\n uniforms: Record<string, any> = {},\n clear = true\n ): void {\n const renderer = this.renderer as any;\n if (renderer.setRenderTarget) {\n renderer.setRenderTarget(output);\n }\n\n this.setMaterial(this.quad, material);\n this.setUniform(material, \"tDiffuse\", input.texture);\n const { width, height } = this.getScaledSize();\n this.setUniform(material, \"uResolution\", [width, height]);\n this.setUniform(material, \"uTexel\", [1 / width, 1 / height]);\n Object.entries(uniforms).forEach(([key, value]) => this.setUniform(material, key, value));\n\n if (clear && renderer.clear) {\n renderer.clear(true, true, true);\n }\n this.renderer.render(this.scene, this.camera);\n }\n\n private renderAddPass(\n base: I3DRenderTarget,\n bloom: I3DRenderTarget,\n output: I3DRenderTarget,\n intensity: number\n ): void {\n const renderer = this.renderer as any;\n if (renderer.setRenderTarget) {\n renderer.setRenderTarget(output);\n }\n\n this.setMaterial(this.quad, this.bloomAddMaterial);\n this.setUniform(this.bloomAddMaterial, \"tBase\", base.texture);\n this.setUniform(this.bloomAddMaterial, \"tBloom\", bloom.texture);\n this.setUniform(this.bloomAddMaterial, \"uIntensity\", intensity);\n const { width, height } = this.getScaledSize();\n this.setUniform(this.bloomAddMaterial, \"uResolution\", [width, height]);\n\n if (renderer.clear) {\n renderer.clear(true, true, true);\n }\n this.renderer.render(this.scene, this.camera);\n }\n\n private setMaterial(object: I3DObject, material: I3DMaterial): void {\n const anyObj = object as any;\n if (anyObj.material !== material) {\n anyObj.material = material as any;\n }\n }\n\n private setUniform(material: I3DMaterial, name: string, value: any): void {\n const uniforms = (material as any).uniforms;\n if (!uniforms) return;\n if (!uniforms[name]) {\n uniforms[name] = { value };\n } else {\n uniforms[name].value = value;\n }\n }\n\n private createCopyMaterial(): I3DMaterial {\n return this.createShaderMaterial({\n uniforms: { tDiffuse: { value: null } },\n vertexShader: this.getVertexShader(),\n fragmentShader: `\n varying vec2 vUv;\n uniform sampler2D tDiffuse;\n void main() {\n gl_FragColor = texture2D(tDiffuse, vUv);\n }\n `,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n });\n }\n\n private createPixelMaterial(): I3DMaterial {\n return this.createShaderMaterial({\n uniforms: {\n tDiffuse: { value: null },\n uResolution: { value: [this.width, this.height] },\n uPixelSize: { value: 1 },\n },\n vertexShader: this.getVertexShader(),\n fragmentShader: `\n varying vec2 vUv;\n uniform sampler2D tDiffuse;\n uniform vec2 uResolution;\n uniform float uPixelSize;\n void main() {\n vec2 pixel = uPixelSize / uResolution;\n vec2 coord = floor(vUv / pixel) * pixel + pixel * 0.5;\n gl_FragColor = texture2D(tDiffuse, coord);\n }\n `,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n });\n }\n\n private createBlurMaterial(): I3DMaterial {\n return this.createShaderMaterial({\n uniforms: {\n tDiffuse: { value: null },\n uTexel: { value: [1 / this.width, 1 / this.height] },\n uDirection: { value: [1, 0] },\n uRadius: { value: 2 },\n },\n vertexShader: this.getVertexShader(),\n fragmentShader: `\n varying vec2 vUv;\n uniform sampler2D tDiffuse;\n uniform vec2 uTexel;\n uniform vec2 uDirection;\n uniform float uRadius;\n void main() {\n vec2 off1 = uDirection * uTexel * uRadius;\n vec2 off2 = uDirection * uTexel * uRadius * 2.0;\n vec2 off3 = uDirection * uTexel * uRadius * 3.0;\n vec2 off4 = uDirection * uTexel * uRadius * 4.0;\n vec4 color = texture2D(tDiffuse, vUv) * 0.227027;\n color += texture2D(tDiffuse, vUv + off1) * 0.1945946;\n color += texture2D(tDiffuse, vUv - off1) * 0.1945946;\n color += texture2D(tDiffuse, vUv + off2) * 0.1216216;\n color += texture2D(tDiffuse, vUv - off2) * 0.1216216;\n color += texture2D(tDiffuse, vUv + off3) * 0.054054;\n color += texture2D(tDiffuse, vUv - off3) * 0.054054;\n color += texture2D(tDiffuse, vUv + off4) * 0.016216;\n color += texture2D(tDiffuse, vUv - off4) * 0.016216;\n gl_FragColor = color;\n }\n `,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n });\n }\n\n private createBloomExtractMaterial(): I3DMaterial {\n return this.createShaderMaterial({\n uniforms: {\n tDiffuse: { value: null },\n uThreshold: { value: 0.8 },\n },\n vertexShader: this.getVertexShader(),\n fragmentShader: `\n varying vec2 vUv;\n uniform sampler2D tDiffuse;\n uniform float uThreshold;\n void main() {\n vec4 color = texture2D(tDiffuse, vUv);\n float brightness = max(max(color.r, color.g), color.b);\n gl_FragColor = brightness > uThreshold ? color : vec4(0.0);\n }\n `,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n });\n }\n\n private createBloomAddMaterial(): I3DMaterial {\n return this.createShaderMaterial({\n uniforms: {\n tBase: { value: null },\n tBloom: { value: null },\n uIntensity: { value: 1 },\n uResolution: { value: [this.width, this.height] },\n },\n vertexShader: this.getVertexShader(),\n fragmentShader: `\n varying vec2 vUv;\n uniform sampler2D tBase;\n uniform sampler2D tBloom;\n uniform float uIntensity;\n void main() {\n vec4 base = texture2D(tBase, vUv);\n vec4 bloom = texture2D(tBloom, vUv);\n gl_FragColor = vec4(base.rgb + bloom.rgb * uIntensity, base.a);\n }\n `,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n });\n }\n\n private createColorMaterial(): I3DMaterial {\n return this.createShaderMaterial({\n uniforms: {\n tDiffuse: { value: null },\n uMode: { value: 0 },\n uAmount: { value: 1 },\n },\n vertexShader: this.getVertexShader(),\n fragmentShader: `\n varying vec2 vUv;\n uniform sampler2D tDiffuse;\n uniform int uMode;\n uniform float uAmount;\n\n vec3 applyHueRotate(vec3 color, float angle) {\n float cosA = cos(angle);\n float sinA = sin(angle);\n mat3 m = mat3(\n 0.213 + cosA * 0.787 - sinA * 0.213,\n 0.715 - cosA * 0.715 - sinA * 0.715,\n 0.072 - cosA * 0.072 + sinA * 0.928,\n 0.213 - cosA * 0.213 + sinA * 0.143,\n 0.715 + cosA * 0.285 + sinA * 0.140,\n 0.072 - cosA * 0.072 - sinA * 0.283,\n 0.213 - cosA * 0.213 - sinA * 0.787,\n 0.715 - cosA * 0.715 + sinA * 0.715,\n 0.072 + cosA * 0.928 + sinA * 0.072\n );\n return clamp(m * color, 0.0, 1.0);\n }\n\n void main() {\n vec4 color = texture2D(tDiffuse, vUv);\n float luma = dot(color.rgb, vec3(0.299, 0.587, 0.114));\n\n if (uMode == 1) {\n color.rgb *= uAmount;\n } else if (uMode == 2) {\n color.rgb = (color.rgb - 0.5) * uAmount + 0.5;\n } else if (uMode == 3) {\n color.rgb = mix(vec3(luma), color.rgb, uAmount);\n } else if (uMode == 4) {\n color.rgb = mix(color.rgb, vec3(luma), uAmount);\n } else if (uMode == 5) {\n vec3 sepia = vec3(\n dot(color.rgb, vec3(0.393, 0.769, 0.189)),\n dot(color.rgb, vec3(0.349, 0.686, 0.168)),\n dot(color.rgb, vec3(0.272, 0.534, 0.131))\n );\n color.rgb = mix(color.rgb, sepia, uAmount);\n } else if (uMode == 6) {\n color.rgb = mix(color.rgb, vec3(1.0) - color.rgb, uAmount);\n } else if (uMode == 7) {\n color.rgb = applyHueRotate(color.rgb, uAmount);\n }\n\n gl_FragColor = color;\n }\n `,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n });\n }\n\n private getColorMode(type: string): number {\n switch (type) {\n case \"brightness\":\n return 1;\n case \"contrast\":\n return 2;\n case \"saturate\":\n return 3;\n case \"grayscale\":\n return 4;\n case \"sepia\":\n return 5;\n case \"invert\":\n return 6;\n case \"hue-rotate\":\n return 7;\n default:\n return 0;\n }\n }\n\n private createShaderMaterial(params: any): I3DMaterial {\n if (!this.engine.createShaderMaterial) {\n throw new Error(\"[String3DFilterPipeline] Shader material support missing.\");\n }\n return this.engine.createShaderMaterial(params);\n }\n\n private getCustomMaterial(name: string): I3DMaterial | null {\n const normalized = name.trim().toLowerCase();\n if (!normalized) return null;\n if (this.customMaterials.has(normalized)) {\n return this.customMaterials.get(normalized)!;\n }\n const def = String3DCustomFilterRegistry.get(normalized);\n if (!def) return null;\n\n const uniforms: Record<string, any> = { tDiffuse: { value: null } };\n const { width, height } = this.getScaledSize();\n uniforms.uResolution = { value: [width, height] };\n uniforms.uTexel = { value: [1 / width, 1 / height] };\n Object.entries(def.uniforms || {}).forEach(([key, value]) => {\n uniforms[key] = { value };\n });\n\n const material = this.createShaderMaterial({\n uniforms,\n vertexShader: this.getVertexShader(),\n fragmentShader: def.fragmentShader,\n transparent: true,\n depthTest: false,\n depthWrite: false,\n });\n\n this.customMaterials.set(normalized, material);\n return material;\n }\n\n private getScaledSize(): { width: number; height: number } {\n const width = Math.max(1, Math.round(this.width * this.scale));\n const height = Math.max(1, Math.round(this.height * this.scale));\n return { width, height };\n }\n\n private getVertexShader(): string {\n return `\n varying vec2 vUv;\n void main() {\n vUv = uv;\n gl_Position = projectionMatrix * modelViewMatrix * vec4(position, 1.0);\n }\n `;\n }\n}\n","import { I3DEngine, I3DRenderer, I3DObject, I3DRenderTarget } from \"./abstractions/I3DEngine\";\nimport { String3DCamera } from \"./String3DCamera\";\nimport { String3DScene } from \"./String3DScene\";\nimport { String3DFilterPipeline } from \"./filters/String3DFilterPipeline\";\nimport type { String3DFilterTarget } from \"./filters/String3DFilterTypes\";\nimport type { String3DFilterEffect } from \"./filters/String3DFilterTypes\";\n\ntype FilterCacheEntry = {\n target: I3DRenderTarget;\n effectsKey: string;\n lastUsedFrame: number;\n qualityScale: number;\n};\n\nexport class String3DRenderer {\n private _container: HTMLElement;\n private _renderer: I3DRenderer;\n private _width: number;\n private _height: number;\n private engine: I3DEngine;\n private filterPipeline: String3DFilterPipeline | null = null;\n private filterCache: Map<string, FilterCacheEntry> = new Map();\n private frameId = 0;\n private lastFrameTime = performance.now();\n private avgFrameMs = 16.7;\n private qualityScale = 1;\n private lastQualityChange = 0;\n private filterLayer = 1;\n\n constructor(container: HTMLElement, engine: I3DEngine) {\n this.engine = engine;\n this._container = container;\n const { width, height } = container.getBoundingClientRect();\n this._width = width;\n this._height = height;\n\n this._renderer = engine.createRenderer({\n antialias: true,\n alpha: true,\n logarithmicDepthBuffer: true,\n });\n this._renderer.setPixelRatio(window.devicePixelRatio);\n this._renderer.setSize(width, height);\n\n if (this._renderer.shadowMap) {\n this._renderer.shadowMap.enabled = true;\n }\n }\n\n public attach(): void {\n this._container.appendChild(this._renderer.domElement);\n }\n\n public render(\n scene: String3DScene,\n camera: String3DCamera,\n filterTargets: String3DFilterTarget[] = []\n ): void {\n if (filterTargets.length === 0) {\n this._renderer.render(scene.getScene(), camera.camera);\n return;\n }\n\n const pipeline = this.ensureFilterPipeline();\n if (!pipeline?.isSupported()) {\n this._renderer.render(scene.getScene(), camera.camera);\n return;\n }\n\n this.frameId += 1;\n this.updateQuality(filterTargets.length, pipeline);\n\n const allObjects = scene.getAllObjects();\n const visibility = new Map<I3DObject, boolean | undefined>();\n allObjects.forEach((obj) => {\n const anyObj = obj.object as any;\n if (\"visible\" in anyObj) {\n visibility.set(obj.object, anyObj.visible);\n }\n });\n\n const filteredSet = new Set<I3DObject>();\n filterTargets.forEach((target) => {\n this.collectSubtreeObjects(target.object, filteredSet);\n });\n\n allObjects.forEach((obj) => {\n if (filteredSet.has(obj.object)) {\n this.setVisible(obj.object, false);\n }\n });\n\n const rendererAny = this._renderer as any;\n const prevAutoClear = rendererAny.autoClear;\n rendererAny.autoClear = true;\n if (rendererAny.setRenderTarget) {\n rendererAny.setRenderTarget(null);\n }\n if (rendererAny.clear) {\n rendererAny.clear(true, true, true);\n }\n this._renderer.render(scene.getScene(), camera.camera);\n\n rendererAny.autoClear = false;\n\n allObjects.forEach((obj) => {\n const originalVisible = visibility.get(obj.object);\n if (typeof originalVisible !== \"undefined\") {\n this.setVisible(obj.object, originalVisible);\n }\n });\n\n const lights = allObjects.filter((obj) => obj.type.endsWith(\"Light\"));\n const supportsLayers = this.supportsLayers(camera.camera, allObjects);\n\n filterTargets.forEach((target) => {\n const cache = this.filterCache.get(target.object.id);\n const canUseCache =\n !target.dirty &&\n cache &&\n cache.effectsKey === target.effectsKey &&\n cache.qualityScale === this.qualityScale;\n\n if (canUseCache) {\n cache.lastUsedFrame = this.frameId;\n pipeline.renderToScreen(cache.target);\n return;\n }\n\n const effects = this.injectEffectContext(target.object.el as HTMLElement | undefined, target.effects);\n\n const allowed = new Set<I3DObject>();\n this.collectSubtreeObjects(target.object, allowed);\n\n let restoreLayers: Array<{ object: I3DObject; mask: number }> = [];\n let restoreCameraMask: number | null = null;\n\n if (supportsLayers) {\n const subtree = target.object.getSubtreeObjects();\n restoreLayers = this.applyLayerMask(subtree, lights, this.filterLayer);\n restoreCameraMask = this.setCameraLayer(camera.camera, this.filterLayer);\n } else {\n allObjects.forEach((obj) => {\n const originalVisible = visibility.get(obj.object);\n if (originalVisible === false) {\n this.setVisible(obj.object, false);\n return;\n }\n\n if (obj.type.endsWith(\"Light\")) {\n this.setVisible(obj.object, true);\n return;\n }\n\n this.setVisible(obj.object, allowed.has(obj.object));\n });\n }\n\n const input = pipeline.acquireTarget();\n if (rendererAny.setRenderTarget) {\n rendererAny.setRenderTarget(input);\n }\n if (rendererAny.clear) {\n rendererAny.clear(true, true, true);\n }\n this._renderer.render(scene.getScene(), camera.camera);\n\n const output = pipeline.applyFilters(input, effects, this.qualityScale);\n if (rendererAny.setRenderTarget) {\n rendererAny.setRenderTarget(null);\n }\n pipeline.renderToScreen(output);\n\n if (supportsLayers) {\n this.restoreLayerMask(restoreLayers);\n if (restoreCameraMask !== null) {\n this.restoreCameraLayer(camera.camera, restoreCameraMask);\n }\n }\n\n if (output !== input) {\n pipeline.releaseTarget(input);\n }\n\n const entry: FilterCacheEntry = {\n target: output,\n effectsKey: target.effectsKey,\n lastUsedFrame: this.frameId,\n qualityScale: this.qualityScale,\n };\n const existing = this.filterCache.get(target.object.id);\n if (existing && existing.target !== output) {\n pipeline.releaseTarget(existing.target);\n }\n this.filterCache.set(target.object.id, entry);\n });\n\n if (!supportsLayers) {\n allObjects.forEach((obj) => {\n const originalVisible = visibility.get(obj.object);\n if (typeof originalVisible !== \"undefined\") {\n this.setVisible(obj.object, originalVisible);\n }\n });\n }\n\n rendererAny.autoClear = prevAutoClear;\n\n this.evictCache();\n }\n\n public resize(camera: String3DCamera): void {\n const { width, height } = this._container.getBoundingClientRect();\n this._width = width;\n this._height = height;\n this._renderer.setSize(width, height);\n camera.resize(width, height);\n this.filterPipeline?.resize(width, height);\n this.invalidateFilterCache();\n }\n\n public get width(): number {\n return this._width;\n }\n\n public get height(): number {\n return this._height;\n }\n\n public get renderer(): I3DRenderer {\n return this._renderer;\n }\n\n public destroy(): void {\n this._renderer.dispose();\n this.filterPipeline?.dispose();\n this.filterCache.clear();\n }\n\n private ensureFilterPipeline(): String3DFilterPipeline | null {\n if (!this.canCreateFilterPipeline()) {\n return null;\n }\n if (!this.filterPipeline) {\n this.filterPipeline = new String3DFilterPipeline(\n this.engine,\n this._renderer,\n this._width,\n this._height\n );\n this.filterPipeline.setScale(this.qualityScale);\n }\n return this.filterPipeline;\n }\n\n private canCreateFilterPipeline(): boolean {\n return (\n typeof this.engine.createRenderTarget === \"function\" &&\n typeof this.engine.createShaderMaterial === \"function\" &&\n typeof (this._renderer as any).setRenderTarget === \"function\"\n );\n }\n\n private collectSubtreeObjects(\n object: import(\"./String3DObject\").String3DObject,\n set: Set<I3DObject>\n ): void {\n set.add(object.object);\n object.children.forEach((child) => this.collectSubtreeObjects(child, set));\n }\n\n private setVisible(object: I3DObject, visible: boolean): void {\n const anyObj = object as any;\n if (\"visible\" in anyObj) {\n anyObj.visible = visible;\n }\n }\n\n private getFilterCenter(el: HTMLElement | undefined): [number, number] {\n if (!el || !this._width || !this._height) return [0.5, 0.5];\n const rect = el.getBoundingClientRect();\n const cx = (rect.left + rect.width / 2) / this._width;\n const cy = 1 - (rect.top + rect.height / 2) / this._height;\n const clamp = (value: number) => Math.max(0, Math.min(1, value));\n return [clamp(cx), clamp(cy)];\n }\n\n private injectEffectContext(\n el: HTMLElement | undefined,\n effects: String3DFilterEffect[]\n ): String3DFilterEffect[] {\n if (!effects.some((effect) => effect.type === \"custom\")) {\n return effects;\n }\n const center = this.getFilterCenter(el);\n let changed = false;\n const next = effects.map((effect) => {\n if (effect.type !== \"custom\") return effect;\n if (effect.uniforms && \"uCenter\" in effect.uniforms) return effect;\n const uniforms = { ...(effect.uniforms || {}), uCenter: center };\n changed = true;\n return { ...effect, uniforms };\n });\n return changed ? next : effects;\n }\n\n private updateQuality(filterCount: number, pipeline: String3DFilterPipeline): void {\n const now = performance.now();\n const dt = Math.max(0.1, now - this.lastFrameTime);\n this.lastFrameTime = now;\n this.avgFrameMs = this.avgFrameMs * 0.9 + dt * 0.1;\n\n const fps = 1000 / this.avgFrameMs;\n const countScale = Math.max(0.75, 1 - Math.min(0.4, filterCount * 0.03));\n let targetScale = countScale;\n\n if (fps < 48) targetScale = Math.max(0.75, countScale - 0.1);\n if (fps < 40) targetScale = Math.max(0.75, countScale - 0.2);\n if (fps > 58) targetScale = Math.min(1, countScale + 0.05);\n\n if (Math.abs(targetScale - this.qualityScale) >= 0.05 && now - this.lastQualityChange > 300) {\n this.qualityScale = targetScale;\n this.lastQualityChange = now;\n pipeline.setScale(this.qualityScale);\n this.invalidateFilterCache();\n }\n }\n\n private invalidateFilterCache(): void {\n if (!this.filterPipeline) return;\n this.filterCache.forEach((entry) => {\n this.filterPipeline?.releaseTarget(entry.target);\n });\n this.filterCache.clear();\n }\n\n private evictCache(): void {\n if (!this.filterPipeline) return;\n const maxAge = 120;\n this.filterCache.forEach((entry, key) => {\n if (this.frameId - entry.lastUsedFrame > maxAge) {\n this.filterPipeline?.releaseTarget(entry.target);\n this.filterCache.delete(key);\n }\n });\n }\n\n private supportsLayers(camera: any, objects: Array<{ object: I3DObject }>): boolean {\n if (!camera?.layers || typeof camera.layers.set !== \"function\") return false;\n return objects.some((obj) => this.hasLayers(obj.object));\n }\n\n private hasLayers(object: any): boolean {\n return object?.layers && typeof object.layers.set === \"function\";\n }\n\n private applyLayerMask(\n objects: I3DObject[],\n lights: Array<{ object: I3DObject }>,\n layer: number\n ): Array<{ object: I3DObject; mask: number }> {\n const restoredMap = new Map<I3DObject, number>();\n const apply = (obj: I3DObject, setMode: \"set\" | \"enable\") => {\n const anyObj = obj as any;\n if (!this.hasLayers(anyObj)) return;\n if (!restoredMap.has(obj)) {\n restoredMap.set(obj, anyObj.layers.mask);\n }\n if (setMode === \"set\") {\n anyObj.layers.set(layer);\n } else {\n anyObj.layers.enable(layer);\n }\n };\n\n objects.forEach((obj) => apply(obj, \"set\"));\n lights.forEach((light) => apply(light.object, \"enable\"));\n\n return Array.from(restoredMap.entries()).map(([object, mask]) => ({ object, mask }));\n }\n\n private restoreLayerMask(entries: Array<{ object: I3DObject; mask: number }>): void {\n entries.forEach((entry) => {\n const anyObj = entry.object as any;\n if (this.hasLayers(anyObj)) {\n anyObj.layers.mask = entry.mask;\n }\n });\n }\n\n private setCameraLayer(camera: any, layer: number): number | null {\n if (!camera?.layers || typeof camera.layers.set !== \"function\") return null;\n const prev = camera.layers.mask;\n camera.layers.set(layer);\n return prev;\n }\n\n private restoreCameraLayer(camera: any, mask: number): void {\n if (camera?.layers) {\n camera.layers.mask = mask;\n }\n }\n}\n","import {\r\n I3DEngine,\r\n I3DObject,\r\n I3DMaterial,\r\n I3DGeometry,\r\n I3DQuaternion,\r\n I3DVector3,\r\n I3DEuler,\r\n I3DMatrix4,\r\n I3DBox3,\r\n} from \"./abstractions/I3DEngine\";\r\n\r\nexport class String3DObject {\n public id: string;\n public type: string;\n private _object: I3DObject;\n private _material?: I3DMaterial;\n private _geometry?: I3DGeometry;\n private _texture?: any;\n private _uniforms: Record<string, { value: any }> = {};\r\n private _originalBoundingBox?: I3DBox3 | null;\r\n private _quaternion: I3DQuaternion;\r\n private _originalSize: I3DVector3;\r\n private _bbox: I3DBox3;\r\n public el: any;\r\n private _children: String3DObject[] = [];\n private _flatObjectsCache: I3DObject[] | null = null;\n private _subtreeCache: I3DObject[] | null = null;\n private engine: I3DEngine;\r\n\r\n public get children(): String3DObject[] {\r\n return this._children;\r\n }\r\n\r\n constructor(\n id: string,\n type: string,\n object: I3DObject,\n engine: I3DEngine,\n options: { material?: I3DMaterial; geometry?: I3DGeometry; texture?: any } = {}\n ) {\n this.id = id;\n this.type = type;\n this._object = object;\n this.engine = engine;\n this._material = options.material;\n this._geometry = options.geometry;\n this._texture = options.texture;\n this._quaternion = engine.createQuaternion();\n this._originalSize = engine.createVector3();\n this._bbox = engine.createBox3();\n this.updateBoundingBox();\n }\n\r\n public get object(): I3DObject {\r\n return this._object;\r\n }\r\n\r\n public get material(): I3DMaterial | undefined {\r\n return this._material;\r\n }\r\n\r\n public get originalSize(): I3DVector3 {\r\n return this._originalSize.clone();\r\n }\r\n\r\n public get boundingBox(): I3DBox3 {\r\n return this._bbox.clone();\r\n }\r\n\r\n public addChild(child: String3DObject): void {\n this._children.push(child);\n this.object.add(child.object);\n this.invalidateFlatCache();\n this.invalidateSubtreeCache();\n }\n\r\n public getWorldMatrix(): I3DMatrix4 {\r\n return this._object.matrixWorld.clone();\r\n }\r\n\r\n public getWorldPosition(): I3DVector3 {\r\n return this.engine.createVector3().setFromMatrixPosition(this._object.matrixWorld);\r\n }\r\n\r\n public getOriginalBoundingBox(): I3DBox3 {\r\n if (!this._originalBoundingBox) {\r\n const originalScale = this.object.scale.clone();\r\n this.object.scale.set(1, 1, 1);\r\n this.object.updateMatrixWorld(true);\r\n this._originalBoundingBox = this.engine.computeBoundingBoxRecursively(this.object);\r\n this.object.scale.copy(originalScale);\r\n this.object.updateMatrixWorld(true);\r\n }\r\n return this._originalBoundingBox!.clone();\r\n }\r\n\r\n public syncTransformFromMatrix(matrix: I3DMatrix4): void {\r\n const pos = this.engine.createVector3();\r\n const quat = this.engine.createQuaternion();\r\n const scale = this.engine.createVector3();\r\n matrix.decompose(pos, quat, scale);\r\n this._object.position.copy(pos);\r\n this._object.quaternion.copy(quat);\r\n this._object.scale.copy(scale);\r\n this._object.updateMatrix();\r\n this._object.updateMatrixWorld();\r\n }\r\n\r\n public applyWorldTransform(\r\n position: I3DVector3,\r\n quaternion: I3DQuaternion,\r\n scale: I3DVector3\r\n ): void {\r\n this._object.position.copy(position);\r\n this._object.quaternion.copy(quaternion);\r\n this._object.scale.copy(scale);\r\n this._object.updateMatrix();\r\n this._object.updateMatrixWorld();\r\n }\r\n\r\n public set quaternion(quaternion: I3DQuaternion) {\r\n this._quaternion.copy(quaternion);\r\n this._object.quaternion.copy(this._quaternion);\r\n this._object.updateMatrixWorld();\r\n }\r\n\r\n public set position(position: I3DVector3) {\r\n this._object.position.copy(position);\r\n }\r\n\r\n public set scale(scale: I3DVector3) {\r\n this._object.scale.copy(scale);\r\n }\r\n\r\n public set rotation(euler: I3DEuler) {\r\n this._object.rotation.copy(euler);\r\n }\r\n\r\n public set opacity(value: number) {\r\n const mat = this._object as any;\r\n if (mat.material && \"opacity\" in mat.material) {\r\n mat.material.opacity = value;\r\n }\r\n }\r\n\r\n public set metalness(value: number) {\r\n const mat = this._object as any;\r\n if (mat.material && \"metalness\" in mat.material) {\r\n mat.material.metalness = value;\r\n }\r\n }\r\n\r\n public set roughness(value: number) {\r\n const mat = this._object as any;\r\n if (mat.material && \"roughness\" in mat.material) {\r\n mat.material.roughness = value;\r\n }\r\n }\r\n\r\n public set texture(texture: any) {\n this._texture = texture;\n if ((this._object as any).isMesh && texture?.applyTexture) {\n texture.applyTexture(this._object);\n }\n }\n\n public set material(material: I3DMaterial | undefined) {\n this._material = material;\n }\n\n public set geometry(geometry: I3DGeometry | undefined) {\n this._geometry = geometry;\n }\n\n public updateBoundingBox(): void {\n this._bbox.setFromObject(this._object);\n this._bbox.getSize(this._originalSize);\n }\n\n public destroy(): void {\n this.disposeObjectResources(this._object);\n this._texture?.dispose?.();\n this._material?.dispose();\n this._geometry?.dispose();\n this._subtreeCache = null;\n }\n\n public getFlatObjects(): I3DObject[] {\n if (this._flatObjectsCache) return this._flatObjectsCache;\n const result: I3DObject[] = [];\n const walk = (obj: String3DObject): void => {\n result.push(obj.object);\n obj.children.forEach((child) => walk(child));\n };\n walk(this);\n this._flatObjectsCache = result;\n return result;\n }\n\n public getSubtreeObjects(): I3DObject[] {\n if (this._subtreeCache) return this._subtreeCache;\n const result: I3DObject[] = [];\n const anyObj = this._object as any;\n result.push(this._object);\n if (typeof anyObj.traverse === \"function\") {\n anyObj.traverse((child: any) => {\n if (child && child !== this._object) {\n result.push(child as I3DObject);\n }\n });\n }\n this._subtreeCache = result;\n return result;\n }\n\n private invalidateFlatCache(): void {\n this._flatObjectsCache = null;\n }\n\n private invalidateSubtreeCache(): void {\n this._subtreeCache = null;\n }\n\n private disposeObjectResources(object: I3DObject): void {\n const anyObj = object as any;\n if (anyObj?.geometry?.dispose) {\n anyObj.geometry.dispose();\n }\n const material = anyObj?.material;\n if (Array.isArray(material)) {\n material.forEach((mat) => mat?.dispose?.());\n } else if (material?.dispose) {\n material.dispose();\n }\n if (typeof anyObj?.traverse === \"function\") {\n anyObj.traverse((child: any) => {\n if (child?.geometry?.dispose) {\n child.geometry.dispose();\n }\n const childMat = child?.material;\n if (Array.isArray(childMat)) {\n childMat.forEach((mat: any) => mat?.dispose?.());\n } else if (childMat?.dispose) {\n childMat.dispose();\n }\n });\n }\n }\n}\n","import {\n I3DEngine,\n I3DScene,\n I3DLight,\n I3DMaterial,\n I3DModelLoader,\n I3DVector3,\n} from \"./abstractions/I3DEngine\";\nimport { String3DObject } from \"./String3DObject\";\nimport { StringObject } from \"@fiddle-digital/string-tune\";\n\nexport interface String3DSceneOptions {\n modelLoader?: I3DModelLoader;\n modelLoaderFactory?: (engine: I3DEngine, type?: string) => I3DModelLoader;\n}\n\nexport class String3DScene {\n private _scene: I3DScene;\n private _objects: Map<string, String3DObject> = new Map();\n private _rootObjects: String3DObject[] = [];\n private _elementMap: Map<string, HTMLElement> = new Map();\n private engine: I3DEngine;\n private _modelLoader?: I3DModelLoader;\n private _modelLoaderFactory?: (engine: I3DEngine, type?: string) => I3DModelLoader;\n private _modelLoaderCache: Map<string, I3DModelLoader> = new Map();\n\n public get rootObjects(): String3DObject[] {\n return this._rootObjects;\n }\n\n constructor(engine: I3DEngine, options: String3DSceneOptions = {}) {\n this.engine = engine;\n this._modelLoader = options.modelLoader;\n this._modelLoaderFactory = options.modelLoaderFactory;\n this._scene = engine.createScene();\n }\n\n public getScene(): I3DScene {\n return this._scene;\n }\n\n public getObject(id: string): String3DObject | undefined {\n return this._objects.get(id);\n }\n\n public getAllObjects(): String3DObject[] {\n const result: String3DObject[] = [];\n const walk = (obj: String3DObject): void => {\n result.push(obj);\n obj.children.forEach((child) => walk(child));\n };\n this._rootObjects.forEach((obj) => walk(obj));\n return result;\n }\n\n public hasObject(id: string): boolean {\n return this._objects.has(id);\n }\n\n public deleteObject(id: string): boolean {\n const obj = this._objects.get(id);\n if (obj) {\n this._scene.remove(obj.object);\n this._objects.delete(id);\n obj.destroy();\n return true;\n }\n return false;\n }\n\n public createFromElement(object: StringObject): void {\n const type = object.getProperty<string>(\"3d\");\n if (!type) return;\n\n const element = object.htmlElement;\n if (!element) return;\n\n const onAdd = (added3DObject: String3DObject) => {\n if (added3DObject) {\n const parentId = object.getProperty<string>(\"parentId\");\n if (parentId == null) {\n this._scene.add(added3DObject.object);\n this._rootObjects.push(added3DObject);\n } else {\n this._objects.get(parentId)?.addChild(added3DObject);\n }\n this._objects.set(object.id, added3DObject);\n this._elementMap.set(object.id, element);\n added3DObject.el = element;\n }\n };\n\n switch (type) {\n case \"group\":\n this.createGroup(object, onAdd);\n break;\n case \"pointLight\":\n this.createLight(object, \"point\", onAdd);\n break;\n case \"ambientLight\":\n this.createLight(object, \"ambient\", onAdd);\n break;\n case \"directionalLight\":\n this.createLight(object, \"directional\", onAdd);\n break;\n case \"spotLight\":\n this.createLight(object, \"spot\", onAdd);\n break;\n case \"hemisphereLight\":\n this.createLight(object, \"hemisphere\", onAdd);\n break;\n case \"model\":\n this.createModel(object, onAdd);\n break;\n case \"box\":\n this.createBox(object, onAdd);\n break;\n case \"sphere\":\n this.createSphere(object, onAdd);\n break;\n case \"plane\":\n this.createPlane(object, onAdd);\n break;\n case \"cylinder\":\n this.createCylinder(object, onAdd);\n break;\n }\n }\n\n private createGroup(object: StringObject, onAdd: (obj: String3DObject) => void): String3DObject {\n const group = this.engine.createGroup();\n const obj = new String3DObject(object.id, \"group\", group, this.engine);\n onAdd(obj);\n return obj;\n }\n\n private createLight(\n object: StringObject,\n kind: \"point\" | \"ambient\" | \"directional\" | \"spot\" | \"hemisphere\",\n onAdd: (obj: String3DObject) => void\n ): String3DObject {\n const color = object.getProperty<string>(\"3d-color\") || \"#ffffff\";\n const intensity = object.getProperty<number>(\"3d-intensity\") ?? 1;\n\n let light: I3DLight;\n if (kind === \"point\") {\n const distance = object.getProperty<number>(\"3d-distance\") ?? 1000;\n const decay = object.getProperty<number>(\"3d-decay\") ?? 0;\n light = this.engine.createPointLight(color, intensity, distance, decay);\n } else if (kind === \"directional\") {\n light = this.engine.createDirectionalLight(color, intensity);\n } else if (kind === \"spot\") {\n const distance = object.getProperty<number>(\"3d-distance\") ?? 0;\n const angle = object.getProperty<number>(\"3d-angle\") ?? Math.PI / 3;\n const penumbra = object.getProperty<number>(\"3d-penumbra\") ?? 0;\n const decay = object.getProperty<number>(\"3d-decay\") ?? 1;\n light = this.engine.createSpotLight(color, intensity, distance, angle, penumbra, decay);\n } else if (kind === \"hemisphere\") {\n const groundColor = object.getProperty<string>(\"3d-ground-color\") || \"#ffffff\";\n light = this.engine.createHemisphereLight(color, groundColor, intensity);\n } else {\n light = this.engine.createAmbientLight(color, intensity);\n }\n\n const castShadow = object.getProperty<boolean>(\"3d-cast-shadow\") ?? false;\n if (castShadow && light.shadow) {\n light.castShadow = true;\n const bias = object.getProperty<number>(\"3d-shadow-bias\") ?? 0;\n const mapSize = object.getProperty<number>(\"3d-shadow-map-size\") ?? 512;\n light.shadow.bias = bias;\n light.shadow.mapSize.width = mapSize;\n light.shadow.mapSize.height = mapSize;\n }\n\n const obj = new String3DObject(object.id, kind + \"Light\", light, this.engine);\n onAdd(obj);\n return obj;\n }\n\n private applyShadowProps(object: StringObject, mesh: any): void {\n const castShadow = object.getProperty<boolean>(\"3d-cast-shadow\") ?? false;\n const receiveShadow = object.getProperty<boolean>(\"3d-receive-shadow\") ?? false;\n mesh.castShadow = castShadow;\n mesh.receiveShadow = receiveShadow;\n }\n\n private createBox(object: StringObject, onAdd: (obj: String3DObject) => void): String3DObject {\n const geometry = this.engine.createBoxGeometry(1, 1, 1);\n const material = this.createMaterialFromObject(object);\n const mesh = this.engine.createMesh(geometry, material);\n this.applyShadowProps(object, mesh);\n const obj = new String3DObject(object.id, \"box\", mesh, this.engine, {\n geometry,\n material,\n });\n onAdd(obj);\n return obj;\n }\n\n private createSphere(object: StringObject, onAdd: (obj: String3DObject) => void): String3DObject {\n const widthSegments = object.getProperty<number>(\"3d-segments-width\") ?? 32;\n const heightSegments = object.getProperty<number>(\"3d-segments-height\") ?? 32;\n const geometry = this.engine.createSphereGeometry(0.5, widthSegments, heightSegments);\n const material = this.createMaterialFromObject(object);\n const mesh = this.engine.createMesh(geometry, material);\n this.applyShadowProps(object, mesh);\n const obj = new String3DObject(object.id, \"sphere\", mesh, this.engine, {\n geometry,\n material,\n });\n onAdd(obj);\n return obj;\n }\n\n private createPlane(object: StringObject, onAdd: (obj: String3DObject) => void): String3DObject {\n const geometry = this.engine.createPlaneGeometry(1, 1);\n const material = this.createMaterialFromObject(object);\n const mesh = this.engine.createMesh(geometry, material);\n this.applyShadowProps(object, mesh);\n const obj = new String3DObject(object.id, \"plane\", mesh, this.engine, {\n geometry,\n material,\n });\n onAdd(obj);\n return obj;\n }\n\n private createCylinder(\n object: StringObject,\n onAdd: (obj: String3DObject) => void\n ): String3DObject {\n const segments = object.getProperty<number>(\"3d-segments\") ?? 32;\n const geometry = this.engine.createCylinderGeometry(0.5, 0.5, 1, segments);\n const material = this.createMaterialFromObject(object);\n const mesh = this.engine.createMesh(geometry, material);\n this.applyShadowProps(object, mesh);\n const obj = new String3DObject(object.id, \"cylinder\", mesh, this.engine, {\n geometry,\n material,\n });\n onAdd(obj);\n return obj;\n }\n\n private createModel(object: StringObject, onAdd: (obj: String3DObject) => void): void {\n const modelPath = object.getProperty<string>(\"3d-model\");\n if (!modelPath) return;\n\n const loaderType = object.getProperty<string>(\"3d-model-loader\") || undefined;\n const loader = this.resolveModelLoader(loaderType);\n if (!loader) {\n console.warn(\"[String3D] Model loader not configured\");\n return;\n }\n\n const element = object.htmlElement;\n if (element) {\n this.applyModelTextureRemap(loader, element);\n }\n const shouldCenter = object.getProperty<boolean>(\"3d-model-center\") ?? false;\n\n loader.load(\n modelPath,\n (gltf: any) => {\n const root = gltf?.scene || gltf?.object || gltf;\n if (!root) {\n console.warn(\"[String3D] Model loader returned empty result\");\n return;\n }\n\n const overrideMaterial =\n element && this.shouldOverrideModelMaterial(element)\n ? this.createMaterialFromElement(element, object)\n : null;\n\n if (typeof root.traverse === \"function\") {\n root.traverse((child: any) => {\n if (child.isMesh) {\n if (overrideMaterial) {\n child.material = overrideMaterial;\n }\n this.applyShadowProps(object, child);\n }\n });\n }\n\n if (shouldCenter) {\n this.centerObject(root);\n }\n const obj = new String3DObject(object.id, \"model\", root, this.engine);\n onAdd(obj);\n },\n (xhr: any) => {\n console.log((xhr.loaded / xhr.total) * 100 + \"% loaded\");\n },\n (error: any) => {\n console.error(\"[String3D] Model loading error:\", error);\n }\n );\n }\n\n private resolveModelLoader(type?: string): I3DModelLoader | undefined {\n if (type) {\n if (this._modelLoaderCache.has(type)) {\n return this._modelLoaderCache.get(type);\n }\n if (!this._modelLoaderFactory) {\n console.warn(`[String3D] No model loader factory for type \"${type}\"`);\n return undefined;\n }\n const loader = this._modelLoaderFactory(this.engine, type);\n this._modelLoaderCache.set(type, loader);\n return loader;\n }\n\n if (this._modelLoader) {\n return this._modelLoader;\n }\n\n if (this._modelLoaderFactory) {\n return this._modelLoaderFactory(this.engine);\n }\n\n return undefined;\n }\n\n private centerObject(object: any): void {\n if (!object) return;\n const bbox = this.engine.computeBoundingBoxRecursively(object);\n const center = this.getBoxCenter(bbox);\n if (object.position?.set) {\n object.position.set(-center.x, -center.y, -center.z);\n }\n object.updateMatrixWorld(true);\n }\n\n private getBoxCenter(box: any): I3DVector3 {\n const center = this.engine.createVector3();\n center.x = (box.min.x + box.max.x) / 2;\n center.y = (box.min.y + box.max.y) / 2;\n center.z = (box.min.z + box.max.z) / 2;\n return center;\n }\n\n private createMaterialFromObject(object: StringObject): I3DMaterial {\n return this.createMaterialFromElement(object.htmlElement, object);\n }\n\n private createMaterialFromElement(\n element: HTMLElement | null,\n object?: StringObject\n ): I3DMaterial {\n const attr = object?.getProperty<string>(\"3d-material\") || \"basic[#ffffff]\";\n let [type, colorRaw] = attr.split(/\\[|\\]/);\n const color = colorRaw || \"#ffffff\";\n const opacity = object?.getProperty<number>(\"3d-opacity\") ?? 1;\n const metalness = object?.getProperty<number>(\"3d-metalness\");\n const roughness = object?.getProperty<number>(\"3d-roughness\");\n const params: any = {\n color,\n transparent: opacity < 1,\n opacity: opacity,\n };\n\n const mapSrc = element?.getAttribute(\"string-3d-map\");\n const normalMapSrc = element?.getAttribute(\"string-3d-normalMap\");\n const roughnessMapSrc = element?.getAttribute(\"string-3d-roughnessMap\");\n const metalnessMapSrc = element?.getAttribute(\"string-3d-metalnessMap\");\n const aoMapSrc = element?.getAttribute(\"string-3d-aoMap\");\n const flipY = this.parseFlipY(object, element);\n const colorSpace =\n object?.getProperty<string>(\"3d-colorSpace\") ||\n element?.getAttribute(\"string-3d-colorSpace\") ||\n \"\";\n\n const hasMaps = !!(mapSrc || normalMapSrc || roughnessMapSrc || metalnessMapSrc || aoMapSrc);\n if (type !== \"standard\" && hasMaps) {\n type = \"standard\";\n }\n\n if (type === \"standard\") {\n if (mapSrc) {\n params.map = this.loadTexture(mapSrc, { flipY, colorSpace });\n }\n if (normalMapSrc) params.normalMap = this.loadTexture(normalMapSrc, { flipY });\n if (roughnessMapSrc) params.roughnessMap = this.loadTexture(roughnessMapSrc, { flipY });\n if (metalnessMapSrc) params.metalnessMap = this.loadTexture(metalnessMapSrc, { flipY });\n if (aoMapSrc) params.aoMap = this.loadTexture(aoMapSrc, { flipY });\n if (typeof metalness === \"number\") params.metalness = metalness;\n if (typeof roughness === \"number\") params.roughness = roughness;\n return this.engine.createMeshStandardMaterial(params);\n }\n\n return this.engine.createMeshBasicMaterial(params);\n }\n\n private loadTexture(src: string, options: { flipY?: boolean; colorSpace?: string } = {}): any {\n const textureLoader = this.engine.createTextureLoader();\n const texture = textureLoader.load(src);\n if (typeof options.flipY === \"boolean\") {\n texture.flipY = options.flipY;\n }\n const colorSpace = (options.colorSpace || \"\").toLowerCase().trim();\n if (colorSpace && \"colorSpace\" in texture) {\n texture.colorSpace = colorSpace === \"srgb\" ? \"srgb\" : \"linear\";\n }\n texture.needsUpdate = true;\n return texture;\n }\n\n private parseFlipY(object?: StringObject, element?: HTMLElement | null): boolean | undefined {\n const value =\n object?.getProperty<boolean>(\"3d-texture-flipY\") ??\n element?.getAttribute(\"string-3d-texture-flipY\");\n if (value === undefined || value === null || value === \"\") return undefined;\n if (typeof value === \"boolean\") return value;\n const normalized = String(value).toLowerCase().trim();\n if (normalized === \"false\" || normalized === \"0\" || normalized === \"no\") return false;\n if (normalized === \"true\" || normalized === \"1\" || normalized === \"yes\") return true;\n return undefined;\n }\n\n private shouldOverrideModelMaterial(element: HTMLElement): boolean {\n const attrs = [\n \"string-3d-material\",\n \"string-3d-color\",\n \"string-3d-opacity\",\n \"string-3d-map\",\n \"string-3d-normalMap\",\n \"string-3d-roughnessMap\",\n \"string-3d-metalnessMap\",\n \"string-3d-aoMap\",\n \"string-3d-metalness\",\n \"string-3d-roughness\",\n ];\n return attrs.some((attr) => element.hasAttribute(attr));\n }\n\n private applyModelTextureRemap(loader: any, element: HTMLElement): void {\n const baseRaw = (element.getAttribute(\"string-3d-model-texture-base\") || \"\").trim();\n const base = baseRaw ? baseRaw.replace(/\\/?$/, \"/\") : \"\";\n const mappingRaw = element.getAttribute(\"string-3d-model-textures\");\n let mapping: Record<string, string> | null = null;\n\n if (mappingRaw) {\n try {\n mapping = JSON.parse(mappingRaw);\n } catch (error) {\n console.warn(\"[String3D] Invalid model texture mapping JSON:\", error);\n }\n }\n\n const manager = loader?.manager;\n if (!manager || typeof manager.setURLModifier !== \"function\") {\n if (mapping || base) {\n console.warn(\"[String3D] Model loader does not support URL remap.\");\n }\n return;\n }\n\n manager.setURLModifier((url: string) => {\n const mapped = mapping && url in mapping ? mapping[url] : url;\n if (!base) return mapped;\n if (/^(blob:|data:|https?:|file:|\\/)/i.test(mapped)) return mapped;\n return base + mapped.replace(/^\\.?\\//, \"\");\n });\n }\n\n public destroy(): void {\n this._objects.forEach((obj) => obj.destroy());\n this._objects.clear();\n this._rootObjects = [];\n }\n}\n","import { String3DObject } from \"../String3DObject\";\nimport type { String3DObjectSyncStrategy } from \"./String3DObjectSyncStrategy\";\nimport type { SyncContext } from \"./SyncContext\";\n\ntype StyleMap = {\n get?: (prop: string) => any;\n};\n\nexport class GroupSynchronizer implements String3DObjectSyncStrategy {\n sync(el: HTMLElement, object: String3DObject, ctx: SyncContext, parentData: any): any {\n const rect = el.getBoundingClientRect();\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n const styleMap = (el as any).computedStyleMap?.() as StyleMap | undefined;\n let style: CSSStyleDeclaration | null = null;\n const getStyle = () => {\n if (!style) style = getComputedStyle(el);\n return style;\n };\n\n const readNumberStyle = (prop: string, fallback: number): number => {\n const mapValue = styleMap?.get?.(prop);\n if (mapValue !== undefined) {\n if (typeof mapValue === \"number\") return mapValue;\n if (typeof mapValue === \"string\") {\n const parsed = Number.parseFloat(mapValue);\n if (!Number.isNaN(parsed)) return parsed;\n }\n if (mapValue && typeof mapValue === \"object\") {\n const value = (mapValue as any).value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n }\n\n const raw = getStyle().getPropertyValue(prop);\n const parsed = Number.parseFloat(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n };\n\n const translateZ = readNumberStyle(\"--translate-z\", 0);\n const position = ctx.camera.screenToWorld(centerX, centerY, translateZ);\n object.position = position;\n\n const scale = readNumberStyle(\"--scale\", 1);\n object.scale = ctx.engine.createVector3(scale, scale, scale);\n\n const rotateX = -ctx.engine.degToRad(readNumberStyle(\"--rotate-x\", 0));\n const rotateY = ctx.engine.degToRad(readNumberStyle(\"--rotate-y\", 0));\n const rotateZ = -ctx.engine.degToRad(readNumberStyle(\"--rotate-z\", 0));\n object.rotation = ctx.engine.createEuler(rotateX, rotateY, rotateZ, \"XYZ\");\n\r\n object.object.updateMatrixWorld(true);\r\n\r\n return { scale };\r\n }\r\n}\r\n","import { String3DObject } from \"../String3DObject\";\r\nimport type { String3DObjectSyncStrategy } from \"./String3DObjectSyncStrategy\";\r\nimport type { SyncContext } from \"./SyncContext\";\r\nimport { I3DLight } from \"../abstractions/I3DEngine\";\r\n\r\nexport class LightSynchronizer implements String3DObjectSyncStrategy {\r\n sync(el: HTMLElement, object: String3DObject, ctx: SyncContext, parentData: any): any {\r\n const rect = el.getBoundingClientRect();\r\n const centerX = rect.left + rect.width / 2;\r\n const centerY = rect.top + rect.height / 2;\r\n\r\n const translateZ = parseFloat(getComputedStyle(el).getPropertyValue(\"--translate-z\") || \"0\");\r\n const position = ctx.camera.screenToWorld(centerX, centerY, translateZ);\r\n object.position = position;\r\n\r\n const light = object.object as I3DLight;\r\n\r\n // Color\r\n const color = el.getAttribute(\"string-3d-color\");\r\n if (color && light.color && typeof light.color.set === \"function\") {\r\n light.color.set(color);\r\n }\r\n\r\n // Intensity\r\n const intensity = el.getAttribute(\"string-3d-intensity\");\r\n if (intensity) {\r\n light.intensity = parseFloat(intensity);\r\n }\r\n\r\n // Distance & Decay\r\n const distance = el.getAttribute(\"string-3d-distance\");\r\n if (distance && typeof light.distance !== \"undefined\") {\r\n light.distance = parseFloat(distance);\r\n }\r\n const decay = el.getAttribute(\"string-3d-decay\");\r\n if (decay && typeof light.decay !== \"undefined\") {\r\n light.decay = parseFloat(decay);\r\n }\r\n\r\n // SpotLight specific\r\n const angle = el.getAttribute(\"string-3d-angle\");\r\n if (angle && typeof light.angle !== \"undefined\") {\r\n light.angle = parseFloat(angle);\r\n }\r\n const penumbra = el.getAttribute(\"string-3d-penumbra\");\r\n if (penumbra && typeof light.penumbra !== \"undefined\") {\r\n light.penumbra = parseFloat(penumbra);\r\n }\r\n\r\n // Hemisphere specific\r\n const groundColor = el.getAttribute(\"string-3d-ground-color\");\r\n if (\r\n groundColor &&\r\n (light as any).groundColor &&\r\n typeof (light as any).groundColor.set === \"function\"\r\n ) {\r\n (light as any).groundColor.set(groundColor);\r\n }\r\n\r\n // Shadows\r\n const castShadow = el.getAttribute(\"string-3d-cast-shadow\") === \"true\";\r\n if (light.castShadow !== castShadow) {\r\n light.castShadow = castShadow;\r\n }\r\n if (castShadow && light.shadow) {\r\n const bias = el.getAttribute(\"string-3d-shadow-bias\");\r\n if (bias) light.shadow.bias = parseFloat(bias);\r\n\r\n const mapSize = el.getAttribute(\"string-3d-shadow-map-size\");\r\n if (mapSize) {\r\n const size = parseFloat(mapSize);\r\n if (light.shadow.mapSize.width !== size) {\r\n light.shadow.mapSize.width = size;\r\n light.shadow.mapSize.height = size;\r\n }\r\n }\r\n }\r\n\r\n // Target (Directional, Spot)\r\n const targetId = el.getAttribute(\"string-3d-target\");\r\n if (targetId && light.target) {\r\n const targetEl = document.querySelector(`[string-id=\"${targetId}\"]`);\r\n if (targetEl) {\r\n const tRect = targetEl.getBoundingClientRect();\r\n const tCenterX = tRect.left + tRect.width / 2;\r\n const tCenterY = tRect.top + tRect.height / 2;\r\n const tTranslateZ = parseFloat(\r\n getComputedStyle(targetEl).getPropertyValue(\"--translate-z\") || \"0\"\r\n );\r\n const tPos = ctx.camera.screenToWorld(tCenterX, tCenterY, tTranslateZ);\r\n\r\n light.target.position.copy(tPos);\r\n light.target.updateMatrixWorld(true);\r\n }\r\n }\r\n\r\n return null;\r\n }\r\n}\r\n","import { String3DObject } from \"../String3DObject\";\nimport type { SyncContext } from \"./SyncContext\";\nimport type { String3DObjectSyncStrategy } from \"./String3DObjectSyncStrategy\";\n\ntype StyleMap = {\n get?: (prop: string) => any;\n};\n\nexport class MeshSynchronizer implements String3DObjectSyncStrategy {\n static applyVisualProps(el: HTMLElement, object: String3DObject, opacityValue?: number): void {\n const castShadow = el.getAttribute(\"string-3d-cast-shadow\") === \"true\";\n const receiveShadow = el.getAttribute(\"string-3d-receive-shadow\") === \"true\";\n\n const opacity = typeof opacityValue === \"number\" ? opacityValue : NaN;\n\n if (object.object.traverse) {\n object.object.traverse((child: any) => {\n if (child.isMesh) {\n if (child.castShadow !== castShadow) child.castShadow = castShadow;\n if (child.receiveShadow !== receiveShadow) child.receiveShadow = receiveShadow;\n\n if (!isNaN(opacity)) {\n const materials = Array.isArray(child.material) ? child.material : [child.material];\n materials.forEach((mat: any) => {\n if (mat) {\n mat.opacity = opacity;\n mat.transparent = opacity < 1;\n }\n });\n }\n }\n });\n } else if ((object.object as any).isMesh) {\n const mesh = object.object as any;\n if (mesh.castShadow !== castShadow) mesh.castShadow = castShadow;\n if (mesh.receiveShadow !== receiveShadow) mesh.receiveShadow = receiveShadow;\n\n if (!isNaN(opacity)) {\n const materials = Array.isArray(mesh.material) ? mesh.material : [mesh.material];\n materials.forEach((mat: any) => {\n if (mat) {\n mat.opacity = opacity;\n mat.transparent = opacity < 1;\n }\n });\n }\n }\n }\n\n sync(el: HTMLElement, object: String3DObject, ctx: SyncContext, parentData: any): any {\n const styleMap = (el as any).computedStyleMap?.() as StyleMap | undefined;\n let style: CSSStyleDeclaration | null = null;\n const getStyle = () => {\n if (!style) style = getComputedStyle(el);\n return style;\n };\n\n const rect = el.getBoundingClientRect();\n const originalWidth = el.offsetWidth || rect.width;\n const originalHeight = el.offsetHeight || rect.height;\n\n const readNumberStyle = (prop: string, fallback: number): number => {\n const mapValue = styleMap?.get?.(prop);\n if (mapValue !== undefined) {\n if (typeof mapValue === \"number\") return mapValue;\n if (typeof mapValue === \"string\") {\n const parsed = Number.parseFloat(mapValue);\n if (!Number.isNaN(parsed)) return parsed;\n }\n if (mapValue && typeof mapValue === \"object\") {\n const value = (mapValue as any).value;\n if (typeof value === \"number\") return value;\n if (typeof value === \"string\") {\n const parsed = Number.parseFloat(value);\n if (!Number.isNaN(parsed)) return parsed;\n }\n }\n }\n\n const raw = getStyle().getPropertyValue(prop);\n const parsed = Number.parseFloat(raw);\n return Number.isNaN(parsed) ? fallback : parsed;\n };\n\n const translateZ = readNumberStyle(\"--translate-z\", 0);\n const cssScale = readNumberStyle(\"--scale\", 1);\n\n const centerX = rect.left + rect.width / 2;\n const centerY = rect.top + rect.height / 2;\n\n const worldPos = ctx.camera.screenToWorld(centerX, centerY, translateZ);\n object.position = worldPos;\n\n const rotateX = -ctx.engine.degToRad(readNumberStyle(\"--rotate-x\", 0));\n const rotateY = ctx.engine.degToRad(readNumberStyle(\"--rotate-y\", 0));\n const rotateZ = -ctx.engine.degToRad(readNumberStyle(\"--rotate-z\", 0));\n object.rotation = ctx.engine.createEuler(rotateX, rotateY, rotateZ, \"XYZ\");\n\n const targetWidth = originalWidth * cssScale;\n const targetHeight = originalHeight * cssScale;\n const cssScaleZ = readNumberStyle(\"--scale-z\", 1);\n const parentScale = parentData?.scale || 1;\n\n const objectType = object.type;\n let scaleX: number, scaleY: number, scaleZ: number;\n\n switch (objectType) {\n case \"box\":\n case \"sphere\": {\n const uniformSize = Math.min(targetWidth, targetHeight);\n scaleX = uniformSize * parentScale;\n scaleY = uniformSize * parentScale;\n scaleZ = uniformSize * cssScaleZ * parentScale;\n break;\n }\n case \"model\": {\n const bbox = object.getOriginalBoundingBox();\n const size = bbox.getSize(ctx.engine.createVector3());\n const fitMode = (el.getAttribute(\"string-3d-model-fit\") || \"contain\").toLowerCase().trim();\n const modelScaleAttr = parseFloat(el.getAttribute(\"string-3d-model-scale\") || \"1\");\n const modelScale = Number.isFinite(modelScaleAttr) ? modelScaleAttr : 1;\n\n if (size.x > 0 && size.y > 0) {\n const scaleToWidth = targetWidth / size.x;\n const scaleToHeight = targetHeight / size.y;\n const uniformScale =\n fitMode === \"cover\"\n ? Math.max(scaleToWidth, scaleToHeight)\n : Math.min(scaleToWidth, scaleToHeight);\n\n scaleX = uniformScale * modelScale * parentScale;\n scaleY = uniformScale * modelScale * parentScale;\n scaleZ = uniformScale * modelScale * cssScaleZ * parentScale;\n } else {\n const fallbackSize = Math.min(targetWidth, targetHeight);\n scaleX = fallbackSize * modelScale * parentScale;\n scaleY = fallbackSize * modelScale * parentScale;\n scaleZ = fallbackSize * modelScale * cssScaleZ * parentScale;\n }\n break;\n }\n case \"cylinder\": {\n const cylRadius = targetWidth;\n scaleX = cylRadius * parentScale;\n scaleY = targetHeight * parentScale;\n scaleZ = cylRadius * cssScaleZ * parentScale;\n break;\n }\n case \"plane\":\n default:\n scaleX = targetWidth * parentScale;\n scaleY = targetHeight * parentScale;\n scaleZ = Math.min(targetWidth, targetHeight) * 0.5 * cssScaleZ * parentScale;\n break;\n }\n\n object.scale = ctx.engine.createVector3(scaleX, scaleY, scaleZ);\n\n const opacity = readNumberStyle(\"--opacity\", NaN);\n MeshSynchronizer.applyVisualProps(el, object, opacity);\n\n return { scale: cssScale * parentScale };\n }\n}\n","import { String3DCamera } from \"../String3DCamera\";\r\nimport { String3DObject } from \"../String3DObject\";\r\nimport { I3DEngine } from \"../abstractions/I3DEngine\";\r\nimport { GroupSynchronizer } from \"./GroupSynchronizer\";\r\nimport { LightSynchronizer } from \"./LightSynchronizer\";\r\nimport { MeshSynchronizer } from \"./MeshSynchronizer\";\r\nimport type { String3DObjectSyncStrategy } from \"./String3DObjectSyncStrategy\";\r\n\r\nexport class String3DSynchronizer {\r\n private strategies: Map<string, String3DObjectSyncStrategy> = new Map();\r\n\r\n constructor(\r\n public camera: String3DCamera,\r\n public viewportWidth: number,\r\n public viewportHeight: number,\r\n public engine: I3DEngine\r\n ) {\r\n this.strategies.set(\"box\", new MeshSynchronizer());\r\n this.strategies.set(\"sphere\", new MeshSynchronizer());\r\n this.strategies.set(\"plane\", new MeshSynchronizer());\r\n this.strategies.set(\"cylinder\", new MeshSynchronizer());\r\n this.strategies.set(\"model\", new MeshSynchronizer());\r\n this.strategies.set(\"group\", new GroupSynchronizer());\r\n this.strategies.set(\"pointLight\", new LightSynchronizer());\r\n this.strategies.set(\"ambientLight\", new LightSynchronizer());\r\n this.strategies.set(\"directionalLight\", new LightSynchronizer());\r\n this.strategies.set(\"spotLight\", new LightSynchronizer());\r\n this.strategies.set(\"hemisphereLight\", new LightSynchronizer());\r\n }\r\n\r\n public syncElement(el: HTMLElement, object: String3DObject, parentData: any): any {\r\n const strategy = this.strategies.get(object.type);\r\n if (!strategy) {\r\n console.warn(`[String3D Sync] No strategy for type \"${object.type}\"`);\r\n return null;\r\n }\r\n\r\n return strategy.sync(\r\n el,\r\n object,\r\n {\r\n camera: this.camera,\r\n viewportWidth: this.viewportWidth,\r\n viewportHeight: this.viewportHeight,\r\n engine: this.engine,\r\n },\r\n parentData\r\n );\r\n }\r\n\r\n public updateViewportSize(width: number, height: number): void {\r\n this.viewportWidth = width;\r\n this.viewportHeight = height;\r\n }\r\n}\r\n","export type TransformWorkerInput = {\n id: string;\n type: string;\n rectLeft: number;\n rectTop: number;\n rectWidth: number;\n rectHeight: number;\n translateZ: number;\n scale: number;\n scaleZ: number;\n rotateX: number;\n rotateY: number;\n rotateZ: number;\n parentScale: number;\n modelSizeX?: number;\n modelSizeY?: number;\n modelScale?: number;\n fitMode?: string;\n};\n\nexport type TransformWorkerCamera = {\n mode: \"orthographic\" | \"perspective\";\n width: number;\n height: number;\n cameraZ: number;\n fov: number;\n aspect: number;\n};\n\nexport type TransformWorkerResult = {\n id: string;\n posX: number;\n posY: number;\n posZ: number;\n rotX: number;\n rotY: number;\n rotZ: number;\n scaleX: number;\n scaleY: number;\n scaleZ: number;\n};\n\nexport type TransformWorkerJobResult = {\n frameId: number;\n results: TransformWorkerResult[];\n};\n\nexport type TransformWorkerOptions = {\n wasmUrl?: string;\n};\n\nconst WORKER_SOURCE = `\nlet wasm = null;\nlet wasmReady = false;\n\nfunction degToRad(deg) {\n return (deg * Math.PI) / 180;\n}\n\nfunction computeTransform(item, camera) {\n const centerX = item.rectLeft + item.rectWidth / 2;\n const centerY = item.rectTop + item.rectHeight / 2;\n\n let posX = 0;\n let posY = 0;\n let posZ = item.translateZ;\n\n if (camera.mode === \"orthographic\") {\n posX = centerX - camera.width / 2;\n posY = -(centerY - camera.height / 2);\n } else {\n const fov = degToRad(camera.fov);\n const distance = Math.abs(item.translateZ - camera.cameraZ);\n const height = 2 * Math.tan(fov / 2) * distance;\n const width = height * camera.aspect;\n const normalizedX = centerX / camera.width;\n const normalizedY = centerY / camera.height;\n posX = (normalizedX - 0.5) * width;\n posY = -(normalizedY - 0.5) * height;\n }\n\n const rotX = -degToRad(item.rotateX);\n const rotY = degToRad(item.rotateY);\n const rotZ = -degToRad(item.rotateZ);\n\n let scaleX = 1;\n let scaleY = 1;\n let scaleZ = 1;\n\n if (item.type === \"group\") {\n scaleX = item.scale;\n scaleY = item.scale;\n scaleZ = item.scale;\n } else {\n const targetWidth = item.rectWidth * item.scale;\n const targetHeight = item.rectHeight * item.scale;\n const parentScale = item.parentScale || 1;\n const cssScaleZ = item.scaleZ || 1;\n\n if (item.type === \"box\" || item.type === \"sphere\") {\n const uniformSize = Math.min(targetWidth, targetHeight);\n scaleX = uniformSize * parentScale;\n scaleY = uniformSize * parentScale;\n scaleZ = uniformSize * cssScaleZ * parentScale;\n } else if (item.type === \"model\") {\n const sizeX = item.modelSizeX || 0;\n const sizeY = item.modelSizeY || 0;\n const fitMode = (item.fitMode || \"contain\").toLowerCase().trim();\n const modelScale = Number.isFinite(item.modelScale) ? item.modelScale : 1;\n\n if (sizeX > 0 && sizeY > 0) {\n const scaleToWidth = targetWidth / sizeX;\n const scaleToHeight = targetHeight / sizeY;\n const uniformScale = fitMode === \"cover\"\n ? Math.max(scaleToWidth, scaleToHeight)\n : Math.min(scaleToWidth, scaleToHeight);\n scaleX = uniformScale * modelScale * parentScale;\n scaleY = uniformScale * modelScale * parentScale;\n scaleZ = uniformScale * modelScale * cssScaleZ * parentScale;\n } else {\n const fallbackSize = Math.min(targetWidth, targetHeight);\n scaleX = fallbackSize * modelScale * parentScale;\n scaleY = fallbackSize * modelScale * parentScale;\n scaleZ = fallbackSize * modelScale * cssScaleZ * parentScale;\n }\n } else if (item.type === \"cylinder\") {\n const cylRadius = targetWidth;\n scaleX = cylRadius * parentScale;\n scaleY = targetHeight * parentScale;\n scaleZ = cylRadius * cssScaleZ * parentScale;\n } else {\n scaleX = targetWidth * parentScale;\n scaleY = targetHeight * parentScale;\n scaleZ = Math.min(targetWidth, targetHeight) * 0.5 * cssScaleZ * parentScale;\n }\n }\n\n return {\n id: item.id,\n posX,\n posY,\n posZ,\n rotX,\n rotY,\n rotZ,\n scaleX,\n scaleY,\n scaleZ,\n };\n}\n\nasync function initWasm(url) {\n try {\n const res = await fetch(url);\n const bytes = await res.arrayBuffer();\n const mod = await WebAssembly.instantiate(bytes, {});\n wasm = mod.instance;\n wasmReady = true;\n } catch (error) {\n wasm = null;\n wasmReady = false;\n }\n}\n\nself.onmessage = async (event) => {\n const data = event.data || {};\n if (data.type === \"init\") {\n if (data.wasmUrl) {\n await initWasm(data.wasmUrl);\n }\n self.postMessage({ type: \"ready\", wasmReady });\n return;\n }\n\n if (data.type === \"compute\") {\n const items = data.items || [];\n const camera = data.camera || {};\n const results = new Array(items.length);\n for (let i = 0; i < items.length; i += 1) {\n results[i] = computeTransform(items[i], camera);\n }\n self.postMessage({ type: \"result\", frameId: data.frameId, results });\n }\n};\n`;\n\nexport class TransformWorkerClient {\n private worker: Worker | null = null;\n private ready = false;\n private lastResult: TransformWorkerJobResult | null = null;\n private pending = false;\n\n constructor(options: TransformWorkerOptions = {}) {\n if (typeof Worker === \"undefined\") return;\n const blob = new Blob([WORKER_SOURCE], { type: \"text/javascript\" });\n this.worker = new Worker(URL.createObjectURL(blob));\n this.worker.onmessage = (event) => {\n const data = event.data || {};\n if (data.type === \"ready\") {\n this.ready = true;\n return;\n }\n if (data.type === \"result\") {\n this.lastResult = {\n frameId: typeof data.frameId === \"number\" ? data.frameId : 0,\n results: data.results || [],\n };\n this.pending = false;\n }\n };\n this.worker.postMessage({ type: \"init\", wasmUrl: options.wasmUrl });\n }\n\n public isReady(): boolean {\n return this.ready;\n }\n\n public isPending(): boolean {\n return this.pending;\n }\n\n public submit(\n items: TransformWorkerInput[],\n camera: TransformWorkerCamera,\n frameId: number\n ): void {\n if (!this.worker || !this.ready || this.pending) return;\n this.pending = true;\n this.worker.postMessage({\n type: \"compute\",\n frameId,\n items,\n camera,\n });\n }\n\n public takeLastResult(): TransformWorkerJobResult | null {\n const result = this.lastResult;\n this.lastResult = null;\n return result;\n }\n\n public destroy(): void {\n this.worker?.terminate();\n this.worker = null;\n this.ready = false;\n this.pending = false;\n this.lastResult = null;\n }\n}\n","import {\r\n I3DEngine,\r\n I3DVector3,\r\n I3DVector2,\r\n I3DQuaternion,\r\n I3DEuler,\r\n I3DMatrix4,\r\n I3DBox3,\r\n I3DScene,\r\n I3DRenderer,\r\n I3DPerspectiveCamera,\r\n I3DOrthographicCamera,\r\n I3DObject,\r\n I3DMesh,\r\n I3DGeometry,\r\n I3DMaterial,\n I3DRenderTarget,\n I3DLight,\n I3DTextureLoader,\r\n I3DModelLoader,\r\n} from \"../core/abstractions/I3DEngine\";\r\nimport { I3DEngineProvider } from \"../core/abstractions/I3DEngineProvider\";\r\n\r\nexport class ThreeJSEngine implements I3DEngine {\r\n private THREE: any;\r\n private loaders: Record<string, any>;\r\n\r\n constructor(THREE: any, loaders: Record<string, any> = {}) {\r\n this.THREE = THREE;\r\n this.loaders = loaders;\r\n }\r\n\r\n createVector3(x = 0, y = 0, z = 0): I3DVector3 {\r\n return new this.THREE.Vector3(x, y, z);\r\n }\r\n\r\n createVector2(x = 0, y = 0): I3DVector2 {\r\n return new this.THREE.Vector2(x, y);\r\n }\r\n\r\n createQuaternion(x = 0, y = 0, z = 0, w = 1): I3DQuaternion {\r\n return new this.THREE.Quaternion(x, y, z, w);\r\n }\r\n\r\n createEuler(x = 0, y = 0, z = 0, order = \"XYZ\"): I3DEuler {\r\n return new this.THREE.Euler(x, y, z, order);\r\n }\r\n\r\n createMatrix4(): I3DMatrix4 {\r\n return new this.THREE.Matrix4();\r\n }\r\n\r\n createBox3(min?: I3DVector3, max?: I3DVector3): I3DBox3 {\r\n return new this.THREE.Box3(min, max);\r\n }\r\n\r\n createScene(): I3DScene {\r\n return new this.THREE.Scene();\r\n }\r\n\r\n createRenderer(options?: {\r\n antialias?: boolean;\r\n alpha?: boolean;\r\n logarithmicDepthBuffer?: boolean;\r\n }): I3DRenderer {\r\n const renderer = new this.THREE.WebGLRenderer(options);\r\n renderer.outputEncoding = this.THREE.sRGBEncoding;\r\n return renderer;\r\n }\r\n\r\n createPerspectiveCamera(fov = 45, aspect = 1, near = 0.1, far = 2000): I3DPerspectiveCamera {\r\n return new this.THREE.PerspectiveCamera(fov, aspect, near, far);\r\n }\r\n\r\n createOrthographicCamera(\r\n left: number,\r\n right: number,\r\n top: number,\r\n bottom: number,\r\n near = 0.1,\r\n far = 10000\r\n ): I3DOrthographicCamera {\r\n return new this.THREE.OrthographicCamera(left, right, top, bottom, near, far);\r\n }\r\n\r\n createGroup(): I3DObject {\r\n return new this.THREE.Group();\r\n }\r\n\r\n createMesh(geometry: I3DGeometry, material: I3DMaterial): I3DMesh {\r\n return new this.THREE.Mesh(geometry, material);\r\n }\r\n\r\n createBoxGeometry(width: number, height: number, depth: number): I3DGeometry {\r\n return new this.THREE.BoxGeometry(width, height, depth);\r\n }\r\n\r\n createSphereGeometry(radius: number, widthSegments = 32, heightSegments = 32): I3DGeometry {\r\n return new this.THREE.SphereGeometry(radius, widthSegments, heightSegments);\r\n }\r\n\r\n createPlaneGeometry(width: number, height: number): I3DGeometry {\r\n return new this.THREE.PlaneGeometry(width, height);\r\n }\r\n\r\n createCylinderGeometry(\r\n radiusTop: number,\r\n radiusBottom: number,\r\n height: number,\r\n segments = 32\r\n ): I3DGeometry {\r\n return new this.THREE.CylinderGeometry(radiusTop, radiusBottom, height, segments);\r\n }\r\n\r\n createMeshBasicMaterial(params?: any): I3DMaterial {\r\n return new this.THREE.MeshBasicMaterial(params);\r\n }\r\n\r\n createMeshStandardMaterial(params?: any): I3DMaterial {\n return new this.THREE.MeshStandardMaterial(params);\n }\n\n createShaderMaterial(params?: any): I3DMaterial {\n return new this.THREE.ShaderMaterial(params);\n }\n createPointLight(color?: string | number, intensity = 1, distance = 0, decay = 2): I3DLight {\r\n return new this.THREE.PointLight(color, intensity, distance, decay);\r\n }\r\n\r\n createSpotLight(\r\n color?: string | number,\r\n intensity = 1,\r\n distance = 0,\r\n angle = Math.PI / 3,\r\n penumbra = 0,\r\n decay = 1\r\n ): I3DLight {\r\n return new this.THREE.SpotLight(color, intensity, distance, angle, penumbra, decay);\r\n }\r\n\r\n createHemisphereLight(\r\n skyColor?: string | number,\r\n groundColor?: string | number,\r\n intensity = 1\r\n ): I3DLight {\r\n return new this.THREE.HemisphereLight(skyColor, groundColor, intensity);\r\n }\r\n\r\n createAmbientLight(color?: string | number, intensity = 1): I3DLight {\r\n return new this.THREE.AmbientLight(color, intensity);\r\n }\r\n\r\n createDirectionalLight(color?: string | number, intensity = 1): I3DLight {\r\n return new this.THREE.DirectionalLight(color, intensity);\r\n }\r\n\r\n createTextureLoader(): I3DTextureLoader {\r\n return new this.THREE.TextureLoader();\r\n }\r\n\r\n createModelLoader(type: string): I3DModelLoader {\n const LoaderClass = this.loaders[type];\n if (!LoaderClass) {\n throw new Error(`[ThreeJSEngine] Model loader \"${type}\" not registered`);\n }\n return new LoaderClass();\n }\n\n createRenderTarget(width: number, height: number, options: any = {}): I3DRenderTarget {\n const defaults = {\n minFilter: this.THREE.LinearFilter,\n magFilter: this.THREE.LinearFilter,\n format: this.THREE.RGBAFormat,\n depthBuffer: true,\n stencilBuffer: false,\n };\n return new this.THREE.WebGLRenderTarget(width, height, { ...defaults, ...options });\n }\n\r\n degToRad(degrees: number): number {\r\n return this.THREE.MathUtils.degToRad(degrees);\r\n }\r\n\r\n radToDeg(radians: number): number {\r\n return this.THREE.MathUtils.radToDeg(radians);\r\n }\r\n\r\n computeBoundingBoxRecursively(object: I3DObject): I3DBox3 {\r\n const boundingBox = new this.THREE.Box3();\r\n let hasBox = false;\r\n\r\n if (object.traverse) {\r\n object.traverse((child: any) => {\r\n if (!child.visible) return;\r\n if (child.geometry) {\r\n if (typeof child.geometry.computeBoundingBox === \"function\") {\r\n child.geometry.computeBoundingBox();\r\n }\r\n const box = child.geometry.boundingBox;\r\n if (box) {\r\n const childBox = box.clone().applyMatrix4(child.matrixWorld);\r\n boundingBox.union(childBox);\r\n hasBox = true;\r\n }\r\n }\r\n });\r\n }\r\n\r\n return hasBox ? boundingBox : new this.THREE.Box3();\r\n }\r\n}\r\n\r\nexport class ThreeJSProvider implements I3DEngineProvider {\r\n private engine: ThreeJSEngine;\r\n\r\n constructor(THREE: any, loaders: Record<string, any> = {}) {\r\n this.engine = new ThreeJSEngine(THREE, loaders);\r\n }\r\n\r\n getEngine(): I3DEngine {\r\n return this.engine;\r\n }\r\n\r\n getName(): string {\r\n return \"Three.js\";\r\n }\r\n}\r\n"],"mappings":"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","names":["index_exports","__export","String3D","String3DCamera","String3DCustomFilterRegistry","String3DObject","String3DRenderer","String3DScene","String3DSynchronizer","ThreeJSEngine","ThreeJSProvider","__toCommonJS","import_string_tune","String3DCamera","engine","mode","fov","near","far","width","height","ortho","x","y","z","screenX","screenY","normalizedX","normalizedY","distance","viewportHeight","roundedZ","scale","String3DCustomFilterRegistry","definition","name","RenderTargetPool","create","width","height","target","String3DFilterPipeline","engine","renderer","geometry","w","h","scale","next","input","effects","quality","current","locals","releaseLocal","idx","acquire","effect","radius","first","second","output","intensity","blurRadius","extracted","blur1","blur2","combined","mode","amount","material","uniforms","clear","key","value","base","bloom","object","anyObj","name","type","params","normalized","def","String3DCustomFilterRegistry","String3DRenderer","container","engine","width","height","scene","camera","filterTargets","pipeline","allObjects","visibility","obj","anyObj","filteredSet","target","rendererAny","prevAutoClear","originalVisible","lights","supportsLayers","cache","effects","allowed","restoreLayers","restoreCameraMask","subtree","input","output","entry","existing","String3DFilterPipeline","object","set","child","visible","el","rect","cx","cy","clamp","value","effect","center","changed","next","uniforms","filterCount","now","dt","fps","countScale","targetScale","maxAge","key","objects","layer","restoredMap","apply","setMode","light","mask","entries","prev","String3DObject","id","type","object","engine","options","child","originalScale","matrix","pos","quat","scale","position","quaternion","euler","value","mat","texture","material","geometry","result","walk","obj","anyObj","childMat","String3DScene","engine","options","id","result","walk","obj","child","object","type","element","onAdd","added3DObject","parentId","group","String3DObject","kind","color","intensity","light","distance","decay","angle","penumbra","groundColor","bias","mapSize","mesh","castShadow","receiveShadow","geometry","material","widthSegments","heightSegments","segments","modelPath","loaderType","loader","shouldCenter","gltf","root","overrideMaterial","xhr","error","bbox","center","box","attr","colorRaw","opacity","metalness","roughness","params","mapSrc","normalMapSrc","roughnessMapSrc","metalnessMapSrc","aoMapSrc","flipY","colorSpace","src","texture","value","normalized","baseRaw","base","mappingRaw","mapping","manager","url","mapped","GroupSynchronizer","el","object","ctx","parentData","rect","centerX","centerY","styleMap","style","getStyle","readNumberStyle","prop","fallback","mapValue","parsed","value","raw","translateZ","position","scale","rotateX","rotateY","rotateZ","LightSynchronizer","el","object","ctx","parentData","rect","centerX","centerY","translateZ","position","light","color","intensity","distance","decay","angle","penumbra","groundColor","castShadow","bias","mapSize","size","targetId","targetEl","tRect","tCenterX","tCenterY","tTranslateZ","tPos","MeshSynchronizer","_MeshSynchronizer","el","object","opacityValue","castShadow","receiveShadow","opacity","child","mat","mesh","ctx","parentData","styleMap","style","getStyle","rect","originalWidth","originalHeight","readNumberStyle","prop","fallback","mapValue","parsed","value","raw","translateZ","cssScale","centerX","centerY","worldPos","rotateX","rotateY","rotateZ","targetWidth","targetHeight","cssScaleZ","parentScale","objectType","scaleX","scaleY","scaleZ","uniformSize","size","fitMode","modelScaleAttr","modelScale","scaleToWidth","scaleToHeight","uniformScale","fallbackSize","cylRadius","String3DSynchronizer","camera","viewportWidth","viewportHeight","engine","MeshSynchronizer","GroupSynchronizer","LightSynchronizer","el","object","parentData","strategy","width","height","WORKER_SOURCE","TransformWorkerClient","options","blob","event","data","items","camera","frameId","result","_String3D","context","provider","object","result","globalId","element","attributes","parentElement","parentId","String3DRenderer","String3DCamera","modelLoader","modelLoaderFactory","String3DScene","String3DSynchronizer","TransformWorkerClient","shouldUseDirtySync","shouldUseWorker","key","fallback","error","engine","type","loaderType","existing","container","el","data","workerResults","dirtySet","forceSync","worker","inputs","obj","frameId","filterTargets","parentData","shouldSync","nextParentData","cached","forceChildren","child","style","css","name","initialValue","entries","entry","mutations","mutation","prop","mapValue","parsed","value","raw","styleMap","warnings","effects","parseNumber","match","num","parseRatio","cleaned","parseAngle","stripped","parseBloom","parts","part","intensity","threshold","parseAmount","allowZero","amount","parseRatioAmount","re","args","size","bloom","angle","custom","String3DCustomFilterRegistry","warning","now","shouldReadStyle","current","duration","delay","easing","zero","state","newState","t","canTween","fromChain","targets","walk","chain","dirty","effectsKey","effect","uniforms","properties","durations","delays","timings","index","shorthand","easingRaw","depth","i","ch","normalized","map","tokens","token","lower","p","n","p1x","p1y","p2x","p2y","sampleCurveX","inv","sampleCurveY","solveCurveX","x","x2","d2","solved","from","to","other","keys","otherKeys","elapsed","eased","interpolated","lerp","b","fromValue","rect","layoutWidth","layoutHeight","translateZ","scale","scaleZ","rotateX","rotateY","rotateZ","opacity","MeshSynchronizer","modelSizeX","modelSizeY","modelScale","fitMode","modelScaleAttr","returnScale","results","String3D","ThreeJSEngine","THREE","loaders","x","y","z","w","order","min","max","options","renderer","fov","aspect","near","far","left","right","top","bottom","geometry","material","width","height","depth","radius","widthSegments","heightSegments","radiusTop","radiusBottom","segments","params","color","intensity","distance","decay","angle","penumbra","skyColor","groundColor","type","LoaderClass","defaults","degrees","radians","object","boundingBox","hasBox","child","box","childBox","ThreeJSProvider"]}