@zephyr3d/editor 0.3.0 → 0.3.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/README.md +143 -0
- package/dist/assets/{index-BaUzUcND.js → index-IISR7uQv.js} +1 -1
- package/dist/assistant/zephyr-types-index.json +1 -1
- package/dist/index.html +2 -2
- package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
- package/dist/modules/zephyr3d_imgui.js +3 -3
- package/dist/modules/zephyr3d_imgui.js.map +1 -1
- package/dist/modules/zephyr3d_scene.js +1439 -1439
- package/dist/modules/zephyr3d_scene.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/bindgroup_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/buffer_webgpu.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/commandqueue.js.map +1 -1
- package/dist/vendor/zephyr3d/backend-webgpu/dist/uploadringbuffer.js.map +1 -1
- package/dist/vendor/zephyr3d/imgui/dist/imgui_impl.js.map +1 -1
- package/dist/vendor/zephyr3d/imgui/dist/renderer.js +3 -3
- package/dist/vendor/zephyr3d/imgui/dist/renderer.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js +135 -135
- package/dist/vendor/zephyr3d/scene/dist/animation/animationset.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/controller.js +146 -146
- package/dist/vendor/zephyr3d/scene/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/animation/spring/spring_system.js +75 -75
- package/dist/vendor/zephyr3d/scene/dist/animation/spring/spring_system.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/camera/camera.js +184 -184
- package/dist/vendor/zephyr3d/scene/dist/camera/camera.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/material/material.js +288 -288
- package/dist/vendor/zephyr3d/scene/dist/material/material.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/history_resource_manager.js +93 -93
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/history_resource_manager.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/history_resources.js +3 -3
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/history_resources.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/types.js +22 -22
- package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/types.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/blueprint/material/ir.js +489 -489
- package/dist/vendor/zephyr3d/scene/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/scene.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/types.js +4 -4
- package/dist/vendor/zephyr3d/scene/dist/utility/serialization/types.js.map +1 -1
- package/package.json +1 -1
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"terrain.js","sources":["../../../../src/utility/serialization/scene/terrain.ts"],"sourcesContent":["import type { GrassInstanceInfo } from '../../../scene';\nimport { GraphNode, type SceneNode } from '../../../scene';\nimport { defineProps, type SerializableClass } from '../types';\nimport { ClipmapTerrain } from '../../../scene/terrain-cm/terrain-cm';\nimport type { TerrainDebugMode } from '../../../material';\nimport type { Texture2D } from '@zephyr3d/device';\nimport type { Nullable, TypedArray, TypedArrayConstructor } from '@zephyr3d/base';\nimport type { ResourceManager } from '../manager';\nimport { JSONArray } from '../json';\nimport { getDevice } from '../../../app/api';\n\nfunction mergeTypedArrays<T extends TypedArray>(ctor: TypedArrayConstructor<T>, arrays: T[]): T {\n const totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0);\n const result = new ctor(totalLength);\n let offset = 0;\n for (const array of arrays) {\n result.set(array, offset);\n offset += array.length;\n }\n return result;\n}\n\nasync function getTerrainGrassContent(terrain: ClipmapTerrain): Promise<ArrayBuffer> {\n const grassRenderer = terrain.grassRenderer;\n const layerDatas: Uint8Array<ArrayBuffer>[] = [];\n let dataSize = 4 + 4 * grassRenderer.numLayers;\n for (let i = 0; i < grassRenderer.numLayers; i++) {\n const promises: Promise<Uint8Array<ArrayBuffer>>[] = [];\n const layer = grassRenderer.getLayer(i);\n const queue = [layer.quadtree];\n while (queue.length > 0) {\n const quadtreeNode = queue.shift()!;\n if (quadtreeNode.children) {\n queue.push(...quadtreeNode.children);\n }\n const grassInstances = quadtreeNode.grassInstances!;\n if (grassInstances.numInstances > 0) {\n const instanceBuffer = grassInstances.instanceBuffer;\n const P = instanceBuffer.getBufferSubData(null, 0, grassInstances.numInstances * 4 * 4);\n promises.push(P);\n }\n }\n if (promises.length > 0) {\n const data = await Promise.all(promises);\n const merged = mergeTypedArrays(Uint8Array, data) as Uint8Array<ArrayBuffer>;\n dataSize += merged.length;\n layerDatas.push(merged);\n } else {\n layerDatas.push(new Uint8Array());\n }\n }\n const data = new DataView(new ArrayBuffer(dataSize));\n const view = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\n let offset = 0;\n data.setUint32(offset, grassRenderer.numLayers, true);\n offset += 4;\n for (let i = 0; i < grassRenderer.numLayers; i++) {\n data.setUint32(offset, layerDatas[i].length, true);\n offset += 4;\n view.set(layerDatas[i], offset);\n offset += layerDatas[i].length;\n }\n return data.buffer;\n}\n\nasync function getTerrainHeightMapContent(terrain: ClipmapTerrain): Promise<ArrayBuffer> {\n const heightmap = terrain.heightMap!;\n const buffer = new ArrayBuffer(2 * 4 + heightmap.width * heightmap.height * 2);\n const head = new DataView(buffer);\n head.setUint32(0, heightmap.width, true);\n head.setUint32(4, heightmap.height, true);\n const data = new Uint16Array(buffer, 2 * 4);\n if (heightmap.format === 'r16f') {\n await heightmap.readPixels(0, 0, heightmap.width, heightmap.height, 0, 0, data);\n } else if (heightmap.format === 'rgba16f') {\n // WebGL1 uses rgba16f for height map, so we need to convert\n const tmpData = new Uint16Array(heightmap.width * heightmap.height * 4);\n await heightmap.readPixels(0, 0, heightmap.width, heightmap.height, 0, 0, tmpData);\n for (let i = 0; i < heightmap.width * heightmap.height; i++) {\n data[i] = tmpData[i * 4 + 0]; // Use the red channel as height\n }\n }\n return buffer;\n}\n\nasync function getTerrainSplatMapContent(terrain: ClipmapTerrain): Promise<ArrayBuffer> {\n const device = getDevice();\n const splatMap = terrain.splatMap!;\n const numLayers = (terrain.material!.numDetailMaps + 3) >> 2;\n const info = device.getDeviceCaps().textureCaps.getTextureFormatInfo(splatMap.format);\n const buffer = new ArrayBuffer(\n 3 * 4 + numLayers * splatMap.width * splatMap.height * info.blockWidth * info.blockHeight * info.size\n );\n const head = new DataView(buffer);\n head.setUint32(0, splatMap.width, true);\n head.setUint32(4, splatMap.height, true);\n head.setUint32(8, numLayers, true);\n for (let i = 0; i < numLayers; i++) {\n const layerData = new Uint8Array(\n buffer,\n 3 * 4 + i * splatMap.width * splatMap.height * info.blockWidth * info.blockHeight * info.size\n );\n await splatMap.readPixels(0, 0, splatMap.width, splatMap.height, 0, 0, layerData);\n }\n return buffer;\n}\n\n/** @internal */\nexport function getTerrainClass(manager: ResourceManager): SerializableClass {\n return {\n ctor: ClipmapTerrain,\n name: 'ClipmapTerrain',\n parent: GraphNode,\n createFunc(ctx: SceneNode, init: number) {\n const node = new ClipmapTerrain(ctx.scene!);\n node.numDetailMaps = init;\n node.parent = ctx;\n return { obj: node };\n },\n getInitParams(obj: ClipmapTerrain) {\n return obj.numDetailMaps;\n },\n getProps() {\n return defineProps([\n {\n name: 'Resolution',\n description: 'Terrain resolution',\n type: 'int2',\n default: [256, 256],\n options: { minValue: 1, maxValue: 4096 },\n get(this: ClipmapTerrain, value) {\n value.num[0] = this.sizeX;\n value.num[1] = this.sizeZ;\n },\n set(this: ClipmapTerrain, value) {\n this.setSize(value.num[0], value.num[1]);\n }\n },\n {\n name: 'CastShadow',\n description: 'If true, the terrain can cast shadows',\n type: 'bool',\n default: true,\n get(this: ClipmapTerrain, value) {\n value.bool[0] = this.castShadow;\n },\n set(this: ClipmapTerrain, value) {\n this.castShadow = value.bool[0];\n }\n },\n {\n name: 'Wireframe',\n description: 'If true, the terrain will be rendered as wireframe',\n type: 'bool',\n default: false,\n isPersistent() {\n return false;\n },\n get(this: ClipmapTerrain, value) {\n value.bool[0] = this.wireframe;\n },\n set(this: ClipmapTerrain, value) {\n this.wireframe = value.bool[0];\n }\n },\n {\n name: 'Debug',\n description: 'Debug visualization mode for the terrain material',\n type: 'string',\n options: {\n enum: {\n labels: ['None', 'UV', 'VertexNormal', 'DetailNormal', 'Tangent', 'Binormal', 'Albedo'],\n values: ['none', 'uv', 'vertex_normal', 'detail_normal', 'tangent', 'bitangent', 'albedo']\n }\n },\n default: 'none',\n isPersistent() {\n return false;\n },\n get(this: ClipmapTerrain, value) {\n value.str[0] = this.material!.debugMode;\n },\n set(this: ClipmapTerrain, value) {\n this.material!.debugMode = value.str[0] as TerrainDebugMode;\n }\n },\n {\n name: 'GrassMaps',\n description: 'Serialized grass texture layers and blade settings',\n type: 'object',\n default: null,\n options: { objectTypes: [JSONArray] },\n phase: 0,\n isNullable() {\n return true;\n },\n isHidden() {\n return false;\n },\n get(this: ClipmapTerrain, value) {\n const data: { texture: string; bladeWidth: number; bladeHeight: number }[] = [];\n const numLayers = this.grassRenderer.numLayers;\n for (let i = 0; i < numLayers; i++) {\n const grassTexture = this.grassRenderer.getGrassTexture(i);\n const assetId = grassTexture ? (manager.getAssetId(grassTexture) ?? '') : '';\n data.push({\n texture: assetId,\n bladeWidth: this.grassRenderer.getBladeWidth(i),\n bladeHeight: this.grassRenderer.getBladeHeight(i)\n });\n }\n value.object[0] = new JSONArray(null, data);\n },\n async set(this: ClipmapTerrain, value) {\n const json = value.object[0] as JSONArray;\n const data =\n (json?.data as {\n texture: string;\n bladeWidth: number;\n bladeHeight: number;\n }[]) ?? [];\n for (let i = 0; i < data.length; i++) {\n const info = data[i];\n const assetId = info.texture;\n let texture: Nullable<Texture2D> = null;\n if (assetId) {\n try {\n texture = await manager.fetchTexture<Texture2D>(assetId);\n } catch (err) {\n console.error(`Load asset failed: ${value.str[0]}: ${err}`);\n texture = null;\n }\n if (!texture?.isTexture2D()) {\n console.error('Invalid texture type');\n texture?.dispose();\n texture = null;\n }\n }\n this.grassRenderer.addLayer(info.bladeWidth ?? 1, info.bladeHeight ?? 1, texture!);\n }\n }\n },\n {\n name: 'DetailMaps',\n description: 'Serialized terrain detail texture layers',\n type: 'object',\n default: null,\n options: { objectTypes: [JSONArray] },\n isNullable() {\n return true;\n },\n isHidden() {\n return false;\n },\n get(this: ClipmapTerrain, value) {\n const data: { albedo: string; normal: string; roughness: number; uvscale: number }[] = [];\n const material = this.material!;\n for (let i = 0; i < material.numDetailMaps; i++) {\n data.push({\n albedo: manager.getAssetId(material.getDetailMap(i)) ?? '',\n normal: manager.getAssetId(material.getDetailNormalMap(i)) ?? '',\n roughness: material.getDetailMapRoughness(i),\n uvscale: material.getDetailMapUVScale(i)\n });\n }\n value.object[0] = new JSONArray(null, data);\n },\n async set(this: ClipmapTerrain, value) {\n const json = value.object[0] as JSONArray;\n if (!json) {\n this.material!.numDetailMaps = 0;\n return;\n }\n const data =\n (json.data as {\n albedo: string;\n normal: string;\n roughness: number;\n uvscale: number;\n }[]) ?? [];\n const material = this.material!;\n material.numDetailMaps = data.length;\n for (let i = 0; i < this.numDetailMaps; i++) {\n const info = data[i];\n if (!info?.albedo) {\n material.setDetailMap(i, null);\n } else {\n let tex: Nullable<Texture2D>;\n try {\n tex = await manager.fetchTexture<Texture2D>(info.albedo);\n } catch (err) {\n console.error(`Load asset failed: ${value.str[0]}: ${err}`);\n tex = null;\n }\n if (tex?.isTexture2D()) {\n material.setDetailMap(i, tex);\n } else {\n console.error('Invalid texture type');\n }\n }\n if (!info?.normal) {\n material.setDetailNormalMap(i, null);\n } else {\n let tex: Nullable<Texture2D>;\n try {\n tex = await manager.fetchTexture<Texture2D>(info.normal);\n } catch (err) {\n console.error(`Load asset failed: ${value.str[0]}: ${err}`);\n tex = null;\n }\n if (tex?.isTexture2D()) {\n material.setDetailMap(i, tex);\n } else {\n console.error('Invalid texture type');\n }\n }\n material.setDetailMapRoughness(i, info.roughness ?? 1);\n material.setDetailMapUVScale(i, info.uvscale ?? 100);\n }\n }\n },\n {\n name: 'SplatMap',\n description: 'Serialized splat-map texture data for terrain layers',\n type: 'embedded',\n default: null,\n isHidden() {\n return true;\n },\n get(this: ClipmapTerrain, value) {\n value.str[0] = this.splatMapAssetId;\n value.object[0] = getTerrainSplatMapContent(this);\n },\n async set(this: ClipmapTerrain, value) {\n if (value.str[0]) {\n const path = value.str[0];\n const data = (await manager.VFS.readFile(path, { encoding: 'binary' })) as ArrayBuffer;\n if (!data) {\n console.error('Load height map failed');\n return;\n }\n const dataView = new DataView(data);\n const width = dataView.getUint32(0, true);\n const height = dataView.getUint32(4, true);\n const numLayers = dataView.getUint32(8, true);\n const splatMap = this.splatMap!;\n if (splatMap.width !== width || splatMap.height !== height) {\n console.error('Invalid splatmap data');\n return;\n }\n for (let i = 0; i < numLayers; i++) {\n const content = new Uint8Array(data, 3 * 4 + i * width * height * 4, width * height * 4);\n splatMap.update(content, 0, 0, i, width, height, 1);\n }\n this.splatMapAssetId = value.str[0];\n }\n }\n },\n {\n name: 'Grass',\n description: 'Serialized grass instance data for the terrain',\n type: 'embedded',\n default: null,\n phase: 1,\n isHidden() {\n return true;\n },\n get(this: ClipmapTerrain, value) {\n value.str[0] = this.grassAssetId;\n value.object[0] = getTerrainGrassContent(this);\n },\n async set(this: ClipmapTerrain, value) {\n if (value.str[0]) {\n const path = value.str[0];\n const data = (await manager.VFS.readFile(path, { encoding: 'binary' })) as ArrayBuffer;\n if (!data) {\n console.error('Load grass data failed');\n return;\n }\n const dataView = new DataView(data);\n let offset = 0;\n const numLayers = dataView.getUint32(offset, true);\n if (numLayers !== this.grassRenderer.numLayers) {\n console.error('Number of grass layers mismatch');\n return;\n }\n offset += 4;\n for (let i = 0; i < numLayers; i++) {\n const dataSize = dataView.getUint32(offset, true);\n offset += 4;\n if (dataSize > 0) {\n const data = new Float32Array(dataView.buffer, dataView.byteOffset + offset, dataSize >> 2);\n const numInstances = data.length >> 2;\n const instances: GrassInstanceInfo[] = [];\n for (let i = 0; i < numInstances; i++) {\n instances.push({\n x: data[i * 4 + 0],\n y: data[i * 4 + 1],\n angle: Math.atan2(data[i * 4 + 2], data[i * 4 + 3])\n });\n }\n this.grassRenderer.addInstances(i, instances);\n offset += dataSize;\n }\n }\n this.grassAssetId = value.str[0];\n }\n }\n },\n {\n name: 'HeightMap',\n description: 'Serialized terrain height map data',\n type: 'embedded',\n default: null,\n isHidden() {\n return true;\n },\n get(this: ClipmapTerrain, value) {\n value.str[0] = this.heightMapAssetId;\n value.object[0] = getTerrainHeightMapContent(this);\n },\n async set(this: ClipmapTerrain, value) {\n if (value.str[0]) {\n const path = value.str[0];\n const data = (await manager.VFS.readFile(path, { encoding: 'binary' })) as ArrayBuffer;\n if (!data) {\n console.error('Load height map failed');\n return;\n }\n const dataView = new DataView(data);\n const width = dataView.getUint32(0, true);\n const height = dataView.getUint32(4, true);\n const heightMap = this.createHeightMapTexture(width, height)!;\n if (heightMap.format !== 'r16f') {\n if (heightMap.format === 'rgba16f') {\n // WebGL1 uses rgba16f for height map, so we need to convert\n const rgbaData = new Uint16Array(width * height * 4);\n const rData = new Uint16Array(data, 8);\n for (let i = 0; i < width * height; i++) {\n rgbaData[i * 4 + 0] = rData[i];\n }\n heightMap.update(rgbaData, 0, 0, width, height);\n } else {\n throw new Error(`Unsupported height map format: ${heightMap.format}`);\n }\n } else {\n heightMap.update(new Uint16Array(data, 8), 0, 0, width, height);\n }\n this.heightMap = heightMap;\n this.heightMapAssetId = value.str[0];\n this.updateBoundingBox();\n }\n }\n }\n ]);\n }\n };\n}\n"],"names":["mergeTypedArrays","ctor","arrays","totalLength","reduce","acc","arr","length","result","offset","array","set","getTerrainGrassContent","terrain","grassRenderer","layerDatas","dataSize","numLayers","i","promises","layer","getLayer","queue","quadtree","quadtreeNode","shift","children","push","grassInstances","numInstances","instanceBuffer","P","getBufferSubData","data","Promise","all","merged","Uint8Array","DataView","ArrayBuffer","view","buffer","byteOffset","byteLength","setUint32","getTerrainHeightMapContent","heightmap","heightMap","width","height","head","Uint16Array","format","readPixels","tmpData","getTerrainSplatMapContent","device","getDevice","splatMap","material","numDetailMaps","info","getDeviceCaps","textureCaps","getTextureFormatInfo","blockWidth","blockHeight","size","layerData","getTerrainClass","manager","ClipmapTerrain","name","parent","GraphNode","createFunc","ctx","init","node","scene","obj","getInitParams","getProps","defineProps","description","type","default","options","minValue","maxValue","get","value","num","sizeX","sizeZ","setSize","bool","castShadow","isPersistent","wireframe","enum","labels","values","str","debugMode","objectTypes","JSONArray","phase","isNullable","isHidden","grassTexture","getGrassTexture","assetId","getAssetId","texture","bladeWidth","getBladeWidth","bladeHeight","getBladeHeight","object","json","fetchTexture","err","console","error","isTexture2D","dispose","addLayer","albedo","getDetailMap","normal","getDetailNormalMap","roughness","getDetailMapRoughness","uvscale","getDetailMapUVScale","setDetailMap","tex","setDetailNormalMap","setDetailMapRoughness","setDetailMapUVScale","splatMapAssetId","path","VFS","readFile","encoding","dataView","getUint32","content","update","grassAssetId","Float32Array","instances","x","y","angle","Math","atan2","addInstances","heightMapAssetId","createHeightMapTexture","rgbaData","rData","Error","updateBoundingBox"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAWA,SAASA,gBAAAA,CAAuCC,IAA8B,EAAEC,MAAW,EAAA;IACzF,MAAMC,WAAAA,GAAcD,MAAOE,CAAAA,MAAM,CAAC,CAACC,KAAKC,GAAQD,GAAAA,GAAAA,GAAMC,GAAIC,CAAAA,MAAM,EAAE,CAAA,CAAA;IAClE,MAAMC,MAAAA,GAAS,IAAIP,IAAKE,CAAAA,WAAAA,CAAAA;AACxB,IAAA,IAAIM,MAAS,GAAA,CAAA;IACb,KAAK,MAAMC,SAASR,MAAQ,CAAA;QAC1BM,MAAOG,CAAAA,GAAG,CAACD,KAAOD,EAAAA,MAAAA,CAAAA;AAClBA,QAAAA,MAAAA,IAAUC,MAAMH,MAAM;AACxB;IACA,OAAOC,MAAAA;AACT;AAEA,eAAeI,uBAAuBC,OAAuB,EAAA;IAC3D,MAAMC,aAAAA,GAAgBD,QAAQC,aAAa;AAC3C,IAAA,MAAMC,aAAwC,EAAE;AAChD,IAAA,IAAIC,QAAW,GAAA,CAAA,GAAI,CAAIF,GAAAA,aAAAA,CAAcG,SAAS;AAC9C,IAAA,IAAK,IAAIC,CAAI,GAAA,CAAA,EAAGA,IAAIJ,aAAcG,CAAAA,SAAS,EAAEC,CAAK,EAAA,CAAA;AAChD,QAAA,MAAMC,WAA+C,EAAE;QACvD,MAAMC,KAAAA,GAAQN,aAAcO,CAAAA,QAAQ,CAACH,CAAAA,CAAAA;AACrC,QAAA,MAAMI,KAAQ,GAAA;AAACF,YAAAA,KAAAA,CAAMG;AAAS,SAAA;QAC9B,MAAOD,KAAAA,CAAMf,MAAM,GAAG,CAAG,CAAA;YACvB,MAAMiB,YAAAA,GAAeF,MAAMG,KAAK,EAAA;YAChC,IAAID,YAAAA,CAAaE,QAAQ,EAAE;gBACzBJ,KAAMK,CAAAA,IAAI,CAAIH,GAAAA,YAAAA,CAAaE,QAAQ,CAAA;AACrC;YACA,MAAME,cAAAA,GAAiBJ,aAAaI,cAAc;YAClD,IAAIA,cAAAA,CAAeC,YAAY,GAAG,CAAG,EAAA;gBACnC,MAAMC,cAAAA,GAAiBF,eAAeE,cAAc;gBACpD,MAAMC,CAAAA,GAAID,eAAeE,gBAAgB,CAAC,MAAM,CAAGJ,EAAAA,cAAAA,CAAeC,YAAY,GAAG,CAAI,GAAA,CAAA,CAAA;AACrFV,gBAAAA,QAAAA,CAASQ,IAAI,CAACI,CAAAA,CAAAA;AAChB;AACF;QACA,IAAIZ,QAAAA,CAASZ,MAAM,GAAG,CAAG,EAAA;AACvB,YAAA,MAAM0B,IAAO,GAAA,MAAMC,OAAQC,CAAAA,GAAG,CAAChB,QAAAA,CAAAA;YAC/B,MAAMiB,MAAAA,GAASpC,iBAAiBqC,UAAYJ,EAAAA,IAAAA,CAAAA;AAC5CjB,YAAAA,QAAAA,IAAYoB,OAAO7B,MAAM;AACzBQ,YAAAA,UAAAA,CAAWY,IAAI,CAACS,MAAAA,CAAAA;SACX,MAAA;YACLrB,UAAWY,CAAAA,IAAI,CAAC,IAAIU,UAAAA,EAAAA,CAAAA;AACtB;AACF;AACA,IAAA,MAAMJ,IAAO,GAAA,IAAIK,QAAS,CAAA,IAAIC,WAAYvB,CAAAA,QAAAA,CAAAA,CAAAA;IAC1C,MAAMwB,IAAAA,GAAO,IAAIH,UAAAA,CAAWJ,IAAKQ,CAAAA,MAAM,EAAER,IAAKS,CAAAA,UAAU,EAAET,IAAAA,CAAKU,UAAU,CAAA;AACzE,IAAA,IAAIlC,MAAS,GAAA,CAAA;AACbwB,IAAAA,IAAAA,CAAKW,SAAS,CAACnC,MAAQK,EAAAA,aAAAA,CAAcG,SAAS,EAAE,IAAA,CAAA;IAChDR,MAAU,IAAA,CAAA;AACV,IAAA,IAAK,IAAIS,CAAI,GAAA,CAAA,EAAGA,IAAIJ,aAAcG,CAAAA,SAAS,EAAEC,CAAK,EAAA,CAAA;QAChDe,IAAKW,CAAAA,SAAS,CAACnC,MAAQM,EAAAA,UAAU,CAACG,CAAE,CAAA,CAACX,MAAM,EAAE,IAAA,CAAA;QAC7CE,MAAU,IAAA,CAAA;AACV+B,QAAAA,IAAAA,CAAK7B,GAAG,CAACI,UAAU,CAACG,EAAE,EAAET,MAAAA,CAAAA;AACxBA,QAAAA,MAAAA,IAAUM,UAAU,CAACG,CAAE,CAAA,CAACX,MAAM;AAChC;AACA,IAAA,OAAO0B,KAAKQ,MAAM;AACpB;AAEA,eAAeI,2BAA2BhC,OAAuB,EAAA;IAC/D,MAAMiC,SAAAA,GAAYjC,QAAQkC,SAAS;IACnC,MAAMN,MAAAA,GAAS,IAAIF,WAAAA,CAAY,CAAI,GAAA,CAAA,GAAIO,UAAUE,KAAK,GAAGF,SAAUG,CAAAA,MAAM,GAAG,CAAA,CAAA;IAC5E,MAAMC,IAAAA,GAAO,IAAIZ,QAASG,CAAAA,MAAAA,CAAAA;AAC1BS,IAAAA,IAAAA,CAAKN,SAAS,CAAC,CAAGE,EAAAA,SAAAA,CAAUE,KAAK,EAAE,IAAA,CAAA;AACnCE,IAAAA,IAAAA,CAAKN,SAAS,CAAC,CAAGE,EAAAA,SAAAA,CAAUG,MAAM,EAAE,IAAA,CAAA;AACpC,IAAA,MAAMhB,IAAO,GAAA,IAAIkB,WAAYV,CAAAA,MAAAA,EAAQ,CAAI,GAAA,CAAA,CAAA;IACzC,IAAIK,SAAAA,CAAUM,MAAM,KAAK,MAAQ,EAAA;AAC/B,QAAA,MAAMN,SAAUO,CAAAA,UAAU,CAAC,CAAA,EAAG,CAAGP,EAAAA,SAAAA,CAAUE,KAAK,EAAEF,SAAUG,CAAAA,MAAM,EAAE,CAAA,EAAG,CAAGhB,EAAAA,IAAAA,CAAAA;AAC5E,KAAA,MAAO,IAAIa,SAAAA,CAAUM,MAAM,KAAK,SAAW,EAAA;;QAEzC,MAAME,OAAAA,GAAU,IAAIH,WAAYL,CAAAA,SAAAA,CAAUE,KAAK,GAAGF,SAAAA,CAAUG,MAAM,GAAG,CAAA,CAAA;AACrE,QAAA,MAAMH,SAAUO,CAAAA,UAAU,CAAC,CAAA,EAAG,CAAGP,EAAAA,SAAAA,CAAUE,KAAK,EAAEF,SAAUG,CAAAA,MAAM,EAAE,CAAA,EAAG,CAAGK,EAAAA,OAAAA,CAAAA;QAC1E,IAAK,IAAIpC,CAAI,GAAA,CAAA,EAAGA,CAAI4B,GAAAA,SAAAA,CAAUE,KAAK,GAAGF,SAAAA,CAAUG,MAAM,EAAE/B,CAAK,EAAA,CAAA;YAC3De,IAAI,CAACf,EAAE,GAAGoC,OAAO,CAACpC,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA,CAAA;AAC9B;AACF;IACA,OAAOuB,MAAAA;AACT;AAEA,eAAec,0BAA0B1C,OAAuB,EAAA;AAC9D,IAAA,MAAM2C,MAASC,GAAAA,SAAAA,EAAAA;IACf,MAAMC,QAAAA,GAAW7C,QAAQ6C,QAAQ;AACjC,IAAA,MAAMzC,YAAY,OAACJ,CAAQ8C,QAAQ,CAAEC,aAAa,GAAG,CAAM,IAAA,CAAA;IAC3D,MAAMC,IAAAA,GAAOL,OAAOM,aAAa,EAAA,CAAGC,WAAW,CAACC,oBAAoB,CAACN,QAAAA,CAASN,MAAM,CAAA;AACpF,IAAA,MAAMX,SAAS,IAAIF,WAAAA,CACjB,IAAI,CAAItB,GAAAA,SAAAA,GAAYyC,SAASV,KAAK,GAAGU,SAAST,MAAM,GAAGY,KAAKI,UAAU,GAAGJ,KAAKK,WAAW,GAAGL,KAAKM,IAAI,CAAA;IAEvG,MAAMjB,IAAAA,GAAO,IAAIZ,QAASG,CAAAA,MAAAA,CAAAA;AAC1BS,IAAAA,IAAAA,CAAKN,SAAS,CAAC,CAAGc,EAAAA,QAAAA,CAASV,KAAK,EAAE,IAAA,CAAA;AAClCE,IAAAA,IAAAA,CAAKN,SAAS,CAAC,CAAGc,EAAAA,QAAAA,CAAST,MAAM,EAAE,IAAA,CAAA;IACnCC,IAAKN,CAAAA,SAAS,CAAC,CAAA,EAAG3B,SAAW,EAAA,IAAA,CAAA;AAC7B,IAAA,IAAK,IAAIC,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAID,WAAWC,CAAK,EAAA,CAAA;QAClC,MAAMkD,SAAAA,GAAY,IAAI/B,UACpBI,CAAAA,MAAAA,EACA,IAAI,CAAIvB,GAAAA,CAAAA,GAAIwC,SAASV,KAAK,GAAGU,SAAST,MAAM,GAAGY,KAAKI,UAAU,GAAGJ,KAAKK,WAAW,GAAGL,KAAKM,IAAI,CAAA;AAE/F,QAAA,MAAMT,QAASL,CAAAA,UAAU,CAAC,CAAA,EAAG,CAAGK,EAAAA,QAAAA,CAASV,KAAK,EAAEU,QAAST,CAAAA,MAAM,EAAE,CAAA,EAAG,CAAGmB,EAAAA,SAAAA,CAAAA;AACzE;IACA,OAAO3B,MAAAA;AACT;AAEA,iBACO,SAAS4B,eAAAA,CAAgBC,OAAwB,EAAA;IACtD,OAAO;QACLrE,IAAMsE,EAAAA,cAAAA;QACNC,IAAM,EAAA,gBAAA;QACNC,MAAQC,EAAAA,SAAAA;QACRC,UAAWC,CAAAA,CAAAA,GAAc,EAAEC,IAAY,EAAA;AACrC,YAAA,MAAMC,IAAO,GAAA,IAAIP,cAAeK,CAAAA,GAAAA,CAAIG,KAAK,CAAA;AACzCD,YAAAA,IAAAA,CAAKlB,aAAa,GAAGiB,IAAAA;AACrBC,YAAAA,IAAAA,CAAKL,MAAM,GAAGG,GAAAA;YACd,OAAO;gBAAEI,GAAKF,EAAAA;AAAK,aAAA;AACrB,SAAA;AACAG,QAAAA,aAAAA,CAAAA,CAAcD,GAAmB,EAAA;AAC/B,YAAA,OAAOA,IAAIpB,aAAa;AAC1B,SAAA;AACAsB,QAAAA,QAAAA,CAAAA,GAAAA;AACE,YAAA,OAAOC,WAAY,CAAA;AACjB,gBAAA;oBACEX,IAAM,EAAA,YAAA;oBACNY,WAAa,EAAA,oBAAA;oBACbC,IAAM,EAAA,MAAA;oBACNC,OAAS,EAAA;AAAC,wBAAA,GAAA;AAAK,wBAAA;AAAI,qBAAA;oBACnBC,OAAS,EAAA;wBAAEC,QAAU,EAAA,CAAA;wBAAGC,QAAU,EAAA;AAAK,qBAAA;AACvCC,oBAAAA,GAAAA,CAAAA,CAA0BC,KAAK,EAAA;AAC7BA,wBAAAA,KAAAA,CAAMC,GAAG,CAAC,CAAA,CAAE,GAAG,IAAI,CAACC,KAAK;AACzBF,wBAAAA,KAAAA,CAAMC,GAAG,CAAC,CAAA,CAAE,GAAG,IAAI,CAACE,KAAK;AAC3B,qBAAA;AACAnF,oBAAAA,GAAAA,CAAAA,CAA0BgF,KAAK,EAAA;wBAC7B,IAAI,CAACI,OAAO,CAACJ,KAAMC,CAAAA,GAAG,CAAC,CAAA,CAAE,EAAED,KAAAA,CAAMC,GAAG,CAAC,CAAE,CAAA,CAAA;AACzC;AACF,iBAAA;AACA,gBAAA;oBACEpB,IAAM,EAAA,YAAA;oBACNY,WAAa,EAAA,uCAAA;oBACbC,IAAM,EAAA,MAAA;oBACNC,OAAS,EAAA,IAAA;AACTI,oBAAAA,GAAAA,CAAAA,CAA0BC,KAAK,EAAA;AAC7BA,wBAAAA,KAAAA,CAAMK,IAAI,CAAC,CAAA,CAAE,GAAG,IAAI,CAACC,UAAU;AACjC,qBAAA;AACAtF,oBAAAA,GAAAA,CAAAA,CAA0BgF,KAAK,EAAA;AAC7B,wBAAA,IAAI,CAACM,UAAU,GAAGN,KAAMK,CAAAA,IAAI,CAAC,CAAE,CAAA;AACjC;AACF,iBAAA;AACA,gBAAA;oBACExB,IAAM,EAAA,WAAA;oBACNY,WAAa,EAAA,oDAAA;oBACbC,IAAM,EAAA,MAAA;oBACNC,OAAS,EAAA,KAAA;AACTY,oBAAAA,YAAAA,CAAAA,GAAAA;wBACE,OAAO,KAAA;AACT,qBAAA;AACAR,oBAAAA,GAAAA,CAAAA,CAA0BC,KAAK,EAAA;AAC7BA,wBAAAA,KAAAA,CAAMK,IAAI,CAAC,CAAA,CAAE,GAAG,IAAI,CAACG,SAAS;AAChC,qBAAA;AACAxF,oBAAAA,GAAAA,CAAAA,CAA0BgF,KAAK,EAAA;AAC7B,wBAAA,IAAI,CAACQ,SAAS,GAAGR,KAAMK,CAAAA,IAAI,CAAC,CAAE,CAAA;AAChC;AACF,iBAAA;AACA,gBAAA;oBACExB,IAAM,EAAA,OAAA;oBACNY,WAAa,EAAA,mDAAA;oBACbC,IAAM,EAAA,QAAA;oBACNE,OAAS,EAAA;wBACPa,IAAM,EAAA;4BACJC,MAAQ,EAAA;AAAC,gCAAA,MAAA;AAAQ,gCAAA,IAAA;AAAM,gCAAA,cAAA;AAAgB,gCAAA,cAAA;AAAgB,gCAAA,SAAA;AAAW,gCAAA,UAAA;AAAY,gCAAA;AAAS,6BAAA;4BACvFC,MAAQ,EAAA;AAAC,gCAAA,MAAA;AAAQ,gCAAA,IAAA;AAAM,gCAAA,eAAA;AAAiB,gCAAA,eAAA;AAAiB,gCAAA,SAAA;AAAW,gCAAA,WAAA;AAAa,gCAAA;AAAS;AAC5F;AACF,qBAAA;oBACAhB,OAAS,EAAA,MAAA;AACTY,oBAAAA,YAAAA,CAAAA,GAAAA;wBACE,OAAO,KAAA;AACT,qBAAA;AACAR,oBAAAA,GAAAA,CAAAA,CAA0BC,KAAK,EAAA;wBAC7BA,KAAMY,CAAAA,GAAG,CAAC,CAAE,CAAA,GAAG,IAAI,CAAC5C,QAAQ,CAAE6C,SAAS;AACzC,qBAAA;AACA7F,oBAAAA,GAAAA,CAAAA,CAA0BgF,KAAK,EAAA;wBAC7B,IAAI,CAAChC,QAAQ,CAAE6C,SAAS,GAAGb,KAAMY,CAAAA,GAAG,CAAC,CAAE,CAAA;AACzC;AACF,iBAAA;AACA,gBAAA;oBACE/B,IAAM,EAAA,WAAA;oBACNY,WAAa,EAAA,oDAAA;oBACbC,IAAM,EAAA,QAAA;oBACNC,OAAS,EAAA,IAAA;oBACTC,OAAS,EAAA;wBAAEkB,WAAa,EAAA;AAACC,4BAAAA;AAAU;AAAC,qBAAA;oBACpCC,KAAO,EAAA,CAAA;AACPC,oBAAAA,UAAAA,CAAAA,GAAAA;wBACE,OAAO,IAAA;AACT,qBAAA;AACAC,oBAAAA,QAAAA,CAAAA,GAAAA;wBACE,OAAO,KAAA;AACT,qBAAA;AACAnB,oBAAAA,GAAAA,CAAAA,CAA0BC,KAAK,EAAA;AAC7B,wBAAA,MAAM1D,OAAuE,EAAE;AAC/E,wBAAA,MAAMhB,SAAY,GAAA,IAAI,CAACH,aAAa,CAACG,SAAS;AAC9C,wBAAA,IAAK,IAAIC,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAID,WAAWC,CAAK,EAAA,CAAA;AAClC,4BAAA,MAAM4F,eAAe,IAAI,CAAChG,aAAa,CAACiG,eAAe,CAAC7F,CAAAA,CAAAA;AACxD,4BAAA,MAAM8F,UAAUF,YAAgBxC,GAAAA,OAAAA,CAAQ2C,UAAU,CAACH,iBAAiB,EAAM,GAAA,EAAA;AAC1E7E,4BAAAA,IAAAA,CAAKN,IAAI,CAAC;gCACRuF,OAASF,EAAAA,OAAAA;AACTG,gCAAAA,UAAAA,EAAY,IAAI,CAACrG,aAAa,CAACsG,aAAa,CAAClG,CAAAA,CAAAA;AAC7CmG,gCAAAA,WAAAA,EAAa,IAAI,CAACvG,aAAa,CAACwG,cAAc,CAACpG,CAAAA;AACjD,6BAAA,CAAA;AACF;AACAyE,wBAAAA,KAAAA,CAAM4B,MAAM,CAAC,CAAA,CAAE,GAAG,IAAIb,UAAU,IAAMzE,EAAAA,IAAAA,CAAAA;AACxC,qBAAA;AACA,oBAAA,MAAMtB,KAA0BgF,KAAK,EAAA;AACnC,wBAAA,MAAM6B,IAAO7B,GAAAA,KAAAA,CAAM4B,MAAM,CAAC,CAAE,CAAA;AAC5B,wBAAA,MAAMtF,IACJ,GAACuF,IAAMvF,EAAAA,IAAAA,IAIC,EAAE;AACZ,wBAAA,IAAK,IAAIf,CAAI,GAAA,CAAA,EAAGA,IAAIe,IAAK1B,CAAAA,MAAM,EAAEW,CAAK,EAAA,CAAA;4BACpC,MAAM2C,IAAAA,GAAO5B,IAAI,CAACf,CAAE,CAAA;4BACpB,MAAM8F,OAAAA,GAAUnD,KAAKqD,OAAO;AAC5B,4BAAA,IAAIA,OAA+B,GAAA,IAAA;AACnC,4BAAA,IAAIF,OAAS,EAAA;gCACX,IAAI;oCACFE,OAAU,GAAA,MAAM5C,OAAQmD,CAAAA,YAAY,CAAYT,OAAAA,CAAAA;AAClD,iCAAA,CAAE,OAAOU,GAAK,EAAA;AACZC,oCAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,mBAAmB,EAAEjC,KAAAA,CAAMY,GAAG,CAAC,CAAE,CAAA,CAAC,EAAE,EAAEmB,GAAK,CAAA,CAAA,CAAA;oCAC1DR,OAAU,GAAA,IAAA;AACZ;gCACA,IAAI,CAACA,SAASW,WAAe,EAAA,EAAA;AAC3BF,oCAAAA,OAAAA,CAAQC,KAAK,CAAC,sBAAA,CAAA;oCACdV,OAASY,EAAAA,OAAAA,EAAAA;oCACTZ,OAAU,GAAA,IAAA;AACZ;AACF;AACA,4BAAA,IAAI,CAACpG,aAAa,CAACiH,QAAQ,CAAClE,IAAAA,CAAKsD,UAAU,IAAI,CAAGtD,EAAAA,IAAAA,CAAKwD,WAAW,IAAI,CAAGH,EAAAA,OAAAA,CAAAA;AAC3E;AACF;AACF,iBAAA;AACA,gBAAA;oBACE1C,IAAM,EAAA,YAAA;oBACNY,WAAa,EAAA,0CAAA;oBACbC,IAAM,EAAA,QAAA;oBACNC,OAAS,EAAA,IAAA;oBACTC,OAAS,EAAA;wBAAEkB,WAAa,EAAA;AAACC,4BAAAA;AAAU;AAAC,qBAAA;AACpCE,oBAAAA,UAAAA,CAAAA,GAAAA;wBACE,OAAO,IAAA;AACT,qBAAA;AACAC,oBAAAA,QAAAA,CAAAA,GAAAA;wBACE,OAAO,KAAA;AACT,qBAAA;AACAnB,oBAAAA,GAAAA,CAAAA,CAA0BC,KAAK,EAAA;AAC7B,wBAAA,MAAM1D,OAAiF,EAAE;wBACzF,MAAM0B,QAAAA,GAAW,IAAI,CAACA,QAAQ;AAC9B,wBAAA,IAAK,IAAIzC,CAAI,GAAA,CAAA,EAAGA,IAAIyC,QAASC,CAAAA,aAAa,EAAE1C,CAAK,EAAA,CAAA;AAC/Ce,4BAAAA,IAAAA,CAAKN,IAAI,CAAC;AACRqG,gCAAAA,MAAAA,EAAQ1D,QAAQ2C,UAAU,CAACtD,QAASsE,CAAAA,YAAY,CAAC/G,CAAO,CAAA,CAAA,IAAA,EAAA;AACxDgH,gCAAAA,MAAAA,EAAQ5D,QAAQ2C,UAAU,CAACtD,QAASwE,CAAAA,kBAAkB,CAACjH,CAAO,CAAA,CAAA,IAAA,EAAA;gCAC9DkH,SAAWzE,EAAAA,QAAAA,CAAS0E,qBAAqB,CAACnH,CAAAA,CAAAA;gCAC1CoH,OAAS3E,EAAAA,QAAAA,CAAS4E,mBAAmB,CAACrH,CAAAA;AACxC,6BAAA,CAAA;AACF;AACAyE,wBAAAA,KAAAA,CAAM4B,MAAM,CAAC,CAAA,CAAE,GAAG,IAAIb,UAAU,IAAMzE,EAAAA,IAAAA,CAAAA;AACxC,qBAAA;AACA,oBAAA,MAAMtB,KAA0BgF,KAAK,EAAA;AACnC,wBAAA,MAAM6B,IAAO7B,GAAAA,KAAAA,CAAM4B,MAAM,CAAC,CAAE,CAAA;AAC5B,wBAAA,IAAI,CAACC,IAAM,EAAA;AACT,4BAAA,IAAI,CAAC7D,QAAQ,CAAEC,aAAa,GAAG,CAAA;AAC/B,4BAAA;AACF;AACA,wBAAA,MAAM3B,IACJ,GAACuF,IAAKvF,CAAAA,IAAI,IAKF,EAAE;wBACZ,MAAM0B,QAAAA,GAAW,IAAI,CAACA,QAAQ;wBAC9BA,QAASC,CAAAA,aAAa,GAAG3B,IAAAA,CAAK1B,MAAM;wBACpC,IAAK,IAAIW,IAAI,CAAGA,EAAAA,CAAAA,GAAI,IAAI,CAAC0C,aAAa,EAAE1C,CAAK,EAAA,CAAA;4BAC3C,MAAM2C,IAAAA,GAAO5B,IAAI,CAACf,CAAE,CAAA;4BACpB,IAAI,CAAC2C,MAAMmE,MAAQ,EAAA;gCACjBrE,QAAS6E,CAAAA,YAAY,CAACtH,CAAG,EAAA,IAAA,CAAA;6BACpB,MAAA;gCACL,IAAIuH,GAAAA;gCACJ,IAAI;AACFA,oCAAAA,GAAAA,GAAM,MAAMnE,OAAAA,CAAQmD,YAAY,CAAY5D,KAAKmE,MAAM,CAAA;AACzD,iCAAA,CAAE,OAAON,GAAK,EAAA;AACZC,oCAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,mBAAmB,EAAEjC,KAAAA,CAAMY,GAAG,CAAC,CAAE,CAAA,CAAC,EAAE,EAAEmB,GAAK,CAAA,CAAA,CAAA;oCAC1De,GAAM,GAAA,IAAA;AACR;AACA,gCAAA,IAAIA,KAAKZ,WAAe,EAAA,EAAA;oCACtBlE,QAAS6E,CAAAA,YAAY,CAACtH,CAAGuH,EAAAA,GAAAA,CAAAA;iCACpB,MAAA;AACLd,oCAAAA,OAAAA,CAAQC,KAAK,CAAC,sBAAA,CAAA;AAChB;AACF;4BACA,IAAI,CAAC/D,MAAMqE,MAAQ,EAAA;gCACjBvE,QAAS+E,CAAAA,kBAAkB,CAACxH,CAAG,EAAA,IAAA,CAAA;6BAC1B,MAAA;gCACL,IAAIuH,GAAAA;gCACJ,IAAI;AACFA,oCAAAA,GAAAA,GAAM,MAAMnE,OAAAA,CAAQmD,YAAY,CAAY5D,KAAKqE,MAAM,CAAA;AACzD,iCAAA,CAAE,OAAOR,GAAK,EAAA;AACZC,oCAAAA,OAAAA,CAAQC,KAAK,CAAC,CAAC,mBAAmB,EAAEjC,KAAAA,CAAMY,GAAG,CAAC,CAAE,CAAA,CAAC,EAAE,EAAEmB,GAAK,CAAA,CAAA,CAAA;oCAC1De,GAAM,GAAA,IAAA;AACR;AACA,gCAAA,IAAIA,KAAKZ,WAAe,EAAA,EAAA;oCACtBlE,QAAS6E,CAAAA,YAAY,CAACtH,CAAGuH,EAAAA,GAAAA,CAAAA;iCACpB,MAAA;AACLd,oCAAAA,OAAAA,CAAQC,KAAK,CAAC,sBAAA,CAAA;AAChB;AACF;AACAjE,4BAAAA,QAAAA,CAASgF,qBAAqB,CAACzH,CAAG2C,EAAAA,IAAAA,CAAKuE,SAAS,IAAI,CAAA,CAAA;AACpDzE,4BAAAA,QAAAA,CAASiF,mBAAmB,CAAC1H,CAAG2C,EAAAA,IAAAA,CAAKyE,OAAO,IAAI,GAAA,CAAA;AAClD;AACF;AACF,iBAAA;AACA,gBAAA;oBACE9D,IAAM,EAAA,UAAA;oBACNY,WAAa,EAAA,sDAAA;oBACbC,IAAM,EAAA,UAAA;oBACNC,OAAS,EAAA,IAAA;AACTuB,oBAAAA,QAAAA,CAAAA,GAAAA;wBACE,OAAO,IAAA;AACT,qBAAA;AACAnB,oBAAAA,GAAAA,CAAAA,CAA0BC,KAAK,EAAA;AAC7BA,wBAAAA,KAAAA,CAAMY,GAAG,CAAC,CAAA,CAAE,GAAG,IAAI,CAACsC,eAAe;AACnClD,wBAAAA,KAAAA,CAAM4B,MAAM,CAAC,CAAE,CAAA,GAAGhE,0BAA0B,IAAI,CAAA;AAClD,qBAAA;AACA,oBAAA,MAAM5C,KAA0BgF,KAAK,EAAA;AACnC,wBAAA,IAAIA,KAAMY,CAAAA,GAAG,CAAC,CAAA,CAAE,EAAE;AAChB,4BAAA,MAAMuC,IAAOnD,GAAAA,KAAAA,CAAMY,GAAG,CAAC,CAAE,CAAA;AACzB,4BAAA,MAAMtE,OAAQ,MAAMqC,OAAAA,CAAQyE,GAAG,CAACC,QAAQ,CAACF,IAAM,EAAA;gCAAEG,QAAU,EAAA;AAAS,6BAAA,CAAA;AACpE,4BAAA,IAAI,CAAChH,IAAM,EAAA;AACT0F,gCAAAA,OAAAA,CAAQC,KAAK,CAAC,wBAAA,CAAA;AACd,gCAAA;AACF;4BACA,MAAMsB,QAAAA,GAAW,IAAI5G,QAASL,CAAAA,IAAAA,CAAAA;AAC9B,4BAAA,MAAMe,KAAQkG,GAAAA,QAAAA,CAASC,SAAS,CAAC,CAAG,EAAA,IAAA,CAAA;AACpC,4BAAA,MAAMlG,MAASiG,GAAAA,QAAAA,CAASC,SAAS,CAAC,CAAG,EAAA,IAAA,CAAA;AACrC,4BAAA,MAAMlI,SAAYiI,GAAAA,QAAAA,CAASC,SAAS,CAAC,CAAG,EAAA,IAAA,CAAA;4BACxC,MAAMzF,QAAAA,GAAW,IAAI,CAACA,QAAQ;AAC9B,4BAAA,IAAIA,SAASV,KAAK,KAAKA,SAASU,QAAST,CAAAA,MAAM,KAAKA,MAAQ,EAAA;AAC1D0E,gCAAAA,OAAAA,CAAQC,KAAK,CAAC,uBAAA,CAAA;AACd,gCAAA;AACF;AACA,4BAAA,IAAK,IAAI1G,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAID,WAAWC,CAAK,EAAA,CAAA;gCAClC,MAAMkI,OAAAA,GAAU,IAAI/G,UAAAA,CAAWJ,IAAM,EAAA,CAAA,GAAI,CAAIf,GAAAA,CAAAA,GAAI8B,KAAQC,GAAAA,MAAAA,GAAS,CAAGD,EAAAA,KAAAA,GAAQC,MAAS,GAAA,CAAA,CAAA;AACtFS,gCAAAA,QAAAA,CAAS2F,MAAM,CAACD,OAAAA,EAAS,GAAG,CAAGlI,EAAAA,CAAAA,EAAG8B,OAAOC,MAAQ,EAAA,CAAA,CAAA;AACnD;AACA,4BAAA,IAAI,CAAC4F,eAAe,GAAGlD,KAAMY,CAAAA,GAAG,CAAC,CAAE,CAAA;AACrC;AACF;AACF,iBAAA;AACA,gBAAA;oBACE/B,IAAM,EAAA,OAAA;oBACNY,WAAa,EAAA,gDAAA;oBACbC,IAAM,EAAA,UAAA;oBACNC,OAAS,EAAA,IAAA;oBACTqB,KAAO,EAAA,CAAA;AACPE,oBAAAA,QAAAA,CAAAA,GAAAA;wBACE,OAAO,IAAA;AACT,qBAAA;AACAnB,oBAAAA,GAAAA,CAAAA,CAA0BC,KAAK,EAAA;AAC7BA,wBAAAA,KAAAA,CAAMY,GAAG,CAAC,CAAA,CAAE,GAAG,IAAI,CAAC+C,YAAY;AAChC3D,wBAAAA,KAAAA,CAAM4B,MAAM,CAAC,CAAE,CAAA,GAAG3G,uBAAuB,IAAI,CAAA;AAC/C,qBAAA;AACA,oBAAA,MAAMD,KAA0BgF,KAAK,EAAA;AACnC,wBAAA,IAAIA,KAAMY,CAAAA,GAAG,CAAC,CAAA,CAAE,EAAE;AAChB,4BAAA,MAAMuC,IAAOnD,GAAAA,KAAAA,CAAMY,GAAG,CAAC,CAAE,CAAA;AACzB,4BAAA,MAAMtE,OAAQ,MAAMqC,OAAAA,CAAQyE,GAAG,CAACC,QAAQ,CAACF,IAAM,EAAA;gCAAEG,QAAU,EAAA;AAAS,6BAAA,CAAA;AACpE,4BAAA,IAAI,CAAChH,IAAM,EAAA;AACT0F,gCAAAA,OAAAA,CAAQC,KAAK,CAAC,wBAAA,CAAA;AACd,gCAAA;AACF;4BACA,MAAMsB,QAAAA,GAAW,IAAI5G,QAASL,CAAAA,IAAAA,CAAAA;AAC9B,4BAAA,IAAIxB,MAAS,GAAA,CAAA;AACb,4BAAA,MAAMQ,SAAYiI,GAAAA,QAAAA,CAASC,SAAS,CAAC1I,MAAQ,EAAA,IAAA,CAAA;AAC7C,4BAAA,IAAIQ,cAAc,IAAI,CAACH,aAAa,CAACG,SAAS,EAAE;AAC9C0G,gCAAAA,OAAAA,CAAQC,KAAK,CAAC,iCAAA,CAAA;AACd,gCAAA;AACF;4BACAnH,MAAU,IAAA,CAAA;AACV,4BAAA,IAAK,IAAIS,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAID,WAAWC,CAAK,EAAA,CAAA;AAClC,gCAAA,MAAMF,QAAWkI,GAAAA,QAAAA,CAASC,SAAS,CAAC1I,MAAQ,EAAA,IAAA,CAAA;gCAC5CA,MAAU,IAAA,CAAA;AACV,gCAAA,IAAIO,WAAW,CAAG,EAAA;oCAChB,MAAMiB,IAAAA,GAAO,IAAIsH,YAAAA,CAAaL,QAASzG,CAAAA,MAAM,EAAEyG,QAASxG,CAAAA,UAAU,GAAGjC,MAAAA,EAAQO,QAAY,IAAA,CAAA,CAAA;oCACzF,MAAMa,YAAAA,GAAeI,IAAK1B,CAAAA,MAAM,IAAI,CAAA;AACpC,oCAAA,MAAMiJ,YAAiC,EAAE;AACzC,oCAAA,IAAK,IAAItI,CAAAA,GAAI,CAAGA,EAAAA,CAAAA,GAAIW,cAAcX,CAAK,EAAA,CAAA;AACrCsI,wCAAAA,SAAAA,CAAU7H,IAAI,CAAC;AACb8H,4CAAAA,CAAAA,EAAGxH,IAAI,CAACf,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA;AAClBwI,4CAAAA,CAAAA,EAAGzH,IAAI,CAACf,CAAI,GAAA,CAAA,GAAI,CAAE,CAAA;AAClByI,4CAAAA,KAAAA,EAAOC,IAAKC,CAAAA,KAAK,CAAC5H,IAAI,CAACf,CAAAA,GAAI,CAAI,GAAA,CAAA,CAAE,EAAEe,IAAI,CAACf,CAAAA,GAAI,IAAI,CAAE,CAAA;AACpD,yCAAA,CAAA;AACF;AACA,oCAAA,IAAI,CAACJ,aAAa,CAACgJ,YAAY,CAAC5I,CAAGsI,EAAAA,SAAAA,CAAAA;oCACnC/I,MAAUO,IAAAA,QAAAA;AACZ;AACF;AACA,4BAAA,IAAI,CAACsI,YAAY,GAAG3D,KAAMY,CAAAA,GAAG,CAAC,CAAE,CAAA;AAClC;AACF;AACF,iBAAA;AACA,gBAAA;oBACE/B,IAAM,EAAA,WAAA;oBACNY,WAAa,EAAA,oCAAA;oBACbC,IAAM,EAAA,UAAA;oBACNC,OAAS,EAAA,IAAA;AACTuB,oBAAAA,QAAAA,CAAAA,GAAAA;wBACE,OAAO,IAAA;AACT,qBAAA;AACAnB,oBAAAA,GAAAA,CAAAA,CAA0BC,KAAK,EAAA;AAC7BA,wBAAAA,KAAAA,CAAMY,GAAG,CAAC,CAAA,CAAE,GAAG,IAAI,CAACwD,gBAAgB;AACpCpE,wBAAAA,KAAAA,CAAM4B,MAAM,CAAC,CAAE,CAAA,GAAG1E,2BAA2B,IAAI,CAAA;AACnD,qBAAA;AACA,oBAAA,MAAMlC,KAA0BgF,KAAK,EAAA;AACnC,wBAAA,IAAIA,KAAMY,CAAAA,GAAG,CAAC,CAAA,CAAE,EAAE;AAChB,4BAAA,MAAMuC,IAAOnD,GAAAA,KAAAA,CAAMY,GAAG,CAAC,CAAE,CAAA;AACzB,4BAAA,MAAMtE,OAAQ,MAAMqC,OAAAA,CAAQyE,GAAG,CAACC,QAAQ,CAACF,IAAM,EAAA;gCAAEG,QAAU,EAAA;AAAS,6BAAA,CAAA;AACpE,4BAAA,IAAI,CAAChH,IAAM,EAAA;AACT0F,gCAAAA,OAAAA,CAAQC,KAAK,CAAC,wBAAA,CAAA;AACd,gCAAA;AACF;4BACA,MAAMsB,QAAAA,GAAW,IAAI5G,QAASL,CAAAA,IAAAA,CAAAA;AAC9B,4BAAA,MAAMe,KAAQkG,GAAAA,QAAAA,CAASC,SAAS,CAAC,CAAG,EAAA,IAAA,CAAA;AACpC,4BAAA,MAAMlG,MAASiG,GAAAA,QAAAA,CAASC,SAAS,CAAC,CAAG,EAAA,IAAA,CAAA;AACrC,4BAAA,MAAMpG,SAAY,GAAA,IAAI,CAACiH,sBAAsB,CAAChH,KAAOC,EAAAA,MAAAA,CAAAA;4BACrD,IAAIF,SAAAA,CAAUK,MAAM,KAAK,MAAQ,EAAA;gCAC/B,IAAIL,SAAAA,CAAUK,MAAM,KAAK,SAAW,EAAA;;AAElC,oCAAA,MAAM6G,QAAW,GAAA,IAAI9G,WAAYH,CAAAA,KAAAA,GAAQC,MAAS,GAAA,CAAA,CAAA;oCAClD,MAAMiH,KAAAA,GAAQ,IAAI/G,WAAAA,CAAYlB,IAAM,EAAA,CAAA,CAAA;AACpC,oCAAA,IAAK,IAAIf,CAAI,GAAA,CAAA,EAAGA,CAAI8B,GAAAA,KAAAA,GAAQC,QAAQ/B,CAAK,EAAA,CAAA;AACvC+I,wCAAAA,QAAQ,CAAC/I,CAAI,GAAA,CAAA,GAAI,EAAE,GAAGgJ,KAAK,CAAChJ,CAAE,CAAA;AAChC;AACA6B,oCAAAA,SAAAA,CAAUsG,MAAM,CAACY,QAAU,EAAA,CAAA,EAAG,GAAGjH,KAAOC,EAAAA,MAAAA,CAAAA;iCACnC,MAAA;AACL,oCAAA,MAAM,IAAIkH,KAAM,CAAA,CAAC,+BAA+B,EAAEpH,SAAAA,CAAUK,MAAM,CAAE,CAAA,CAAA;AACtE;6BACK,MAAA;gCACLL,SAAUsG,CAAAA,MAAM,CAAC,IAAIlG,WAAAA,CAAYlB,MAAM,CAAI,CAAA,EAAA,CAAA,EAAG,GAAGe,KAAOC,EAAAA,MAAAA,CAAAA;AAC1D;4BACA,IAAI,CAACF,SAAS,GAAGA,SAAAA;AACjB,4BAAA,IAAI,CAACgH,gBAAgB,GAAGpE,KAAMY,CAAAA,GAAG,CAAC,CAAE,CAAA;AACpC,4BAAA,IAAI,CAAC6D,iBAAiB,EAAA;AACxB;AACF;AACF;AACD,aAAA,CAAA;AACH;AACF,KAAA;AACF;;;;"}
|
|
1
|
+
{"version":3,"file":"terrain.js","sources":["../../../../src/utility/serialization/scene/terrain.ts"],"sourcesContent":["import type { GrassInstanceInfo } from '../../../scene';\r\nimport { GraphNode, type SceneNode } from '../../../scene';\r\nimport { defineProps, type SerializableClass } from '../types';\r\nimport { ClipmapTerrain } from '../../../scene/terrain-cm/terrain-cm';\r\nimport type { TerrainDebugMode } from '../../../material';\r\nimport type { Texture2D } from '@zephyr3d/device';\r\nimport type { Nullable, TypedArray, TypedArrayConstructor } from '@zephyr3d/base';\r\nimport type { ResourceManager } from '../manager';\r\nimport { JSONArray } from '../json';\r\nimport { getDevice } from '../../../app/api';\r\n\r\nfunction mergeTypedArrays<T extends TypedArray>(ctor: TypedArrayConstructor<T>, arrays: T[]): T {\r\n const totalLength = arrays.reduce((acc, arr) => acc + arr.length, 0);\r\n const result = new ctor(totalLength);\r\n let offset = 0;\r\n for (const array of arrays) {\r\n result.set(array, offset);\r\n offset += array.length;\r\n }\r\n return result;\r\n}\r\n\r\nasync function getTerrainGrassContent(terrain: ClipmapTerrain): Promise<ArrayBuffer> {\r\n const grassRenderer = terrain.grassRenderer;\r\n const layerDatas: Uint8Array<ArrayBuffer>[] = [];\r\n let dataSize = 4 + 4 * grassRenderer.numLayers;\r\n for (let i = 0; i < grassRenderer.numLayers; i++) {\r\n const promises: Promise<Uint8Array<ArrayBuffer>>[] = [];\r\n const layer = grassRenderer.getLayer(i);\r\n const queue = [layer.quadtree];\r\n while (queue.length > 0) {\r\n const quadtreeNode = queue.shift()!;\r\n if (quadtreeNode.children) {\r\n queue.push(...quadtreeNode.children);\r\n }\r\n const grassInstances = quadtreeNode.grassInstances!;\r\n if (grassInstances.numInstances > 0) {\r\n const instanceBuffer = grassInstances.instanceBuffer;\r\n const P = instanceBuffer.getBufferSubData(null, 0, grassInstances.numInstances * 4 * 4);\r\n promises.push(P);\r\n }\r\n }\r\n if (promises.length > 0) {\r\n const data = await Promise.all(promises);\r\n const merged = mergeTypedArrays(Uint8Array, data) as Uint8Array<ArrayBuffer>;\r\n dataSize += merged.length;\r\n layerDatas.push(merged);\r\n } else {\r\n layerDatas.push(new Uint8Array());\r\n }\r\n }\r\n const data = new DataView(new ArrayBuffer(dataSize));\r\n const view = new Uint8Array(data.buffer, data.byteOffset, data.byteLength);\r\n let offset = 0;\r\n data.setUint32(offset, grassRenderer.numLayers, true);\r\n offset += 4;\r\n for (let i = 0; i < grassRenderer.numLayers; i++) {\r\n data.setUint32(offset, layerDatas[i].length, true);\r\n offset += 4;\r\n view.set(layerDatas[i], offset);\r\n offset += layerDatas[i].length;\r\n }\r\n return data.buffer;\r\n}\r\n\r\nasync function getTerrainHeightMapContent(terrain: ClipmapTerrain): Promise<ArrayBuffer> {\r\n const heightmap = terrain.heightMap!;\r\n const buffer = new ArrayBuffer(2 * 4 + heightmap.width * heightmap.height * 2);\r\n const head = new DataView(buffer);\r\n head.setUint32(0, heightmap.width, true);\r\n head.setUint32(4, heightmap.height, true);\r\n const data = new Uint16Array(buffer, 2 * 4);\r\n if (heightmap.format === 'r16f') {\r\n await heightmap.readPixels(0, 0, heightmap.width, heightmap.height, 0, 0, data);\r\n } else if (heightmap.format === 'rgba16f') {\r\n // WebGL1 uses rgba16f for height map, so we need to convert\r\n const tmpData = new Uint16Array(heightmap.width * heightmap.height * 4);\r\n await heightmap.readPixels(0, 0, heightmap.width, heightmap.height, 0, 0, tmpData);\r\n for (let i = 0; i < heightmap.width * heightmap.height; i++) {\r\n data[i] = tmpData[i * 4 + 0]; // Use the red channel as height\r\n }\r\n }\r\n return buffer;\r\n}\r\n\r\nasync function getTerrainSplatMapContent(terrain: ClipmapTerrain): Promise<ArrayBuffer> {\r\n const device = getDevice();\r\n const splatMap = terrain.splatMap!;\r\n const numLayers = (terrain.material!.numDetailMaps + 3) >> 2;\r\n const info = device.getDeviceCaps().textureCaps.getTextureFormatInfo(splatMap.format);\r\n const buffer = new ArrayBuffer(\r\n 3 * 4 + numLayers * splatMap.width * splatMap.height * info.blockWidth * info.blockHeight * info.size\r\n );\r\n const head = new DataView(buffer);\r\n head.setUint32(0, splatMap.width, true);\r\n head.setUint32(4, splatMap.height, true);\r\n head.setUint32(8, numLayers, true);\r\n for (let i = 0; i < numLayers; i++) {\r\n const layerData = new Uint8Array(\r\n buffer,\r\n 3 * 4 + i * splatMap.width * splatMap.height * info.blockWidth * info.blockHeight * info.size\r\n );\r\n await splatMap.readPixels(0, 0, splatMap.width, splatMap.height, 0, 0, layerData);\r\n }\r\n return buffer;\r\n}\r\n\r\n/** @internal */\r\nexport function getTerrainClass(manager: ResourceManager): SerializableClass {\r\n return {\r\n ctor: ClipmapTerrain,\r\n name: 'ClipmapTerrain',\r\n parent: GraphNode,\r\n createFunc(ctx: SceneNode, init: number) {\r\n const node = new ClipmapTerrain(ctx.scene!);\r\n node.numDetailMaps = init;\r\n node.parent = ctx;\r\n return { obj: node };\r\n },\r\n getInitParams(obj: ClipmapTerrain) {\r\n return obj.numDetailMaps;\r\n },\r\n getProps() {\r\n return defineProps([\r\n {\r\n name: 'Resolution',\r\n description: 'Terrain resolution',\r\n type: 'int2',\r\n default: [256, 256],\r\n options: { minValue: 1, maxValue: 4096 },\r\n get(this: ClipmapTerrain, value) {\r\n value.num[0] = this.sizeX;\r\n value.num[1] = this.sizeZ;\r\n },\r\n set(this: ClipmapTerrain, value) {\r\n this.setSize(value.num[0], value.num[1]);\r\n }\r\n },\r\n {\r\n name: 'CastShadow',\r\n description: 'If true, the terrain can cast shadows',\r\n type: 'bool',\r\n default: true,\r\n get(this: ClipmapTerrain, value) {\r\n value.bool[0] = this.castShadow;\r\n },\r\n set(this: ClipmapTerrain, value) {\r\n this.castShadow = value.bool[0];\r\n }\r\n },\r\n {\r\n name: 'Wireframe',\r\n description: 'If true, the terrain will be rendered as wireframe',\r\n type: 'bool',\r\n default: false,\r\n isPersistent() {\r\n return false;\r\n },\r\n get(this: ClipmapTerrain, value) {\r\n value.bool[0] = this.wireframe;\r\n },\r\n set(this: ClipmapTerrain, value) {\r\n this.wireframe = value.bool[0];\r\n }\r\n },\r\n {\r\n name: 'Debug',\r\n description: 'Debug visualization mode for the terrain material',\r\n type: 'string',\r\n options: {\r\n enum: {\r\n labels: ['None', 'UV', 'VertexNormal', 'DetailNormal', 'Tangent', 'Binormal', 'Albedo'],\r\n values: ['none', 'uv', 'vertex_normal', 'detail_normal', 'tangent', 'bitangent', 'albedo']\r\n }\r\n },\r\n default: 'none',\r\n isPersistent() {\r\n return false;\r\n },\r\n get(this: ClipmapTerrain, value) {\r\n value.str[0] = this.material!.debugMode;\r\n },\r\n set(this: ClipmapTerrain, value) {\r\n this.material!.debugMode = value.str[0] as TerrainDebugMode;\r\n }\r\n },\r\n {\r\n name: 'GrassMaps',\r\n description: 'Serialized grass texture layers and blade settings',\r\n type: 'object',\r\n default: null,\r\n options: { objectTypes: [JSONArray] },\r\n phase: 0,\r\n isNullable() {\r\n return true;\r\n },\r\n isHidden() {\r\n return false;\r\n },\r\n get(this: ClipmapTerrain, value) {\r\n const data: { texture: string; bladeWidth: number; bladeHeight: number }[] = [];\r\n const numLayers = this.grassRenderer.numLayers;\r\n for (let i = 0; i < numLayers; i++) {\r\n const grassTexture = this.grassRenderer.getGrassTexture(i);\r\n const assetId = grassTexture ? (manager.getAssetId(grassTexture) ?? '') : '';\r\n data.push({\r\n texture: assetId,\r\n bladeWidth: this.grassRenderer.getBladeWidth(i),\r\n bladeHeight: this.grassRenderer.getBladeHeight(i)\r\n });\r\n }\r\n value.object[0] = new JSONArray(null, data);\r\n },\r\n async set(this: ClipmapTerrain, value) {\r\n const json = value.object[0] as JSONArray;\r\n const data =\r\n (json?.data as {\r\n texture: string;\r\n bladeWidth: number;\r\n bladeHeight: number;\r\n }[]) ?? [];\r\n for (let i = 0; i < data.length; i++) {\r\n const info = data[i];\r\n const assetId = info.texture;\r\n let texture: Nullable<Texture2D> = null;\r\n if (assetId) {\r\n try {\r\n texture = await manager.fetchTexture<Texture2D>(assetId);\r\n } catch (err) {\r\n console.error(`Load asset failed: ${value.str[0]}: ${err}`);\r\n texture = null;\r\n }\r\n if (!texture?.isTexture2D()) {\r\n console.error('Invalid texture type');\r\n texture?.dispose();\r\n texture = null;\r\n }\r\n }\r\n this.grassRenderer.addLayer(info.bladeWidth ?? 1, info.bladeHeight ?? 1, texture!);\r\n }\r\n }\r\n },\r\n {\r\n name: 'DetailMaps',\r\n description: 'Serialized terrain detail texture layers',\r\n type: 'object',\r\n default: null,\r\n options: { objectTypes: [JSONArray] },\r\n isNullable() {\r\n return true;\r\n },\r\n isHidden() {\r\n return false;\r\n },\r\n get(this: ClipmapTerrain, value) {\r\n const data: { albedo: string; normal: string; roughness: number; uvscale: number }[] = [];\r\n const material = this.material!;\r\n for (let i = 0; i < material.numDetailMaps; i++) {\r\n data.push({\r\n albedo: manager.getAssetId(material.getDetailMap(i)) ?? '',\r\n normal: manager.getAssetId(material.getDetailNormalMap(i)) ?? '',\r\n roughness: material.getDetailMapRoughness(i),\r\n uvscale: material.getDetailMapUVScale(i)\r\n });\r\n }\r\n value.object[0] = new JSONArray(null, data);\r\n },\r\n async set(this: ClipmapTerrain, value) {\r\n const json = value.object[0] as JSONArray;\r\n if (!json) {\r\n this.material!.numDetailMaps = 0;\r\n return;\r\n }\r\n const data =\r\n (json.data as {\r\n albedo: string;\r\n normal: string;\r\n roughness: number;\r\n uvscale: number;\r\n }[]) ?? [];\r\n const material = this.material!;\r\n material.numDetailMaps = data.length;\r\n for (let i = 0; i < this.numDetailMaps; i++) {\r\n const info = data[i];\r\n if (!info?.albedo) {\r\n material.setDetailMap(i, null);\r\n } else {\r\n let tex: Nullable<Texture2D>;\r\n try {\r\n tex = await manager.fetchTexture<Texture2D>(info.albedo);\r\n } catch (err) {\r\n console.error(`Load asset failed: ${value.str[0]}: ${err}`);\r\n tex = null;\r\n }\r\n if (tex?.isTexture2D()) {\r\n material.setDetailMap(i, tex);\r\n } else {\r\n console.error('Invalid texture type');\r\n }\r\n }\r\n if (!info?.normal) {\r\n material.setDetailNormalMap(i, null);\r\n } else {\r\n let tex: Nullable<Texture2D>;\r\n try {\r\n tex = await manager.fetchTexture<Texture2D>(info.normal);\r\n } catch (err) {\r\n console.error(`Load asset failed: ${value.str[0]}: ${err}`);\r\n tex = null;\r\n }\r\n if (tex?.isTexture2D()) {\r\n material.setDetailMap(i, tex);\r\n } else {\r\n console.error('Invalid texture type');\r\n }\r\n }\r\n material.setDetailMapRoughness(i, info.roughness ?? 1);\r\n material.setDetailMapUVScale(i, info.uvscale ?? 100);\r\n }\r\n }\r\n },\r\n {\r\n name: 'SplatMap',\r\n description: 'Serialized splat-map texture data for terrain layers',\r\n type: 'embedded',\r\n default: null,\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: ClipmapTerrain, value) {\r\n value.str[0] = this.splatMapAssetId;\r\n value.object[0] = getTerrainSplatMapContent(this);\r\n },\r\n async set(this: ClipmapTerrain, value) {\r\n if (value.str[0]) {\r\n const path = value.str[0];\r\n const data = (await manager.VFS.readFile(path, { encoding: 'binary' })) as ArrayBuffer;\r\n if (!data) {\r\n console.error('Load height map failed');\r\n return;\r\n }\r\n const dataView = new DataView(data);\r\n const width = dataView.getUint32(0, true);\r\n const height = dataView.getUint32(4, true);\r\n const numLayers = dataView.getUint32(8, true);\r\n const splatMap = this.splatMap!;\r\n if (splatMap.width !== width || splatMap.height !== height) {\r\n console.error('Invalid splatmap data');\r\n return;\r\n }\r\n for (let i = 0; i < numLayers; i++) {\r\n const content = new Uint8Array(data, 3 * 4 + i * width * height * 4, width * height * 4);\r\n splatMap.update(content, 0, 0, i, width, height, 1);\r\n }\r\n this.splatMapAssetId = value.str[0];\r\n }\r\n }\r\n },\r\n {\r\n name: 'Grass',\r\n description: 'Serialized grass instance data for the terrain',\r\n type: 'embedded',\r\n default: null,\r\n phase: 1,\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: ClipmapTerrain, value) {\r\n value.str[0] = this.grassAssetId;\r\n value.object[0] = getTerrainGrassContent(this);\r\n },\r\n async set(this: ClipmapTerrain, value) {\r\n if (value.str[0]) {\r\n const path = value.str[0];\r\n const data = (await manager.VFS.readFile(path, { encoding: 'binary' })) as ArrayBuffer;\r\n if (!data) {\r\n console.error('Load grass data failed');\r\n return;\r\n }\r\n const dataView = new DataView(data);\r\n let offset = 0;\r\n const numLayers = dataView.getUint32(offset, true);\r\n if (numLayers !== this.grassRenderer.numLayers) {\r\n console.error('Number of grass layers mismatch');\r\n return;\r\n }\r\n offset += 4;\r\n for (let i = 0; i < numLayers; i++) {\r\n const dataSize = dataView.getUint32(offset, true);\r\n offset += 4;\r\n if (dataSize > 0) {\r\n const data = new Float32Array(dataView.buffer, dataView.byteOffset + offset, dataSize >> 2);\r\n const numInstances = data.length >> 2;\r\n const instances: GrassInstanceInfo[] = [];\r\n for (let i = 0; i < numInstances; i++) {\r\n instances.push({\r\n x: data[i * 4 + 0],\r\n y: data[i * 4 + 1],\r\n angle: Math.atan2(data[i * 4 + 2], data[i * 4 + 3])\r\n });\r\n }\r\n this.grassRenderer.addInstances(i, instances);\r\n offset += dataSize;\r\n }\r\n }\r\n this.grassAssetId = value.str[0];\r\n }\r\n }\r\n },\r\n {\r\n name: 'HeightMap',\r\n description: 'Serialized terrain height map data',\r\n type: 'embedded',\r\n default: null,\r\n isHidden() {\r\n return true;\r\n },\r\n get(this: ClipmapTerrain, value) {\r\n value.str[0] = this.heightMapAssetId;\r\n value.object[0] = getTerrainHeightMapContent(this);\r\n },\r\n async set(this: ClipmapTerrain, value) {\r\n if (value.str[0]) {\r\n const path = value.str[0];\r\n const data = (await manager.VFS.readFile(path, { encoding: 'binary' })) as ArrayBuffer;\r\n if (!data) {\r\n console.error('Load height map failed');\r\n return;\r\n }\r\n const dataView = new DataView(data);\r\n const width = dataView.getUint32(0, true);\r\n const height = dataView.getUint32(4, true);\r\n const heightMap = this.createHeightMapTexture(width, height)!;\r\n if (heightMap.format !== 'r16f') {\r\n if (heightMap.format === 'rgba16f') {\r\n // WebGL1 uses rgba16f for height map, so we need to convert\r\n const rgbaData = new Uint16Array(width * height * 4);\r\n const rData = new Uint16Array(data, 8);\r\n for (let i = 0; i < width * height; i++) {\r\n rgbaData[i * 4 + 0] = rData[i];\r\n }\r\n heightMap.update(rgbaData, 0, 0, width, height);\r\n } else {\r\n throw new Error(`Unsupported height map format: ${heightMap.format}`);\r\n }\r\n } else {\r\n heightMap.update(new Uint16Array(data, 8), 0, 0, width, height);\r\n }\r\n this.heightMap = heightMap;\r\n this.heightMapAssetId = value.str[0];\r\n this.updateBoundingBox();\r\n }\r\n }\r\n }\r\n ]);\r\n }\r\n };\r\n}\r\n"],"names":["mergeTypedArrays","ctor","arrays","totalLength","reduce","acc","arr","length","result","offset","array","set","getTerrainGrassContent","terrain","grassRenderer","layerDatas","dataSize","numLayers","i","promises","layer","getLayer","queue","quadtree","quadtreeNode","shift","children","push","grassInstances","numInstances","instanceBuffer","P","getBufferSubData","data","Promise","all","merged","Uint8Array","DataView","ArrayBuffer","view","buffer","byteOffset","byteLength","setUint32","getTerrainHeightMapContent","heightmap","heightMap","width","height","head","Uint16Array","format","readPixels","tmpData","getTerrainSplatMapContent","device","getDevice","splatMap","material","numDetailMaps","info","getDeviceCaps","textureCaps","getTextureFormatInfo","blockWidth","blockHeight","size","layerData","getTerrainClass","manager","ClipmapTerrain","name","parent","GraphNode","createFunc","ctx","init","node","scene","obj","getInitParams","getProps","defineProps","description","type","default","options","minValue","maxValue","get","value","num","sizeX","sizeZ","setSize","bool","castShadow","isPersistent","wireframe","enum","labels","values","str","debugMode","objectTypes","JSONArray","phase","isNullable","isHidden","grassTexture","getGrassTexture","assetId","getAssetId","texture","bladeWidth","getBladeWidth","bladeHeight","getBladeHeight","object","json","fetchTexture","err","console","error","isTexture2D","dispose","addLayer","albedo","getDetailMap","normal","getDetailNormalMap","roughness","getDetailMapRoughness","uvscale","getDetailMapUVScale","setDetailMap","tex","setDetailNormalMap","setDetailMapRoughness","setDetailMapUVScale","splatMapAssetId","path","VFS","readFile","encoding","dataView","getUint32","content","update","grassAssetId","Float32Array","instances","x","y","angle","Math","atan2","addInstances","heightMapAssetId","createHeightMapTexture","rgbaData","rData","Error","updateBoundingBox"],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.js","sources":["../../../src/utility/serialization/types.ts"],"sourcesContent":["import type { GenericConstructor, Nullable, RequireOptionals } from '@zephyr3d/base';\n\n/**\n * Enumerates supported data types for serializable properties.\n *\n * This type informs serializers/editors how to interpret and encode values.\n * 'bool'|'int'|'float'|'vec2'|'vec3'|'vec4'|'int2'|'int3'|'int4'|'string'|'rgb'|'rgba'|'object'|'object_array'|'embedded'|'command';\n *\n * @public\n */\nexport type PropertyType = string;\n\n/**\n * Maps a property type discriminator to the corresponding value lane key.\n *\n * @public\n */\nexport type PropertyToType<T extends string> = T extends\n | 'float'\n | 'vec2'\n | 'vec3'\n | 'vec4'\n | 'int'\n | 'int2'\n | 'int3'\n | 'int4'\n | 'rgb'\n | 'rgba'\n ? 'num'\n : T extends 'bool'\n ? 'bool'\n : T extends 'string'\n ? 'str'\n : T extends 'object' | 'object_array'\n ? 'object'\n : 'num' | 'bool' | 'str' | 'object';\n/**\n * Container for a serializable property's value.\n *\n * Values are carried in typed arrays (even for single values) to support\n * both scalar and array-like properties in a unified shape.\n *\n * Conventions:\n * - `num` carries numeric data for types like `int`, `float`, `vec*`, `int*`, `rgb`, `rgba`\n * - `str` carries string data for `string`\n * - `bool` carries boolean data for `bool`\n * - `object` carries references/instances for `object`, `object_array`, `embedded`\n *\n * Only the relevant field(s) for the property's {@link PropertyType} will be populated.\n *\n * @public\n */\nexport type PropertyValue = {\n /** Numeric lane(s) for numeric, vector, or color types. */\n num?: number[];\n /** String lane(s) for text properties. */\n str?: string[];\n /** Boolean lane(s) for boolean properties. */\n bool?: boolean[];\n /** Object lane(s) for object references or embedded objects. */\n object?: Nullable<object>[];\n};\n\n/**\n * Editor-oriented edit types that augment how a property is presented/edited.\n *\n * This is orthogonal to {@link PropertyType} and is purely an editor hint.\n *\n * @public\n */\nexport type PropEdit = 'aabb' | 'quaternion' | 'proptrack';\n\n/**\n * Extra scene-node picker hints for a property.\n *\n * @public\n */\nexport type PropertySceneNodeOptions = {\n kind?: 'node' | 'mesh';\n};\n\n/**\n * Additional options controlling how a property is displayed, constrained, and edited.\n *\n * These options are consumed primarily by an editor/inspector UI, but may\n * also influence validation and tooling behavior.\n *\n * @public\n */\nexport type PropertyAccessorOptions = {\n /** Human-friendly label for UI. Defaults to `name` if omitted. */\n label?: string;\n /** Logical grouping/category in UI. */\n group?: string;\n /** Editor presentation hint (e.g., quaternion gizmo, animation track). */\n edit?: PropEdit;\n /** Minimum numeric value (for sliders/spinners). */\n minValue?: number;\n /** Maximum numeric value (for sliders/spinners). */\n maxValue?: number;\n /** Step/speed for numeric editing UI. */\n speed?: number;\n /** Whether the property can be animated/keyframed. */\n animatable?: boolean;\n /** Allowed MIME types for file-picker-like editors. */\n mimeTypes?: string[];\n /** Accept scene hierarchy node drag-drop in the inspector. */\n sceneNode?: PropertySceneNodeOptions;\n /** Render object-array entries inline instead of expandable nested groups. */\n inlineObjectArray?: boolean;\n /** Allowed constructor types when choosing/creating object references. */\n objectTypes?: GenericConstructor[];\n /**\n * Optional enumeration metadata.\n * `labels[i]` corresponds to `values[i]`.\n */\n enum?: { labels: string[]; values: unknown[] };\n};\n\n/**\n * Returns the property accessor list unchanged while preserving typing.\n *\n * @public\n */\nexport function defineProps(accessors: PropertyAccessor<any, 'DUMMY'>[]): PropertyAccessor[] {\n return accessors;\n}\n\n/**\n * Descriptor for a serializable property of a class/type.\n *\n * This binds together:\n * - Metadata: `type`, `name`, `default`, `readonly`, `persistent`, `options`\n * - Accessors: `get`, `set`, `add`, `delete`, `create` for manipulating the underlying object state\n * - Predicates: `isValid`, `isNullable`, `isHidden` to control UI and validation\n * - Commands: `command` for action-style properties (`type: 'command'`)\n * - Utilities: `getDefaultValue` to compute defaults dynamically\n *\n * The accessors are invoked with `this` bound to the owning object instance.\n *\n * @typeParam T - The instance type that owns the property.\n * @public\n */\nexport type PropertyAccessor<T = object, U extends string = ''> = {\n /** The storage/serialization data type. */\n type: PropertyType;\n /** Unique property name (stable identifier for tooling/serialization). */\n name: string;\n /** Description of this property */\n description?: string;\n /**\n * Optional evaluation phase/order hint (lower runs earlier).\n * Useful for staged initialization or batched updates in editors.\n */\n phase?: number;\n /** If true, the property is read-only in UI and programmatic setters may be disallowed. */\n readonly?: boolean;\n /** Default value used if none is provided. Can be a primitive, array, or object. */\n default?: any;\n /**\n * If true, the property is persisted during save/serialize.\n * Non-persistent properties may be computed or session-only.\n */\n //persistent?: boolean;\n /** Editor and validation options for this property. */\n options?: PropertyAccessorOptions;\n /**\n * Reads the current value from `this` into the provided `value` container.\n *\n * Implementations should fully populate the appropriate lane(s) (e.g., `num`, `str`, etc.)\n * according to the property's {@link PropertyType}.\n *\n * @param value - Output container to be filled by the getter.\n */\n get: <K extends string>(\n this: T,\n value: U extends '' ? Required<Pick<PropertyValue, PropertyToType<K>>> : RequireOptionals<PropertyValue>\n ) => void;\n /**\n * Writes an incoming value to `this`.\n *\n * For array-like properties, `index` can target a specific element.\n * Implementations should read from the appropriate lane(s) of `value` according to {@link PropertyType}.\n *\n * @param value - Input container carrying the new value.\n * @param index - Optional element index for array-like properties.\n * @returns Optionally `Promise<void>` if asynchronous work is required.\n */\n set?: <K extends string>(\n this: T,\n value: U extends '' ? Required<Pick<PropertyValue, PropertyToType<K>>> : RequireOptionals<PropertyValue>,\n index?: number\n ) => void | Promise<void>;\n /**\n * Creates a new embedded/contained object for object-like properties.\n *\n * Typically used for `embedded` or `object_array` to instantiate an element.\n *\n * @param ctor - Constructor to instantiate.\n * @param index - Target index where the new object will be inserted.\n * @returns The newly created object instance.\n */\n create?: (this: T, ctor: GenericConstructor, index: number) => Nullable<object>;\n /**\n * Deletes an element from an array-like property or clears a value.\n *\n * @param index - Target element index.\n * @returns Optionally `Promise<void>` if asynchronous work is required.\n */\n delete?: (this: T, index: number) => void | Promise<void>;\n /**\n * Adds a new element/value to an array-like property.\n *\n * If `index` is omitted, implementations may append to the end.\n *\n * @param value - The value to add (read appropriate lane(s) per {@link PropertyType}).\n * @param index - Optional insertion index.\n * @returns Optionally `Promise<void>` if asynchronous work is required.\n */\n add?: <K extends string>(\n this: T,\n value: U extends '' ? Required<Pick<PropertyValue, PropertyToType<K>>> : RequireOptionals<PropertyValue>,\n index?: number\n ) => void | Promise<void>;\n /**\n * Validates the current state of `this` with respect to this property.\n *\n * Returning `false` may block serialization or UI confirmation.\n *\n * @returns `true` if valid, otherwise `false`.\n */\n isValid?: (this: T) => boolean;\n /**\n * Indicates whether this property is serializable. Default is serializable if not present.\n *\n * @returns `true` if persistent, otherwise `false`.\n */\n isPersistent?: (this: T) => boolean;\n /**\n * Indicates whether a specific element or slot may be `null` or `undefined`.\n *\n * Applies to array-like or optional properties.\n *\n * @param index - Target element index.\n * @returns `true` if nullable, otherwise `false`.\n */\n isNullable?: (this: T, index: number) => boolean;\n /**\n * Controls visibility of a specific element or the property in UI.\n *\n * @param index - Target element index.\n * @param obj - Value at index\n * @returns `true` if hidden, otherwise `false`.\n */\n isHidden?: (this: T, index: number, obj?: unknown) => boolean;\n /**\n * Executes a command-style property.\n *\n * Only meaningful for `type: 'command'`. Return value may indicate success or toggle state.\n *\n * @param index - Optional command index for multi-command groups.\n * @returns Command result, commonly a boolean for toggle-like actions.\n */\n command?: (this: T, index: number) => boolean;\n /**\n * Supplies a default value dynamically at runtime.\n *\n * If provided, this takes precedence over the static `default` field.\n */\n getDefaultValue?: (this: T) => any;\n};\n\n/**\n * Descriptor for a serializable class/type.\n *\n * This defines how a class is identified, constructed, and inspected for properties.\n * Editors and serializers can use this metadata to instantiate objects, load initial\n * parameters, and enumerate property accessors.\n *\n * @public\n */\nexport type SerializableClass = {\n /** Concrete constructor for the serializable class. */\n ctor: GenericConstructor;\n /** Optional parent/superclass constructor to represent inheritance in tooling. */\n parent?: GenericConstructor;\n /** If true, suppresses title rendering in UI for compact displays. */\n noTitle?: boolean;\n /** Display name used by tooling and editors. */\n name: string;\n /**\n * Custom factory to create an instance and optionally control property loading.\n *\n * If `loadProps` is `false`, the caller may skip default property loading\n * (useful for lazy or staged initialization).\n *\n * @param ctx - Optional construction context (editor/runtime-specific).\n * @param init - Optional initialization payload.\n * @returns The created object and a `loadProps` hint.\n */\n createFunc?: (\n ctx?: any,\n init?: any\n ) => { obj: any; loadProps?: boolean } | Promise<{ obj: any; loadProps?: boolean }>;\n /**\n * Extracts initialization parameters from an instance suitable for re-creation.\n *\n * This is the inverse of `createFunc`'s `init` argument, enabling round-trip\n * serialization of constructor/initializer data.\n *\n * @param obj - The instance to introspect.\n * @returns An initialization payload (serializable).\n */\n getInitParams?: (obj: any, flags: { saveProps: boolean }) => any;\n /**\n * Enumerates property accessors for this class.\n *\n * The returned list defines the full set of serializable/editor-visible properties.\n *\n * @returns Array of property accessors.\n */\n getProps: () => PropertyAccessor<any>[];\n};\n"],"names":["defineProps","accessors"],"mappings":"AAuHA;;;;IAKO,SAASA,WAAAA,CAAYC,SAA2C,EAAA;IACrE,OAAOA,SAAAA;AACT;;;;"}
|
|
1
|
+
{"version":3,"file":"types.js","sources":["../../../src/utility/serialization/types.ts"],"sourcesContent":["import type { GenericConstructor, Nullable, RequireOptionals } from '@zephyr3d/base';\r\n\r\n/**\r\n * Enumerates supported data types for serializable properties.\r\n *\r\n * This type informs serializers/editors how to interpret and encode values.\r\n * 'bool'|'int'|'float'|'vec2'|'vec3'|'vec4'|'int2'|'int3'|'int4'|'string'|'rgb'|'rgba'|'object'|'object_array'|'embedded'|'command';\r\n *\r\n * @public\r\n */\r\nexport type PropertyType = string;\r\n\r\n/**\r\n * Maps a property type discriminator to the corresponding value lane key.\r\n *\r\n * @public\r\n */\r\nexport type PropertyToType<T extends string> = T extends\r\n | 'float'\r\n | 'vec2'\r\n | 'vec3'\r\n | 'vec4'\r\n | 'int'\r\n | 'int2'\r\n | 'int3'\r\n | 'int4'\r\n | 'rgb'\r\n | 'rgba'\r\n ? 'num'\r\n : T extends 'bool'\r\n ? 'bool'\r\n : T extends 'string'\r\n ? 'str'\r\n : T extends 'object' | 'object_array'\r\n ? 'object'\r\n : 'num' | 'bool' | 'str' | 'object';\r\n/**\r\n * Container for a serializable property's value.\r\n *\r\n * Values are carried in typed arrays (even for single values) to support\r\n * both scalar and array-like properties in a unified shape.\r\n *\r\n * Conventions:\r\n * - `num` carries numeric data for types like `int`, `float`, `vec*`, `int*`, `rgb`, `rgba`\r\n * - `str` carries string data for `string`\r\n * - `bool` carries boolean data for `bool`\r\n * - `object` carries references/instances for `object`, `object_array`, `embedded`\r\n *\r\n * Only the relevant field(s) for the property's {@link PropertyType} will be populated.\r\n *\r\n * @public\r\n */\r\nexport type PropertyValue = {\r\n /** Numeric lane(s) for numeric, vector, or color types. */\r\n num?: number[];\r\n /** String lane(s) for text properties. */\r\n str?: string[];\r\n /** Boolean lane(s) for boolean properties. */\r\n bool?: boolean[];\r\n /** Object lane(s) for object references or embedded objects. */\r\n object?: Nullable<object>[];\r\n};\r\n\r\n/**\r\n * Editor-oriented edit types that augment how a property is presented/edited.\r\n *\r\n * This is orthogonal to {@link PropertyType} and is purely an editor hint.\r\n *\r\n * @public\r\n */\r\nexport type PropEdit = 'aabb' | 'quaternion' | 'proptrack';\r\n\r\n/**\r\n * Extra scene-node picker hints for a property.\r\n *\r\n * @public\r\n */\r\nexport type PropertySceneNodeOptions = {\r\n kind?: 'node' | 'mesh';\r\n};\r\n\r\n/**\r\n * Additional options controlling how a property is displayed, constrained, and edited.\r\n *\r\n * These options are consumed primarily by an editor/inspector UI, but may\r\n * also influence validation and tooling behavior.\r\n *\r\n * @public\r\n */\r\nexport type PropertyAccessorOptions = {\r\n /** Human-friendly label for UI. Defaults to `name` if omitted. */\r\n label?: string;\r\n /** Logical grouping/category in UI. */\r\n group?: string;\r\n /** Editor presentation hint (e.g., quaternion gizmo, animation track). */\r\n edit?: PropEdit;\r\n /** Minimum numeric value (for sliders/spinners). */\r\n minValue?: number;\r\n /** Maximum numeric value (for sliders/spinners). */\r\n maxValue?: number;\r\n /** Step/speed for numeric editing UI. */\r\n speed?: number;\r\n /** Whether the property can be animated/keyframed. */\r\n animatable?: boolean;\r\n /** Allowed MIME types for file-picker-like editors. */\r\n mimeTypes?: string[];\r\n /** Accept scene hierarchy node drag-drop in the inspector. */\r\n sceneNode?: PropertySceneNodeOptions;\r\n /** Render object-array entries inline instead of expandable nested groups. */\r\n inlineObjectArray?: boolean;\r\n /** Allowed constructor types when choosing/creating object references. */\r\n objectTypes?: GenericConstructor[];\r\n /**\r\n * Optional enumeration metadata.\r\n * `labels[i]` corresponds to `values[i]`.\r\n */\r\n enum?: { labels: string[]; values: unknown[] };\r\n};\r\n\r\n/**\r\n * Returns the property accessor list unchanged while preserving typing.\r\n *\r\n * @public\r\n */\r\nexport function defineProps(accessors: PropertyAccessor<any, 'DUMMY'>[]): PropertyAccessor[] {\r\n return accessors;\r\n}\r\n\r\n/**\r\n * Descriptor for a serializable property of a class/type.\r\n *\r\n * This binds together:\r\n * - Metadata: `type`, `name`, `default`, `readonly`, `persistent`, `options`\r\n * - Accessors: `get`, `set`, `add`, `delete`, `create` for manipulating the underlying object state\r\n * - Predicates: `isValid`, `isNullable`, `isHidden` to control UI and validation\r\n * - Commands: `command` for action-style properties (`type: 'command'`)\r\n * - Utilities: `getDefaultValue` to compute defaults dynamically\r\n *\r\n * The accessors are invoked with `this` bound to the owning object instance.\r\n *\r\n * @typeParam T - The instance type that owns the property.\r\n * @public\r\n */\r\nexport type PropertyAccessor<T = object, U extends string = ''> = {\r\n /** The storage/serialization data type. */\r\n type: PropertyType;\r\n /** Unique property name (stable identifier for tooling/serialization). */\r\n name: string;\r\n /** Description of this property */\r\n description?: string;\r\n /**\r\n * Optional evaluation phase/order hint (lower runs earlier).\r\n * Useful for staged initialization or batched updates in editors.\r\n */\r\n phase?: number;\r\n /** If true, the property is read-only in UI and programmatic setters may be disallowed. */\r\n readonly?: boolean;\r\n /** Default value used if none is provided. Can be a primitive, array, or object. */\r\n default?: any;\r\n /**\r\n * If true, the property is persisted during save/serialize.\r\n * Non-persistent properties may be computed or session-only.\r\n */\r\n //persistent?: boolean;\r\n /** Editor and validation options for this property. */\r\n options?: PropertyAccessorOptions;\r\n /**\r\n * Reads the current value from `this` into the provided `value` container.\r\n *\r\n * Implementations should fully populate the appropriate lane(s) (e.g., `num`, `str`, etc.)\r\n * according to the property's {@link PropertyType}.\r\n *\r\n * @param value - Output container to be filled by the getter.\r\n */\r\n get: <K extends string>(\r\n this: T,\r\n value: U extends '' ? Required<Pick<PropertyValue, PropertyToType<K>>> : RequireOptionals<PropertyValue>\r\n ) => void;\r\n /**\r\n * Writes an incoming value to `this`.\r\n *\r\n * For array-like properties, `index` can target a specific element.\r\n * Implementations should read from the appropriate lane(s) of `value` according to {@link PropertyType}.\r\n *\r\n * @param value - Input container carrying the new value.\r\n * @param index - Optional element index for array-like properties.\r\n * @returns Optionally `Promise<void>` if asynchronous work is required.\r\n */\r\n set?: <K extends string>(\r\n this: T,\r\n value: U extends '' ? Required<Pick<PropertyValue, PropertyToType<K>>> : RequireOptionals<PropertyValue>,\r\n index?: number\r\n ) => void | Promise<void>;\r\n /**\r\n * Creates a new embedded/contained object for object-like properties.\r\n *\r\n * Typically used for `embedded` or `object_array` to instantiate an element.\r\n *\r\n * @param ctor - Constructor to instantiate.\r\n * @param index - Target index where the new object will be inserted.\r\n * @returns The newly created object instance.\r\n */\r\n create?: (this: T, ctor: GenericConstructor, index: number) => Nullable<object>;\r\n /**\r\n * Deletes an element from an array-like property or clears a value.\r\n *\r\n * @param index - Target element index.\r\n * @returns Optionally `Promise<void>` if asynchronous work is required.\r\n */\r\n delete?: (this: T, index: number) => void | Promise<void>;\r\n /**\r\n * Adds a new element/value to an array-like property.\r\n *\r\n * If `index` is omitted, implementations may append to the end.\r\n *\r\n * @param value - The value to add (read appropriate lane(s) per {@link PropertyType}).\r\n * @param index - Optional insertion index.\r\n * @returns Optionally `Promise<void>` if asynchronous work is required.\r\n */\r\n add?: <K extends string>(\r\n this: T,\r\n value: U extends '' ? Required<Pick<PropertyValue, PropertyToType<K>>> : RequireOptionals<PropertyValue>,\r\n index?: number\r\n ) => void | Promise<void>;\r\n /**\r\n * Validates the current state of `this` with respect to this property.\r\n *\r\n * Returning `false` may block serialization or UI confirmation.\r\n *\r\n * @returns `true` if valid, otherwise `false`.\r\n */\r\n isValid?: (this: T) => boolean;\r\n /**\r\n * Indicates whether this property is serializable. Default is serializable if not present.\r\n *\r\n * @returns `true` if persistent, otherwise `false`.\r\n */\r\n isPersistent?: (this: T) => boolean;\r\n /**\r\n * Indicates whether a specific element or slot may be `null` or `undefined`.\r\n *\r\n * Applies to array-like or optional properties.\r\n *\r\n * @param index - Target element index.\r\n * @returns `true` if nullable, otherwise `false`.\r\n */\r\n isNullable?: (this: T, index: number) => boolean;\r\n /**\r\n * Controls visibility of a specific element or the property in UI.\r\n *\r\n * @param index - Target element index.\r\n * @param obj - Value at index\r\n * @returns `true` if hidden, otherwise `false`.\r\n */\r\n isHidden?: (this: T, index: number, obj?: unknown) => boolean;\r\n /**\r\n * Executes a command-style property.\r\n *\r\n * Only meaningful for `type: 'command'`. Return value may indicate success or toggle state.\r\n *\r\n * @param index - Optional command index for multi-command groups.\r\n * @returns Command result, commonly a boolean for toggle-like actions.\r\n */\r\n command?: (this: T, index: number) => boolean;\r\n /**\r\n * Supplies a default value dynamically at runtime.\r\n *\r\n * If provided, this takes precedence over the static `default` field.\r\n */\r\n getDefaultValue?: (this: T) => any;\r\n};\r\n\r\n/**\r\n * Descriptor for a serializable class/type.\r\n *\r\n * This defines how a class is identified, constructed, and inspected for properties.\r\n * Editors and serializers can use this metadata to instantiate objects, load initial\r\n * parameters, and enumerate property accessors.\r\n *\r\n * @public\r\n */\r\nexport type SerializableClass = {\r\n /** Concrete constructor for the serializable class. */\r\n ctor: GenericConstructor;\r\n /** Optional parent/superclass constructor to represent inheritance in tooling. */\r\n parent?: GenericConstructor;\r\n /** If true, suppresses title rendering in UI for compact displays. */\r\n noTitle?: boolean;\r\n /** Display name used by tooling and editors. */\r\n name: string;\r\n /**\r\n * Custom factory to create an instance and optionally control property loading.\r\n *\r\n * If `loadProps` is `false`, the caller may skip default property loading\r\n * (useful for lazy or staged initialization).\r\n *\r\n * @param ctx - Optional construction context (editor/runtime-specific).\r\n * @param init - Optional initialization payload.\r\n * @returns The created object and a `loadProps` hint.\r\n */\r\n createFunc?: (\r\n ctx?: any,\r\n init?: any\r\n ) => { obj: any; loadProps?: boolean } | Promise<{ obj: any; loadProps?: boolean }>;\r\n /**\r\n * Extracts initialization parameters from an instance suitable for re-creation.\r\n *\r\n * This is the inverse of `createFunc`'s `init` argument, enabling round-trip\r\n * serialization of constructor/initializer data.\r\n *\r\n * @param obj - The instance to introspect.\r\n * @returns An initialization payload (serializable).\r\n */\r\n getInitParams?: (obj: any, flags: { saveProps: boolean }) => any;\r\n /**\r\n * Enumerates property accessors for this class.\r\n *\r\n * The returned list defines the full set of serializable/editor-visible properties.\r\n *\r\n * @returns Array of property accessors.\r\n */\r\n getProps: () => PropertyAccessor<any>[];\r\n};\r\n"],"names":["defineProps","accessors"],"mappings":"AAuHA;;;;IAKO,SAASA,WAAAA,CAAYC,SAA2C,EAAA;IACrE,OAAOA,SAAAA;AACT;;;;"}
|