@kite3d/engine 0.18.0 → 0.19.0-alpha.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authoring.d.ts +1 -1
- package/dist/authoring.js +7 -7
- package/dist/authoring.js.map +1 -1
- package/dist/authoringValidation.d.ts +2 -5
- package/dist/authoringValidation.js +266 -289
- package/dist/authoringValidation.js.map +1 -1
- package/dist/index.d.ts +0 -2
- package/dist/index.js +1145 -1440
- package/dist/index.js.map +1 -1
- package/dist/projectFormat.js +70 -81
- package/dist/projectFormat.js.map +1 -1
- package/dist/runtime/createGame.d.ts +1 -1
- package/dist/runtime/index.d.ts +0 -2
- package/dist/runtime/projectFormat.d.ts +7 -14
- package/dist/runtime.js +14086 -15497
- package/dist/runtime.js.map +1 -1
- package/dist/sceneSerialization.js +57 -52
- package/dist/sceneSerialization.js.map +1 -1
- package/dist/version.js +1 -1
- package/package.json +4 -4
- package/src/authoring.ts +3 -3
- package/src/authoringValidation.ts +3 -40
- package/src/index.ts +0 -2
- package/src/runtime/createGame.ts +1 -5
- package/src/runtime/index.ts +0 -2
- package/src/runtime/projectFormat.ts +20 -47
- package/src/sceneSerialization.ts +10 -2
- package/dist/generatorParams.d.ts +0 -23
- package/dist/plugins/GeneratorComponent.d.ts +0 -44
- package/src/generatorParams.ts +0 -182
- package/src/plugins/GeneratorComponent.ts +0 -287
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"authoringValidation.js","sources":["../src/authoringValidation.ts"],"sourcesContent":["import {\n Box3,\n EntityComponentPlugin,\n Frustum,\n Matrix4,\n Vector3,\n type IObject3D,\n type ThreeViewer,\n} from 'threepipe'\nimport {\n KITE3D_AUTHORING_METADATA_KEY,\n getAuthoringMetadata,\n getRuntimeObjectMetadata,\n getTrackedRuntimeObjects,\n type AuthoringMetadata,\n type RuntimeMutableProperty,\n} from './authoring.ts'\n\nexport type AuthoringFailureCode =\n | 'NO_VISIBLE_AUTHORED_CONTENT'\n | 'GENERATOR_PREVIEW_MISSING'\n | 'RUNTIME_OBJECT_AFTER_STOP'\n | 'MISSING_AUTHORING_SOURCE'\n | 'RUNTIME_SOURCE_DRIFT'\n | 'CAMERA_NOT_USEFUL'\n | 'CAMERA_CONTAINMENT_UNVERIFIED'\n | 'PERSISTENCE_DRIFT'\n\nexport interface AuthoringValidationIssue {\n code: AuthoringFailureCode\n severity: 'error' | 'warning'\n message: string\n object?: {uuid: string, name: string}\n path?: string\n before?: unknown\n after?: unknown\n}\n\nexport interface AuthoringQualityReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n issues: AuthoringValidationIssue[]\n checks: {\n visibleAuthoredContent: boolean\n selectableAuthoredContent: boolean\n relationshipsValid: boolean\n generatorPreviews: boolean\n cameraUseful: boolean\n }\n metrics: {\n authoredObjectCount: number\n renderableCount: number\n visibleRenderableCount: number\n selectableCount: number\n generatorCount: number\n generatorPreviewCount: number\n cameraFramedRenderableCount: number\n cameraInsideRenderableCount: number\n }\n}\n\nexport interface RuntimeCleanupReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n issues: AuthoringValidationIssue[]\n trackedObjectCount: number\n outsideRenderableCount: number\n}\n\nexport interface SemanticSceneSnapshot {\n schemaVersion: 1\n scene: unknown[]\n}\n\nexport interface PersistenceChange {\n path: string\n before: unknown\n after: unknown\n}\n\nexport interface PersistenceReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n issues: AuthoringValidationIssue[]\n changes: PersistenceChange[]\n beforeBytes: number\n afterBytes: number\n}\n\ntype ViewerLike = Pick<ThreeViewer, 'scene'>\ntype SceneLike = IObject3D & {modelRoot: IObject3D, mainCamera?: IObject3D, defaultCamera?: IObject3D}\nconst CAMERA_BOUNDS_EPSILON = 1e-6\n\ninterface SourceRecord {\n object: IObject3D\n metadata: AuthoringMetadata\n}\n\n/** Validate the stopped authoring hierarchy, its sources, previews, and saved camera. */\nexport function authoringQualityReport(viewer: ViewerLike): AuthoringQualityReport {\n const scene = viewer.scene as SceneLike\n if (!scene?.modelRoot) throw new Error('Authoring validation requires viewer.scene.modelRoot')\n scene.updateMatrixWorld(true)\n\n const issues: AuthoringValidationIssue[] = []\n const sources = collectSources(scene.modelRoot)\n const generators: SourceRecord[] = []\n const previews: SourceRecord[] = []\n const boundedPreviewSourceIds = new Set<string>()\n const visibleBounds: Array<{object: IObject3D, bounds: Box3}> = []\n let authoredObjectCount = 0\n let renderableCount = 0\n let visibleRenderableCount = 0\n let selectableCount = 0\n\n scene.modelRoot.traverse((object) => {\n if (object === scene.modelRoot) return\n authoredObjectCount += 1\n const metadata = getAuthoringMetadata(object)\n if (metadata?.role === 'generator' && !metadata.sourceId) generators.push({object, metadata})\n if (metadata?.role === 'generator' && metadata.sourceId) previews.push({object, metadata})\n if (!isRenderable(object)) return\n renderableCount += 1\n if (!isEffectivelyVisible(object, scene.modelRoot)) return\n visibleRenderableCount += 1\n if (isSelectable(object)) selectableCount += 1\n const bounds = new Box3().setFromObject(object)\n if (!bounds.isEmpty() && finiteVector(bounds.min) && finiteVector(bounds.max)) {\n visibleBounds.push({object, bounds})\n if (metadata?.role === 'generator' && metadata.sourceId) boundedPreviewSourceIds.add(metadata.sourceId)\n }\n })\n\n for (const preview of previews) {\n const source = sources.get(preview.metadata.sourceId || '')\n if (!source || source.metadata.role !== 'generator') {\n pushIssue(issues, {\n code: 'MISSING_AUTHORING_SOURCE',\n severity: 'error',\n message: `Generator output source \"${preview.metadata.sourceId || '(missing)'}\" is not present beneath modelRoot.`,\n object: objectEvidence(preview.object),\n })\n }\n }\n for (const generator of generators) {\n if (!boundedPreviewSourceIds.has(generator.metadata.id)) {\n pushIssue(issues, {\n code: 'GENERATOR_PREVIEW_MISSING',\n severity: 'error',\n message: 'An authored generator needs a bounded stopped-mode preview.',\n object: objectEvidence(generator.object),\n })\n }\n }\n issues.push(...runtimeRelationshipIssues(scene, sources))\n\n const emptyScene = authoredObjectCount === 0 && generators.length === 0\n if (visibleRenderableCount === 0 || selectableCount === 0) {\n issues.push({\n code: 'NO_VISIBLE_AUTHORED_CONTENT',\n severity: emptyScene ? 'warning' : 'error',\n message: emptyScene\n ? 'The scene is empty; add authored content when you are ready.'\n : visibleRenderableCount === 0\n ? 'No visible renderable authored content exists beneath modelRoot.'\n : 'Visible authored renderables are not selectable.',\n })\n }\n\n const camera = scene.defaultCamera || scene.mainCamera\n const cameraSource = scene.defaultCamera ? 'scene.defaultCamera' : 'scene.mainCamera'\n const cameraResult = emptyScene\n ? {useful: false, framed: 0, inside: 0}\n : validateCamera(camera, cameraSource, visibleBounds, issues)\n const errors = issues.filter(({severity}) => severity === 'error')\n const relationshipsValid = !errors.some(({code}) =>\n code === 'MISSING_AUTHORING_SOURCE' || code === 'RUNTIME_SOURCE_DRIFT')\n const generatorPreviews = !errors.some(({code}) => code === 'GENERATOR_PREVIEW_MISSING')\n const ok = errors.length === 0\n return {\n ok,\n status: ok ? 'pass' : 'fail',\n summary: ok ? 'Stopped-mode authored representation passed.' : `${errors.length} authoring check(s) failed.`,\n issues,\n checks: {\n visibleAuthoredContent: visibleRenderableCount > 0,\n selectableAuthoredContent: selectableCount > 0,\n relationshipsValid,\n generatorPreviews,\n cameraUseful: cameraResult.useful,\n },\n metrics: {\n authoredObjectCount,\n renderableCount,\n visibleRenderableCount,\n selectableCount,\n generatorCount: generators.length,\n generatorPreviewCount: boundedPreviewSourceIds.size,\n cameraFramedRenderableCount: cameraResult.framed,\n cameraInsideRenderableCount: cameraResult.inside,\n },\n }\n}\n\n/** Validate that Play-only content was removed and its authored sources stayed valid. */\nexport function runtimeCleanupReport(viewer: ViewerLike): RuntimeCleanupReport {\n const scene = viewer.scene as SceneLike\n if (!scene?.modelRoot) throw new Error('Runtime cleanup validation requires viewer.scene.modelRoot')\n scene.updateMatrixWorld(true)\n const issues = runtimeRelationshipIssues(scene, collectSources(scene.modelRoot))\n const tracked = getTrackedRuntimeObjects(scene)\n const leaked = new Set<IObject3D>()\n let outsideRenderableCount = 0\n\n for (const object of tracked) {\n if (!hasRuntimeAncestor(object, leaked)) leaked.add(object)\n }\n scene.traverse((object) => {\n if (object === scene || object === scene.modelRoot || isInside(object, scene.modelRoot) || isEditorObject(object, scene)) return\n if (isRenderable(object)) outsideRenderableCount += 1\n const runtimeRoot = nearestRuntimeRoot(object)\n if (runtimeRoot) {\n if (!hasRuntimeAncestor(runtimeRoot, leaked)) leaked.add(runtimeRoot)\n } else if (isRenderable(object)) {\n leaked.add(object)\n }\n })\n for (const object of leaked) {\n pushIssue(issues, {\n code: 'RUNTIME_OBJECT_AFTER_STOP',\n severity: 'error',\n message: getRuntimeObjectMetadata(object)\n ? 'A tracked runtime object remains after Stop.'\n : 'An unmarked renderable remains outside modelRoot after Stop.',\n object: objectEvidence(object),\n })\n }\n const ok = !issues.some(({severity}) => severity === 'error')\n return {\n ok,\n status: ok ? 'pass' : 'fail',\n summary: ok ? 'Runtime cleanup passed.' : `${issues.filter(({severity}) => severity === 'error').length} runtime cleanup check(s) failed.`,\n issues,\n trackedObjectCount: tracked.length,\n outsideRenderableCount,\n }\n}\n\n/** Capture the supported saved semantics without transient engine identities. */\nexport function semanticSceneSnapshot(source: ViewerLike | SceneLike): SemanticSceneSnapshot {\n const scene = 'scene' in source ? source.scene as SceneLike : source\n if (!scene?.modelRoot) throw new Error('A semantic snapshot requires scene.modelRoot')\n return {\n schemaVersion: 1,\n scene: scene.modelRoot.children\n .filter((object) => object.userData?.excludeFromExport !== true)\n .map((object) => serializeObject(object)),\n }\n}\n\n/** Compare names, transforms, component state, and authored source relationships. */\nexport function persistenceReport(before: unknown, after: unknown): PersistenceReport {\n const beforeValue = canonicalValue(toSemanticSnapshot(before))\n const afterValue = canonicalValue(toSemanticSnapshot(after))\n const beforeText = JSON.stringify(beforeValue)\n const afterText = JSON.stringify(afterValue)\n const changes: PersistenceChange[] = []\n compareValues(beforeValue, afterValue, '', changes)\n const issues: AuthoringValidationIssue[] = changes.map((change) => ({\n code: 'PERSISTENCE_DRIFT',\n severity: 'error',\n message: `Saved authoring semantics changed at ${change.path || '/'}.`,\n ...change,\n }))\n const ok = changes.length === 0\n return {\n ok,\n status: ok ? 'pass' : 'fail',\n summary: ok ? 'Save/Reload semantic equivalence passed.' : `${changes.length} persisted semantic difference(s) found.`,\n issues,\n changes,\n beforeBytes: beforeText.length,\n afterBytes: afterText.length,\n }\n}\n\nexport interface GameValidationResult {\n status: 'pass' | 'fail'\n summary: string\n checks?: Record<string, boolean | number | string>\n}\n\nexport interface GameValidationReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n results: GameValidationResult[]\n}\n\nexport type GameValidationFunction = () => GameValidationResult | boolean | void | Promise<GameValidationResult | boolean | void>\n\ninterface GameHookHost {\n registerGameValidation(fn: GameValidationFunction): () => void\n publishGameTelemetry(value: object): () => void\n runGameValidation(): Promise<GameValidationReport>\n dispose(): void\n}\n\nlet activeGameHooks: GameHookHost | undefined\n\n/** Register a project-defined gameplay assertion for the currently starting game. */\nexport function registerGameValidation(fn: GameValidationFunction): () => void {\n if (!activeGameHooks) throw new Error('registerGameValidation must be called while createGame is active')\n return activeGameHooks.registerGameValidation(fn)\n}\n\n/** Publish an immutable telemetry snapshot on window.kite3dGame.telemetry. */\nexport function publishGameTelemetry(value: object): () => void {\n if (!activeGameHooks) throw new Error('publishGameTelemetry must be called while createGame is active')\n return activeGameHooks.publishGameTelemetry(value)\n}\n\n/** Install the per-createGame hook host before project modules are evaluated. */\nexport function installGameHooks(): GameHookHost {\n const validations = new Set<GameValidationFunction>()\n let telemetry: object | undefined\n let disposed = false\n const api = Object.freeze({\n get telemetry() { return telemetry },\n validate: () => host.runGameValidation(),\n })\n const host: GameHookHost = {\n registerGameValidation(fn) {\n if (disposed || typeof fn !== 'function') throw new Error('Game validation must be a function on an active game')\n validations.add(fn)\n return () => validations.delete(fn)\n },\n publishGameTelemetry(value) {\n if (disposed || !value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Game telemetry must be an object on an active game')\n }\n const published = immutableCopy(value)\n telemetry = published\n return () => {\n if (telemetry === published) telemetry = undefined\n }\n },\n async runGameValidation() {\n const results: GameValidationResult[] = []\n for (const validate of validations) {\n try {\n const result = await validate()\n if (result === undefined || result === true) {\n results.push({status: 'pass', summary: 'Project validation passed.'})\n } else if (result === false) {\n results.push({status: 'fail', summary: 'Project validation failed.'})\n } else if (result && ['pass', 'fail'].includes(result.status) && typeof result.summary === 'string') {\n results.push(result)\n } else {\n results.push({status: 'fail', summary: 'Project validation returned an invalid result.'})\n }\n } catch (error) {\n results.push({status: 'fail', summary: `Project validation threw: ${errorMessage(error)}`})\n }\n }\n const failed = results.filter(({status}) => status === 'fail')\n return {\n ok: failed.length === 0,\n status: failed.length ? 'fail' : 'pass',\n summary: failed.length ? failed.map(({summary}) => summary).join(' ') : 'Project validations passed.',\n results,\n }\n },\n dispose() {\n disposed = true\n validations.clear()\n telemetry = undefined\n if (activeGameHooks === host) activeGameHooks = undefined\n if (typeof window !== 'undefined' && window.kite3dGame === api) delete window.kite3dGame\n },\n }\n activeGameHooks?.dispose()\n activeGameHooks = host\n if (typeof window !== 'undefined') window.kite3dGame = api\n return host\n}\n\nfunction collectSources(modelRoot: IObject3D): Map<string, SourceRecord> {\n const sources = new Map<string, SourceRecord>()\n modelRoot.traverse((object) => {\n if (object === modelRoot) return\n const metadata = getAuthoringMetadata(object)\n if (metadata && !metadata.sourceId) sources.set(metadata.id, {object, metadata})\n else if (!metadata) sources.set(object.uuid, {object, metadata: {role: 'direct', id: object.uuid}})\n })\n return sources\n}\n\nfunction runtimeRelationshipIssues(scene: SceneLike, sources: Map<string, SourceRecord>): AuthoringValidationIssue[] {\n const issues: AuthoringValidationIssue[] = []\n scene.traverse((object) => {\n const metadata = getAuthoringMetadata(object)\n if (!metadata?.sourceId) return\n const source = sources.get(metadata.sourceId)\n if (!source) {\n pushIssue(issues, {\n code: 'MISSING_AUTHORING_SOURCE',\n severity: 'error',\n message: `Authored source \"${metadata.sourceId}\" is not present beneath modelRoot.`,\n object: objectEvidence(object),\n })\n return\n }\n const runtime = getRuntimeObjectMetadata(object)\n if (!runtime || runtime.kind === 'effect' || source.metadata.role === 'generator') return\n const overrides = new Set<RuntimeMutableProperty>(runtime.overrides || [])\n if (JSON.stringify(runtimeSignature(source.object, overrides)) !== JSON.stringify(runtimeSignature(object, overrides))) {\n pushIssue(issues, {\n code: 'RUNTIME_SOURCE_DRIFT',\n severity: 'error',\n message: 'A runtime copy differs from its authored source in a non-mutable field.',\n object: objectEvidence(object),\n })\n }\n })\n return issues\n}\n\nfunction validateCamera(\n camera: IObject3D | undefined,\n cameraSource: 'scene.defaultCamera' | 'scene.mainCamera',\n renderables: Array<{object: IObject3D, bounds: Box3}>,\n issues: AuthoringValidationIssue[],\n): {useful: boolean, framed: number, inside: number} {\n let framed = 0\n let inside = 0\n let facing = false\n const cameraLabel = `${cameraSource}${camera?.name ? ` \"${camera.name}\"` : ''}`\n let problem = `${cameraLabel} must be finite and face visible authored content.`\n const projectionMatrix = (camera as IObject3D & {projectionMatrix?: Matrix4, matrixWorldInverse?: Matrix4})?.projectionMatrix\n const matrixWorldInverse = (camera as IObject3D & {projectionMatrix?: Matrix4, matrixWorldInverse?: Matrix4})?.matrixWorldInverse\n if (camera && finiteVector(camera.position) && projectionMatrix && matrixWorldInverse && renderables.length) {\n camera.updateMatrixWorld(true)\n ;(camera as IObject3D & {updateProjectionMatrix?: () => void}).updateProjectionMatrix?.()\n const cameraPosition = camera.getWorldPosition(new Vector3())\n const totalBounds = new Box3().makeEmpty()\n for (const {bounds} of renderables) totalBounds.union(bounds)\n const center = totalBounds.getCenter(new Vector3())\n const direction = (camera as IObject3D & {getWorldDirection?: (target: Vector3) => Vector3}).getWorldDirection?.(new Vector3())\n const toward = center.clone().sub(cameraPosition)\n facing = !direction || toward.lengthSq() === 0 || direction.dot(toward.normalize()) > 0\n const frustum = new Frustum().setFromProjectionMatrix(new Matrix4().multiplyMatrices(projectionMatrix, matrixWorldInverse))\n framed = renderables.filter(({bounds}) => frustum.intersectsBox(bounds)).length\n\n for (const {object, bounds} of renderables) {\n if (cameraInsideAllowed(object) || !containsInteriorPoint(bounds, cameraPosition)) continue\n const mesh = object as IObject3D & {\n isMesh?: boolean\n isInstancedMesh?: boolean\n isSkinnedMesh?: boolean\n geometry?: {\n type?: string\n boundingBox?: Box3\n morphAttributes?: {position?: unknown[]}\n computeBoundingBox?(): void\n }\n }\n const geometry = mesh.geometry\n const deformed = mesh.isInstancedMesh || mesh.isSkinnedMesh || geometry?.morphAttributes?.position?.length\n if (!geometry || deformed || object.matrixWorld.determinant() === 0) {\n addContainmentWarning(issues, object)\n continue\n }\n geometry.computeBoundingBox?.()\n const localPosition = object.worldToLocal(cameraPosition.clone())\n if (!geometry.boundingBox || !containsInteriorPoint(geometry.boundingBox, localPosition)) continue\n if (mesh.isMesh && geometry.type === 'BoxGeometry') inside += 1\n else addContainmentWarning(issues, object)\n }\n if (inside) problem = `${cameraLabel} is inside ${inside} visible authored mesh(es).`\n else if (!framed) problem = `No visible authored renderable intersects ${cameraLabel}'s frustum.`\n else if (!facing) problem = `${cameraLabel} faces away from visible authored content.`\n }\n const useful = Boolean(camera && renderables.length && framed > 0 && inside === 0 && facing)\n if (!useful) issues.push({code: 'CAMERA_NOT_USEFUL', severity: 'error', message: problem})\n return {useful, framed, inside}\n}\n\nfunction containsInteriorPoint(bounds: Box3, point: Vector3): boolean {\n return point.x > bounds.min.x + CAMERA_BOUNDS_EPSILON\n && point.x < bounds.max.x - CAMERA_BOUNDS_EPSILON\n && point.y > bounds.min.y + CAMERA_BOUNDS_EPSILON\n && point.y < bounds.max.y - CAMERA_BOUNDS_EPSILON\n && point.z > bounds.min.z + CAMERA_BOUNDS_EPSILON\n && point.z < bounds.max.z - CAMERA_BOUNDS_EPSILON\n}\n\nfunction addContainmentWarning(issues: AuthoringValidationIssue[], object: IObject3D): void {\n pushIssue(issues, {\n code: 'CAMERA_CONTAINMENT_UNVERIFIED',\n severity: 'warning',\n message: 'The camera intersects local geometry bounds, but hollow or imported mesh containment is unverified.',\n object: objectEvidence(object),\n })\n}\n\nfunction runtimeSignature(object: IObject3D, overrides: Set<RuntimeMutableProperty>, root = true): unknown {\n const renderable = object as IObject3D & {geometry?: {parameters?: unknown}, material?: unknown | unknown[]}\n const result: Record<string, unknown> = {\n type: semanticType(object),\n geometry: canonicalValue(renderable.geometry?.parameters),\n children: object.children.map((child) => runtimeSignature(child, new Set(), false)),\n }\n if (!root || !overrides.has('visible')) result.visible = object.visible\n if (!root || !overrides.has('position')) result.position = vectorValue(object.position)\n if (!root || !overrides.has('rotation')) result.rotation = vectorValue(object.rotation)\n if (!root || !overrides.has('scale')) result.scale = vectorValue(object.scale)\n if (renderable.material && (!root || !overrides.has('material'))) {\n result.material = Array.isArray(renderable.material)\n ? renderable.material.map(materialValue)\n : materialValue(renderable.material)\n }\n return result\n}\n\nfunction materialValue(value: unknown): unknown {\n const material = value as {\n type?: string\n color?: {getHex?(): number}\n emissive?: {getHex?(): number}\n opacity?: number\n transparent?: boolean\n metalness?: number\n roughness?: number\n }\n return canonicalValue({\n type: material?.type,\n color: material?.color?.getHex?.(),\n emissive: material?.emissive?.getHex?.(),\n opacity: material?.opacity,\n transparent: material?.transparent,\n metalness: material?.metalness,\n roughness: material?.roughness,\n })\n}\n\nfunction serializeObject(object: IObject3D): unknown {\n const metadata = getAuthoringMetadata(object)\n return canonicalValue({\n name: object.name,\n type: semanticType(object),\n visible: object.visible,\n position: vectorValue(object.position),\n rotation: vectorValue(object.rotation),\n scale: vectorValue(object.scale),\n components: componentValues(object),\n ...(metadata ? {authoring: metadata} : {}),\n children: object.children\n .filter((child) => child.userData?.excludeFromExport !== true)\n .map((child) => serializeObject(child)),\n })\n}\n\nfunction componentValues(object: IObject3D): unknown[] {\n const live = EntityComponentPlugin.ObjectToComponents.get(object)\n if (live?.length) {\n return live.map((component) => {\n const definition = component.constructor as {ComponentType?: string, StateProperties?: Array<string | {name?: string, key?: string}>}\n const keys = (definition.StateProperties || []).map((property) =>\n typeof property === 'string' ? property : property.name || property.key).filter((key): key is string => Boolean(key))\n return canonicalValue({\n id: component.uuid,\n type: definition.ComponentType || component.constructor.name,\n state: Object.fromEntries(keys.map((key) => [key, semanticValue((component as unknown as Record<string, unknown>)[key])])),\n })\n }).sort(compareJson)\n }\n const saved = object.userData?.EntityComponentPlugin\n if (!isRecord(saved)) return []\n return Object.entries(saved).map(([id, value]) => {\n const component = isRecord(value) ? value : {}\n return canonicalValue({id, type: component.type, state: semanticValue(component.state)})\n }).sort(compareJson)\n}\n\nfunction toSemanticSnapshot(value: unknown): SemanticSceneSnapshot {\n if (typeof value === 'string') return toSemanticSnapshot(JSON.parse(value))\n if (value instanceof Uint8Array) return toSemanticSnapshot(JSON.parse(new TextDecoder().decode(value)))\n if (isRecord(value) && isRecord(value.document)) return gltfSemanticSnapshot(value.document)\n if (isRecord(value) && value.schemaVersion === 1 && Array.isArray(value.scene)) return value as unknown as SemanticSceneSnapshot\n if (isRecord(value) && isRecord(value.asset)) return gltfSemanticSnapshot(value)\n if (isRecord(value) && 'scene' in value) return semanticSceneSnapshot(value as unknown as ViewerLike)\n if (isRecord(value) && 'modelRoot' in value) return semanticSceneSnapshot(value as unknown as SceneLike)\n throw new Error('Persistence comparison requires a semantic snapshot, viewer, scene, or serialized glTF document')\n}\n\nfunction gltfSemanticSnapshot(document: Record<string, unknown>): SemanticSceneSnapshot {\n const nodes = Array.isArray(document.nodes) ? document.nodes : []\n const scenes = Array.isArray(document.scenes) ? document.scenes : []\n const sceneIndex = typeof document.scene === 'number' ? document.scene : 0\n const root = isRecord(scenes[sceneIndex]) ? scenes[sceneIndex] : {}\n const rootNodes = Array.isArray(root.nodes) ? root.nodes : []\n const visit = (index: unknown): unknown => {\n const node = typeof index === 'number' && isRecord(nodes[index]) ? nodes[index] : {}\n const extras = isRecord(node.extras) ? node.extras : {}\n const authoring = isRecord(extras[KITE3D_AUTHORING_METADATA_KEY]) ? extras[KITE3D_AUTHORING_METADATA_KEY] : undefined\n const savedComponents = isRecord(extras.EntityComponentPlugin) ? extras.EntityComponentPlugin : {}\n const components = Object.entries(savedComponents).map(([id, value]) => {\n const component = isRecord(value) ? value : {}\n return canonicalValue({id, type: component.type, state: semanticValue(component.state)})\n }).sort(compareJson)\n const translation = numericArray(node.translation, [0, 0, 0])\n const rotation = numericArray(node.rotation, [0, 0, 0, 1])\n const scale = numericArray(node.scale, [1, 1, 1])\n return canonicalValue({\n name: typeof node.name === 'string' ? node.name : '',\n type: typeof node.mesh === 'number' ? 'Mesh' : typeof node.camera === 'number' ? 'Camera' : 'Group',\n visible: extras.visible !== false,\n position: {x: translation[0], y: translation[1], z: translation[2]},\n quaternion: {x: rotation[0], y: rotation[1], z: rotation[2], w: rotation[3]},\n scale: {x: scale[0], y: scale[1], z: scale[2]},\n components,\n ...(authoring ? {authoring: semanticValue(authoring)} : {}),\n children: (Array.isArray(node.children) ? node.children : []).map(visit),\n })\n }\n return {schemaVersion: 1, scene: rootNodes.map(visit)}\n}\n\nfunction compareValues(left: unknown, right: unknown, path: string, changes: PersistenceChange[]): void {\n if (changes.length >= 50 || Object.is(left, right) || left === right) return\n if (!left || !right || typeof left !== 'object' || typeof right !== 'object'\n || Array.isArray(left) !== Array.isArray(right)) {\n changes.push({path: path || '/', before: left, after: right})\n return\n }\n if (Array.isArray(left) && Array.isArray(right)) {\n const length = Math.max(left.length, right.length)\n for (let index = 0; index < length; index += 1) {\n const named = objectName(left[index]) || objectName(right[index])\n compareValues(left[index], right[index], `${path}/${escapePointer(named || String(index))}`, changes)\n }\n return\n }\n const leftRecord = left as Record<string, unknown>\n const rightRecord = right as Record<string, unknown>\n const keys = [...new Set([...Object.keys(leftRecord), ...Object.keys(rightRecord)])].sort()\n for (const key of keys) compareValues(leftRecord[key], rightRecord[key], `${path}/${escapePointer(key)}`, changes)\n}\n\nfunction objectName(value: unknown): string | undefined {\n if (!isRecord(value) || typeof value.name !== 'string') return undefined\n return value.name || undefined\n}\n\nfunction semanticValue(value: unknown, seen = new WeakSet<object>(), depth = 0): unknown {\n if (typeof value === 'number') return normalizeNumber(value)\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value\n if (value === undefined || typeof value === 'function') return undefined\n if (Array.isArray(value)) return value.map((item) => semanticValue(item, seen, depth + 1))\n if (typeof value !== 'object' || depth > 5) return String(value)\n if (seen.has(value)) return '[Circular]'\n seen.add(value)\n const candidate = value as Record<string, unknown> & {isColor?: boolean, getHexString?(): string, toArray?(): unknown[]}\n if (candidate.isColor && candidate.getHexString) return `#${candidate.getHexString()}`\n if (candidate.toArray && /Vector|Euler|Quaternion/.test(value.constructor?.name || '')) {\n return candidate.toArray().map((item) => semanticValue(item, seen, depth + 1))\n }\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(candidate).sort()) {\n if (key.startsWith('_') || ['id', 'uuid', 'uiConfig', 'object', 'ctx', 'body', 'world'].includes(key)) continue\n const normalized = semanticValue(candidate[key], seen, depth + 1)\n if (normalized !== undefined) result[key] = normalized\n }\n return result\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (typeof value === 'number') return normalizeNumber(value)\n if (Array.isArray(value)) return value.map(canonicalValue)\n if (!isRecord(value)) return value\n return Object.fromEntries(Object.keys(value).sort().flatMap((key) => {\n const child = canonicalValue(value[key])\n return child === undefined ? [] : [[key, child]]\n }))\n}\n\nfunction vectorValue(value: {x: number, y: number, z: number}): {x: number | null, y: number | null, z: number | null} {\n return {x: normalizeNumber(value.x), y: normalizeNumber(value.y), z: normalizeNumber(value.z)}\n}\n\nfunction normalizeNumber(value: number): number | null {\n if (!Number.isFinite(value)) return null\n const rounded = Math.round(value * 1_000_000) / 1_000_000\n return Object.is(rounded, -0) ? 0 : rounded\n}\n\nfunction numericArray(value: unknown, fallback: number[]): number[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'number')) return fallback\n return value.map((item) => normalizeNumber(item) ?? 0)\n}\n\nfunction immutableCopy<T extends object>(value: T): T {\n const copy = typeof structuredClone === 'function' ? structuredClone(value) : JSON.parse(JSON.stringify(value)) as T\n const freeze = (candidate: unknown): void => {\n if (!candidate || typeof candidate !== 'object' || Object.isFrozen(candidate)) return\n for (const child of Object.values(candidate)) freeze(child)\n Object.freeze(candidate)\n }\n freeze(copy)\n return copy\n}\n\nfunction pushIssue(issues: AuthoringValidationIssue[], issue: AuthoringValidationIssue): void {\n if (issues.some((candidate) => candidate.code === issue.code && candidate.object?.uuid === issue.object?.uuid\n && candidate.path === issue.path)) return\n issues.push(issue)\n}\n\nfunction objectEvidence(object: IObject3D): {uuid: string, name: string} {\n return {uuid: object.uuid, name: object.name || '(unnamed)'}\n}\n\nfunction isRenderable(object: IObject3D): boolean {\n const candidate = object as IObject3D & {isMesh?: boolean, isLine?: boolean, isPoints?: boolean, isSprite?: boolean}\n return Boolean(candidate.isMesh || candidate.isLine || candidate.isPoints || candidate.isSprite)\n}\n\nfunction isSelectable(object: IObject3D): boolean {\n return object.userData?.selectable !== false && !object.isWidget\n}\n\nfunction isEffectivelyVisible(object: IObject3D, modelRoot: IObject3D): boolean {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (!current.visible) return false\n if (current === modelRoot) return true\n }\n return false\n}\n\nfunction isInside(object: IObject3D, ancestor: IObject3D): boolean {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (current === ancestor) return true\n }\n return false\n}\n\nfunction isEditorObject(object: IObject3D, scene: SceneLike): boolean {\n if (object === scene.mainCamera || object === scene.defaultCamera) return true\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (current.isWidget) return true\n }\n return false\n}\n\nfunction nearestRuntimeRoot(object: IObject3D): IObject3D | undefined {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (getRuntimeObjectMetadata(current)) return current\n }\n return undefined\n}\n\nfunction hasRuntimeAncestor(object: IObject3D, candidates: Set<IObject3D>): boolean {\n for (let current = object.parent as IObject3D | null; current; current = current.parent as IObject3D | null) {\n if (candidates.has(current)) return true\n }\n return false\n}\n\nfunction cameraInsideAllowed(object: IObject3D): boolean {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (getAuthoringMetadata(current)?.allowCameraInside) return true\n }\n return false\n}\n\nfunction finiteVector(value: {x: number, y: number, z: number}): boolean {\n return Number.isFinite(value.x) && Number.isFinite(value.y) && Number.isFinite(value.z)\n}\n\nfunction semanticType(object: IObject3D): string {\n const candidate = object as IObject3D & {isMesh?: boolean, isCamera?: boolean, isLight?: boolean}\n if (candidate.isMesh) return 'Mesh'\n if (candidate.isCamera) return 'Camera'\n if (candidate.isLight) return 'Light'\n return object.children.length ? 'Group' : object.type\n}\n\nfunction compareJson(left: unknown, right: unknown): number {\n return JSON.stringify(left).localeCompare(JSON.stringify(right))\n}\n\nfunction escapePointer(value: string): string {\n return value.replace(/~/g, '~0').replace(/\\//g, '~1')\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\ndeclare global {\n interface Window {\n kite3dGame?: Readonly<{\n readonly telemetry: object | undefined\n validate(): Promise<GameValidationReport>\n }>\n }\n}\n"],"names":["CAMERA_BOUNDS_EPSILON","authoringQualityReport","viewer","scene","issues","sources","collectSources","generators","previews","boundedPreviewSourceIds","visibleBounds","authoredObjectCount","renderableCount","visibleRenderableCount","selectableCount","object","metadata","getAuthoringMetadata","isRenderable","isEffectivelyVisible","isSelectable","bounds","Box3","finiteVector","preview","source","pushIssue","objectEvidence","generator","runtimeRelationshipIssues","emptyScene","camera","cameraSource","cameraResult","validateCamera","errors","severity","relationshipsValid","code","generatorPreviews","ok","runtimeCleanupReport","tracked","getTrackedRuntimeObjects","leaked","outsideRenderableCount","hasRuntimeAncestor","isInside","isEditorObject","runtimeRoot","nearestRuntimeRoot","getRuntimeObjectMetadata","semanticSceneSnapshot","_a","serializeObject","persistenceReport","before","after","beforeValue","canonicalValue","toSemanticSnapshot","afterValue","beforeText","afterText","changes","compareValues","change","activeGameHooks","registerGameValidation","fn","publishGameTelemetry","value","installGameHooks","validations","telemetry","disposed","api","host","published","immutableCopy","results","validate","result","error","errorMessage","failed","status","summary","modelRoot","runtime","overrides","runtimeSignature","renderables","framed","inside","facing","cameraLabel","problem","projectionMatrix","matrixWorldInverse","cameraPosition","Vector3","totalBounds","center","direction","_b","toward","frustum","Frustum","Matrix4","cameraInsideAllowed","containsInteriorPoint","mesh","geometry","deformed","_d","_c","addContainmentWarning","_e","localPosition","useful","point","root","renderable","semanticType","child","vectorValue","materialValue","material","componentValues","live","EntityComponentPlugin","component","definition","keys","property","key","semanticValue","compareJson","saved","isRecord","id","gltfSemanticSnapshot","document","nodes","scenes","sceneIndex","rootNodes","visit","index","node","extras","authoring","KITE3D_AUTHORING_METADATA_KEY","savedComponents","components","translation","numericArray","rotation","scale","left","right","path","length","named","objectName","escapePointer","leftRecord","rightRecord","seen","depth","normalizeNumber","item","candidate","normalized","rounded","fallback","copy","freeze","issue","current","ancestor","candidates"],"mappings":";;AA8FA,MAAMA,IAAwB;AAQvB,SAASC,GAAuBC,GAA4C;AAC/E,QAAMC,IAAQD,EAAO;AACrB,MAAI,EAACC,KAAA,QAAAA,EAAO,WAAW,OAAM,IAAI,MAAM,sDAAsD;AAC7F,EAAAA,EAAM,kBAAkB,EAAI;AAE5B,QAAMC,IAAqC,CAAA,GACrCC,IAAUC,GAAeH,EAAM,SAAS,GACxCI,IAA6B,CAAA,GAC7BC,IAA2B,CAAA,GAC3BC,wBAA8B,IAAA,GAC9BC,IAA0D,CAAA;AAChE,MAAIC,IAAsB,GACtBC,IAAkB,GAClBC,IAAyB,GACzBC,IAAkB;AAEtB,EAAAX,EAAM,UAAU,SAAS,CAACY,MAAW;AACjC,QAAIA,MAAWZ,EAAM,UAAW;AAChC,IAAAQ,KAAuB;AACvB,UAAMK,IAAWC,EAAqBF,CAAM;AAK5C,SAJIC,KAAA,gBAAAA,EAAU,UAAS,eAAe,CAACA,EAAS,YAAUT,EAAW,KAAK,EAAC,QAAAQ,GAAQ,UAAAC,EAAA,CAAS,IACxFA,KAAA,gBAAAA,EAAU,UAAS,eAAeA,EAAS,cAAmB,KAAK,EAAC,QAAAD,GAAQ,UAAAC,GAAS,GACrF,CAACE,EAAaH,CAAM,MACxBH,KAAmB,GACf,CAACO,GAAqBJ,GAAQZ,EAAM,SAAS,GAAG;AACpD,IAAAU,KAA0B,GACtBO,GAAaL,CAAM,MAAGD,KAAmB;AAC7C,UAAMO,IAAS,IAAIC,KAAO,cAAcP,CAAM;AAC9C,IAAI,CAACM,EAAO,QAAA,KAAaE,EAAaF,EAAO,GAAG,KAAKE,EAAaF,EAAO,GAAG,MACxEX,EAAc,KAAK,EAAC,QAAAK,GAAQ,QAAAM,EAAA,CAAO,IAC/BL,KAAA,gBAAAA,EAAU,UAAS,eAAeA,EAAS,YAAUP,EAAwB,IAAIO,EAAS,QAAQ;AAAA,EAE9G,CAAC;AAED,aAAWQ,KAAWhB,GAAU;AAC5B,UAAMiB,IAASpB,EAAQ,IAAImB,EAAQ,SAAS,YAAY,EAAE;AAC1D,KAAI,CAACC,KAAUA,EAAO,SAAS,SAAS,gBACpCC,EAAUtB,GAAQ;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS,4BAA4BoB,EAAQ,SAAS,YAAY,WAAW;AAAA,MAC7E,QAAQG,EAAeH,EAAQ,MAAM;AAAA,IAAA,CACxC;AAAA,EAET;AACA,aAAWI,KAAarB;AACpB,IAAKE,EAAwB,IAAImB,EAAU,SAAS,EAAE,KAClDF,EAAUtB,GAAQ;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQuB,EAAeC,EAAU,MAAM;AAAA,IAAA,CAC1C;AAGT,EAAAxB,EAAO,KAAK,GAAGyB,GAA0B1B,GAAOE,CAAO,CAAC;AAExD,QAAMyB,IAAanB,MAAwB,KAAKJ,EAAW,WAAW;AACtE,GAAIM,MAA2B,KAAKC,MAAoB,MACpDV,EAAO,KAAK;AAAA,IACR,MAAM;AAAA,IACN,UAAU0B,IAAa,YAAY;AAAA,IACnC,SAASA,IACH,iEACAjB,MAA2B,IAC3B,qEACA;AAAA,EAAA,CACT;AAGL,QAAMkB,IAAS5B,EAAM,iBAAiBA,EAAM,YACtC6B,IAAe7B,EAAM,gBAAgB,wBAAwB,oBAC7D8B,IAAeH,IACf,EAAC,QAAQ,IAAO,QAAQ,GAAG,QAAQ,EAAA,IACnCI,GAAeH,GAAQC,GAActB,GAAeN,CAAM,GAC1D+B,IAAS/B,EAAO,OAAO,CAAC,EAAC,UAAAgC,EAAA,MAAcA,MAAa,OAAO,GAC3DC,IAAqB,CAACF,EAAO,KAAK,CAAC,EAAC,MAAAG,EAAA,MACtCA,MAAS,8BAA8BA,MAAS,sBAAsB,GACpEC,IAAoB,CAACJ,EAAO,KAAK,CAAC,EAAC,MAAAG,EAAA,MAAUA,MAAS,2BAA2B,GACjFE,IAAKL,EAAO,WAAW;AAC7B,SAAO;AAAA,IACH,IAAAK;AAAA,IACA,QAAQA,IAAK,SAAS;AAAA,IACtB,SAASA,IAAK,iDAAiD,GAAGL,EAAO,MAAM;AAAA,IAC/E,QAAA/B;AAAA,IACA,QAAQ;AAAA,MACJ,wBAAwBS,IAAyB;AAAA,MACjD,2BAA2BC,IAAkB;AAAA,MAC7C,oBAAAuB;AAAA,MACA,mBAAAE;AAAA,MACA,cAAcN,EAAa;AAAA,IAAA;AAAA,IAE/B,SAAS;AAAA,MACL,qBAAAtB;AAAA,MACA,iBAAAC;AAAA,MACA,wBAAAC;AAAA,MACA,iBAAAC;AAAA,MACA,gBAAgBP,EAAW;AAAA,MAC3B,uBAAuBE,EAAwB;AAAA,MAC/C,6BAA6BwB,EAAa;AAAA,MAC1C,6BAA6BA,EAAa;AAAA,IAAA;AAAA,EAC9C;AAER;AAGO,SAASQ,GAAqBvC,GAA0C;AAC3E,QAAMC,IAAQD,EAAO;AACrB,MAAI,EAACC,KAAA,QAAAA,EAAO,WAAW,OAAM,IAAI,MAAM,4DAA4D;AACnG,EAAAA,EAAM,kBAAkB,EAAI;AAC5B,QAAMC,IAASyB,GAA0B1B,GAAOG,GAAeH,EAAM,SAAS,CAAC,GACzEuC,IAAUC,GAAyBxC,CAAK,GACxCyC,wBAAa,IAAA;AACnB,MAAIC,IAAyB;AAE7B,aAAW9B,KAAU2B;AACjB,IAAKI,EAAmB/B,GAAQ6B,CAAM,KAAGA,EAAO,IAAI7B,CAAM;AAE9D,EAAAZ,EAAM,SAAS,CAACY,MAAW;AACvB,QAAIA,MAAWZ,KAASY,MAAWZ,EAAM,aAAa4C,GAAShC,GAAQZ,EAAM,SAAS,KAAK6C,GAAejC,GAAQZ,CAAK,EAAG;AAC1H,IAAIe,EAAaH,CAAM,MAAG8B,KAA0B;AACpD,UAAMI,IAAcC,GAAmBnC,CAAM;AAC7C,IAAIkC,IACKH,EAAmBG,GAAaL,CAAM,KAAGA,EAAO,IAAIK,CAAW,IAC7D/B,EAAaH,CAAM,KAC1B6B,EAAO,IAAI7B,CAAM;AAAA,EAEzB,CAAC;AACD,aAAWA,KAAU6B;AACjB,IAAAlB,EAAUtB,GAAQ;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS+C,EAAyBpC,CAAM,IAClC,iDACA;AAAA,MACN,QAAQY,EAAeZ,CAAM;AAAA,IAAA,CAChC;AAEL,QAAMyB,IAAK,CAACpC,EAAO,KAAK,CAAC,EAAC,UAAAgC,EAAA,MAAcA,MAAa,OAAO;AAC5D,SAAO;AAAA,IACH,IAAAI;AAAA,IACA,QAAQA,IAAK,SAAS;AAAA,IACtB,SAASA,IAAK,4BAA4B,GAAGpC,EAAO,OAAO,CAAC,EAAC,UAAAgC,EAAA,MAAcA,MAAa,OAAO,EAAE,MAAM;AAAA,IACvG,QAAAhC;AAAA,IACA,oBAAoBsC,EAAQ;AAAA,IAC5B,wBAAAG;AAAA,EAAA;AAER;AAGO,SAASO,EAAsB3B,GAAuD;AACzF,QAAMtB,IAAQ,WAAWsB,IAASA,EAAO,QAAqBA;AAC9D,MAAI,EAACtB,KAAA,QAAAA,EAAO,WAAW,OAAM,IAAI,MAAM,8CAA8C;AACrF,SAAO;AAAA,IACH,eAAe;AAAA,IACf,OAAOA,EAAM,UAAU,SAClB,OAAO,CAACY;;AAAW,eAAAsC,IAAAtC,EAAO,aAAP,gBAAAsC,EAAiB,uBAAsB;AAAA,KAAI,EAC9D,IAAI,CAACtC,MAAWuC,GAAgBvC,CAAM,CAAC;AAAA,EAAA;AAEpD;AAGO,SAASwC,GAAkBC,GAAiBC,GAAmC;AAClF,QAAMC,IAAcC,EAAeC,EAAmBJ,CAAM,CAAC,GACvDK,IAAaF,EAAeC,EAAmBH,CAAK,CAAC,GACrDK,IAAa,KAAK,UAAUJ,CAAW,GACvCK,IAAY,KAAK,UAAUF,CAAU,GACrCG,IAA+B,CAAA;AACrC,EAAAC,EAAcP,GAAaG,GAAY,IAAIG,CAAO;AAClD,QAAM5D,IAAqC4D,EAAQ,IAAI,CAACE,OAAY;AAAA,IAChE,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS,wCAAwCA,EAAO,QAAQ,GAAG;AAAA,IACnE,GAAGA;AAAA,EAAA,EACL,GACI1B,IAAKwB,EAAQ,WAAW;AAC9B,SAAO;AAAA,IACH,IAAAxB;AAAA,IACA,QAAQA,IAAK,SAAS;AAAA,IACtB,SAASA,IAAK,6CAA6C,GAAGwB,EAAQ,MAAM;AAAA,IAC5E,QAAA5D;AAAA,IACA,SAAA4D;AAAA,IACA,aAAaF,EAAW;AAAA,IACxB,YAAYC,EAAU;AAAA,EAAA;AAE9B;AAwBA,IAAII;AAGG,SAASC,GAAuBC,GAAwC;AAC3E,MAAI,CAACF,EAAiB,OAAM,IAAI,MAAM,kEAAkE;AACxG,SAAOA,EAAgB,uBAAuBE,CAAE;AACpD;AAGO,SAASC,GAAqBC,GAA2B;AAC5D,MAAI,CAACJ,EAAiB,OAAM,IAAI,MAAM,gEAAgE;AACtG,SAAOA,EAAgB,qBAAqBI,CAAK;AACrD;AAGO,SAASC,KAAiC;AAC7C,QAAMC,wBAAkB,IAAA;AACxB,MAAIC,GACAC,IAAW;AACf,QAAMC,IAAM,OAAO,OAAO;AAAA,IACtB,IAAI,YAAY;AAAE,aAAOF;AAAA,IAAU;AAAA,IACnC,UAAU,MAAMG,EAAK,kBAAA;AAAA,EAAkB,CAC1C,GACKA,IAAqB;AAAA,IACvB,uBAAuBR,GAAI;AACvB,UAAIM,KAAY,OAAON,KAAO,WAAY,OAAM,IAAI,MAAM,sDAAsD;AAChH,aAAAI,EAAY,IAAIJ,CAAE,GACX,MAAMI,EAAY,OAAOJ,CAAE;AAAA,IACtC;AAAA,IACA,qBAAqBE,GAAO;AACxB,UAAII,KAAY,CAACJ,KAAS,OAAOA,KAAU,YAAY,MAAM,QAAQA,CAAK;AACtE,cAAM,IAAI,MAAM,oDAAoD;AAExE,YAAMO,IAAYC,GAAcR,CAAK;AACrC,aAAAG,IAAYI,GACL,MAAM;AACT,QAAIJ,MAAcI,MAAWJ,IAAY;AAAA,MAC7C;AAAA,IACJ;AAAA,IACA,MAAM,oBAAoB;AACtB,YAAMM,IAAkC,CAAA;AACxC,iBAAWC,KAAYR;AACnB,YAAI;AACA,gBAAMS,IAAS,MAAMD,EAAA;AACrB,UAAIC,MAAW,UAAaA,MAAW,KACnCF,EAAQ,KAAK,EAAC,QAAQ,QAAQ,SAAS,8BAA6B,IAC7DE,MAAW,KAClBF,EAAQ,KAAK,EAAC,QAAQ,QAAQ,SAAS,8BAA6B,IAC7DE,KAAU,CAAC,QAAQ,MAAM,EAAE,SAASA,EAAO,MAAM,KAAK,OAAOA,EAAO,WAAY,WACvFF,EAAQ,KAAKE,CAAM,IAEnBF,EAAQ,KAAK,EAAC,QAAQ,QAAQ,SAAS,kDAAiD;AAAA,QAEhG,SAASG,GAAO;AACZ,UAAAH,EAAQ,KAAK,EAAC,QAAQ,QAAQ,SAAS,6BAA6BI,GAAaD,CAAK,CAAC,GAAA,CAAG;AAAA,QAC9F;AAEJ,YAAME,IAASL,EAAQ,OAAO,CAAC,EAAC,QAAAM,EAAA,MAAYA,MAAW,MAAM;AAC7D,aAAO;AAAA,QACH,IAAID,EAAO,WAAW;AAAA,QACtB,QAAQA,EAAO,SAAS,SAAS;AAAA,QACjC,SAASA,EAAO,SAASA,EAAO,IAAI,CAAC,EAAC,SAAAE,EAAA,MAAaA,CAAO,EAAE,KAAK,GAAG,IAAI;AAAA,QACxE,SAAAP;AAAA,MAAA;AAAA,IAER;AAAA,IACA,UAAU;AACN,MAAAL,IAAW,IACXF,EAAY,MAAA,GACZC,IAAY,QACRP,MAAoBU,MAAMV,IAAkB,SAC5C,OAAO,SAAW,OAAe,OAAO,eAAeS,YAAY,OAAO;AAAA,IAClF;AAAA,EAAA;AAEJ,SAAAT,KAAA,QAAAA,EAAiB,WACjBA,IAAkBU,GACd,OAAO,SAAW,QAAa,OAAO,aAAaD,IAChDC;AACX;AAEA,SAASvE,GAAekF,GAAiD;AACrE,QAAMnF,wBAAc,IAAA;AACpB,SAAAmF,EAAU,SAAS,CAACzE,MAAW;AAC3B,QAAIA,MAAWyE,EAAW;AAC1B,UAAMxE,IAAWC,EAAqBF,CAAM;AAC5C,IAAIC,KAAY,CAACA,EAAS,WAAUX,EAAQ,IAAIW,EAAS,IAAI,EAAC,QAAAD,GAAQ,UAAAC,EAAA,CAAS,IACrEA,KAAUX,EAAQ,IAAIU,EAAO,MAAM,EAAC,QAAAA,GAAQ,UAAU,EAAC,MAAM,UAAU,IAAIA,EAAO,KAAA,GAAM;AAAA,EACtG,CAAC,GACMV;AACX;AAEA,SAASwB,GAA0B1B,GAAkBE,GAAgE;AACjH,QAAMD,IAAqC,CAAA;AAC3C,SAAAD,EAAM,SAAS,CAACY,MAAW;AACvB,UAAMC,IAAWC,EAAqBF,CAAM;AAC5C,QAAI,EAACC,KAAA,QAAAA,EAAU,UAAU;AACzB,UAAMS,IAASpB,EAAQ,IAAIW,EAAS,QAAQ;AAC5C,QAAI,CAACS,GAAQ;AACT,MAAAC,EAAUtB,GAAQ;AAAA,QACd,MAAM;AAAA,QACN,UAAU;AAAA,QACV,SAAS,oBAAoBY,EAAS,QAAQ;AAAA,QAC9C,QAAQW,EAAeZ,CAAM;AAAA,MAAA,CAChC;AACD;AAAA,IACJ;AACA,UAAM0E,IAAUtC,EAAyBpC,CAAM;AAC/C,QAAI,CAAC0E,KAAWA,EAAQ,SAAS,YAAYhE,EAAO,SAAS,SAAS,YAAa;AACnF,UAAMiE,IAAY,IAAI,IAA4BD,EAAQ,aAAa,CAAA,CAAE;AACzE,IAAI,KAAK,UAAUE,EAAiBlE,EAAO,QAAQiE,CAAS,CAAC,MAAM,KAAK,UAAUC,EAAiB5E,GAAQ2E,CAAS,CAAC,KACjHhE,EAAUtB,GAAQ;AAAA,MACd,MAAM;AAAA,MACN,UAAU;AAAA,MACV,SAAS;AAAA,MACT,QAAQuB,EAAeZ,CAAM;AAAA,IAAA,CAChC;AAAA,EAET,CAAC,GACMX;AACX;AAEA,SAAS8B,GACLH,GACAC,GACA4D,GACAxF,GACiD;;AACjD,MAAIyF,IAAS,GACTC,IAAS,GACTC,IAAS;AACb,QAAMC,IAAc,GAAGhE,CAAY,GAAGD,KAAA,QAAAA,EAAQ,OAAO,KAAKA,EAAO,IAAI,MAAM,EAAE;AAC7E,MAAIkE,IAAU,GAAGD,CAAW;AAC5B,QAAME,IAAoBnE,KAAA,gBAAAA,EAAmF,kBACvGoE,IAAsBpE,KAAA,gBAAAA,EAAmF;AAC/G,MAAIA,KAAUR,EAAaQ,EAAO,QAAQ,KAAKmE,KAAoBC,KAAsBP,EAAY,QAAQ;AACzG,IAAA7D,EAAO,kBAAkB,EAAI,IAC3BsB,IAAAtB,EAA6D,2BAA7D,QAAAsB,EAAA,KAAAtB;AACF,UAAMqE,IAAiBrE,EAAO,iBAAiB,IAAIsE,GAAS,GACtDC,IAAc,IAAIhF,GAAA,EAAO,UAAA;AAC/B,eAAW,EAAC,QAAAD,EAAA,KAAWuE,EAAa,CAAAU,EAAY,MAAMjF,CAAM;AAC5D,UAAMkF,IAASD,EAAY,UAAU,IAAID,GAAS,GAC5CG,KAAaC,IAAA1E,EAA0E,sBAA1E,gBAAA0E,EAAA,KAAA1E,GAA8F,IAAIsE,MAC/GK,IAASH,EAAO,MAAA,EAAQ,IAAIH,CAAc;AAChD,IAAAL,IAAS,CAACS,KAAaE,EAAO,SAAA,MAAe,KAAKF,EAAU,IAAIE,EAAO,UAAA,CAAW,IAAI;AACtF,UAAMC,IAAU,IAAIC,GAAA,EAAU,wBAAwB,IAAIC,GAAA,EAAU,iBAAiBX,GAAkBC,CAAkB,CAAC;AAC1H,IAAAN,IAASD,EAAY,OAAO,CAAC,EAAC,QAAAvE,QAAYsF,EAAQ,cAActF,CAAM,CAAC,EAAE;AAEzE,eAAW,EAAC,QAAAN,GAAQ,QAAAM,GAAA,KAAWuE,GAAa;AACxC,UAAIkB,GAAoB/F,CAAM,KAAK,CAACgG,EAAsB1F,IAAQ+E,CAAc,EAAG;AACnF,YAAMY,IAAOjG,GAWPkG,IAAWD,EAAK,UAChBE,KAAWF,EAAK,mBAAmBA,EAAK,mBAAiBG,KAAAC,IAAAH,KAAA,gBAAAA,EAAU,oBAAV,gBAAAG,EAA2B,aAA3B,gBAAAD,EAAqC;AACpG,UAAI,CAACF,KAAYC,MAAYnG,EAAO,YAAY,YAAA,MAAkB,GAAG;AACjE,QAAAsG,EAAsBjH,GAAQW,CAAM;AACpC;AAAA,MACJ;AACA,OAAAuG,IAAAL,EAAS,uBAAT,QAAAK,EAAA,KAAAL;AACA,YAAMM,KAAgBxG,EAAO,aAAaqF,EAAe,OAAO;AAChE,MAAI,CAACa,EAAS,eAAe,CAACF,EAAsBE,EAAS,aAAaM,EAAa,MACnFP,EAAK,UAAUC,EAAS,SAAS,gBAAenB,KAAU,IACzDuB,EAAsBjH,GAAQW,CAAM;AAAA,IAC7C;AACA,IAAI+E,IAAQG,IAAU,GAAGD,CAAW,cAAcF,CAAM,gCAC9CD,IACAE,MAAQE,IAAU,GAAGD,CAAW,gDADxBC,IAAU,6CAA6CD,CAAW;AAAA,EAExF;AACA,QAAMwB,IAAS,GAAQzF,KAAU6D,EAAY,UAAUC,IAAS,KAAKC,MAAW,KAAKC;AACrF,SAAKyB,KAAQpH,EAAO,KAAK,EAAC,MAAM,qBAAqB,UAAU,SAAS,SAAS6F,EAAA,CAAQ,GAClF,EAAC,QAAAuB,GAAQ,QAAA3B,GAAQ,QAAAC,EAAA;AAC5B;AAEA,SAASiB,EAAsB1F,GAAcoG,GAAyB;AAClE,SAAOA,EAAM,IAAIpG,EAAO,IAAI,IAAIrB,KACzByH,EAAM,IAAIpG,EAAO,IAAI,IAAIrB,KACzByH,EAAM,IAAIpG,EAAO,IAAI,IAAIrB,KACzByH,EAAM,IAAIpG,EAAO,IAAI,IAAIrB,KACzByH,EAAM,IAAIpG,EAAO,IAAI,IAAIrB,KACzByH,EAAM,IAAIpG,EAAO,IAAI,IAAIrB;AACpC;AAEA,SAASqH,EAAsBjH,GAAoCW,GAAyB;AACxF,EAAAW,EAAUtB,GAAQ;AAAA,IACd,MAAM;AAAA,IACN,UAAU;AAAA,IACV,SAAS;AAAA,IACT,QAAQuB,EAAeZ,CAAM;AAAA,EAAA,CAChC;AACL;AAEA,SAAS4E,EAAiB5E,GAAmB2E,GAAwCgC,IAAO,IAAe;;AACvG,QAAMC,IAAa5G,GACbmE,IAAkC;AAAA,IACpC,MAAM0C,GAAa7G,CAAM;AAAA,IACzB,UAAU4C,GAAeN,IAAAsE,EAAW,aAAX,gBAAAtE,EAAqB,UAAU;AAAA,IACxD,UAAUtC,EAAO,SAAS,IAAI,CAAC8G,MAAUlC,EAAiBkC,GAAO,oBAAI,IAAA,GAAO,EAAK,CAAC;AAAA,EAAA;AAEtF,UAAI,CAACH,KAAQ,CAAChC,EAAU,IAAI,SAAS,OAAGR,EAAO,UAAUnE,EAAO,WAC5D,CAAC2G,KAAQ,CAAChC,EAAU,IAAI,UAAU,OAAGR,EAAO,WAAW4C,EAAY/G,EAAO,QAAQ,KAClF,CAAC2G,KAAQ,CAAChC,EAAU,IAAI,UAAU,OAAGR,EAAO,WAAW4C,EAAY/G,EAAO,QAAQ,KAClF,CAAC2G,KAAQ,CAAChC,EAAU,IAAI,OAAO,OAAGR,EAAO,QAAQ4C,EAAY/G,EAAO,KAAK,IACzE4G,EAAW,aAAa,CAACD,KAAQ,CAAChC,EAAU,IAAI,UAAU,OAC1DR,EAAO,WAAW,MAAM,QAAQyC,EAAW,QAAQ,IAC7CA,EAAW,SAAS,IAAII,CAAa,IACrCA,EAAcJ,EAAW,QAAQ,IAEpCzC;AACX;AAEA,SAAS6C,EAAcxD,GAAyB;;AAC5C,QAAMyD,IAAWzD;AASjB,SAAOZ,EAAe;AAAA,IAClB,MAAMqE,KAAA,gBAAAA,EAAU;AAAA,IAChB,QAAOvB,KAAApD,IAAA2E,KAAA,gBAAAA,EAAU,UAAV,gBAAA3E,EAAiB,WAAjB,gBAAAoD,EAAA,KAAApD;AAAA,IACP,WAAU8D,KAAAC,IAAAY,KAAA,gBAAAA,EAAU,aAAV,gBAAAZ,EAAoB,WAApB,gBAAAD,EAAA,KAAAC;AAAA,IACV,SAASY,KAAA,gBAAAA,EAAU;AAAA,IACnB,aAAaA,KAAA,gBAAAA,EAAU;AAAA,IACvB,WAAWA,KAAA,gBAAAA,EAAU;AAAA,IACrB,WAAWA,KAAA,gBAAAA,EAAU;AAAA,EAAA,CACxB;AACL;AAEA,SAAS1E,GAAgBvC,GAA4B;AACjD,QAAMC,IAAWC,EAAqBF,CAAM;AAC5C,SAAO4C,EAAe;AAAA,IAClB,MAAM5C,EAAO;AAAA,IACb,MAAM6G,GAAa7G,CAAM;AAAA,IACzB,SAASA,EAAO;AAAA,IAChB,UAAU+G,EAAY/G,EAAO,QAAQ;AAAA,IACrC,UAAU+G,EAAY/G,EAAO,QAAQ;AAAA,IACrC,OAAO+G,EAAY/G,EAAO,KAAK;AAAA,IAC/B,YAAYkH,GAAgBlH,CAAM;AAAA,IAClC,GAAIC,IAAW,EAAC,WAAWA,EAAA,IAAY,CAAA;AAAA,IACvC,UAAUD,EAAO,SACZ,OAAO,CAAC8G;;AAAU,eAAAxE,IAAAwE,EAAM,aAAN,gBAAAxE,EAAgB,uBAAsB;AAAA,KAAI,EAC5D,IAAI,CAACwE,MAAUvE,GAAgBuE,CAAK,CAAC;AAAA,EAAA,CAC7C;AACL;AAEA,SAASI,GAAgBlH,GAA8B;;AACnD,QAAMmH,IAAOC,GAAsB,mBAAmB,IAAIpH,CAAM;AAChE,MAAImH,KAAA,QAAAA,EAAM;AACN,WAAOA,EAAK,IAAI,CAACE,MAAc;AAC3B,YAAMC,IAAaD,EAAU,aACvBE,KAAQD,EAAW,mBAAmB,CAAA,GAAI,IAAI,CAACE,MACjD,OAAOA,KAAa,WAAWA,IAAWA,EAAS,QAAQA,EAAS,GAAG,EAAE,OAAO,CAACC,MAAuB,EAAQA,CAAI;AACxH,aAAO7E,EAAe;AAAA,QAClB,IAAIyE,EAAU;AAAA,QACd,MAAMC,EAAW,iBAAiBD,EAAU,YAAY;AAAA,QACxD,OAAO,OAAO,YAAYE,EAAK,IAAI,CAACE,MAAQ,CAACA,GAAKC,EAAeL,EAAiDI,CAAG,CAAC,CAAC,CAAC,CAAC;AAAA,MAAA,CAC5H;AAAA,IACL,CAAC,EAAE,KAAKE,CAAW;AAEvB,QAAMC,KAAQtF,IAAAtC,EAAO,aAAP,gBAAAsC,EAAiB;AAC/B,SAAKuF,EAASD,CAAK,IACZ,OAAO,QAAQA,CAAK,EAAE,IAAI,CAAC,CAACE,GAAItE,CAAK,MAAM;AAC9C,UAAM6D,IAAYQ,EAASrE,CAAK,IAAIA,IAAQ,CAAA;AAC5C,WAAOZ,EAAe,EAAC,IAAAkF,GAAI,MAAMT,EAAU,MAAM,OAAOK,EAAcL,EAAU,KAAK,EAAA,CAAE;AAAA,EAC3F,CAAC,EAAE,KAAKM,CAAW,IAJU,CAAA;AAKjC;AAEA,SAAS9E,EAAmBW,GAAuC;AAC/D,MAAI,OAAOA,KAAU,SAAU,QAAOX,EAAmB,KAAK,MAAMW,CAAK,CAAC;AAC1E,MAAIA,aAAiB,WAAY,QAAOX,EAAmB,KAAK,MAAM,IAAI,YAAA,EAAc,OAAOW,CAAK,CAAC,CAAC;AACtG,MAAIqE,EAASrE,CAAK,KAAKqE,EAASrE,EAAM,QAAQ,EAAG,QAAOuE,EAAqBvE,EAAM,QAAQ;AAC3F,MAAIqE,EAASrE,CAAK,KAAKA,EAAM,kBAAkB,KAAK,MAAM,QAAQA,EAAM,KAAK,EAAG,QAAOA;AACvF,MAAIqE,EAASrE,CAAK,KAAKqE,EAASrE,EAAM,KAAK,EAAG,QAAOuE,EAAqBvE,CAAK;AAE/E,MADIqE,EAASrE,CAAK,KAAK,WAAWA,KAC9BqE,EAASrE,CAAK,KAAK,eAAeA,EAAO,QAAOnB,EAAsBmB,CAA6B;AACvG,QAAM,IAAI,MAAM,iGAAiG;AACrH;AAEA,SAASuE,EAAqBC,GAA0D;AACpF,QAAMC,IAAQ,MAAM,QAAQD,EAAS,KAAK,IAAIA,EAAS,QAAQ,CAAA,GACzDE,IAAS,MAAM,QAAQF,EAAS,MAAM,IAAIA,EAAS,SAAS,CAAA,GAC5DG,IAAa,OAAOH,EAAS,SAAU,WAAWA,EAAS,QAAQ,GACnErB,IAAOkB,EAASK,EAAOC,CAAU,CAAC,IAAID,EAAOC,CAAU,IAAI,CAAA,GAC3DC,IAAY,MAAM,QAAQzB,EAAK,KAAK,IAAIA,EAAK,QAAQ,CAAA,GACrD0B,IAAQ,CAACC,MAA4B;AACvC,UAAMC,IAAO,OAAOD,KAAU,YAAYT,EAASI,EAAMK,CAAK,CAAC,IAAIL,EAAMK,CAAK,IAAI,CAAA,GAC5EE,IAASX,EAASU,EAAK,MAAM,IAAIA,EAAK,SAAS,CAAA,GAC/CE,IAAYZ,EAASW,EAAOE,CAA6B,CAAC,IAAIF,EAAOE,CAA6B,IAAI,QACtGC,IAAkBd,EAASW,EAAO,qBAAqB,IAAIA,EAAO,wBAAwB,CAAA,GAC1FI,IAAa,OAAO,QAAQD,CAAe,EAAE,IAAI,CAAC,CAACb,GAAItE,CAAK,MAAM;AACpE,YAAM6D,IAAYQ,EAASrE,CAAK,IAAIA,IAAQ,CAAA;AAC5C,aAAOZ,EAAe,EAAC,IAAAkF,GAAI,MAAMT,EAAU,MAAM,OAAOK,EAAcL,EAAU,KAAK,EAAA,CAAE;AAAA,IAC3F,CAAC,EAAE,KAAKM,CAAW,GACbkB,IAAcC,EAAaP,EAAK,aAAa,CAAC,GAAG,GAAG,CAAC,CAAC,GACtDQ,IAAWD,EAAaP,EAAK,UAAU,CAAC,GAAG,GAAG,GAAG,CAAC,CAAC,GACnDS,IAAQF,EAAaP,EAAK,OAAO,CAAC,GAAG,GAAG,CAAC,CAAC;AAChD,WAAO3F,EAAe;AAAA,MAClB,MAAM,OAAO2F,EAAK,QAAS,WAAWA,EAAK,OAAO;AAAA,MAClD,MAAM,OAAOA,EAAK,QAAS,WAAW,SAAS,OAAOA,EAAK,UAAW,WAAW,WAAW;AAAA,MAC5F,SAASC,EAAO,YAAY;AAAA,MAC5B,UAAU,EAAC,GAAGK,EAAY,CAAC,GAAG,GAAGA,EAAY,CAAC,GAAG,GAAGA,EAAY,CAAC,EAAA;AAAA,MACjE,YAAY,EAAC,GAAGE,EAAS,CAAC,GAAG,GAAGA,EAAS,CAAC,GAAG,GAAGA,EAAS,CAAC,GAAG,GAAGA,EAAS,CAAC,EAAA;AAAA,MAC1E,OAAO,EAAC,GAAGC,EAAM,CAAC,GAAG,GAAGA,EAAM,CAAC,GAAG,GAAGA,EAAM,CAAC,EAAA;AAAA,MAC5C,YAAAJ;AAAA,MACA,GAAIH,IAAY,EAAC,WAAWf,EAAce,CAAS,EAAA,IAAK,CAAA;AAAA,MACxD,WAAW,MAAM,QAAQF,EAAK,QAAQ,IAAIA,EAAK,WAAW,IAAI,IAAIF,CAAK;AAAA,IAAA,CAC1E;AAAA,EACL;AACA,SAAO,EAAC,eAAe,GAAG,OAAOD,EAAU,IAAIC,CAAK,EAAA;AACxD;AAEA,SAASnF,EAAc+F,GAAeC,GAAgBC,GAAclG,GAAoC;AACpG,MAAIA,EAAQ,UAAU,MAAM,OAAO,GAAGgG,GAAMC,CAAK,KAAKD,MAASC,EAAO;AACtE,MAAI,CAACD,KAAQ,CAACC,KAAS,OAAOD,KAAS,YAAY,OAAOC,KAAU,YAC7D,MAAM,QAAQD,CAAI,MAAM,MAAM,QAAQC,CAAK,GAAG;AACjD,IAAAjG,EAAQ,KAAK,EAAC,MAAMkG,KAAQ,KAAK,QAAQF,GAAM,OAAOC,GAAM;AAC5D;AAAA,EACJ;AACA,MAAI,MAAM,QAAQD,CAAI,KAAK,MAAM,QAAQC,CAAK,GAAG;AAC7C,UAAME,IAAS,KAAK,IAAIH,EAAK,QAAQC,EAAM,MAAM;AACjD,aAASZ,IAAQ,GAAGA,IAAQc,GAAQd,KAAS,GAAG;AAC5C,YAAMe,IAAQC,EAAWL,EAAKX,CAAK,CAAC,KAAKgB,EAAWJ,EAAMZ,CAAK,CAAC;AAChE,MAAApF,EAAc+F,EAAKX,CAAK,GAAGY,EAAMZ,CAAK,GAAG,GAAGa,CAAI,IAAII,EAAcF,KAAS,OAAOf,CAAK,CAAC,CAAC,IAAIrF,CAAO;AAAA,IACxG;AACA;AAAA,EACJ;AACA,QAAMuG,IAAaP,GACbQ,IAAcP,GACd3B,IAAO,CAAC,uBAAO,IAAI,CAAC,GAAG,OAAO,KAAKiC,CAAU,GAAG,GAAG,OAAO,KAAKC,CAAW,CAAC,CAAC,CAAC,EAAE,KAAA;AACrF,aAAWhC,KAAOF,EAAM,CAAArE,EAAcsG,EAAW/B,CAAG,GAAGgC,EAAYhC,CAAG,GAAG,GAAG0B,CAAI,IAAII,EAAc9B,CAAG,CAAC,IAAIxE,CAAO;AACrH;AAEA,SAASqG,EAAW9F,GAAoC;AACpD,MAAI,GAACqE,EAASrE,CAAK,KAAK,OAAOA,EAAM,QAAS;AAC9C,WAAOA,EAAM,QAAQ;AACzB;AAEA,SAASkE,EAAclE,GAAgBkG,wBAAW,QAAA,GAAmBC,IAAQ,GAAY;;AACrF,MAAI,OAAOnG,KAAU,SAAU,QAAOoG,EAAgBpG,CAAK;AAC3D,MAAIA,MAAU,QAAQ,OAAOA,KAAU,YAAY,OAAOA,KAAU,UAAW,QAAOA;AACtF,MAAIA,MAAU,UAAa,OAAOA,KAAU,WAAY;AACxD,MAAI,MAAM,QAAQA,CAAK,UAAUA,EAAM,IAAI,CAACqG,MAASnC,EAAcmC,GAAMH,GAAMC,IAAQ,CAAC,CAAC;AACzF,MAAI,OAAOnG,KAAU,YAAYmG,IAAQ,EAAG,QAAO,OAAOnG,CAAK;AAC/D,MAAIkG,EAAK,IAAIlG,CAAK,EAAG,QAAO;AAC5B,EAAAkG,EAAK,IAAIlG,CAAK;AACd,QAAMsG,IAAYtG;AAClB,MAAIsG,EAAU,WAAWA,EAAU,qBAAqB,IAAIA,EAAU,cAAc;AACpF,MAAIA,EAAU,WAAW,0BAA0B,OAAKxH,IAAAkB,EAAM,gBAAN,gBAAAlB,EAAmB,SAAQ,EAAE;AACjF,WAAOwH,EAAU,UAAU,IAAI,CAACD,MAASnC,EAAcmC,GAAMH,GAAMC,IAAQ,CAAC,CAAC;AAEjF,QAAMxF,IAAkC,CAAA;AACxC,aAAWsD,KAAO,OAAO,KAAKqC,CAAS,EAAE,QAAQ;AAC7C,QAAIrC,EAAI,WAAW,GAAG,KAAK,CAAC,MAAM,QAAQ,YAAY,UAAU,OAAO,QAAQ,OAAO,EAAE,SAASA,CAAG,EAAG;AACvG,UAAMsC,IAAarC,EAAcoC,EAAUrC,CAAG,GAAGiC,GAAMC,IAAQ,CAAC;AAChE,IAAII,MAAe,WAAW5F,EAAOsD,CAAG,IAAIsC;AAAA,EAChD;AACA,SAAO5F;AACX;AAEA,SAASvB,EAAeY,GAAyB;AAC7C,SAAI,OAAOA,KAAU,WAAiBoG,EAAgBpG,CAAK,IACvD,MAAM,QAAQA,CAAK,IAAUA,EAAM,IAAIZ,CAAc,IACpDiF,EAASrE,CAAK,IACZ,OAAO,YAAY,OAAO,KAAKA,CAAK,EAAE,KAAA,EAAO,QAAQ,CAACiE,MAAQ;AACjE,UAAMX,IAAQlE,EAAeY,EAAMiE,CAAG,CAAC;AACvC,WAAOX,MAAU,SAAY,CAAA,IAAK,CAAC,CAACW,GAAKX,CAAK,CAAC;AAAA,EACnD,CAAC,CAAC,IAJ2BtD;AAKjC;AAEA,SAASuD,EAAYvD,GAAkG;AACnH,SAAO,EAAC,GAAGoG,EAAgBpG,EAAM,CAAC,GAAG,GAAGoG,EAAgBpG,EAAM,CAAC,GAAG,GAAGoG,EAAgBpG,EAAM,CAAC,EAAA;AAChG;AAEA,SAASoG,EAAgBpG,GAA8B;AACnD,MAAI,CAAC,OAAO,SAASA,CAAK,EAAG,QAAO;AACpC,QAAMwG,IAAU,KAAK,MAAMxG,IAAQ,GAAS,IAAI;AAChD,SAAO,OAAO,GAAGwG,GAAS,EAAE,IAAI,IAAIA;AACxC;AAEA,SAASlB,EAAatF,GAAgByG,GAA8B;AAChE,SAAI,CAAC,MAAM,QAAQzG,CAAK,KAAKA,EAAM,KAAK,CAACqG,MAAS,OAAOA,KAAS,QAAQ,IAAUI,IAC7EzG,EAAM,IAAI,CAACqG,MAASD,EAAgBC,CAAI,KAAK,CAAC;AACzD;AAEA,SAAS7F,GAAgCR,GAAa;AAClD,QAAM0G,IAAO,OAAO,mBAAoB,aAAa,gBAAgB1G,CAAK,IAAI,KAAK,MAAM,KAAK,UAAUA,CAAK,CAAC,GACxG2G,IAAS,CAACL,MAA6B;AACzC,QAAI,GAACA,KAAa,OAAOA,KAAc,YAAY,OAAO,SAASA,CAAS,IAC5E;AAAA,iBAAWhD,KAAS,OAAO,OAAOgD,CAAS,KAAUhD,CAAK;AAC1D,aAAO,OAAOgD,CAAS;AAAA;AAAA,EAC3B;AACA,SAAAK,EAAOD,CAAI,GACJA;AACX;AAEA,SAASvJ,EAAUtB,GAAoC+K,GAAuC;AAC1F,EAAI/K,EAAO,KAAK,CAACyK;;AAAc,WAAAA,EAAU,SAASM,EAAM,UAAQ9H,IAAAwH,EAAU,WAAV,gBAAAxH,EAAkB,YAASoD,IAAA0E,EAAM,WAAN,gBAAA1E,EAAc,SAClGoE,EAAU,SAASM,EAAM;AAAA,GAAI,KACpC/K,EAAO,KAAK+K,CAAK;AACrB;AAEA,SAASxJ,EAAeZ,GAAiD;AACrE,SAAO,EAAC,MAAMA,EAAO,MAAM,MAAMA,EAAO,QAAQ,YAAA;AACpD;AAEA,SAASG,EAAaH,GAA4B;AAC9C,QAAM8J,IAAY9J;AAClB,SAAO,GAAQ8J,EAAU,UAAUA,EAAU,UAAUA,EAAU,YAAYA,EAAU;AAC3F;AAEA,SAASzJ,GAAaL,GAA4B;;AAC9C,WAAOsC,IAAAtC,EAAO,aAAP,gBAAAsC,EAAiB,gBAAe,MAAS,CAACtC,EAAO;AAC5D;AAEA,SAASI,GAAqBJ,GAAmByE,GAA+B;AAC5E,WAAS4F,IAA4BrK,GAAQqK,GAASA,IAAUA,EAAQ,QAA4B;AAChG,QAAI,CAACA,EAAQ,QAAS,QAAO;AAC7B,QAAIA,MAAY5F,EAAW,QAAO;AAAA,EACtC;AACA,SAAO;AACX;AAEA,SAASzC,GAAShC,GAAmBsK,GAA8B;AAC/D,WAASD,IAA4BrK,GAAQqK,GAASA,IAAUA,EAAQ;AACpE,QAAIA,MAAYC,EAAU,QAAO;AAErC,SAAO;AACX;AAEA,SAASrI,GAAejC,GAAmBZ,GAA2B;AAClE,MAAIY,MAAWZ,EAAM,cAAcY,MAAWZ,EAAM,cAAe,QAAO;AAC1E,WAASiL,IAA4BrK,GAAQqK,GAASA,IAAUA,EAAQ;AACpE,QAAIA,EAAQ,SAAU,QAAO;AAEjC,SAAO;AACX;AAEA,SAASlI,GAAmBnC,GAA0C;AAClE,WAASqK,IAA4BrK,GAAQqK,GAASA,IAAUA,EAAQ;AACpE,QAAIjI,EAAyBiI,CAAO,EAAG,QAAOA;AAGtD;AAEA,SAAStI,EAAmB/B,GAAmBuK,GAAqC;AAChF,WAASF,IAAUrK,EAAO,QAA4BqK,GAASA,IAAUA,EAAQ;AAC7E,QAAIE,EAAW,IAAIF,CAAO,EAAG,QAAO;AAExC,SAAO;AACX;AAEA,SAAStE,GAAoB/F,GAA4B;;AACrD,WAASqK,IAA4BrK,GAAQqK,GAASA,IAAUA,EAAQ;AACpE,SAAI/H,IAAApC,EAAqBmK,CAAO,MAA5B,QAAA/H,EAA+B,kBAAmB,QAAO;AAEjE,SAAO;AACX;AAEA,SAAS9B,EAAagD,GAAmD;AACrE,SAAO,OAAO,SAASA,EAAM,CAAC,KAAK,OAAO,SAASA,EAAM,CAAC,KAAK,OAAO,SAASA,EAAM,CAAC;AAC1F;AAEA,SAASqD,GAAa7G,GAA2B;AAC7C,QAAM8J,IAAY9J;AAClB,SAAI8J,EAAU,SAAe,SACzBA,EAAU,WAAiB,WAC3BA,EAAU,UAAgB,UACvB9J,EAAO,SAAS,SAAS,UAAUA,EAAO;AACrD;AAEA,SAAS2H,EAAYsB,GAAeC,GAAwB;AACxD,SAAO,KAAK,UAAUD,CAAI,EAAE,cAAc,KAAK,UAAUC,CAAK,CAAC;AACnE;AAEA,SAASK,EAAc/F,GAAuB;AAC1C,SAAOA,EAAM,QAAQ,MAAM,IAAI,EAAE,QAAQ,OAAO,IAAI;AACxD;AAEA,SAASa,GAAaD,GAAwB;AAC1C,SAAOA,aAAiB,QAAQA,EAAM,UAAU,OAAOA,CAAK;AAChE;AAEA,SAASyD,EAASrE,GAAkD;AAChE,SAAO,EAAQA,KAAU,OAAOA,KAAU,YAAY,CAAC,MAAM,QAAQA,CAAK;AAC9E;"}
|
|
1
|
+
{"version":3,"file":"authoringValidation.js","sources":["../src/authoringValidation.ts"],"sourcesContent":["import {\n Box3,\n EntityComponentPlugin,\n Frustum,\n Matrix4,\n Vector3,\n type IObject3D,\n type ThreeViewer,\n} from 'threepipe'\nimport {\n KITE3D_AUTHORING_METADATA_KEY,\n getAuthoringMetadata,\n getRuntimeObjectMetadata,\n getTrackedRuntimeObjects,\n type AuthoringMetadata,\n type RuntimeMutableProperty,\n} from './authoring.ts'\n\nexport type AuthoringFailureCode =\n | 'NO_VISIBLE_AUTHORED_CONTENT'\n | 'RUNTIME_OBJECT_AFTER_STOP'\n | 'MISSING_AUTHORING_SOURCE'\n | 'RUNTIME_SOURCE_DRIFT'\n | 'CAMERA_NOT_USEFUL'\n | 'CAMERA_CONTAINMENT_UNVERIFIED'\n | 'PERSISTENCE_DRIFT'\n\nexport interface AuthoringValidationIssue {\n code: AuthoringFailureCode\n severity: 'error' | 'warning'\n message: string\n object?: {uuid: string, name: string}\n path?: string\n before?: unknown\n after?: unknown\n}\n\nexport interface AuthoringQualityReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n issues: AuthoringValidationIssue[]\n checks: {\n visibleAuthoredContent: boolean\n selectableAuthoredContent: boolean\n relationshipsValid: boolean\n cameraUseful: boolean\n }\n metrics: {\n authoredObjectCount: number\n renderableCount: number\n visibleRenderableCount: number\n selectableCount: number\n cameraFramedRenderableCount: number\n cameraInsideRenderableCount: number\n }\n}\n\nexport interface RuntimeCleanupReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n issues: AuthoringValidationIssue[]\n trackedObjectCount: number\n outsideRenderableCount: number\n}\n\nexport interface SemanticSceneSnapshot {\n schemaVersion: 1\n scene: unknown[]\n}\n\nexport interface PersistenceChange {\n path: string\n before: unknown\n after: unknown\n}\n\nexport interface PersistenceReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n issues: AuthoringValidationIssue[]\n changes: PersistenceChange[]\n beforeBytes: number\n afterBytes: number\n}\n\ntype ViewerLike = Pick<ThreeViewer, 'scene'>\ntype SceneLike = IObject3D & {modelRoot: IObject3D, mainCamera?: IObject3D, defaultCamera?: IObject3D}\nconst CAMERA_BOUNDS_EPSILON = 1e-6\n\ninterface SourceRecord {\n object: IObject3D\n metadata: AuthoringMetadata\n}\n\n/** Validate the stopped authoring hierarchy, its sources, and saved camera. */\nexport function authoringQualityReport(viewer: ViewerLike): AuthoringQualityReport {\n const scene = viewer.scene as SceneLike\n if (!scene?.modelRoot) throw new Error('Authoring validation requires viewer.scene.modelRoot')\n scene.updateMatrixWorld(true)\n\n const issues: AuthoringValidationIssue[] = []\n const sources = collectSources(scene.modelRoot)\n const visibleBounds: Array<{object: IObject3D, bounds: Box3}> = []\n let authoredObjectCount = 0\n let renderableCount = 0\n let visibleRenderableCount = 0\n let selectableCount = 0\n\n scene.modelRoot.traverse((object) => {\n if (object === scene.modelRoot) return\n authoredObjectCount += 1\n if (!isRenderable(object)) return\n renderableCount += 1\n if (!isEffectivelyVisible(object, scene.modelRoot)) return\n visibleRenderableCount += 1\n if (isSelectable(object)) selectableCount += 1\n const bounds = new Box3().setFromObject(object)\n if (!bounds.isEmpty() && finiteVector(bounds.min) && finiteVector(bounds.max)) {\n visibleBounds.push({object, bounds})\n }\n })\n issues.push(...runtimeRelationshipIssues(scene, sources))\n\n const emptyScene = authoredObjectCount === 0\n if (visibleRenderableCount === 0 || selectableCount === 0) {\n issues.push({\n code: 'NO_VISIBLE_AUTHORED_CONTENT',\n severity: emptyScene ? 'warning' : 'error',\n message: emptyScene\n ? 'The scene is empty; add authored content when you are ready.'\n : visibleRenderableCount === 0\n ? 'No visible renderable authored content exists beneath modelRoot.'\n : 'Visible authored renderables are not selectable.',\n })\n }\n\n const camera = scene.defaultCamera || scene.mainCamera\n const cameraSource = scene.defaultCamera ? 'scene.defaultCamera' : 'scene.mainCamera'\n const cameraResult = emptyScene\n ? {useful: false, framed: 0, inside: 0}\n : validateCamera(camera, cameraSource, visibleBounds, issues)\n const errors = issues.filter(({severity}) => severity === 'error')\n const relationshipsValid = !errors.some(({code}) =>\n code === 'MISSING_AUTHORING_SOURCE' || code === 'RUNTIME_SOURCE_DRIFT')\n const ok = errors.length === 0\n return {\n ok,\n status: ok ? 'pass' : 'fail',\n summary: ok ? 'Stopped-mode authored representation passed.' : `${errors.length} authoring check(s) failed.`,\n issues,\n checks: {\n visibleAuthoredContent: visibleRenderableCount > 0,\n selectableAuthoredContent: selectableCount > 0,\n relationshipsValid,\n cameraUseful: cameraResult.useful,\n },\n metrics: {\n authoredObjectCount,\n renderableCount,\n visibleRenderableCount,\n selectableCount,\n cameraFramedRenderableCount: cameraResult.framed,\n cameraInsideRenderableCount: cameraResult.inside,\n },\n }\n}\n\n/** Validate that Play-only content was removed and its authored sources stayed valid. */\nexport function runtimeCleanupReport(viewer: ViewerLike): RuntimeCleanupReport {\n const scene = viewer.scene as SceneLike\n if (!scene?.modelRoot) throw new Error('Runtime cleanup validation requires viewer.scene.modelRoot')\n scene.updateMatrixWorld(true)\n const issues = runtimeRelationshipIssues(scene, collectSources(scene.modelRoot))\n const tracked = getTrackedRuntimeObjects(scene)\n const leaked = new Set<IObject3D>()\n let outsideRenderableCount = 0\n\n for (const object of tracked) {\n if (!hasRuntimeAncestor(object, leaked)) leaked.add(object)\n }\n scene.traverse((object) => {\n if (object === scene || object === scene.modelRoot || isInside(object, scene.modelRoot) || isEditorObject(object, scene)) return\n if (isRenderable(object)) outsideRenderableCount += 1\n const runtimeRoot = nearestRuntimeRoot(object)\n if (runtimeRoot) {\n if (!hasRuntimeAncestor(runtimeRoot, leaked)) leaked.add(runtimeRoot)\n } else if (isRenderable(object)) {\n leaked.add(object)\n }\n })\n for (const object of leaked) {\n pushIssue(issues, {\n code: 'RUNTIME_OBJECT_AFTER_STOP',\n severity: 'error',\n message: getRuntimeObjectMetadata(object)\n ? 'A tracked runtime object remains after Stop.'\n : 'An unmarked renderable remains outside modelRoot after Stop.',\n object: objectEvidence(object),\n })\n }\n const ok = !issues.some(({severity}) => severity === 'error')\n return {\n ok,\n status: ok ? 'pass' : 'fail',\n summary: ok ? 'Runtime cleanup passed.' : `${issues.filter(({severity}) => severity === 'error').length} runtime cleanup check(s) failed.`,\n issues,\n trackedObjectCount: tracked.length,\n outsideRenderableCount,\n }\n}\n\n/** Capture the supported saved semantics without transient engine identities. */\nexport function semanticSceneSnapshot(source: ViewerLike | SceneLike): SemanticSceneSnapshot {\n const scene = 'scene' in source ? source.scene as SceneLike : source\n if (!scene?.modelRoot) throw new Error('A semantic snapshot requires scene.modelRoot')\n return {\n schemaVersion: 1,\n scene: scene.modelRoot.children\n .filter((object) => object.userData?.excludeFromExport !== true)\n .map((object) => serializeObject(object)),\n }\n}\n\n/** Compare names, transforms, component state, and authored source relationships. */\nexport function persistenceReport(before: unknown, after: unknown): PersistenceReport {\n const beforeValue = canonicalValue(toSemanticSnapshot(before))\n const afterValue = canonicalValue(toSemanticSnapshot(after))\n const beforeText = JSON.stringify(beforeValue)\n const afterText = JSON.stringify(afterValue)\n const changes: PersistenceChange[] = []\n compareValues(beforeValue, afterValue, '', changes)\n const issues: AuthoringValidationIssue[] = changes.map((change) => ({\n code: 'PERSISTENCE_DRIFT',\n severity: 'error',\n message: `Saved authoring semantics changed at ${change.path || '/'}.`,\n ...change,\n }))\n const ok = changes.length === 0\n return {\n ok,\n status: ok ? 'pass' : 'fail',\n summary: ok ? 'Save/Reload semantic equivalence passed.' : `${changes.length} persisted semantic difference(s) found.`,\n issues,\n changes,\n beforeBytes: beforeText.length,\n afterBytes: afterText.length,\n }\n}\n\nexport interface GameValidationResult {\n status: 'pass' | 'fail'\n summary: string\n checks?: Record<string, boolean | number | string>\n}\n\nexport interface GameValidationReport {\n ok: boolean\n status: 'pass' | 'fail'\n summary: string\n results: GameValidationResult[]\n}\n\nexport type GameValidationFunction = () => GameValidationResult | boolean | void | Promise<GameValidationResult | boolean | void>\n\ninterface GameHookHost {\n registerGameValidation(fn: GameValidationFunction): () => void\n publishGameTelemetry(value: object): () => void\n runGameValidation(): Promise<GameValidationReport>\n dispose(): void\n}\n\nlet activeGameHooks: GameHookHost | undefined\n\n/** Register a project-defined gameplay assertion for the currently starting game. */\nexport function registerGameValidation(fn: GameValidationFunction): () => void {\n if (!activeGameHooks) throw new Error('registerGameValidation must be called while createGame is active')\n return activeGameHooks.registerGameValidation(fn)\n}\n\n/** Publish an immutable telemetry snapshot on window.kite3dGame.telemetry. */\nexport function publishGameTelemetry(value: object): () => void {\n if (!activeGameHooks) throw new Error('publishGameTelemetry must be called while createGame is active')\n return activeGameHooks.publishGameTelemetry(value)\n}\n\n/** Install the per-createGame hook host before project modules are evaluated. */\nexport function installGameHooks(): GameHookHost {\n const validations = new Set<GameValidationFunction>()\n let telemetry: object | undefined\n let disposed = false\n const api = Object.freeze({\n get telemetry() { return telemetry },\n validate: () => host.runGameValidation(),\n })\n const host: GameHookHost = {\n registerGameValidation(fn) {\n if (disposed || typeof fn !== 'function') throw new Error('Game validation must be a function on an active game')\n validations.add(fn)\n return () => validations.delete(fn)\n },\n publishGameTelemetry(value) {\n if (disposed || !value || typeof value !== 'object' || Array.isArray(value)) {\n throw new Error('Game telemetry must be an object on an active game')\n }\n const published = immutableCopy(value)\n telemetry = published\n return () => {\n if (telemetry === published) telemetry = undefined\n }\n },\n async runGameValidation() {\n const results: GameValidationResult[] = []\n for (const validate of validations) {\n try {\n const result = await validate()\n if (result === undefined || result === true) {\n results.push({status: 'pass', summary: 'Project validation passed.'})\n } else if (result === false) {\n results.push({status: 'fail', summary: 'Project validation failed.'})\n } else if (result && ['pass', 'fail'].includes(result.status) && typeof result.summary === 'string') {\n results.push(result)\n } else {\n results.push({status: 'fail', summary: 'Project validation returned an invalid result.'})\n }\n } catch (error) {\n results.push({status: 'fail', summary: `Project validation threw: ${errorMessage(error)}`})\n }\n }\n const failed = results.filter(({status}) => status === 'fail')\n return {\n ok: failed.length === 0,\n status: failed.length ? 'fail' : 'pass',\n summary: failed.length ? failed.map(({summary}) => summary).join(' ') : 'Project validations passed.',\n results,\n }\n },\n dispose() {\n disposed = true\n validations.clear()\n telemetry = undefined\n if (activeGameHooks === host) activeGameHooks = undefined\n if (typeof window !== 'undefined' && window.kite3dGame === api) delete window.kite3dGame\n },\n }\n activeGameHooks?.dispose()\n activeGameHooks = host\n if (typeof window !== 'undefined') window.kite3dGame = api\n return host\n}\n\nfunction collectSources(modelRoot: IObject3D): Map<string, SourceRecord> {\n const sources = new Map<string, SourceRecord>()\n modelRoot.traverse((object) => {\n if (object === modelRoot) return\n const metadata = getAuthoringMetadata(object)\n if (metadata && !metadata.sourceId) sources.set(metadata.id, {object, metadata})\n else if (!metadata) sources.set(object.uuid, {object, metadata: {role: 'direct', id: object.uuid}})\n })\n return sources\n}\n\nfunction runtimeRelationshipIssues(scene: SceneLike, sources: Map<string, SourceRecord>): AuthoringValidationIssue[] {\n const issues: AuthoringValidationIssue[] = []\n scene.traverse((object) => {\n const metadata = getAuthoringMetadata(object)\n if (!metadata?.sourceId) return\n const source = sources.get(metadata.sourceId)\n if (!source) {\n pushIssue(issues, {\n code: 'MISSING_AUTHORING_SOURCE',\n severity: 'error',\n message: `Authored source \"${metadata.sourceId}\" is not present beneath modelRoot.`,\n object: objectEvidence(object),\n })\n return\n }\n const runtime = getRuntimeObjectMetadata(object)\n if (!runtime || runtime.kind === 'effect') return\n const overrides = new Set<RuntimeMutableProperty>(runtime.overrides || [])\n if (JSON.stringify(runtimeSignature(source.object, overrides)) !== JSON.stringify(runtimeSignature(object, overrides))) {\n pushIssue(issues, {\n code: 'RUNTIME_SOURCE_DRIFT',\n severity: 'error',\n message: 'A runtime copy differs from its authored source in a non-mutable field.',\n object: objectEvidence(object),\n })\n }\n })\n return issues\n}\n\nfunction validateCamera(\n camera: IObject3D | undefined,\n cameraSource: 'scene.defaultCamera' | 'scene.mainCamera',\n renderables: Array<{object: IObject3D, bounds: Box3}>,\n issues: AuthoringValidationIssue[],\n): {useful: boolean, framed: number, inside: number} {\n let framed = 0\n let inside = 0\n let facing = false\n const cameraLabel = `${cameraSource}${camera?.name ? ` \"${camera.name}\"` : ''}`\n let problem = `${cameraLabel} must be finite and face visible authored content.`\n const projectionMatrix = (camera as IObject3D & {projectionMatrix?: Matrix4, matrixWorldInverse?: Matrix4})?.projectionMatrix\n const matrixWorldInverse = (camera as IObject3D & {projectionMatrix?: Matrix4, matrixWorldInverse?: Matrix4})?.matrixWorldInverse\n if (camera && finiteVector(camera.position) && projectionMatrix && matrixWorldInverse && renderables.length) {\n camera.updateMatrixWorld(true)\n ;(camera as IObject3D & {updateProjectionMatrix?: () => void}).updateProjectionMatrix?.()\n const cameraPosition = camera.getWorldPosition(new Vector3())\n const totalBounds = new Box3().makeEmpty()\n for (const {bounds} of renderables) totalBounds.union(bounds)\n const center = totalBounds.getCenter(new Vector3())\n const direction = (camera as IObject3D & {getWorldDirection?: (target: Vector3) => Vector3}).getWorldDirection?.(new Vector3())\n const toward = center.clone().sub(cameraPosition)\n facing = !direction || toward.lengthSq() === 0 || direction.dot(toward.normalize()) > 0\n const frustum = new Frustum().setFromProjectionMatrix(new Matrix4().multiplyMatrices(projectionMatrix, matrixWorldInverse))\n framed = renderables.filter(({bounds}) => frustum.intersectsBox(bounds)).length\n\n for (const {object, bounds} of renderables) {\n if (cameraInsideAllowed(object) || !containsInteriorPoint(bounds, cameraPosition)) continue\n const mesh = object as IObject3D & {\n isMesh?: boolean\n isInstancedMesh?: boolean\n isSkinnedMesh?: boolean\n geometry?: {\n type?: string\n boundingBox?: Box3\n morphAttributes?: {position?: unknown[]}\n computeBoundingBox?(): void\n }\n }\n const geometry = mesh.geometry\n const deformed = mesh.isInstancedMesh || mesh.isSkinnedMesh || geometry?.morphAttributes?.position?.length\n if (!geometry || deformed || object.matrixWorld.determinant() === 0) {\n addContainmentWarning(issues, object)\n continue\n }\n geometry.computeBoundingBox?.()\n const localPosition = object.worldToLocal(cameraPosition.clone())\n if (!geometry.boundingBox || !containsInteriorPoint(geometry.boundingBox, localPosition)) continue\n if (mesh.isMesh && geometry.type === 'BoxGeometry') inside += 1\n else addContainmentWarning(issues, object)\n }\n if (inside) problem = `${cameraLabel} is inside ${inside} visible authored mesh(es).`\n else if (!framed) problem = `No visible authored renderable intersects ${cameraLabel}'s frustum.`\n else if (!facing) problem = `${cameraLabel} faces away from visible authored content.`\n }\n const useful = Boolean(camera && renderables.length && framed > 0 && inside === 0 && facing)\n if (!useful) issues.push({code: 'CAMERA_NOT_USEFUL', severity: 'error', message: problem})\n return {useful, framed, inside}\n}\n\nfunction containsInteriorPoint(bounds: Box3, point: Vector3): boolean {\n return point.x > bounds.min.x + CAMERA_BOUNDS_EPSILON\n && point.x < bounds.max.x - CAMERA_BOUNDS_EPSILON\n && point.y > bounds.min.y + CAMERA_BOUNDS_EPSILON\n && point.y < bounds.max.y - CAMERA_BOUNDS_EPSILON\n && point.z > bounds.min.z + CAMERA_BOUNDS_EPSILON\n && point.z < bounds.max.z - CAMERA_BOUNDS_EPSILON\n}\n\nfunction addContainmentWarning(issues: AuthoringValidationIssue[], object: IObject3D): void {\n pushIssue(issues, {\n code: 'CAMERA_CONTAINMENT_UNVERIFIED',\n severity: 'warning',\n message: 'The camera intersects local geometry bounds, but hollow or imported mesh containment is unverified.',\n object: objectEvidence(object),\n })\n}\n\nfunction runtimeSignature(object: IObject3D, overrides: Set<RuntimeMutableProperty>, root = true): unknown {\n const renderable = object as IObject3D & {geometry?: {parameters?: unknown}, material?: unknown | unknown[]}\n const result: Record<string, unknown> = {\n type: semanticType(object),\n geometry: canonicalValue(renderable.geometry?.parameters),\n children: object.children.map((child) => runtimeSignature(child, new Set(), false)),\n }\n if (!root || !overrides.has('visible')) result.visible = object.visible\n if (!root || !overrides.has('position')) result.position = vectorValue(object.position)\n if (!root || !overrides.has('rotation')) result.rotation = vectorValue(object.rotation)\n if (!root || !overrides.has('scale')) result.scale = vectorValue(object.scale)\n if (renderable.material && (!root || !overrides.has('material'))) {\n result.material = Array.isArray(renderable.material)\n ? renderable.material.map(materialValue)\n : materialValue(renderable.material)\n }\n return result\n}\n\nfunction materialValue(value: unknown): unknown {\n const material = value as {\n type?: string\n color?: {getHex?(): number}\n emissive?: {getHex?(): number}\n opacity?: number\n transparent?: boolean\n metalness?: number\n roughness?: number\n }\n return canonicalValue({\n type: material?.type,\n color: material?.color?.getHex?.(),\n emissive: material?.emissive?.getHex?.(),\n opacity: material?.opacity,\n transparent: material?.transparent,\n metalness: material?.metalness,\n roughness: material?.roughness,\n })\n}\n\nfunction serializeObject(object: IObject3D): unknown {\n const metadata = getAuthoringMetadata(object)\n return canonicalValue({\n name: object.name,\n type: semanticType(object),\n visible: object.visible,\n position: vectorValue(object.position),\n rotation: vectorValue(object.rotation),\n scale: vectorValue(object.scale),\n components: componentValues(object),\n ...(metadata ? {authoring: metadata} : {}),\n children: object.children\n .filter((child) => child.userData?.excludeFromExport !== true)\n .map((child) => serializeObject(child)),\n })\n}\n\nfunction componentValues(object: IObject3D): unknown[] {\n const live = EntityComponentPlugin.ObjectToComponents.get(object)\n if (live?.length) {\n return live.map((component) => {\n const definition = component.constructor as {ComponentType?: string, StateProperties?: Array<string | {name?: string, key?: string}>}\n const keys = (definition.StateProperties || []).map((property) =>\n typeof property === 'string' ? property : property.name || property.key).filter((key): key is string => Boolean(key))\n return canonicalValue({\n id: component.uuid,\n type: definition.ComponentType || component.constructor.name,\n state: Object.fromEntries(keys.map((key) => [key, semanticValue((component as unknown as Record<string, unknown>)[key])])),\n })\n }).sort(compareJson)\n }\n const saved = object.userData?.EntityComponentPlugin\n if (!isRecord(saved)) return []\n return Object.entries(saved).map(([id, value]) => {\n const component = isRecord(value) ? value : {}\n return canonicalValue({id, type: component.type, state: semanticValue(component.state)})\n }).sort(compareJson)\n}\n\nfunction toSemanticSnapshot(value: unknown): SemanticSceneSnapshot {\n if (typeof value === 'string') return toSemanticSnapshot(JSON.parse(value))\n if (value instanceof Uint8Array) return toSemanticSnapshot(JSON.parse(new TextDecoder().decode(value)))\n if (isRecord(value) && isRecord(value.document)) return gltfSemanticSnapshot(value.document)\n if (isRecord(value) && value.schemaVersion === 1 && Array.isArray(value.scene)) return value as unknown as SemanticSceneSnapshot\n if (isRecord(value) && isRecord(value.asset)) return gltfSemanticSnapshot(value)\n if (isRecord(value) && 'scene' in value) return semanticSceneSnapshot(value as unknown as ViewerLike)\n if (isRecord(value) && 'modelRoot' in value) return semanticSceneSnapshot(value as unknown as SceneLike)\n throw new Error('Persistence comparison requires a semantic snapshot, viewer, scene, or serialized glTF document')\n}\n\nfunction gltfSemanticSnapshot(document: Record<string, unknown>): SemanticSceneSnapshot {\n const nodes = Array.isArray(document.nodes) ? document.nodes : []\n const scenes = Array.isArray(document.scenes) ? document.scenes : []\n const sceneIndex = typeof document.scene === 'number' ? document.scene : 0\n const root = isRecord(scenes[sceneIndex]) ? scenes[sceneIndex] : {}\n const rootNodes = Array.isArray(root.nodes) ? root.nodes : []\n const visit = (index: unknown): unknown => {\n const node = typeof index === 'number' && isRecord(nodes[index]) ? nodes[index] : {}\n const extras = isRecord(node.extras) ? node.extras : {}\n const authoring = isRecord(extras[KITE3D_AUTHORING_METADATA_KEY]) ? extras[KITE3D_AUTHORING_METADATA_KEY] : undefined\n const savedComponents = isRecord(extras.EntityComponentPlugin) ? extras.EntityComponentPlugin : {}\n const components = Object.entries(savedComponents).map(([id, value]) => {\n const component = isRecord(value) ? value : {}\n return canonicalValue({id, type: component.type, state: semanticValue(component.state)})\n }).sort(compareJson)\n const translation = numericArray(node.translation, [0, 0, 0])\n const rotation = numericArray(node.rotation, [0, 0, 0, 1])\n const scale = numericArray(node.scale, [1, 1, 1])\n return canonicalValue({\n name: typeof node.name === 'string' ? node.name : '',\n type: typeof node.mesh === 'number' ? 'Mesh' : typeof node.camera === 'number' ? 'Camera' : 'Group',\n visible: extras.visible !== false,\n position: {x: translation[0], y: translation[1], z: translation[2]},\n quaternion: {x: rotation[0], y: rotation[1], z: rotation[2], w: rotation[3]},\n scale: {x: scale[0], y: scale[1], z: scale[2]},\n components,\n ...(authoring ? {authoring: semanticValue(authoring)} : {}),\n children: (Array.isArray(node.children) ? node.children : []).map(visit),\n })\n }\n return {schemaVersion: 1, scene: rootNodes.map(visit)}\n}\n\nfunction compareValues(left: unknown, right: unknown, path: string, changes: PersistenceChange[]): void {\n if (changes.length >= 50 || Object.is(left, right) || left === right) return\n if (!left || !right || typeof left !== 'object' || typeof right !== 'object'\n || Array.isArray(left) !== Array.isArray(right)) {\n changes.push({path: path || '/', before: left, after: right})\n return\n }\n if (Array.isArray(left) && Array.isArray(right)) {\n const length = Math.max(left.length, right.length)\n for (let index = 0; index < length; index += 1) {\n const named = objectName(left[index]) || objectName(right[index])\n compareValues(left[index], right[index], `${path}/${escapePointer(named || String(index))}`, changes)\n }\n return\n }\n const leftRecord = left as Record<string, unknown>\n const rightRecord = right as Record<string, unknown>\n const keys = [...new Set([...Object.keys(leftRecord), ...Object.keys(rightRecord)])].sort()\n for (const key of keys) compareValues(leftRecord[key], rightRecord[key], `${path}/${escapePointer(key)}`, changes)\n}\n\nfunction objectName(value: unknown): string | undefined {\n if (!isRecord(value) || typeof value.name !== 'string') return undefined\n return value.name || undefined\n}\n\nfunction semanticValue(value: unknown, seen = new WeakSet<object>(), depth = 0): unknown {\n if (typeof value === 'number') return normalizeNumber(value)\n if (value === null || typeof value === 'string' || typeof value === 'boolean') return value\n if (value === undefined || typeof value === 'function') return undefined\n if (Array.isArray(value)) return value.map((item) => semanticValue(item, seen, depth + 1))\n if (typeof value !== 'object' || depth > 5) return String(value)\n if (seen.has(value)) return '[Circular]'\n seen.add(value)\n const candidate = value as Record<string, unknown> & {isColor?: boolean, getHexString?(): string, toArray?(): unknown[]}\n if (candidate.isColor && candidate.getHexString) return `#${candidate.getHexString()}`\n if (candidate.toArray && /Vector|Euler|Quaternion/.test(value.constructor?.name || '')) {\n return candidate.toArray().map((item) => semanticValue(item, seen, depth + 1))\n }\n const result: Record<string, unknown> = {}\n for (const key of Object.keys(candidate).sort()) {\n if (key.startsWith('_') || ['id', 'uuid', 'uiConfig', 'object', 'ctx', 'body', 'world'].includes(key)) continue\n const normalized = semanticValue(candidate[key], seen, depth + 1)\n if (normalized !== undefined) result[key] = normalized\n }\n return result\n}\n\nfunction canonicalValue(value: unknown): unknown {\n if (typeof value === 'number') return normalizeNumber(value)\n if (Array.isArray(value)) return value.map(canonicalValue)\n if (!isRecord(value)) return value\n return Object.fromEntries(Object.keys(value).sort().flatMap((key) => {\n const child = canonicalValue(value[key])\n return child === undefined ? [] : [[key, child]]\n }))\n}\n\nfunction vectorValue(value: {x: number, y: number, z: number}): {x: number | null, y: number | null, z: number | null} {\n return {x: normalizeNumber(value.x), y: normalizeNumber(value.y), z: normalizeNumber(value.z)}\n}\n\nfunction normalizeNumber(value: number): number | null {\n if (!Number.isFinite(value)) return null\n const rounded = Math.round(value * 1_000_000) / 1_000_000\n return Object.is(rounded, -0) ? 0 : rounded\n}\n\nfunction numericArray(value: unknown, fallback: number[]): number[] {\n if (!Array.isArray(value) || value.some((item) => typeof item !== 'number')) return fallback\n return value.map((item) => normalizeNumber(item) ?? 0)\n}\n\nfunction immutableCopy<T extends object>(value: T): T {\n const copy = typeof structuredClone === 'function' ? structuredClone(value) : JSON.parse(JSON.stringify(value)) as T\n const freeze = (candidate: unknown): void => {\n if (!candidate || typeof candidate !== 'object' || Object.isFrozen(candidate)) return\n for (const child of Object.values(candidate)) freeze(child)\n Object.freeze(candidate)\n }\n freeze(copy)\n return copy\n}\n\nfunction pushIssue(issues: AuthoringValidationIssue[], issue: AuthoringValidationIssue): void {\n if (issues.some((candidate) => candidate.code === issue.code && candidate.object?.uuid === issue.object?.uuid\n && candidate.path === issue.path)) return\n issues.push(issue)\n}\n\nfunction objectEvidence(object: IObject3D): {uuid: string, name: string} {\n return {uuid: object.uuid, name: object.name || '(unnamed)'}\n}\n\nfunction isRenderable(object: IObject3D): boolean {\n const candidate = object as IObject3D & {isMesh?: boolean, isLine?: boolean, isPoints?: boolean, isSprite?: boolean}\n return Boolean(candidate.isMesh || candidate.isLine || candidate.isPoints || candidate.isSprite)\n}\n\nfunction isSelectable(object: IObject3D): boolean {\n return object.userData?.selectable !== false && !object.isWidget\n}\n\nfunction isEffectivelyVisible(object: IObject3D, modelRoot: IObject3D): boolean {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (!current.visible) return false\n if (current === modelRoot) return true\n }\n return false\n}\n\nfunction isInside(object: IObject3D, ancestor: IObject3D): boolean {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (current === ancestor) return true\n }\n return false\n}\n\nfunction isEditorObject(object: IObject3D, scene: SceneLike): boolean {\n if (object === scene.mainCamera || object === scene.defaultCamera) return true\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (current.isWidget) return true\n }\n return false\n}\n\nfunction nearestRuntimeRoot(object: IObject3D): IObject3D | undefined {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (getRuntimeObjectMetadata(current)) return current\n }\n return undefined\n}\n\nfunction hasRuntimeAncestor(object: IObject3D, candidates: Set<IObject3D>): boolean {\n for (let current = object.parent as IObject3D | null; current; current = current.parent as IObject3D | null) {\n if (candidates.has(current)) return true\n }\n return false\n}\n\nfunction cameraInsideAllowed(object: IObject3D): boolean {\n for (let current: IObject3D | null = object; current; current = current.parent as IObject3D | null) {\n if (getAuthoringMetadata(current)?.allowCameraInside) return true\n }\n return false\n}\n\nfunction finiteVector(value: {x: number, y: number, z: number}): boolean {\n return Number.isFinite(value.x) && Number.isFinite(value.y) && Number.isFinite(value.z)\n}\n\nfunction semanticType(object: IObject3D): string {\n const candidate = object as IObject3D & {isMesh?: boolean, isCamera?: boolean, isLight?: boolean}\n if (candidate.isMesh) return 'Mesh'\n if (candidate.isCamera) return 'Camera'\n if (candidate.isLight) return 'Light'\n return object.children.length ? 'Group' : object.type\n}\n\nfunction compareJson(left: unknown, right: unknown): number {\n return JSON.stringify(left).localeCompare(JSON.stringify(right))\n}\n\nfunction escapePointer(value: string): string {\n return value.replace(/~/g, '~0').replace(/\\//g, '~1')\n}\n\nfunction errorMessage(error: unknown): string {\n return error instanceof Error ? error.message : String(error)\n}\n\nfunction isRecord(value: unknown): value is Record<string, unknown> {\n return Boolean(value) && typeof value === 'object' && !Array.isArray(value)\n}\n\ndeclare global {\n interface Window {\n kite3dGame?: Readonly<{\n readonly telemetry: object | undefined\n validate(): Promise<GameValidationReport>\n }>\n }\n}\n"],"names":["CAMERA_BOUNDS_EPSILON","authoringQualityReport","viewer","scene","issues","sources","collectSources","visibleBounds","authoredObjectCount","renderableCount","visibleRenderableCount","selectableCount","object","isRenderable","isEffectivelyVisible","isSelectable","bounds","Box3","finiteVector","runtimeRelationshipIssues","emptyScene","camera","cameraSource","cameraResult","validateCamera","errors","severity","relationshipsValid","code","ok","runtimeCleanupReport","tracked","getTrackedRuntimeObjects","leaked","outsideRenderableCount","hasRuntimeAncestor","isInside","isEditorObject","runtimeRoot","nearestRuntimeRoot","pushIssue","getRuntimeObjectMetadata","objectEvidence","semanticSceneSnapshot","source","_a","serializeObject","persistenceReport","before","after","beforeValue","canonicalValue","toSemanticSnapshot","afterValue","beforeText","afterText","changes","compareValues","change","activeGameHooks","registerGameValidation","fn","publishGameTelemetry","value","installGameHooks","validations","telemetry","disposed","api","host","published","immutableCopy","results","validate","result","error","errorMessage","failed","status","summary","modelRoot","metadata","getAuthoringMetadata","runtime","overrides","runtimeSignature","renderables","framed","inside","facing","cameraLabel","problem","projectionMatrix","matrixWorldInverse","cameraPosition","Vector3","totalBounds","center","direction","_b","toward","frustum","Frustum","Matrix4","cameraInsideAllowed","containsInteriorPoint","mesh","geometry","deformed","_d","_c","addContainmentWarning","_e","localPosition","useful","point","root","renderable","semanticType","child","vectorValue","materialValue","material","componentValues","live","EntityComponentPlugin","component","definition","keys","property","key","semanticValue","compareJson","saved","isRecord","id","gltfSemanticSnapshot","document","nodes","scenes","sceneIndex","rootNodes","visit","index","node","extras","authoring","KITE3D_AUTHORING_METADATA_KEY","savedComponents","components","translation","numericArray","rotation","scale","left","right","path","length","named","objectName","escapePointer","leftRecord","rightRecord","seen","depth","normalizeNumber","item","candidate","normalized","rounded","fallback","copy","freeze","issue","current","ancestor","candidates"],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -7,9 +7,7 @@ export * from './paths.ts';
|
|
|
7
7
|
export * from './sceneSerialization.ts';
|
|
8
8
|
export * from './authoring.ts';
|
|
9
9
|
export * from './authoringValidation.ts';
|
|
10
|
-
export * from './generatorParams.ts';
|
|
11
10
|
export * from './plugins/HtmlUiComponent.ts';
|
|
12
|
-
export * from './plugins/GeneratorComponent.ts';
|
|
13
11
|
export * from './plugins/cannon/CannonPhysicsPlugin.ts';
|
|
14
12
|
export * from './plugins/cannon/Cannon3DBodyComponent.ts';
|
|
15
13
|
export * from './plugins/cannon/Cannon3DShapeComponent.ts';
|