@zephyr3d/scene 0.9.25 → 0.9.26

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 (262) hide show
  1. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  2. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  3. package/dist/animation/joint_dynamics/controller.js +7 -5
  4. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  5. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  6. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  7. package/dist/animation/morphtrack.js +3 -4
  8. package/dist/animation/morphtrack.js.map +1 -1
  9. package/dist/animation/skeleton.js +58 -24
  10. package/dist/animation/skeleton.js.map +1 -1
  11. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  12. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  13. package/dist/animation/spring/spring_collider.js +4 -3
  14. package/dist/animation/spring/spring_collider.js.map +1 -1
  15. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  16. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  17. package/dist/animation/spring/spring_particle.js +2 -0
  18. package/dist/animation/spring/spring_particle.js.map +1 -1
  19. package/dist/animation/spring/spring_system.js +11 -3
  20. package/dist/animation/spring/spring_system.js.map +1 -1
  21. package/dist/animation/spring_modifier.js +10 -0
  22. package/dist/animation/spring_modifier.js.map +1 -1
  23. package/dist/app/engine.js +53 -43
  24. package/dist/app/engine.js.map +1 -1
  25. package/dist/app/scriptingsystem.js +119 -6
  26. package/dist/app/scriptingsystem.js.map +1 -1
  27. package/dist/app/scriptregistry.js +3 -2
  28. package/dist/app/scriptregistry.js.map +1 -1
  29. package/dist/asset/assetmanager.js +284 -67
  30. package/dist/asset/assetmanager.js.map +1 -1
  31. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  32. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  33. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  34. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  35. package/dist/asset/model.js +178 -67
  36. package/dist/asset/model.js.map +1 -1
  37. package/dist/camera/camera.js +193 -21
  38. package/dist/camera/camera.js.map +1 -1
  39. package/dist/camera/perspectivecamera.js +3 -1
  40. package/dist/camera/perspectivecamera.js.map +1 -1
  41. package/dist/index.d.ts +4019 -1278
  42. package/dist/index.js +15 -5
  43. package/dist/index.js.map +1 -1
  44. package/dist/material/eye.js +932 -0
  45. package/dist/material/eye.js.map +1 -0
  46. package/dist/material/hair.js +917 -0
  47. package/dist/material/hair.js.map +1 -0
  48. package/dist/material/hairstrand.js +842 -0
  49. package/dist/material/hairstrand.js.map +1 -0
  50. package/dist/material/hairstrand_data.js +162 -0
  51. package/dist/material/hairstrand_data.js.map +1 -0
  52. package/dist/material/lambert.js +5 -2
  53. package/dist/material/lambert.js.map +1 -1
  54. package/dist/material/material.js +338 -300
  55. package/dist/material/material.js.map +1 -1
  56. package/dist/material/meshmaterial.js +120 -19
  57. package/dist/material/meshmaterial.js.map +1 -1
  58. package/dist/material/mixins/albedocolor.js +1 -1
  59. package/dist/material/mixins/albedocolor.js.map +1 -1
  60. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  61. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  62. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  63. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  65. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  67. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  70. package/dist/material/mixins/lit.js +73 -18
  71. package/dist/material/mixins/lit.js.map +1 -1
  72. package/dist/material/mixins/pbr/common.js +4 -4
  73. package/dist/material/mixins/pbr/common.js.map +1 -1
  74. package/dist/material/mixins/texture.js +48 -11
  75. package/dist/material/mixins/texture.js.map +1 -1
  76. package/dist/material/mtoon.js +6 -5
  77. package/dist/material/mtoon.js.map +1 -1
  78. package/dist/material/pbrblueprint.js +146 -28
  79. package/dist/material/pbrblueprint.js.map +1 -1
  80. package/dist/material/pbrblueprint_instance.js +501 -0
  81. package/dist/material/pbrblueprint_instance.js.map +1 -0
  82. package/dist/material/pbrmr.js +15 -16
  83. package/dist/material/pbrmr.js.map +1 -1
  84. package/dist/material/shader/helper.js +330 -20
  85. package/dist/material/shader/helper.js.map +1 -1
  86. package/dist/material/shader/terrain_blend.js +55 -0
  87. package/dist/material/shader/terrain_blend.js.map +1 -0
  88. package/dist/material/skin.js +192 -32
  89. package/dist/material/skin.js.map +1 -1
  90. package/dist/material/spriteblueprint.js +16 -1
  91. package/dist/material/spriteblueprint.js.map +1 -1
  92. package/dist/material/subsurfaceprofile.js +86 -23
  93. package/dist/material/subsurfaceprofile.js.map +1 -1
  94. package/dist/material/water.js +3 -1
  95. package/dist/material/water.js.map +1 -1
  96. package/dist/posteffect/bloom.js +167 -7
  97. package/dist/posteffect/bloom.js.map +1 -1
  98. package/dist/posteffect/coloradjust.js +2 -1
  99. package/dist/posteffect/coloradjust.js.map +1 -1
  100. package/dist/posteffect/compositor.js.map +1 -1
  101. package/dist/posteffect/fxaa.js +2 -1
  102. package/dist/posteffect/fxaa.js.map +1 -1
  103. package/dist/posteffect/grayscale.js +3 -1
  104. package/dist/posteffect/grayscale.js.map +1 -1
  105. package/dist/posteffect/motionblur.js +4 -1
  106. package/dist/posteffect/motionblur.js.map +1 -1
  107. package/dist/posteffect/posteffect.js.map +1 -1
  108. package/dist/posteffect/skinsss.js +368 -69
  109. package/dist/posteffect/skinsss.js.map +1 -1
  110. package/dist/posteffect/ssgi.js +16 -9
  111. package/dist/posteffect/ssgi.js.map +1 -1
  112. package/dist/posteffect/ssr.js +3 -0
  113. package/dist/posteffect/ssr.js.map +1 -1
  114. package/dist/posteffect/sss.js +91 -34
  115. package/dist/posteffect/sss.js.map +1 -1
  116. package/dist/posteffect/taa.js.map +1 -1
  117. package/dist/posteffect/tonemap.js +44 -1
  118. package/dist/posteffect/tonemap.js.map +1 -1
  119. package/dist/render/abuffer_oit.js +45 -39
  120. package/dist/render/abuffer_oit.js.map +1 -1
  121. package/dist/render/cull_visitor.js +19 -0
  122. package/dist/render/cull_visitor.js.map +1 -1
  123. package/dist/render/depthpass.js +36 -2
  124. package/dist/render/depthpass.js.map +1 -1
  125. package/dist/render/drawable_mixin.js +26 -1
  126. package/dist/render/drawable_mixin.js.map +1 -1
  127. package/dist/render/dualdepthpeeling_oit.js +52 -51
  128. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  129. package/dist/render/envlight.js +1 -1
  130. package/dist/render/envlight.js.map +1 -1
  131. package/dist/render/fbm_wavegenerator.js +3 -0
  132. package/dist/render/fbm_wavegenerator.js.map +1 -1
  133. package/dist/render/gerstner_wavegenerator.js +3 -0
  134. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  135. package/dist/render/globalbindgroup_allocator.js +3 -0
  136. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  137. package/dist/render/oit.js +29 -0
  138. package/dist/render/oit.js.map +1 -0
  139. package/dist/render/render_queue.js +3 -0
  140. package/dist/render/render_queue.js.map +1 -1
  141. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  142. package/dist/render/rendergraph/executor.js +2 -0
  143. package/dist/render/rendergraph/executor.js.map +1 -1
  144. package/dist/render/rendergraph/forward_plus_builder.js +61 -1
  145. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  146. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  147. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  148. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  149. package/dist/render/rendergraph/types.js.map +1 -1
  150. package/dist/render/shadow_mask_pass.js +73 -8
  151. package/dist/render/shadow_mask_pass.js.map +1 -1
  152. package/dist/render/sky.js +166 -126
  153. package/dist/render/sky.js.map +1 -1
  154. package/dist/render/weightedblended_oit.js +36 -35
  155. package/dist/render/weightedblended_oit.js.map +1 -1
  156. package/dist/scene/basesprite.js +8 -0
  157. package/dist/scene/basesprite.js.map +1 -1
  158. package/dist/scene/batchgroup.js +3 -0
  159. package/dist/scene/batchgroup.js.map +1 -1
  160. package/dist/scene/environment.js +4 -1
  161. package/dist/scene/environment.js.map +1 -1
  162. package/dist/scene/hair.js +963 -0
  163. package/dist/scene/hair.js.map +1 -0
  164. package/dist/scene/light.js +5 -1
  165. package/dist/scene/light.js.map +1 -1
  166. package/dist/scene/mesh.js +481 -47
  167. package/dist/scene/mesh.js.map +1 -1
  168. package/dist/scene/meshdrawable.js +6 -0
  169. package/dist/scene/meshdrawable.js.map +1 -1
  170. package/dist/scene/msdftext.js +3 -0
  171. package/dist/scene/msdftext.js.map +1 -1
  172. package/dist/scene/msdftextsprite.js +3 -0
  173. package/dist/scene/msdftextsprite.js.map +1 -1
  174. package/dist/scene/particlesys.js +6 -0
  175. package/dist/scene/particlesys.js.map +1 -1
  176. package/dist/scene/scene.js +3 -0
  177. package/dist/scene/scene.js.map +1 -1
  178. package/dist/scene/scene_node.js +6 -1
  179. package/dist/scene/scene_node.js.map +1 -1
  180. package/dist/scene/terrain-cm/grass.js +3 -0
  181. package/dist/scene/terrain-cm/grass.js.map +1 -1
  182. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  183. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  184. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  185. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  186. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  187. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  188. package/dist/scene/water.js +6 -0
  189. package/dist/scene/water.js.map +1 -1
  190. package/dist/shaders/atmosphere.js.map +1 -1
  191. package/dist/shaders/diffusion.js +54 -0
  192. package/dist/shaders/diffusion.js.map +1 -0
  193. package/dist/shaders/shadow.js +33 -21
  194. package/dist/shaders/shadow.js.map +1 -1
  195. package/dist/shaders/temporal.js +71 -33
  196. package/dist/shaders/temporal.js.map +1 -1
  197. package/dist/shadow/dom.js +546 -0
  198. package/dist/shadow/dom.js.map +1 -0
  199. package/dist/shadow/pcf_opt.js +3 -5
  200. package/dist/shadow/pcf_opt.js.map +1 -1
  201. package/dist/shadow/pcf_pd.js +1 -1
  202. package/dist/shadow/pcf_pd.js.map +1 -1
  203. package/dist/shadow/receiver_bias.js +41 -0
  204. package/dist/shadow/receiver_bias.js.map +1 -0
  205. package/dist/shadow/shader.js +20 -60
  206. package/dist/shadow/shader.js.map +1 -1
  207. package/dist/shadow/shadow_impl.js +89 -0
  208. package/dist/shadow/shadow_impl.js.map +1 -1
  209. package/dist/shadow/shadow_region.js +50 -50
  210. package/dist/shadow/shadow_region.js.map +1 -1
  211. package/dist/shadow/shadowmapper.js +150 -37
  212. package/dist/shadow/shadowmapper.js.map +1 -1
  213. package/dist/shapes/shape.js +11 -2
  214. package/dist/shapes/shape.js.map +1 -1
  215. package/dist/shapes/sphere.js +50 -9
  216. package/dist/shapes/sphere.js.map +1 -1
  217. package/dist/utility/blueprint/common/constants.js +112 -2
  218. package/dist/utility/blueprint/common/constants.js.map +1 -1
  219. package/dist/utility/blueprint/material/func.js +142 -49
  220. package/dist/utility/blueprint/material/func.js.map +1 -1
  221. package/dist/utility/blueprint/material/ir.js +490 -25
  222. package/dist/utility/blueprint/material/ir.js.map +1 -1
  223. package/dist/utility/blueprint/material/texture.js +898 -4
  224. package/dist/utility/blueprint/material/texture.js.map +1 -1
  225. package/dist/utility/serialization/manager.js +431 -100
  226. package/dist/utility/serialization/manager.js.map +1 -1
  227. package/dist/utility/serialization/scene/animation.js +370 -3
  228. package/dist/utility/serialization/scene/animation.js.map +1 -1
  229. package/dist/utility/serialization/scene/batch.js +4 -0
  230. package/dist/utility/serialization/scene/batch.js.map +1 -1
  231. package/dist/utility/serialization/scene/camera.js +133 -1
  232. package/dist/utility/serialization/scene/camera.js.map +1 -1
  233. package/dist/utility/serialization/scene/common.js +26 -5
  234. package/dist/utility/serialization/scene/common.js.map +1 -1
  235. package/dist/utility/serialization/scene/hair.js +1141 -0
  236. package/dist/utility/serialization/scene/hair.js.map +1 -0
  237. package/dist/utility/serialization/scene/light.js +84 -4
  238. package/dist/utility/serialization/scene/light.js.map +1 -1
  239. package/dist/utility/serialization/scene/material.js +1867 -166
  240. package/dist/utility/serialization/scene/material.js.map +1 -1
  241. package/dist/utility/serialization/scene/mesh.js +231 -14
  242. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  243. package/dist/utility/serialization/scene/node.js +141 -7
  244. package/dist/utility/serialization/scene/node.js.map +1 -1
  245. package/dist/utility/serialization/scene/particle.js +4 -0
  246. package/dist/utility/serialization/scene/particle.js.map +1 -1
  247. package/dist/utility/serialization/scene/primitive.js +18 -0
  248. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  249. package/dist/utility/serialization/scene/sprite.js +4 -0
  250. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  251. package/dist/utility/serialization/scene/terrain.js +4 -0
  252. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  253. package/dist/utility/serialization/scene/text.js +4 -0
  254. package/dist/utility/serialization/scene/text.js.map +1 -1
  255. package/dist/utility/serialization/scene/water.js +4 -0
  256. package/dist/utility/serialization/scene/water.js.map +1 -1
  257. package/dist/utility/serialization/types.js.map +1 -1
  258. package/dist/utility/shprojector.js +96 -95
  259. package/dist/utility/shprojector.js.map +1 -1
  260. package/dist/values.js +49 -2
  261. package/dist/values.js.map +1 -1
  262. package/package.json +3 -3
@@ -1 +1 @@
1
- {"version":3,"file":"mesh.js","sources":["../../src/scene/mesh.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, castObservable, DRef } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport type { MeshMaterial } from '../material';\r\nimport { LambertMaterial, ShaderHelper } from '../material';\r\nimport type {\r\n RenderPass,\r\n Primitive,\r\n BatchDrawable,\r\n DrawContext,\r\n PickTarget,\r\n MorphData,\r\n MorphInfo,\r\n RenderQueue\r\n} from '../render';\r\nimport {\r\n PBArrayTypeInfo,\r\n PBPrimitiveType,\r\n PBPrimitiveTypeInfo,\r\n PBStructTypeInfo,\r\n type RenderBundle,\r\n type Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox, type BoundingVolume } from '../utility/bounding_volume';\r\nimport { MORPH_ATTRIBUTE_VECTOR_COUNT, MORPH_WEIGHTS_VECTOR_COUNT, QUEUE_OPAQUE } from '../values';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport { RenderBundleWrapper } from '../render/renderbundle_wrapper';\r\nimport type { SceneNode } from './scene_node';\r\nimport { getDevice } from '../app/api';\r\nimport type { SkinnedBoundingBox } from '../animation';\r\nimport { calculateMorphBoundingBox } from '../animation/morphtarget';\r\n\r\n/**\r\n * Callback invoked after a mesh finishes its per-frame update.\r\n *\r\n * @public\r\n */\r\nexport type MeshUpdateCallback = (frameId: number, elapsedInSeconds: number, deltaInSeconds: number) => void;\r\n\r\n/**\r\n * Bounding data used to update a mesh's local bounding box after morph target weights change.\r\n *\r\n * @public\r\n */\r\nexport interface MorphBoundingInfo {\r\n targetBoxes: BoundingBox[];\r\n originBox: BoundingBox;\r\n}\r\n\r\nconst MeshBase = castObservable(applyMixins(GraphNode, mixinDrawable))<{\r\n primitive_changed: [primitive: Nullable<Primitive>];\r\n material_changed: [material: Nullable<MeshMaterial>];\r\n}>();\r\n\r\n/**\r\n * Mesh node\r\n * @public\r\n */\r\nexport class Mesh extends MeshBase implements BatchDrawable {\r\n /** @internal */\r\n private readonly _primitive: DRef<Primitive>;\r\n /** @internal */\r\n private readonly _material: DRef<MeshMaterial>;\r\n /** @internal */\r\n protected _castShadow: boolean;\r\n /** @internal */\r\n protected _skinnedBoundingInfo: Nullable<SkinnedBoundingBox>;\r\n /** @internal */\r\n protected _animatedBoundingBox: Nullable<BoundingBox>;\r\n /** @internal */\r\n protected _skinBindingName: string;\r\n /** @internal */\r\n protected _boneMatrices: DRef<Texture2D>;\r\n /** @internal */\r\n protected _morphData: Nullable<MorphData>;\r\n /** @internal */\r\n protected _morphInfo: Nullable<MorphInfo>;\r\n /** @internal */\r\n protected _morphBoundingInfo: Nullable<MorphBoundingInfo>;\r\n /** @internal */\r\n protected _morphDirty: boolean;\r\n /** @internal */\r\n protected _instanceHash: Nullable<string>;\r\n /** @internal */\r\n protected _batchable: boolean;\r\n /** @internal */\r\n protected _pickTarget: PickTarget;\r\n /** @internal */\r\n protected _suspendSkinning: boolean;\r\n /** @internal */\r\n protected _renderBundle: Nullable<Record<string, RenderBundle>>;\r\n /** @internal */\r\n protected _useRenderBundle: boolean;\r\n /** @internal */\r\n protected _materialChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _primitiveChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _postUpdateCallbacks: Set<MeshUpdateCallback>;\r\n /**\r\n * Creates an instance of mesh node\r\n * @param scene - The scene to which the mesh node belongs\r\n */\r\n constructor(scene: Scene, primitive?: Primitive, material?: MeshMaterial) {\r\n super(scene);\r\n this._primitive = new DRef();\r\n this._material = new DRef();\r\n this._castShadow = true;\r\n this._skinnedBoundingInfo = null;\r\n this._animatedBoundingBox = null;\r\n this._boneMatrices = new DRef();\r\n this._morphData = null;\r\n this._morphInfo = null;\r\n this._morphBoundingInfo = null;\r\n this._morphDirty = false;\r\n this._instanceHash = null;\r\n this._pickTarget = { node: this };\r\n this._batchable = getDevice().type !== 'webgl';\r\n this.primitive = primitive ?? null;\r\n this.material = material ?? Mesh._getDefaultMaterial();\r\n this._suspendSkinning = false;\r\n this._skinBindingName = '';\r\n this._renderBundle = {};\r\n this._useRenderBundle = true;\r\n this._materialChangeTag = null;\r\n this._primitiveChangeTag = null;\r\n this._postUpdateCallbacks = new Set();\r\n }\r\n /**\r\n * Returns the batch instance ID for the current render pass.\r\n */\r\n getInstanceId(_renderPass: RenderPass) {\r\n return `${this._instanceHash}:${this.worldMatrixDet >= 0}`;\r\n }\r\n /**\r\n * Returns the packed instance-uniform buffer used for batching.\r\n */\r\n getInstanceUniforms() {\r\n return this._material.get()!.$instanceUniforms;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n setPickTarget(node: SceneNode, label?: string) {\r\n this._pickTarget = { node, label };\r\n }\r\n get useRenderBundle() {\r\n return this._useRenderBundle;\r\n }\r\n set useRenderBundle(val) {\r\n this._useRenderBundle = val;\r\n }\r\n get skeletonName() {\r\n return this._skinBindingName;\r\n }\r\n set skeletonName(name) {\r\n this.skinBindingName = name;\r\n }\r\n get skinBindingName() {\r\n return this._skinBindingName;\r\n }\r\n set skinBindingName(name) {\r\n if (name !== this._skinBindingName) {\r\n this._skinBindingName = name;\r\n this.updateSkeletonState();\r\n }\r\n }\r\n /** @internal */\r\n get skinnedBoundingInfo() {\r\n return this._skinnedBoundingInfo;\r\n }\r\n /** @internal */\r\n get suspendSkinning() {\r\n return this._suspendSkinning;\r\n }\r\n /** @internal */\r\n set suspendSkinning(val) {\r\n this._suspendSkinning = !!val;\r\n }\r\n /** Wether the mesh node casts shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(b) {\r\n this._castShadow = b;\r\n }\r\n /** Primitive of the mesh */\r\n get primitive() {\r\n return this._primitive?.get() ?? null;\r\n }\r\n set primitive(prim) {\r\n const currentPrimitive = this._primitive.get();\r\n if (prim !== currentPrimitive) {\r\n if (currentPrimitive) {\r\n currentPrimitive.off('bv_changed', this._onBoundingboxChange, this);\r\n }\r\n this._primitive.set(prim);\r\n if (prim) {\r\n prim.on('bv_changed', this._onBoundingboxChange, this);\r\n }\r\n this._instanceHash =\r\n prim && this._material.get()\r\n ? `${this.constructor.name}:${this._scene!.id}:${prim.id}:${this._material.get()!.instanceId}`\r\n : null;\r\n this.invalidateBoundingVolume();\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._primitiveChangeTag = null;\r\n this.dispatchEvent('primitive_changed', prim);\r\n }\r\n }\r\n /** Material of the mesh */\r\n get material() {\r\n return this._material?.get() ?? null;\r\n }\r\n set material(m) {\r\n if (this._material.get() !== m) {\r\n this._material.set(m);\r\n if (m) {\r\n RenderBundleWrapper.materialAttached(m.coreMaterial, this);\r\n }\r\n this._instanceHash =\r\n this._primitive.get() && m\r\n ? `${this.constructor.name}:${this._scene?.id ?? 0}:${this._primitive.get()!.id}:${m.instanceId}`\r\n : null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._materialChangeTag = null;\r\n this.dispatchEvent('material_changed', m);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isMesh}\r\n */\r\n isMesh(): this is Mesh {\r\n return true;\r\n }\r\n /**\r\n * Sets the bounding box for animation\r\n * @param bbox - The bounding box for animation\r\n */\r\n setAnimatedBoundingBox(bbox: Nullable<BoundingBox>) {\r\n this._animatedBoundingBox = bbox;\r\n this.invalidateBoundingVolume();\r\n }\r\n /**\r\n * Gets the bounding box for animation\r\n */\r\n getAnimatedBoundingBox() {\r\n return this._animatedBoundingBox ?? null;\r\n }\r\n /**\r\n * Sets morph target bounding data used to update the animated bounding box when weights change.\r\n * @param info - Morph target bounding data\r\n */\r\n setMorphBoundingInfo(info: Nullable<MorphBoundingInfo>) {\r\n this._morphBoundingInfo = info\r\n ? {\r\n targetBoxes: info.targetBoxes.map((box) => box.clone()),\r\n originBox: info.originBox.clone()\r\n }\r\n : null;\r\n this.refreshAnimatedBoundingBox();\r\n }\r\n /**\r\n * Gets morph target bounding data.\r\n */\r\n getMorphBoundingInfo() {\r\n return this._morphBoundingInfo;\r\n }\r\n /**\r\n * Sets the texture that contains the bone matrices for skeletal animation\r\n * @param matrices - The texture that contains the bone matrices\r\n */\r\n setBoneMatrices(matrices: Nullable<Texture2D>) {\r\n if (this._boneMatrices.get() !== matrices) {\r\n this._boneMatrices.set(matrices);\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * Sets the texture that contains the morph target data\r\n * @param data - The texture that contains the morph target data\r\n */\r\n setMorphData(data: Nullable<MorphData>) {\r\n if (!data) {\r\n if (this._morphData) {\r\n this._morphData?.texture?.dispose();\r\n this._morphData = null;\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n } else {\r\n if (!this._morphData) {\r\n this._morphData = {\r\n texture: new DRef()\r\n } as MorphData;\r\n }\r\n this._morphData.width = data.width;\r\n this._morphData.height = data.height;\r\n this._morphData.data = data.data.slice();\r\n if (data.texture?.get()) {\r\n this._morphData.texture!.set(data.texture.get());\r\n } else {\r\n const tex = getDevice().createTexture2D('rgba32f', data.width, data.height, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n minFilter: 'nearest',\r\n magFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n tex.update(data.data, 0, 0, data.width, data.height);\r\n this._morphData.texture!.set(tex);\r\n }\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * Sets the skinned bounding info\r\n * @param info - The skinned bounding info\r\n */\r\n setSkinnedBoundingInfo(info: Nullable<SkinnedBoundingBox>) {\r\n this._skinnedBoundingInfo = info;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return this._morphData;\r\n }\r\n /**\r\n * Sets the buffer that contains the morph target information\r\n * @param info - The buffer that contains the morph target information\r\n */\r\n setMorphInfo(info: Nullable<MorphInfo>) {\r\n if (!info) {\r\n if (this._morphInfo) {\r\n this._morphInfo.buffer?.dispose();\r\n this._morphInfo = null;\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n } else {\r\n if (!this._morphInfo) {\r\n this._morphInfo = {\r\n buffer: new DRef()\r\n } as MorphInfo;\r\n }\r\n this._morphInfo.data = info.data.slice();\r\n this._morphInfo.names = { ...info.names };\r\n if (info.buffer?.get()) {\r\n this._morphInfo.buffer!.set(info.buffer.get());\r\n } else {\r\n const bufferType = new PBStructTypeInfo('dummy', 'std140', [\r\n {\r\n name: ShaderHelper.getMorphInfoUniformName(),\r\n type: new PBArrayTypeInfo(\r\n new PBPrimitiveTypeInfo(PBPrimitiveType.F32VEC4),\r\n 1 + MORPH_WEIGHTS_VECTOR_COUNT + MORPH_ATTRIBUTE_VECTOR_COUNT\r\n )\r\n }\r\n ]);\r\n const morphUniformBuffer = getDevice().createStructuredBuffer(\r\n bufferType,\r\n {\r\n usage: 'uniform'\r\n },\r\n info.data\r\n );\r\n this._morphInfo.buffer!.set(morphUniformBuffer);\r\n }\r\n this._morphDirty = false;\r\n this.refreshAnimatedBoundingBox();\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return this._morphInfo;\r\n }\r\n /** @internal */\r\n resolveAnimatedBoundingBox(morphBoundingBox?: Nullable<BoundingBox>) {\r\n const skinnedBoundingBox =\r\n this._boneMatrices.get() && this._skinnedBoundingInfo?.boundingBox?.isValid()\r\n ? this._skinnedBoundingInfo.boundingBox\r\n : null;\r\n if (skinnedBoundingBox && morphBoundingBox) {\r\n return skinnedBoundingBox.clone().union(morphBoundingBox) as BoundingBox;\r\n }\r\n return skinnedBoundingBox?.clone() ?? morphBoundingBox ?? null;\r\n }\r\n /**\r\n * Get the number of morph targets\r\n *\r\n * @returns The number of morph targets\r\n */\r\n getNumMorphTargets(): number {\r\n return this._morphInfo?.data[3] ?? 0;\r\n }\r\n /**\r\n * Get the name of the morph target by index\r\n *\r\n * @param index - The index of the morph target\r\n * @returns The name of the morph target, or null if not found\r\n */\r\n getMorphTargetName(index: number): Nullable<string> {\r\n if (this._morphInfo && index >= 0 && index < this._morphInfo.data[3]) {\r\n const name = Object.keys(this._morphInfo.names).find((key) => this._morphInfo!.names![key] === index);\r\n return name ?? null;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Get the index of the morph target by name\r\n * @param name - The name of the morph target\r\n * @returns The index of the morph target, or -1 if not found\r\n */\r\n getMorphTargetIndexByName(name: string): number {\r\n return this._morphInfo?.names?.[name] ?? -1;\r\n }\r\n /**\r\n * Update morph target weight\r\n *\r\n * @param name - The name of the morph target\r\n * @param weight - The weight of the morph target\r\n */\r\n setMorphWeight(name: string, weight: number) {\r\n const index = this.getMorphTargetIndexByName(name);\r\n if (index >= 0) {\r\n this.setMorphWeightByIndex(index, weight);\r\n }\r\n }\r\n /**\r\n * Update morph target weight by index\r\n *\r\n * @param index - The index of the morph target\r\n * @param weight - The weight of the morph target\r\n */\r\n setMorphWeightByIndex(index: number, weight: number) {\r\n if (index >= 0 && index < this._morphInfo!.data[3]) {\r\n if (this._morphInfo!.data[4 + index] !== weight) {\r\n this._morphInfo!.data[4 + index] = weight;\r\n this._morphDirty = true;\r\n this.refreshAnimatedBoundingBox();\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n } else {\r\n console.warn(`Morph target index out of range: ${index}`);\r\n }\r\n }\r\n /**\r\n * Get morph target weight\r\n *\r\n * @param name - The name of the morph target\r\n * @returns The weight of the morph target, or 0 if not found\r\n */\r\n getMorphWeight(name: string): number {\r\n const index = this._morphInfo?.names?.[name];\r\n if (index !== undefined && index >= 0 && index < this._morphInfo!.data[3]) {\r\n return this._morphInfo!.data[4 + index];\r\n }\r\n return 0;\r\n }\r\n /**\r\n * Update morph target weights\r\n *\r\n * @param weight - The morph target weights. The length must not exceed the mesh's morph target count.\r\n */\r\n updateMorphWeights(weight: number[]) {\r\n if (this._morphInfo && weight && weight.length <= this._morphInfo.data[3]) {\r\n this._morphInfo.data.set(weight, 4);\r\n this._morphDirty = true;\r\n this.refreshAnimatedBoundingBox();\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.update} */\r\n update(frameId: number, elapsedInSeconds: number, deltaInSeconds: number) {\r\n super.update(frameId, elapsedInSeconds, deltaInSeconds);\r\n this.updateSkeletonState();\r\n this.updateMorphState();\r\n if (this._postUpdateCallbacks.size > 0) {\r\n for (const callback of this._postUpdateCallbacks) {\r\n callback(frameId, elapsedInSeconds, deltaInSeconds);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n addPostUpdateCallback(callback: MeshUpdateCallback) {\r\n if (callback) {\r\n this._postUpdateCallbacks.add(callback);\r\n }\r\n }\r\n /** @internal */\r\n removePostUpdateCallback(callback: MeshUpdateCallback) {\r\n if (callback) {\r\n this._postUpdateCallbacks.delete(callback);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isBatchable}\r\n */\r\n isBatchable(): this is BatchDrawable {\r\n return (\r\n this._batchable &&\r\n !this._boneMatrices.get() &&\r\n !this._morphData &&\r\n (this._material.get()?.isBatchable() ?? false)\r\n );\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this.material?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth() ?? false;\r\n }\r\n /** @internal */\r\n private calculateMorphBoundingBox(): Nullable<BoundingBox> {\r\n if (!this._morphInfo || !this._morphBoundingInfo) {\r\n return null;\r\n }\r\n const numTargets = Math.min(this._morphInfo.data[3], this._morphBoundingInfo.targetBoxes.length);\r\n if (numTargets <= 0) {\r\n return null;\r\n }\r\n const weights =\r\n this._morphInfo.data instanceof Float32Array\r\n ? this._morphInfo.data.subarray(4, 4 + numTargets)\r\n : new Float32Array(Array.from(this._morphInfo.data.subarray(4, 4 + numTargets)));\r\n const bbox = new BoundingBox();\r\n calculateMorphBoundingBox(bbox, this._morphBoundingInfo.targetBoxes, weights, numTargets);\r\n bbox.minPoint.addBy(this._morphBoundingInfo.originBox.minPoint);\r\n bbox.maxPoint.addBy(this._morphBoundingInfo.originBox.maxPoint);\r\n return bbox;\r\n }\r\n /** @internal */\r\n private refreshAnimatedBoundingBox() {\r\n this.setAnimatedBoundingBox(this.resolveAnimatedBoundingBox(this.calculateMorphBoundingBox()));\r\n }\r\n /** @internal */\r\n private updateMorphState() {\r\n if (this._morphInfo && this._morphDirty) {\r\n this._morphInfo.buffer!.get()!.bufferSubData(4 * 4, this._morphInfo.data, 4, this._morphInfo.data[3]);\r\n this.refreshAnimatedBoundingBox();\r\n this._morphDirty = false;\r\n }\r\n }\r\n /** @internal */\r\n private updateSkeletonState() {\r\n if (this._suspendSkinning) {\r\n this.setBoneMatrices(null);\r\n this.setAnimatedBoundingBox(null);\r\n return;\r\n }\r\n const binding = this._skinBindingName && this.findSkinBindingById(this._skinBindingName);\r\n if (binding) {\r\n this.setBoneMatrices(binding.jointTexture);\r\n binding.computeBoundingBox(this._skinnedBoundingInfo!, this.invWorldMatrix);\r\n this.refreshAnimatedBoundingBox();\r\n } else {\r\n this.setBoneMatrices(null);\r\n this.refreshAnimatedBoundingBox();\r\n }\r\n if (this._skinBindingName) {\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>, hash?: string) {\r\n const material = this.material;\r\n const primitive = this.primitive;\r\n if (material && primitive) {\r\n if (this._useRenderBundle && !ctx.instanceData && hash) {\r\n if (\r\n this._primitiveChangeTag !== primitive.changeTag ||\r\n this._materialChangeTag !== material.changeTag\r\n ) {\r\n this._renderBundle = {};\r\n this._primitiveChangeTag = primitive.changeTag;\r\n this._materialChangeTag = material.changeTag;\r\n }\r\n const renderBundle = this._renderBundle![hash];\r\n if (!renderBundle) {\r\n ctx.device.beginCapture();\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n this._renderBundle![hash] = ctx.device.endCapture();\r\n } else {\r\n ctx.device.executeRenderBundle(renderBundle);\r\n }\r\n } else {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this.material;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return this.primitive;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getBoneMatrices}\r\n */\r\n getBoneMatrices() {\r\n return this._boneMatrices.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getNode}\r\n */\r\n getNode() {\r\n // mesh transform should be ignored when skinned\r\n return this;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n let bbox: Nullable<BoundingVolume>;\r\n if (this._animatedBoundingBox) {\r\n bbox = this._animatedBoundingBox;\r\n } else {\r\n bbox = this._primitive.get()?.getBoundingVolume() ?? null;\r\n }\r\n return bbox;\r\n }\r\n /** Disposes the mesh node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._primitive.get()?.off('bv_changed', this._onBoundingboxChange, this);\r\n this._primitive.dispose();\r\n this._material.dispose();\r\n this._boneMatrices.dispose();\r\n this.setMorphData(null);\r\n this.setMorphInfo(null);\r\n this.setMorphBoundingInfo(null);\r\n this._renderBundle = null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n /** @internal */\r\n private _onBoundingboxChange() {\r\n this.invalidateBoundingVolume();\r\n }\r\n /** @internal */\r\n private static _defaultMaterial: Nullable<MeshMaterial> = null;\r\n /** @internal */\r\n private static _getDefaultMaterial() {\r\n if (!this._defaultMaterial) {\r\n this._defaultMaterial = new LambertMaterial();\r\n }\r\n return this._defaultMaterial;\r\n }\r\n}\r\n"],"names":["MeshBase","castObservable","applyMixins","GraphNode","mixinDrawable","Mesh","scene","primitive","material","_primitive","DRef","_material","_castShadow","_skinnedBoundingInfo","_animatedBoundingBox","_boneMatrices","_morphData","_morphInfo","_morphBoundingInfo","_morphDirty","_instanceHash","_pickTarget","node","_batchable","getDevice","type","_getDefaultMaterial","_suspendSkinning","_skinBindingName","_renderBundle","_useRenderBundle","_materialChangeTag","_primitiveChangeTag","_postUpdateCallbacks","Set","getInstanceId","_renderPass","worldMatrixDet","getInstanceUniforms","get","$instanceUniforms","getPickTarget","setPickTarget","label","useRenderBundle","val","skeletonName","name","skinBindingName","updateSkeletonState","skinnedBoundingInfo","suspendSkinning","castShadow","b","prim","currentPrimitive","off","_onBoundingboxChange","set","on","_scene","id","instanceId","invalidateBoundingVolume","RenderBundleWrapper","drawableChanged","dispatchEvent","m","materialAttached","coreMaterial","isMesh","setAnimatedBoundingBox","bbox","getAnimatedBoundingBox","setMorphBoundingInfo","info","targetBoxes","map","box","clone","originBox","refreshAnimatedBoundingBox","getMorphBoundingInfo","setBoneMatrices","matrices","setMorphData","data","texture","dispose","width","height","slice","tex","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","mipFilter","update","setSkinnedBoundingInfo","getMorphData","setMorphInfo","buffer","names","bufferType","PBStructTypeInfo","ShaderHelper","getMorphInfoUniformName","PBArrayTypeInfo","PBPrimitiveTypeInfo","PBPrimitiveType","F32VEC4","MORPH_WEIGHTS_VECTOR_COUNT","MORPH_ATTRIBUTE_VECTOR_COUNT","morphUniformBuffer","createStructuredBuffer","usage","getMorphInfo","resolveAnimatedBoundingBox","morphBoundingBox","skinnedBoundingBox","boundingBox","isValid","union","getNumMorphTargets","getMorphTargetName","index","Object","keys","find","key","getMorphTargetIndexByName","setMorphWeight","weight","setMorphWeightByIndex","queueUpdateNode","console","warn","getMorphWeight","undefined","updateMorphWeights","length","frameId","elapsedInSeconds","deltaInSeconds","updateMorphState","size","callback","addPostUpdateCallback","add","removePostUpdateCallback","delete","isBatchable","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","numTargets","Math","min","weights","Float32Array","subarray","Array","from","BoundingBox","calculateMorphBoundingBox","minPoint","addBy","maxPoint","bufferSubData","binding","findSkinBindingById","jointTexture","computeBoundingBox","invWorldMatrix","draw","ctx","renderQueue","hash","instanceData","changeTag","renderBundle","device","beginCapture","bind","endCapture","executeRenderBundle","getMaterial","getPrimitive","getBoneMatrices","getNode","computeBoundingVolume","getBoundingVolume","onDispose","_defaultMaterial","LambertMaterial"],"mappings":"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"}
1
+ {"version":3,"file":"mesh.js","sources":["../../src/scene/mesh.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { applyMixins, castObservable, DRef } from '@zephyr3d/base';\r\nimport { GraphNode } from './graph_node';\r\nimport type { MeshMaterial } from '../material';\r\nimport { LambertMaterial, ShaderHelper } from '../material';\r\nimport type {\r\n RenderPass,\r\n Primitive,\r\n BatchDrawable,\r\n DrawContext,\r\n PickTarget,\r\n MorphData,\r\n MorphInfo,\r\n SkinInfluenceData,\r\n RenderQueue\r\n} from '../render';\r\nimport {\r\n PBArrayTypeInfo,\r\n PBPrimitiveType,\r\n PBPrimitiveTypeInfo,\r\n PBStructTypeInfo,\r\n type RenderBundle,\r\n type Texture2D\r\n} from '@zephyr3d/device';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox, type BoundingVolume } from '../utility/bounding_volume';\r\nimport {\r\n getActiveMorphTargetLimit,\r\n getMorphTargetLimit,\r\n MORPH_ATTRIBUTE_VECTOR_COUNT,\r\n MORPH_WEIGHTS_VECTOR_COUNT,\r\n QUEUE_OPAQUE\r\n} from '../values';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport { RenderBundleWrapper } from '../render/renderbundle_wrapper';\r\nimport type { SceneNode } from './scene_node';\r\nimport { getDevice } from '../app/api';\r\nimport type { SkinnedBoundingBox } from '../animation';\r\nimport { calculateMorphBoundingBox } from '../animation/morphtarget';\r\n\r\n/**\r\n * Callback invoked after a mesh finishes its per-frame update.\r\n *\r\n * @public\r\n */\r\nexport type MeshUpdateCallback = (frameId: number, elapsedInSeconds: number, deltaInSeconds: number) => void;\r\n\r\n/**\r\n * Bounding data used to update a mesh's local bounding box after morph target weights change.\r\n *\r\n * @public\r\n */\r\nexport interface MorphBoundingInfo {\r\n targetBoxes: BoundingBox[];\r\n originBox: BoundingBox;\r\n}\r\n\r\n/**\r\n * External source descriptor used to rebuild morph target data on demand.\r\n *\r\n * @public\r\n */\r\nexport interface MorphSourceDescriptor {\r\n sourcePath: string;\r\n nodePath: string;\r\n subMeshName: string;\r\n}\r\n\r\n/**\r\n * CPU-side morph target source data used to rebuild GPU morph textures on demand.\r\n *\r\n * @public\r\n */\r\nexport interface MorphTargetSourceData {\r\n numTargets: number;\r\n numVertices: number;\r\n targets: Partial<Record<number, { numComponents: number; data: Float32Array[]; indices?: Uint32Array[] }>>;\r\n}\r\n\r\nconst MORPH_WEIGHT_CAPACITY = MORPH_WEIGHTS_VECTOR_COUNT * 4;\r\nconst MORPH_ATTRIBUTE_CAPACITY = MORPH_ATTRIBUTE_VECTOR_COUNT * 4;\r\nconst MORPH_INFO_DATA_LENGTH = 4 + MORPH_WEIGHT_CAPACITY + MORPH_ATTRIBUTE_CAPACITY;\r\nconst MORPH_RENDER_INDEX_OFFSET = 4 + MORPH_WEIGHT_CAPACITY;\r\nconst MORPH_RENDER_ATTRIBUTE_OFFSET = MORPH_RENDER_INDEX_OFFSET + MORPH_WEIGHT_CAPACITY;\r\nconst MORPH_RENDER_INFO_DATA_LENGTH = MORPH_RENDER_ATTRIBUTE_OFFSET + MORPH_ATTRIBUTE_CAPACITY;\r\nconst ACTIVE_MORPH_WEIGHT_EPSILON = 1e-5;\r\n\r\nfunction normalizeMorphInfoData(data: MorphInfo['data']) {\r\n const normalized = new Float32Array(MORPH_INFO_DATA_LENGTH);\r\n for (let i = 0; i < MORPH_ATTRIBUTE_CAPACITY; i++) {\r\n normalized[4 + MORPH_WEIGHT_CAPACITY + i] = -1;\r\n }\r\n normalized.set(data.subarray(0, Math.min(data.length, normalized.length)));\r\n const declaredCount = Math.max(0, Math.floor(Number(normalized[3]) || 0));\r\n const supportedCount = Math.min(\r\n declaredCount,\r\n getMorphTargetLimit(),\r\n MORPH_WEIGHT_CAPACITY,\r\n Math.max(0, data.length - 4)\r\n );\r\n normalized[3] = supportedCount;\r\n return {\r\n data: normalized,\r\n declaredCount,\r\n supportedCount\r\n };\r\n}\r\n\r\nfunction createMorphInfoBuffer(data: Float32Array) {\r\n const bufferData = new Float32Array(data);\r\n const bufferType = new PBStructTypeInfo('dummy', 'std140', [\r\n {\r\n name: ShaderHelper.getMorphInfoUniformName(),\r\n type: new PBArrayTypeInfo(\r\n new PBPrimitiveTypeInfo(PBPrimitiveType.F32VEC4),\r\n 1 + MORPH_WEIGHTS_VECTOR_COUNT * 2 + MORPH_ATTRIBUTE_VECTOR_COUNT\r\n )\r\n }\r\n ]);\r\n return getDevice().createStructuredBuffer(\r\n bufferType,\r\n {\r\n usage: 'uniform'\r\n },\r\n bufferData\r\n );\r\n}\r\n\r\nconst MeshBase = castObservable(applyMixins(GraphNode, mixinDrawable))<{\r\n primitive_changed: [primitive: Nullable<Primitive>];\r\n material_changed: [material: Nullable<MeshMaterial>];\r\n}>();\r\n\r\n/**\r\n * Mesh node\r\n * @public\r\n */\r\nexport class Mesh extends MeshBase implements BatchDrawable {\r\n /** @internal */\r\n private readonly _primitive: DRef<Primitive>;\r\n /** @internal */\r\n private readonly _material: DRef<MeshMaterial>;\r\n /** @internal */\r\n protected _castShadow: boolean;\r\n /** @internal */\r\n protected _skinnedBoundingInfo: Nullable<SkinnedBoundingBox>;\r\n /** @internal */\r\n protected _animatedBoundingBox: Nullable<BoundingBox>;\r\n /** @internal */\r\n protected _skinBindingName: string;\r\n /** @internal */\r\n protected _boneMatrices: DRef<Texture2D>;\r\n /** @internal */\r\n protected _skinInfluenceData: Nullable<SkinInfluenceData>;\r\n /** @internal */\r\n protected _morphData: Nullable<MorphData>;\r\n /** @internal */\r\n protected _morphInfo: Nullable<MorphInfo>;\r\n /** @internal */\r\n protected _renderMorphInfo: Nullable<MorphInfo>;\r\n /** @internal */\r\n protected _morphBoundingInfo: Nullable<MorphBoundingInfo>;\r\n /** @internal */\r\n protected _morphSource: Nullable<MorphSourceDescriptor>;\r\n /** @internal */\r\n protected _morphSourceData: Nullable<MorphTargetSourceData>;\r\n /** @internal */\r\n protected _activeMorphTargetIndices: Uint32Array<ArrayBuffer>;\r\n /** @internal */\r\n protected _compactMorphData: boolean;\r\n /** @internal */\r\n protected _activeMorphCandidates: { index: number; weight: number }[];\r\n /** @internal */\r\n protected _morphDirty: boolean;\r\n /** @internal */\r\n protected _instanceHash: Nullable<string>;\r\n /** @internal */\r\n protected _batchable: boolean;\r\n /** @internal */\r\n protected _pickTarget: PickTarget;\r\n /** @internal */\r\n protected _suspendSkinning: boolean;\r\n /** @internal */\r\n protected _renderBundle: Nullable<Record<string, RenderBundle>>;\r\n /** @internal */\r\n protected _useRenderBundle: boolean;\r\n /** @internal */\r\n protected _materialChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _primitiveChangeTag: Nullable<number>;\r\n /** @internal */\r\n protected _postUpdateCallbacks: Set<MeshUpdateCallback>;\r\n /**\r\n * Creates an instance of mesh node\r\n * @param scene - The scene to which the mesh node belongs\r\n */\r\n constructor(scene: Scene, primitive?: Primitive, material?: MeshMaterial) {\r\n super(scene);\r\n this._primitive = new DRef();\r\n this._material = new DRef();\r\n this._castShadow = true;\r\n this._skinnedBoundingInfo = null;\r\n this._animatedBoundingBox = null;\r\n this._boneMatrices = new DRef();\r\n this._skinInfluenceData = null;\r\n this._morphData = null;\r\n this._morphInfo = null;\r\n this._renderMorphInfo = null;\r\n this._morphBoundingInfo = null;\r\n this._morphSource = null;\r\n this._morphSourceData = null;\r\n this._activeMorphTargetIndices = new Uint32Array(0);\r\n this._compactMorphData = false;\r\n this._activeMorphCandidates = [];\r\n this._morphDirty = false;\r\n this._instanceHash = null;\r\n this._pickTarget = { node: this };\r\n this._batchable = getDevice().type !== 'webgl';\r\n this.primitive = primitive ?? null;\r\n this.material = material ?? Mesh._getDefaultMaterial();\r\n this._suspendSkinning = false;\r\n this._skinBindingName = '';\r\n this._renderBundle = {};\r\n this._useRenderBundle = true;\r\n this._materialChangeTag = null;\r\n this._primitiveChangeTag = null;\r\n this._postUpdateCallbacks = new Set();\r\n }\r\n /**\r\n * Returns the batch instance ID for the current render pass.\r\n */\r\n getInstanceId(_renderPass: RenderPass) {\r\n return `${this._instanceHash}:${this.worldMatrixDet >= 0}`;\r\n }\r\n /**\r\n * Returns the packed instance-uniform buffer used for batching.\r\n */\r\n getInstanceUniforms() {\r\n return this._material.get()!.$instanceUniforms;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPickTarget }\r\n */\r\n getPickTarget() {\r\n return this._pickTarget;\r\n }\r\n setPickTarget(node: SceneNode, label?: string) {\r\n this._pickTarget = { node, label };\r\n }\r\n get useRenderBundle() {\r\n return this._useRenderBundle;\r\n }\r\n set useRenderBundle(val) {\r\n this._useRenderBundle = val;\r\n }\r\n get skeletonName() {\r\n return this._skinBindingName;\r\n }\r\n set skeletonName(name) {\r\n this.skinBindingName = name;\r\n }\r\n get skinBindingName() {\r\n return this._skinBindingName;\r\n }\r\n set skinBindingName(name) {\r\n if (name !== this._skinBindingName) {\r\n this._skinBindingName = name;\r\n this.updateSkeletonState();\r\n }\r\n }\r\n /** @internal */\r\n get skinnedBoundingInfo() {\r\n return this._skinnedBoundingInfo;\r\n }\r\n /** @internal */\r\n get suspendSkinning() {\r\n return this._suspendSkinning;\r\n }\r\n /** @internal */\r\n set suspendSkinning(val) {\r\n this._suspendSkinning = !!val;\r\n }\r\n /** Wether the mesh node casts shadows */\r\n get castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(b) {\r\n this._castShadow = b;\r\n }\r\n /** Primitive of the mesh */\r\n get primitive() {\r\n return this._primitive?.get() ?? null;\r\n }\r\n set primitive(prim) {\r\n const currentPrimitive = this._primitive.get();\r\n if (prim !== currentPrimitive) {\r\n if (currentPrimitive) {\r\n currentPrimitive.off('bv_changed', this._onBoundingboxChange, this);\r\n }\r\n this._primitive.set(prim);\r\n if (prim) {\r\n prim.on('bv_changed', this._onBoundingboxChange, this);\r\n }\r\n this._instanceHash =\r\n prim && this._material.get()\r\n ? `${this.constructor.name}:${this._scene!.id}:${prim.id}:${this._material.get()!.instanceId}`\r\n : null;\r\n this.invalidateBoundingVolume();\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._primitiveChangeTag = null;\r\n if (this._morphData) {\r\n this._ensureWebGLVertexIndexAttribute('morphing');\r\n }\r\n if (this._skinInfluenceData && this._skinInfluenceData.influenceCount > 4) {\r\n this._ensureWebGLVertexIndexAttribute('skinning');\r\n }\r\n this.dispatchEvent('primitive_changed', prim);\r\n }\r\n }\r\n /** Material of the mesh */\r\n get material() {\r\n return this._material?.get() ?? null;\r\n }\r\n set material(m) {\r\n if (this._material.get() !== m) {\r\n this._material.set(m);\r\n if (m) {\r\n RenderBundleWrapper.materialAttached(m.coreMaterial, this);\r\n }\r\n this._instanceHash =\r\n this._primitive.get() && m\r\n ? `${this.constructor.name}:${this._scene?.id ?? 0}:${this._primitive.get()!.id}:${m.instanceId}`\r\n : null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n this._materialChangeTag = null;\r\n this.dispatchEvent('material_changed', m);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc SceneNode.isMesh}\r\n */\r\n isMesh(): this is Mesh {\r\n return true;\r\n }\r\n /**\r\n * Sets the bounding box for animation\r\n * @param bbox - The bounding box for animation\r\n */\r\n setAnimatedBoundingBox(bbox: Nullable<BoundingBox>) {\r\n this._animatedBoundingBox = bbox;\r\n this.invalidateBoundingVolume();\r\n }\r\n /**\r\n * Gets the bounding box for animation\r\n */\r\n getAnimatedBoundingBox() {\r\n return this._animatedBoundingBox ?? null;\r\n }\r\n /**\r\n * Sets morph target bounding data used to update the animated bounding box when weights change.\r\n * @param info - Morph target bounding data\r\n */\r\n setMorphBoundingInfo(info: Nullable<MorphBoundingInfo>) {\r\n this._morphBoundingInfo = info\r\n ? {\r\n targetBoxes: info.targetBoxes.map((box) => box.clone()),\r\n originBox: info.originBox.clone()\r\n }\r\n : null;\r\n this.refreshAnimatedBoundingBox();\r\n }\r\n /**\r\n * Gets morph target bounding data.\r\n */\r\n getMorphBoundingInfo() {\r\n return this._morphBoundingInfo;\r\n }\r\n /**\r\n * Sets the texture that contains the bone matrices for skeletal animation\r\n * @param matrices - The texture that contains the bone matrices\r\n */\r\n setBoneMatrices(matrices: Nullable<Texture2D>) {\r\n if (this._boneMatrices.get() !== matrices) {\r\n this._boneMatrices.set(matrices);\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * Sets additional per-vertex skinning influences packed in a texture.\r\n * The first 4 influences remain in the vertex attributes; this payload stores the remainder.\r\n * @param data - Extra influence texture payload, or null to clear it\r\n */\r\n setSkinInfluenceData(data: Nullable<SkinInfluenceData>) {\r\n if (!data) {\r\n if (this._skinInfluenceData) {\r\n this._skinInfluenceData.texture?.get()?.dispose();\r\n this._skinInfluenceData = null;\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n return;\r\n }\r\n if (!this._skinInfluenceData) {\r\n this._skinInfluenceData = {\r\n texture: new DRef(),\r\n width: 0,\r\n height: 0,\r\n influenceCount: 4,\r\n data: new Float32Array(0)\r\n };\r\n }\r\n this._skinInfluenceData.width = data.width;\r\n this._skinInfluenceData.height = data.height;\r\n this._skinInfluenceData.influenceCount = data.influenceCount;\r\n this._skinInfluenceData.data = data.data.slice();\r\n if (data.texture?.get()) {\r\n this._skinInfluenceData.texture!.set(data.texture.get());\r\n } else {\r\n let tex = this._skinInfluenceData.texture?.get() ?? null;\r\n if (!tex || tex.width !== data.width || tex.height !== data.height) {\r\n tex?.dispose();\r\n tex = getDevice().createTexture2D('rgba32f', data.width, data.height, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n minFilter: 'nearest',\r\n magFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n this._skinInfluenceData.texture!.set(tex);\r\n }\r\n tex.update(data.data, 0, 0, data.width, data.height);\r\n }\r\n this._ensureWebGLVertexIndexAttribute('skinning');\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n /**\r\n * Sets the texture that contains the morph target data\r\n * @param data - The texture that contains the morph target data\r\n */\r\n setMorphData(data: Nullable<MorphData>) {\r\n if (!data) {\r\n if (this._morphData) {\r\n this._morphData.texture?.get()?.dispose();\r\n this._morphData = null;\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n } else {\r\n if (!this._morphData) {\r\n this._morphData = {\r\n texture: new DRef()\r\n } as MorphData;\r\n }\r\n this._morphData.width = data.width;\r\n this._morphData.height = data.height;\r\n this._morphData.data = data.data.slice();\r\n if (data.texture?.get()) {\r\n this._morphData.texture!.set(data.texture.get());\r\n } else {\r\n let tex = this._morphData.texture?.get() ?? null;\r\n if (!tex || tex.width !== data.width || tex.height !== data.height) {\r\n tex?.dispose();\r\n tex = getDevice().createTexture2D('rgba32f', data.width, data.height, {\r\n mipmapping: false,\r\n samplerOptions: {\r\n minFilter: 'nearest',\r\n magFilter: 'nearest',\r\n mipFilter: 'none'\r\n }\r\n })!;\r\n this._morphData.texture!.set(tex);\r\n }\r\n tex.update(data.data, 0, 0, data.width, data.height);\r\n }\r\n this._ensureWebGLVertexIndexAttribute('morphing');\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n if (this._morphInfo && !this._morphSourceData) {\r\n this.updateRenderMorphInfo(this.collectActiveMorphTargetIndices(), false);\r\n }\r\n }\r\n }\r\n /**\r\n * Sets the skinned bounding info\r\n * @param info - The skinned bounding info\r\n */\r\n setSkinnedBoundingInfo(info: Nullable<SkinnedBoundingBox>) {\r\n this._skinnedBoundingInfo = info;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphData}\r\n */\r\n getMorphData() {\r\n return this._morphData;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getSkinInfluenceData}\r\n */\r\n getSkinInfluenceData() {\r\n return this._skinInfluenceData;\r\n }\r\n /**\r\n * Gets the external morph source descriptor.\r\n */\r\n getMorphSource() {\r\n return this._morphSource;\r\n }\r\n /**\r\n * Sets the external morph source descriptor.\r\n * @param source - The morph source descriptor\r\n */\r\n setMorphSource(source: Nullable<MorphSourceDescriptor>) {\r\n this._morphSource = source ? { ...source } : null;\r\n }\r\n /**\r\n * Gets the CPU-side morph source data.\r\n */\r\n getMorphSourceData() {\r\n return this._morphSourceData;\r\n }\r\n /**\r\n * Sets the CPU-side morph source data used to rebuild GPU morph textures on demand.\r\n */\r\n setMorphSourceData(data: Nullable<MorphTargetSourceData>) {\r\n this._morphSourceData = data ?? null;\r\n this._activeMorphTargetIndices = new Uint32Array(0);\r\n this._compactMorphData = false;\r\n this._morphDirty = true;\r\n if (!data) {\r\n this.setMorphData(null);\r\n this.setRenderMorphInfo(null);\r\n } else if (this._morphInfo) {\r\n this.setMorphData(null);\r\n this.setRenderMorphInfo(null);\r\n this.rebuildActiveMorphData();\r\n this._morphDirty = false;\r\n }\r\n }\r\n /**\r\n * Sets the buffer that contains the morph target information\r\n * @param info - The buffer that contains the morph target information\r\n */\r\n setMorphInfo(info: Nullable<MorphInfo>) {\r\n if (!info) {\r\n if (this._morphInfo) {\r\n this._morphInfo = null;\r\n }\r\n this.setMorphData(null);\r\n this.setRenderMorphInfo(null);\r\n this._activeMorphTargetIndices = new Uint32Array(0);\r\n this._compactMorphData = false;\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n } else {\r\n if (!this._morphInfo) {\r\n this._morphInfo = {} as MorphInfo;\r\n }\r\n const { data, declaredCount, supportedCount } = normalizeMorphInfoData(info.data);\r\n if (declaredCount !== supportedCount) {\r\n console.warn(\r\n `Morph target count truncated from ${declaredCount} to ${supportedCount} to fit the runtime buffer layout`\r\n );\r\n }\r\n const names: Record<string, number> = {};\r\n for (const [name, index] of Object.entries(info.names ?? {})) {\r\n if (Number.isInteger(index) && index >= 0 && index < supportedCount) {\r\n names[name] = index;\r\n }\r\n }\r\n this._morphInfo.data = data;\r\n this._morphInfo.names = names;\r\n this._morphDirty = true;\r\n if (this._morphSourceData) {\r\n this.setMorphData(null);\r\n this.setRenderMorphInfo(null);\r\n this.rebuildActiveMorphData();\r\n this._morphDirty = false;\r\n } else if (this._morphData) {\r\n this.setRenderMorphInfo(null);\r\n this.updateRenderMorphInfo(this.collectActiveMorphTargetIndices(), false);\r\n this._morphDirty = false;\r\n }\r\n this.refreshAnimatedBoundingBox();\r\n this._renderBundle = {};\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMorphInfo}\r\n */\r\n getMorphInfo() {\r\n return this._morphInfo;\r\n }\r\n /** @internal */\r\n getRenderMorphInfo() {\r\n return this._renderMorphInfo;\r\n }\r\n /** @internal */\r\n private setRenderMorphInfo(info: Nullable<MorphInfo>) {\r\n if (!info) {\r\n if (this._renderMorphInfo) {\r\n this._renderMorphInfo.buffer?.dispose();\r\n this._renderMorphInfo = null;\r\n }\r\n return;\r\n }\r\n if (!this._renderMorphInfo) {\r\n this._renderMorphInfo = {\r\n buffer: new DRef()\r\n } as MorphInfo;\r\n }\r\n this._renderMorphInfo.data = info.data;\r\n this._renderMorphInfo.names = info.names;\r\n if (!this._renderMorphInfo.buffer?.get()) {\r\n this._renderMorphInfo.buffer!.set(createMorphInfoBuffer(info.data as Float32Array));\r\n } else {\r\n this._renderMorphInfo.buffer!.get()!.bufferSubData(0, info.data);\r\n }\r\n }\r\n /** @internal */\r\n private collectActiveMorphTargetIndices(): Uint32Array<ArrayBuffer> {\r\n if (!this._morphInfo) {\r\n return new Uint32Array(0);\r\n }\r\n const count = this.getNumMorphTargets();\r\n const activeLimit = Math.min(getActiveMorphTargetLimit(), count);\r\n if (activeLimit <= 0) {\r\n return new Uint32Array(0);\r\n }\r\n const weighted = this._activeMorphCandidates;\r\n let weightedCount = 0;\r\n for (let i = 0; i < count; i++) {\r\n const weight = this._morphInfo.data[4 + i];\r\n if (Math.abs(weight) > ACTIVE_MORPH_WEIGHT_EPSILON) {\r\n const candidate = weighted[weightedCount] ?? { index: i, weight: 0 };\r\n candidate.index = i;\r\n candidate.weight = Math.abs(weight);\r\n weighted[weightedCount] = candidate;\r\n weightedCount++;\r\n }\r\n }\r\n weighted.length = weightedCount;\r\n let selectedCount = weightedCount;\r\n if (weightedCount > activeLimit) {\r\n weighted.sort((a, b) => b.weight - a.weight);\r\n selectedCount = activeLimit;\r\n }\r\n for (let i = 1; i < selectedCount; i++) {\r\n const candidate = weighted[i];\r\n let targetIndex = i;\r\n while (targetIndex > 0 && weighted[targetIndex - 1].index > candidate.index) {\r\n weighted[targetIndex] = weighted[targetIndex - 1];\r\n targetIndex--;\r\n }\r\n weighted[targetIndex] = candidate;\r\n }\r\n const activeIndices = new Uint32Array(selectedCount);\r\n for (let i = 0; i < selectedCount; i++) {\r\n activeIndices[i] = weighted[i].index;\r\n }\r\n return activeIndices;\r\n }\r\n /** @internal */\r\n private rebuildActiveMorphData() {\r\n if (!this._morphInfo || !this._morphSourceData) {\r\n this.setMorphData(null);\r\n this.setRenderMorphInfo(null);\r\n this._activeMorphTargetIndices = new Uint32Array(0);\r\n this._compactMorphData = false;\r\n return;\r\n }\r\n const activeIndices = this.collectActiveMorphTargetIndices();\r\n const sameActiveSet =\r\n this._activeMorphTargetIndices.length === activeIndices.length &&\r\n this._activeMorphTargetIndices.every((value, index) => value === activeIndices[index]);\r\n if (this._morphData && (!this._compactMorphData || sameActiveSet)) {\r\n this.updateRenderMorphInfo(activeIndices, this._compactMorphData);\r\n this._activeMorphTargetIndices = activeIndices;\r\n return;\r\n }\r\n const attributes = Object.keys(this._morphSourceData.targets)\r\n .map((key) => Number(key))\r\n .filter((value) => Number.isInteger(value) && value >= 0 && value < MORPH_ATTRIBUTE_CAPACITY)\r\n .sort((a, b) => a - b);\r\n const numVertices = this._morphSourceData.numVertices;\r\n const textureTargetCount = Math.min(this.getNumMorphTargets(), this._morphSourceData.numTargets);\r\n if (numVertices <= 0 || attributes.length === 0 || textureTargetCount <= 0) {\r\n this.setMorphData(null);\r\n this.setRenderMorphInfo(null);\r\n this._activeMorphTargetIndices = new Uint32Array(0);\r\n this._compactMorphData = false;\r\n return;\r\n }\r\n const maxTextureSize = getDevice().getDeviceCaps().textureCaps.maxTextureSize;\r\n const fullTextureSize = Math.ceil(Math.sqrt(numVertices * attributes.length * textureTargetCount));\r\n let textureTargetIndices: Uint32Array<ArrayBuffer>;\r\n if (fullTextureSize <= maxTextureSize) {\r\n textureTargetIndices = new Uint32Array(textureTargetCount);\r\n for (let i = 0; i < textureTargetCount; i++) {\r\n textureTargetIndices[i] = i;\r\n }\r\n this._compactMorphData = false;\r\n } else if (activeIndices.length > 0) {\r\n textureTargetIndices = activeIndices;\r\n this._compactMorphData = true;\r\n } else {\r\n this.setMorphData(null);\r\n this.setRenderMorphInfo(null);\r\n this._activeMorphTargetIndices = activeIndices;\r\n this._compactMorphData = true;\r\n return;\r\n }\r\n const textureSize = Math.ceil(Math.sqrt(numVertices * attributes.length * textureTargetIndices.length));\r\n if (textureSize > maxTextureSize) {\r\n console.warn(\r\n `Active morph target texture too large for mesh \"${this.name ?? ''}\": ${textureSize} exceeds device limit`\r\n );\r\n this.setMorphData(null);\r\n this.setRenderMorphInfo(null);\r\n this._activeMorphTargetIndices = new Uint32Array(0);\r\n return;\r\n }\r\n const textureData = new Float32Array(textureSize * textureSize * 4);\r\n const attributeOffsets = new Float32Array(MORPH_ATTRIBUTE_CAPACITY);\r\n for (let i = 0; i < MORPH_ATTRIBUTE_CAPACITY; i++) {\r\n attributeOffsets[i] = -1;\r\n }\r\n let offset = 0;\r\n for (const attrib of attributes) {\r\n const source = this._morphSourceData.targets[attrib];\r\n if (!source) {\r\n continue;\r\n }\r\n attributeOffsets[attrib] = offset >> 2;\r\n for (let slot = 0; slot < textureTargetIndices.length; slot++) {\r\n const targetIndex = textureTargetIndices[slot];\r\n const targetData = source.data[targetIndex];\r\n const sparseIndices = source.indices?.[targetIndex];\r\n const baseOffset = offset + slot * numVertices * 4;\r\n if (sparseIndices && targetData) {\r\n for (let i = 0; i < sparseIndices.length; i++) {\r\n const vertexOffset = baseOffset + sparseIndices[i] * 4;\r\n for (let j = 0; j < source.numComponents; j++) {\r\n textureData[vertexOffset + j] = targetData[i * source.numComponents + j];\r\n }\r\n }\r\n } else if (targetData) {\r\n for (let vertex = 0; vertex < numVertices; vertex++) {\r\n const vertexOffset = baseOffset + vertex * 4;\r\n for (let j = 0; j < source.numComponents; j++) {\r\n textureData[vertexOffset + j] = targetData[vertex * source.numComponents + j];\r\n }\r\n }\r\n }\r\n }\r\n offset += numVertices * 4 * textureTargetIndices.length;\r\n }\r\n this.setMorphData({ width: textureSize, height: textureSize, data: textureData });\r\n this.updateRenderMorphInfo(activeIndices, this._compactMorphData, attributeOffsets);\r\n this._activeMorphTargetIndices = activeIndices;\r\n }\r\n /** @internal */\r\n private updateRenderMorphInfo(\r\n activeIndices: Uint32Array<ArrayBuffer>,\r\n useCompactSlots: boolean,\r\n attributeOffsets?: Float32Array<ArrayBuffer>\r\n ) {\r\n if (!this._morphInfo || !this._morphData) {\r\n this.setRenderMorphInfo(null);\r\n return;\r\n }\r\n const infoData =\r\n this._renderMorphInfo?.data instanceof Float32Array &&\r\n this._renderMorphInfo.data.length === MORPH_RENDER_INFO_DATA_LENGTH\r\n ? this._renderMorphInfo.data\r\n : new Float32Array(MORPH_RENDER_INFO_DATA_LENGTH);\r\n infoData[0] = this._morphData.width;\r\n infoData[1] = this._morphData.height;\r\n infoData[2] = this._morphSourceData?.numVertices ?? (Number(this._morphInfo.data[2]) || 0);\r\n infoData[3] = activeIndices.length;\r\n infoData.fill(0, 4, MORPH_RENDER_ATTRIBUTE_OFFSET);\r\n for (let slot = 0; slot < activeIndices.length; slot++) {\r\n const targetIndex = activeIndices[slot];\r\n infoData[4 + slot] = this._morphInfo.data[4 + targetIndex];\r\n infoData[MORPH_RENDER_INDEX_OFFSET + slot] = useCompactSlots ? slot : targetIndex;\r\n }\r\n if (attributeOffsets) {\r\n infoData.fill(-1, MORPH_RENDER_ATTRIBUTE_OFFSET);\r\n infoData.set(attributeOffsets, MORPH_RENDER_ATTRIBUTE_OFFSET);\r\n } else if (!this._renderMorphInfo) {\r\n infoData.fill(-1, MORPH_RENDER_ATTRIBUTE_OFFSET);\r\n for (let attrib = 0; attrib < MORPH_ATTRIBUTE_CAPACITY; attrib++) {\r\n infoData[MORPH_RENDER_ATTRIBUTE_OFFSET + attrib] =\r\n this._morphInfo.data[4 + MORPH_WEIGHT_CAPACITY + attrib] ?? -1;\r\n }\r\n }\r\n this.setRenderMorphInfo({ data: infoData, names: this._renderMorphInfo?.names ?? {} });\r\n }\r\n /** @internal */\r\n resolveAnimatedBoundingBox(morphBoundingBox?: Nullable<BoundingBox>) {\r\n const skinnedBoundingBox =\r\n this._boneMatrices.get() && this._skinnedBoundingInfo?.boundingBox?.isValid()\r\n ? this._skinnedBoundingInfo.boundingBox\r\n : null;\r\n if (skinnedBoundingBox && morphBoundingBox) {\r\n // Skinning and morphing both active. The two boxes live in different\r\n // frames: the skinned box already reflects where the geometry actually\r\n // ended up, while the morph box is still expressed around the rest pose.\r\n // Unioning them therefore spans the gap between rest and posed positions\r\n // and produces a wildly oversized box - which is why that union was\r\n // removed. But dropping the morph side entirely loses the displacement,\r\n // since the skinned box is built from rest-pose representative vertices\r\n // (SkinBinding.computeBoundingBox) and never sees morph offsets - so a\r\n // large facial expression could reach outside its own bounds and be\r\n // culled.\r\n //\r\n // Transfer only what is frame-independent: the displacement. Clamped so\r\n // it can only grow the box, because a morph that pushes geometry one way\r\n // must not be allowed to shrink the opposite side.\r\n const box = skinnedBoundingBox.clone();\r\n const displacement = this.calculateMorphDisplacement();\r\n if (displacement) {\r\n const min = box.minPoint;\r\n const max = box.maxPoint;\r\n const dmin = displacement.minPoint;\r\n const dmax = displacement.maxPoint;\r\n min.setXYZ(min.x + Math.min(0, dmin.x), min.y + Math.min(0, dmin.y), min.z + Math.min(0, dmin.z));\r\n max.setXYZ(max.x + Math.max(0, dmax.x), max.y + Math.max(0, dmax.y), max.z + Math.max(0, dmax.z));\r\n }\r\n return box;\r\n }\r\n return skinnedBoundingBox?.clone() ?? morphBoundingBox ?? null;\r\n }\r\n /**\r\n * Get the number of morph targets\r\n *\r\n * @returns The number of morph targets\r\n */\r\n getNumMorphTargets(): number {\r\n return this._morphInfo ? Math.min(this._morphInfo.data[3], MORPH_WEIGHT_CAPACITY) : 0;\r\n }\r\n /**\r\n * Get the name of the morph target by index\r\n *\r\n * @param index - The index of the morph target\r\n * @returns The name of the morph target, or null if not found\r\n */\r\n getMorphTargetName(index: number): Nullable<string> {\r\n if (this._morphInfo && index >= 0 && index < this.getNumMorphTargets()) {\r\n const name = Object.keys(this._morphInfo.names).find((key) => this._morphInfo!.names![key] === index);\r\n return name ?? null;\r\n }\r\n return null;\r\n }\r\n /**\r\n * Get the index of the morph target by name\r\n * @param name - The name of the morph target\r\n * @returns The index of the morph target, or -1 if not found\r\n */\r\n getMorphTargetIndexByName(name: string): number {\r\n return this._morphInfo?.names?.[name] ?? -1;\r\n }\r\n /**\r\n * Update morph target weight\r\n *\r\n * @param name - The name of the morph target\r\n * @param weight - The weight of the morph target\r\n */\r\n setMorphWeight(name: string, weight: number) {\r\n const index = this.getMorphTargetIndexByName(name);\r\n if (index >= 0) {\r\n this.setMorphWeightByIndex(index, weight);\r\n }\r\n }\r\n /**\r\n * Update morph target weight by index\r\n *\r\n * @param index - The index of the morph target\r\n * @param weight - The weight of the morph target\r\n */\r\n setMorphWeightByIndex(index: number, weight: number) {\r\n if (index >= 0 && index < this.getNumMorphTargets()) {\r\n const normalizedWeight = Math.fround(weight);\r\n if (this._morphInfo!.data[4 + index] !== normalizedWeight) {\r\n this._morphInfo!.data[4 + index] = normalizedWeight;\r\n this._morphDirty = true;\r\n this.refreshAnimatedBoundingBox();\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n } else {\r\n console.warn(`Morph target index out of range: ${index}`);\r\n }\r\n }\r\n /**\r\n * Get morph target weight\r\n *\r\n * @param name - The name of the morph target\r\n * @returns The weight of the morph target, or 0 if not found\r\n */\r\n getMorphWeight(name: string): number {\r\n const index = this._morphInfo?.names?.[name];\r\n if (index !== undefined && index >= 0 && index < this.getNumMorphTargets()) {\r\n return this._morphInfo!.data[4 + index];\r\n }\r\n return 0;\r\n }\r\n /**\r\n * Update morph target weights\r\n *\r\n * @param weight - The morph target weights. The length must not exceed the mesh's morph target count.\r\n */\r\n updateMorphWeights(weight: ArrayLike<number>) {\r\n if (this._morphInfo && weight && weight.length <= this.getNumMorphTargets()) {\r\n let changed = false;\r\n for (let i = 0; i < weight.length; i++) {\r\n const normalizedWeight = Math.fround(weight[i] ?? 0);\r\n if (this._morphInfo.data[4 + i] !== normalizedWeight) {\r\n this._morphInfo.data[4 + i] = normalizedWeight;\r\n changed = true;\r\n }\r\n }\r\n if (!changed) {\r\n return;\r\n }\r\n this._morphDirty = true;\r\n this.refreshAnimatedBoundingBox();\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n /** {@inheritDoc SceneNode.update} */\r\n update(frameId: number, elapsedInSeconds: number, deltaInSeconds: number) {\r\n super.update(frameId, elapsedInSeconds, deltaInSeconds);\r\n this.updateSkeletonState();\r\n this.updateMorphState();\r\n if (this._postUpdateCallbacks.size > 0) {\r\n for (const callback of this._postUpdateCallbacks) {\r\n callback(frameId, elapsedInSeconds, deltaInSeconds);\r\n }\r\n }\r\n }\r\n /** @internal */\r\n addPostUpdateCallback(callback: MeshUpdateCallback) {\r\n if (callback) {\r\n this._postUpdateCallbacks.add(callback);\r\n }\r\n }\r\n /** @internal */\r\n removePostUpdateCallback(callback: MeshUpdateCallback) {\r\n if (callback) {\r\n this._postUpdateCallbacks.delete(callback);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isBatchable}\r\n */\r\n isBatchable(): this is BatchDrawable {\r\n return (\r\n this._batchable &&\r\n !this._boneMatrices.get() &&\r\n !this._morphData &&\r\n (this._material.get()?.isBatchable() ?? false)\r\n );\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getQueueType}\r\n */\r\n getQueueType() {\r\n return this.material?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.isUnlit}\r\n */\r\n isUnlit() {\r\n return !this.material?.supportLighting();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneColor}\r\n */\r\n needSceneColor() {\r\n return this.material?.needSceneColor() ?? false;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.needSceneDepth}\r\n */\r\n needSceneDepth() {\r\n return this.material?.needSceneDepth() ?? false;\r\n }\r\n /** @internal */\r\n /**\r\n * Weighted morph displacement, relative to the rest pose - i.e. how far the\r\n * active morph targets push geometry beyond `originBox`, not where that\r\n * geometry ends up.\r\n *\r\n * Kept separate from {@link calculateMorphBoundingBox} because the two are\r\n * useful in different frames of reference: the absolute box is meaningful for\r\n * an unskinned mesh, while for a skinned one only the displacement transfers -\r\n * the rest-space position is superseded by the skinning result.\r\n *\r\n * @internal\r\n */\r\n private calculateMorphDisplacement(): Nullable<BoundingBox> {\r\n if (!this._morphInfo || !this._morphBoundingInfo) {\r\n return null;\r\n }\r\n const numTargets = Math.min(this.getNumMorphTargets(), this._morphBoundingInfo.targetBoxes.length);\r\n if (numTargets <= 0) {\r\n return null;\r\n }\r\n const weights =\r\n this._morphInfo.data instanceof Float32Array\r\n ? this._morphInfo.data.subarray(4, 4 + numTargets)\r\n : new Float32Array(Array.from(this._morphInfo.data.subarray(4, 4 + numTargets)));\r\n const bbox = new BoundingBox();\r\n calculateMorphBoundingBox(bbox, this._morphBoundingInfo.targetBoxes, weights, numTargets);\r\n return bbox;\r\n }\r\n /** @internal */\r\n private calculateMorphBoundingBox(): Nullable<BoundingBox> {\r\n const bbox = this.calculateMorphDisplacement();\r\n if (!bbox) {\r\n return null;\r\n }\r\n bbox.minPoint.addBy(this._morphBoundingInfo!.originBox.minPoint);\r\n bbox.maxPoint.addBy(this._morphBoundingInfo!.originBox.maxPoint);\r\n return bbox;\r\n }\r\n /** @internal */\r\n private refreshAnimatedBoundingBox() {\r\n this.setAnimatedBoundingBox(this.resolveAnimatedBoundingBox(this.calculateMorphBoundingBox()));\r\n }\r\n /** @internal */\r\n private updateMorphState() {\r\n if (this._morphInfo && this._morphDirty) {\r\n if (this._morphSourceData) {\r\n this.rebuildActiveMorphData();\r\n } else if (this._morphData) {\r\n const activeIndices = this.collectActiveMorphTargetIndices();\r\n this.updateRenderMorphInfo(activeIndices, false);\r\n this._activeMorphTargetIndices = activeIndices;\r\n }\r\n this.refreshAnimatedBoundingBox();\r\n this._morphDirty = false;\r\n }\r\n }\r\n /** @internal */\r\n private updateSkeletonState() {\r\n if (this._suspendSkinning) {\r\n this.setBoneMatrices(null);\r\n this.setAnimatedBoundingBox(null);\r\n return;\r\n }\r\n const binding = this._skinBindingName && this.findSkinBindingById(this._skinBindingName);\r\n if (binding) {\r\n this.setBoneMatrices(binding.jointTexture);\r\n binding.computeBoundingBox(this._skinnedBoundingInfo!, this.invWorldMatrix);\r\n this.refreshAnimatedBoundingBox();\r\n } else {\r\n this.setBoneMatrices(null);\r\n this.refreshAnimatedBoundingBox();\r\n }\r\n if (this._skinBindingName) {\r\n this.scene!.queueUpdateNode(this);\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.draw}\r\n */\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>, hash?: string) {\r\n const material = this.material;\r\n const primitive = this.primitive;\r\n if (material && primitive) {\r\n if (this._useRenderBundle && !ctx.instanceData && hash) {\r\n if (\r\n this._primitiveChangeTag !== primitive.changeTag ||\r\n this._materialChangeTag !== material.changeTag\r\n ) {\r\n this._renderBundle = {};\r\n this._primitiveChangeTag = primitive.changeTag;\r\n this._materialChangeTag = material.changeTag;\r\n }\r\n const renderBundle = this._renderBundle![hash];\r\n if (!renderBundle) {\r\n ctx.device.beginCapture();\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n this._renderBundle![hash] = ctx.device.endCapture();\r\n } else {\r\n ctx.device.executeRenderBundle(renderBundle);\r\n }\r\n } else {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getMaterial}\r\n */\r\n getMaterial() {\r\n return this.material;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getPrimitive}\r\n */\r\n getPrimitive() {\r\n return this.primitive;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getBoneMatrices}\r\n */\r\n getBoneMatrices() {\r\n return this._boneMatrices.get();\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getNode}\r\n */\r\n getNode() {\r\n // mesh transform should be ignored when skinned\r\n return this;\r\n }\r\n /** @internal */\r\n computeBoundingVolume() {\r\n let bbox: Nullable<BoundingVolume>;\r\n if (this._animatedBoundingBox) {\r\n bbox = this._animatedBoundingBox;\r\n } else {\r\n bbox = this._primitive.get()?.getBoundingVolume() ?? null;\r\n }\r\n return bbox;\r\n }\r\n /** Disposes the mesh node */\r\n protected onDispose() {\r\n super.onDispose();\r\n this._primitive.get()?.off('bv_changed', this._onBoundingboxChange, this);\r\n this._primitive.dispose();\r\n this._material.dispose();\r\n this._boneMatrices.dispose();\r\n this.setSkinInfluenceData(null);\r\n this.setMorphData(null);\r\n this.setRenderMorphInfo(null);\r\n this.setMorphInfo(null);\r\n this.setMorphSourceData(null);\r\n this.setMorphBoundingInfo(null);\r\n this._renderBundle = null;\r\n RenderBundleWrapper.drawableChanged(this);\r\n }\r\n /** @internal */\r\n private _onBoundingboxChange() {\r\n this.invalidateBoundingVolume();\r\n }\r\n /** @internal */\r\n private _ensureWebGLVertexIndexAttribute(feature: 'morphing' | 'skinning') {\r\n const primitive = this._primitive.get();\r\n if (!primitive || getDevice().type !== 'webgl') {\r\n return;\r\n }\r\n if (primitive.getVertexBuffer('texCoord7')) {\r\n return;\r\n }\r\n const numVertices = primitive.getNumVertices();\r\n if (numVertices <= 0) {\r\n return;\r\n }\r\n const vertexIndices = new Float32Array(numVertices);\r\n for (let i = 0; i < numVertices; i++) {\r\n vertexIndices[i] = i;\r\n }\r\n primitive.createAndSetVertexBuffer('tex7_f32', vertexIndices);\r\n console.info(`Injected texCoord7 vertex indices for WebGL ${feature} on mesh \"${this.name ?? ''}\"`);\r\n }\r\n /** @internal */\r\n private static _defaultMaterial: Nullable<MeshMaterial> = null;\r\n /** @internal */\r\n private static _getDefaultMaterial() {\r\n if (!this._defaultMaterial) {\r\n this._defaultMaterial = new LambertMaterial();\r\n }\r\n return this._defaultMaterial;\r\n }\r\n}\r\n"],"names":["MORPH_WEIGHT_CAPACITY","MORPH_WEIGHTS_VECTOR_COUNT","MORPH_ATTRIBUTE_CAPACITY","MORPH_ATTRIBUTE_VECTOR_COUNT","MORPH_INFO_DATA_LENGTH","MORPH_RENDER_INDEX_OFFSET","MORPH_RENDER_ATTRIBUTE_OFFSET","MORPH_RENDER_INFO_DATA_LENGTH","ACTIVE_MORPH_WEIGHT_EPSILON","normalizeMorphInfoData","data","normalized","Float32Array","i","set","subarray","Math","min","length","declaredCount","max","floor","Number","supportedCount","getMorphTargetLimit","createMorphInfoBuffer","bufferData","bufferType","PBStructTypeInfo","name","ShaderHelper","getMorphInfoUniformName","type","PBArrayTypeInfo","PBPrimitiveTypeInfo","PBPrimitiveType","F32VEC4","getDevice","createStructuredBuffer","usage","MeshBase","castObservable","applyMixins","GraphNode","mixinDrawable","Mesh","scene","primitive","material","_primitive","DRef","_material","_castShadow","_skinnedBoundingInfo","_animatedBoundingBox","_boneMatrices","_skinInfluenceData","_morphData","_morphInfo","_renderMorphInfo","_morphBoundingInfo","_morphSource","_morphSourceData","_activeMorphTargetIndices","Uint32Array","_compactMorphData","_activeMorphCandidates","_morphDirty","_instanceHash","_pickTarget","node","_batchable","_getDefaultMaterial","_suspendSkinning","_skinBindingName","_renderBundle","_useRenderBundle","_materialChangeTag","_primitiveChangeTag","_postUpdateCallbacks","Set","getInstanceId","_renderPass","worldMatrixDet","getInstanceUniforms","get","$instanceUniforms","getPickTarget","setPickTarget","label","useRenderBundle","val","skeletonName","skinBindingName","updateSkeletonState","skinnedBoundingInfo","suspendSkinning","castShadow","b","prim","currentPrimitive","off","_onBoundingboxChange","on","_scene","id","instanceId","invalidateBoundingVolume","RenderBundleWrapper","drawableChanged","_ensureWebGLVertexIndexAttribute","influenceCount","dispatchEvent","m","materialAttached","coreMaterial","isMesh","setAnimatedBoundingBox","bbox","getAnimatedBoundingBox","setMorphBoundingInfo","info","targetBoxes","map","box","clone","originBox","refreshAnimatedBoundingBox","getMorphBoundingInfo","setBoneMatrices","matrices","setSkinInfluenceData","texture","dispose","width","height","slice","tex","createTexture2D","mipmapping","samplerOptions","minFilter","magFilter","mipFilter","update","setMorphData","updateRenderMorphInfo","collectActiveMorphTargetIndices","setSkinnedBoundingInfo","getMorphData","getSkinInfluenceData","getMorphSource","setMorphSource","source","getMorphSourceData","setMorphSourceData","setRenderMorphInfo","rebuildActiveMorphData","setMorphInfo","console","warn","names","index","Object","entries","isInteger","getMorphInfo","getRenderMorphInfo","buffer","bufferSubData","count","getNumMorphTargets","activeLimit","getActiveMorphTargetLimit","weighted","weightedCount","weight","abs","candidate","selectedCount","sort","a","targetIndex","activeIndices","sameActiveSet","every","value","attributes","keys","targets","key","filter","numVertices","textureTargetCount","numTargets","maxTextureSize","getDeviceCaps","textureCaps","fullTextureSize","ceil","sqrt","textureTargetIndices","textureSize","textureData","attributeOffsets","offset","attrib","slot","targetData","sparseIndices","indices","baseOffset","vertexOffset","j","numComponents","vertex","useCompactSlots","infoData","fill","resolveAnimatedBoundingBox","morphBoundingBox","skinnedBoundingBox","boundingBox","isValid","displacement","calculateMorphDisplacement","minPoint","maxPoint","dmin","dmax","setXYZ","x","y","z","getMorphTargetName","find","getMorphTargetIndexByName","setMorphWeight","setMorphWeightByIndex","normalizedWeight","fround","queueUpdateNode","getMorphWeight","undefined","updateMorphWeights","changed","frameId","elapsedInSeconds","deltaInSeconds","updateMorphState","size","callback","addPostUpdateCallback","add","removePostUpdateCallback","delete","isBatchable","getQueueType","QUEUE_OPAQUE","isUnlit","supportLighting","needSceneColor","needSceneDepth","weights","Array","from","BoundingBox","calculateMorphBoundingBox","addBy","binding","findSkinBindingById","jointTexture","computeBoundingBox","invWorldMatrix","draw","ctx","renderQueue","hash","instanceData","changeTag","renderBundle","device","beginCapture","bind","endCapture","executeRenderBundle","getMaterial","getPrimitive","getBoneMatrices","getNode","computeBoundingVolume","getBoundingVolume","onDispose","feature","getVertexBuffer","getNumVertices","vertexIndices","createAndSetVertexBuffer","_defaultMaterial","LambertMaterial"],"mappings":"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"}
@@ -35,6 +35,9 @@ class ProxyDrawableBase extends Disposable {
35
35
  getMorphInfo() {
36
36
  return this._host.get()?.getMorphInfo() ?? null;
37
37
  }
38
+ getSkinInfluenceData() {
39
+ return this._host.get()?.getSkinInfluenceData() ?? null;
40
+ }
38
41
  getSortDistance(camera) {
39
42
  return this._host.get()?.getSortDistance(camera) ?? 0;
40
43
  }
@@ -136,6 +139,9 @@ class MeshDrawable extends applyMixins(MeshDrawableBase, mixinDrawable) {
136
139
  getBoneMatrices() {
137
140
  return null;
138
141
  }
142
+ getSkinInfluenceData() {
143
+ return null;
144
+ }
139
145
  getMorphData() {
140
146
  return null;
141
147
  }
@@ -1 +1 @@
1
- {"version":3,"file":"meshdrawable.js","sources":["../../src/scene/meshdrawable.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DWeakRef } from '@zephyr3d/base';\r\nimport { applyMixins, Disposable, DRef } from '@zephyr3d/base';\r\nimport type { MeshMaterial } from '../material';\r\nimport type {\r\n BatchDrawable,\r\n Drawable,\r\n DrawContext,\r\n MorphData,\r\n MorphInfo,\r\n PickTarget,\r\n Primitive,\r\n RenderQueue\r\n} from '../render';\r\nimport type { Mesh, SceneNode } from '.';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport type { Texture2D } from '@zephyr3d/device';\r\nimport type { Camera } from '../camera';\r\nimport { QUEUE_OPAQUE } from '../values';\r\n\r\nexport class ProxyDrawableBase<T extends Disposable & Drawable = Mesh> extends Disposable {\r\n protected _host: DWeakRef<T>;\r\n protected _node: DWeakRef<SceneNode>;\r\n protected _material: DRef<MeshMaterial>;\r\n /**\r\n * Creates a proxy for a host drawable.\r\n *\r\n * @param host - Drawable that supplies the shared geometry, animation, and transform state.\r\n * @param overrideMaterial - Optional material used instead of the host drawable's material.\r\n */\r\n constructor(host: T, node?: SceneNode, overrideMaterial?: MeshMaterial) {\r\n super();\r\n this._host = new DWeakRef(host);\r\n this._node = new DWeakRef(node);\r\n this._material = new DRef(overrideMaterial);\r\n }\r\n getName(): string {\r\n return this._host.get()?.getName() ?? '';\r\n }\r\n getNode(): SceneNode {\r\n return this._node.get()!;\r\n }\r\n getPickTarget(): PickTarget {\r\n return this._host.get()!.getPickTarget();\r\n }\r\n getBoneMatrices(): Nullable<Texture2D> {\r\n return this._host.get()?.getBoneMatrices() ?? null;\r\n }\r\n getMorphData(): Nullable<MorphData> {\r\n return this._host.get()?.getMorphData() ?? null;\r\n }\r\n getMorphInfo(): Nullable<MorphInfo> {\r\n return this._host.get()?.getMorphInfo() ?? null;\r\n }\r\n getSortDistance(camera: Camera): number {\r\n return this._host.get()?.getSortDistance(camera) ?? 0;\r\n }\r\n getQueueType(): number {\r\n return this.getMaterial()?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n needSceneColor(): boolean {\r\n return this.getMaterial()?.needSceneColor() ?? false;\r\n }\r\n needSceneDepth(): boolean {\r\n return this.getMaterial()?.needSceneDepth() ?? false;\r\n }\r\n isUnlit(): boolean {\r\n return !this.getMaterial()?.supportLighting();\r\n }\r\n getMaterial(): Nullable<MeshMaterial> {\r\n return this._material.get() ?? this._host.get()?.getMaterial() ?? null;\r\n }\r\n getPrimitive(): Nullable<Primitive> {\r\n return this._host.get()?.getPrimitive() ?? null;\r\n }\r\n isBatchable(): this is BatchDrawable {\r\n if (!this._host.get()?.isBatchable()) {\r\n return false;\r\n }\r\n if (this._material.get() && !this._material.get()!.isBatchable()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Drawable proxy that renders an existing drawable with an optional material override.\r\n *\r\n * The proxy delegates geometry, picking, sorting, skinning, morph targets, and transform-related\r\n * state to the host drawable, so it can be submitted as a separate drawable while sharing the\r\n * host's animated and spatial state.\r\n *\r\n * If no override material is provided, the proxy uses the host drawable's material.\r\n *\r\n * @public\r\n */\r\nexport class ProxyDrawable extends applyMixins(ProxyDrawableBase<Disposable & Drawable>, mixinDrawable) {\r\n constructor(host: Disposable & Drawable, node?: SceneNode, overrideMaterial?: MeshMaterial) {\r\n super(host, node, overrideMaterial);\r\n }\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void {\r\n const material = this.getMaterial();\r\n const primitive = this.getPrimitive();\r\n if (material && primitive) {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n}\r\n\r\nexport class MeshDrawableBase extends Disposable {\r\n private _node: SceneNode;\r\n constructor(node: SceneNode) {\r\n super();\r\n this._node = node;\r\n }\r\n getName() {\r\n return this._node.name;\r\n }\r\n getNode() {\r\n return this._node;\r\n }\r\n}\r\n\r\nexport class MeshDrawable<M extends MeshMaterial>\r\n extends applyMixins(MeshDrawableBase, mixinDrawable)\r\n implements Drawable\r\n{\r\n private _material: DRef<M>;\r\n private _primitive: DRef<Primitive>;\r\n constructor(node: SceneNode, material: M, primitive: Primitive) {\r\n super(node);\r\n this._material = new DRef(material);\r\n this._primitive = new DRef(primitive);\r\n }\r\n get material() {\r\n return this._material.get();\r\n }\r\n set material(mat) {\r\n this._material.set(mat);\r\n }\r\n getMaterial(): Nullable<MeshMaterial> {\r\n return this.material;\r\n }\r\n get primitive() {\r\n return this._primitive.get();\r\n }\r\n set primitive(prim) {\r\n this._primitive.set(prim);\r\n }\r\n getPrimitive(): Nullable<Primitive> {\r\n return this.primitive;\r\n }\r\n getPickTarget(): PickTarget {\r\n return { node: this.getNode() };\r\n }\r\n getBoneMatrices(): Nullable<Texture2D> {\r\n return null;\r\n }\r\n getMorphData(): Nullable<MorphData> {\r\n return null;\r\n }\r\n getMorphInfo(): Nullable<MorphInfo> {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getSortDistance}\r\n */\r\n getSortDistance(camera: Camera) {\r\n const cameraWorldMatrix = camera.worldMatrix;\r\n const objectWorldMatrix = this.getNode().worldMatrix;\r\n const dx = cameraWorldMatrix.m03 - objectWorldMatrix.m03;\r\n const dy = cameraWorldMatrix.m13 - objectWorldMatrix.m13;\r\n const dz = cameraWorldMatrix.m23 - objectWorldMatrix.m23;\r\n return dx * dx + dy * dy * dz * dz;\r\n }\r\n getQueueType(): number {\r\n return this._material.get()?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n needSceneColor(): boolean {\r\n return this._material.get()?.needSceneColor() ?? false;\r\n }\r\n needSceneDepth(): boolean {\r\n return this._material.get()?.needSceneDepth() ?? false;\r\n }\r\n isUnlit(): boolean {\r\n return !this._material.get()?.supportLighting();\r\n }\r\n isBatchable(): this is BatchDrawable {\r\n return !!this._material.get() && this._material.get()!.isBatchable();\r\n }\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void {\r\n const material = this.material;\r\n const primitive = this.primitive;\r\n if (material && primitive) {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n this._primitive.dispose();\r\n }\r\n\r\n getName() {\r\n return this.getNode().name;\r\n }\r\n}\r\n"],"names":["ProxyDrawableBase","Disposable","_host","_node","_material","host","node","overrideMaterial","DWeakRef","DRef","getName","get","getNode","getPickTarget","getBoneMatrices","getMorphData","getMorphInfo","getSortDistance","camera","getQueueType","getMaterial","QUEUE_OPAQUE","needSceneColor","needSceneDepth","isUnlit","supportLighting","getPrimitive","isBatchable","ProxyDrawable","applyMixins","mixinDrawable","draw","ctx","renderQueue","material","primitive","bind","MeshDrawableBase","name","MeshDrawable","_primitive","mat","set","prim","cameraWorldMatrix","worldMatrix","objectWorldMatrix","dx","m03","dy","m13","dz","m23","onDispose","dispose"],"mappings":"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"}
1
+ {"version":3,"file":"meshdrawable.js","sources":["../../src/scene/meshdrawable.ts"],"sourcesContent":["import type { Nullable } from '@zephyr3d/base';\r\nimport { DWeakRef } from '@zephyr3d/base';\r\nimport { applyMixins, Disposable, DRef } from '@zephyr3d/base';\r\nimport type { MeshMaterial } from '../material';\r\nimport type {\r\n BatchDrawable,\r\n Drawable,\r\n DrawContext,\r\n MorphData,\r\n MorphInfo,\r\n PickTarget,\r\n Primitive,\r\n RenderQueue\r\n} from '../render';\r\nimport type { SceneNode } from './scene_node';\r\nimport type { Mesh } from './mesh';\r\nimport type { SkinInfluenceData } from '../render';\r\nimport { mixinDrawable } from '../render/drawable_mixin';\r\nimport type { Texture2D } from '@zephyr3d/device';\r\nimport type { Camera } from '../camera';\r\nimport { QUEUE_OPAQUE } from '../values';\r\n\r\nexport class ProxyDrawableBase<T extends Disposable & Drawable = Mesh> extends Disposable {\r\n protected _host: DWeakRef<T>;\r\n protected _node: DWeakRef<SceneNode>;\r\n protected _material: DRef<MeshMaterial>;\r\n /**\r\n * Creates a proxy for a host drawable.\r\n *\r\n * @param host - Drawable that supplies the shared geometry, animation, and transform state.\r\n * @param overrideMaterial - Optional material used instead of the host drawable's material.\r\n */\r\n constructor(host: T, node?: SceneNode, overrideMaterial?: MeshMaterial) {\r\n super();\r\n this._host = new DWeakRef(host);\r\n this._node = new DWeakRef(node);\r\n this._material = new DRef(overrideMaterial);\r\n }\r\n getName(): string {\r\n return this._host.get()?.getName() ?? '';\r\n }\r\n getNode(): SceneNode {\r\n return this._node.get()!;\r\n }\r\n getPickTarget(): PickTarget {\r\n return this._host.get()!.getPickTarget();\r\n }\r\n getBoneMatrices(): Nullable<Texture2D> {\r\n return this._host.get()?.getBoneMatrices() ?? null;\r\n }\r\n getMorphData(): Nullable<MorphData> {\r\n return this._host.get()?.getMorphData() ?? null;\r\n }\r\n getMorphInfo(): Nullable<MorphInfo> {\r\n return this._host.get()?.getMorphInfo() ?? null;\r\n }\r\n getSkinInfluenceData(): Nullable<SkinInfluenceData> {\r\n return this._host.get()?.getSkinInfluenceData() ?? null;\r\n }\r\n getSortDistance(camera: Camera): number {\r\n return this._host.get()?.getSortDistance(camera) ?? 0;\r\n }\r\n getQueueType(): number {\r\n return this.getMaterial()?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n needSceneColor(): boolean {\r\n return this.getMaterial()?.needSceneColor() ?? false;\r\n }\r\n needSceneDepth(): boolean {\r\n return this.getMaterial()?.needSceneDepth() ?? false;\r\n }\r\n isUnlit(): boolean {\r\n return !this.getMaterial()?.supportLighting();\r\n }\r\n getMaterial(): Nullable<MeshMaterial> {\r\n return this._material.get() ?? this._host.get()?.getMaterial() ?? null;\r\n }\r\n getPrimitive(): Nullable<Primitive> {\r\n return this._host.get()?.getPrimitive() ?? null;\r\n }\r\n isBatchable(): this is BatchDrawable {\r\n if (!this._host.get()?.isBatchable()) {\r\n return false;\r\n }\r\n if (this._material.get() && !this._material.get()!.isBatchable()) {\r\n return false;\r\n }\r\n return true;\r\n }\r\n}\r\n\r\n/**\r\n * Drawable proxy that renders an existing drawable with an optional material override.\r\n *\r\n * The proxy delegates geometry, picking, sorting, skinning, morph targets, and transform-related\r\n * state to the host drawable, so it can be submitted as a separate drawable while sharing the\r\n * host's animated and spatial state.\r\n *\r\n * If no override material is provided, the proxy uses the host drawable's material.\r\n *\r\n * @public\r\n */\r\nexport class ProxyDrawable extends applyMixins(ProxyDrawableBase<Disposable & Drawable>, mixinDrawable) {\r\n constructor(host: Disposable & Drawable, node?: SceneNode, overrideMaterial?: MeshMaterial) {\r\n super(host, node, overrideMaterial);\r\n }\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void {\r\n const material = this.getMaterial();\r\n const primitive = this.getPrimitive();\r\n if (material && primitive) {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n}\r\n\r\nexport class MeshDrawableBase extends Disposable {\r\n private _node: SceneNode;\r\n constructor(node: SceneNode) {\r\n super();\r\n this._node = node;\r\n }\r\n getName() {\r\n return this._node.name;\r\n }\r\n getNode() {\r\n return this._node;\r\n }\r\n}\r\n\r\nexport class MeshDrawable<M extends MeshMaterial>\r\n extends applyMixins(MeshDrawableBase, mixinDrawable)\r\n implements Drawable\r\n{\r\n private _material: DRef<M>;\r\n private _primitive: DRef<Primitive>;\r\n constructor(node: SceneNode, material: M, primitive: Primitive) {\r\n super(node);\r\n this._material = new DRef(material);\r\n this._primitive = new DRef(primitive);\r\n }\r\n get material() {\r\n return this._material.get();\r\n }\r\n set material(mat) {\r\n this._material.set(mat);\r\n }\r\n getMaterial(): Nullable<MeshMaterial> {\r\n return this.material;\r\n }\r\n get primitive() {\r\n return this._primitive.get();\r\n }\r\n set primitive(prim) {\r\n this._primitive.set(prim);\r\n }\r\n getPrimitive(): Nullable<Primitive> {\r\n return this.primitive;\r\n }\r\n getPickTarget(): PickTarget {\r\n return { node: this.getNode() };\r\n }\r\n getBoneMatrices(): Nullable<Texture2D> {\r\n return null;\r\n }\r\n getSkinInfluenceData(): Nullable<SkinInfluenceData> {\r\n return null;\r\n }\r\n getMorphData(): Nullable<MorphData> {\r\n return null;\r\n }\r\n getMorphInfo(): Nullable<MorphInfo> {\r\n return null;\r\n }\r\n /**\r\n * {@inheritDoc Drawable.getSortDistance}\r\n */\r\n getSortDistance(camera: Camera) {\r\n const cameraWorldMatrix = camera.worldMatrix;\r\n const objectWorldMatrix = this.getNode().worldMatrix;\r\n const dx = cameraWorldMatrix.m03 - objectWorldMatrix.m03;\r\n const dy = cameraWorldMatrix.m13 - objectWorldMatrix.m13;\r\n const dz = cameraWorldMatrix.m23 - objectWorldMatrix.m23;\r\n return dx * dx + dy * dy * dz * dz;\r\n }\r\n getQueueType(): number {\r\n return this._material.get()?.getQueueType() ?? QUEUE_OPAQUE;\r\n }\r\n needSceneColor(): boolean {\r\n return this._material.get()?.needSceneColor() ?? false;\r\n }\r\n needSceneDepth(): boolean {\r\n return this._material.get()?.needSceneDepth() ?? false;\r\n }\r\n isUnlit(): boolean {\r\n return !this._material.get()?.supportLighting();\r\n }\r\n isBatchable(): this is BatchDrawable {\r\n return !!this._material.get() && this._material.get()!.isBatchable();\r\n }\r\n draw(ctx: DrawContext, renderQueue: Nullable<RenderQueue>): void {\r\n const material = this.material;\r\n const primitive = this.primitive;\r\n if (material && primitive) {\r\n this.bind(ctx, renderQueue);\r\n material.draw(primitive, ctx);\r\n }\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n this._material.dispose();\r\n this._primitive.dispose();\r\n }\r\n\r\n getName() {\r\n return this.getNode().name;\r\n }\r\n}\r\n"],"names":["ProxyDrawableBase","Disposable","_host","_node","_material","host","node","overrideMaterial","DWeakRef","DRef","getName","get","getNode","getPickTarget","getBoneMatrices","getMorphData","getMorphInfo","getSkinInfluenceData","getSortDistance","camera","getQueueType","getMaterial","QUEUE_OPAQUE","needSceneColor","needSceneDepth","isUnlit","supportLighting","getPrimitive","isBatchable","ProxyDrawable","applyMixins","mixinDrawable","draw","ctx","renderQueue","material","primitive","bind","MeshDrawableBase","name","MeshDrawable","_primitive","mat","set","prim","cameraWorldMatrix","worldMatrix","objectWorldMatrix","dx","m03","dy","m13","dz","m23","onDispose","dispose"],"mappings":"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"}
@@ -12,7 +12,10 @@ import '../material/unlit.js';
12
12
  import '../material/particle.js';
13
13
  import '../material/subsurfaceprofile.js';
14
14
  import '../material/skin.js';
15
+ import '../material/eye.js';
15
16
  import '../material/meshmaterial.js';
17
+ import '../material/hair.js';
18
+ import '../material/hairstrand.js';
16
19
  import '../material/grassmaterial.js';
17
20
  import '../material/terrain-cm.js';
18
21
  import '../material/pbrmr.js';
@@ -1 +1 @@
1
- {"version":3,"file":"msdftext.js","sources":["../../src/scene/msdftext.ts"],"sourcesContent":["import type { AABB, Immutable } from '@zephyr3d/base';\r\nimport { Vector2, Vector3 } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { Primitive } from '../render';\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\nimport { MSDFTextMaterial } from '../material/msdf_text';\r\n\r\n/**\r\n * Billboard MSDF text node.\r\n *\r\n * @public\r\n */\r\nexport class MSDFText extends GraphNode {\r\n private _fontAsset: FontAsset | null;\r\n private _atlas: MSDFGlyphAtlas | null;\r\n private _castShadow: boolean;\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<MSDFTextMaterial>[];\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._castShadow = false;\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 castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(value) {\r\n this._castShadow = value;\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 bv = new BoundingBox();\r\n bv.beginExtend();\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 bv\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(bv);\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(bv);\r\n }\r\n isMSDFText(): this is MSDFText {\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 MSDFTextMaterial(), 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 bv: AABB\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 for (let k = 0; k < 4; k++) {\r\n bv.extend3(positions[p + k * 3], positions[p + k * 3 + 1], positions[p + k * 3 + 2]);\r\n }\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":["MSDFText","GraphNode","_fontAsset","_atlas","_castShadow","_text","_fontSize","_maxWidth","_textAlign","_anchor","_color","_outlineWidth","_outlineColor","_pageBatches","scene","Vector2","Vector3","queueUpdateNode","castShadow","value","fontAsset","font","getEngine","msdfTextAtlasManager","getAtlas","text","fontSize","Math","max","maxWidth","textAlign","anchorX","x","invalidateWorldBoundingVolume","anchorY","y","anchor","equalsTo","set","textColor","batch","material","outlineWidth","outlineColor","batches","update","disposePageBatches","layout","layoutText","bv","BoundingBox","beginExtend","geometries","buildPagedSpriteGeometry","metrics","unitsPerEm","ascent","pageIndices","pages","keys","sort","a","b","i","length","pageIndex","geometry","get","ensurePageBatch","updatePrimitiveGeometry","primitive","positions","uvs","indices","setBoundingVolume","atlasTexture","getAtlasTexture","distanceRange","isMSDFText","onDispose","index","MeshDrawable","MSDFTextMaterial","Primitive","fromIndex","dispose","splice","scale","top","bottom","height","anchorOffsetX","boxWidth","anchorOffsetY","lineOffsets","lines","map","line","gap","width","minX","maxX","minY","maxY","pageGlyphs","Map","glyph","glyphs","list","atlasGlyph","atlasIndex","push","glyphCount","Float32Array","Uint32Array","Uint16Array","lineOffsetX","lineIndex","x0","xOffset","planeLeft","y0","planeTop","x1","planeRight","y1","planeBottom","min","p","k","extend3","t","uMin","vMin","uMax","vMax","baseVertex","indexOffset","bounds","removeVertexBuffer","setIndexBuffer","createAndSetVertexBuffer","createAndSetIndexBuffer","indexCount"],"mappings":"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"}
1
+ {"version":3,"file":"msdftext.js","sources":["../../src/scene/msdftext.ts"],"sourcesContent":["import type { AABB, Immutable } from '@zephyr3d/base';\r\nimport { Vector2, Vector3 } from '@zephyr3d/base';\r\nimport type { Scene } from './scene';\r\nimport { BoundingBox } from '../utility/bounding_volume';\r\nimport { Primitive } from '../render';\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\nimport { MSDFTextMaterial } from '../material/msdf_text';\r\n\r\n/**\r\n * Billboard MSDF text node.\r\n *\r\n * @public\r\n */\r\nexport class MSDFText extends GraphNode {\r\n private _fontAsset: FontAsset | null;\r\n private _atlas: MSDFGlyphAtlas | null;\r\n private _castShadow: boolean;\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<MSDFTextMaterial>[];\r\n constructor(scene: Scene) {\r\n super(scene);\r\n this._castShadow = false;\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 castShadow() {\r\n return this._castShadow;\r\n }\r\n set castShadow(value) {\r\n this._castShadow = value;\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 bv = new BoundingBox();\r\n bv.beginExtend();\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 bv\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(bv);\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(bv);\r\n }\r\n isMSDFText(): this is MSDFText {\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 MSDFTextMaterial(), 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 bv: AABB\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 for (let k = 0; k < 4; k++) {\r\n bv.extend3(positions[p + k * 3], positions[p + k * 3 + 1], positions[p + k * 3 + 2]);\r\n }\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":["MSDFText","GraphNode","_fontAsset","_atlas","_castShadow","_text","_fontSize","_maxWidth","_textAlign","_anchor","_color","_outlineWidth","_outlineColor","_pageBatches","scene","Vector2","Vector3","queueUpdateNode","castShadow","value","fontAsset","font","getEngine","msdfTextAtlasManager","getAtlas","text","fontSize","Math","max","maxWidth","textAlign","anchorX","x","invalidateWorldBoundingVolume","anchorY","y","anchor","equalsTo","set","textColor","batch","material","outlineWidth","outlineColor","batches","update","disposePageBatches","layout","layoutText","bv","BoundingBox","beginExtend","geometries","buildPagedSpriteGeometry","metrics","unitsPerEm","ascent","pageIndices","pages","keys","sort","a","b","i","length","pageIndex","geometry","get","ensurePageBatch","updatePrimitiveGeometry","primitive","positions","uvs","indices","setBoundingVolume","atlasTexture","getAtlasTexture","distanceRange","isMSDFText","onDispose","index","MeshDrawable","MSDFTextMaterial","Primitive","fromIndex","dispose","splice","scale","top","bottom","height","anchorOffsetX","boxWidth","anchorOffsetY","lineOffsets","lines","map","line","gap","width","minX","maxX","minY","maxY","pageGlyphs","Map","glyph","glyphs","list","atlasGlyph","atlasIndex","push","glyphCount","Float32Array","Uint32Array","Uint16Array","lineOffsetX","lineIndex","x0","xOffset","planeLeft","y0","planeTop","x1","planeRight","y1","planeBottom","min","p","k","extend3","t","uMin","vMin","uMax","vMax","baseVertex","indexOffset","bounds","removeVertexBuffer","setIndexBuffer","createAndSetVertexBuffer","createAndSetIndexBuffer","indexCount"],"mappings":"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"}
@@ -12,7 +12,10 @@ import '../material/unlit.js';
12
12
  import '../material/particle.js';
13
13
  import '../material/subsurfaceprofile.js';
14
14
  import '../material/skin.js';
15
+ import '../material/eye.js';
15
16
  import '../material/meshmaterial.js';
17
+ import '../material/hair.js';
18
+ import '../material/hairstrand.js';
16
19
  import '../material/grassmaterial.js';
17
20
  import '../material/terrain-cm.js';
18
21
  import '../material/pbrmr.js';