@zephyr3d/editor 0.3.8 → 0.3.9

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.
Files changed (137) hide show
  1. package/dist/assets/{index-BZ1L8ggE.js → index-CO6yA4Rj.js} +313 -11
  2. package/dist/assistant/zephyr-types-index.json +13834 -11679
  3. package/dist/index.html +1 -1
  4. package/dist/modules/zephyr3d_backend-webgpu.js +1 -1
  5. package/dist/modules/zephyr3d_backend-webgpu.js.map +1 -1
  6. package/dist/modules/zephyr3d_device.js +2 -2
  7. package/dist/modules/zephyr3d_device.js.map +1 -1
  8. package/dist/modules/zephyr3d_scene.js +2325 -515
  9. package/dist/modules/zephyr3d_scene.js.map +1 -1
  10. package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js +1 -1
  11. package/dist/vendor/zephyr3d/backend-webgpu/dist/renderpass_webgpu.js.map +1 -1
  12. package/dist/vendor/zephyr3d/device/dist/device.js +2 -2
  13. package/dist/vendor/zephyr3d/device/dist/device.js.map +1 -1
  14. package/dist/vendor/zephyr3d/scene/dist/app/engine.js +3 -1
  15. package/dist/vendor/zephyr3d/scene/dist/app/engine.js.map +1 -1
  16. package/dist/vendor/zephyr3d/scene/dist/asset/assetmanager.js +1 -0
  17. package/dist/vendor/zephyr3d/scene/dist/asset/assetmanager.js.map +1 -1
  18. package/dist/vendor/zephyr3d/scene/dist/camera/camera.js +87 -0
  19. package/dist/vendor/zephyr3d/scene/dist/camera/camera.js.map +1 -1
  20. package/dist/vendor/zephyr3d/scene/dist/index.d.ts +158 -4
  21. package/dist/vendor/zephyr3d/scene/dist/index.js +3 -0
  22. package/dist/vendor/zephyr3d/scene/dist/index.js.map +1 -1
  23. package/dist/vendor/zephyr3d/scene/dist/material/meshmaterial.js +8 -1
  24. package/dist/vendor/zephyr3d/scene/dist/material/meshmaterial.js.map +1 -1
  25. package/dist/vendor/zephyr3d/scene/dist/material/shader/helper.js +6 -0
  26. package/dist/vendor/zephyr3d/scene/dist/material/shader/helper.js.map +1 -1
  27. package/dist/vendor/zephyr3d/scene/dist/material/skin.js +263 -0
  28. package/dist/vendor/zephyr3d/scene/dist/material/skin.js.map +1 -0
  29. package/dist/vendor/zephyr3d/scene/dist/posteffect/compositor.js +3 -0
  30. package/dist/vendor/zephyr3d/scene/dist/posteffect/compositor.js.map +1 -1
  31. package/dist/vendor/zephyr3d/scene/dist/posteffect/skinsss.js +194 -0
  32. package/dist/vendor/zephyr3d/scene/dist/posteffect/skinsss.js.map +1 -0
  33. package/dist/vendor/zephyr3d/scene/dist/posteffect/ssr.js +26 -49
  34. package/dist/vendor/zephyr3d/scene/dist/posteffect/ssr.js.map +1 -1
  35. package/dist/vendor/zephyr3d/scene/dist/posteffect/sss.js +1 -0
  36. package/dist/vendor/zephyr3d/scene/dist/posteffect/sss.js.map +1 -1
  37. package/dist/vendor/zephyr3d/scene/dist/posteffect/taa.js +2 -40
  38. package/dist/vendor/zephyr3d/scene/dist/posteffect/taa.js.map +1 -1
  39. package/dist/vendor/zephyr3d/scene/dist/render/abuffer_oit.js +1 -0
  40. package/dist/vendor/zephyr3d/scene/dist/render/abuffer_oit.js.map +1 -1
  41. package/dist/vendor/zephyr3d/scene/dist/render/drawable_mixin.js +1 -0
  42. package/dist/vendor/zephyr3d/scene/dist/render/drawable_mixin.js.map +1 -1
  43. package/dist/vendor/zephyr3d/scene/dist/render/fbm_wavegenerator.js +1 -0
  44. package/dist/vendor/zephyr3d/scene/dist/render/fbm_wavegenerator.js.map +1 -1
  45. package/dist/vendor/zephyr3d/scene/dist/render/gerstner_wavegenerator.js +1 -0
  46. package/dist/vendor/zephyr3d/scene/dist/render/gerstner_wavegenerator.js.map +1 -1
  47. package/dist/vendor/zephyr3d/scene/dist/render/globalbindgroup_allocator.js +1 -0
  48. package/dist/vendor/zephyr3d/scene/dist/render/globalbindgroup_allocator.js.map +1 -1
  49. package/dist/vendor/zephyr3d/scene/dist/render/lightpass.js +4 -1
  50. package/dist/vendor/zephyr3d/scene/dist/render/lightpass.js.map +1 -1
  51. package/dist/vendor/zephyr3d/scene/dist/render/render_queue.js +1 -0
  52. package/dist/vendor/zephyr3d/scene/dist/render/render_queue.js.map +1 -1
  53. package/dist/vendor/zephyr3d/scene/dist/render/renderer.js +1 -0
  54. package/dist/vendor/zephyr3d/scene/dist/render/renderer.js.map +1 -1
  55. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/device_pool_allocator.js +12 -5
  56. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  57. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js +78 -8
  58. package/dist/vendor/zephyr3d/scene/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  59. package/dist/vendor/zephyr3d/scene/dist/scene/basesprite.js +1 -0
  60. package/dist/vendor/zephyr3d/scene/dist/scene/basesprite.js.map +1 -1
  61. package/dist/vendor/zephyr3d/scene/dist/scene/batchgroup.js +1 -0
  62. package/dist/vendor/zephyr3d/scene/dist/scene/batchgroup.js.map +1 -1
  63. package/dist/vendor/zephyr3d/scene/dist/scene/environment.js +1 -0
  64. package/dist/vendor/zephyr3d/scene/dist/scene/environment.js.map +1 -1
  65. package/dist/vendor/zephyr3d/scene/dist/scene/light.js +158 -154
  66. package/dist/vendor/zephyr3d/scene/dist/scene/light.js.map +1 -1
  67. package/dist/vendor/zephyr3d/scene/dist/scene/mesh.js +1 -0
  68. package/dist/vendor/zephyr3d/scene/dist/scene/mesh.js.map +1 -1
  69. package/dist/vendor/zephyr3d/scene/dist/scene/msdftext.js +1 -0
  70. package/dist/vendor/zephyr3d/scene/dist/scene/msdftext.js.map +1 -1
  71. package/dist/vendor/zephyr3d/scene/dist/scene/msdftextsprite.js +1 -0
  72. package/dist/vendor/zephyr3d/scene/dist/scene/msdftextsprite.js.map +1 -1
  73. package/dist/vendor/zephyr3d/scene/dist/scene/particlesys.js +1 -0
  74. package/dist/vendor/zephyr3d/scene/dist/scene/particlesys.js.map +1 -1
  75. package/dist/vendor/zephyr3d/scene/dist/scene/scene.js +1 -0
  76. package/dist/vendor/zephyr3d/scene/dist/scene/scene.js.map +1 -1
  77. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grass.js +1 -0
  78. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grass.js.map +1 -1
  79. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grassmaterial.js +1 -0
  80. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  81. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/terrain-cm.js +1 -0
  82. package/dist/vendor/zephyr3d/scene/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  83. package/dist/vendor/zephyr3d/scene/dist/scene/water.js +1 -0
  84. package/dist/vendor/zephyr3d/scene/dist/scene/water.js.map +1 -1
  85. package/dist/vendor/zephyr3d/scene/dist/shaders/shadow.js +617 -1
  86. package/dist/vendor/zephyr3d/scene/dist/shaders/shadow.js.map +1 -1
  87. package/dist/vendor/zephyr3d/scene/dist/shadow/esm.js +1 -0
  88. package/dist/vendor/zephyr3d/scene/dist/shadow/esm.js.map +1 -1
  89. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_opt.js +1 -0
  90. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_opt.js.map +1 -1
  91. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_pd.js +1 -0
  92. package/dist/vendor/zephyr3d/scene/dist/shadow/pcf_pd.js.map +1 -1
  93. package/dist/vendor/zephyr3d/scene/dist/shadow/pcss.js +182 -0
  94. package/dist/vendor/zephyr3d/scene/dist/shadow/pcss.js.map +1 -0
  95. package/dist/vendor/zephyr3d/scene/dist/shadow/shader.js +1 -0
  96. package/dist/vendor/zephyr3d/scene/dist/shadow/shader.js.map +1 -1
  97. package/dist/vendor/zephyr3d/scene/dist/shadow/shadow_impl.js.map +1 -1
  98. package/dist/vendor/zephyr3d/scene/dist/shadow/shadowmapper.js +183 -105
  99. package/dist/vendor/zephyr3d/scene/dist/shadow/shadowmapper.js.map +1 -1
  100. package/dist/vendor/zephyr3d/scene/dist/shadow/ssm.js +1 -0
  101. package/dist/vendor/zephyr3d/scene/dist/shadow/ssm.js.map +1 -1
  102. package/dist/vendor/zephyr3d/scene/dist/shadow/vsm.js +1 -0
  103. package/dist/vendor/zephyr3d/scene/dist/shadow/vsm.js.map +1 -1
  104. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js +3 -1
  105. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/manager.js.map +1 -1
  106. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js +1 -0
  107. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/animation.js.map +1 -1
  108. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/batch.js +1 -0
  109. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/batch.js.map +1 -1
  110. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js +122 -0
  111. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/camera.js.map +1 -1
  112. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js +1 -0
  113. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/common.js.map +1 -1
  114. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js +102 -21
  115. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/light.js.map +1 -1
  116. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js +195 -3
  117. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/material.js.map +1 -1
  118. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js +1 -0
  119. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/mesh.js.map +1 -1
  120. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js +1 -0
  121. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/node.js.map +1 -1
  122. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js +1 -0
  123. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/particle.js.map +1 -1
  124. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js +1 -0
  125. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/primitive.js.map +1 -1
  126. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/sprite.js +1 -0
  127. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/sprite.js.map +1 -1
  128. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js +1 -0
  129. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/terrain.js.map +1 -1
  130. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/text.js +1 -0
  131. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/text.js.map +1 -1
  132. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/water.js +1 -0
  133. package/dist/vendor/zephyr3d/scene/dist/utility/serialization/scene/water.js.map +1 -1
  134. package/dist/vendor/zephyr3d/scene/dist/values.js +1 -0
  135. package/dist/vendor/zephyr3d/scene/dist/values.js.map +1 -1
  136. package/electron/main.cjs +30 -6
  137. package/package.json +4 -4
@@ -1 +1 @@
1
- {"version":3,"file":"msdftextsprite.js","sources":["../../src/scene/msdftextsprite.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector3 } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport type { BoundingVolume } from '../utility/bounding_volume';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { Primitive } from '../render';\r\nimport { MSDFTextSpriteMaterial } from '../material/msdf_text_sprite';\r\nimport type { FontAsset } from '../text/font';\r\nimport type { MSDFGlyphAtlas } from '../text/runtime';\r\nimport { layoutText, type TextAlign, type TextLayoutResult } from '../text/runtime';\r\nimport { getEngine } from '../app/api';\r\nimport { MeshDrawable } from './meshdrawable';\r\nimport { GraphNode } from './graph_node';\r\n\r\n/**\r\n * Billboard MSDF text node.\r\n *\r\n * @public\r\n */\r\nexport class MSDFTextSprite extends GraphNode {\r\n private _fontAsset: FontAsset | null;\r\n private _atlas: MSDFGlyphAtlas | null;\r\n private _text: string;\r\n private _fontSize: number;\r\n private _maxWidth: number;\r\n private _textAlign: TextAlign;\r\n private _anchor: Vector2;\r\n private _color: Vector3;\r\n private _outlineWidth: number;\r\n private _outlineColor: Vector3;\r\n private _pageBatches: MeshDrawable<MSDFTextSpriteMaterial>[];\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._fontAsset = null;\r\n this._atlas = null;\r\n this._text = '';\r\n this._fontSize = 32;\r\n this._maxWidth = 0;\r\n this._textAlign = 'left';\r\n this._anchor = new Vector2(0.5, 0.5);\r\n this._color = new Vector3(1, 1, 1);\r\n this._outlineWidth = 0;\r\n this._outlineColor = new Vector3(0, 0, 0);\r\n this._pageBatches = [];\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n get fontAsset() {\r\n return this._fontAsset;\r\n }\r\n set fontAsset(font: FontAsset | null) {\r\n if (this._fontAsset !== font) {\r\n this._fontAsset = font;\r\n this._atlas = font ? getEngine().msdfTextAtlasManager.getAtlas(font) : null;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get text() {\r\n return this._text;\r\n }\r\n set text(value) {\r\n if (this._text !== value) {\r\n this._text = value ?? '';\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get fontSize() {\r\n return this._fontSize;\r\n }\r\n set fontSize(value) {\r\n if (this._fontSize !== value) {\r\n this._fontSize = Math.max(1, value);\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get maxWidth() {\r\n return this._maxWidth;\r\n }\r\n set maxWidth(value) {\r\n if (this._maxWidth !== value) {\r\n this._maxWidth = Math.max(0, value);\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get textAlign() {\r\n return this._textAlign;\r\n }\r\n set textAlign(value: TextAlign) {\r\n if (this._textAlign !== value) {\r\n this._textAlign = value;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get anchorX() {\r\n return this._anchor.x;\r\n }\r\n set anchorX(value) {\r\n if (this._anchor.x !== value) {\r\n this._anchor.x = value;\r\n this.scene!.queueUpdateNode(this);\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n get anchorY() {\r\n return this._anchor.y;\r\n }\r\n set anchorY(value) {\r\n if (this._anchor.y !== value) {\r\n this._anchor.y = value;\r\n this.scene!.queueUpdateNode(this);\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n get anchor(): Immutable<Vector2> {\r\n return this._anchor;\r\n }\r\n set anchor(value: Immutable<Vector2>) {\r\n if (!this._anchor.equalsTo(value)) {\r\n this._anchor.set(value);\r\n this.scene!.queueUpdateNode(this);\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n get textColor(): Immutable<Vector3> {\r\n return this._color;\r\n }\r\n set textColor(value: Immutable<Vector3>) {\r\n if (!this._color.equalsTo(value)) {\r\n this._color.set(value);\r\n for (const batch of this._pageBatches) {\r\n batch.material!.textColor = value;\r\n }\r\n }\r\n }\r\n get outlineWidth() {\r\n return this._outlineWidth;\r\n }\r\n set outlineWidth(value) {\r\n if (this._outlineWidth !== value) {\r\n this._outlineWidth = value;\r\n for (const batch of this._pageBatches) {\r\n batch.material!.outlineWidth = value;\r\n }\r\n }\r\n }\r\n get outlineColor(): Immutable<Vector3> {\r\n return this._outlineColor;\r\n }\r\n set outlineColor(value: Immutable<Vector3>) {\r\n if (!this._outlineColor.equalsTo(value)) {\r\n this._outlineColor.set(value);\r\n for (const batch of this._pageBatches) {\r\n batch.material!.outlineColor = value;\r\n }\r\n }\r\n }\r\n get batches() {\r\n return this._pageBatches;\r\n }\r\n update(): void {\r\n if (!this._fontAsset || !this._atlas || !this._text) {\r\n this.disposePageBatches();\r\n return;\r\n }\r\n const layout = layoutText(this._atlas, this._fontAsset, this._text, this._fontSize, this._maxWidth);\r\n const geometries = buildPagedSpriteGeometry(\r\n layout,\r\n this._fontAsset.metrics.unitsPerEm,\r\n this._fontAsset.metrics.ascent,\r\n this._fontSize,\r\n this._anchor,\r\n this._textAlign\r\n );\r\n const combinedBounds = new BoundingBox(\r\n new Vector3(geometries.bounds.minX, geometries.bounds.minY, 0),\r\n new Vector3(geometries.bounds.maxX, geometries.bounds.maxY, 0)\r\n );\r\n const pageIndices = [...geometries.pages.keys()].sort((a, b) => a - b);\r\n for (let i = 0; i < pageIndices.length; i++) {\r\n const pageIndex = pageIndices[i];\r\n const geometry = geometries.pages.get(pageIndex)!;\r\n const batch = this.ensurePageBatch(i);\r\n updatePrimitiveGeometry(batch.primitive!, geometry.positions, geometry.uvs, geometry.indices);\r\n batch.primitive!.setBoundingVolume(combinedBounds.clone());\r\n batch.material!.atlasTexture = this._atlas.getAtlasTexture(pageIndex) ?? null;\r\n batch.material!.textColor = this._color;\r\n batch.material!.distanceRange = this._atlas.distanceRange;\r\n batch.material!.outlineWidth = this._outlineWidth;\r\n batch.material!.outlineColor = this._outlineColor;\r\n }\r\n this.disposePageBatches(pageIndices.length);\r\n this.setBoundingVolume(combinedBounds);\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n super.calculateLocalTransform(outMatrix);\r\n for (const batch of this._pageBatches) {\r\n batch.material!.rotation = -this.rotation.toEulerAngles().z;\r\n }\r\n }\r\n computeWorldBoundingVolume(localBV: Nullable<BoundingVolume>) {\r\n const aabb = localBV?.toAABB();\r\n if (!aabb) {\r\n return null;\r\n }\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const scaleX = Math.hypot(this.worldMatrix[0], this.worldMatrix[1], this.worldMatrix[2]);\r\n const scaleY = Math.hypot(this.worldMatrix[4], this.worldMatrix[5], this.worldMatrix[6]);\r\n const extentX = Math.max(Math.abs(aabb.minPoint.x), Math.abs(aabb.maxPoint.x)) * scaleX;\r\n const extentY = Math.max(Math.abs(aabb.minPoint.y), Math.abs(aabb.maxPoint.y)) * scaleY;\r\n const extent = Math.hypot(extentX, extentY);\r\n return new BoundingBox(\r\n new Vector3(p.x - extent, p.y - extent, p.z - extent),\r\n new Vector3(p.x + extent, p.y + extent, p.z + extent)\r\n );\r\n }\r\n isMSDFTextSprite(): this is MSDFTextSprite {\r\n return true;\r\n }\r\n protected onDispose() {\r\n this._atlas = null;\r\n this.disposePageBatches();\r\n super.onDispose();\r\n }\r\n private ensurePageBatch(index: number) {\r\n let batch = this._pageBatches[index];\r\n if (!batch) {\r\n batch = new MeshDrawable(this, new MSDFTextSpriteMaterial(), new Primitive());\r\n this._pageBatches[index] = batch;\r\n }\r\n return batch;\r\n }\r\n private disposePageBatches(fromIndex = 0) {\r\n for (let i = this._pageBatches.length - 1; i >= fromIndex; i--) {\r\n this._pageBatches[i].dispose();\r\n this._pageBatches.splice(i, 1);\r\n }\r\n }\r\n}\r\n\r\nfunction buildPagedSpriteGeometry(\r\n layout: TextLayoutResult,\r\n unitsPerEm: number,\r\n ascent: number,\r\n fontSize: number,\r\n anchor: Immutable<Vector2>,\r\n textAlign: TextAlign\r\n) {\r\n const scale = fontSize / unitsPerEm;\r\n const top = ascent * scale;\r\n const bottom = top - layout.height;\r\n const anchorOffsetX = layout.boxWidth * anchor.x;\r\n const anchorOffsetY = bottom + layout.height * anchor.y;\r\n const lineOffsets = layout.lines.map((line) => {\r\n const gap = Math.max(layout.boxWidth - line.width, 0);\r\n switch (textAlign) {\r\n case 'center':\r\n return gap * 0.5;\r\n case 'right':\r\n return gap;\r\n default:\r\n return 0;\r\n }\r\n });\r\n let minX = -anchorOffsetX;\r\n let maxX = layout.boxWidth - anchorOffsetX;\r\n let minY = bottom - anchorOffsetY;\r\n let maxY = top - anchorOffsetY;\r\n const pageGlyphs = new Map<number, TextLayoutResult['glyphs']>();\r\n for (const glyph of layout.glyphs) {\r\n let list = pageGlyphs.get(glyph.atlasGlyph.atlasIndex);\r\n if (!list) {\r\n list = [];\r\n pageGlyphs.set(glyph.atlasGlyph.atlasIndex, list);\r\n }\r\n list.push(glyph);\r\n }\r\n const pages = new Map<\r\n number,\r\n { positions: Float32Array; uvs: Float32Array; indices: Uint16Array | Uint32Array }\r\n >();\r\n for (const [atlasIndex, glyphs] of pageGlyphs) {\r\n const glyphCount = glyphs.length;\r\n const positions = new Float32Array(glyphCount * 4 * 3);\r\n const uvs = new Float32Array(glyphCount * 4 * 2);\r\n const indices =\r\n glyphCount * 4 > 65535 ? new Uint32Array(glyphCount * 6) : new Uint16Array(glyphCount * 6);\r\n for (let i = 0; i < glyphCount; i++) {\r\n const glyph = glyphs[i];\r\n const atlasGlyph = glyph.atlasGlyph;\r\n const lineOffsetX = lineOffsets[glyph.lineIndex] ?? 0;\r\n const x0 = lineOffsetX + glyph.x + glyph.xOffset + atlasGlyph.planeLeft * scale - anchorOffsetX;\r\n const y0 = -glyph.y + atlasGlyph.planeTop * scale - anchorOffsetY;\r\n const x1 = lineOffsetX + glyph.x + glyph.xOffset + atlasGlyph.planeRight * scale - anchorOffsetX;\r\n const y1 = -glyph.y + atlasGlyph.planeBottom * scale - anchorOffsetY;\r\n minX = Math.min(minX, x0, x1);\r\n maxX = Math.max(maxX, x0, x1);\r\n minY = Math.min(minY, y0, y1);\r\n maxY = Math.max(maxY, y0, y1);\r\n const p = i * 12;\r\n positions[p + 0] = x0;\r\n positions[p + 1] = y0;\r\n positions[p + 2] = 0;\r\n positions[p + 3] = x1;\r\n positions[p + 4] = y0;\r\n positions[p + 5] = 0;\r\n positions[p + 6] = x0;\r\n positions[p + 7] = y1;\r\n positions[p + 8] = 0;\r\n positions[p + 9] = x1;\r\n positions[p + 10] = y1;\r\n positions[p + 11] = 0;\r\n const t = i * 8;\r\n uvs[t + 0] = atlasGlyph.uMin;\r\n uvs[t + 1] = atlasGlyph.vMin;\r\n uvs[t + 2] = atlasGlyph.uMax;\r\n uvs[t + 3] = atlasGlyph.vMin;\r\n uvs[t + 4] = atlasGlyph.uMin;\r\n uvs[t + 5] = atlasGlyph.vMax;\r\n uvs[t + 6] = atlasGlyph.uMax;\r\n uvs[t + 7] = atlasGlyph.vMax;\r\n const baseVertex = i * 4;\r\n const indexOffset = i * 6;\r\n indices[indexOffset + 0] = baseVertex + 0;\r\n indices[indexOffset + 1] = baseVertex + 1;\r\n indices[indexOffset + 2] = baseVertex + 2;\r\n indices[indexOffset + 3] = baseVertex + 2;\r\n indices[indexOffset + 4] = baseVertex + 1;\r\n indices[indexOffset + 5] = baseVertex + 3;\r\n }\r\n pages.set(atlasIndex, { positions, uvs, indices });\r\n }\r\n return {\r\n pages,\r\n bounds: {\r\n minX,\r\n minY,\r\n maxX,\r\n maxY\r\n }\r\n };\r\n}\r\n\r\nfunction updatePrimitiveGeometry(\r\n primitive: Primitive,\r\n positions: Float32Array,\r\n uvs: Float32Array,\r\n indices: Uint16Array | Uint32Array\r\n) {\r\n primitive.removeVertexBuffer('position');\r\n primitive.removeVertexBuffer('texCoord0');\r\n primitive.setIndexBuffer(null);\r\n primitive.createAndSetVertexBuffer('position_f32x3', positions as Float32Array<ArrayBuffer>);\r\n primitive.createAndSetVertexBuffer('tex0_f32x2', uvs as Float32Array<ArrayBuffer>);\r\n primitive.createAndSetIndexBuffer(indices as Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>);\r\n primitive.indexCount = indices.length;\r\n}\r\n"],"names":["MSDFTextSprite","GraphNode","_fontAsset","_atlas","_text","_fontSize","_maxWidth","_textAlign","_anchor","_color","_outlineWidth","_outlineColor","_pageBatches","scene","Vector2","Vector3","queueUpdateNode","fontAsset","font","getEngine","msdfTextAtlasManager","getAtlas","text","value","fontSize","Math","max","maxWidth","textAlign","anchorX","x","invalidateWorldBoundingVolume","anchorY","y","anchor","equalsTo","set","textColor","batch","material","outlineWidth","outlineColor","batches","update","disposePageBatches","layout","layoutText","geometries","buildPagedSpriteGeometry","metrics","unitsPerEm","ascent","combinedBounds","BoundingBox","bounds","minX","minY","maxX","maxY","pageIndices","pages","keys","sort","a","b","i","length","pageIndex","geometry","get","ensurePageBatch","updatePrimitiveGeometry","primitive","positions","uvs","indices","setBoundingVolume","clone","atlasTexture","getAtlasTexture","distanceRange","calculateLocalTransform","outMatrix","rotation","toEulerAngles","z","computeWorldBoundingVolume","localBV","aabb","toAABB","p","worldMatrix","transformPointAffine","zero","scaleX","hypot","scaleY","extentX","abs","minPoint","maxPoint","extentY","extent","isMSDFTextSprite","onDispose","index","MeshDrawable","MSDFTextSpriteMaterial","Primitive","fromIndex","dispose","splice","scale","top","bottom","height","anchorOffsetX","boxWidth","anchorOffsetY","lineOffsets","lines","map","line","gap","width","pageGlyphs","Map","glyph","glyphs","list","atlasGlyph","atlasIndex","push","glyphCount","Float32Array","Uint32Array","Uint16Array","lineOffsetX","lineIndex","x0","xOffset","planeLeft","y0","planeTop","x1","planeRight","y1","planeBottom","min","t","uMin","vMin","uMax","vMax","baseVertex","indexOffset","removeVertexBuffer","setIndexBuffer","createAndSetVertexBuffer","createAndSetIndexBuffer","indexCount"],"mappings":"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"}
1
+ {"version":3,"file":"msdftextsprite.js","sources":["../../src/scene/msdftextsprite.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector2, Vector3 } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport type { BoundingVolume } from '../utility/bounding_volume';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { Primitive } from '../render';\r\nimport { MSDFTextSpriteMaterial } from '../material/msdf_text_sprite';\r\nimport type { FontAsset } from '../text/font';\r\nimport type { MSDFGlyphAtlas } from '../text/runtime';\r\nimport { layoutText, type TextAlign, type TextLayoutResult } from '../text/runtime';\r\nimport { getEngine } from '../app/api';\r\nimport { MeshDrawable } from './meshdrawable';\r\nimport { GraphNode } from './graph_node';\r\n\r\n/**\r\n * Billboard MSDF text node.\r\n *\r\n * @public\r\n */\r\nexport class MSDFTextSprite extends GraphNode {\r\n private _fontAsset: FontAsset | null;\r\n private _atlas: MSDFGlyphAtlas | null;\r\n private _text: string;\r\n private _fontSize: number;\r\n private _maxWidth: number;\r\n private _textAlign: TextAlign;\r\n private _anchor: Vector2;\r\n private _color: Vector3;\r\n private _outlineWidth: number;\r\n private _outlineColor: Vector3;\r\n private _pageBatches: MeshDrawable<MSDFTextSpriteMaterial>[];\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._fontAsset = null;\r\n this._atlas = null;\r\n this._text = '';\r\n this._fontSize = 32;\r\n this._maxWidth = 0;\r\n this._textAlign = 'left';\r\n this._anchor = new Vector2(0.5, 0.5);\r\n this._color = new Vector3(1, 1, 1);\r\n this._outlineWidth = 0;\r\n this._outlineColor = new Vector3(0, 0, 0);\r\n this._pageBatches = [];\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n get fontAsset() {\r\n return this._fontAsset;\r\n }\r\n set fontAsset(font: FontAsset | null) {\r\n if (this._fontAsset !== font) {\r\n this._fontAsset = font;\r\n this._atlas = font ? getEngine().msdfTextAtlasManager.getAtlas(font) : null;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get text() {\r\n return this._text;\r\n }\r\n set text(value) {\r\n if (this._text !== value) {\r\n this._text = value ?? '';\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get fontSize() {\r\n return this._fontSize;\r\n }\r\n set fontSize(value) {\r\n if (this._fontSize !== value) {\r\n this._fontSize = Math.max(1, value);\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get maxWidth() {\r\n return this._maxWidth;\r\n }\r\n set maxWidth(value) {\r\n if (this._maxWidth !== value) {\r\n this._maxWidth = Math.max(0, value);\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get textAlign() {\r\n return this._textAlign;\r\n }\r\n set textAlign(value: TextAlign) {\r\n if (this._textAlign !== value) {\r\n this._textAlign = value;\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n get anchorX() {\r\n return this._anchor.x;\r\n }\r\n set anchorX(value) {\r\n if (this._anchor.x !== value) {\r\n this._anchor.x = value;\r\n this.scene!.queueUpdateNode(this);\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n get anchorY() {\r\n return this._anchor.y;\r\n }\r\n set anchorY(value) {\r\n if (this._anchor.y !== value) {\r\n this._anchor.y = value;\r\n this.scene!.queueUpdateNode(this);\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n get anchor(): Immutable<Vector2> {\r\n return this._anchor;\r\n }\r\n set anchor(value: Immutable<Vector2>) {\r\n if (!this._anchor.equalsTo(value)) {\r\n this._anchor.set(value);\r\n this.scene!.queueUpdateNode(this);\r\n this.invalidateWorldBoundingVolume(false);\r\n }\r\n }\r\n get textColor(): Immutable<Vector3> {\r\n return this._color;\r\n }\r\n set textColor(value: Immutable<Vector3>) {\r\n if (!this._color.equalsTo(value)) {\r\n this._color.set(value);\r\n for (const batch of this._pageBatches) {\r\n batch.material!.textColor = value;\r\n }\r\n }\r\n }\r\n get outlineWidth() {\r\n return this._outlineWidth;\r\n }\r\n set outlineWidth(value) {\r\n if (this._outlineWidth !== value) {\r\n this._outlineWidth = value;\r\n for (const batch of this._pageBatches) {\r\n batch.material!.outlineWidth = value;\r\n }\r\n }\r\n }\r\n get outlineColor(): Immutable<Vector3> {\r\n return this._outlineColor;\r\n }\r\n set outlineColor(value: Immutable<Vector3>) {\r\n if (!this._outlineColor.equalsTo(value)) {\r\n this._outlineColor.set(value);\r\n for (const batch of this._pageBatches) {\r\n batch.material!.outlineColor = value;\r\n }\r\n }\r\n }\r\n get batches() {\r\n return this._pageBatches;\r\n }\r\n update(): void {\r\n if (!this._fontAsset || !this._atlas || !this._text) {\r\n this.disposePageBatches();\r\n return;\r\n }\r\n const layout = layoutText(this._atlas, this._fontAsset, this._text, this._fontSize, this._maxWidth);\r\n const geometries = buildPagedSpriteGeometry(\r\n layout,\r\n this._fontAsset.metrics.unitsPerEm,\r\n this._fontAsset.metrics.ascent,\r\n this._fontSize,\r\n this._anchor,\r\n this._textAlign\r\n );\r\n const combinedBounds = new BoundingBox(\r\n new Vector3(geometries.bounds.minX, geometries.bounds.minY, 0),\r\n new Vector3(geometries.bounds.maxX, geometries.bounds.maxY, 0)\r\n );\r\n const pageIndices = [...geometries.pages.keys()].sort((a, b) => a - b);\r\n for (let i = 0; i < pageIndices.length; i++) {\r\n const pageIndex = pageIndices[i];\r\n const geometry = geometries.pages.get(pageIndex)!;\r\n const batch = this.ensurePageBatch(i);\r\n updatePrimitiveGeometry(batch.primitive!, geometry.positions, geometry.uvs, geometry.indices);\r\n batch.primitive!.setBoundingVolume(combinedBounds.clone());\r\n batch.material!.atlasTexture = this._atlas.getAtlasTexture(pageIndex) ?? null;\r\n batch.material!.textColor = this._color;\r\n batch.material!.distanceRange = this._atlas.distanceRange;\r\n batch.material!.outlineWidth = this._outlineWidth;\r\n batch.material!.outlineColor = this._outlineColor;\r\n }\r\n this.disposePageBatches(pageIndices.length);\r\n this.setBoundingVolume(combinedBounds);\r\n }\r\n calculateLocalTransform(outMatrix: Matrix4x4) {\r\n super.calculateLocalTransform(outMatrix);\r\n for (const batch of this._pageBatches) {\r\n batch.material!.rotation = -this.rotation.toEulerAngles().z;\r\n }\r\n }\r\n computeWorldBoundingVolume(localBV: Nullable<BoundingVolume>) {\r\n const aabb = localBV?.toAABB();\r\n if (!aabb) {\r\n return null;\r\n }\r\n const p = this.worldMatrix.transformPointAffine(Vector3.zero());\r\n const scaleX = Math.hypot(this.worldMatrix[0], this.worldMatrix[1], this.worldMatrix[2]);\r\n const scaleY = Math.hypot(this.worldMatrix[4], this.worldMatrix[5], this.worldMatrix[6]);\r\n const extentX = Math.max(Math.abs(aabb.minPoint.x), Math.abs(aabb.maxPoint.x)) * scaleX;\r\n const extentY = Math.max(Math.abs(aabb.minPoint.y), Math.abs(aabb.maxPoint.y)) * scaleY;\r\n const extent = Math.hypot(extentX, extentY);\r\n return new BoundingBox(\r\n new Vector3(p.x - extent, p.y - extent, p.z - extent),\r\n new Vector3(p.x + extent, p.y + extent, p.z + extent)\r\n );\r\n }\r\n isMSDFTextSprite(): this is MSDFTextSprite {\r\n return true;\r\n }\r\n protected onDispose() {\r\n this._atlas = null;\r\n this.disposePageBatches();\r\n super.onDispose();\r\n }\r\n private ensurePageBatch(index: number) {\r\n let batch = this._pageBatches[index];\r\n if (!batch) {\r\n batch = new MeshDrawable(this, new MSDFTextSpriteMaterial(), new Primitive());\r\n this._pageBatches[index] = batch;\r\n }\r\n return batch;\r\n }\r\n private disposePageBatches(fromIndex = 0) {\r\n for (let i = this._pageBatches.length - 1; i >= fromIndex; i--) {\r\n this._pageBatches[i].dispose();\r\n this._pageBatches.splice(i, 1);\r\n }\r\n }\r\n}\r\n\r\nfunction buildPagedSpriteGeometry(\r\n layout: TextLayoutResult,\r\n unitsPerEm: number,\r\n ascent: number,\r\n fontSize: number,\r\n anchor: Immutable<Vector2>,\r\n textAlign: TextAlign\r\n) {\r\n const scale = fontSize / unitsPerEm;\r\n const top = ascent * scale;\r\n const bottom = top - layout.height;\r\n const anchorOffsetX = layout.boxWidth * anchor.x;\r\n const anchorOffsetY = bottom + layout.height * anchor.y;\r\n const lineOffsets = layout.lines.map((line) => {\r\n const gap = Math.max(layout.boxWidth - line.width, 0);\r\n switch (textAlign) {\r\n case 'center':\r\n return gap * 0.5;\r\n case 'right':\r\n return gap;\r\n default:\r\n return 0;\r\n }\r\n });\r\n let minX = -anchorOffsetX;\r\n let maxX = layout.boxWidth - anchorOffsetX;\r\n let minY = bottom - anchorOffsetY;\r\n let maxY = top - anchorOffsetY;\r\n const pageGlyphs = new Map<number, TextLayoutResult['glyphs']>();\r\n for (const glyph of layout.glyphs) {\r\n let list = pageGlyphs.get(glyph.atlasGlyph.atlasIndex);\r\n if (!list) {\r\n list = [];\r\n pageGlyphs.set(glyph.atlasGlyph.atlasIndex, list);\r\n }\r\n list.push(glyph);\r\n }\r\n const pages = new Map<\r\n number,\r\n { positions: Float32Array; uvs: Float32Array; indices: Uint16Array | Uint32Array }\r\n >();\r\n for (const [atlasIndex, glyphs] of pageGlyphs) {\r\n const glyphCount = glyphs.length;\r\n const positions = new Float32Array(glyphCount * 4 * 3);\r\n const uvs = new Float32Array(glyphCount * 4 * 2);\r\n const indices =\r\n glyphCount * 4 > 65535 ? new Uint32Array(glyphCount * 6) : new Uint16Array(glyphCount * 6);\r\n for (let i = 0; i < glyphCount; i++) {\r\n const glyph = glyphs[i];\r\n const atlasGlyph = glyph.atlasGlyph;\r\n const lineOffsetX = lineOffsets[glyph.lineIndex] ?? 0;\r\n const x0 = lineOffsetX + glyph.x + glyph.xOffset + atlasGlyph.planeLeft * scale - anchorOffsetX;\r\n const y0 = -glyph.y + atlasGlyph.planeTop * scale - anchorOffsetY;\r\n const x1 = lineOffsetX + glyph.x + glyph.xOffset + atlasGlyph.planeRight * scale - anchorOffsetX;\r\n const y1 = -glyph.y + atlasGlyph.planeBottom * scale - anchorOffsetY;\r\n minX = Math.min(minX, x0, x1);\r\n maxX = Math.max(maxX, x0, x1);\r\n minY = Math.min(minY, y0, y1);\r\n maxY = Math.max(maxY, y0, y1);\r\n const p = i * 12;\r\n positions[p + 0] = x0;\r\n positions[p + 1] = y0;\r\n positions[p + 2] = 0;\r\n positions[p + 3] = x1;\r\n positions[p + 4] = y0;\r\n positions[p + 5] = 0;\r\n positions[p + 6] = x0;\r\n positions[p + 7] = y1;\r\n positions[p + 8] = 0;\r\n positions[p + 9] = x1;\r\n positions[p + 10] = y1;\r\n positions[p + 11] = 0;\r\n const t = i * 8;\r\n uvs[t + 0] = atlasGlyph.uMin;\r\n uvs[t + 1] = atlasGlyph.vMin;\r\n uvs[t + 2] = atlasGlyph.uMax;\r\n uvs[t + 3] = atlasGlyph.vMin;\r\n uvs[t + 4] = atlasGlyph.uMin;\r\n uvs[t + 5] = atlasGlyph.vMax;\r\n uvs[t + 6] = atlasGlyph.uMax;\r\n uvs[t + 7] = atlasGlyph.vMax;\r\n const baseVertex = i * 4;\r\n const indexOffset = i * 6;\r\n indices[indexOffset + 0] = baseVertex + 0;\r\n indices[indexOffset + 1] = baseVertex + 1;\r\n indices[indexOffset + 2] = baseVertex + 2;\r\n indices[indexOffset + 3] = baseVertex + 2;\r\n indices[indexOffset + 4] = baseVertex + 1;\r\n indices[indexOffset + 5] = baseVertex + 3;\r\n }\r\n pages.set(atlasIndex, { positions, uvs, indices });\r\n }\r\n return {\r\n pages,\r\n bounds: {\r\n minX,\r\n minY,\r\n maxX,\r\n maxY\r\n }\r\n };\r\n}\r\n\r\nfunction updatePrimitiveGeometry(\r\n primitive: Primitive,\r\n positions: Float32Array,\r\n uvs: Float32Array,\r\n indices: Uint16Array | Uint32Array\r\n) {\r\n primitive.removeVertexBuffer('position');\r\n primitive.removeVertexBuffer('texCoord0');\r\n primitive.setIndexBuffer(null);\r\n primitive.createAndSetVertexBuffer('position_f32x3', positions as Float32Array<ArrayBuffer>);\r\n primitive.createAndSetVertexBuffer('tex0_f32x2', uvs as Float32Array<ArrayBuffer>);\r\n primitive.createAndSetIndexBuffer(indices as Uint16Array<ArrayBuffer> | Uint32Array<ArrayBuffer>);\r\n primitive.indexCount = indices.length;\r\n}\r\n"],"names":["MSDFTextSprite","GraphNode","_fontAsset","_atlas","_text","_fontSize","_maxWidth","_textAlign","_anchor","_color","_outlineWidth","_outlineColor","_pageBatches","scene","Vector2","Vector3","queueUpdateNode","fontAsset","font","getEngine","msdfTextAtlasManager","getAtlas","text","value","fontSize","Math","max","maxWidth","textAlign","anchorX","x","invalidateWorldBoundingVolume","anchorY","y","anchor","equalsTo","set","textColor","batch","material","outlineWidth","outlineColor","batches","update","disposePageBatches","layout","layoutText","geometries","buildPagedSpriteGeometry","metrics","unitsPerEm","ascent","combinedBounds","BoundingBox","bounds","minX","minY","maxX","maxY","pageIndices","pages","keys","sort","a","b","i","length","pageIndex","geometry","get","ensurePageBatch","updatePrimitiveGeometry","primitive","positions","uvs","indices","setBoundingVolume","clone","atlasTexture","getAtlasTexture","distanceRange","calculateLocalTransform","outMatrix","rotation","toEulerAngles","z","computeWorldBoundingVolume","localBV","aabb","toAABB","p","worldMatrix","transformPointAffine","zero","scaleX","hypot","scaleY","extentX","abs","minPoint","maxPoint","extentY","extent","isMSDFTextSprite","onDispose","index","MeshDrawable","MSDFTextSpriteMaterial","Primitive","fromIndex","dispose","splice","scale","top","bottom","height","anchorOffsetX","boxWidth","anchorOffsetY","lineOffsets","lines","map","line","gap","width","pageGlyphs","Map","glyph","glyphs","list","atlasGlyph","atlasIndex","push","glyphCount","Float32Array","Uint32Array","Uint16Array","lineOffsetX","lineIndex","x0","xOffset","planeLeft","y0","planeTop","x1","planeRight","y1","planeBottom","min","t","uMin","vMin","uMax","vMax","baseVertex","indexOffset","removeVertexBuffer","setIndexBuffer","createAndSetVertexBuffer","createAndSetIndexBuffer","indexCount"],"mappings":"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"}
@@ -12,6 +12,7 @@ import '../material/blinn.js';
12
12
  import '../material/unlit.js';
13
13
  import { ParticleMaterial } from '../material/particle.js';
14
14
  import '../material/subsurfaceprofile.js';
15
+ import '../material/skin.js';
15
16
  import '../material/meshmaterial.js';
16
17
  import '../material/grassmaterial.js';
17
18
  import '../material/terrain-cm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"particlesys.js","sources":["../../src/scene/particlesys.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, nextPowerOf2, DRef } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport { GraphNode } from './graph_node';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport type { Drawable, DrawContext, PickTarget, RenderQueue } from '../render';\r\nimport { Primitive } from '../render';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { ParticleMaterial } from '../material';\r\n\r\nconst tmpVec3 = new Vector3();\r\n\r\ntype Particle = {\r\n position: Vector3;\r\n velocity: Vector3;\r\n size1: number;\r\n size2: number;\r\n rotation: number;\r\n lifeSpan: number;\r\n acceleartion: number;\r\n};\r\n\r\ntype ParticleNode = {\r\n particle: Particle;\r\n elapsedTime: number;\r\n size: number;\r\n rotation: number;\r\n ageBias: number;\r\n jitterAngle: number;\r\n};\r\n\r\nconst PS_WORLDSPACE = 1 << 8;\r\n\r\n/**\r\n * Particle emitter shape\r\n * @public\r\n */\r\nexport type EmitterShape = 'point' | 'sphere' | 'box' | 'cylinder' | 'cone';\r\n/**\r\n * Particle emitter behavior\r\n * @public\r\n */\r\nexport type EmitterBehavior = 'surface' | 'volume';\r\n\r\n/**\r\n * Particle system class\r\n * @public\r\n */\r\nexport class ParticleSystem extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private static readonly updateFuncMap: WeakMap<ParticleSystem, () => void> = new WeakMap();\r\n private readonly _activeParticleList: ParticleNode[];\r\n private _maxParticleCount: number;\r\n private _emitInterval: number;\r\n private _emitCount: number;\r\n private _startTick: number;\r\n private _startEmitTime: number;\r\n private _numEmitCount: number;\r\n private readonly _delay: number;\r\n private _airResistence: boolean;\r\n private _flags: number;\r\n private readonly _gravity: Vector3;\r\n private readonly _wind: Vector3;\r\n private _scalar: number;\r\n private _particleRotationMin: number;\r\n private _particleRotationMax: number;\r\n private _jitterSpeed: number;\r\n private _emitterShape: EmitterShape;\r\n private _emitterBehavior: EmitterBehavior;\r\n private _emitterConeRadiusMin: number;\r\n private _emitterConeRadiusMax: number;\r\n private _particleVelocityMin: number;\r\n private _particleVelocityMax: number;\r\n private _particleLifeMin: number;\r\n private _particleLifeMax: number;\r\n private _particleSize1Min: number;\r\n private _particleSize1Max: number;\r\n private _particleSize2Min: number;\r\n private _particleSize2Max: number;\r\n private _particleAccelMin: number;\r\n private _particleAccelMax: number;\r\n private readonly _emitterShapeSizeMin: Vector3;\r\n private readonly _emitterShapeSizeMax: Vector3;\r\n private readonly _primitive: DRef<Primitive>;\r\n private readonly _material: DRef<ParticleMaterial>;\r\n private readonly _wsBoundingBox: BoundingBox;\r\n private readonly _pickTarget: PickTarget;\r\n private _instanceData: Nullable<Float32Array<ArrayBuffer>>;\r\n /**\r\n * Creates a new ParticleSystem node\r\n * @param scene - Which scene the node belongs to\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._activeParticleList = [];\r\n this._maxParticleCount = 100;\r\n this._emitInterval = 100;\r\n this._emitCount = 1;\r\n this._gravity = Vector3.zero();\r\n this._wind = Vector3.zero();\r\n this._startEmitTime = 0;\r\n this._numEmitCount = 0;\r\n this._scalar = 1;\r\n this._airResistence = false;\r\n this._startTick = 0;\r\n this._delay = 0;\r\n this._particleRotationMin = 0;\r\n this._particleRotationMax = 0;\r\n this._jitterSpeed = 1;\r\n this._emitterShape = 'point';\r\n this._emitterBehavior = 'surface';\r\n this._emitterConeRadiusMin = 0;\r\n this._emitterConeRadiusMax = 0.1;\r\n this._emitterShapeSizeMin = Vector3.one();\r\n this._emitterShapeSizeMax = Vector3.one();\r\n this._particleVelocityMin = 2;\r\n this._particleVelocityMax = 3;\r\n this._particleLifeMin = 1;\r\n this._particleLifeMax = 1.5;\r\n this._particleSize1Min = 0.4;\r\n this._particleSize1Max = 0.5;\r\n this._particleSize2Min = 0;\r\n this._particleSize2Max = 0.1;\r\n this._particleAccelMin = -0.01;\r\n this._particleAccelMax = -0.02;\r\n this._pickTarget = { node: this };\r\n this._flags = PS_WORLDSPACE;\r\n this._primitive = new DRef();\r\n this._wsBoundingBox = new BoundingBox();\r\n this._instanceData = null;\r\n this._material = new DRef(new ParticleMaterial());\r\n scene.queueUpdateNode(this);\r\n }\r\n /** Material of the particle system node */\r\n get material() {\r\n return this._material.get();\r\n }\r\n set material(material: Nullable<ParticleMaterial>) {\r\n this._material.set(material);\r\n }\r\n /** Maximum particle count */\r\n get maxParticleCount() {\r\n return this._maxParticleCount;\r\n }\r\n set maxParticleCount(value) {\r\n if (value !== this._maxParticleCount) {\r\n this._maxParticleCount = value;\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n /** Particle emit interval in ms */\r\n get emitInterval() {\r\n return this._emitInterval;\r\n }\r\n set emitInterval(value) {\r\n if (value !== this._emitInterval) {\r\n this._emitInterval = Math.max(value, 1);\r\n this._startEmitTime = 0;\r\n }\r\n }\r\n /** How many particles should be emitted one time */\r\n get emitCount() {\r\n return this._emitCount;\r\n }\r\n set emitCount(value) {\r\n this._emitCount = value;\r\n }\r\n /** Gravity force */\r\n get gravity(): Immutable<Vector3> {\r\n return this._gravity;\r\n }\r\n set gravity(value: Immutable<Vector3>) {\r\n if (!value.equalsTo(this._gravity)) {\r\n this._gravity.set(value);\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n /** Wind force */\r\n get wind(): Immutable<Vector3> {\r\n return this._wind;\r\n }\r\n set wind(value: Immutable<Vector3>) {\r\n if (!value.equalsTo(this._wind)) {\r\n this._wind.set(value);\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n /** Particle scalar */\r\n get scalar() {\r\n return this._scalar;\r\n }\r\n set scalar(value) {\r\n if (value !== this._scalar) {\r\n this._scalar = value;\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n /** Particle aspect ratio */\r\n get aspect() {\r\n return this._material.get()!.aspect;\r\n }\r\n set aspect(value) {\r\n this._material.get()!.aspect = value;\r\n }\r\n /** true if particle effected by wind */\r\n get airResistence() {\r\n return this._airResistence;\r\n }\r\n set airResistence(value) {\r\n this._airResistence = value;\r\n }\r\n /** Minimum particle rotation angle in radians */\r\n get particleRotationMin() {\r\n return this._particleRotationMin;\r\n }\r\n set particleRotationMin(value) {\r\n this._particleRotationMin = value;\r\n }\r\n /** Maximum particle rotation angle in radians */\r\n get particleRotationMax() {\r\n return this._particleRotationMax;\r\n }\r\n set particleRotationMax(value) {\r\n this._particleRotationMax = value;\r\n }\r\n /** Particle jitter speed */\r\n get jitterSpeed() {\r\n return this._jitterSpeed;\r\n }\r\n set jitterSpeed(value) {\r\n this._jitterSpeed = value;\r\n }\r\n /** Particle jitter power */\r\n get jitterPower() {\r\n return this._material.get()!.jitterPower;\r\n }\r\n set jitterPower(value) {\r\n this._material.get()!.jitterPower = value;\r\n }\r\n /** Particle emitter shape */\r\n get emitterShape() {\r\n return this._emitterShape;\r\n }\r\n set emitterShape(value) {\r\n this._emitterShape = value;\r\n }\r\n /** Particle emitter behavior */\r\n get emitterBehavior() {\r\n return this._emitterBehavior;\r\n }\r\n set emitterBehavior(value) {\r\n this._emitterBehavior = value;\r\n }\r\n /** Minimum cone radius of emitter */\r\n get emitterConeRadiusMin() {\r\n return this._emitterConeRadiusMin;\r\n }\r\n set emitterConeRadiusMin(value) {\r\n this._emitterConeRadiusMin = value;\r\n }\r\n /** Maximum cone radius of emitter */\r\n get emitterConeRadiusMax() {\r\n return this._emitterConeRadiusMax;\r\n }\r\n set emitterConeRadiusMax(value) {\r\n this._emitterConeRadiusMax = value;\r\n }\r\n /** Minimum particle velocity */\r\n get particleVelocityMin() {\r\n return this._particleVelocityMin;\r\n }\r\n set particleVelocityMin(value) {\r\n this._particleVelocityMin = value;\r\n }\r\n /** Maximum particle velocity */\r\n get particleVelocityMax() {\r\n return this._particleVelocityMax;\r\n }\r\n set particleVelocityMax(value) {\r\n this._particleVelocityMax = value;\r\n }\r\n /** Minimum particle life */\r\n get particleLifeMin() {\r\n return this._particleLifeMin;\r\n }\r\n set particleLifeMin(value) {\r\n this._particleLifeMin = value;\r\n }\r\n /** Maximum particle life */\r\n get particleLifeMax() {\r\n return this._particleLifeMax;\r\n }\r\n set particleLifeMax(value) {\r\n this._particleLifeMax = value;\r\n }\r\n /** Minimum particle start size */\r\n get particleSize1Min() {\r\n return this._particleSize1Min;\r\n }\r\n set particleSize1Min(value) {\r\n this._particleSize1Min = value;\r\n }\r\n /** Maximum particle start size */\r\n get particleSize1Max() {\r\n return this._particleSize1Max;\r\n }\r\n set particleSize1Max(value) {\r\n this._particleSize1Max = value;\r\n }\r\n /** Minimum particle end size */\r\n get particleSize2Min() {\r\n return this._particleSize2Min;\r\n }\r\n set particleSize2Min(value) {\r\n this._particleSize2Min = value;\r\n }\r\n /** Maximum particle end size */\r\n get particleSize2Max() {\r\n return this._particleSize2Max;\r\n }\r\n set particleSize2Max(value) {\r\n this._particleSize2Max = value;\r\n }\r\n /** Minimum particle acceleration */\r\n get particleAccelMin() {\r\n return this._particleAccelMin;\r\n }\r\n set particleAccelMin(value) {\r\n this._particleAccelMin = value;\r\n }\r\n /** Maximum particle acceleration */\r\n get particleAccelMax() {\r\n return this._particleAccelMax;\r\n }\r\n set particleAccelMax(value) {\r\n this._particleAccelMax = value;\r\n }\r\n /** Minimum emitter shape size */\r\n get emitterShapeSizeMin() {\r\n return this._emitterShapeSizeMin;\r\n }\r\n set emitterShapeSizeMin(value) {\r\n this._emitterShapeSizeMin.set(value);\r\n }\r\n /** Maximum emitter shape size */\r\n get emitterShapeSizeMax() {\r\n return this._emitterShapeSizeMax;\r\n }\r\n set emitterShapeSizeMax(value) {\r\n this._emitterShapeSizeMax.set(value);\r\n }\r\n /** Whether particles are directional */\r\n get directional() {\r\n return this._material.get()!.directional;\r\n }\r\n set directional(val) {\r\n this._material.get()!.directional = val;\r\n }\r\n /** Whether particles are in world space */\r\n get worldSpace() {\r\n return !!(this.flags & PS_WORLDSPACE);\r\n }\r\n set worldSpace(value) {\r\n if (value) {\r\n this.flags |= PS_WORLDSPACE;\r\n } else {\r\n this.flags &= ~PS_WORLDSPACE;\r\n }\r\n }\r\n /** @internal */\r\n get flags() {\r\n return this._flags;\r\n }\r\n /** @internal */\r\n set flags(value) {\r\n this._flags = value;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n return this._wsBoundingBox;\r\n }\r\n /** @internal */\r\n private initParticle(p?: Particle) {\r\n p =\r\n p ??\r\n ({\r\n position: new Vector3(),\r\n velocity: new Vector3()\r\n } as Particle);\r\n this.getParticleInitialPosition(p.position, p.velocity);\r\n p.size1 = this._particleSize1Min + Math.random() * (this._particleSize1Max - this._particleSize1Min);\r\n p.size2 = this._particleSize2Min + Math.random() * (this._particleSize2Max - this._particleSize2Min);\r\n p.rotation =\r\n this._particleRotationMin + Math.random() * (this._particleRotationMax - this._particleRotationMin);\r\n p.lifeSpan = Math.max(\r\n this._particleLifeMin + Math.random() * (this._particleLifeMax - this._particleLifeMin),\r\n 0.01\r\n );\r\n p.acceleartion =\r\n this._particleAccelMin + Math.random() * (this._particleAccelMax - this._particleAccelMin);\r\n return p;\r\n }\r\n private getParticleInitialPosition(pos: Vector3, vel: Vector3) {\r\n if (this._emitterShape === 'point') {\r\n pos.setXYZ(0, 0, 0);\r\n const coneRadius =\r\n this._emitterConeRadiusMin +\r\n Math.random() * (this._emitterConeRadiusMax - this._emitterConeRadiusMin);\r\n vel.x = -coneRadius + Math.random() * 2 * coneRadius;\r\n vel.y = 1;\r\n vel.z = -coneRadius + Math.random() * 2 * coneRadius;\r\n } else {\r\n const shapeSizeX = Math.max(\r\n this._emitterShapeSizeMin.x +\r\n (this._emitterShapeSizeMax.x - this._emitterShapeSizeMin.x) * Math.random(),\r\n 0.01\r\n );\r\n const shapeSizeY = Math.max(\r\n this._emitterShapeSizeMin.y +\r\n (this._emitterShapeSizeMax.y - this._emitterShapeSizeMin.y) * Math.random(),\r\n 0.01\r\n );\r\n const shapeSizeZ = Math.max(\r\n this._emitterShapeSizeMin.z +\r\n (this._emitterShapeSizeMax.z - this._emitterShapeSizeMin.z) * Math.random(),\r\n 0.01\r\n );\r\n switch (this._emitterShape) {\r\n case 'sphere': {\r\n const alpha = Math.PI * Math.random();\r\n const theta = Math.PI * 2 * Math.random();\r\n const r = Math.sin(alpha);\r\n const y = Math.cos(alpha);\r\n const x = Math.sin(theta) * r;\r\n const z = Math.cos(theta) * r;\r\n pos.x = x * shapeSizeX;\r\n pos.y = y * shapeSizeY;\r\n pos.z = z * shapeSizeZ;\r\n vel.x = pos.x;\r\n vel.y = pos.y;\r\n vel.z = pos.z;\r\n if (this._emitterBehavior === 'volume') {\r\n const t = Math.random();\r\n pos.x *= t;\r\n pos.y *= t;\r\n pos.z *= t;\r\n }\r\n break;\r\n }\r\n case 'box': {\r\n let x = Math.random() * 2 - 1;\r\n let y = Math.random() * 2 - 1;\r\n let z = Math.random() * 2 - 1;\r\n if (this._emitterBehavior === 'volume') {\r\n const t = Math.max(Math.abs(x), Math.abs(y), Math.abs(z));\r\n if (t !== 0) {\r\n x /= t;\r\n y /= t;\r\n z /= t;\r\n }\r\n }\r\n pos.x = x * shapeSizeX;\r\n pos.y = y * shapeSizeY;\r\n pos.z = z * shapeSizeZ;\r\n const coneRadius =\r\n this._emitterConeRadiusMin +\r\n (this._emitterConeRadiusMax - this._emitterConeRadiusMin) * Math.random();\r\n vel.x = -coneRadius + Math.random() * 2 * coneRadius;\r\n vel.y = 1;\r\n vel.z = -coneRadius + Math.random() * 2 * coneRadius;\r\n break;\r\n }\r\n case 'cylinder': {\r\n const alpha = Math.random() * Math.PI * 2;\r\n let x = Math.sin(alpha);\r\n let z = Math.cos(alpha);\r\n const y = Math.random() * 2 - 1;\r\n const coneRadius =\r\n this._emitterConeRadiusMin +\r\n (this._emitterConeRadiusMax - this._emitterConeRadiusMin) * Math.random();\r\n vel.x = x * shapeSizeX;\r\n vel.y = (-coneRadius + Math.random() * 2 * coneRadius) * shapeSizeY;\r\n vel.z = z * shapeSizeZ;\r\n if (this._emitterBehavior === 'volume') {\r\n const t = Math.random();\r\n x *= t;\r\n z *= t;\r\n }\r\n pos.x = x * shapeSizeX;\r\n pos.y = y * shapeSizeY;\r\n pos.z = z * shapeSizeZ;\r\n break;\r\n }\r\n case 'cone': {\r\n const alpha = Math.random() * Math.PI * 2;\r\n const scale = Math.random();\r\n const s = Math.sin(alpha);\r\n const c = Math.cos(alpha);\r\n pos.x = s * scale * shapeSizeX;\r\n pos.y = (2 - 2 * scale) * shapeSizeY;\r\n pos.z = c * scale * shapeSizeZ;\r\n const t = (shapeSizeY * shapeSizeY) / Math.hypot(shapeSizeY * shapeSizeY + shapeSizeX + shapeSizeX);\r\n vel.x = s * shapeSizeX * t;\r\n vel.y = -t * shapeSizeY;\r\n vel.z = c * shapeSizeX * t;\r\n break;\r\n }\r\n }\r\n }\r\n vel.inplaceNormalize();\r\n vel.scaleBy(\r\n this._particleVelocityMin + Math.random() * (this._particleVelocityMax - this._particleVelocityMin)\r\n );\r\n }\r\n resizeVertexBuffers() {\r\n if (!this._primitive.get()) {\r\n this._primitive.set(new Primitive());\r\n this._primitive\r\n .get()!\r\n .createAndSetVertexBuffer(\r\n 'position_f32x4',\r\n new Float32Array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3])\r\n );\r\n this._primitive.get()!.createAndSetIndexBuffer(new Uint16Array([0, 1, 2, 3]));\r\n this._primitive.get()!.primitiveType = 'triangle-strip';\r\n }\r\n if (!this._instanceData || this._instanceData.length < this._maxParticleCount * 10) {\r\n this._primitive.get()!.removeVertexBuffer('texCoord0');\r\n this._instanceData = new Float32Array(nextPowerOf2(this._maxParticleCount) * 10);\r\n this._primitive\r\n .get()!\r\n .createAndSetVertexBuffer(['tex0_f32x3', 'tex1_f32x4', 'tex2_f32x3'], this._instanceData, 'instance');\r\n }\r\n }\r\n update(_frameId: number, elapsedInSeconds: number, deltaInSeconds: number) {\r\n if (!this.attached) {\r\n return;\r\n }\r\n this.scene!.queueUpdateNode(this);\r\n const animationSet = this._animationSet.get();\r\n if (animationSet && animationSet.numAnimations > 0) {\r\n animationSet.update(deltaInSeconds);\r\n }\r\n const tick = elapsedInSeconds;\r\n if (this._startTick === 0) {\r\n this._startTick = tick;\r\n }\r\n if (this._delay > 0 && tick - this._startTick < this._delay) {\r\n return;\r\n }\r\n this.invalidateBoundingVolume();\r\n const elapsedInSecond = deltaInSeconds;\r\n for (let i = this._activeParticleList.length - 1; i >= 0; i--) {\r\n const node = this._activeParticleList[i];\r\n const p = node.particle;\r\n node.elapsedTime += elapsedInSecond;\r\n const age = node.elapsedTime / p.lifeSpan;\r\n if (age >= 1) {\r\n this._activeParticleList.splice(i, 1);\r\n } else {\r\n p.velocity.x += this._gravity.x * elapsedInSecond;\r\n p.velocity.y += this._gravity.y * elapsedInSecond;\r\n p.velocity.z += this._gravity.z * elapsedInSecond;\r\n if (this._airResistence) {\r\n p.velocity.x += (this._wind.x - p.velocity.x) * elapsedInSecond;\r\n p.velocity.y += (this._wind.y - p.velocity.y) * elapsedInSecond;\r\n p.velocity.z += (this._wind.z - p.velocity.z) * elapsedInSecond;\r\n }\r\n const len = p.velocity.length;\r\n if (len > 0.0001) {\r\n const s = 1 + (elapsedInSecond * p.acceleartion) / len;\r\n p.velocity.scaleBy(s < 0 ? 0 : s);\r\n }\r\n p.position.x += p.velocity.x * elapsedInSecond * this._scalar;\r\n p.position.y += p.velocity.y * elapsedInSecond * this._scalar;\r\n p.position.z += p.velocity.z * elapsedInSecond * this._scalar;\r\n node.jitterAngle = (node.elapsedTime + p.lifeSpan * node.ageBias) * this._jitterSpeed;\r\n node.size = Math.max(p.size1 + p.size2 * age, 0);\r\n node.rotation += p.rotation * elapsedInSecond;\r\n }\r\n }\r\n let newParticleCount = 0;\r\n if (this._startEmitTime === 0) {\r\n newParticleCount = this._emitCount > this._maxParticleCount ? this._maxParticleCount : this._emitCount;\r\n this._numEmitCount = 1;\r\n this._startEmitTime = tick;\r\n } else {\r\n const emitElapsed = tick - this._startEmitTime;\r\n const count = (((emitElapsed * 1000) / this._emitInterval) >> 0) + 1;\r\n if (count > this._numEmitCount) {\r\n newParticleCount = this._emitCount;\r\n this._numEmitCount = count;\r\n if (this._activeParticleList.length + newParticleCount > this._maxParticleCount) {\r\n newParticleCount = this._maxParticleCount - this._activeParticleList.length;\r\n }\r\n }\r\n }\r\n if (newParticleCount > 0) {\r\n this.newParticle(newParticleCount, this.worldMatrix);\r\n }\r\n this.resizeVertexBuffers();\r\n this._wsBoundingBox.beginExtend();\r\n let n = 0;\r\n const worldSpace = !!(this._flags & PS_WORLDSPACE);\r\n const invWorldMatrix = this.invWorldMatrix;\r\n const instanceData = this._instanceData!;\r\n for (const p of this._activeParticleList) {\r\n if (worldSpace) {\r\n invWorldMatrix.transformPointAffine(p.particle.position, tmpVec3);\r\n instanceData[n++] = tmpVec3.x;\r\n instanceData[n++] = tmpVec3.y;\r\n instanceData[n++] = tmpVec3.z;\r\n this._wsBoundingBox.extend(tmpVec3);\r\n } else {\r\n instanceData[n++] = p.particle.position.x;\r\n instanceData[n++] = p.particle.position.y;\r\n instanceData[n++] = p.particle.position.z;\r\n this._wsBoundingBox.extend(p.particle.position);\r\n }\r\n instanceData[n++] = p.size;\r\n instanceData[n++] = p.rotation;\r\n instanceData[n++] = p.jitterAngle;\r\n instanceData[n++] = p.elapsedTime / p.particle.lifeSpan;\r\n if (worldSpace) {\r\n invWorldMatrix.transformVectorAffine(p.particle.velocity, tmpVec3);\r\n instanceData[n++] = tmpVec3.x;\r\n instanceData[n++] = tmpVec3.y;\r\n instanceData[n++] = tmpVec3.z;\r\n } else {\r\n instanceData[n++] = p.particle.velocity.x;\r\n instanceData[n++] = p.particle.velocity.y;\r\n instanceData[n++] = p.particle.velocity.z;\r\n }\r\n }\r\n let maxParticleSize = Math.max(\r\n Math.abs(this.particleSize1Min),\r\n Math.abs(this.particleSize1Max),\r\n Math.abs(this.particleSize2Min),\r\n Math.abs(this.particleSize2Max)\r\n );\r\n invWorldMatrix.decompose(tmpVec3, null, null);\r\n const scale = Math.max(Math.abs(tmpVec3.x), Math.abs(tmpVec3.y), Math.abs(tmpVec3.z));\r\n maxParticleSize *= scale;\r\n if (this._jitterSpeed !== 0 && this.jitterPower !== 0) {\r\n maxParticleSize += 2 * Math.abs(this.jitterPower);\r\n }\r\n this._wsBoundingBox.minPoint.x -= maxParticleSize;\r\n this._wsBoundingBox.minPoint.y -= maxParticleSize;\r\n this._wsBoundingBox.minPoint.z -= maxParticleSize;\r\n this._wsBoundingBox.maxPoint.x += maxParticleSize;\r\n this._wsBoundingBox.maxPoint.y += maxParticleSize;\r\n this._wsBoundingBox.maxPoint.z += maxParticleSize;\r\n this._primitive.get()!.getVertexBuffer('texCoord0')!.bufferSubData(0, instanceData);\r\n }\r\n newParticle(num: number, worldMatrix: Matrix4x4) {\r\n for (let i = 0; i < num; i++) {\r\n const particle = this.initParticle();\r\n particle.size1 *= this._scalar;\r\n particle.size2 *= this._scalar;\r\n particle.size2 -= particle.size1;\r\n const node: ParticleNode = {\r\n particle,\r\n elapsedTime: 0,\r\n rotation: 0,\r\n size: particle.size1,\r\n ageBias: Math.random(),\r\n jitterAngle: 0\r\n };\r\n if (this._flags & PS_WORLDSPACE) {\r\n worldMatrix.transformPointAffine(particle.position, particle.position);\r\n worldMatrix.transformVectorAffine(particle.velocity, particle.velocity);\r\n }\r\n this._activeParticleList.push(node);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this._material.get()?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this._material.get()?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this._material.get()?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this._material.get()?.needSceneDepth() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return this._primitive.get();\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isParticleSystem}\r\n */\r\n isParticleSystem(): this is ParticleSystem {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n if (this._activeParticleList.length > 0) {\r\n this.bind(ctx, renderQueue);\r\n this._material.get()!.draw(this._primitive.get()!, ctx, this._activeParticleList.length);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.onDispose}\r\n */\r\n onDispose() {\r\n super.onDispose();\r\n this._primitive.dispose();\r\n this._material.dispose();\r\n const func = ParticleSystem.updateFuncMap.get(this);\r\n if (func) {\r\n this._scene!.off('update', func);\r\n }\r\n }\r\n}\r\n"],"names":["tmpVec3","Vector3","PS_WORLDSPACE","ParticleSystem","applyMixins","GraphNode","mixinDrawable","updateFuncMap","WeakMap","_activeParticleList","_maxParticleCount","_emitInterval","_emitCount","_startTick","_startEmitTime","_numEmitCount","_delay","_airResistence","_flags","_gravity","_wind","_scalar","_particleRotationMin","_particleRotationMax","_jitterSpeed","_emitterShape","_emitterBehavior","_emitterConeRadiusMin","_emitterConeRadiusMax","_particleVelocityMin","_particleVelocityMax","_particleLifeMin","_particleLifeMax","_particleSize1Min","_particleSize1Max","_particleSize2Min","_particleSize2Max","_particleAccelMin","_particleAccelMax","_emitterShapeSizeMin","_emitterShapeSizeMax","_primitive","_material","_wsBoundingBox","_pickTarget","_instanceData","scene","zero","one","node","DRef","BoundingBox","ParticleMaterial","queueUpdateNode","material","get","set","maxParticleCount","value","invalidateBoundingVolume","emitInterval","Math","max","emitCount","gravity","equalsTo","wind","scalar","aspect","airResistence","particleRotationMin","particleRotationMax","jitterSpeed","jitterPower","emitterShape","emitterBehavior","emitterConeRadiusMin","emitterConeRadiusMax","particleVelocityMin","particleVelocityMax","particleLifeMin","particleLifeMax","particleSize1Min","particleSize1Max","particleSize2Min","particleSize2Max","particleAccelMin","particleAccelMax","emitterShapeSizeMin","emitterShapeSizeMax","directional","val","worldSpace","flags","computeBoundingVolume","initParticle","p","position","velocity","getParticleInitialPosition","size1","random","size2","rotation","lifeSpan","acceleartion","pos","vel","setXYZ","coneRadius","x","y","z","shapeSizeX","shapeSizeY","shapeSizeZ","alpha","PI","theta","r","sin","cos","t","abs","scale","s","c","hypot","inplaceNormalize","scaleBy","resizeVertexBuffers","Primitive","createAndSetVertexBuffer","Float32Array","createAndSetIndexBuffer","Uint16Array","primitiveType","length","removeVertexBuffer","nextPowerOf2","update","_frameId","elapsedInSeconds","deltaInSeconds","attached","animationSet","_animationSet","numAnimations","tick","elapsedInSecond","i","particle","elapsedTime","age","splice","len","jitterAngle","ageBias","size","newParticleCount","emitElapsed","count","newParticle","worldMatrix","beginExtend","n","invWorldMatrix","instanceData","transformPointAffine","extend","transformVectorAffine","maxParticleSize","decompose","minPoint","maxPoint","getVertexBuffer","bufferSubData","num","push","getPickTarget","getMorphData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isParticleSystem","draw","ctx","renderQueue","bind","onDispose","dispose","func","_scene","off"],"mappings":"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"}
1
+ {"version":3,"file":"particlesys.js","sources":["../../src/scene/particlesys.ts"],"sourcesContent":["import type { Immutable, Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, nextPowerOf2, DRef } from '@zephyr3d/base';\r\nimport { Vector3 } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport { GraphNode } from './graph_node';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport type { Drawable, DrawContext, PickTarget, RenderQueue } from '../render';\r\nimport { Primitive } from '../render';\r\nimport { QUEUE_OPAQUE } from '../values';\r\nimport { ParticleMaterial } from '../material';\r\n\r\nconst tmpVec3 = new Vector3();\r\n\r\ntype Particle = {\r\n position: Vector3;\r\n velocity: Vector3;\r\n size1: number;\r\n size2: number;\r\n rotation: number;\r\n lifeSpan: number;\r\n acceleartion: number;\r\n};\r\n\r\ntype ParticleNode = {\r\n particle: Particle;\r\n elapsedTime: number;\r\n size: number;\r\n rotation: number;\r\n ageBias: number;\r\n jitterAngle: number;\r\n};\r\n\r\nconst PS_WORLDSPACE = 1 << 8;\r\n\r\n/**\r\n * Particle emitter shape\r\n * @public\r\n */\r\nexport type EmitterShape = 'point' | 'sphere' | 'box' | 'cylinder' | 'cone';\r\n/**\r\n * Particle emitter behavior\r\n * @public\r\n */\r\nexport type EmitterBehavior = 'surface' | 'volume';\r\n\r\n/**\r\n * Particle system class\r\n * @public\r\n */\r\nexport class ParticleSystem extends applyMixins(GraphNode, mixinDrawable) implements Drawable {\r\n private static readonly updateFuncMap: WeakMap<ParticleSystem, () => void> = new WeakMap();\r\n private readonly _activeParticleList: ParticleNode[];\r\n private _maxParticleCount: number;\r\n private _emitInterval: number;\r\n private _emitCount: number;\r\n private _startTick: number;\r\n private _startEmitTime: number;\r\n private _numEmitCount: number;\r\n private readonly _delay: number;\r\n private _airResistence: boolean;\r\n private _flags: number;\r\n private readonly _gravity: Vector3;\r\n private readonly _wind: Vector3;\r\n private _scalar: number;\r\n private _particleRotationMin: number;\r\n private _particleRotationMax: number;\r\n private _jitterSpeed: number;\r\n private _emitterShape: EmitterShape;\r\n private _emitterBehavior: EmitterBehavior;\r\n private _emitterConeRadiusMin: number;\r\n private _emitterConeRadiusMax: number;\r\n private _particleVelocityMin: number;\r\n private _particleVelocityMax: number;\r\n private _particleLifeMin: number;\r\n private _particleLifeMax: number;\r\n private _particleSize1Min: number;\r\n private _particleSize1Max: number;\r\n private _particleSize2Min: number;\r\n private _particleSize2Max: number;\r\n private _particleAccelMin: number;\r\n private _particleAccelMax: number;\r\n private readonly _emitterShapeSizeMin: Vector3;\r\n private readonly _emitterShapeSizeMax: Vector3;\r\n private readonly _primitive: DRef<Primitive>;\r\n private readonly _material: DRef<ParticleMaterial>;\r\n private readonly _wsBoundingBox: BoundingBox;\r\n private readonly _pickTarget: PickTarget;\r\n private _instanceData: Nullable<Float32Array<ArrayBuffer>>;\r\n /**\r\n * Creates a new ParticleSystem node\r\n * @param scene - Which scene the node belongs to\r\n */\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._activeParticleList = [];\r\n this._maxParticleCount = 100;\r\n this._emitInterval = 100;\r\n this._emitCount = 1;\r\n this._gravity = Vector3.zero();\r\n this._wind = Vector3.zero();\r\n this._startEmitTime = 0;\r\n this._numEmitCount = 0;\r\n this._scalar = 1;\r\n this._airResistence = false;\r\n this._startTick = 0;\r\n this._delay = 0;\r\n this._particleRotationMin = 0;\r\n this._particleRotationMax = 0;\r\n this._jitterSpeed = 1;\r\n this._emitterShape = 'point';\r\n this._emitterBehavior = 'surface';\r\n this._emitterConeRadiusMin = 0;\r\n this._emitterConeRadiusMax = 0.1;\r\n this._emitterShapeSizeMin = Vector3.one();\r\n this._emitterShapeSizeMax = Vector3.one();\r\n this._particleVelocityMin = 2;\r\n this._particleVelocityMax = 3;\r\n this._particleLifeMin = 1;\r\n this._particleLifeMax = 1.5;\r\n this._particleSize1Min = 0.4;\r\n this._particleSize1Max = 0.5;\r\n this._particleSize2Min = 0;\r\n this._particleSize2Max = 0.1;\r\n this._particleAccelMin = -0.01;\r\n this._particleAccelMax = -0.02;\r\n this._pickTarget = { node: this };\r\n this._flags = PS_WORLDSPACE;\r\n this._primitive = new DRef();\r\n this._wsBoundingBox = new BoundingBox();\r\n this._instanceData = null;\r\n this._material = new DRef(new ParticleMaterial());\r\n scene.queueUpdateNode(this);\r\n }\r\n /** Material of the particle system node */\r\n get material() {\r\n return this._material.get();\r\n }\r\n set material(material: Nullable<ParticleMaterial>) {\r\n this._material.set(material);\r\n }\r\n /** Maximum particle count */\r\n get maxParticleCount() {\r\n return this._maxParticleCount;\r\n }\r\n set maxParticleCount(value) {\r\n if (value !== this._maxParticleCount) {\r\n this._maxParticleCount = value;\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n /** Particle emit interval in ms */\r\n get emitInterval() {\r\n return this._emitInterval;\r\n }\r\n set emitInterval(value) {\r\n if (value !== this._emitInterval) {\r\n this._emitInterval = Math.max(value, 1);\r\n this._startEmitTime = 0;\r\n }\r\n }\r\n /** How many particles should be emitted one time */\r\n get emitCount() {\r\n return this._emitCount;\r\n }\r\n set emitCount(value) {\r\n this._emitCount = value;\r\n }\r\n /** Gravity force */\r\n get gravity(): Immutable<Vector3> {\r\n return this._gravity;\r\n }\r\n set gravity(value: Immutable<Vector3>) {\r\n if (!value.equalsTo(this._gravity)) {\r\n this._gravity.set(value);\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n /** Wind force */\r\n get wind(): Immutable<Vector3> {\r\n return this._wind;\r\n }\r\n set wind(value: Immutable<Vector3>) {\r\n if (!value.equalsTo(this._wind)) {\r\n this._wind.set(value);\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n /** Particle scalar */\r\n get scalar() {\r\n return this._scalar;\r\n }\r\n set scalar(value) {\r\n if (value !== this._scalar) {\r\n this._scalar = value;\r\n this.invalidateBoundingVolume();\r\n }\r\n }\r\n /** Particle aspect ratio */\r\n get aspect() {\r\n return this._material.get()!.aspect;\r\n }\r\n set aspect(value) {\r\n this._material.get()!.aspect = value;\r\n }\r\n /** true if particle effected by wind */\r\n get airResistence() {\r\n return this._airResistence;\r\n }\r\n set airResistence(value) {\r\n this._airResistence = value;\r\n }\r\n /** Minimum particle rotation angle in radians */\r\n get particleRotationMin() {\r\n return this._particleRotationMin;\r\n }\r\n set particleRotationMin(value) {\r\n this._particleRotationMin = value;\r\n }\r\n /** Maximum particle rotation angle in radians */\r\n get particleRotationMax() {\r\n return this._particleRotationMax;\r\n }\r\n set particleRotationMax(value) {\r\n this._particleRotationMax = value;\r\n }\r\n /** Particle jitter speed */\r\n get jitterSpeed() {\r\n return this._jitterSpeed;\r\n }\r\n set jitterSpeed(value) {\r\n this._jitterSpeed = value;\r\n }\r\n /** Particle jitter power */\r\n get jitterPower() {\r\n return this._material.get()!.jitterPower;\r\n }\r\n set jitterPower(value) {\r\n this._material.get()!.jitterPower = value;\r\n }\r\n /** Particle emitter shape */\r\n get emitterShape() {\r\n return this._emitterShape;\r\n }\r\n set emitterShape(value) {\r\n this._emitterShape = value;\r\n }\r\n /** Particle emitter behavior */\r\n get emitterBehavior() {\r\n return this._emitterBehavior;\r\n }\r\n set emitterBehavior(value) {\r\n this._emitterBehavior = value;\r\n }\r\n /** Minimum cone radius of emitter */\r\n get emitterConeRadiusMin() {\r\n return this._emitterConeRadiusMin;\r\n }\r\n set emitterConeRadiusMin(value) {\r\n this._emitterConeRadiusMin = value;\r\n }\r\n /** Maximum cone radius of emitter */\r\n get emitterConeRadiusMax() {\r\n return this._emitterConeRadiusMax;\r\n }\r\n set emitterConeRadiusMax(value) {\r\n this._emitterConeRadiusMax = value;\r\n }\r\n /** Minimum particle velocity */\r\n get particleVelocityMin() {\r\n return this._particleVelocityMin;\r\n }\r\n set particleVelocityMin(value) {\r\n this._particleVelocityMin = value;\r\n }\r\n /** Maximum particle velocity */\r\n get particleVelocityMax() {\r\n return this._particleVelocityMax;\r\n }\r\n set particleVelocityMax(value) {\r\n this._particleVelocityMax = value;\r\n }\r\n /** Minimum particle life */\r\n get particleLifeMin() {\r\n return this._particleLifeMin;\r\n }\r\n set particleLifeMin(value) {\r\n this._particleLifeMin = value;\r\n }\r\n /** Maximum particle life */\r\n get particleLifeMax() {\r\n return this._particleLifeMax;\r\n }\r\n set particleLifeMax(value) {\r\n this._particleLifeMax = value;\r\n }\r\n /** Minimum particle start size */\r\n get particleSize1Min() {\r\n return this._particleSize1Min;\r\n }\r\n set particleSize1Min(value) {\r\n this._particleSize1Min = value;\r\n }\r\n /** Maximum particle start size */\r\n get particleSize1Max() {\r\n return this._particleSize1Max;\r\n }\r\n set particleSize1Max(value) {\r\n this._particleSize1Max = value;\r\n }\r\n /** Minimum particle end size */\r\n get particleSize2Min() {\r\n return this._particleSize2Min;\r\n }\r\n set particleSize2Min(value) {\r\n this._particleSize2Min = value;\r\n }\r\n /** Maximum particle end size */\r\n get particleSize2Max() {\r\n return this._particleSize2Max;\r\n }\r\n set particleSize2Max(value) {\r\n this._particleSize2Max = value;\r\n }\r\n /** Minimum particle acceleration */\r\n get particleAccelMin() {\r\n return this._particleAccelMin;\r\n }\r\n set particleAccelMin(value) {\r\n this._particleAccelMin = value;\r\n }\r\n /** Maximum particle acceleration */\r\n get particleAccelMax() {\r\n return this._particleAccelMax;\r\n }\r\n set particleAccelMax(value) {\r\n this._particleAccelMax = value;\r\n }\r\n /** Minimum emitter shape size */\r\n get emitterShapeSizeMin() {\r\n return this._emitterShapeSizeMin;\r\n }\r\n set emitterShapeSizeMin(value) {\r\n this._emitterShapeSizeMin.set(value);\r\n }\r\n /** Maximum emitter shape size */\r\n get emitterShapeSizeMax() {\r\n return this._emitterShapeSizeMax;\r\n }\r\n set emitterShapeSizeMax(value) {\r\n this._emitterShapeSizeMax.set(value);\r\n }\r\n /** Whether particles are directional */\r\n get directional() {\r\n return this._material.get()!.directional;\r\n }\r\n set directional(val) {\r\n this._material.get()!.directional = val;\r\n }\r\n /** Whether particles are in world space */\r\n get worldSpace() {\r\n return !!(this.flags & PS_WORLDSPACE);\r\n }\r\n set worldSpace(value) {\r\n if (value) {\r\n this.flags |= PS_WORLDSPACE;\r\n } else {\r\n this.flags &= ~PS_WORLDSPACE;\r\n }\r\n }\r\n /** @internal */\r\n get flags() {\r\n return this._flags;\r\n }\r\n /** @internal */\r\n set flags(value) {\r\n this._flags = value;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n return this._wsBoundingBox;\r\n }\r\n /** @internal */\r\n private initParticle(p?: Particle) {\r\n p =\r\n p ??\r\n ({\r\n position: new Vector3(),\r\n velocity: new Vector3()\r\n } as Particle);\r\n this.getParticleInitialPosition(p.position, p.velocity);\r\n p.size1 = this._particleSize1Min + Math.random() * (this._particleSize1Max - this._particleSize1Min);\r\n p.size2 = this._particleSize2Min + Math.random() * (this._particleSize2Max - this._particleSize2Min);\r\n p.rotation =\r\n this._particleRotationMin + Math.random() * (this._particleRotationMax - this._particleRotationMin);\r\n p.lifeSpan = Math.max(\r\n this._particleLifeMin + Math.random() * (this._particleLifeMax - this._particleLifeMin),\r\n 0.01\r\n );\r\n p.acceleartion =\r\n this._particleAccelMin + Math.random() * (this._particleAccelMax - this._particleAccelMin);\r\n return p;\r\n }\r\n private getParticleInitialPosition(pos: Vector3, vel: Vector3) {\r\n if (this._emitterShape === 'point') {\r\n pos.setXYZ(0, 0, 0);\r\n const coneRadius =\r\n this._emitterConeRadiusMin +\r\n Math.random() * (this._emitterConeRadiusMax - this._emitterConeRadiusMin);\r\n vel.x = -coneRadius + Math.random() * 2 * coneRadius;\r\n vel.y = 1;\r\n vel.z = -coneRadius + Math.random() * 2 * coneRadius;\r\n } else {\r\n const shapeSizeX = Math.max(\r\n this._emitterShapeSizeMin.x +\r\n (this._emitterShapeSizeMax.x - this._emitterShapeSizeMin.x) * Math.random(),\r\n 0.01\r\n );\r\n const shapeSizeY = Math.max(\r\n this._emitterShapeSizeMin.y +\r\n (this._emitterShapeSizeMax.y - this._emitterShapeSizeMin.y) * Math.random(),\r\n 0.01\r\n );\r\n const shapeSizeZ = Math.max(\r\n this._emitterShapeSizeMin.z +\r\n (this._emitterShapeSizeMax.z - this._emitterShapeSizeMin.z) * Math.random(),\r\n 0.01\r\n );\r\n switch (this._emitterShape) {\r\n case 'sphere': {\r\n const alpha = Math.PI * Math.random();\r\n const theta = Math.PI * 2 * Math.random();\r\n const r = Math.sin(alpha);\r\n const y = Math.cos(alpha);\r\n const x = Math.sin(theta) * r;\r\n const z = Math.cos(theta) * r;\r\n pos.x = x * shapeSizeX;\r\n pos.y = y * shapeSizeY;\r\n pos.z = z * shapeSizeZ;\r\n vel.x = pos.x;\r\n vel.y = pos.y;\r\n vel.z = pos.z;\r\n if (this._emitterBehavior === 'volume') {\r\n const t = Math.random();\r\n pos.x *= t;\r\n pos.y *= t;\r\n pos.z *= t;\r\n }\r\n break;\r\n }\r\n case 'box': {\r\n let x = Math.random() * 2 - 1;\r\n let y = Math.random() * 2 - 1;\r\n let z = Math.random() * 2 - 1;\r\n if (this._emitterBehavior === 'volume') {\r\n const t = Math.max(Math.abs(x), Math.abs(y), Math.abs(z));\r\n if (t !== 0) {\r\n x /= t;\r\n y /= t;\r\n z /= t;\r\n }\r\n }\r\n pos.x = x * shapeSizeX;\r\n pos.y = y * shapeSizeY;\r\n pos.z = z * shapeSizeZ;\r\n const coneRadius =\r\n this._emitterConeRadiusMin +\r\n (this._emitterConeRadiusMax - this._emitterConeRadiusMin) * Math.random();\r\n vel.x = -coneRadius + Math.random() * 2 * coneRadius;\r\n vel.y = 1;\r\n vel.z = -coneRadius + Math.random() * 2 * coneRadius;\r\n break;\r\n }\r\n case 'cylinder': {\r\n const alpha = Math.random() * Math.PI * 2;\r\n let x = Math.sin(alpha);\r\n let z = Math.cos(alpha);\r\n const y = Math.random() * 2 - 1;\r\n const coneRadius =\r\n this._emitterConeRadiusMin +\r\n (this._emitterConeRadiusMax - this._emitterConeRadiusMin) * Math.random();\r\n vel.x = x * shapeSizeX;\r\n vel.y = (-coneRadius + Math.random() * 2 * coneRadius) * shapeSizeY;\r\n vel.z = z * shapeSizeZ;\r\n if (this._emitterBehavior === 'volume') {\r\n const t = Math.random();\r\n x *= t;\r\n z *= t;\r\n }\r\n pos.x = x * shapeSizeX;\r\n pos.y = y * shapeSizeY;\r\n pos.z = z * shapeSizeZ;\r\n break;\r\n }\r\n case 'cone': {\r\n const alpha = Math.random() * Math.PI * 2;\r\n const scale = Math.random();\r\n const s = Math.sin(alpha);\r\n const c = Math.cos(alpha);\r\n pos.x = s * scale * shapeSizeX;\r\n pos.y = (2 - 2 * scale) * shapeSizeY;\r\n pos.z = c * scale * shapeSizeZ;\r\n const t = (shapeSizeY * shapeSizeY) / Math.hypot(shapeSizeY * shapeSizeY + shapeSizeX + shapeSizeX);\r\n vel.x = s * shapeSizeX * t;\r\n vel.y = -t * shapeSizeY;\r\n vel.z = c * shapeSizeX * t;\r\n break;\r\n }\r\n }\r\n }\r\n vel.inplaceNormalize();\r\n vel.scaleBy(\r\n this._particleVelocityMin + Math.random() * (this._particleVelocityMax - this._particleVelocityMin)\r\n );\r\n }\r\n resizeVertexBuffers() {\r\n if (!this._primitive.get()) {\r\n this._primitive.set(new Primitive());\r\n this._primitive\r\n .get()!\r\n .createAndSetVertexBuffer(\r\n 'position_f32x4',\r\n new Float32Array([0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 2, 0, 0, 0, 3])\r\n );\r\n this._primitive.get()!.createAndSetIndexBuffer(new Uint16Array([0, 1, 2, 3]));\r\n this._primitive.get()!.primitiveType = 'triangle-strip';\r\n }\r\n if (!this._instanceData || this._instanceData.length < this._maxParticleCount * 10) {\r\n this._primitive.get()!.removeVertexBuffer('texCoord0');\r\n this._instanceData = new Float32Array(nextPowerOf2(this._maxParticleCount) * 10);\r\n this._primitive\r\n .get()!\r\n .createAndSetVertexBuffer(['tex0_f32x3', 'tex1_f32x4', 'tex2_f32x3'], this._instanceData, 'instance');\r\n }\r\n }\r\n update(_frameId: number, elapsedInSeconds: number, deltaInSeconds: number) {\r\n if (!this.attached) {\r\n return;\r\n }\r\n this.scene!.queueUpdateNode(this);\r\n const animationSet = this._animationSet.get();\r\n if (animationSet && animationSet.numAnimations > 0) {\r\n animationSet.update(deltaInSeconds);\r\n }\r\n const tick = elapsedInSeconds;\r\n if (this._startTick === 0) {\r\n this._startTick = tick;\r\n }\r\n if (this._delay > 0 && tick - this._startTick < this._delay) {\r\n return;\r\n }\r\n this.invalidateBoundingVolume();\r\n const elapsedInSecond = deltaInSeconds;\r\n for (let i = this._activeParticleList.length - 1; i >= 0; i--) {\r\n const node = this._activeParticleList[i];\r\n const p = node.particle;\r\n node.elapsedTime += elapsedInSecond;\r\n const age = node.elapsedTime / p.lifeSpan;\r\n if (age >= 1) {\r\n this._activeParticleList.splice(i, 1);\r\n } else {\r\n p.velocity.x += this._gravity.x * elapsedInSecond;\r\n p.velocity.y += this._gravity.y * elapsedInSecond;\r\n p.velocity.z += this._gravity.z * elapsedInSecond;\r\n if (this._airResistence) {\r\n p.velocity.x += (this._wind.x - p.velocity.x) * elapsedInSecond;\r\n p.velocity.y += (this._wind.y - p.velocity.y) * elapsedInSecond;\r\n p.velocity.z += (this._wind.z - p.velocity.z) * elapsedInSecond;\r\n }\r\n const len = p.velocity.length;\r\n if (len > 0.0001) {\r\n const s = 1 + (elapsedInSecond * p.acceleartion) / len;\r\n p.velocity.scaleBy(s < 0 ? 0 : s);\r\n }\r\n p.position.x += p.velocity.x * elapsedInSecond * this._scalar;\r\n p.position.y += p.velocity.y * elapsedInSecond * this._scalar;\r\n p.position.z += p.velocity.z * elapsedInSecond * this._scalar;\r\n node.jitterAngle = (node.elapsedTime + p.lifeSpan * node.ageBias) * this._jitterSpeed;\r\n node.size = Math.max(p.size1 + p.size2 * age, 0);\r\n node.rotation += p.rotation * elapsedInSecond;\r\n }\r\n }\r\n let newParticleCount = 0;\r\n if (this._startEmitTime === 0) {\r\n newParticleCount = this._emitCount > this._maxParticleCount ? this._maxParticleCount : this._emitCount;\r\n this._numEmitCount = 1;\r\n this._startEmitTime = tick;\r\n } else {\r\n const emitElapsed = tick - this._startEmitTime;\r\n const count = (((emitElapsed * 1000) / this._emitInterval) >> 0) + 1;\r\n if (count > this._numEmitCount) {\r\n newParticleCount = this._emitCount;\r\n this._numEmitCount = count;\r\n if (this._activeParticleList.length + newParticleCount > this._maxParticleCount) {\r\n newParticleCount = this._maxParticleCount - this._activeParticleList.length;\r\n }\r\n }\r\n }\r\n if (newParticleCount > 0) {\r\n this.newParticle(newParticleCount, this.worldMatrix);\r\n }\r\n this.resizeVertexBuffers();\r\n this._wsBoundingBox.beginExtend();\r\n let n = 0;\r\n const worldSpace = !!(this._flags & PS_WORLDSPACE);\r\n const invWorldMatrix = this.invWorldMatrix;\r\n const instanceData = this._instanceData!;\r\n for (const p of this._activeParticleList) {\r\n if (worldSpace) {\r\n invWorldMatrix.transformPointAffine(p.particle.position, tmpVec3);\r\n instanceData[n++] = tmpVec3.x;\r\n instanceData[n++] = tmpVec3.y;\r\n instanceData[n++] = tmpVec3.z;\r\n this._wsBoundingBox.extend(tmpVec3);\r\n } else {\r\n instanceData[n++] = p.particle.position.x;\r\n instanceData[n++] = p.particle.position.y;\r\n instanceData[n++] = p.particle.position.z;\r\n this._wsBoundingBox.extend(p.particle.position);\r\n }\r\n instanceData[n++] = p.size;\r\n instanceData[n++] = p.rotation;\r\n instanceData[n++] = p.jitterAngle;\r\n instanceData[n++] = p.elapsedTime / p.particle.lifeSpan;\r\n if (worldSpace) {\r\n invWorldMatrix.transformVectorAffine(p.particle.velocity, tmpVec3);\r\n instanceData[n++] = tmpVec3.x;\r\n instanceData[n++] = tmpVec3.y;\r\n instanceData[n++] = tmpVec3.z;\r\n } else {\r\n instanceData[n++] = p.particle.velocity.x;\r\n instanceData[n++] = p.particle.velocity.y;\r\n instanceData[n++] = p.particle.velocity.z;\r\n }\r\n }\r\n let maxParticleSize = Math.max(\r\n Math.abs(this.particleSize1Min),\r\n Math.abs(this.particleSize1Max),\r\n Math.abs(this.particleSize2Min),\r\n Math.abs(this.particleSize2Max)\r\n );\r\n invWorldMatrix.decompose(tmpVec3, null, null);\r\n const scale = Math.max(Math.abs(tmpVec3.x), Math.abs(tmpVec3.y), Math.abs(tmpVec3.z));\r\n maxParticleSize *= scale;\r\n if (this._jitterSpeed !== 0 && this.jitterPower !== 0) {\r\n maxParticleSize += 2 * Math.abs(this.jitterPower);\r\n }\r\n this._wsBoundingBox.minPoint.x -= maxParticleSize;\r\n this._wsBoundingBox.minPoint.y -= maxParticleSize;\r\n this._wsBoundingBox.minPoint.z -= maxParticleSize;\r\n this._wsBoundingBox.maxPoint.x += maxParticleSize;\r\n this._wsBoundingBox.maxPoint.y += maxParticleSize;\r\n this._wsBoundingBox.maxPoint.z += maxParticleSize;\r\n this._primitive.get()!.getVertexBuffer('texCoord0')!.bufferSubData(0, instanceData);\r\n }\r\n newParticle(num: number, worldMatrix: Matrix4x4) {\r\n for (let i = 0; i < num; i++) {\r\n const particle = this.initParticle();\r\n particle.size1 *= this._scalar;\r\n particle.size2 *= this._scalar;\r\n particle.size2 -= particle.size1;\r\n const node: ParticleNode = {\r\n particle,\r\n elapsedTime: 0,\r\n rotation: 0,\r\n size: particle.size1,\r\n ageBias: Math.random(),\r\n jitterAngle: 0\r\n };\r\n if (this._flags & PS_WORLDSPACE) {\r\n worldMatrix.transformPointAffine(particle.position, particle.position);\r\n worldMatrix.transformVectorAffine(particle.velocity, particle.velocity);\r\n }\r\n this._activeParticleList.push(node);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this._material.get()?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this._material.get()?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this._material.get()?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this._material.get()?.needSceneDepth() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this._material.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return this._primitive.get();\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isParticleSystem}\r\n */\r\n isParticleSystem(): this is ParticleSystem {\r\n return true;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>) {\r\n if (this._activeParticleList.length > 0) {\r\n this.bind(ctx, renderQueue);\r\n this._material.get()!.draw(this._primitive.get()!, ctx, this._activeParticleList.length);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.onDispose}\r\n */\r\n onDispose() {\r\n super.onDispose();\r\n this._primitive.dispose();\r\n this._material.dispose();\r\n const func = ParticleSystem.updateFuncMap.get(this);\r\n if (func) {\r\n this._scene!.off('update', func);\r\n }\r\n }\r\n}\r\n"],"names":["tmpVec3","Vector3","PS_WORLDSPACE","ParticleSystem","applyMixins","GraphNode","mixinDrawable","updateFuncMap","WeakMap","_activeParticleList","_maxParticleCount","_emitInterval","_emitCount","_startTick","_startEmitTime","_numEmitCount","_delay","_airResistence","_flags","_gravity","_wind","_scalar","_particleRotationMin","_particleRotationMax","_jitterSpeed","_emitterShape","_emitterBehavior","_emitterConeRadiusMin","_emitterConeRadiusMax","_particleVelocityMin","_particleVelocityMax","_particleLifeMin","_particleLifeMax","_particleSize1Min","_particleSize1Max","_particleSize2Min","_particleSize2Max","_particleAccelMin","_particleAccelMax","_emitterShapeSizeMin","_emitterShapeSizeMax","_primitive","_material","_wsBoundingBox","_pickTarget","_instanceData","scene","zero","one","node","DRef","BoundingBox","ParticleMaterial","queueUpdateNode","material","get","set","maxParticleCount","value","invalidateBoundingVolume","emitInterval","Math","max","emitCount","gravity","equalsTo","wind","scalar","aspect","airResistence","particleRotationMin","particleRotationMax","jitterSpeed","jitterPower","emitterShape","emitterBehavior","emitterConeRadiusMin","emitterConeRadiusMax","particleVelocityMin","particleVelocityMax","particleLifeMin","particleLifeMax","particleSize1Min","particleSize1Max","particleSize2Min","particleSize2Max","particleAccelMin","particleAccelMax","emitterShapeSizeMin","emitterShapeSizeMax","directional","val","worldSpace","flags","computeBoundingVolume","initParticle","p","position","velocity","getParticleInitialPosition","size1","random","size2","rotation","lifeSpan","acceleartion","pos","vel","setXYZ","coneRadius","x","y","z","shapeSizeX","shapeSizeY","shapeSizeZ","alpha","PI","theta","r","sin","cos","t","abs","scale","s","c","hypot","inplaceNormalize","scaleBy","resizeVertexBuffers","Primitive","createAndSetVertexBuffer","Float32Array","createAndSetIndexBuffer","Uint16Array","primitiveType","length","removeVertexBuffer","nextPowerOf2","update","_frameId","elapsedInSeconds","deltaInSeconds","attached","animationSet","_animationSet","numAnimations","tick","elapsedInSecond","i","particle","elapsedTime","age","splice","len","jitterAngle","ageBias","size","newParticleCount","emitElapsed","count","newParticle","worldMatrix","beginExtend","n","invWorldMatrix","instanceData","transformPointAffine","extend","transformVectorAffine","maxParticleSize","decompose","minPoint","maxPoint","getVertexBuffer","bufferSubData","num","push","getPickTarget","getMorphData","getMorphInfo","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","getMaterial","getPrimitive","isParticleSystem","draw","ctx","renderQueue","bind","onDispose","dispose","func","_scene","off"],"mappings":"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"}
@@ -18,6 +18,7 @@ import '../material/blinn.js';
18
18
  import '../material/unlit.js';
19
19
  import '../material/particle.js';
20
20
  import '../material/subsurfaceprofile.js';
21
+ import '../material/skin.js';
21
22
  import '../material/meshmaterial.js';
22
23
  import '../material/grassmaterial.js';
23
24
  import '../material/terrain-cm.js';
@@ -1 +1 @@
1
- {"version":3,"file":"scene.js","sources":["../../src/scene/scene.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector3, Vector4, Ray, DRef, DWeakRef, makeObservable, Disposable } from '@zephyr3d/base';\r\nimport { SceneNode } from './scene_node';\r\nimport { Octree } from './octree';\r\nimport { RaycastVisitor } from './raycast_visitor';\r\nimport { Environment } from './environment';\r\nimport type { GraphNode } from './graph_node';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { Drawable } from '../render';\r\nimport { SceneRenderer } from '../render';\r\nimport type { Compositor } from '../posteffect';\r\nimport type { Metadata } from 'draco3d';\r\nimport { getDevice } from '../app/api';\r\nimport type { IRenderable } from '../app';\r\nimport {\r\n normalizeScriptAttachmentConfig,\r\n normalizeScriptAttachments,\r\n ScriptAttachment\r\n} from './script_attachment';\r\n\r\n/**\r\n * Represents a renderable world that manages scene graph, spatial indexing, and environment.\r\n *\r\n * Core responsibilities:\r\n * - Owns the root {@link SceneNode} and maintains a spatial {@link Octree} for culling/raycasting.\r\n * - Manages environment/lighting via {@link Environment}.\r\n * - Provides per-frame update queues (global and per-camera) for scene nodes.\r\n * - Offers utilities like ray construction and raycasting.\r\n * - Emits observable events: `update`, `startrender`, `endrender`.\r\n *\r\n * Performance notes:\r\n * - Octree placement is lazily synchronized on demand before reads (e.g., `octree`, `boundingBox`)\r\n * and during per-frame updates.\r\n * - Update queues use weak references to avoid retaining disposed nodes.\r\n *\r\n * @public\r\n */\r\nexport class Scene\r\n extends makeObservable(Disposable)<{\r\n /** Dispatched once per frame before render-related work. */\r\n update: [Scene];\r\n /** Dispatched immediately before rendering begins for a camera. */\r\n startrender: [Scene, Camera, Compositor];\r\n /** Dispatched immediately after rendering finishes for a camera. */\r\n endrender: [Scene, Camera, Compositor];\r\n }>()\r\n implements IRenderable\r\n{\r\n /** @internal */\r\n private static _nextId = 0;\r\n /** @internal Scene name. */\r\n protected _name: string;\r\n /** @internal Root node reference. */\r\n protected _rootNode: DRef<SceneNode>;\r\n /** @internal Spatial index for placement/culling. */\r\n protected _octree: Octree;\r\n /**\r\n * @internal Pending nodes whose placement in the octree must be updated.\r\n * Populated by {@link Scene.invalidateNodePlacement} and drained by {@link Scene.updateNodePlacement}.\r\n */\r\n protected _nodePlaceList: Set<GraphNode>;\r\n /** @internal Environment data (sky/light/IBL). */\r\n protected _env: Environment;\r\n /** @internal Frame counter that last updated this scene. */\r\n protected _updateFrame: number;\r\n /** @internal Unique scene ID. */\r\n protected _id: number;\r\n /** @internal One-shot per-frame update queue (runs before render). */\r\n protected _nodeUpdateQueue: DWeakRef<SceneNode>[];\r\n /** @internal */\r\n protected _drawableUpdateQueue: Drawable[];\r\n /** @internal One-shot per-frame-per-camera update queue. */\r\n protected _perCameraUpdateQueue: DWeakRef<SceneNode>[];\r\n /** @internal Main camera reference. */\r\n protected _mainCamera: DRef<Camera>;\r\n /** @internal Arbitrary metadata loaded with the scene (optional). */\r\n protected _metaData: Nullable<Metadata>;\r\n /** @internal User-attached script entries (engine-defined). */\r\n private _scripts: ScriptAttachment[];\r\n /**\r\n * Creates an instance of Scene.\r\n *\r\n * Initializes:\r\n * - Unique ID\r\n * - Empty environment\r\n * - Octree with default depth/leaf capacities\r\n * - Root scene node named \"Root\"\r\n *\r\n * @param name - Optional scene name for diagnostics/UI.\r\n */\r\n constructor(name?: string) {\r\n super();\r\n this._id = ++Scene._nextId;\r\n this._name = name ?? '';\r\n this._octree = new Octree(this, 8, 8);\r\n this._nodePlaceList = new Set();\r\n this._nodeUpdateQueue = [];\r\n this._drawableUpdateQueue = [];\r\n this._perCameraUpdateQueue = [];\r\n this._env = new Environment();\r\n this._updateFrame = -1;\r\n this._rootNode = new DRef();\r\n this._rootNode.set(new SceneNode(this));\r\n this._rootNode.get()!.name = 'Root';\r\n this._metaData = null;\r\n this._scripts = [];\r\n this._mainCamera = new DRef();\r\n }\r\n /**\r\n * Gets the unique identifier of the scene.\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n /**\r\n * Name of the scene\r\n */\r\n get name() {\r\n return this._name;\r\n }\r\n set name(val: string) {\r\n this._name = val ?? '';\r\n }\r\n /**\r\n * Main camera used to render the scene by default.\r\n */\r\n get mainCamera() {\r\n return this._mainCamera.get();\r\n }\r\n set mainCamera(camera) {\r\n this._mainCamera.set(camera);\r\n }\r\n /**\r\n * Gets the root scene node of the scene\r\n */\r\n get rootNode() {\r\n return this._rootNode.get()!;\r\n }\r\n /**\r\n * Gets the octree used for spatial organization and queries.\r\n *\r\n * Ensures pending node placements are synchronized before returning.\r\n */\r\n get octree() {\r\n // Make sure the octree state is up to date\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n return this._octree;\r\n }\r\n /**\r\n * Gets the world-axis-aligned bounding box of the scene.\r\n *\r\n * Ensures pending node placements are synchronized before computing.\r\n */\r\n get boundingBox() {\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n // this._syncBVChangedList();\r\n return this._octree.getRootNode().getBoxLoosed();\r\n }\r\n /**\r\n * The environment (sky, lights, IBL) of the scene.\r\n */\r\n get env() {\r\n return this._env;\r\n }\r\n /**\r\n * Arbitrary metadata associated with the scene (e.g., imported asset info).\r\n */\r\n get metaData() {\r\n return this._metaData;\r\n }\r\n set metaData(val) {\r\n this._metaData = val;\r\n }\r\n /**\r\n * Attached script filename or identifier (engine-specific).\r\n *\r\n * @remarks\r\n * Integrates with the engine’s scripting system if available.\r\n */\r\n get script() {\r\n return this._scripts[0]?.script ?? '';\r\n }\r\n set script(fileName: string) {\r\n const script = fileName ?? '';\r\n if (!script) {\r\n this._scripts.splice(0, 1);\r\n } else if (this._scripts[0]) {\r\n this._scripts[0].script = script;\r\n } else {\r\n this._scripts.unshift(new ScriptAttachment(script));\r\n }\r\n }\r\n /**\r\n * Script component configuration payload used by editor/runtime script components.\r\n */\r\n get scriptConfig() {\r\n return this._scripts[0]?.config ?? null;\r\n }\r\n set scriptConfig(value: Nullable<object | unknown[]>) {\r\n const normalized = normalizeScriptAttachmentConfig(value);\r\n if (this._scripts[0]) {\r\n this._scripts[0].config = normalized;\r\n } else if (normalized != null) {\r\n this._scripts.unshift(new ScriptAttachment('', normalized));\r\n }\r\n if (this._scripts[0] && !this._scripts[0].script && this._scripts[0].config == null) {\r\n this._scripts.splice(0, 1);\r\n }\r\n }\r\n /**\r\n * All script attachments on this scene.\r\n */\r\n get scripts() {\r\n return this._scripts;\r\n }\r\n set scripts(value: ScriptAttachment[]) {\r\n this._scripts = normalizeScriptAttachments(value);\r\n }\r\n /**\r\n * Script configs for all script attachments.\r\n */\r\n get scriptConfigs() {\r\n return this._scripts.map((item) => item.config);\r\n }\r\n set scriptConfigs(value: unknown[]) {\r\n const next = Array.isArray(value) ? value : [];\r\n for (let i = 0; i < Math.max(this._scripts.length, next.length); i++) {\r\n const config = normalizeScriptAttachmentConfig(next[i]);\r\n if (this._scripts[i]) {\r\n this._scripts[i].config = config;\r\n } else if (config != null) {\r\n this._scripts.push(new ScriptAttachment('', config));\r\n }\r\n }\r\n this._scripts = this._scripts.filter((item) => item.script || item.config != null);\r\n }\r\n /**\r\n * Finds a scene node by its persistent ID.\r\n *\r\n * @typeParam T - Expected node type.\r\n * @param id - Persistent identifier to match against `SceneNode.persistentId`.\r\n * @returns The first matching node, or `null` if not found.\r\n */\r\n findNodeById<T extends SceneNode>(id: string) {\r\n return this._rootNode.get()!.findNodeById<T>(id);\r\n }\r\n /**\r\n * Finds a scene node by name.\r\n *\r\n * If multiple nodes share the same name, returns the first match encountered\r\n * during traversal.\r\n *\r\n * @typeParam T - Expected node type.\r\n * @param name - Node name to match.\r\n * @returns The first matching node, or `null` if not found.\r\n *\r\n * @remarks\r\n * Names are not guaranteed unique. Prefer IDs for stable references.\r\n */\r\n findNodeByName<T extends SceneNode>(name: string) {\r\n return this._rootNode.get()!.findNodeByName<T>(name);\r\n }\r\n /**\r\n * Casts a ray into the scene and returns the closest intersection, if any.\r\n *\r\n * @param ray - The ray in world space.\r\n * @param length - Maximum ray length. Defaults to `Infinity`.\r\n * @returns Intersection info `{ target, dist, point }`, or `null` if no hit.\r\n *\r\n */\r\n raycast(ray: Ray, length = Infinity) {\r\n const raycastVisitor = new RaycastVisitor(ray, length);\r\n this.octree.getRootNode().traverse(raycastVisitor);\r\n return raycastVisitor.intersected\r\n ? {\r\n target: raycastVisitor.intersected,\r\n dist: raycastVisitor.intersectedDist,\r\n point: raycastVisitor.intersectedPoint\r\n }\r\n : null;\r\n }\r\n /**\r\n * Constructs a world-space ray from a camera and a screen position.\r\n *\r\n * @param camera - Camera whose projection/view defines the ray.\r\n * @param viewportWidth - Current viewport width in pixels.\r\n * @param viewportHeight - Current viewport height in pixels.\r\n * @param screenX - Screen-space x (pixels).\r\n * @param screenY - Screen-space y (pixels).\r\n * @param invModelMatrix - Optional inverse model matrix to transform the ray into local space.\r\n * @returns The constructed Ray.\r\n *\r\n * @remarks\r\n * Computes NDC from screen coordinates, unprojects using `invViewProjectionMatrix`,\r\n * then forms a ray from the camera world position to the unprojected point.\r\n * If `invModelMatrix` is provided, both origin and direction are transformed.\r\n */\r\n constructRay(\r\n camera: Camera,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n screenX: number,\r\n screenY: number,\r\n invModelMatrix?: Matrix4x4\r\n ) {\r\n const vClip = new Vector4((2 * screenX) / viewportWidth - 1, 1 - (2 * screenY) / viewportHeight, 1, 1);\r\n const vWorld = camera.invViewProjectionMatrix.transform(vClip);\r\n vWorld.scaleBy(1 / vWorld.w);\r\n let vEye = camera.getWorldPosition();\r\n let vDir = Vector3.sub(vWorld.xyz(), vEye).inplaceNormalize();\r\n if (invModelMatrix) {\r\n vEye = invModelMatrix.transformPointAffine(vEye);\r\n vDir = invModelMatrix.transformVectorAffine(vDir);\r\n }\r\n return new Ray(vEye, vDir);\r\n }\r\n /**\r\n * Queues a node for a one-shot update before the next render.\r\n *\r\n * The node's `update(frame, elapsedSeconds, deltaSeconds)` will be called\r\n * during Scene.frameUpdate and then the node is removed from the queue.\r\n *\r\n * @param node - Node to schedule.\r\n *\r\n * @remarks\r\n * - To update continuously each frame, call `queueUpdateNode(this)` from within the node's `update` method.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queueUpdateNode(node: SceneNode) {\r\n if (node && this._nodeUpdateQueue.findIndex((val) => val.get() === node) < 0) {\r\n this._nodeUpdateQueue.push(new DWeakRef(node));\r\n }\r\n }\r\n /**\r\n * Queues a drawable for a one-shot state update before the next render.\r\n *\r\n * The drawable's `updateState()` will be called during Scene.frameUpdate and then the drawable is removed from the queue.\r\n * @param drawable - Drawable to schedule.\r\n *\r\n * @remarks\r\n * - To update continuously each frame, call `queueUpdateDrawable(this)` from within the drawable's `updateState` method.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queueUpdateDrawable(drawable: Drawable) {\r\n if (drawable && this._drawableUpdateQueue.indexOf(drawable) < 0) {\r\n this._drawableUpdateQueue.push(drawable);\r\n }\r\n }\r\n /**\r\n * Queues a node for a one-shot per-camera update before render.\r\n *\r\n * The node's `updatePerCamera(camera, elapsedSeconds, deltaSeconds)` will be\r\n * called once for each camera during {@link Scene.frameUpdatePerCamera}, then removed.\r\n *\r\n * @param node - Node to schedule.\r\n *\r\n * @remarks\r\n * - To run per-camera work continuously, re-queue from `updatePerCamera`.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queuePerCameraUpdateNode(node: SceneNode) {\r\n if (node && this._perCameraUpdateQueue.findIndex((val) => val.get() === node) < 0) {\r\n this._perCameraUpdateQueue.push(new DWeakRef(node));\r\n }\r\n }\r\n /**\r\n * Renders this scene using the `mainCamera`, if present.\r\n *\r\n * Equivalent to `mainCamera.render(this)` when `mainCamera` is set.\r\n */\r\n render() {\r\n if (this.mainCamera) {\r\n this.mainCamera.render(this);\r\n }\r\n }\r\n /**\r\n * Marks a graph node as needing placement update in the octree.\r\n *\r\n * Called by nodes when their transform/visibility/attachment changes in a way\r\n * that affects spatial placement.\r\n *\r\n * @internal\r\n */\r\n invalidateNodePlacement(node: GraphNode) {\r\n this._nodePlaceList.add(node);\r\n }\r\n /**\r\n * Synchronizes environment light maps (IBL, SH/FB) with the sky as needed.\r\n *\r\n * Uses device capabilities to decide between Spherical Harmonics floating-point blending (SHFB)\r\n * and classic SH textures, and lazily fills missing environment fields from the sky.\r\n *\r\n * @internal\r\n */\r\n private updateEnvLight() {\r\n if (this.env.light.type === 'ibl') {\r\n this.env.light.radianceMap = this.env.sky.radianceMap;\r\n this.env.light.sheenRadianceMap = this.env.sky.sheenRadianceMap;\r\n this.env.light.irradianceWindow = this.env.sky.shWindowWeights;\r\n this.env.light.irradianceSHFB = this.env.sky.irradianceSHFB;\r\n this.env.light.irradianceSH = null;\r\n }\r\n }\r\n /**\r\n * Returns the renderer class used to render the scene.\r\n *\r\n * Override in subclasses to supply a custom renderer.\r\n *\r\n * @internal\r\n */\r\n getRenderer() {\r\n return SceneRenderer;\r\n }\r\n /**\r\n * Performs per-frame scene updates, once per device frame.\r\n *\r\n * Steps:\r\n * - Ensure this runs only once per frame (via `frameInfo.frameCounter`).\r\n * - Update environment light synchronization.\r\n * - Dispatch `update` event.\r\n * - Drain the one-shot node update queue and call `node.update(...)`.\r\n * - Apply pending octree placement updates.\r\n *\r\n */\r\n frameUpdate() {\r\n const frameInfo = getDevice().frameInfo;\r\n if (frameInfo.frameCounter !== this._updateFrame) {\r\n this._updateFrame = frameInfo.frameCounter;\r\n this.updateEnvLight();\r\n this.dispatchEvent('update', this);\r\n this.mainCamera?.updateController();\r\n if (this._nodeUpdateQueue.length > 0) {\r\n const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;\r\n const deltaInSeconds = frameInfo.elapsedFrame * 0.001;\r\n const queue = this._nodeUpdateQueue;\r\n this._nodeUpdateQueue = [];\r\n while (queue.length > 0) {\r\n const ref = queue.shift()!;\r\n const node = ref.get();\r\n if (node?.attached) {\r\n node.update(frameInfo.frameCounter, elapsedInSeconds, deltaInSeconds);\r\n }\r\n ref.dispose();\r\n }\r\n }\r\n if (this._drawableUpdateQueue.length > 0) {\r\n for (const drawable of this._drawableUpdateQueue) {\r\n drawable.updateState();\r\n }\r\n this._drawableUpdateQueue = [];\r\n }\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n }\r\n }\r\n /**\r\n * Performs per-camera scene updates for the current frame.\r\n *\r\n * Steps:\r\n * - Drain the per-camera update queue and call `node.updatePerCamera(camera, ...)`.\r\n * - Apply pending octree placement updates.\r\n *\r\n * @param camera - The camera being updated for.\r\n */\r\n frameUpdatePerCamera(camera: Camera) {\r\n if (this._perCameraUpdateQueue.length > 0) {\r\n const frameInfo = getDevice().frameInfo;\r\n const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;\r\n const deltaInSeconds = frameInfo.elapsedFrame * 0.001;\r\n const queue = this._perCameraUpdateQueue;\r\n this._perCameraUpdateQueue = [];\r\n while (queue.length > 0) {\r\n const ref = queue.shift()!;\r\n ref.get()?.updatePerCamera(camera, elapsedInSeconds, deltaInSeconds);\r\n ref.dispose();\r\n }\r\n }\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n }\r\n /**\r\n * Applies placement changes for nodes in `list` to the given `octree`.\r\n *\r\n * Rules:\r\n * - If node is not disposed, attached, not hidden, and `placeToOctree` is true,\r\n * it is placed; otherwise removed.\r\n * - Drains `list` until empty.\r\n *\r\n * @param octree - Target spatial index.\r\n * @param list - Set of nodes awaiting placement evaluation.\r\n */\r\n updateNodePlacement(octree: Octree, list: Set<GraphNode>) {\r\n function placeNode(node: GraphNode) {\r\n if (!node.disposed && node.attached && !node.hidden && node.placeToOctree) {\r\n octree.placeNode(node);\r\n } else {\r\n octree.removeNode(node);\r\n }\r\n list.delete(node);\r\n }\r\n if (list.size > 0) {\r\n while (list.size > 0) {\r\n const node = list.keys().next().value!;\r\n if (octree) {\r\n placeNode(node);\r\n } else {\r\n list.delete(node);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Disposes the scene and its owned resources.\r\n *\r\n * Disposes:\r\n * - Environment\r\n * - Root node (and, by extension, its hierarchy)\r\n * - Main camera reference wrapper\r\n *\r\n */\r\n protected onDispose() {\r\n this._env.dispose();\r\n this._rootNode.dispose();\r\n this._mainCamera.dispose();\r\n }\r\n}\r\n"],"names":["Scene","makeObservable","Disposable","_nextId","name","_id","_name","_octree","Octree","_nodePlaceList","Set","_nodeUpdateQueue","_drawableUpdateQueue","_perCameraUpdateQueue","_env","Environment","_updateFrame","_rootNode","DRef","set","SceneNode","get","_metaData","_scripts","_mainCamera","id","val","mainCamera","camera","rootNode","octree","updateNodePlacement","boundingBox","getRootNode","getBoxLoosed","env","metaData","script","fileName","splice","unshift","ScriptAttachment","scriptConfig","config","value","normalized","normalizeScriptAttachmentConfig","scripts","normalizeScriptAttachments","scriptConfigs","map","item","next","Array","isArray","i","Math","max","length","push","filter","findNodeById","findNodeByName","raycast","ray","Infinity","raycastVisitor","RaycastVisitor","traverse","intersected","target","dist","intersectedDist","point","intersectedPoint","constructRay","viewportWidth","viewportHeight","screenX","screenY","invModelMatrix","vClip","Vector4","vWorld","invViewProjectionMatrix","transform","scaleBy","w","vEye","getWorldPosition","vDir","Vector3","sub","xyz","inplaceNormalize","transformPointAffine","transformVectorAffine","Ray","queueUpdateNode","node","findIndex","DWeakRef","queueUpdateDrawable","drawable","indexOf","queuePerCameraUpdateNode","render","invalidateNodePlacement","add","light","type","radianceMap","sky","sheenRadianceMap","irradianceWindow","shWindowWeights","irradianceSHFB","irradianceSH","getRenderer","SceneRenderer","frameUpdate","frameInfo","getDevice","frameCounter","updateEnvLight","dispatchEvent","updateController","elapsedInSeconds","elapsedOverall","deltaInSeconds","elapsedFrame","queue","ref","shift","attached","update","dispose","updateState","frameUpdatePerCamera","updatePerCamera","list","placeNode","disposed","hidden","placeToOctree","removeNode","delete","size","keys"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAoBA;;;;;;;;;;;;;;;;IAiBO,MAAMA,KAAAA,SACHC,cAAeC,CAAAA,UAAAA,CAAAA,EAAAA,CAAAA;qBAWvB,OAAeC,OAAAA,GAAU,CAAE;iCAE3B,KAAwB;0CAExB,SAAqC;0DAErC,OAA0B;AAC1B;;;AAGC,MACD,cAAyC;uDAEzC,IAA4B;iEAE5B,YAA+B;sCAE/B,GAAsB;2EAEtB,gBAAkD;qBAElD,oBAA2C;iEAE3C,qBAAuD;4CAEvD,WAAoC;0EAEpC,SAAwC;oEAExC,QAAqC;AACrC;;;;;;;;;;MAWA,WAAA,CAAYC,IAAa,CAAE;QACzB,KAAK,EAAA;AACL,QAAA,IAAI,CAACC,GAAG,GAAG,EAAEL,MAAMG,OAAO;QAC1B,IAAI,CAACG,KAAK,GAAGF,IAAQ,IAAA,EAAA;AACrB,QAAA,IAAI,CAACG,OAAO,GAAG,IAAIC,MAAO,CAAA,IAAI,EAAE,CAAG,EAAA,CAAA,CAAA;QACnC,IAAI,CAACC,cAAc,GAAG,IAAIC,GAAAA,EAAAA;QAC1B,IAAI,CAACC,gBAAgB,GAAG,EAAE;QAC1B,IAAI,CAACC,oBAAoB,GAAG,EAAE;QAC9B,IAAI,CAACC,qBAAqB,GAAG,EAAE;QAC/B,IAAI,CAACC,IAAI,GAAG,IAAIC,WAAAA,EAAAA;QAChB,IAAI,CAACC,YAAY,GAAG,EAAC;QACrB,IAAI,CAACC,SAAS,GAAG,IAAIC,IAAAA,EAAAA;AACrB,QAAA,IAAI,CAACD,SAAS,CAACE,GAAG,CAAC,IAAIC,UAAU,IAAI,CAAA,CAAA;AACrC,QAAA,IAAI,CAACH,SAAS,CAACI,GAAG,EAAA,CAAIjB,IAAI,GAAG,MAAA;QAC7B,IAAI,CAACkB,SAAS,GAAG,IAAA;QACjB,IAAI,CAACC,QAAQ,GAAG,EAAE;QAClB,IAAI,CAACC,WAAW,GAAG,IAAIN,IAAAA,EAAAA;AACzB;AACA;;AAEC,MACD,IAAIO,EAAK,GAAA;QACP,OAAO,IAAI,CAACpB,GAAG;AACjB;AACA;;AAEC,MACD,IAAID,IAAO,GAAA;QACT,OAAO,IAAI,CAACE,KAAK;AACnB;IACA,IAAIF,IAAAA,CAAKsB,GAAW,EAAE;QACpB,IAAI,CAACpB,KAAK,GAAGoB,GAAO,IAAA,EAAA;AACtB;AACA;;AAEC,MACD,IAAIC,UAAa,GAAA;AACf,QAAA,OAAO,IAAI,CAACH,WAAW,CAACH,GAAG,EAAA;AAC7B;IACA,IAAIM,UAAAA,CAAWC,MAAM,EAAE;AACrB,QAAA,IAAI,CAACJ,WAAW,CAACL,GAAG,CAACS,MAAAA,CAAAA;AACvB;AACA;;AAEC,MACD,IAAIC,QAAW,GAAA;AACb,QAAA,OAAO,IAAI,CAACZ,SAAS,CAACI,GAAG,EAAA;AAC3B;AACA;;;;AAIC,MACD,IAAIS,MAAS,GAAA;;QAEX,IAAI,CAACC,mBAAmB,CAAC,IAAI,CAACxB,OAAO,EAAE,IAAI,CAACE,cAAc,CAAA;QAC1D,OAAO,IAAI,CAACF,OAAO;AACrB;AACA;;;;AAIC,MACD,IAAIyB,WAAc,GAAA;QAChB,IAAI,CAACD,mBAAmB,CAAC,IAAI,CAACxB,OAAO,EAAE,IAAI,CAACE,cAAc,CAAA;;AAE1D,QAAA,OAAO,IAAI,CAACF,OAAO,CAAC0B,WAAW,GAAGC,YAAY,EAAA;AAChD;AACA;;AAEC,MACD,IAAIC,GAAM,GAAA;QACR,OAAO,IAAI,CAACrB,IAAI;AAClB;AACA;;AAEC,MACD,IAAIsB,QAAW,GAAA;QACb,OAAO,IAAI,CAACd,SAAS;AACvB;IACA,IAAIc,QAAAA,CAASV,GAAG,EAAE;QAChB,IAAI,CAACJ,SAAS,GAAGI,GAAAA;AACnB;AACA;;;;;AAKC,MACD,IAAIW,MAAS,GAAA;AACX,QAAA,OAAO,IAAI,CAACd,QAAQ,CAAC,CAAA,CAAE,EAAEc,MAAU,IAAA,EAAA;AACrC;IACA,IAAIA,MAAAA,CAAOC,QAAgB,EAAE;AAC3B,QAAA,MAAMD,SAASC,QAAY,IAAA,EAAA;AAC3B,QAAA,IAAI,CAACD,MAAQ,EAAA;AACX,YAAA,IAAI,CAACd,QAAQ,CAACgB,MAAM,CAAC,CAAG,EAAA,CAAA,CAAA;AAC1B,SAAA,MAAO,IAAI,IAAI,CAAChB,QAAQ,CAAC,EAAE,EAAE;AAC3B,YAAA,IAAI,CAACA,QAAQ,CAAC,CAAE,CAAA,CAACc,MAAM,GAAGA,MAAAA;SACrB,MAAA;AACL,YAAA,IAAI,CAACd,QAAQ,CAACiB,OAAO,CAAC,IAAIC,gBAAiBJ,CAAAA,MAAAA,CAAAA,CAAAA;AAC7C;AACF;AACA;;AAEC,MACD,IAAIK,YAAe,GAAA;AACjB,QAAA,OAAO,IAAI,CAACnB,QAAQ,CAAC,CAAA,CAAE,EAAEoB,MAAU,IAAA,IAAA;AACrC;IACA,IAAID,YAAAA,CAAaE,KAAmC,EAAE;AACpD,QAAA,MAAMC,aAAaC,+BAAgCF,CAAAA,KAAAA,CAAAA;AACnD,QAAA,IAAI,IAAI,CAACrB,QAAQ,CAAC,EAAE,EAAE;AACpB,YAAA,IAAI,CAACA,QAAQ,CAAC,CAAE,CAAA,CAACoB,MAAM,GAAGE,UAAAA;SACrB,MAAA,IAAIA,cAAc,IAAM,EAAA;AAC7B,YAAA,IAAI,CAACtB,QAAQ,CAACiB,OAAO,CAAC,IAAIC,iBAAiB,EAAII,EAAAA,UAAAA,CAAAA,CAAAA;AACjD;QACA,IAAI,IAAI,CAACtB,QAAQ,CAAC,EAAE,IAAI,CAAC,IAAI,CAACA,QAAQ,CAAC,EAAE,CAACc,MAAM,IAAI,IAAI,CAACd,QAAQ,CAAC,CAAE,CAAA,CAACoB,MAAM,IAAI,IAAM,EAAA;AACnF,YAAA,IAAI,CAACpB,QAAQ,CAACgB,MAAM,CAAC,CAAG,EAAA,CAAA,CAAA;AAC1B;AACF;AACA;;AAEC,MACD,IAAIQ,OAAU,GAAA;QACZ,OAAO,IAAI,CAACxB,QAAQ;AACtB;IACA,IAAIwB,OAAAA,CAAQH,KAAyB,EAAE;QACrC,IAAI,CAACrB,QAAQ,GAAGyB,0BAA2BJ,CAAAA,KAAAA,CAAAA;AAC7C;AACA;;AAEC,MACD,IAAIK,aAAgB,GAAA;QAClB,OAAO,IAAI,CAAC1B,QAAQ,CAAC2B,GAAG,CAAC,CAACC,IAASA,GAAAA,IAAAA,CAAKR,MAAM,CAAA;AAChD;IACA,IAAIM,aAAAA,CAAcL,KAAgB,EAAE;AAClC,QAAA,MAAMQ,OAAOC,KAAMC,CAAAA,OAAO,CAACV,KAAAA,CAAAA,GAASA,QAAQ,EAAE;AAC9C,QAAA,IAAK,IAAIW,CAAI,GAAA,CAAA,EAAGA,CAAIC,GAAAA,IAAAA,CAAKC,GAAG,CAAC,IAAI,CAAClC,QAAQ,CAACmC,MAAM,EAAEN,IAAKM,CAAAA,MAAM,GAAGH,CAAK,EAAA,CAAA;AACpE,YAAA,MAAMZ,MAASG,GAAAA,+BAAAA,CAAgCM,IAAI,CAACG,CAAE,CAAA,CAAA;AACtD,YAAA,IAAI,IAAI,CAAChC,QAAQ,CAACgC,EAAE,EAAE;AACpB,gBAAA,IAAI,CAAChC,QAAQ,CAACgC,CAAE,CAAA,CAACZ,MAAM,GAAGA,MAAAA;aACrB,MAAA,IAAIA,UAAU,IAAM,EAAA;AACzB,gBAAA,IAAI,CAACpB,QAAQ,CAACoC,IAAI,CAAC,IAAIlB,iBAAiB,EAAIE,EAAAA,MAAAA,CAAAA,CAAAA;AAC9C;AACF;AACA,QAAA,IAAI,CAACpB,QAAQ,GAAG,IAAI,CAACA,QAAQ,CAACqC,MAAM,CAAC,CAACT,OAASA,IAAKd,CAAAA,MAAM,IAAIc,IAAAA,CAAKR,MAAM,IAAI,IAAA,CAAA;AAC/E;AACA;;;;;;MAOAkB,YAAAA,CAAkCpC,EAAU,EAAE;AAC5C,QAAA,OAAO,IAAI,CAACR,SAAS,CAACI,GAAG,EAAA,CAAIwC,YAAY,CAAIpC,EAAAA,CAAAA;AAC/C;AACA;;;;;;;;;;;;MAaAqC,cAAAA,CAAoC1D,IAAY,EAAE;AAChD,QAAA,OAAO,IAAI,CAACa,SAAS,CAACI,GAAG,EAAA,CAAIyC,cAAc,CAAI1D,IAAAA,CAAAA;AACjD;AACA;;;;;;;AAOC,MACD2D,OAAQC,CAAAA,GAAQ,EAAEN,MAAAA,GAASO,QAAQ,EAAE;QACnC,MAAMC,cAAAA,GAAiB,IAAIC,cAAAA,CAAeH,GAAKN,EAAAA,MAAAA,CAAAA;AAC/C,QAAA,IAAI,CAAC5B,MAAM,CAACG,WAAW,EAAA,CAAGmC,QAAQ,CAACF,cAAAA,CAAAA;QACnC,OAAOA,cAAAA,CAAeG,WAAW,GAC7B;AACEC,YAAAA,MAAAA,EAAQJ,eAAeG,WAAW;AAClCE,YAAAA,IAAAA,EAAML,eAAeM,eAAe;AACpCC,YAAAA,KAAAA,EAAOP,eAAeQ;SAExB,GAAA,IAAA;AACN;AACA;;;;;;;;;;;;;;;AAeC,MACDC,YACE/C,CAAAA,MAAc,EACdgD,aAAqB,EACrBC,cAAsB,EACtBC,OAAe,EACfC,OAAe,EACfC,cAA0B,EAC1B;AACA,QAAA,MAAMC,KAAQ,GAAA,IAAIC,OAAQ,CAAC,CAAIJ,GAAAA,OAAAA,GAAWF,aAAgB,GAAA,CAAA,EAAG,CAAI,GAAC,CAAIG,GAAAA,OAAAA,GAAWF,gBAAgB,CAAG,EAAA,CAAA,CAAA;AACpG,QAAA,MAAMM,MAASvD,GAAAA,MAAAA,CAAOwD,uBAAuB,CAACC,SAAS,CAACJ,KAAAA,CAAAA;AACxDE,QAAAA,MAAAA,CAAOG,OAAO,CAAC,CAAIH,GAAAA,MAAAA,CAAOI,CAAC,CAAA;QAC3B,IAAIC,IAAAA,GAAO5D,OAAO6D,gBAAgB,EAAA;QAClC,IAAIC,IAAAA,GAAOC,QAAQC,GAAG,CAACT,OAAOU,GAAG,EAAA,EAAIL,MAAMM,gBAAgB,EAAA;AAC3D,QAAA,IAAId,cAAgB,EAAA;YAClBQ,IAAOR,GAAAA,cAAAA,CAAee,oBAAoB,CAACP,IAAAA,CAAAA;YAC3CE,IAAOV,GAAAA,cAAAA,CAAegB,qBAAqB,CAACN,IAAAA,CAAAA;AAC9C;QACA,OAAO,IAAIO,IAAIT,IAAME,EAAAA,IAAAA,CAAAA;AACvB;AACA;;;;;;;;;;;MAYAQ,eAAAA,CAAgBC,IAAe,EAAE;AAC/B,QAAA,IAAIA,IAAQ,IAAA,IAAI,CAACxF,gBAAgB,CAACyF,SAAS,CAAC,CAAC1E,GAAQA,GAAAA,GAAAA,CAAIL,GAAG,EAAA,KAAO8E,QAAQ,CAAG,EAAA;AAC5E,YAAA,IAAI,CAACxF,gBAAgB,CAACgD,IAAI,CAAC,IAAI0C,QAASF,CAAAA,IAAAA,CAAAA,CAAAA;AAC1C;AACF;AACA;;;;;;;;;MAUAG,mBAAAA,CAAoBC,QAAkB,EAAE;QACtC,IAAIA,QAAAA,IAAY,IAAI,CAAC3F,oBAAoB,CAAC4F,OAAO,CAACD,YAAY,CAAG,EAAA;AAC/D,YAAA,IAAI,CAAC3F,oBAAoB,CAAC+C,IAAI,CAAC4C,QAAAA,CAAAA;AACjC;AACF;AACA;;;;;;;;;;;MAYAE,wBAAAA,CAAyBN,IAAe,EAAE;AACxC,QAAA,IAAIA,IAAQ,IAAA,IAAI,CAACtF,qBAAqB,CAACuF,SAAS,CAAC,CAAC1E,GAAQA,GAAAA,GAAAA,CAAIL,GAAG,EAAA,KAAO8E,QAAQ,CAAG,EAAA;AACjF,YAAA,IAAI,CAACtF,qBAAqB,CAAC8C,IAAI,CAAC,IAAI0C,QAASF,CAAAA,IAAAA,CAAAA,CAAAA;AAC/C;AACF;AACA;;;;AAIC,MACDO,MAAS,GAAA;QACP,IAAI,IAAI,CAAC/E,UAAU,EAAE;AACnB,YAAA,IAAI,CAACA,UAAU,CAAC+E,MAAM,CAAC,IAAI,CAAA;AAC7B;AACF;AACA;;;;;;;MAQAC,uBAAAA,CAAwBR,IAAe,EAAE;AACvC,QAAA,IAAI,CAAC1F,cAAc,CAACmG,GAAG,CAACT,IAAAA,CAAAA;AAC1B;AACA;;;;;;;AAOC,MACD,cAAyB,GAAA;QACvB,IAAI,IAAI,CAAChE,GAAG,CAAC0E,KAAK,CAACC,IAAI,KAAK,KAAO,EAAA;AACjC,YAAA,IAAI,CAAC3E,GAAG,CAAC0E,KAAK,CAACE,WAAW,GAAG,IAAI,CAAC5E,GAAG,CAAC6E,GAAG,CAACD,WAAW;AACrD,YAAA,IAAI,CAAC5E,GAAG,CAAC0E,KAAK,CAACI,gBAAgB,GAAG,IAAI,CAAC9E,GAAG,CAAC6E,GAAG,CAACC,gBAAgB;AAC/D,YAAA,IAAI,CAAC9E,GAAG,CAAC0E,KAAK,CAACK,gBAAgB,GAAG,IAAI,CAAC/E,GAAG,CAAC6E,GAAG,CAACG,eAAe;AAC9D,YAAA,IAAI,CAAChF,GAAG,CAAC0E,KAAK,CAACO,cAAc,GAAG,IAAI,CAACjF,GAAG,CAAC6E,GAAG,CAACI,cAAc;AAC3D,YAAA,IAAI,CAACjF,GAAG,CAAC0E,KAAK,CAACQ,YAAY,GAAG,IAAA;AAChC;AACF;AACA;;;;;;AAMC,MACDC,WAAc,GAAA;QACZ,OAAOC,aAAAA;AACT;AACA;;;;;;;;;;AAUC,MACDC,WAAc,GAAA;QACZ,MAAMC,SAAAA,GAAYC,YAAYD,SAAS;AACvC,QAAA,IAAIA,UAAUE,YAAY,KAAK,IAAI,CAAC3G,YAAY,EAAE;AAChD,YAAA,IAAI,CAACA,YAAY,GAAGyG,SAAAA,CAAUE,YAAY;AAC1C,YAAA,IAAI,CAACC,cAAc,EAAA;AACnB,YAAA,IAAI,CAACC,aAAa,CAAC,QAAA,EAAU,IAAI,CAAA;YACjC,IAAI,CAAClG,UAAU,EAAEmG,gBAAAA,EAAAA;AACjB,YAAA,IAAI,IAAI,CAACnH,gBAAgB,CAAC+C,MAAM,GAAG,CAAG,EAAA;gBACpC,MAAMqE,gBAAAA,GAAmBN,SAAUO,CAAAA,cAAc,GAAG,KAAA;gBACpD,MAAMC,cAAAA,GAAiBR,SAAUS,CAAAA,YAAY,GAAG,KAAA;gBAChD,MAAMC,KAAAA,GAAQ,IAAI,CAACxH,gBAAgB;gBACnC,IAAI,CAACA,gBAAgB,GAAG,EAAE;gBAC1B,MAAOwH,KAAAA,CAAMzE,MAAM,GAAG,CAAG,CAAA;oBACvB,MAAM0E,GAAAA,GAAMD,MAAME,KAAK,EAAA;oBACvB,MAAMlC,IAAAA,GAAOiC,IAAI/G,GAAG,EAAA;AACpB,oBAAA,IAAI8E,MAAMmC,QAAU,EAAA;AAClBnC,wBAAAA,IAAAA,CAAKoC,MAAM,CAACd,SAAUE,CAAAA,YAAY,EAAEI,gBAAkBE,EAAAA,cAAAA,CAAAA;AACxD;AACAG,oBAAAA,GAAAA,CAAII,OAAO,EAAA;AACb;AACF;AACA,YAAA,IAAI,IAAI,CAAC5H,oBAAoB,CAAC8C,MAAM,GAAG,CAAG,EAAA;AACxC,gBAAA,KAAK,MAAM6C,QAAAA,IAAY,IAAI,CAAC3F,oBAAoB,CAAE;AAChD2F,oBAAAA,QAAAA,CAASkC,WAAW,EAAA;AACtB;gBACA,IAAI,CAAC7H,oBAAoB,GAAG,EAAE;AAChC;YACA,IAAI,CAACmB,mBAAmB,CAAC,IAAI,CAACxB,OAAO,EAAE,IAAI,CAACE,cAAc,CAAA;AAC5D;AACF;AACA;;;;;;;;MASAiI,oBAAAA,CAAqB9G,MAAc,EAAE;AACnC,QAAA,IAAI,IAAI,CAACf,qBAAqB,CAAC6C,MAAM,GAAG,CAAG,EAAA;YACzC,MAAM+D,SAAAA,GAAYC,YAAYD,SAAS;YACvC,MAAMM,gBAAAA,GAAmBN,SAAUO,CAAAA,cAAc,GAAG,KAAA;YACpD,MAAMC,cAAAA,GAAiBR,SAAUS,CAAAA,YAAY,GAAG,KAAA;YAChD,MAAMC,KAAAA,GAAQ,IAAI,CAACtH,qBAAqB;YACxC,IAAI,CAACA,qBAAqB,GAAG,EAAE;YAC/B,MAAOsH,KAAAA,CAAMzE,MAAM,GAAG,CAAG,CAAA;gBACvB,MAAM0E,GAAAA,GAAMD,MAAME,KAAK,EAAA;AACvBD,gBAAAA,GAAAA,CAAI/G,GAAG,EAAA,EAAIsH,eAAgB/G,CAAAA,MAAAA,EAAQmG,gBAAkBE,EAAAA,cAAAA,CAAAA;AACrDG,gBAAAA,GAAAA,CAAII,OAAO,EAAA;AACb;AACF;QACA,IAAI,CAACzG,mBAAmB,CAAC,IAAI,CAACxB,OAAO,EAAE,IAAI,CAACE,cAAc,CAAA;AAC5D;AACA;;;;;;;;;;AAUC,MACDsB,mBAAoBD,CAAAA,MAAc,EAAE8G,IAAoB,EAAE;AACxD,QAAA,SAASC,UAAU1C,IAAe,EAAA;AAChC,YAAA,IAAI,CAACA,IAAAA,CAAK2C,QAAQ,IAAI3C,IAAKmC,CAAAA,QAAQ,IAAI,CAACnC,IAAK4C,CAAAA,MAAM,IAAI5C,IAAAA,CAAK6C,aAAa,EAAE;AACzElH,gBAAAA,MAAAA,CAAO+G,SAAS,CAAC1C,IAAAA,CAAAA;aACZ,MAAA;AACLrE,gBAAAA,MAAAA,CAAOmH,UAAU,CAAC9C,IAAAA,CAAAA;AACpB;AACAyC,YAAAA,IAAAA,CAAKM,MAAM,CAAC/C,IAAAA,CAAAA;AACd;QACA,IAAIyC,IAAAA,CAAKO,IAAI,GAAG,CAAG,EAAA;YACjB,MAAOP,IAAAA,CAAKO,IAAI,GAAG,CAAG,CAAA;AACpB,gBAAA,MAAMhD,OAAOyC,IAAKQ,CAAAA,IAAI,EAAGhG,CAAAA,IAAI,GAAGR,KAAK;AACrC,gBAAA,IAAId,MAAQ,EAAA;oBACV+G,SAAU1C,CAAAA,IAAAA,CAAAA;iBACL,MAAA;AACLyC,oBAAAA,IAAAA,CAAKM,MAAM,CAAC/C,IAAAA,CAAAA;AACd;AACF;AACF;AACF;AACA;;;;;;;;AAQC,MACD,SAAsB,GAAA;QACpB,IAAI,CAACrF,IAAI,CAAC0H,OAAO,EAAA;QACjB,IAAI,CAACvH,SAAS,CAACuH,OAAO,EAAA;QACtB,IAAI,CAAChH,WAAW,CAACgH,OAAO,EAAA;AAC1B;AACF;;;;"}
1
+ {"version":3,"file":"scene.js","sources":["../../src/scene/scene.ts"],"sourcesContent":["import type { Matrix4x4, Nullable } from '@zephyr3d/base';\r\nimport { Vector3, Vector4, Ray, DRef, DWeakRef, makeObservable, Disposable } from '@zephyr3d/base';\r\nimport { SceneNode } from './scene_node';\r\nimport { Octree } from './octree';\r\nimport { RaycastVisitor } from './raycast_visitor';\r\nimport { Environment } from './environment';\r\nimport type { GraphNode } from './graph_node';\r\nimport type { Camera } from '../camera/camera';\r\nimport type { Drawable } from '../render';\r\nimport { SceneRenderer } from '../render';\r\nimport type { Compositor } from '../posteffect';\r\nimport type { Metadata } from 'draco3d';\r\nimport { getDevice } from '../app/api';\r\nimport type { IRenderable } from '../app';\r\nimport {\r\n normalizeScriptAttachmentConfig,\r\n normalizeScriptAttachments,\r\n ScriptAttachment\r\n} from './script_attachment';\r\n\r\n/**\r\n * Represents a renderable world that manages scene graph, spatial indexing, and environment.\r\n *\r\n * Core responsibilities:\r\n * - Owns the root {@link SceneNode} and maintains a spatial {@link Octree} for culling/raycasting.\r\n * - Manages environment/lighting via {@link Environment}.\r\n * - Provides per-frame update queues (global and per-camera) for scene nodes.\r\n * - Offers utilities like ray construction and raycasting.\r\n * - Emits observable events: `update`, `startrender`, `endrender`.\r\n *\r\n * Performance notes:\r\n * - Octree placement is lazily synchronized on demand before reads (e.g., `octree`, `boundingBox`)\r\n * and during per-frame updates.\r\n * - Update queues use weak references to avoid retaining disposed nodes.\r\n *\r\n * @public\r\n */\r\nexport class Scene\r\n extends makeObservable(Disposable)<{\r\n /** Dispatched once per frame before render-related work. */\r\n update: [Scene];\r\n /** Dispatched immediately before rendering begins for a camera. */\r\n startrender: [Scene, Camera, Compositor];\r\n /** Dispatched immediately after rendering finishes for a camera. */\r\n endrender: [Scene, Camera, Compositor];\r\n }>()\r\n implements IRenderable\r\n{\r\n /** @internal */\r\n private static _nextId = 0;\r\n /** @internal Scene name. */\r\n protected _name: string;\r\n /** @internal Root node reference. */\r\n protected _rootNode: DRef<SceneNode>;\r\n /** @internal Spatial index for placement/culling. */\r\n protected _octree: Octree;\r\n /**\r\n * @internal Pending nodes whose placement in the octree must be updated.\r\n * Populated by {@link Scene.invalidateNodePlacement} and drained by {@link Scene.updateNodePlacement}.\r\n */\r\n protected _nodePlaceList: Set<GraphNode>;\r\n /** @internal Environment data (sky/light/IBL). */\r\n protected _env: Environment;\r\n /** @internal Frame counter that last updated this scene. */\r\n protected _updateFrame: number;\r\n /** @internal Unique scene ID. */\r\n protected _id: number;\r\n /** @internal One-shot per-frame update queue (runs before render). */\r\n protected _nodeUpdateQueue: DWeakRef<SceneNode>[];\r\n /** @internal */\r\n protected _drawableUpdateQueue: Drawable[];\r\n /** @internal One-shot per-frame-per-camera update queue. */\r\n protected _perCameraUpdateQueue: DWeakRef<SceneNode>[];\r\n /** @internal Main camera reference. */\r\n protected _mainCamera: DRef<Camera>;\r\n /** @internal Arbitrary metadata loaded with the scene (optional). */\r\n protected _metaData: Nullable<Metadata>;\r\n /** @internal User-attached script entries (engine-defined). */\r\n private _scripts: ScriptAttachment[];\r\n /**\r\n * Creates an instance of Scene.\r\n *\r\n * Initializes:\r\n * - Unique ID\r\n * - Empty environment\r\n * - Octree with default depth/leaf capacities\r\n * - Root scene node named \"Root\"\r\n *\r\n * @param name - Optional scene name for diagnostics/UI.\r\n */\r\n constructor(name?: string) {\r\n super();\r\n this._id = ++Scene._nextId;\r\n this._name = name ?? '';\r\n this._octree = new Octree(this, 8, 8);\r\n this._nodePlaceList = new Set();\r\n this._nodeUpdateQueue = [];\r\n this._drawableUpdateQueue = [];\r\n this._perCameraUpdateQueue = [];\r\n this._env = new Environment();\r\n this._updateFrame = -1;\r\n this._rootNode = new DRef();\r\n this._rootNode.set(new SceneNode(this));\r\n this._rootNode.get()!.name = 'Root';\r\n this._metaData = null;\r\n this._scripts = [];\r\n this._mainCamera = new DRef();\r\n }\r\n /**\r\n * Gets the unique identifier of the scene.\r\n */\r\n get id() {\r\n return this._id;\r\n }\r\n /**\r\n * Name of the scene\r\n */\r\n get name() {\r\n return this._name;\r\n }\r\n set name(val: string) {\r\n this._name = val ?? '';\r\n }\r\n /**\r\n * Main camera used to render the scene by default.\r\n */\r\n get mainCamera() {\r\n return this._mainCamera.get();\r\n }\r\n set mainCamera(camera) {\r\n this._mainCamera.set(camera);\r\n }\r\n /**\r\n * Gets the root scene node of the scene\r\n */\r\n get rootNode() {\r\n return this._rootNode.get()!;\r\n }\r\n /**\r\n * Gets the octree used for spatial organization and queries.\r\n *\r\n * Ensures pending node placements are synchronized before returning.\r\n */\r\n get octree() {\r\n // Make sure the octree state is up to date\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n return this._octree;\r\n }\r\n /**\r\n * Gets the world-axis-aligned bounding box of the scene.\r\n *\r\n * Ensures pending node placements are synchronized before computing.\r\n */\r\n get boundingBox() {\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n // this._syncBVChangedList();\r\n return this._octree.getRootNode().getBoxLoosed();\r\n }\r\n /**\r\n * The environment (sky, lights, IBL) of the scene.\r\n */\r\n get env() {\r\n return this._env;\r\n }\r\n /**\r\n * Arbitrary metadata associated with the scene (e.g., imported asset info).\r\n */\r\n get metaData() {\r\n return this._metaData;\r\n }\r\n set metaData(val) {\r\n this._metaData = val;\r\n }\r\n /**\r\n * Attached script filename or identifier (engine-specific).\r\n *\r\n * @remarks\r\n * Integrates with the engine’s scripting system if available.\r\n */\r\n get script() {\r\n return this._scripts[0]?.script ?? '';\r\n }\r\n set script(fileName: string) {\r\n const script = fileName ?? '';\r\n if (!script) {\r\n this._scripts.splice(0, 1);\r\n } else if (this._scripts[0]) {\r\n this._scripts[0].script = script;\r\n } else {\r\n this._scripts.unshift(new ScriptAttachment(script));\r\n }\r\n }\r\n /**\r\n * Script component configuration payload used by editor/runtime script components.\r\n */\r\n get scriptConfig() {\r\n return this._scripts[0]?.config ?? null;\r\n }\r\n set scriptConfig(value: Nullable<object | unknown[]>) {\r\n const normalized = normalizeScriptAttachmentConfig(value);\r\n if (this._scripts[0]) {\r\n this._scripts[0].config = normalized;\r\n } else if (normalized != null) {\r\n this._scripts.unshift(new ScriptAttachment('', normalized));\r\n }\r\n if (this._scripts[0] && !this._scripts[0].script && this._scripts[0].config == null) {\r\n this._scripts.splice(0, 1);\r\n }\r\n }\r\n /**\r\n * All script attachments on this scene.\r\n */\r\n get scripts() {\r\n return this._scripts;\r\n }\r\n set scripts(value: ScriptAttachment[]) {\r\n this._scripts = normalizeScriptAttachments(value);\r\n }\r\n /**\r\n * Script configs for all script attachments.\r\n */\r\n get scriptConfigs() {\r\n return this._scripts.map((item) => item.config);\r\n }\r\n set scriptConfigs(value: unknown[]) {\r\n const next = Array.isArray(value) ? value : [];\r\n for (let i = 0; i < Math.max(this._scripts.length, next.length); i++) {\r\n const config = normalizeScriptAttachmentConfig(next[i]);\r\n if (this._scripts[i]) {\r\n this._scripts[i].config = config;\r\n } else if (config != null) {\r\n this._scripts.push(new ScriptAttachment('', config));\r\n }\r\n }\r\n this._scripts = this._scripts.filter((item) => item.script || item.config != null);\r\n }\r\n /**\r\n * Finds a scene node by its persistent ID.\r\n *\r\n * @typeParam T - Expected node type.\r\n * @param id - Persistent identifier to match against `SceneNode.persistentId`.\r\n * @returns The first matching node, or `null` if not found.\r\n */\r\n findNodeById<T extends SceneNode>(id: string) {\r\n return this._rootNode.get()!.findNodeById<T>(id);\r\n }\r\n /**\r\n * Finds a scene node by name.\r\n *\r\n * If multiple nodes share the same name, returns the first match encountered\r\n * during traversal.\r\n *\r\n * @typeParam T - Expected node type.\r\n * @param name - Node name to match.\r\n * @returns The first matching node, or `null` if not found.\r\n *\r\n * @remarks\r\n * Names are not guaranteed unique. Prefer IDs for stable references.\r\n */\r\n findNodeByName<T extends SceneNode>(name: string) {\r\n return this._rootNode.get()!.findNodeByName<T>(name);\r\n }\r\n /**\r\n * Casts a ray into the scene and returns the closest intersection, if any.\r\n *\r\n * @param ray - The ray in world space.\r\n * @param length - Maximum ray length. Defaults to `Infinity`.\r\n * @returns Intersection info `{ target, dist, point }`, or `null` if no hit.\r\n *\r\n */\r\n raycast(ray: Ray, length = Infinity) {\r\n const raycastVisitor = new RaycastVisitor(ray, length);\r\n this.octree.getRootNode().traverse(raycastVisitor);\r\n return raycastVisitor.intersected\r\n ? {\r\n target: raycastVisitor.intersected,\r\n dist: raycastVisitor.intersectedDist,\r\n point: raycastVisitor.intersectedPoint\r\n }\r\n : null;\r\n }\r\n /**\r\n * Constructs a world-space ray from a camera and a screen position.\r\n *\r\n * @param camera - Camera whose projection/view defines the ray.\r\n * @param viewportWidth - Current viewport width in pixels.\r\n * @param viewportHeight - Current viewport height in pixels.\r\n * @param screenX - Screen-space x (pixels).\r\n * @param screenY - Screen-space y (pixels).\r\n * @param invModelMatrix - Optional inverse model matrix to transform the ray into local space.\r\n * @returns The constructed Ray.\r\n *\r\n * @remarks\r\n * Computes NDC from screen coordinates, unprojects using `invViewProjectionMatrix`,\r\n * then forms a ray from the camera world position to the unprojected point.\r\n * If `invModelMatrix` is provided, both origin and direction are transformed.\r\n */\r\n constructRay(\r\n camera: Camera,\r\n viewportWidth: number,\r\n viewportHeight: number,\r\n screenX: number,\r\n screenY: number,\r\n invModelMatrix?: Matrix4x4\r\n ) {\r\n const vClip = new Vector4((2 * screenX) / viewportWidth - 1, 1 - (2 * screenY) / viewportHeight, 1, 1);\r\n const vWorld = camera.invViewProjectionMatrix.transform(vClip);\r\n vWorld.scaleBy(1 / vWorld.w);\r\n let vEye = camera.getWorldPosition();\r\n let vDir = Vector3.sub(vWorld.xyz(), vEye).inplaceNormalize();\r\n if (invModelMatrix) {\r\n vEye = invModelMatrix.transformPointAffine(vEye);\r\n vDir = invModelMatrix.transformVectorAffine(vDir);\r\n }\r\n return new Ray(vEye, vDir);\r\n }\r\n /**\r\n * Queues a node for a one-shot update before the next render.\r\n *\r\n * The node's `update(frame, elapsedSeconds, deltaSeconds)` will be called\r\n * during Scene.frameUpdate and then the node is removed from the queue.\r\n *\r\n * @param node - Node to schedule.\r\n *\r\n * @remarks\r\n * - To update continuously each frame, call `queueUpdateNode(this)` from within the node's `update` method.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queueUpdateNode(node: SceneNode) {\r\n if (node && this._nodeUpdateQueue.findIndex((val) => val.get() === node) < 0) {\r\n this._nodeUpdateQueue.push(new DWeakRef(node));\r\n }\r\n }\r\n /**\r\n * Queues a drawable for a one-shot state update before the next render.\r\n *\r\n * The drawable's `updateState()` will be called during Scene.frameUpdate and then the drawable is removed from the queue.\r\n * @param drawable - Drawable to schedule.\r\n *\r\n * @remarks\r\n * - To update continuously each frame, call `queueUpdateDrawable(this)` from within the drawable's `updateState` method.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queueUpdateDrawable(drawable: Drawable) {\r\n if (drawable && this._drawableUpdateQueue.indexOf(drawable) < 0) {\r\n this._drawableUpdateQueue.push(drawable);\r\n }\r\n }\r\n /**\r\n * Queues a node for a one-shot per-camera update before render.\r\n *\r\n * The node's `updatePerCamera(camera, elapsedSeconds, deltaSeconds)` will be\r\n * called once for each camera during {@link Scene.frameUpdatePerCamera}, then removed.\r\n *\r\n * @param node - Node to schedule.\r\n *\r\n * @remarks\r\n * - To run per-camera work continuously, re-queue from `updatePerCamera`.\r\n * - Duplicate scheduling within the same frame is prevented.\r\n */\r\n queuePerCameraUpdateNode(node: SceneNode) {\r\n if (node && this._perCameraUpdateQueue.findIndex((val) => val.get() === node) < 0) {\r\n this._perCameraUpdateQueue.push(new DWeakRef(node));\r\n }\r\n }\r\n /**\r\n * Renders this scene using the `mainCamera`, if present.\r\n *\r\n * Equivalent to `mainCamera.render(this)` when `mainCamera` is set.\r\n */\r\n render() {\r\n if (this.mainCamera) {\r\n this.mainCamera.render(this);\r\n }\r\n }\r\n /**\r\n * Marks a graph node as needing placement update in the octree.\r\n *\r\n * Called by nodes when their transform/visibility/attachment changes in a way\r\n * that affects spatial placement.\r\n *\r\n * @internal\r\n */\r\n invalidateNodePlacement(node: GraphNode) {\r\n this._nodePlaceList.add(node);\r\n }\r\n /**\r\n * Synchronizes environment light maps (IBL, SH/FB) with the sky as needed.\r\n *\r\n * Uses device capabilities to decide between Spherical Harmonics floating-point blending (SHFB)\r\n * and classic SH textures, and lazily fills missing environment fields from the sky.\r\n *\r\n * @internal\r\n */\r\n private updateEnvLight() {\r\n if (this.env.light.type === 'ibl') {\r\n this.env.light.radianceMap = this.env.sky.radianceMap;\r\n this.env.light.sheenRadianceMap = this.env.sky.sheenRadianceMap;\r\n this.env.light.irradianceWindow = this.env.sky.shWindowWeights;\r\n this.env.light.irradianceSHFB = this.env.sky.irradianceSHFB;\r\n this.env.light.irradianceSH = null;\r\n }\r\n }\r\n /**\r\n * Returns the renderer class used to render the scene.\r\n *\r\n * Override in subclasses to supply a custom renderer.\r\n *\r\n * @internal\r\n */\r\n getRenderer() {\r\n return SceneRenderer;\r\n }\r\n /**\r\n * Performs per-frame scene updates, once per device frame.\r\n *\r\n * Steps:\r\n * - Ensure this runs only once per frame (via `frameInfo.frameCounter`).\r\n * - Update environment light synchronization.\r\n * - Dispatch `update` event.\r\n * - Drain the one-shot node update queue and call `node.update(...)`.\r\n * - Apply pending octree placement updates.\r\n *\r\n */\r\n frameUpdate() {\r\n const frameInfo = getDevice().frameInfo;\r\n if (frameInfo.frameCounter !== this._updateFrame) {\r\n this._updateFrame = frameInfo.frameCounter;\r\n this.updateEnvLight();\r\n this.dispatchEvent('update', this);\r\n this.mainCamera?.updateController();\r\n if (this._nodeUpdateQueue.length > 0) {\r\n const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;\r\n const deltaInSeconds = frameInfo.elapsedFrame * 0.001;\r\n const queue = this._nodeUpdateQueue;\r\n this._nodeUpdateQueue = [];\r\n while (queue.length > 0) {\r\n const ref = queue.shift()!;\r\n const node = ref.get();\r\n if (node?.attached) {\r\n node.update(frameInfo.frameCounter, elapsedInSeconds, deltaInSeconds);\r\n }\r\n ref.dispose();\r\n }\r\n }\r\n if (this._drawableUpdateQueue.length > 0) {\r\n for (const drawable of this._drawableUpdateQueue) {\r\n drawable.updateState();\r\n }\r\n this._drawableUpdateQueue = [];\r\n }\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n }\r\n }\r\n /**\r\n * Performs per-camera scene updates for the current frame.\r\n *\r\n * Steps:\r\n * - Drain the per-camera update queue and call `node.updatePerCamera(camera, ...)`.\r\n * - Apply pending octree placement updates.\r\n *\r\n * @param camera - The camera being updated for.\r\n */\r\n frameUpdatePerCamera(camera: Camera) {\r\n if (this._perCameraUpdateQueue.length > 0) {\r\n const frameInfo = getDevice().frameInfo;\r\n const elapsedInSeconds = frameInfo.elapsedOverall * 0.001;\r\n const deltaInSeconds = frameInfo.elapsedFrame * 0.001;\r\n const queue = this._perCameraUpdateQueue;\r\n this._perCameraUpdateQueue = [];\r\n while (queue.length > 0) {\r\n const ref = queue.shift()!;\r\n ref.get()?.updatePerCamera(camera, elapsedInSeconds, deltaInSeconds);\r\n ref.dispose();\r\n }\r\n }\r\n this.updateNodePlacement(this._octree, this._nodePlaceList);\r\n }\r\n /**\r\n * Applies placement changes for nodes in `list` to the given `octree`.\r\n *\r\n * Rules:\r\n * - If node is not disposed, attached, not hidden, and `placeToOctree` is true,\r\n * it is placed; otherwise removed.\r\n * - Drains `list` until empty.\r\n *\r\n * @param octree - Target spatial index.\r\n * @param list - Set of nodes awaiting placement evaluation.\r\n */\r\n updateNodePlacement(octree: Octree, list: Set<GraphNode>) {\r\n function placeNode(node: GraphNode) {\r\n if (!node.disposed && node.attached && !node.hidden && node.placeToOctree) {\r\n octree.placeNode(node);\r\n } else {\r\n octree.removeNode(node);\r\n }\r\n list.delete(node);\r\n }\r\n if (list.size > 0) {\r\n while (list.size > 0) {\r\n const node = list.keys().next().value!;\r\n if (octree) {\r\n placeNode(node);\r\n } else {\r\n list.delete(node);\r\n }\r\n }\r\n }\r\n }\r\n /**\r\n * Disposes the scene and its owned resources.\r\n *\r\n * Disposes:\r\n * - Environment\r\n * - Root node (and, by extension, its hierarchy)\r\n * - Main camera reference wrapper\r\n *\r\n */\r\n protected onDispose() {\r\n this._env.dispose();\r\n this._rootNode.dispose();\r\n this._mainCamera.dispose();\r\n }\r\n}\r\n"],"names":["Scene","makeObservable","Disposable","_nextId","name","_id","_name","_octree","Octree","_nodePlaceList","Set","_nodeUpdateQueue","_drawableUpdateQueue","_perCameraUpdateQueue","_env","Environment","_updateFrame","_rootNode","DRef","set","SceneNode","get","_metaData","_scripts","_mainCamera","id","val","mainCamera","camera","rootNode","octree","updateNodePlacement","boundingBox","getRootNode","getBoxLoosed","env","metaData","script","fileName","splice","unshift","ScriptAttachment","scriptConfig","config","value","normalized","normalizeScriptAttachmentConfig","scripts","normalizeScriptAttachments","scriptConfigs","map","item","next","Array","isArray","i","Math","max","length","push","filter","findNodeById","findNodeByName","raycast","ray","Infinity","raycastVisitor","RaycastVisitor","traverse","intersected","target","dist","intersectedDist","point","intersectedPoint","constructRay","viewportWidth","viewportHeight","screenX","screenY","invModelMatrix","vClip","Vector4","vWorld","invViewProjectionMatrix","transform","scaleBy","w","vEye","getWorldPosition","vDir","Vector3","sub","xyz","inplaceNormalize","transformPointAffine","transformVectorAffine","Ray","queueUpdateNode","node","findIndex","DWeakRef","queueUpdateDrawable","drawable","indexOf","queuePerCameraUpdateNode","render","invalidateNodePlacement","add","light","type","radianceMap","sky","sheenRadianceMap","irradianceWindow","shWindowWeights","irradianceSHFB","irradianceSH","getRenderer","SceneRenderer","frameUpdate","frameInfo","getDevice","frameCounter","updateEnvLight","dispatchEvent","updateController","elapsedInSeconds","elapsedOverall","deltaInSeconds","elapsedFrame","queue","ref","shift","attached","update","dispose","updateState","frameUpdatePerCamera","updatePerCamera","list","placeNode","disposed","hidden","placeToOctree","removeNode","delete","size","keys"],"mappings":"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"}
@@ -10,6 +10,7 @@ import '../../material/blinn.js';
10
10
  import '../../material/unlit.js';
11
11
  import '../../material/particle.js';
12
12
  import '../../material/subsurfaceprofile.js';
13
+ import '../../material/skin.js';
13
14
  import '../../material/meshmaterial.js';
14
15
  import '../../material/grassmaterial.js';
15
16
  import '../../material/terrain-cm.js';