@zephyr3d/scene 0.9.4 → 0.9.6
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/animationmask.js +224 -0
- package/dist/animation/animationmask.js.map +1 -0
- package/dist/animation/animationset.js +268 -67
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/animationtrack.js.map +1 -1
- package/dist/animation/eulerrotationtrack.js +3 -0
- package/dist/animation/eulerrotationtrack.js.map +1 -1
- package/dist/animation/fixed_geometry_cache_track.js +7 -0
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
- package/dist/animation/ik_modifier.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +6 -4
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +390 -43
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +4 -3
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/joint_dynamics_modifier.js +2 -0
- package/dist/animation/joint_dynamics_modifier.js.map +1 -1
- package/dist/animation/morphtarget.js +3 -72
- package/dist/animation/morphtarget.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -0
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/pca_geometry_cache_track.js +3 -0
- package/dist/animation/pca_geometry_cache_track.js.map +1 -1
- package/dist/animation/proptrack.js +3 -0
- package/dist/animation/proptrack.js.map +1 -1
- package/dist/animation/rotationtrack.js +3 -0
- package/dist/animation/rotationtrack.js.map +1 -1
- package/dist/animation/scaletrack.js +3 -0
- package/dist/animation/scaletrack.js.map +1 -1
- package/dist/animation/skeleton.js +254 -79
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/animation/translationtrack.js +3 -0
- package/dist/animation/translationtrack.js.map +1 -1
- package/dist/app/engine.js +171 -107
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptregistry.js +251 -80
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +344 -365
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/loader.js +1 -6
- package/dist/asset/loaders/loader.js.map +1 -1
- package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
- package/dist/asset/model.js +1000 -131
- package/dist/asset/model.js.map +1 -1
- package/dist/avatar/wardrobe.js +474 -0
- package/dist/avatar/wardrobe.js.map +1 -0
- package/dist/index.d.ts +1126 -199
- package/dist/index.js +3 -2
- package/dist/index.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +72 -15
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/msdf_text.js +3 -3
- package/dist/material/msdf_text.js.map +1 -1
- package/dist/material/msdf_text_sprite.js +4 -4
- package/dist/material/msdf_text_sprite.js.map +1 -1
- package/dist/material/pbrblueprint.js +102 -102
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/render/envlight.js +54 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/sky.js +9 -0
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/batchgroup.js +11 -13
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +15 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/mesh.js +79 -16
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/scene.js +1 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +203 -2
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/text/font/cff_font.js +890 -0
- package/dist/text/font/cff_font.js.map +1 -0
- package/dist/text/font/font_asset.js +17 -3
- package/dist/text/font/font_asset.js.map +1 -1
- package/dist/text/msdf/generator.js.map +1 -1
- package/dist/text/msdf/shape.js +4 -1
- package/dist/text/msdf/shape.js.map +1 -1
- package/dist/text/runtime/msdf_text_atlas_manager.js +4 -1
- package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -1
- package/dist/utility/blueprint/material/inputs.js +1157 -1154
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/pmrem.js +34 -8
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/serialization/manager.js +22 -9
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +700 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +64 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +187 -8
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/textures/sheenlut.js +138 -0
- package/dist/utility/textures/sheenlut.js.map +1 -0
- package/package.json +2 -2
- package/dist/animation/ik/ik_chain_builder.js +0 -68
- package/dist/animation/ik/ik_chain_builder.js.map +0 -1
- package/dist/animation/ik/ik_pole_constraint.js +0 -123
- package/dist/animation/ik/ik_pole_constraint.js.map +0 -1
- package/dist/animation/ik/ik_track.js +0 -96
- package/dist/animation/ik/ik_track.js.map +0 -1
- package/dist/animation/ik_postprocessor.js +0 -71
- package/dist/animation/ik_postprocessor.js.map +0 -1
- package/dist/animation/joint_dynamics/math.js +0 -16
- package/dist/animation/joint_dynamics/math.js.map +0 -1
- package/dist/animation/manual_transform_processor.js +0 -156
- package/dist/animation/manual_transform_processor.js.map +0 -1
- package/dist/animation/skeleton_postprocessor.js +0 -50
- package/dist/animation/skeleton_postprocessor.js.map +0 -1
- package/dist/animation/spring2/collision.js +0 -469
- package/dist/animation/spring2/collision.js.map +0 -1
- package/dist/animation/spring2/constraints.js +0 -329
- package/dist/animation/spring2/constraints.js.map +0 -1
- package/dist/animation/spring2/controller.js +0 -434
- package/dist/animation/spring2/controller.js.map +0 -1
- package/dist/animation/spring2/math.js +0 -16
- package/dist/animation/spring2/math.js.map +0 -1
- package/dist/animation/spring2/solver.js +0 -624
- package/dist/animation/spring2/solver.js.map +0 -1
- package/dist/animation/spring2/spring_system.js +0 -118
- package/dist/animation/spring2/spring_system.js.map +0 -1
- package/dist/animation/spring2/types.js +0 -19
- package/dist/animation/spring2/types.js.map +0 -1
- package/dist/animation/spring_postprocessor.js +0 -54
- package/dist/animation/spring_postprocessor.js.map +0 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +0 -1273
- package/dist/asset/loaders/gltf/gltf_loader.js.map +0 -1
- package/dist/asset/loaders/gltf/helpers.js +0 -331
- package/dist/asset/loaders/gltf/helpers.js.map +0 -1
- package/dist/material/sprite3d.js +0 -301
- package/dist/material/sprite3d.js.map +0 -1
- package/dist/material/sprite3d_std.js +0 -116
- package/dist/material/sprite3d_std.js.map +0 -1
- package/dist/material/sprite3dblueprint.js +0 -235
- package/dist/material/sprite3dblueprint.js.map +0 -1
- package/dist/material/sprite_sdf.js +0 -106
- package/dist/material/sprite_sdf.js.map +0 -1
- package/dist/material/terrainmaterial.js +0 -368
- package/dist/material/terrainmaterial.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js +0 -38
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimemgr.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js +0 -10
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/runtimescript.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js +0 -127
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptingsystem.js.map +0 -1
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js +0 -263
- package/dist/node_modules/@zephyr3d/runtime/dist/runtime/scriptregistry.js.map +0 -1
- package/dist/render/deferredlightpass.js +0 -510
- package/dist/render/deferredlightpass.js.map +0 -1
- package/dist/render/deferredshadowlightpass.js +0 -428
- package/dist/render/deferredshadowlightpass.js.map +0 -1
- package/dist/render/gbufferpass.js +0 -50
- package/dist/render/gbufferpass.js.map +0 -1
- package/dist/scene/sdftextsprite.js +0 -322
- package/dist/scene/sdftextsprite.js.map +0 -1
- package/dist/scene/sprite3d.js +0 -18
- package/dist/scene/sprite3d.js.map +0 -1
- package/dist/scene/terrain/grass.js +0 -280
- package/dist/scene/terrain/grass.js.map +0 -1
- package/dist/scene/terrain/heightfield.js +0 -475
- package/dist/scene/terrain/heightfield.js.map +0 -1
- package/dist/scene/terrain/patch.js +0 -532
- package/dist/scene/terrain/patch.js.map +0 -1
- package/dist/scene/terrain/quadtree.js +0 -461
- package/dist/scene/terrain/quadtree.js.map +0 -1
- package/dist/scene/terrain/terrain.js +0 -231
- package/dist/scene/terrain/terrain.js.map +0 -1
- package/dist/src/animation/animation.js +0 -127
- package/dist/src/animation/animation.js.map +0 -1
- package/dist/src/animation/animationset.js +0 -255
- package/dist/src/animation/animationset.js.map +0 -1
- package/dist/src/animation/animationtrack.js +0 -34
- package/dist/src/animation/animationtrack.js.map +0 -1
- package/dist/src/animation/eulerrotationtrack.js +0 -52
- package/dist/src/animation/eulerrotationtrack.js.map +0 -1
- package/dist/src/animation/morphtarget.js +0 -93
- package/dist/src/animation/morphtarget.js.map +0 -1
- package/dist/src/animation/morphtrack.js +0 -70
- package/dist/src/animation/morphtrack.js.map +0 -1
- package/dist/src/animation/proptrack.js +0 -161
- package/dist/src/animation/proptrack.js.map +0 -1
- package/dist/src/animation/rotationtrack.js +0 -51
- package/dist/src/animation/rotationtrack.js.map +0 -1
- package/dist/src/animation/scaletrack.js +0 -50
- package/dist/src/animation/scaletrack.js.map +0 -1
- package/dist/src/animation/skeleton.js +0 -204
- package/dist/src/animation/skeleton.js.map +0 -1
- package/dist/src/animation/translationtrack.js +0 -50
- package/dist/src/animation/translationtrack.js.map +0 -1
- package/dist/src/app/app.js +0 -129
- package/dist/src/app/app.js.map +0 -1
- package/dist/src/app/inputmgr.js +0 -267
- package/dist/src/app/inputmgr.js.map +0 -1
- package/dist/src/asset/assetmanager.js +0 -404
- package/dist/src/asset/assetmanager.js.map +0 -1
- package/dist/src/asset/builtin.js +0 -337
- package/dist/src/asset/builtin.js.map +0 -1
- package/dist/src/asset/loaders/dds/dds.js +0 -470
- package/dist/src/asset/loaders/dds/dds.js.map +0 -1
- package/dist/src/asset/loaders/dds/dds_loader.js +0 -28
- package/dist/src/asset/loaders/dds/dds_loader.js.map +0 -1
- package/dist/src/asset/loaders/gltf/gltf_loader.js +0 -1265
- package/dist/src/asset/loaders/gltf/gltf_loader.js.map +0 -1
- package/dist/src/asset/loaders/gltf/helpers.js +0 -327
- package/dist/src/asset/loaders/gltf/helpers.js.map +0 -1
- package/dist/src/asset/loaders/hdr/hdr.js +0 -180
- package/dist/src/asset/loaders/hdr/hdr.js.map +0 -1
- package/dist/src/asset/loaders/image/tga_Loader.js +0 -116
- package/dist/src/asset/loaders/image/tga_Loader.js.map +0 -1
- package/dist/src/asset/loaders/image/webimage_loader.js +0 -63
- package/dist/src/asset/loaders/image/webimage_loader.js.map +0 -1
- package/dist/src/asset/loaders/loader.js +0 -45
- package/dist/src/asset/loaders/loader.js.map +0 -1
- package/dist/src/asset/model.js +0 -414
- package/dist/src/asset/model.js.map +0 -1
- package/dist/src/blitter/bilateralblur.js +0 -221
- package/dist/src/blitter/bilateralblur.js.map +0 -1
- package/dist/src/blitter/blitter.js +0 -390
- package/dist/src/blitter/blitter.js.map +0 -1
- package/dist/src/blitter/box.js +0 -118
- package/dist/src/blitter/box.js.map +0 -1
- package/dist/src/blitter/copy.js +0 -22
- package/dist/src/blitter/copy.js.map +0 -1
- package/dist/src/blitter/gaussianblur.js +0 -228
- package/dist/src/blitter/gaussianblur.js.map +0 -1
- package/dist/src/camera/base.js +0 -92
- package/dist/src/camera/base.js.map +0 -1
- package/dist/src/camera/camera.js +0 -1005
- package/dist/src/camera/camera.js.map +0 -1
- package/dist/src/camera/fps.js +0 -238
- package/dist/src/camera/fps.js.map +0 -1
- package/dist/src/camera/orbit.js +0 -245
- package/dist/src/camera/orbit.js.map +0 -1
- package/dist/src/camera/orthocamera.js +0 -167
- package/dist/src/camera/orthocamera.js.map +0 -1
- package/dist/src/camera/perspectivecamera.js +0 -141
- package/dist/src/camera/perspectivecamera.js.map +0 -1
- package/dist/src/index.js +0 -120
- package/dist/src/index.js.map +0 -1
- package/dist/src/material/blinn.js +0 -81
- package/dist/src/material/blinn.js.map +0 -1
- package/dist/src/material/grassmaterial.js +0 -113
- package/dist/src/material/grassmaterial.js.map +0 -1
- package/dist/src/material/lambert.js +0 -92
- package/dist/src/material/lambert.js.map +0 -1
- package/dist/src/material/material.js +0 -301
- package/dist/src/material/material.js.map +0 -1
- package/dist/src/material/meshmaterial.js +0 -704
- package/dist/src/material/meshmaterial.js.map +0 -1
- package/dist/src/material/mixins/albedocolor.js +0 -76
- package/dist/src/material/mixins/albedocolor.js.map +0 -1
- package/dist/src/material/mixins/foliage.js +0 -47
- package/dist/src/material/mixins/foliage.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/blinnphong.js +0 -112
- package/dist/src/material/mixins/lightmodel/blinnphong.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/lambert.js +0 -58
- package/dist/src/material/mixins/lightmodel/lambert.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js +0 -178
- package/dist/src/material/mixins/lightmodel/pbrmetallicroughness.js.map +0 -1
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js +0 -139
- package/dist/src/material/mixins/lightmodel/pbrspecularglossness.js.map +0 -1
- package/dist/src/material/mixins/lit.js +0 -476
- package/dist/src/material/mixins/lit.js.map +0 -1
- package/dist/src/material/mixins/pbr/common.js +0 -918
- package/dist/src/material/mixins/pbr/common.js.map +0 -1
- package/dist/src/material/mixins/texture.js +0 -172
- package/dist/src/material/mixins/texture.js.map +0 -1
- package/dist/src/material/mixins/vertexcolor.js +0 -56
- package/dist/src/material/mixins/vertexcolor.js.map +0 -1
- package/dist/src/material/particle.js +0 -178
- package/dist/src/material/particle.js.map +0 -1
- package/dist/src/material/pbrmr.js +0 -97
- package/dist/src/material/pbrmr.js.map +0 -1
- package/dist/src/material/pbrsg.js +0 -97
- package/dist/src/material/pbrsg.js.map +0 -1
- package/dist/src/material/shader/helper.js +0 -1209
- package/dist/src/material/shader/helper.js.map +0 -1
- package/dist/src/material/terrain-cm.js +0 -606
- package/dist/src/material/terrain-cm.js.map +0 -1
- package/dist/src/material/terrainmaterial.js +0 -375
- package/dist/src/material/terrainmaterial.js.map +0 -1
- package/dist/src/material/unlit.js +0 -41
- package/dist/src/material/unlit.js.map +0 -1
- package/dist/src/material/water.js +0 -417
- package/dist/src/material/water.js.map +0 -1
- package/dist/src/posteffect/bloom.js +0 -361
- package/dist/src/posteffect/bloom.js.map +0 -1
- package/dist/src/posteffect/compositor.js +0 -226
- package/dist/src/posteffect/compositor.js.map +0 -1
- package/dist/src/posteffect/fxaa.js +0 -273
- package/dist/src/posteffect/fxaa.js.map +0 -1
- package/dist/src/posteffect/grayscale.js +0 -69
- package/dist/src/posteffect/grayscale.js.map +0 -1
- package/dist/src/posteffect/motionblur.js +0 -96
- package/dist/src/posteffect/motionblur.js.map +0 -1
- package/dist/src/posteffect/posteffect.js +0 -126
- package/dist/src/posteffect/posteffect.js.map +0 -1
- package/dist/src/posteffect/sao.js +0 -324
- package/dist/src/posteffect/sao.js.map +0 -1
- package/dist/src/posteffect/ssr.js +0 -489
- package/dist/src/posteffect/ssr.js.map +0 -1
- package/dist/src/posteffect/taa.js +0 -172
- package/dist/src/posteffect/taa.js.map +0 -1
- package/dist/src/posteffect/tonemap.js +0 -94
- package/dist/src/posteffect/tonemap.js.map +0 -1
- package/dist/src/render/abuffer_oit.js +0 -361
- package/dist/src/render/abuffer_oit.js.map +0 -1
- package/dist/src/render/clipmap.js +0 -851
- package/dist/src/render/clipmap.js.map +0 -1
- package/dist/src/render/cluster_light.js +0 -333
- package/dist/src/render/cluster_light.js.map +0 -1
- package/dist/src/render/cull_visitor.js +0 -187
- package/dist/src/render/cull_visitor.js.map +0 -1
- package/dist/src/render/depthpass.js +0 -68
- package/dist/src/render/depthpass.js.map +0 -1
- package/dist/src/render/drawable_mixin.js +0 -227
- package/dist/src/render/drawable_mixin.js.map +0 -1
- package/dist/src/render/envlight.js +0 -463
- package/dist/src/render/envlight.js.map +0 -1
- package/dist/src/render/fbm_wavegenerator.js +0 -251
- package/dist/src/render/fbm_wavegenerator.js.map +0 -1
- package/dist/src/render/fft_wavegenerator.js +0 -1006
- package/dist/src/render/fft_wavegenerator.js.map +0 -1
- package/dist/src/render/fullscreenquad.js +0 -38
- package/dist/src/render/fullscreenquad.js.map +0 -1
- package/dist/src/render/gerstner_wavegenerator.js +0 -314
- package/dist/src/render/gerstner_wavegenerator.js.map +0 -1
- package/dist/src/render/globalbindgroup_allocator.js +0 -60
- package/dist/src/render/globalbindgroup_allocator.js.map +0 -1
- package/dist/src/render/hzb.js +0 -273
- package/dist/src/render/hzb.js.map +0 -1
- package/dist/src/render/lightpass.js +0 -172
- package/dist/src/render/lightpass.js.map +0 -1
- package/dist/src/render/objectcolorpass.js +0 -51
- package/dist/src/render/objectcolorpass.js.map +0 -1
- package/dist/src/render/primitive.js +0 -364
- package/dist/src/render/primitive.js.map +0 -1
- package/dist/src/render/render_queue.js +0 -467
- package/dist/src/render/render_queue.js.map +0 -1
- package/dist/src/render/renderbundle_wrapper.js +0 -152
- package/dist/src/render/renderbundle_wrapper.js.map +0 -1
- package/dist/src/render/renderer.js +0 -455
- package/dist/src/render/renderer.js.map +0 -1
- package/dist/src/render/renderpass.js +0 -200
- package/dist/src/render/renderpass.js.map +0 -1
- package/dist/src/render/shadowmap_pass.js +0 -56
- package/dist/src/render/shadowmap_pass.js.map +0 -1
- package/dist/src/render/sky.js +0 -1103
- package/dist/src/render/sky.js.map +0 -1
- package/dist/src/render/weightedblended_oit.js +0 -168
- package/dist/src/render/weightedblended_oit.js.map +0 -1
- package/dist/src/scene/batchgroup.js +0 -162
- package/dist/src/scene/batchgroup.js.map +0 -1
- package/dist/src/scene/environment.js +0 -209
- package/dist/src/scene/environment.js.map +0 -1
- package/dist/src/scene/graph_node.js +0 -72
- package/dist/src/scene/graph_node.js.map +0 -1
- package/dist/src/scene/light.js +0 -416
- package/dist/src/scene/light.js.map +0 -1
- package/dist/src/scene/mesh.js +0 -341
- package/dist/src/scene/mesh.js.map +0 -1
- package/dist/src/scene/octree.js +0 -649
- package/dist/src/scene/octree.js.map +0 -1
- package/dist/src/scene/particlesys.js +0 -738
- package/dist/src/scene/particlesys.js.map +0 -1
- package/dist/src/scene/raycast_visitor.js +0 -103
- package/dist/src/scene/raycast_visitor.js.map +0 -1
- package/dist/src/scene/scene.js +0 -284
- package/dist/src/scene/scene.js.map +0 -1
- package/dist/src/scene/scene_node.js +0 -732
- package/dist/src/scene/scene_node.js.map +0 -1
- package/dist/src/scene/terrain/grass.js +0 -278
- package/dist/src/scene/terrain/grass.js.map +0 -1
- package/dist/src/scene/terrain/heightfield.js +0 -475
- package/dist/src/scene/terrain/heightfield.js.map +0 -1
- package/dist/src/scene/terrain/patch.js +0 -530
- package/dist/src/scene/terrain/patch.js.map +0 -1
- package/dist/src/scene/terrain/quadtree.js +0 -461
- package/dist/src/scene/terrain/quadtree.js.map +0 -1
- package/dist/src/scene/terrain/terrain.js +0 -246
- package/dist/src/scene/terrain/terrain.js.map +0 -1
- package/dist/src/scene/terrain-cm/grass.js +0 -594
- package/dist/src/scene/terrain-cm/grass.js.map +0 -1
- package/dist/src/scene/terrain-cm/grassmaterial.js +0 -159
- package/dist/src/scene/terrain-cm/grassmaterial.js.map +0 -1
- package/dist/src/scene/terrain-cm/terrain-cm.js +0 -538
- package/dist/src/scene/terrain-cm/terrain-cm.js.map +0 -1
- package/dist/src/scene/water.js +0 -374
- package/dist/src/scene/water.js.map +0 -1
- package/dist/src/shaders/atmosphere.js +0 -957
- package/dist/src/shaders/atmosphere.js.map +0 -1
- package/dist/src/shaders/fog.js +0 -112
- package/dist/src/shaders/fog.js.map +0 -1
- package/dist/src/shaders/misc.js +0 -266
- package/dist/src/shaders/misc.js.map +0 -1
- package/dist/src/shaders/noise.js +0 -222
- package/dist/src/shaders/noise.js.map +0 -1
- package/dist/src/shaders/pbr.js +0 -51
- package/dist/src/shaders/pbr.js.map +0 -1
- package/dist/src/shaders/shadow.js +0 -636
- package/dist/src/shaders/shadow.js.map +0 -1
- package/dist/src/shaders/ssr.js +0 -490
- package/dist/src/shaders/ssr.js.map +0 -1
- package/dist/src/shaders/temporal.js +0 -215
- package/dist/src/shaders/temporal.js.map +0 -1
- package/dist/src/shaders/water.js +0 -756
- package/dist/src/shaders/water.js.map +0 -1
- package/dist/src/shadow/esm.js +0 -237
- package/dist/src/shadow/esm.js.map +0 -1
- package/dist/src/shadow/pcf_opt.js +0 -181
- package/dist/src/shadow/pcf_opt.js.map +0 -1
- package/dist/src/shadow/pcf_pd.js +0 -189
- package/dist/src/shadow/pcf_pd.js.map +0 -1
- package/dist/src/shadow/shader.js +0 -37
- package/dist/src/shadow/shader.js.map +0 -1
- package/dist/src/shadow/shadow_impl.js +0 -15
- package/dist/src/shadow/shadow_impl.js.map +0 -1
- package/dist/src/shadow/shadowmapper.js +0 -790
- package/dist/src/shadow/shadowmapper.js.map +0 -1
- package/dist/src/shadow/ssm.js +0 -159
- package/dist/src/shadow/ssm.js.map +0 -1
- package/dist/src/shadow/vsm.js +0 -297
- package/dist/src/shadow/vsm.js.map +0 -1
- package/dist/src/shapes/box.js +0 -386
- package/dist/src/shapes/box.js.map +0 -1
- package/dist/src/shapes/cylinder.js +0 -125
- package/dist/src/shapes/cylinder.js.map +0 -1
- package/dist/src/shapes/plane.js +0 -88
- package/dist/src/shapes/plane.js.map +0 -1
- package/dist/src/shapes/shape.js +0 -87
- package/dist/src/shapes/shape.js.map +0 -1
- package/dist/src/shapes/sphere.js +0 -114
- package/dist/src/shapes/sphere.js.map +0 -1
- package/dist/src/shapes/tetrahedron.js +0 -188
- package/dist/src/shapes/tetrahedron.js.map +0 -1
- package/dist/src/shapes/torus.js +0 -111
- package/dist/src/shapes/torus.js.map +0 -1
- package/dist/src/utility/aabbtree.js +0 -400
- package/dist/src/utility/aabbtree.js.map +0 -1
- package/dist/src/utility/bounding_volume.js +0 -29
- package/dist/src/utility/bounding_volume.js.map +0 -1
- package/dist/src/utility/debug.js +0 -28
- package/dist/src/utility/debug.js.map +0 -1
- package/dist/src/utility/draco/decoder.js +0 -116
- package/dist/src/utility/draco/decoder.js.map +0 -1
- package/dist/src/utility/misc.js +0 -105
- package/dist/src/utility/misc.js.map +0 -1
- package/dist/src/utility/panorama.js +0 -163
- package/dist/src/utility/panorama.js.map +0 -1
- package/dist/src/utility/pmrem.js +0 -354
- package/dist/src/utility/pmrem.js.map +0 -1
- package/dist/src/utility/rendermipmap.js +0 -115
- package/dist/src/utility/rendermipmap.js.map +0 -1
- package/dist/src/utility/serialization/json.js +0 -402
- package/dist/src/utility/serialization/json.js.map +0 -1
- package/dist/src/utility/serialization/manager.js +0 -623
- package/dist/src/utility/serialization/manager.js.map +0 -1
- package/dist/src/utility/serialization/scene/animation.js +0 -248
- package/dist/src/utility/serialization/scene/animation.js.map +0 -1
- package/dist/src/utility/serialization/scene/batch.js +0 -59
- package/dist/src/utility/serialization/scene/batch.js.map +0 -1
- package/dist/src/utility/serialization/scene/camera.js +0 -790
- package/dist/src/utility/serialization/scene/camera.js.map +0 -1
- package/dist/src/utility/serialization/scene/common.js +0 -222
- package/dist/src/utility/serialization/scene/common.js.map +0 -1
- package/dist/src/utility/serialization/scene/light.js +0 -575
- package/dist/src/utility/serialization/scene/light.js.map +0 -1
- package/dist/src/utility/serialization/scene/material.js +0 -1111
- package/dist/src/utility/serialization/scene/material.js.map +0 -1
- package/dist/src/utility/serialization/scene/mesh.js +0 -148
- package/dist/src/utility/serialization/scene/mesh.js.map +0 -1
- package/dist/src/utility/serialization/scene/misc.js +0 -39
- package/dist/src/utility/serialization/scene/misc.js.map +0 -1
- package/dist/src/utility/serialization/scene/node.js +0 -451
- package/dist/src/utility/serialization/scene/node.js.map +0 -1
- package/dist/src/utility/serialization/scene/particle.js +0 -425
- package/dist/src/utility/serialization/scene/particle.js.map +0 -1
- package/dist/src/utility/serialization/scene/primitive.js +0 -692
- package/dist/src/utility/serialization/scene/primitive.js.map +0 -1
- package/dist/src/utility/serialization/scene/scene.js +0 -704
- package/dist/src/utility/serialization/scene/scene.js.map +0 -1
- package/dist/src/utility/serialization/scene/terrain.js +0 -488
- package/dist/src/utility/serialization/scene/terrain.js.map +0 -1
- package/dist/src/utility/serialization/scene/water.js +0 -465
- package/dist/src/utility/serialization/scene/water.js.map +0 -1
- package/dist/src/utility/shprojector.js +0 -297
- package/dist/src/utility/shprojector.js.map +0 -1
- package/dist/src/utility/textures/ggxlut.js +0 -213
- package/dist/src/utility/textures/ggxlut.js.map +0 -1
- package/dist/src/utility/textures/gradientnoise.js +0 -62
- package/dist/src/utility/textures/gradientnoise.js.map +0 -1
- package/dist/src/utility/textures/randomnoise.js +0 -41
- package/dist/src/utility/textures/randomnoise.js.map +0 -1
- package/dist/src/values.js +0 -162
- package/dist/src/values.js.map +0 -1
- package/dist/utility/blueprint/material/common.js +0 -7
- package/dist/utility/blueprint/material/common.js.map +0 -1
- package/dist/utility/serialization/blueprint/constants.js +0 -255
- package/dist/utility/serialization/blueprint/constants.js.map +0 -1
- package/dist/utility/serialization/blueprint/material/constants.js +0 -203
- package/dist/utility/serialization/blueprint/material/constants.js.map +0 -1
- package/dist/utility/serialization/blueprint/material/texture.js +0 -165
- package/dist/utility/serialization/blueprint/material/texture.js.map +0 -1
- package/dist/utility/serialization/scene/cloth_script.js +0 -834
- package/dist/utility/serialization/scene/cloth_script.js.map +0 -1
- package/dist/utility/serialization/scene/spring_script.js +0 -596
- package/dist/utility/serialization/scene/spring_script.js.map +0 -1
|
@@ -0,0 +1,474 @@
|
|
|
1
|
+
import { Disposable, DRef, guessMimeType, Matrix4x4 } from '@zephyr3d/base';
|
|
2
|
+
import { getEngine } from '../app/api.js';
|
|
3
|
+
import { SharedModel } from '../asset/model.js';
|
|
4
|
+
import { SkinBinding, SkeletonRig } from '../animation/skeleton.js';
|
|
5
|
+
|
|
6
|
+
let outfitInstanceId = 0;
|
|
7
|
+
/**
|
|
8
|
+
* A concrete equipped outfit item.
|
|
9
|
+
*
|
|
10
|
+
* Disposing the instance unequips it from the owning wardrobe.
|
|
11
|
+
*
|
|
12
|
+
* @public
|
|
13
|
+
*/ class AvatarOutfitInstance extends Disposable {
|
|
14
|
+
id;
|
|
15
|
+
slot;
|
|
16
|
+
root;
|
|
17
|
+
meshes;
|
|
18
|
+
skinBindings;
|
|
19
|
+
hiddenBodyRegions;
|
|
20
|
+
_wardrobe;
|
|
21
|
+
/** @internal */ constructor(wardrobe, slot, root, meshes, skinBindings, hiddenBodyRegions){
|
|
22
|
+
super();
|
|
23
|
+
this.id = `outfit-${++outfitInstanceId}`;
|
|
24
|
+
this.slot = slot;
|
|
25
|
+
this.root = new DRef(root);
|
|
26
|
+
this.meshes = meshes.map((mesh)=>new DRef(mesh));
|
|
27
|
+
this.skinBindings = skinBindings;
|
|
28
|
+
this.hiddenBodyRegions = hiddenBodyRegions;
|
|
29
|
+
this._wardrobe = wardrobe;
|
|
30
|
+
}
|
|
31
|
+
onDispose() {
|
|
32
|
+
this._wardrobe?._releaseInstance(this);
|
|
33
|
+
this._wardrobe = null;
|
|
34
|
+
for (const meshRef of this.meshes){
|
|
35
|
+
meshRef.dispose();
|
|
36
|
+
}
|
|
37
|
+
this.meshes.length = 0;
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
/**
|
|
41
|
+
* High level avatar outfit controller.
|
|
42
|
+
*
|
|
43
|
+
* The wardrobe keeps one avatar {@link SkeletonRig} as the animation source and
|
|
44
|
+
* binds equipped clothing meshes to that rig with new {@link SkinBinding}s.
|
|
45
|
+
*
|
|
46
|
+
* @public
|
|
47
|
+
*/ class AvatarWardrobe extends Disposable {
|
|
48
|
+
_root;
|
|
49
|
+
_rig;
|
|
50
|
+
_slots;
|
|
51
|
+
_bodyRegions;
|
|
52
|
+
_equipped;
|
|
53
|
+
_hiddenBodyNodeCounts;
|
|
54
|
+
_bodyNodeOriginalState;
|
|
55
|
+
_modelFetchOptions;
|
|
56
|
+
constructor(options){
|
|
57
|
+
super();
|
|
58
|
+
this._root = options.root;
|
|
59
|
+
this._rig = this.resolveTargetRig(options.root, options.rig);
|
|
60
|
+
this._slots = new Map();
|
|
61
|
+
this._bodyRegions = new Map();
|
|
62
|
+
this._equipped = new Map();
|
|
63
|
+
this._hiddenBodyNodeCounts = new Map();
|
|
64
|
+
this._bodyNodeOriginalState = new Map();
|
|
65
|
+
this._modelFetchOptions = options.modelFetchOptions ?? {};
|
|
66
|
+
for (const slot of options.slots ?? []){
|
|
67
|
+
this._slots.set(slot.id, {
|
|
68
|
+
...slot
|
|
69
|
+
});
|
|
70
|
+
}
|
|
71
|
+
for (const [name, nodes] of Object.entries(options.bodyRegions ?? {})){
|
|
72
|
+
this._bodyRegions.set(name, this.uniqueNodes(nodes));
|
|
73
|
+
}
|
|
74
|
+
this.ensureRigRegistered();
|
|
75
|
+
}
|
|
76
|
+
static from(root, options) {
|
|
77
|
+
return new AvatarWardrobe({
|
|
78
|
+
root,
|
|
79
|
+
...options ?? {}
|
|
80
|
+
});
|
|
81
|
+
}
|
|
82
|
+
get root() {
|
|
83
|
+
return this._root;
|
|
84
|
+
}
|
|
85
|
+
get rig() {
|
|
86
|
+
return this._rig;
|
|
87
|
+
}
|
|
88
|
+
getEquipped(slot) {
|
|
89
|
+
if (slot) {
|
|
90
|
+
return [
|
|
91
|
+
...this._equipped.get(slot) ?? []
|
|
92
|
+
];
|
|
93
|
+
}
|
|
94
|
+
return [
|
|
95
|
+
...this._equipped.values()
|
|
96
|
+
].flatMap((items)=>[
|
|
97
|
+
...items
|
|
98
|
+
]);
|
|
99
|
+
}
|
|
100
|
+
async equip(source, options) {
|
|
101
|
+
const slot = options?.slot ?? 'default';
|
|
102
|
+
this.enforceSlotRules(slot);
|
|
103
|
+
const root = await this.resolveSource(source, options);
|
|
104
|
+
if (!root) {
|
|
105
|
+
console.error('AvatarWardrobe.equip(): failed to load outfit source');
|
|
106
|
+
return null;
|
|
107
|
+
}
|
|
108
|
+
if (root === this._root) {
|
|
109
|
+
console.error('AvatarWardrobe.equip(): outfit root cannot be the avatar root');
|
|
110
|
+
return null;
|
|
111
|
+
}
|
|
112
|
+
if (root.scene !== this._root.scene) {
|
|
113
|
+
console.error('AvatarWardrobe.equip(): outfit node must belong to the same scene as the avatar');
|
|
114
|
+
return null;
|
|
115
|
+
}
|
|
116
|
+
const meshUses = this.collectSkinnedMeshes(root);
|
|
117
|
+
if (meshUses.length === 0) {
|
|
118
|
+
console.error('AvatarWardrobe.equip(): outfit does not contain skinned meshes');
|
|
119
|
+
return null;
|
|
120
|
+
}
|
|
121
|
+
const newBindings = [];
|
|
122
|
+
const equippedMeshes = [];
|
|
123
|
+
const bindMode = options?.bindMode ?? this.chooseBindMode(meshUses[0].binding.rig);
|
|
124
|
+
const fitMode = options?.fitMode ?? (bindMode === 'exact' ? 'reuseInverseBind' : 'preserveRestPose');
|
|
125
|
+
for (const use of meshUses){
|
|
126
|
+
const targetJoints = use.binding.joints.map((joint)=>this.resolveTargetJoint(joint, use.binding.rig, bindMode, options?.jointMap));
|
|
127
|
+
const missing = use.binding.joints.filter((_, index)=>!targetJoints[index]).map((joint)=>joint.name);
|
|
128
|
+
if (missing.length > 0) {
|
|
129
|
+
console.error(`AvatarWardrobe.equip(): cannot map outfit joints: ${missing.join(', ')}`);
|
|
130
|
+
return null;
|
|
131
|
+
}
|
|
132
|
+
const mappedJoints = targetJoints;
|
|
133
|
+
const inverseBindMatrices = this.createInverseBindMatrices(use.binding, mappedJoints, fitMode);
|
|
134
|
+
const binding = new SkinBinding(this._rig, inverseBindMatrices, mappedJoints);
|
|
135
|
+
this._root.animationSet.skeletons.push(new DRef(binding));
|
|
136
|
+
newBindings.push(binding);
|
|
137
|
+
for (const mesh of use.meshes){
|
|
138
|
+
mesh.skinBindingName = binding.persistentId;
|
|
139
|
+
equippedMeshes.push(mesh);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
this.stripSourceSkinBindings(root, meshUses.map((use)=>use.binding));
|
|
143
|
+
root.parent = this._root;
|
|
144
|
+
const hiddenBodyRegions = this.getHiddenBodyRegions(slot, options);
|
|
145
|
+
this.retainBodyRegions(hiddenBodyRegions);
|
|
146
|
+
const instance = new AvatarOutfitInstance(this, slot, root, equippedMeshes, newBindings, hiddenBodyRegions);
|
|
147
|
+
const items = this._equipped.get(slot) ?? [];
|
|
148
|
+
items.push(instance);
|
|
149
|
+
this._equipped.set(slot, items);
|
|
150
|
+
return instance;
|
|
151
|
+
}
|
|
152
|
+
unequip(slotOrInstance) {
|
|
153
|
+
if (typeof slotOrInstance === 'string') {
|
|
154
|
+
for (const instance of this.getEquipped(slotOrInstance)){
|
|
155
|
+
instance.dispose();
|
|
156
|
+
}
|
|
157
|
+
} else {
|
|
158
|
+
slotOrInstance.dispose();
|
|
159
|
+
}
|
|
160
|
+
}
|
|
161
|
+
clear() {
|
|
162
|
+
for (const instance of this.getEquipped()){
|
|
163
|
+
instance.dispose();
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
validateOutfit(source, options) {
|
|
167
|
+
const errors = [];
|
|
168
|
+
const warnings = [];
|
|
169
|
+
const meshUses = this.collectSkinnedMeshes(source);
|
|
170
|
+
const bindMode = options?.bindMode ?? (meshUses[0] ? this.chooseBindMode(meshUses[0].binding.rig) : 'name');
|
|
171
|
+
let mappedJoints = 0;
|
|
172
|
+
const missingJoints = [];
|
|
173
|
+
if (meshUses.length === 0) {
|
|
174
|
+
errors.push('No skinned meshes found');
|
|
175
|
+
}
|
|
176
|
+
for (const use of meshUses){
|
|
177
|
+
for (const joint of use.binding.joints){
|
|
178
|
+
if (this.resolveTargetJoint(joint, use.binding.rig, bindMode, options?.jointMap)) {
|
|
179
|
+
mappedJoints++;
|
|
180
|
+
} else {
|
|
181
|
+
missingJoints.push(joint.name);
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
}
|
|
185
|
+
if (missingJoints.length > 0) {
|
|
186
|
+
errors.push(`Missing mapped joints: ${missingJoints.join(', ')}`);
|
|
187
|
+
}
|
|
188
|
+
const unknownRegions = this.getHiddenBodyRegions(options?.slot ?? 'default', options).filter((region)=>!this._bodyRegions.has(region));
|
|
189
|
+
if (unknownRegions.length > 0) {
|
|
190
|
+
warnings.push(`Unknown body regions: ${unknownRegions.join(', ')}`);
|
|
191
|
+
}
|
|
192
|
+
return {
|
|
193
|
+
ok: errors.length === 0,
|
|
194
|
+
meshes: meshUses.reduce((sum, use)=>sum + use.meshes.length, 0),
|
|
195
|
+
skinBindings: meshUses.length,
|
|
196
|
+
mappedJoints,
|
|
197
|
+
missingJoints,
|
|
198
|
+
errors,
|
|
199
|
+
warnings
|
|
200
|
+
};
|
|
201
|
+
}
|
|
202
|
+
/** @internal */ _releaseInstance(instance) {
|
|
203
|
+
const items = this._equipped.get(instance.slot);
|
|
204
|
+
if (!items || !items.includes(instance)) {
|
|
205
|
+
return;
|
|
206
|
+
}
|
|
207
|
+
const index = items.indexOf(instance);
|
|
208
|
+
items.splice(index, 1);
|
|
209
|
+
if (items.length === 0) {
|
|
210
|
+
this._equipped.delete(instance.slot);
|
|
211
|
+
}
|
|
212
|
+
for (const meshRef of instance.meshes){
|
|
213
|
+
const mesh = meshRef.get();
|
|
214
|
+
if (instance.skinBindings.some((binding)=>binding.persistentId === mesh.skinBindingName)) {
|
|
215
|
+
mesh.skinBindingName = '';
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
for (const binding of instance.skinBindings){
|
|
219
|
+
this.removeSkinBinding(binding);
|
|
220
|
+
}
|
|
221
|
+
this.releaseBodyRegions(instance.hiddenBodyRegions);
|
|
222
|
+
instance.root.get()?.remove();
|
|
223
|
+
instance.root.dispose();
|
|
224
|
+
}
|
|
225
|
+
onDispose() {
|
|
226
|
+
this.clear();
|
|
227
|
+
}
|
|
228
|
+
resolveTargetRig(root, rig) {
|
|
229
|
+
if (rig instanceof SkeletonRig) {
|
|
230
|
+
return rig;
|
|
231
|
+
}
|
|
232
|
+
if (typeof rig === 'string') {
|
|
233
|
+
const found = root.findSkeletonRigById(rig);
|
|
234
|
+
if (!found) {
|
|
235
|
+
throw new Error(`AvatarWardrobe: rig '${rig}' was not found under avatar root`);
|
|
236
|
+
}
|
|
237
|
+
return found;
|
|
238
|
+
}
|
|
239
|
+
const animationSet = root.animationSet;
|
|
240
|
+
const registeredRig = animationSet.rigs.map((ref)=>ref.get()).find((item)=>!!item);
|
|
241
|
+
if (registeredRig) {
|
|
242
|
+
return registeredRig;
|
|
243
|
+
}
|
|
244
|
+
const bindingRig = animationSet.skeletons.map((ref)=>ref.get()?.rig).find((item)=>!!item);
|
|
245
|
+
if (bindingRig) {
|
|
246
|
+
return bindingRig;
|
|
247
|
+
}
|
|
248
|
+
throw new Error('AvatarWardrobe: avatar root does not have a skeleton rig');
|
|
249
|
+
}
|
|
250
|
+
ensureRigRegistered() {
|
|
251
|
+
if (!this._root.animationSet.rigs.some((ref)=>ref.get() === this._rig)) {
|
|
252
|
+
this._root.animationSet.rigs.push(new DRef(this._rig));
|
|
253
|
+
}
|
|
254
|
+
}
|
|
255
|
+
enforceSlotRules(slot) {
|
|
256
|
+
const slotOptions = this._slots.get(slot);
|
|
257
|
+
if (!slotOptions?.allowMultiple) {
|
|
258
|
+
this.unequip(slot);
|
|
259
|
+
}
|
|
260
|
+
for (const other of slotOptions?.exclusiveWith ?? []){
|
|
261
|
+
this.unequip(other);
|
|
262
|
+
}
|
|
263
|
+
for (const [otherSlot, options] of this._slots){
|
|
264
|
+
if (otherSlot !== slot && options.exclusiveWith?.includes(slot)) {
|
|
265
|
+
this.unequip(otherSlot);
|
|
266
|
+
}
|
|
267
|
+
}
|
|
268
|
+
}
|
|
269
|
+
async resolveSource(source, options) {
|
|
270
|
+
const resourceManager = getEngine().resourceManager;
|
|
271
|
+
if (typeof source === 'string') {
|
|
272
|
+
const scene = this._root.scene;
|
|
273
|
+
const root = guessMimeType(source) === 'application/vnd.zephyr3d.prefab+json' ? await resourceManager.instantiatePrefab(scene.rootNode, source) : await resourceManager.fetchModel(source, scene, {
|
|
274
|
+
loadAnimations: false,
|
|
275
|
+
loadMeshes: true,
|
|
276
|
+
loadSkeletons: true,
|
|
277
|
+
loadJointDynamics: false,
|
|
278
|
+
...this._modelFetchOptions,
|
|
279
|
+
...options?.modelFetchOptions ?? {}
|
|
280
|
+
});
|
|
281
|
+
if (!root) {
|
|
282
|
+
console.error(`AvatarWardrobe.equip(): failed to load outfit '${source}'`);
|
|
283
|
+
return null;
|
|
284
|
+
}
|
|
285
|
+
return root;
|
|
286
|
+
}
|
|
287
|
+
if (source instanceof SharedModel) {
|
|
288
|
+
const scene = this._root.scene;
|
|
289
|
+
const root = await source.createSceneNode(resourceManager, scene, false, true, true, false, false, resourceManager.VFS);
|
|
290
|
+
return root;
|
|
291
|
+
}
|
|
292
|
+
return source;
|
|
293
|
+
}
|
|
294
|
+
collectSkinnedMeshes(root) {
|
|
295
|
+
const bindings = root.animationSet.skeletons.map((ref)=>ref.get()).filter((item)=>!!item);
|
|
296
|
+
if (bindings.length === 0) {
|
|
297
|
+
return [];
|
|
298
|
+
}
|
|
299
|
+
const meshUses = new Map();
|
|
300
|
+
root.iterate((node)=>{
|
|
301
|
+
if (!node.isMesh()) {
|
|
302
|
+
return false;
|
|
303
|
+
}
|
|
304
|
+
const mesh = node;
|
|
305
|
+
const binding = bindings.find((item)=>item.persistentId === mesh.skinBindingName) ?? (bindings.length === 1 && mesh.skinBindingName ? bindings[0] : null);
|
|
306
|
+
if (binding) {
|
|
307
|
+
const meshes = meshUses.get(binding) ?? [];
|
|
308
|
+
meshes.push(mesh);
|
|
309
|
+
meshUses.set(binding, meshes);
|
|
310
|
+
}
|
|
311
|
+
return false;
|
|
312
|
+
});
|
|
313
|
+
return [
|
|
314
|
+
...meshUses.entries()
|
|
315
|
+
].map(([binding, meshes])=>({
|
|
316
|
+
binding,
|
|
317
|
+
meshes
|
|
318
|
+
}));
|
|
319
|
+
}
|
|
320
|
+
chooseBindMode(sourceRig) {
|
|
321
|
+
return sourceRig.humanoidJointMapping && this._rig.humanoidJointMapping ? 'humanoid' : 'name';
|
|
322
|
+
}
|
|
323
|
+
resolveTargetJoint(sourceJoint, sourceRig, bindMode, jointMap) {
|
|
324
|
+
if (bindMode === 'custom') {
|
|
325
|
+
if (typeof jointMap === 'function') {
|
|
326
|
+
const mapped = jointMap(sourceJoint, this._rig, sourceRig);
|
|
327
|
+
return mapped && this._rig.joints.includes(mapped) ? mapped : null;
|
|
328
|
+
}
|
|
329
|
+
if (jointMap) {
|
|
330
|
+
return this.findTargetJointByName(jointMap[sourceJoint.name]);
|
|
331
|
+
}
|
|
332
|
+
return null;
|
|
333
|
+
}
|
|
334
|
+
if (bindMode === 'humanoid') {
|
|
335
|
+
const mapped = this.resolveHumanoidTargetJoint(sourceJoint, sourceRig);
|
|
336
|
+
if (mapped) {
|
|
337
|
+
return mapped;
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
return this.findTargetJointByName(sourceJoint.name);
|
|
341
|
+
}
|
|
342
|
+
resolveHumanoidTargetJoint(sourceJoint, sourceRig) {
|
|
343
|
+
const src = sourceRig.humanoidJointMapping;
|
|
344
|
+
const dst = this._rig.humanoidJointMapping;
|
|
345
|
+
if (!src || !dst) {
|
|
346
|
+
return null;
|
|
347
|
+
}
|
|
348
|
+
return this.findHumanoidMappedJoint(sourceJoint, src.body, dst.body) ?? (src.leftHand && dst.leftHand ? this.findHumanoidMappedJoint(sourceJoint, src.leftHand, dst.leftHand) : null) ?? (src.rightHand && dst.rightHand ? this.findHumanoidMappedJoint(sourceJoint, src.rightHand, dst.rightHand) : null);
|
|
349
|
+
}
|
|
350
|
+
findHumanoidMappedJoint(sourceJoint, sourceMap, targetMap) {
|
|
351
|
+
for (const key of Object.keys(sourceMap)){
|
|
352
|
+
if (sourceMap[key] === sourceJoint) {
|
|
353
|
+
const target = targetMap[key];
|
|
354
|
+
return target && this._rig.joints.includes(target) ? target : null;
|
|
355
|
+
}
|
|
356
|
+
}
|
|
357
|
+
return null;
|
|
358
|
+
}
|
|
359
|
+
findTargetJointByName(name) {
|
|
360
|
+
return name ? this._rig.joints.find((joint)=>joint.name === name) ?? null : null;
|
|
361
|
+
}
|
|
362
|
+
createInverseBindMatrices(sourceBinding, targetJoints, fitMode) {
|
|
363
|
+
if (fitMode === 'reuseInverseBind') {
|
|
364
|
+
return sourceBinding.inverseBindMatrices.map((matrix)=>new Matrix4x4(matrix));
|
|
365
|
+
}
|
|
366
|
+
const sourceBindWorld = this.computeBindWorldMatrices(sourceBinding.rig);
|
|
367
|
+
const targetBindWorld = this.computeBindWorldMatrices(this._rig);
|
|
368
|
+
return sourceBinding.inverseBindMatrices.map((sourceInverseBind, index)=>{
|
|
369
|
+
const sourceJointBind = sourceBindWorld.get(sourceBinding.joints[index]) ?? sourceBinding.joints[index].worldMatrix;
|
|
370
|
+
const targetJointBind = targetBindWorld.get(targetJoints[index]) ?? targetJoints[index].worldMatrix;
|
|
371
|
+
const sourceFinalBind = Matrix4x4.multiply(sourceJointBind, sourceInverseBind);
|
|
372
|
+
return Matrix4x4.multiply(Matrix4x4.invertAffine(targetJointBind), sourceFinalBind);
|
|
373
|
+
});
|
|
374
|
+
}
|
|
375
|
+
computeBindWorldMatrices(rig) {
|
|
376
|
+
const cache = new Map();
|
|
377
|
+
const jointSet = new Set(rig.joints);
|
|
378
|
+
const compute = (node)=>{
|
|
379
|
+
const cached = cache.get(node);
|
|
380
|
+
if (cached) {
|
|
381
|
+
return cached;
|
|
382
|
+
}
|
|
383
|
+
const bindPose = this.getRigNodeBindPose(rig, node);
|
|
384
|
+
const local = Matrix4x4.compose(bindPose.scale, bindPose.rotation, bindPose.position);
|
|
385
|
+
const parent = node.parent;
|
|
386
|
+
const world = parent && (jointSet.has(parent) || parent === rig.rootJoint) ? Matrix4x4.multiply(compute(parent), local) : parent ? Matrix4x4.multiply(parent.worldMatrix, local) : local;
|
|
387
|
+
cache.set(node, world);
|
|
388
|
+
return world;
|
|
389
|
+
};
|
|
390
|
+
for (const joint of rig.joints){
|
|
391
|
+
compute(joint);
|
|
392
|
+
}
|
|
393
|
+
if (rig.rootJoint) {
|
|
394
|
+
compute(rig.rootJoint);
|
|
395
|
+
}
|
|
396
|
+
return cache;
|
|
397
|
+
}
|
|
398
|
+
getRigNodeBindPose(rig, node) {
|
|
399
|
+
return rig.getBindPoseForJoint(node) ?? (node === rig.rootJoint ? rig.rootBindPose : {
|
|
400
|
+
position: node.position,
|
|
401
|
+
rotation: node.rotation,
|
|
402
|
+
scale: node.scale
|
|
403
|
+
});
|
|
404
|
+
}
|
|
405
|
+
stripSourceSkinBindings(sourceRoot, sourceBindings) {
|
|
406
|
+
const sourceBindingSet = new Set(sourceBindings);
|
|
407
|
+
const sourceRigSet = new Set(sourceBindings.map((binding)=>binding.rig));
|
|
408
|
+
this.removeRefs(sourceRoot.animationSet.skeletons, (binding)=>sourceBindingSet.has(binding));
|
|
409
|
+
this.removeRefs(sourceRoot.animationSet.rigs, (rig)=>rig !== this._rig && sourceRigSet.has(rig));
|
|
410
|
+
}
|
|
411
|
+
removeSkinBinding(binding) {
|
|
412
|
+
this.removeRefs(this._root.animationSet.skeletons, (item)=>item === binding);
|
|
413
|
+
}
|
|
414
|
+
removeRefs(refs, predicate) {
|
|
415
|
+
for(let i = refs.length - 1; i >= 0; i--){
|
|
416
|
+
const item = refs[i].get();
|
|
417
|
+
if (item && predicate(item)) {
|
|
418
|
+
refs[i].dispose();
|
|
419
|
+
refs.splice(i, 1);
|
|
420
|
+
}
|
|
421
|
+
}
|
|
422
|
+
}
|
|
423
|
+
getHiddenBodyRegions(slot, options) {
|
|
424
|
+
return [
|
|
425
|
+
...new Set([
|
|
426
|
+
...this._slots.get(slot)?.hideBodyRegions ?? [],
|
|
427
|
+
...options?.hideBodyRegions ?? []
|
|
428
|
+
])
|
|
429
|
+
];
|
|
430
|
+
}
|
|
431
|
+
retainBodyRegions(regions) {
|
|
432
|
+
for (const node of this.collectBodyRegionNodes(regions)){
|
|
433
|
+
const count = this._hiddenBodyNodeCounts.get(node) ?? 0;
|
|
434
|
+
if (count === 0) {
|
|
435
|
+
this._bodyNodeOriginalState.set(node, node.showState);
|
|
436
|
+
node.showState = 'hidden';
|
|
437
|
+
}
|
|
438
|
+
this._hiddenBodyNodeCounts.set(node, count + 1);
|
|
439
|
+
}
|
|
440
|
+
}
|
|
441
|
+
releaseBodyRegions(regions) {
|
|
442
|
+
for (const node of this.collectBodyRegionNodes(regions)){
|
|
443
|
+
const count = this._hiddenBodyNodeCounts.get(node) ?? 0;
|
|
444
|
+
if (count <= 1) {
|
|
445
|
+
this._hiddenBodyNodeCounts.delete(node);
|
|
446
|
+
node.showState = this._bodyNodeOriginalState.get(node) ?? 'inherit';
|
|
447
|
+
this._bodyNodeOriginalState.delete(node);
|
|
448
|
+
} else {
|
|
449
|
+
this._hiddenBodyNodeCounts.set(node, count - 1);
|
|
450
|
+
}
|
|
451
|
+
}
|
|
452
|
+
}
|
|
453
|
+
collectBodyRegionNodes(regions) {
|
|
454
|
+
const nodes = [];
|
|
455
|
+
const seen = new Set();
|
|
456
|
+
for (const region of regions){
|
|
457
|
+
for (const node of this._bodyRegions.get(region) ?? []){
|
|
458
|
+
if (!seen.has(node)) {
|
|
459
|
+
seen.add(node);
|
|
460
|
+
nodes.push(node);
|
|
461
|
+
}
|
|
462
|
+
}
|
|
463
|
+
}
|
|
464
|
+
return nodes;
|
|
465
|
+
}
|
|
466
|
+
uniqueNodes(nodes) {
|
|
467
|
+
return [
|
|
468
|
+
...new Set(nodes.filter((node)=>!!node))
|
|
469
|
+
];
|
|
470
|
+
}
|
|
471
|
+
}
|
|
472
|
+
|
|
473
|
+
export { AvatarOutfitInstance, AvatarWardrobe };
|
|
474
|
+
//# sourceMappingURL=wardrobe.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"wardrobe.js","sources":["../../src/avatar/wardrobe.ts"],"sourcesContent":["import { DRef, Disposable, Matrix4x4, guessMimeType } from '@zephyr3d/base';\r\nimport type { Nullable } from '@zephyr3d/base';\r\nimport { getEngine } from '../app/api';\r\nimport type { ModelFetchOptions } from '../asset/assetmanager';\r\nimport { SharedModel } from '../asset/model';\r\nimport type { SceneNode, SceneNodeVisible } from '../scene/scene_node';\r\nimport type { Mesh } from '../scene/mesh';\r\nimport type { SkeletonBindPose } from '../animation/skeleton';\r\nimport { SkeletonRig, SkinBinding } from '../animation/skeleton';\r\n\r\n/** @public */\r\nexport type AvatarSlotId = string;\r\n\r\n/** @public */\r\nexport type AvatarBindMode = 'exact' | 'humanoid' | 'name' | 'custom';\r\n\r\n/** @public */\r\nexport type AvatarFitMode = 'reuseInverseBind' | 'preserveRestPose';\r\n\r\n/** @public */\r\nexport type AvatarOutfitSource = string | SceneNode | SharedModel;\r\n\r\n/** @public */\r\nexport type AvatarBodyRegionTarget = SceneNode | Mesh;\r\n\r\n/** @public */\r\nexport type AvatarBodyRegions = Record<string, AvatarBodyRegionTarget[]>;\r\n\r\n/** @public */\r\nexport type AvatarJointMap =\r\n | Record<string, string>\r\n | ((sourceJoint: SceneNode, targetRig: SkeletonRig, sourceRig: SkeletonRig) => Nullable<SceneNode>);\r\n\r\n/** @public */\r\nexport type AvatarSlotOptions = {\r\n id: AvatarSlotId;\r\n hideBodyRegions?: string[];\r\n exclusiveWith?: AvatarSlotId[];\r\n allowMultiple?: boolean;\r\n};\r\n\r\n/** @public */\r\nexport type AvatarWardrobeOptions = {\r\n root: SceneNode;\r\n rig?: SkeletonRig | string;\r\n slots?: AvatarSlotOptions[];\r\n bodyRegions?: AvatarBodyRegions;\r\n modelFetchOptions?: ModelFetchOptions;\r\n};\r\n\r\n/** @public */\r\nexport type AvatarEquipOptions = {\r\n slot?: AvatarSlotId;\r\n bindMode?: AvatarBindMode;\r\n fitMode?: AvatarFitMode;\r\n jointMap?: AvatarJointMap;\r\n hideBodyRegions?: string[];\r\n modelFetchOptions?: ModelFetchOptions;\r\n};\r\n\r\n/** @public */\r\nexport type AvatarOutfitValidation = {\r\n ok: boolean;\r\n meshes: number;\r\n skinBindings: number;\r\n mappedJoints: number;\r\n missingJoints: string[];\r\n errors: string[];\r\n warnings: string[];\r\n};\r\n\r\ntype MeshBindingUse = {\r\n binding: SkinBinding;\r\n meshes: Mesh[];\r\n};\r\n\r\nlet outfitInstanceId = 0;\r\n\r\n/**\r\n * A concrete equipped outfit item.\r\n *\r\n * Disposing the instance unequips it from the owning wardrobe.\r\n *\r\n * @public\r\n */\r\nexport class AvatarOutfitInstance extends Disposable {\r\n readonly id: string;\r\n readonly slot: AvatarSlotId;\r\n readonly root: DRef<SceneNode>;\r\n readonly meshes: DRef<Mesh>[];\r\n readonly skinBindings: SkinBinding[];\r\n readonly hiddenBodyRegions: string[];\r\n private _wardrobe: Nullable<AvatarWardrobe>;\r\n\r\n /** @internal */\r\n constructor(\r\n wardrobe: AvatarWardrobe,\r\n slot: AvatarSlotId,\r\n root: SceneNode,\r\n meshes: Mesh[],\r\n skinBindings: SkinBinding[],\r\n hiddenBodyRegions: string[]\r\n ) {\r\n super();\r\n this.id = `outfit-${++outfitInstanceId}`;\r\n this.slot = slot;\r\n this.root = new DRef(root);\r\n this.meshes = meshes.map((mesh) => new DRef(mesh));\r\n this.skinBindings = skinBindings;\r\n this.hiddenBodyRegions = hiddenBodyRegions;\r\n this._wardrobe = wardrobe;\r\n }\r\n\r\n protected onDispose() {\r\n this._wardrobe?._releaseInstance(this);\r\n this._wardrobe = null;\r\n for (const meshRef of this.meshes) {\r\n meshRef.dispose();\r\n }\r\n this.meshes.length = 0;\r\n }\r\n}\r\n\r\n/**\r\n * High level avatar outfit controller.\r\n *\r\n * The wardrobe keeps one avatar {@link SkeletonRig} as the animation source and\r\n * binds equipped clothing meshes to that rig with new {@link SkinBinding}s.\r\n *\r\n * @public\r\n */\r\nexport class AvatarWardrobe extends Disposable {\r\n private readonly _root: SceneNode;\r\n private readonly _rig: SkeletonRig;\r\n private readonly _slots: Map<AvatarSlotId, AvatarSlotOptions>;\r\n private readonly _bodyRegions: Map<string, SceneNode[]>;\r\n private readonly _equipped: Map<AvatarSlotId, AvatarOutfitInstance[]>;\r\n private readonly _hiddenBodyNodeCounts: Map<SceneNode, number>;\r\n private readonly _bodyNodeOriginalState: Map<SceneNode, SceneNodeVisible>;\r\n private readonly _modelFetchOptions: ModelFetchOptions;\r\n\r\n constructor(options: AvatarWardrobeOptions) {\r\n super();\r\n this._root = options.root;\r\n this._rig = this.resolveTargetRig(options.root, options.rig);\r\n this._slots = new Map();\r\n this._bodyRegions = new Map();\r\n this._equipped = new Map();\r\n this._hiddenBodyNodeCounts = new Map();\r\n this._bodyNodeOriginalState = new Map();\r\n this._modelFetchOptions = options.modelFetchOptions ?? {};\r\n for (const slot of options.slots ?? []) {\r\n this._slots.set(slot.id, { ...slot });\r\n }\r\n for (const [name, nodes] of Object.entries(options.bodyRegions ?? {})) {\r\n this._bodyRegions.set(name, this.uniqueNodes(nodes));\r\n }\r\n this.ensureRigRegistered();\r\n }\r\n\r\n static from(root: SceneNode, options?: Omit<AvatarWardrobeOptions, 'root'>): AvatarWardrobe {\r\n return new AvatarWardrobe({ root, ...(options ?? {}) });\r\n }\r\n\r\n get root(): SceneNode {\r\n return this._root;\r\n }\r\n\r\n get rig(): SkeletonRig {\r\n return this._rig;\r\n }\r\n\r\n getEquipped(slot?: AvatarSlotId): AvatarOutfitInstance[] {\r\n if (slot) {\r\n return [...(this._equipped.get(slot) ?? [])];\r\n }\r\n return [...this._equipped.values()].flatMap((items) => [...items]);\r\n }\r\n\r\n async equip(\r\n source: AvatarOutfitSource,\r\n options?: AvatarEquipOptions\r\n ): Promise<Nullable<AvatarOutfitInstance>> {\r\n const slot = options?.slot ?? 'default';\r\n this.enforceSlotRules(slot);\r\n const root = await this.resolveSource(source, options);\r\n if (!root) {\r\n console.error('AvatarWardrobe.equip(): failed to load outfit source');\r\n return null;\r\n }\r\n if (root === this._root) {\r\n console.error('AvatarWardrobe.equip(): outfit root cannot be the avatar root');\r\n return null;\r\n }\r\n if (root.scene !== this._root.scene) {\r\n console.error('AvatarWardrobe.equip(): outfit node must belong to the same scene as the avatar');\r\n return null;\r\n }\r\n\r\n const meshUses = this.collectSkinnedMeshes(root);\r\n if (meshUses.length === 0) {\r\n console.error('AvatarWardrobe.equip(): outfit does not contain skinned meshes');\r\n return null;\r\n }\r\n\r\n const newBindings: SkinBinding[] = [];\r\n const equippedMeshes: Mesh[] = [];\r\n const bindMode = options?.bindMode ?? this.chooseBindMode(meshUses[0].binding.rig);\r\n const fitMode = options?.fitMode ?? (bindMode === 'exact' ? 'reuseInverseBind' : 'preserveRestPose');\r\n for (const use of meshUses) {\r\n const targetJoints = use.binding.joints.map((joint) =>\r\n this.resolveTargetJoint(joint, use.binding.rig, bindMode, options?.jointMap)\r\n );\r\n const missing = use.binding.joints\r\n .filter((_, index) => !targetJoints[index])\r\n .map((joint) => joint.name);\r\n if (missing.length > 0) {\r\n console.error(`AvatarWardrobe.equip(): cannot map outfit joints: ${missing.join(', ')}`);\r\n return null;\r\n }\r\n const mappedJoints = targetJoints as SceneNode[];\r\n const inverseBindMatrices = this.createInverseBindMatrices(use.binding, mappedJoints, fitMode);\r\n const binding = new SkinBinding(this._rig, inverseBindMatrices, mappedJoints);\r\n this._root.animationSet.skeletons.push(new DRef(binding));\r\n newBindings.push(binding);\r\n for (const mesh of use.meshes) {\r\n mesh.skinBindingName = binding.persistentId;\r\n equippedMeshes.push(mesh);\r\n }\r\n }\r\n\r\n this.stripSourceSkinBindings(\r\n root,\r\n meshUses.map((use) => use.binding)\r\n );\r\n root.parent = this._root;\r\n\r\n const hiddenBodyRegions = this.getHiddenBodyRegions(slot, options);\r\n this.retainBodyRegions(hiddenBodyRegions);\r\n const instance = new AvatarOutfitInstance(\r\n this,\r\n slot,\r\n root,\r\n equippedMeshes,\r\n newBindings,\r\n hiddenBodyRegions\r\n );\r\n const items = this._equipped.get(slot) ?? [];\r\n items.push(instance);\r\n this._equipped.set(slot, items);\r\n return instance;\r\n }\r\n\r\n unequip(slotOrInstance: AvatarSlotId | AvatarOutfitInstance): void {\r\n if (typeof slotOrInstance === 'string') {\r\n for (const instance of this.getEquipped(slotOrInstance)) {\r\n instance.dispose();\r\n }\r\n } else {\r\n slotOrInstance.dispose();\r\n }\r\n }\r\n\r\n clear(): void {\r\n for (const instance of this.getEquipped()) {\r\n instance.dispose();\r\n }\r\n }\r\n\r\n validateOutfit(source: SceneNode, options?: AvatarEquipOptions): AvatarOutfitValidation {\r\n const errors: string[] = [];\r\n const warnings: string[] = [];\r\n const meshUses = this.collectSkinnedMeshes(source);\r\n const bindMode =\r\n options?.bindMode ?? (meshUses[0] ? this.chooseBindMode(meshUses[0].binding.rig) : 'name');\r\n let mappedJoints = 0;\r\n const missingJoints: string[] = [];\r\n if (meshUses.length === 0) {\r\n errors.push('No skinned meshes found');\r\n }\r\n for (const use of meshUses) {\r\n for (const joint of use.binding.joints) {\r\n if (this.resolveTargetJoint(joint, use.binding.rig, bindMode, options?.jointMap)) {\r\n mappedJoints++;\r\n } else {\r\n missingJoints.push(joint.name);\r\n }\r\n }\r\n }\r\n if (missingJoints.length > 0) {\r\n errors.push(`Missing mapped joints: ${missingJoints.join(', ')}`);\r\n }\r\n const unknownRegions = this.getHiddenBodyRegions(options?.slot ?? 'default', options).filter(\r\n (region) => !this._bodyRegions.has(region)\r\n );\r\n if (unknownRegions.length > 0) {\r\n warnings.push(`Unknown body regions: ${unknownRegions.join(', ')}`);\r\n }\r\n return {\r\n ok: errors.length === 0,\r\n meshes: meshUses.reduce((sum, use) => sum + use.meshes.length, 0),\r\n skinBindings: meshUses.length,\r\n mappedJoints,\r\n missingJoints,\r\n errors,\r\n warnings\r\n };\r\n }\r\n\r\n /** @internal */\r\n _releaseInstance(instance: AvatarOutfitInstance): void {\r\n const items = this._equipped.get(instance.slot);\r\n if (!items || !items.includes(instance)) {\r\n return;\r\n }\r\n const index = items.indexOf(instance);\r\n items.splice(index, 1);\r\n if (items.length === 0) {\r\n this._equipped.delete(instance.slot);\r\n }\r\n for (const meshRef of instance.meshes) {\r\n const mesh = meshRef.get()!;\r\n if (instance.skinBindings.some((binding) => binding.persistentId === mesh.skinBindingName)) {\r\n mesh.skinBindingName = '';\r\n }\r\n }\r\n for (const binding of instance.skinBindings) {\r\n this.removeSkinBinding(binding);\r\n }\r\n this.releaseBodyRegions(instance.hiddenBodyRegions);\r\n instance.root.get()?.remove();\r\n instance.root.dispose();\r\n }\r\n\r\n protected onDispose() {\r\n this.clear();\r\n }\r\n\r\n private resolveTargetRig(root: SceneNode, rig: SkeletonRig | string | undefined): SkeletonRig {\r\n if (rig instanceof SkeletonRig) {\r\n return rig;\r\n }\r\n if (typeof rig === 'string') {\r\n const found = root.findSkeletonRigById(rig);\r\n if (!found) {\r\n throw new Error(`AvatarWardrobe: rig '${rig}' was not found under avatar root`);\r\n }\r\n return found;\r\n }\r\n const animationSet = root.animationSet;\r\n const registeredRig = animationSet.rigs\r\n .map((ref) => ref.get())\r\n .find((item): item is SkeletonRig => !!item);\r\n if (registeredRig) {\r\n return registeredRig;\r\n }\r\n const bindingRig = animationSet.skeletons\r\n .map((ref) => ref.get()?.rig)\r\n .find((item): item is SkeletonRig => !!item);\r\n if (bindingRig) {\r\n return bindingRig;\r\n }\r\n throw new Error('AvatarWardrobe: avatar root does not have a skeleton rig');\r\n }\r\n\r\n private ensureRigRegistered(): void {\r\n if (!this._root.animationSet.rigs.some((ref) => ref.get() === this._rig)) {\r\n this._root.animationSet.rigs.push(new DRef(this._rig));\r\n }\r\n }\r\n\r\n private enforceSlotRules(slot: AvatarSlotId): void {\r\n const slotOptions = this._slots.get(slot);\r\n if (!slotOptions?.allowMultiple) {\r\n this.unequip(slot);\r\n }\r\n for (const other of slotOptions?.exclusiveWith ?? []) {\r\n this.unequip(other);\r\n }\r\n for (const [otherSlot, options] of this._slots) {\r\n if (otherSlot !== slot && options.exclusiveWith?.includes(slot)) {\r\n this.unequip(otherSlot);\r\n }\r\n }\r\n }\r\n\r\n private async resolveSource(\r\n source: AvatarOutfitSource,\r\n options?: AvatarEquipOptions\r\n ): Promise<Nullable<SceneNode>> {\r\n const resourceManager = getEngine().resourceManager;\r\n if (typeof source === 'string') {\r\n const scene = this._root.scene!;\r\n const root =\r\n guessMimeType(source) === 'application/vnd.zephyr3d.prefab+json'\r\n ? await resourceManager.instantiatePrefab(scene.rootNode, source)\r\n : await resourceManager.fetchModel(source, scene, {\r\n loadAnimations: false,\r\n loadMeshes: true,\r\n loadSkeletons: true,\r\n loadJointDynamics: false,\r\n ...this._modelFetchOptions,\r\n ...(options?.modelFetchOptions ?? {})\r\n });\r\n if (!root) {\r\n console.error(`AvatarWardrobe.equip(): failed to load outfit '${source}'`);\r\n return null;\r\n }\r\n return root;\r\n }\r\n if (source instanceof SharedModel) {\r\n const scene = this._root.scene!;\r\n const root = await source.createSceneNode(\r\n resourceManager,\r\n scene,\r\n false,\r\n true,\r\n true,\r\n false,\r\n false,\r\n resourceManager.VFS\r\n );\r\n return root;\r\n }\r\n return source;\r\n }\r\n\r\n private collectSkinnedMeshes(root: SceneNode): MeshBindingUse[] {\r\n const bindings = root.animationSet.skeletons\r\n .map((ref) => ref.get())\r\n .filter((item): item is SkinBinding => !!item);\r\n if (bindings.length === 0) {\r\n return [];\r\n }\r\n const meshUses = new Map<SkinBinding, Mesh[]>();\r\n root.iterate((node) => {\r\n if (!node.isMesh()) {\r\n return false;\r\n }\r\n const mesh = node as Mesh;\r\n const binding =\r\n bindings.find((item) => item.persistentId === mesh.skinBindingName) ??\r\n (bindings.length === 1 && mesh.skinBindingName ? bindings[0] : null);\r\n if (binding) {\r\n const meshes = meshUses.get(binding) ?? [];\r\n meshes.push(mesh);\r\n meshUses.set(binding, meshes);\r\n }\r\n return false;\r\n });\r\n return [...meshUses.entries()].map(([binding, meshes]) => ({ binding, meshes }));\r\n }\r\n\r\n private chooseBindMode(sourceRig: SkeletonRig): AvatarBindMode {\r\n return sourceRig.humanoidJointMapping && this._rig.humanoidJointMapping ? 'humanoid' : 'name';\r\n }\r\n\r\n private resolveTargetJoint(\r\n sourceJoint: SceneNode,\r\n sourceRig: SkeletonRig,\r\n bindMode: AvatarBindMode,\r\n jointMap?: AvatarJointMap\r\n ): Nullable<SceneNode> {\r\n if (bindMode === 'custom') {\r\n if (typeof jointMap === 'function') {\r\n const mapped = jointMap(sourceJoint, this._rig, sourceRig);\r\n return mapped && this._rig.joints.includes(mapped) ? mapped : null;\r\n }\r\n if (jointMap) {\r\n return this.findTargetJointByName(jointMap[sourceJoint.name]);\r\n }\r\n return null;\r\n }\r\n if (bindMode === 'humanoid') {\r\n const mapped = this.resolveHumanoidTargetJoint(sourceJoint, sourceRig);\r\n if (mapped) {\r\n return mapped;\r\n }\r\n }\r\n return this.findTargetJointByName(sourceJoint.name);\r\n }\r\n\r\n private resolveHumanoidTargetJoint(sourceJoint: SceneNode, sourceRig: SkeletonRig): Nullable<SceneNode> {\r\n const src = sourceRig.humanoidJointMapping;\r\n const dst = this._rig.humanoidJointMapping;\r\n if (!src || !dst) {\r\n return null;\r\n }\r\n return (\r\n this.findHumanoidMappedJoint(sourceJoint, src.body, dst.body) ??\r\n (src.leftHand && dst.leftHand\r\n ? this.findHumanoidMappedJoint(sourceJoint, src.leftHand, dst.leftHand)\r\n : null) ??\r\n (src.rightHand && dst.rightHand\r\n ? this.findHumanoidMappedJoint(sourceJoint, src.rightHand, dst.rightHand)\r\n : null)\r\n );\r\n }\r\n\r\n private findHumanoidMappedJoint<T extends string>(\r\n sourceJoint: SceneNode,\r\n sourceMap: Record<T, SceneNode>,\r\n targetMap: Record<T, SceneNode>\r\n ): Nullable<SceneNode> {\r\n for (const key of Object.keys(sourceMap) as T[]) {\r\n if (sourceMap[key] === sourceJoint) {\r\n const target = targetMap[key];\r\n return target && this._rig.joints.includes(target) ? target : null;\r\n }\r\n }\r\n return null;\r\n }\r\n\r\n private findTargetJointByName(name: string | undefined): Nullable<SceneNode> {\r\n return name ? (this._rig.joints.find((joint) => joint.name === name) ?? null) : null;\r\n }\r\n\r\n private createInverseBindMatrices(\r\n sourceBinding: SkinBinding,\r\n targetJoints: SceneNode[],\r\n fitMode: AvatarFitMode\r\n ): Matrix4x4[] {\r\n if (fitMode === 'reuseInverseBind') {\r\n return sourceBinding.inverseBindMatrices.map((matrix) => new Matrix4x4(matrix));\r\n }\r\n const sourceBindWorld = this.computeBindWorldMatrices(sourceBinding.rig);\r\n const targetBindWorld = this.computeBindWorldMatrices(this._rig);\r\n return sourceBinding.inverseBindMatrices.map((sourceInverseBind, index) => {\r\n const sourceJointBind =\r\n sourceBindWorld.get(sourceBinding.joints[index]) ?? sourceBinding.joints[index].worldMatrix;\r\n const targetJointBind = targetBindWorld.get(targetJoints[index]) ?? targetJoints[index].worldMatrix;\r\n const sourceFinalBind = Matrix4x4.multiply(sourceJointBind, sourceInverseBind);\r\n return Matrix4x4.multiply(Matrix4x4.invertAffine(targetJointBind), sourceFinalBind);\r\n });\r\n }\r\n\r\n private computeBindWorldMatrices(rig: SkeletonRig): Map<SceneNode, Matrix4x4> {\r\n const cache = new Map<SceneNode, Matrix4x4>();\r\n const jointSet = new Set(rig.joints);\r\n const compute = (node: SceneNode): Matrix4x4 => {\r\n const cached = cache.get(node);\r\n if (cached) {\r\n return cached;\r\n }\r\n const bindPose = this.getRigNodeBindPose(rig, node);\r\n const local = Matrix4x4.compose(bindPose.scale, bindPose.rotation, bindPose.position);\r\n const parent = node.parent;\r\n const world =\r\n parent && (jointSet.has(parent) || parent === rig.rootJoint)\r\n ? Matrix4x4.multiply(compute(parent), local)\r\n : parent\r\n ? Matrix4x4.multiply(parent.worldMatrix, local)\r\n : local;\r\n cache.set(node, world);\r\n return world;\r\n };\r\n for (const joint of rig.joints) {\r\n compute(joint);\r\n }\r\n if (rig.rootJoint) {\r\n compute(rig.rootJoint);\r\n }\r\n return cache;\r\n }\r\n\r\n private getRigNodeBindPose(rig: SkeletonRig, node: SceneNode): SkeletonBindPose {\r\n return (\r\n rig.getBindPoseForJoint(node) ??\r\n (node === rig.rootJoint\r\n ? rig.rootBindPose\r\n : {\r\n position: node.position,\r\n rotation: node.rotation,\r\n scale: node.scale\r\n })\r\n );\r\n }\r\n\r\n private stripSourceSkinBindings(sourceRoot: SceneNode, sourceBindings: SkinBinding[]): void {\r\n const sourceBindingSet = new Set(sourceBindings);\r\n const sourceRigSet = new Set(sourceBindings.map((binding) => binding.rig));\r\n this.removeRefs(sourceRoot.animationSet.skeletons, (binding) => sourceBindingSet.has(binding));\r\n this.removeRefs(sourceRoot.animationSet.rigs, (rig) => rig !== this._rig && sourceRigSet.has(rig));\r\n }\r\n\r\n private removeSkinBinding(binding: SkinBinding): void {\r\n this.removeRefs(this._root.animationSet.skeletons, (item) => item === binding);\r\n }\r\n\r\n private removeRefs<T extends Disposable>(refs: DRef<T>[], predicate: (item: T) => boolean): void {\r\n for (let i = refs.length - 1; i >= 0; i--) {\r\n const item = refs[i].get();\r\n if (item && predicate(item)) {\r\n refs[i].dispose();\r\n refs.splice(i, 1);\r\n }\r\n }\r\n }\r\n\r\n private getHiddenBodyRegions(slot: AvatarSlotId, options?: AvatarEquipOptions): string[] {\r\n return [\r\n ...new Set([...(this._slots.get(slot)?.hideBodyRegions ?? []), ...(options?.hideBodyRegions ?? [])])\r\n ];\r\n }\r\n\r\n private retainBodyRegions(regions: string[]): void {\r\n for (const node of this.collectBodyRegionNodes(regions)) {\r\n const count = this._hiddenBodyNodeCounts.get(node) ?? 0;\r\n if (count === 0) {\r\n this._bodyNodeOriginalState.set(node, node.showState);\r\n node.showState = 'hidden';\r\n }\r\n this._hiddenBodyNodeCounts.set(node, count + 1);\r\n }\r\n }\r\n\r\n private releaseBodyRegions(regions: string[]): void {\r\n for (const node of this.collectBodyRegionNodes(regions)) {\r\n const count = this._hiddenBodyNodeCounts.get(node) ?? 0;\r\n if (count <= 1) {\r\n this._hiddenBodyNodeCounts.delete(node);\r\n node.showState = this._bodyNodeOriginalState.get(node) ?? 'inherit';\r\n this._bodyNodeOriginalState.delete(node);\r\n } else {\r\n this._hiddenBodyNodeCounts.set(node, count - 1);\r\n }\r\n }\r\n }\r\n\r\n private collectBodyRegionNodes(regions: string[]): SceneNode[] {\r\n const nodes: SceneNode[] = [];\r\n const seen = new Set<SceneNode>();\r\n for (const region of regions) {\r\n for (const node of this._bodyRegions.get(region) ?? []) {\r\n if (!seen.has(node)) {\r\n seen.add(node);\r\n nodes.push(node);\r\n }\r\n }\r\n }\r\n return nodes;\r\n }\r\n\r\n private uniqueNodes(nodes: AvatarBodyRegionTarget[]): SceneNode[] {\r\n return [...new Set(nodes.filter((node): node is SceneNode => !!node))];\r\n }\r\n}\r\n"],"names":["outfitInstanceId","AvatarOutfitInstance","Disposable","id","slot","root","meshes","skinBindings","hiddenBodyRegions","_wardrobe","wardrobe","DRef","map","mesh","onDispose","_releaseInstance","meshRef","dispose","length","AvatarWardrobe","_root","_rig","_slots","_bodyRegions","_equipped","_hiddenBodyNodeCounts","_bodyNodeOriginalState","_modelFetchOptions","options","resolveTargetRig","rig","Map","modelFetchOptions","slots","set","name","nodes","Object","entries","bodyRegions","uniqueNodes","ensureRigRegistered","from","getEquipped","get","values","flatMap","items","equip","source","enforceSlotRules","resolveSource","console","error","scene","meshUses","collectSkinnedMeshes","newBindings","equippedMeshes","bindMode","chooseBindMode","binding","fitMode","use","targetJoints","joints","joint","resolveTargetJoint","jointMap","missing","filter","_","index","join","mappedJoints","inverseBindMatrices","createInverseBindMatrices","SkinBinding","animationSet","skeletons","push","skinBindingName","persistentId","stripSourceSkinBindings","parent","getHiddenBodyRegions","retainBodyRegions","instance","unequip","slotOrInstance","clear","validateOutfit","errors","warnings","missingJoints","unknownRegions","region","has","ok","reduce","sum","includes","indexOf","splice","delete","some","removeSkinBinding","releaseBodyRegions","remove","SkeletonRig","found","findSkeletonRigById","Error","registeredRig","rigs","ref","find","item","bindingRig","slotOptions","allowMultiple","other","exclusiveWith","otherSlot","resourceManager","getEngine","guessMimeType","instantiatePrefab","rootNode","fetchModel","loadAnimations","loadMeshes","loadSkeletons","loadJointDynamics","SharedModel","createSceneNode","VFS","bindings","iterate","node","isMesh","sourceRig","humanoidJointMapping","sourceJoint","mapped","findTargetJointByName","resolveHumanoidTargetJoint","src","dst","findHumanoidMappedJoint","body","leftHand","rightHand","sourceMap","targetMap","key","keys","target","sourceBinding","matrix","Matrix4x4","sourceBindWorld","computeBindWorldMatrices","targetBindWorld","sourceInverseBind","sourceJointBind","worldMatrix","targetJointBind","sourceFinalBind","multiply","invertAffine","cache","jointSet","Set","compute","cached","bindPose","getRigNodeBindPose","local","compose","scale","rotation","position","world","rootJoint","getBindPoseForJoint","rootBindPose","sourceRoot","sourceBindings","sourceBindingSet","sourceRigSet","removeRefs","refs","predicate","i","hideBodyRegions","regions","collectBodyRegionNodes","count","showState","seen","add"],"mappings":"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"}
|