@zephyr3d/scene 0.9.25 → 0.9.27

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 (299) hide show
  1. package/dist/animation/animationset.js +92 -30
  2. package/dist/animation/animationset.js.map +1 -1
  3. package/dist/animation/hair/gpu_hair_simulation.js +1090 -0
  4. package/dist/animation/hair/gpu_hair_simulation.js.map +1 -0
  5. package/dist/animation/joint_dynamics/controller.js +7 -5
  6. package/dist/animation/joint_dynamics/controller.js.map +1 -1
  7. package/dist/animation/joint_dynamics/convex_collider.js +320 -0
  8. package/dist/animation/joint_dynamics/convex_collider.js.map +1 -0
  9. package/dist/animation/joint_dynamics/joint_dynamics_system.js +81 -5
  10. package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
  11. package/dist/animation/morphtrack.js +3 -4
  12. package/dist/animation/morphtrack.js.map +1 -1
  13. package/dist/animation/skeleton.js +79 -25
  14. package/dist/animation/skeleton.js.map +1 -1
  15. package/dist/animation/spring/multi_chain_spring_system.js +577 -179
  16. package/dist/animation/spring/multi_chain_spring_system.js.map +1 -1
  17. package/dist/animation/spring/spring_collider.js +4 -3
  18. package/dist/animation/spring/spring_collider.js.map +1 -1
  19. package/dist/animation/spring/spring_node_pose_tracker.js +40 -0
  20. package/dist/animation/spring/spring_node_pose_tracker.js.map +1 -0
  21. package/dist/animation/spring/spring_particle.js +2 -0
  22. package/dist/animation/spring/spring_particle.js.map +1 -1
  23. package/dist/animation/spring/spring_system.js +11 -3
  24. package/dist/animation/spring/spring_system.js.map +1 -1
  25. package/dist/animation/spring_modifier.js +10 -0
  26. package/dist/animation/spring_modifier.js.map +1 -1
  27. package/dist/app/engine.js +53 -43
  28. package/dist/app/engine.js.map +1 -1
  29. package/dist/app/scriptingsystem.js +119 -6
  30. package/dist/app/scriptingsystem.js.map +1 -1
  31. package/dist/app/scriptregistry.js +3 -2
  32. package/dist/app/scriptregistry.js.map +1 -1
  33. package/dist/asset/assetmanager.js +284 -67
  34. package/dist/asset/assetmanager.js.map +1 -1
  35. package/dist/asset/loaders/zhair/zhair_format.js +288 -0
  36. package/dist/asset/loaders/zhair/zhair_format.js.map +1 -0
  37. package/dist/asset/loaders/zhair/zhair_loader.js +221 -0
  38. package/dist/asset/loaders/zhair/zhair_loader.js.map +1 -0
  39. package/dist/asset/model.js +184 -69
  40. package/dist/asset/model.js.map +1 -1
  41. package/dist/camera/camera.js +268 -44
  42. package/dist/camera/camera.js.map +1 -1
  43. package/dist/camera/perspectivecamera.js +3 -1
  44. package/dist/camera/perspectivecamera.js.map +1 -1
  45. package/dist/index.d.ts +9044 -5139
  46. package/dist/index.js +17 -6
  47. package/dist/index.js.map +1 -1
  48. package/dist/material/eye.js +932 -0
  49. package/dist/material/eye.js.map +1 -0
  50. package/dist/material/hair.js +917 -0
  51. package/dist/material/hair.js.map +1 -0
  52. package/dist/material/hairstrand.js +842 -0
  53. package/dist/material/hairstrand.js.map +1 -0
  54. package/dist/material/hairstrand_data.js +162 -0
  55. package/dist/material/hairstrand_data.js.map +1 -0
  56. package/dist/material/lambert.js +5 -2
  57. package/dist/material/lambert.js.map +1 -1
  58. package/dist/material/material.js +48 -10
  59. package/dist/material/material.js.map +1 -1
  60. package/dist/material/meshmaterial.js +120 -19
  61. package/dist/material/meshmaterial.js.map +1 -1
  62. package/dist/material/mixins/albedocolor.js +1 -1
  63. package/dist/material/mixins/albedocolor.js.map +1 -1
  64. package/dist/material/mixins/lightmodel/blinnphong.js +5 -3
  65. package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
  66. package/dist/material/mixins/lightmodel/lambert.js +5 -4
  67. package/dist/material/mixins/lightmodel/lambert.js.map +1 -1
  68. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js +3 -3
  69. package/dist/material/mixins/lightmodel/pbrblueprintmixin.js.map +1 -1
  70. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +5 -5
  71. package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
  72. package/dist/material/mixins/lightmodel/pbrspecularglossness.js +3 -3
  73. package/dist/material/mixins/lightmodel/pbrspecularglossness.js.map +1 -1
  74. package/dist/material/mixins/lit.js +106 -19
  75. package/dist/material/mixins/lit.js.map +1 -1
  76. package/dist/material/mixins/pbr/common.js +4 -4
  77. package/dist/material/mixins/pbr/common.js.map +1 -1
  78. package/dist/material/mixins/texture.js +48 -11
  79. package/dist/material/mixins/texture.js.map +1 -1
  80. package/dist/material/mtoon.js +6 -5
  81. package/dist/material/mtoon.js.map +1 -1
  82. package/dist/material/pbrblueprint.js +146 -28
  83. package/dist/material/pbrblueprint.js.map +1 -1
  84. package/dist/material/pbrblueprint_instance.js +501 -0
  85. package/dist/material/pbrblueprint_instance.js.map +1 -0
  86. package/dist/material/pbrmr.js +15 -16
  87. package/dist/material/pbrmr.js.map +1 -1
  88. package/dist/material/shader/helper.js +734 -23
  89. package/dist/material/shader/helper.js.map +1 -1
  90. package/dist/material/shader/terrain_blend.js +55 -0
  91. package/dist/material/shader/terrain_blend.js.map +1 -0
  92. package/dist/material/skin.js +192 -32
  93. package/dist/material/skin.js.map +1 -1
  94. package/dist/material/spriteblueprint.js +16 -1
  95. package/dist/material/spriteblueprint.js.map +1 -1
  96. package/dist/material/subsurfaceprofile.js +86 -23
  97. package/dist/material/subsurfaceprofile.js.map +1 -1
  98. package/dist/material/water.js +2059 -72
  99. package/dist/material/water.js.map +1 -1
  100. package/dist/posteffect/bloom.js +167 -7
  101. package/dist/posteffect/bloom.js.map +1 -1
  102. package/dist/posteffect/coloradjust.js +2 -1
  103. package/dist/posteffect/coloradjust.js.map +1 -1
  104. package/dist/posteffect/compositor.js.map +1 -1
  105. package/dist/posteffect/fxaa.js +2 -1
  106. package/dist/posteffect/fxaa.js.map +1 -1
  107. package/dist/posteffect/grayscale.js +3 -1
  108. package/dist/posteffect/grayscale.js.map +1 -1
  109. package/dist/posteffect/motionblur.js +664 -56
  110. package/dist/posteffect/motionblur.js.map +1 -1
  111. package/dist/posteffect/posteffect.js +12 -1
  112. package/dist/posteffect/posteffect.js.map +1 -1
  113. package/dist/posteffect/sao.js +46 -44
  114. package/dist/posteffect/sao.js.map +1 -1
  115. package/dist/posteffect/skinsss.js +368 -69
  116. package/dist/posteffect/skinsss.js.map +1 -1
  117. package/dist/posteffect/ssgi.js +16 -9
  118. package/dist/posteffect/ssgi.js.map +1 -1
  119. package/dist/posteffect/ssr.js +3 -0
  120. package/dist/posteffect/ssr.js.map +1 -1
  121. package/dist/posteffect/sss.js +121 -36
  122. package/dist/posteffect/sss.js.map +1 -1
  123. package/dist/posteffect/taa.js.map +1 -1
  124. package/dist/posteffect/tonemap.js +44 -1
  125. package/dist/posteffect/tonemap.js.map +1 -1
  126. package/dist/render/abuffer_oit.js +8 -2
  127. package/dist/render/abuffer_oit.js.map +1 -1
  128. package/dist/render/clipmap.js +156 -5
  129. package/dist/render/clipmap.js.map +1 -1
  130. package/dist/render/cull_visitor.js +20 -0
  131. package/dist/render/cull_visitor.js.map +1 -1
  132. package/dist/render/depthpass.js +36 -2
  133. package/dist/render/depthpass.js.map +1 -1
  134. package/dist/render/drawable_mixin.js +26 -1
  135. package/dist/render/drawable_mixin.js.map +1 -1
  136. package/dist/render/dualdepthpeeling_oit.js +3 -2
  137. package/dist/render/dualdepthpeeling_oit.js.map +1 -1
  138. package/dist/render/envlight.js +1 -1
  139. package/dist/render/envlight.js.map +1 -1
  140. package/dist/render/fbm_wavegenerator.js +6 -3
  141. package/dist/render/fbm_wavegenerator.js.map +1 -1
  142. package/dist/render/fft_wavegenerator.js +57 -15
  143. package/dist/render/fft_wavegenerator.js.map +1 -1
  144. package/dist/render/gerstner_wavegenerator.js +130 -20
  145. package/dist/render/gerstner_wavegenerator.js.map +1 -1
  146. package/dist/render/globalbindgroup_allocator.js +3 -0
  147. package/dist/render/globalbindgroup_allocator.js.map +1 -1
  148. package/dist/render/hzb.js +80 -22
  149. package/dist/render/hzb.js.map +1 -1
  150. package/dist/render/lightpass.js +6 -3
  151. package/dist/render/lightpass.js.map +1 -1
  152. package/dist/render/oit.js +29 -0
  153. package/dist/render/oit.js.map +1 -0
  154. package/dist/render/render_queue.js +39 -0
  155. package/dist/render/render_queue.js.map +1 -1
  156. package/dist/render/renderer.js +4 -0
  157. package/dist/render/renderer.js.map +1 -1
  158. package/dist/render/rendergraph/blackboard.js +1 -0
  159. package/dist/render/rendergraph/blackboard.js.map +1 -1
  160. package/dist/render/rendergraph/device_pool_allocator.js.map +1 -1
  161. package/dist/render/rendergraph/executor.js +2 -0
  162. package/dist/render/rendergraph/executor.js.map +1 -1
  163. package/dist/render/rendergraph/forward_plus_builder.js +379 -10
  164. package/dist/render/rendergraph/forward_plus_builder.js.map +1 -1
  165. package/dist/render/rendergraph/frame_resource_requirements.js +1 -0
  166. package/dist/render/rendergraph/frame_resource_requirements.js.map +1 -1
  167. package/dist/render/rendergraph/history_resources.js +8 -1
  168. package/dist/render/rendergraph/history_resources.js.map +1 -1
  169. package/dist/render/rendergraph/rendergraph.js.map +1 -1
  170. package/dist/render/rendergraph/texture_affinity_cache.js +1 -1
  171. package/dist/render/rendergraph/texture_affinity_cache.js.map +1 -1
  172. package/dist/render/rendergraph/types.js.map +1 -1
  173. package/dist/render/shadow_mask_pass.js +73 -8
  174. package/dist/render/shadow_mask_pass.js.map +1 -1
  175. package/dist/render/sky.js +166 -126
  176. package/dist/render/sky.js.map +1 -1
  177. package/dist/render/underwater.js +624 -0
  178. package/dist/render/underwater.js.map +1 -0
  179. package/dist/render/water_caustics.js +1380 -0
  180. package/dist/render/water_caustics.js.map +1 -0
  181. package/dist/render/weightedblended_oit.js +3 -2
  182. package/dist/render/weightedblended_oit.js.map +1 -1
  183. package/dist/scene/basesprite.js +8 -0
  184. package/dist/scene/basesprite.js.map +1 -1
  185. package/dist/scene/batchgroup.js +3 -0
  186. package/dist/scene/batchgroup.js.map +1 -1
  187. package/dist/scene/environment.js +4 -1
  188. package/dist/scene/environment.js.map +1 -1
  189. package/dist/scene/hair.js +963 -0
  190. package/dist/scene/hair.js.map +1 -0
  191. package/dist/scene/light.js +5 -1
  192. package/dist/scene/light.js.map +1 -1
  193. package/dist/scene/mesh.js +481 -47
  194. package/dist/scene/mesh.js.map +1 -1
  195. package/dist/scene/meshdrawable.js +6 -0
  196. package/dist/scene/meshdrawable.js.map +1 -1
  197. package/dist/scene/msdftext.js +3 -0
  198. package/dist/scene/msdftext.js.map +1 -1
  199. package/dist/scene/msdftextsprite.js +3 -0
  200. package/dist/scene/msdftextsprite.js.map +1 -1
  201. package/dist/scene/particlesys.js +6 -0
  202. package/dist/scene/particlesys.js.map +1 -1
  203. package/dist/scene/scene.js +3 -0
  204. package/dist/scene/scene.js.map +1 -1
  205. package/dist/scene/scene_node.js +6 -1
  206. package/dist/scene/scene_node.js.map +1 -1
  207. package/dist/scene/terrain-cm/grass.js +3 -0
  208. package/dist/scene/terrain-cm/grass.js.map +1 -1
  209. package/dist/scene/terrain-cm/grassmaterial.js +3 -0
  210. package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
  211. package/dist/scene/terrain-cm/terrain-cm.js +6 -0
  212. package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
  213. package/dist/scene/terrain-cm/texture_cache.js +309 -0
  214. package/dist/scene/terrain-cm/texture_cache.js.map +1 -0
  215. package/dist/scene/water.js +546 -4
  216. package/dist/scene/water.js.map +1 -1
  217. package/dist/shaders/atmosphere.js.map +1 -1
  218. package/dist/shaders/diffusion.js +54 -0
  219. package/dist/shaders/diffusion.js.map +1 -0
  220. package/dist/shaders/shadow.js +33 -21
  221. package/dist/shaders/shadow.js.map +1 -1
  222. package/dist/shaders/temporal.js +71 -33
  223. package/dist/shaders/temporal.js.map +1 -1
  224. package/dist/shaders/water.js +22 -19
  225. package/dist/shaders/water.js.map +1 -1
  226. package/dist/shaders/water_medium.js +56 -0
  227. package/dist/shaders/water_medium.js.map +1 -0
  228. package/dist/shadow/dom.js +546 -0
  229. package/dist/shadow/dom.js.map +1 -0
  230. package/dist/shadow/pcf_opt.js +3 -5
  231. package/dist/shadow/pcf_opt.js.map +1 -1
  232. package/dist/shadow/pcf_pd.js +1 -1
  233. package/dist/shadow/pcf_pd.js.map +1 -1
  234. package/dist/shadow/receiver_bias.js +41 -0
  235. package/dist/shadow/receiver_bias.js.map +1 -0
  236. package/dist/shadow/shader.js +20 -60
  237. package/dist/shadow/shader.js.map +1 -1
  238. package/dist/shadow/shadow_impl.js +89 -0
  239. package/dist/shadow/shadow_impl.js.map +1 -1
  240. package/dist/shadow/shadow_region.js +1 -1
  241. package/dist/shadow/shadow_region.js.map +1 -1
  242. package/dist/shadow/shadowmapper.js +150 -37
  243. package/dist/shadow/shadowmapper.js.map +1 -1
  244. package/dist/shapes/shape.js +11 -2
  245. package/dist/shapes/shape.js.map +1 -1
  246. package/dist/shapes/sphere.js +50 -9
  247. package/dist/shapes/sphere.js.map +1 -1
  248. package/dist/utility/blueprint/common/constants.js +112 -2
  249. package/dist/utility/blueprint/common/constants.js.map +1 -1
  250. package/dist/utility/blueprint/material/func.js +142 -49
  251. package/dist/utility/blueprint/material/func.js.map +1 -1
  252. package/dist/utility/blueprint/material/ir.js +490 -25
  253. package/dist/utility/blueprint/material/ir.js.map +1 -1
  254. package/dist/utility/blueprint/material/texture.js +898 -4
  255. package/dist/utility/blueprint/material/texture.js.map +1 -1
  256. package/dist/utility/serialization/manager.js +434 -101
  257. package/dist/utility/serialization/manager.js.map +1 -1
  258. package/dist/utility/serialization/scene/animation.js +401 -5
  259. package/dist/utility/serialization/scene/animation.js.map +1 -1
  260. package/dist/utility/serialization/scene/batch.js +4 -0
  261. package/dist/utility/serialization/scene/batch.js.map +1 -1
  262. package/dist/utility/serialization/scene/camera.js +186 -26
  263. package/dist/utility/serialization/scene/camera.js.map +1 -1
  264. package/dist/utility/serialization/scene/common.js +26 -5
  265. package/dist/utility/serialization/scene/common.js.map +1 -1
  266. package/dist/utility/serialization/scene/hair.js +1141 -0
  267. package/dist/utility/serialization/scene/hair.js.map +1 -0
  268. package/dist/utility/serialization/scene/light.js +84 -4
  269. package/dist/utility/serialization/scene/light.js.map +1 -1
  270. package/dist/utility/serialization/scene/material.js +1867 -166
  271. package/dist/utility/serialization/scene/material.js.map +1 -1
  272. package/dist/utility/serialization/scene/mesh.js +231 -14
  273. package/dist/utility/serialization/scene/mesh.js.map +1 -1
  274. package/dist/utility/serialization/scene/node.js +141 -7
  275. package/dist/utility/serialization/scene/node.js.map +1 -1
  276. package/dist/utility/serialization/scene/particle.js +4 -0
  277. package/dist/utility/serialization/scene/particle.js.map +1 -1
  278. package/dist/utility/serialization/scene/primitive.js +18 -0
  279. package/dist/utility/serialization/scene/primitive.js.map +1 -1
  280. package/dist/utility/serialization/scene/sprite.js +4 -0
  281. package/dist/utility/serialization/scene/sprite.js.map +1 -1
  282. package/dist/utility/serialization/scene/terrain.js +4 -0
  283. package/dist/utility/serialization/scene/terrain.js.map +1 -1
  284. package/dist/utility/serialization/scene/text.js +4 -0
  285. package/dist/utility/serialization/scene/text.js.map +1 -1
  286. package/dist/utility/serialization/scene/water.js +1105 -21
  287. package/dist/utility/serialization/scene/water.js.map +1 -1
  288. package/dist/utility/serialization/types.js.map +1 -1
  289. package/dist/utility/shprojector.js +9 -8
  290. package/dist/utility/shprojector.js.map +1 -1
  291. package/dist/values.js +49 -2
  292. package/dist/values.js.map +1 -1
  293. package/package.json +3 -3
  294. package/dist/render/rendergraph/frame_graph_context.js +0 -41
  295. package/dist/render/rendergraph/frame_graph_context.js.map +0 -1
  296. package/dist/shaders/ssgi.js +0 -63
  297. package/dist/shaders/ssgi.js.map +0 -1
  298. package/dist/shaders/ssgi_reprojection.js +0 -118
  299. package/dist/shaders/ssgi_reprojection.js.map +0 -1
@@ -1,18 +1,19 @@
1
- import { ASSERT, DRef, randomUUID } from '@zephyr3d/base';
1
+ import { DWeakRef, ASSERT, DRef, randomUUID } from '@zephyr3d/base';
2
2
  import { getAABBClass } from './scene/misc.js';
3
3
  import { getSceneNodeClass, getGraphNodeClass } from './scene/node.js';
4
4
  import { getBatchGroupClass } from './scene/batch.js';
5
5
  import { getCameraClass, getPerspectiveCameraClass, getOrthoCameraClass } from './scene/camera.js';
6
6
  import { getPunctualLightClass, getDirectionalLightClass, getSpotLightClass, getPointLightClass, getRectLightClass } from './scene/light.js';
7
- import { getSubsurfaceProfileClass, getMeshMaterialClass, getPBRBluePrintMaterialClass, getSpriteBlueprintMaterialClass, getUnlitMaterialClass, getMToonMaterialClass, getLambertMaterialClass, getBlinnMaterialClass, getSkinMaterialClass, getPBRMetallicRoughnessMaterialClass, getPBRSpecularGlossinessMaterialClass, getParticleMaterialClass, getSpriteMaterialClass, getStandardSpriteMaterialClass } from './scene/material.js';
7
+ import { getSubsurfaceProfileClass, getMeshMaterialClass, getPBRBluePrintMaterialClass, getPBRBluePrintMaterialInstanceClass, getSpriteBlueprintMaterialClass, getUnlitMaterialClass, getMToonMaterialClass, getLambertMaterialClass, getBlinnMaterialClass, getHairMaterialClass, getSkinMaterialClass, getEyeMaterialClass, getPBRMetallicRoughnessMaterialClass, getPBRSpecularGlossinessMaterialClass, getParticleMaterialClass, getSpriteMaterialClass, getStandardSpriteMaterialClass } from './scene/material.js';
8
8
  import { getMeshClass } from './scene/mesh.js';
9
9
  import { getParticleNodeClass } from './scene/particle.js';
10
10
  import { getBoxShapeClass, getBoxFrameShapeClass, getCapsuleShapeClass, getSphereShapeClass, getTorusShapeClass, getCylinderShapeClass, getPlaneShapeClass, getTetrahedronShapeClass } from './scene/primitive.js';
11
11
  import { getSceneClass } from './scene/scene.js';
12
12
  import { getTerrainClass } from './scene/terrain.js';
13
- import { getWaterClass, getFFTWaveGeneratorClass, getFBMWaveGeneratorClass } from './scene/water.js';
13
+ import { getWaterClass, getFFTWaveGeneratorClass, getFBMWaveGeneratorClass, getGerstnerWaveGeneratorClass, getGerstnerWaveClass } from './scene/water.js';
14
+ import { getHairNodeClass } from './scene/hair.js';
14
15
  import { getTextSpriteClass, getMSDFTextSpriteClass, getMSDFTextClass } from './scene/text.js';
15
- import { getInterpolatorClass, getInterpolatorScalarClass, getSkeletonClass, getSkeletonRigClass, getSkinBindingClass, getJointDynamicsModifierClass, getAnimationClass, getPropTrackClass, getNodeRotationTrackClass, getNodeScaleTrackClass, getNodeTranslationTrackClass, getNodeEulerRotationTrackClass, getFixedGeometryCacheTrackClass, getPCAGeometryCacheTrackClass, getMorphTrackClass, getMorphTargetGroupTrackClass } from './scene/animation.js';
16
+ import { getInterpolatorClass, getInterpolatorScalarClass, getSkeletonClass, getSkeletonRigClass, getSkinBindingClass, getJointDynamicsModifierClass, getSpringModifierClass, getAnimationClass, getPropTrackClass, getNodeRotationTrackClass, getNodeScaleTrackClass, getNodeTranslationTrackClass, getNodeEulerRotationTrackClass, getFixedGeometryCacheTrackClass, getPCAGeometryCacheTrackClass, getMorphTrackClass, getMorphTargetGroupTrackClass } from './scene/animation.js';
16
17
  import '../../scene/scene.js';
17
18
  import '../../values.js';
18
19
  import '../../render/render_queue.js';
@@ -25,18 +26,22 @@ import '../../material/unlit.js';
25
26
  import '../../material/particle.js';
26
27
  import '../../material/subsurfaceprofile.js';
27
28
  import '../../material/skin.js';
29
+ import '../../material/eye.js';
30
+ import { Material } from '../../material/material.js';
28
31
  import '../../material/meshmaterial.js';
32
+ import '../../material/hair.js';
33
+ import '../../material/hairstrand.js';
29
34
  import '../../material/grassmaterial.js';
30
35
  import '../../material/terrain-cm.js';
31
36
  import '../../material/pbrmr.js';
32
37
  import '../../material/pbrsg.js';
33
38
  import '../../material/mtoon.js';
34
- import '../../material/pbrblueprint.js';
39
+ import { PBRBluePrintMaterial } from '../../material/pbrblueprint.js';
35
40
  import '../../material/sprite.js';
36
41
  import '../../material/sprite_std.js';
37
42
  import { PBRBlockNode, SpriteBlockNode, VertexBlockNode } from '../blueprint/material/pbr.js';
38
43
  import { ConstantScalarNode, ConstantVec2Node, ConstantVec3Node, ConstantVec4Node, ConstantBooleanNode, ConstantBVec2Node, ConstantBVec3Node, ConstantBVec4Node } from '../blueprint/common/constants.js';
39
- import { ConstantTexture2DNode, ConstantTexture2DArrayNode, ConstantTextureCubeNode, PannerNode, TextureSampleNode } from '../blueprint/material/texture.js';
44
+ import { ConstantTexture2DNode, ConstantTexture2DArrayNode, ConstantTextureCubeNode, ChannelSDFMaskNode, MorphBlurNode, PannerNode, TexturePropertyNode, TextureSampleNode } from '../blueprint/material/texture.js';
40
45
  import { MakeVectorNode, SwizzleNode, EqualNode, NotEqualNode, LogicallyAndNode, LogicallyOrNode, CompComparisonNode, AnyConditionNode, AllConditionNode, SelectionNode, Degrees2RadiansNode, Radians2DegreesNode, SinNode, CosNode, TanNode, ArcSinNode, ArcCosNode, ArcTanNode, ArcTan2Node, SinHNode, CosHNode, TanHNode, ArcsineHNode, ArccosineHNode, ArctangentHNode, ExpNode, Exp2Node, LogNode, Log2Node, SqrtNode, InvSqrtNode, AbsNode, SignNode, FloorNode, CeilNode, FractNode, DDXNode, DDYNode, FWidthNode, CompAddNode, CompSubNode, CompMulNode, CompDivNode, ModNode, MinNode, MaxNode, PowNode, StepNode, SmoothStepNode, FmaNode, ClampNode, SaturateNode, MixNode, NormalizeNode, TransformNode, RotateAboutAxisNode, FaceForwardNode, ReflectNode, RefractNode, LengthNode, DistanceNode, DotProductNode, CrossProductNode, Hash1Node, Hash2Node, Hash3Node, SimplexNoise2DNode, PerlinNoise2DNode } from '../blueprint/common/math.js';
41
46
  import { VertexColorNode, VertexUVNode, VertexPositionNode, PixelWorldPositionNode, VertexNormalNode, PixelNormalNode, VertexTangentNode, VertexBinormalNode, ViewMatrixNode, ProjectionMatrixNode, ViewProjMatrixNode, InvProjMatrixNode, InvViewProjMatrixNode, BillboardMatrixNode, CameraPositionNode, CameraVectorNode, CameraNearFarNode, SkyEnvTextureNode, ElapsedTimeNode, ResolveVertexPositionNode, ResolveVertexTangentNode, ResolveVertexNormalNode, VertexOutputNode, VertexIndexNode, InstanceIndexNode } from '../blueprint/material/inputs.js';
42
47
  import { FunctionInputNode, FunctionOutputNode, FunctionCallNode } from '../blueprint/material/func.js';
@@ -55,6 +60,7 @@ import '../../scene/meshdrawable.js';
55
60
  import '../../scene/basesprite.js';
56
61
  import '../../material/msdf_text.js';
57
62
  import '../../scene/water.js';
63
+ import '../../scene/hair.js';
58
64
  import '../../scene/particlesys.js';
59
65
  import '../../scene/batchgroup.js';
60
66
  import '../../scene/terrain-cm/terrain-cm.js';
@@ -154,6 +160,8 @@ const defaultValues = {
154
160
  _assetManager;
155
161
  _editorMode;
156
162
  _allocated;
163
+ _materialsByAssetId;
164
+ _prefabContentCache;
157
165
  /**
158
166
  * Create a ResourceManager bound to a virtual file system.
159
167
  *
@@ -162,6 +170,8 @@ const defaultValues = {
162
170
  this._vfs = vfs;
163
171
  this._editorMode = editorMode;
164
172
  this._allocated = new WeakMap();
173
+ this._materialsByAssetId = new Map();
174
+ this._prefabContentCache = null;
165
175
  this._assetManager = new AssetManager(this);
166
176
  this._propMap = {};
167
177
  this._propNameMap = new Map();
@@ -181,6 +191,7 @@ const defaultValues = {
181
191
  getSkeletonRigClass(),
182
192
  getSkinBindingClass(),
183
193
  getJointDynamicsModifierClass(),
194
+ getSpringModifierClass(),
184
195
  getAnimationClass(this),
185
196
  getPropTrackClass(this),
186
197
  getNodeRotationTrackClass(),
@@ -193,15 +204,18 @@ const defaultValues = {
193
204
  getMorphTargetGroupTrackClass(),
194
205
  getSceneNodeClass(this),
195
206
  getGraphNodeClass(),
196
- getMeshClass(),
207
+ getMeshClass(this),
197
208
  getSpriteClass(),
198
209
  getTextSpriteClass(),
199
210
  getMSDFTextSpriteClass(),
200
211
  getMSDFTextClass(),
201
212
  getWaterClass(this),
213
+ getHairNodeClass(),
202
214
  getTerrainClass(this),
203
215
  getFFTWaveGeneratorClass(),
204
216
  getFBMWaveGeneratorClass(),
217
+ getGerstnerWaveGeneratorClass(),
218
+ getGerstnerWaveClass(),
205
219
  getParticleNodeClass(),
206
220
  getPunctualLightClass(),
207
221
  getDirectionalLightClass(),
@@ -216,12 +230,15 @@ const defaultValues = {
216
230
  getSubsurfaceProfileClass(),
217
231
  ...getMeshMaterialClass(),
218
232
  ...getPBRBluePrintMaterialClass(),
233
+ ...getPBRBluePrintMaterialInstanceClass(),
219
234
  ...getSpriteBlueprintMaterialClass(),
220
235
  ...getUnlitMaterialClass(this),
221
236
  ...getMToonMaterialClass(this),
222
237
  ...getLambertMaterialClass(this),
223
238
  ...getBlinnMaterialClass(this),
239
+ ...getHairMaterialClass(this),
224
240
  ...getSkinMaterialClass(this),
241
+ ...getEyeMaterialClass(this),
225
242
  ...getPBRMetallicRoughnessMaterialClass(this),
226
243
  ...getPBRSpecularGlossinessMaterialClass(this),
227
244
  ...getParticleMaterialClass(this),
@@ -342,11 +359,14 @@ const defaultValues = {
342
359
  FunctionInputNode.getSerializationCls(),
343
360
  FunctionOutputNode.getSerializationCls(),
344
361
  FunctionCallNode.getSerializationCls(this),
362
+ ChannelSDFMaskNode.getSerializationCls(),
363
+ MorphBlurNode.getSerializationCls(),
345
364
  PannerNode.getSerializationCls(),
346
- TextureSampleNode.getSerializationCls(),
347
365
  VertexOutputNode.getSerializationCls(),
348
366
  VertexIndexNode.getSerializationCls(),
349
- InstanceIndexNode.getSerializationCls()
367
+ InstanceIndexNode.getSerializationCls(),
368
+ TexturePropertyNode.getSerializationCls(),
369
+ TextureSampleNode.getSerializationCls()
350
370
  ].map((val)=>[
351
371
  val.ctor,
352
372
  val
@@ -354,6 +374,7 @@ const defaultValues = {
354
374
  for (const k of this._classMap){
355
375
  this.registerProps(k[1]);
356
376
  }
377
+ this._vfs.on('changed', this.handleVFSChanged, this);
357
378
  }
358
379
  /**
359
380
  * The virtual file system used by this manager.
@@ -364,7 +385,12 @@ const defaultValues = {
364
385
  return this._vfs;
365
386
  }
366
387
  set VFS(vfs) {
367
- this._vfs = vfs;
388
+ if (vfs !== this._vfs) {
389
+ this._vfs?.off('changed', this.handleVFSChanged, this);
390
+ this._vfs = vfs;
391
+ this.clearCache();
392
+ this._vfs?.on('changed', this.handleVFSChanged, this);
393
+ }
368
394
  }
369
395
  /**
370
396
  * Wethether editor mode is enabled
@@ -526,13 +552,224 @@ const defaultValues = {
526
552
  *
527
553
  */ setAssetId(asset, id) {
528
554
  if (asset) {
555
+ const material = asset instanceof Material ? asset : null;
556
+ const prevId = material ? this.getAssetId(material) : null;
557
+ if (material && prevId && prevId !== id) {
558
+ this.unregisterMaterialReference(prevId, material);
559
+ }
529
560
  if (id) {
530
561
  this._allocated.set(asset, id);
562
+ if (material) {
563
+ this.registerMaterialReference(id, material);
564
+ }
531
565
  } else {
532
566
  this._allocated.delete(asset);
533
567
  }
534
568
  }
535
569
  }
570
+ getMaterialRefsByAssetId(id) {
571
+ return this._materialsByAssetId.get(id) ?? null;
572
+ }
573
+ /** @internal */ getTrackedMaterialAssetIds() {
574
+ const ids = [];
575
+ for (const [id, refs] of this._materialsByAssetId){
576
+ for (const ref of [
577
+ ...refs
578
+ ]){
579
+ const material = ref.get();
580
+ if (!material || material.disposed) {
581
+ ref.dispose();
582
+ refs.delete(ref);
583
+ }
584
+ }
585
+ if (refs.size === 0) {
586
+ this._materialsByAssetId.delete(id);
587
+ } else {
588
+ ids.push(id);
589
+ }
590
+ }
591
+ return ids;
592
+ }
593
+ syncMaterialReferences(source) {
594
+ const id = this.getAssetId(source);
595
+ if (!id) {
596
+ return;
597
+ }
598
+ const refs = this._materialsByAssetId.get(id);
599
+ if (!refs) {
600
+ return;
601
+ }
602
+ for (const ref of [
603
+ ...refs
604
+ ]){
605
+ const material = ref.get();
606
+ if (!material || material.disposed) {
607
+ ref.dispose();
608
+ refs.delete(ref);
609
+ } else if (material !== source && material.constructor === source.constructor) {
610
+ const instance = material;
611
+ if (instance.$isInstance && instance.getInstancedUniforms) {
612
+ const coreMaterial = instance.coreMaterial;
613
+ if (coreMaterial && coreMaterial !== source && coreMaterial.constructor === source.constructor) {
614
+ coreMaterial.copyFrom(source);
615
+ }
616
+ for (const { prop } of instance.getInstancedUniforms()){
617
+ instance[prop] = source[prop];
618
+ }
619
+ } else {
620
+ material.copyFrom(source);
621
+ }
622
+ }
623
+ }
624
+ if (refs.size === 0) {
625
+ this._materialsByAssetId.delete(id);
626
+ }
627
+ }
628
+ syncMaterialUniformReferences(source) {
629
+ const id = this.getAssetId(source);
630
+ if (!id) {
631
+ return;
632
+ }
633
+ const refs = this._materialsByAssetId.get(id);
634
+ if (!refs) {
635
+ return;
636
+ }
637
+ const synced = new Set();
638
+ for (const ref of [
639
+ ...refs
640
+ ]){
641
+ const material = ref.get();
642
+ if (!material || material.disposed) {
643
+ ref.dispose();
644
+ refs.delete(ref);
645
+ continue;
646
+ }
647
+ const runtimeInstance = material;
648
+ const target = runtimeInstance.$isInstance ? runtimeInstance.coreMaterial : material;
649
+ if (!target || target === source || synced.has(target) || !(target instanceof PBRBluePrintMaterial) || target.constructor !== source.constructor) {
650
+ continue;
651
+ }
652
+ synced.add(target);
653
+ const targetWithOverrides = target;
654
+ if (targetWithOverrides.setOverrides) {
655
+ targetWithOverrides.setOverrides(source.uniformValues, source.uniformTextures);
656
+ } else {
657
+ target.uniformValues = source.uniformValues;
658
+ target.uniformTextures = source.uniformTextures;
659
+ }
660
+ target.uniformChanged();
661
+ }
662
+ if (refs.size === 0) {
663
+ this._materialsByAssetId.delete(id);
664
+ }
665
+ }
666
+ async syncMaterialPropertyReferences(source, prop) {
667
+ const id = this.getAssetId(source);
668
+ const refs = id ? this._materialsByAssetId.get(id) : null;
669
+ if (!refs || !prop.get || !prop.set) {
670
+ return;
671
+ }
672
+ const sourceValue = {
673
+ num: [
674
+ 0,
675
+ 0,
676
+ 0,
677
+ 0
678
+ ],
679
+ str: [
680
+ ''
681
+ ],
682
+ bool: [
683
+ false
684
+ ],
685
+ object: [
686
+ null
687
+ ]
688
+ };
689
+ prop.get.call(source, sourceValue);
690
+ const tasks = [];
691
+ for (const ref of [
692
+ ...refs
693
+ ]){
694
+ const material = ref.get();
695
+ if (!material || material.disposed) {
696
+ ref.dispose();
697
+ refs.delete(ref);
698
+ continue;
699
+ }
700
+ if (material === source || material.constructor !== source.constructor) {
701
+ continue;
702
+ }
703
+ const instance = material;
704
+ const isInstanceUniform = !!instance.$isInstance && !!instance.getInstancedUniforms?.().some((uniform)=>uniform.name === prop.name);
705
+ const target = instance.$isInstance && !isInstanceUniform ? instance.coreMaterial : material;
706
+ if (!target || target === source || target.constructor !== source.constructor) {
707
+ continue;
708
+ }
709
+ const value = {
710
+ num: [
711
+ ...sourceValue.num
712
+ ],
713
+ str: [
714
+ ...sourceValue.str
715
+ ],
716
+ bool: [
717
+ ...sourceValue.bool
718
+ ],
719
+ object: [
720
+ ...sourceValue.object
721
+ ]
722
+ };
723
+ tasks.push(Promise.resolve(prop.set.call(target, value)));
724
+ }
725
+ await Promise.all(tasks);
726
+ if (refs.size === 0) {
727
+ this._materialsByAssetId.delete(id);
728
+ }
729
+ }
730
+ trackMaterialReference(material, id) {
731
+ if (!material || !id) {
732
+ return;
733
+ }
734
+ this.setAssetId(material, id);
735
+ }
736
+ registerMaterialReference(id, material) {
737
+ let refs = this._materialsByAssetId.get(id);
738
+ if (!refs) {
739
+ refs = new Set();
740
+ this._materialsByAssetId.set(id, refs);
741
+ }
742
+ for (const ref of [
743
+ ...refs
744
+ ]){
745
+ const obj = ref.get();
746
+ if (!obj) {
747
+ ref.dispose();
748
+ refs.delete(ref);
749
+ } else if (obj === material) {
750
+ return;
751
+ }
752
+ }
753
+ refs.add(new DWeakRef(material));
754
+ }
755
+ unregisterMaterialReference(id, material) {
756
+ const refs = this._materialsByAssetId.get(id);
757
+ if (!refs) {
758
+ return;
759
+ }
760
+ for (const ref of [
761
+ ...refs
762
+ ]){
763
+ const obj = ref.get();
764
+ if (!obj || obj === material) {
765
+ ref.dispose();
766
+ refs.delete(ref);
767
+ }
768
+ }
769
+ if (refs.size === 0) {
770
+ this._materialsByAssetId.delete(id);
771
+ }
772
+ }
536
773
  /**
537
774
  * Fetch a binary asset by ID via the asset manager.
538
775
  *
@@ -540,13 +777,31 @@ const defaultValues = {
540
777
  * - Associates the returned data with the given ID for future reverse lookup.
541
778
  * - The ID is typically a VFS path or locator.
542
779
  *
543
- * @param id - Asset identifier or path.
780
+ * @param path - VFS path.
781
+ * @param options - Optional fetch options
544
782
  *
545
783
  * @returns A Promise that resolves to the binary content, or `null` if not found.
546
- */ async fetchBinary(id) {
547
- const data = await this._assetManager.fetchBinaryData(id);
784
+ */ async fetchBinary(path, options) {
785
+ const data = await this._assetManager.fetchBinaryData(path, null, null, options);
548
786
  if (data) {
549
- this._allocated.set(data, id);
787
+ this._allocated.set(data, path);
788
+ }
789
+ return data;
790
+ }
791
+ /**
792
+ * Fetch a JSON resource via VFS.
793
+ *
794
+ * - Parses as JSON after text load.
795
+ * - Cached per resolved URL. Post-process is applied only on the first load for a given cache key.
796
+ *
797
+ * @param path - Resource URL or VFS path.
798
+ * @param options - Optional fetch options
799
+ *
800
+ * @returns A promise that resolves to the loaded JSON value.
801
+ */ async fetchJsonData(path, options) {
802
+ const data = await this._assetManager.fetchJsonData(path, null, null, options);
803
+ if (data) {
804
+ this._allocated.set(data, path);
550
805
  }
551
806
  return data;
552
807
  }
@@ -730,11 +985,18 @@ const defaultValues = {
730
985
  */ async fetchMaterial(id, options) {
731
986
  const material = await this._assetManager.fetchMaterial(id, options);
732
987
  if (material) {
733
- this._allocated.set(material, id);
988
+ this.setAssetId(material, id);
734
989
  }
735
990
  return material;
736
991
  }
737
992
  /**
993
+ * Remove one material from the asset cache.
994
+ *
995
+ * @param id - Material identifier or path.
996
+ */ invalidateMaterial(id) {
997
+ this._assetManager.invalidateMaterial(id);
998
+ }
999
+ /**
738
1000
  * Reload specific blue print materials
739
1001
  *
740
1002
  * @param filter - Determine whether a blue print material should reload.
@@ -792,16 +1054,25 @@ const defaultValues = {
792
1054
  * @param path - Path to the prefab JSON file in VFS.
793
1055
  * @returns A Promise resolving to the prefab json object, or `null` on failure.
794
1056
  */ async loadPrefabContent(path) {
795
- try {
796
- const content = await this._vfs.readFile(path, {
797
- encoding: 'utf8'
798
- });
799
- const json = JSON.parse(content);
800
- return json;
801
- } catch (err) {
802
- console.error(`Failed to load prefab from ${path}:`, err);
803
- return null;
1057
+ const normalizedPath = this._vfs.normalizePath(path);
1058
+ const cached = this._prefabContentCache?.get(normalizedPath);
1059
+ if (cached) {
1060
+ return cached;
804
1061
  }
1062
+ const loadTask = (async ()=>{
1063
+ try {
1064
+ const content = await this._vfs.readFile(normalizedPath, {
1065
+ encoding: 'utf8'
1066
+ });
1067
+ const json = JSON.parse(content);
1068
+ return json;
1069
+ } catch (err) {
1070
+ console.error(`Failed to load prefab from ${normalizedPath}:`, err);
1071
+ return null;
1072
+ }
1073
+ })();
1074
+ this._prefabContentCache?.set(normalizedPath, loadTask);
1075
+ return loadTask;
805
1076
  }
806
1077
  /**
807
1078
  * Instantiate a prefab from a JSON file via VFS.
@@ -854,12 +1125,20 @@ const defaultValues = {
854
1125
  * @param filename - Destination path in VFS.
855
1126
  */ async saveScene(scene, filename) {
856
1127
  const asyncTasks = [];
857
- const content = await this.serializeObject(scene, null, asyncTasks);
858
- await Promise.all(asyncTasks);
859
- await this._vfs.writeFile(filename, JSON.stringify(content, null, 2), {
860
- encoding: 'utf8',
861
- create: true
862
- });
1128
+ const previousPrefabContentCache = this._prefabContentCache;
1129
+ if (!previousPrefabContentCache) {
1130
+ this._prefabContentCache = new Map();
1131
+ }
1132
+ try {
1133
+ const content = await this.serializeObject(scene, null, asyncTasks);
1134
+ await Promise.all(asyncTasks);
1135
+ await this._vfs.writeFile(filename, JSON.stringify(content, null, 2), {
1136
+ encoding: 'utf8',
1137
+ create: true
1138
+ });
1139
+ } finally{
1140
+ this._prefabContentCache = previousPrefabContentCache;
1141
+ }
863
1142
  }
864
1143
  rebuildGraphStructure(nodes, links) {
865
1144
  const gs = {
@@ -990,8 +1269,47 @@ const defaultValues = {
990
1269
  * Useful when reloading content or changing VFS mounts.
991
1270
  */ clearCache() {
992
1271
  this._allocated = new WeakMap();
1272
+ this._prefabContentCache?.clear();
993
1273
  this._assetManager.clearCache();
994
1274
  }
1275
+ handleVFSChanged(type, path, itemType, oldPath) {
1276
+ if (type === 'moved') {
1277
+ if (!oldPath) {
1278
+ this._prefabContentCache?.clear();
1279
+ this._assetManager.clearCache();
1280
+ return;
1281
+ }
1282
+ const normalizedOldPath = this._vfs.normalizePath(oldPath);
1283
+ const normalizedPath = this._vfs.normalizePath(path);
1284
+ const recursive = itemType === 'directory';
1285
+ this._assetManager.invalidateAsset(normalizedOldPath, recursive);
1286
+ this._assetManager.invalidateAsset(normalizedPath, recursive);
1287
+ this.invalidatePrefabContent(normalizedOldPath, recursive);
1288
+ this.invalidatePrefabContent(normalizedPath, recursive);
1289
+ return;
1290
+ }
1291
+ const normalizedPath = this._vfs.normalizePath(path);
1292
+ const recursive = itemType === 'directory';
1293
+ this._assetManager.invalidateAsset(normalizedPath, recursive);
1294
+ this.invalidatePrefabContent(normalizedPath, recursive);
1295
+ }
1296
+ invalidatePrefabContent(path, recursive) {
1297
+ if (!this._prefabContentCache) {
1298
+ return;
1299
+ }
1300
+ if (recursive) {
1301
+ const prefix = path.endsWith('/') ? path : `${path}/`;
1302
+ for (const key of [
1303
+ ...this._prefabContentCache.keys()
1304
+ ]){
1305
+ if (key === path || key.startsWith(prefix)) {
1306
+ this._prefabContentCache.delete(key);
1307
+ }
1308
+ }
1309
+ } else {
1310
+ this._prefabContentCache.delete(path);
1311
+ }
1312
+ }
995
1313
  static _pathPattern = /^([^\][]+)(?:\[(\d+)\])?$/;
996
1314
  static parsePropertyPath(str) {
997
1315
  const match = str.match(this._pathPattern);
@@ -1111,81 +1429,96 @@ const defaultValues = {
1111
1429
  continue;
1112
1430
  }
1113
1431
  const k = prop.name;
1114
- const v = json[k] ?? this.getDefaultValue(obj, prop);
1115
- const tmpVal = {
1116
- num: [
1117
- 0,
1118
- 0,
1119
- 0,
1120
- 0
1121
- ],
1122
- str: [
1123
- ''
1124
- ],
1125
- bool: [
1126
- false
1127
- ],
1128
- object: [
1129
- null
1130
- ]
1131
- };
1132
- switch(prop.type){
1133
- case 'object':
1134
- if (typeof v === 'string' && v) {
1135
- tmpVal.str[0] = v;
1136
- } else {
1137
- tmpVal.object[0] = v ? Array.isArray(v) ? v : this.isSerializedObjectEnvelope(v) ? await this.deserializeObject(obj, v) ?? null : v : null;
1138
- }
1139
- break;
1140
- case 'object_array':
1141
- tmpVal.object = [];
1142
- if (Array.isArray(v)) {
1143
- for (const p of v){
1144
- if (typeof p === 'string' && p) {
1145
- tmpVal.str[0] = p;
1432
+ promises.push((async ()=>{
1433
+ try {
1434
+ const v = json[k] ?? this.getDefaultValue(obj, prop);
1435
+ const tmpVal = {
1436
+ num: [
1437
+ 0,
1438
+ 0,
1439
+ 0,
1440
+ 0
1441
+ ],
1442
+ str: [
1443
+ ''
1444
+ ],
1445
+ bool: [
1446
+ false
1447
+ ],
1448
+ object: [
1449
+ null
1450
+ ]
1451
+ };
1452
+ switch(prop.type){
1453
+ case 'object':
1454
+ if (typeof v === 'string' && v) {
1455
+ tmpVal.str[0] = v;
1146
1456
  } else {
1147
- tmpVal.object.push(p ? this.isSerializedObjectEnvelope(p) ? await this.deserializeObject(obj, p) ?? null : p : null);
1457
+ tmpVal.object[0] = v ? Array.isArray(v) ? v : this.isSerializedObjectEnvelope(v) ? await this.deserializeObject(obj, v) ?? null : v : null;
1148
1458
  }
1149
- }
1459
+ break;
1460
+ case 'object_array':
1461
+ tmpVal.object = [];
1462
+ if (Array.isArray(v)) {
1463
+ const values = await Promise.all(v.map(async (p)=>typeof p === 'string' && p ? {
1464
+ kind: 'ref',
1465
+ ref: p
1466
+ } : {
1467
+ kind: 'value',
1468
+ value: p ? this.isSerializedObjectEnvelope(p) ? await this.deserializeObject(obj, p) ?? null : p : null
1469
+ }));
1470
+ for (const value of values){
1471
+ if (value.kind === 'ref') {
1472
+ tmpVal.str[0] = value.ref;
1473
+ } else {
1474
+ tmpVal.object.push(value.value);
1475
+ }
1476
+ }
1477
+ }
1478
+ break;
1479
+ case 'embedded':
1480
+ if (typeof v === 'string' && v) {
1481
+ tmpVal.str[0] = v;
1482
+ }
1483
+ break;
1484
+ case 'float':
1485
+ case 'int':
1486
+ tmpVal.num[0] = v;
1487
+ break;
1488
+ case 'string':
1489
+ tmpVal.str[0] = v;
1490
+ break;
1491
+ case 'bool':
1492
+ tmpVal.bool[0] = v;
1493
+ break;
1494
+ case 'vec2':
1495
+ case 'int2':
1496
+ tmpVal.num[0] = v[0];
1497
+ tmpVal.num[1] = v[1];
1498
+ break;
1499
+ case 'vec3':
1500
+ case 'int3':
1501
+ case 'rgb':
1502
+ tmpVal.num[0] = v[0];
1503
+ tmpVal.num[1] = v[1];
1504
+ tmpVal.num[2] = v[2];
1505
+ break;
1506
+ case 'vec4':
1507
+ case 'int4':
1508
+ case 'rgba':
1509
+ tmpVal.num[0] = v[0];
1510
+ tmpVal.num[1] = v[1];
1511
+ tmpVal.num[2] = v[2];
1512
+ tmpVal.num[3] = v[3];
1513
+ break;
1150
1514
  }
1151
- break;
1152
- case 'embedded':
1153
- if (typeof v === 'string' && v) {
1154
- tmpVal.str[0] = v;
1515
+ if (prop.set) {
1516
+ await Promise.resolve(prop.set.call(obj, tmpVal, -1));
1155
1517
  }
1156
- break;
1157
- case 'float':
1158
- case 'int':
1159
- tmpVal.num[0] = v;
1160
- break;
1161
- case 'string':
1162
- tmpVal.str[0] = v;
1163
- break;
1164
- case 'bool':
1165
- tmpVal.bool[0] = v;
1166
- break;
1167
- case 'vec2':
1168
- case 'int2':
1169
- tmpVal.num[0] = v[0];
1170
- tmpVal.num[1] = v[1];
1171
- break;
1172
- case 'vec3':
1173
- case 'int3':
1174
- case 'rgb':
1175
- tmpVal.num[0] = v[0];
1176
- tmpVal.num[1] = v[1];
1177
- tmpVal.num[2] = v[2];
1178
- break;
1179
- case 'vec4':
1180
- case 'int4':
1181
- case 'rgba':
1182
- tmpVal.num[0] = v[0];
1183
- tmpVal.num[1] = v[1];
1184
- tmpVal.num[2] = v[2];
1185
- tmpVal.num[3] = v[3];
1186
- break;
1187
- }
1188
- promises.push(Promise.resolve(prop.set.call(obj, tmpVal, -1)));
1518
+ } catch (err) {
1519
+ console.warn(`Deserialize property failed: ${cls.name}.${k} on ${obj?.constructor?.name ?? 'UnknownObject'}: ${String(err)}`);
1520
+ }
1521
+ })());
1189
1522
  }
1190
1523
  if (promises.length > 0) {
1191
1524
  await Promise.all(promises);