@zephyr3d/scene 0.7.1 → 0.8.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/animation.js +0 -18
- package/dist/animation/animation.js.map +1 -1
- package/dist/animation/animationset.js +200 -3
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/ik/ccd_solver.js +371 -0
- package/dist/animation/ik/ccd_solver.js.map +1 -0
- package/dist/animation/ik/fabrik_solver.js +398 -0
- package/dist/animation/ik/fabrik_solver.js.map +1 -0
- package/dist/animation/ik/ik_angle_constraint.js +181 -0
- package/dist/animation/ik/ik_angle_constraint.js.map +1 -0
- package/dist/animation/ik/ik_chain.js +163 -0
- package/dist/animation/ik/ik_chain.js.map +1 -0
- package/dist/animation/ik/ik_constraint.js +25 -0
- package/dist/animation/ik/ik_constraint.js.map +1 -0
- package/dist/animation/ik/ik_pole_constraint.js +128 -0
- package/dist/animation/ik/ik_pole_constraint.js.map +1 -0
- package/dist/animation/ik/ik_solver.js +48 -0
- package/dist/animation/ik/ik_solver.js.map +1 -0
- package/dist/animation/ik/ik_track.js +96 -0
- package/dist/animation/ik/ik_track.js.map +1 -0
- package/dist/animation/ik/ik_utils.js +191 -0
- package/dist/animation/ik/ik_utils.js.map +1 -0
- package/dist/animation/ik/two_bone_ik_solver.js +331 -0
- package/dist/animation/ik/two_bone_ik_solver.js.map +1 -0
- package/dist/animation/ik_modifier.js +61 -0
- package/dist/animation/ik_modifier.js.map +1 -0
- package/dist/animation/ik_postprocessor.js +71 -0
- package/dist/animation/ik_postprocessor.js.map +1 -0
- package/dist/animation/manual_transform_processor.js +156 -0
- package/dist/animation/manual_transform_processor.js.map +1 -0
- package/dist/animation/skeleton.js +55 -51
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js +38 -0
- package/dist/animation/skeleton_modifier.js.map +1 -0
- package/dist/animation/skeleton_postprocessor.js +50 -0
- package/dist/animation/skeleton_postprocessor.js.map +1 -0
- package/dist/animation/spring/multi_chain_spring_system.js +503 -0
- package/dist/animation/spring/multi_chain_spring_system.js.map +1 -0
- package/dist/animation/spring/spring_bone.js +240 -0
- package/dist/animation/spring/spring_bone.js.map +1 -0
- package/dist/animation/spring/spring_bone_collider.js +198 -0
- package/dist/animation/spring/spring_bone_collider.js.map +1 -0
- package/dist/animation/spring/spring_bone_constraint.js +170 -0
- package/dist/animation/spring/spring_bone_constraint.js.map +1 -0
- package/dist/animation/spring/spring_bone_system.js +328 -0
- package/dist/animation/spring/spring_bone_system.js.map +1 -0
- package/dist/animation/spring/spring_chain.js +103 -0
- package/dist/animation/spring/spring_chain.js.map +1 -0
- package/dist/animation/spring/spring_collider.js +247 -0
- package/dist/animation/spring/spring_collider.js.map +1 -0
- package/dist/animation/spring/spring_constraint.js +21 -0
- package/dist/animation/spring/spring_constraint.js.map +1 -0
- package/dist/animation/spring/spring_particle.js +20 -0
- package/dist/animation/spring/spring_particle.js.map +1 -0
- package/dist/animation/spring/spring_system.js +526 -0
- package/dist/animation/spring/spring_system.js.map +1 -0
- package/dist/animation/spring_modifier.js +45 -0
- package/dist/animation/spring_modifier.js.map +1 -0
- package/dist/animation/spring_postprocessor.js +54 -0
- package/dist/animation/spring_postprocessor.js.map +1 -0
- package/dist/app/screen.js +1 -1
- package/dist/app/screen.js.map +1 -1
- package/dist/asset/model.js +10 -6
- package/dist/asset/model.js.map +1 -1
- package/dist/camera/perspectivecamera.js +3 -3
- package/dist/camera/perspectivecamera.js.map +1 -1
- package/dist/index.d.ts +1400 -4
- package/dist/index.js +16 -0
- package/dist/index.js.map +1 -1
- package/dist/material/mixins/lightmodel/blinnphong.js +66 -4
- package/dist/material/mixins/lightmodel/blinnphong.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +20 -17
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/shader/helper.js +5 -3
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/render/gpu_picking.js +100 -0
- package/dist/render/gpu_picking.js.map +1 -0
- package/dist/render/rendergraph/device_pool_allocator.js +41 -0
- package/dist/render/rendergraph/device_pool_allocator.js.map +1 -0
- package/dist/render/rendergraph/executor.js +146 -0
- package/dist/render/rendergraph/executor.js.map +1 -0
- package/dist/render/rendergraph/forward_plus_builder.js +414 -0
- package/dist/render/rendergraph/forward_plus_builder.js.map +1 -0
- package/dist/render/rendergraph/rendergraph.js +306 -0
- package/dist/render/rendergraph/rendergraph.js.map +1 -0
- package/dist/render/rendergraph/types.js +57 -0
- package/dist/render/rendergraph/types.js.map +1 -0
- package/dist/render/sky_motion_vector.js +85 -0
- package/dist/render/sky_motion_vector.js.map +1 -0
- package/dist/scene/mesh.js +15 -23
- package/dist/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +24 -23
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +62 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +1 -1
- package/package.json +3 -3
- 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/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
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spring_modifier.js","sources":["../../src/animation/spring_modifier.ts"],"sourcesContent":["import { SkeletonModifier } from './skeleton_modifier';\r\nimport type { Skeleton } from './skeleton';\r\nimport type { SpringSystem } from './spring/spring_system';\r\n\r\n/**\r\n * Post-processor wrapper for spring physics systems.\r\n *\r\n * Integrates spring-based physics simulation into the skeleton post-processing pipeline.\r\n * The spring system is updated each frame and results are blended with the base animation.\r\n *\r\n * @public\r\n */\r\nexport class SpringModifier extends SkeletonModifier {\r\n private _springSystem: SpringSystem;\r\n\r\n /**\r\n * Create a spring post-processor.\r\n *\r\n * @param springSystem - The spring system to integrate\r\n * @param weight - Blend weight [0-1] (default: 1.0)\r\n */\r\n constructor(springSystem: SpringSystem, weight: number = 1.0) {\r\n super(weight);\r\n this._springSystem = springSystem;\r\n }\r\n\r\n /**\r\n * Get the spring system.\r\n */\r\n get springSystem(): SpringSystem {\r\n return this._springSystem;\r\n }\r\n\r\n /**\r\n * Apply spring physics to skeleton joints.\r\n */\r\n apply(_skeleton: Skeleton, deltaTime: number): void {\r\n if (!this._enabled || this._weight <= 0) {\r\n return;\r\n }\r\n\r\n // Update spring physics simulation\r\n this._springSystem.update(deltaTime);\r\n\r\n // Apply results to scene nodes with blending\r\n this._springSystem.applyToNodes(this._weight);\r\n }\r\n\r\n /**\r\n * Reset the spring system to initial state.\r\n */\r\n reset(): void {\r\n this._springSystem.reset();\r\n }\r\n}\r\n"],"names":["SpringModifier","SkeletonModifier","_springSystem","springSystem","weight","apply","_skeleton","deltaTime","_enabled","_weight","update","applyToNodes","reset"],"mappings":";;AAIA;;;;;;;IAQO,MAAMA,cAAuBC,SAAAA,gBAAAA,CAAAA;IAC1BC,aAA4B;AAEpC;;;;;AAKC,MACD,WAAYC,CAAAA,YAA0B,EAAEC,MAAAA,GAAiB,GAAG,CAAE;AAC5D,QAAA,KAAK,CAACA,MAAAA,CAAAA;QACN,IAAI,CAACF,aAAa,GAAGC,YAAAA;AACvB;AAEA;;AAEC,MACD,IAAIA,YAA6B,GAAA;QAC/B,OAAO,IAAI,CAACD,aAAa;AAC3B;AAEA;;AAEC,MACDG,KAAMC,CAAAA,SAAmB,EAAEC,SAAiB,EAAQ;QAClD,IAAI,CAAC,IAAI,CAACC,QAAQ,IAAI,IAAI,CAACC,OAAO,IAAI,CAAG,EAAA;AACvC,YAAA;AACF;;AAGA,QAAA,IAAI,CAACP,aAAa,CAACQ,MAAM,CAACH,SAAAA,CAAAA;;AAG1B,QAAA,IAAI,CAACL,aAAa,CAACS,YAAY,CAAC,IAAI,CAACF,OAAO,CAAA;AAC9C;AAEA;;AAEC,MACDG,KAAc,GAAA;QACZ,IAAI,CAACV,aAAa,CAACU,KAAK,EAAA;AAC1B;AACF;;;;"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { SkeletonPostProcessor } from './skeleton_postprocessor.js';
|
|
2
|
+
|
|
3
|
+
/**
|
|
4
|
+
* Post-processor wrapper for spring physics systems.
|
|
5
|
+
*
|
|
6
|
+
* Integrates spring-based physics simulation into the skeleton post-processing pipeline.
|
|
7
|
+
* The spring system is updated each frame and results are blended with the base animation.
|
|
8
|
+
*
|
|
9
|
+
* @example
|
|
10
|
+
* ```typescript
|
|
11
|
+
* const springChain = new SpringChain([joint1, joint2, joint3]);
|
|
12
|
+
* const springSystem = new SpringSystem(springChain);
|
|
13
|
+
* const processor = new SpringPostProcessor(springSystem, 1.0);
|
|
14
|
+
* skeleton.addPostProcessor(processor);
|
|
15
|
+
* ```
|
|
16
|
+
*
|
|
17
|
+
* @public
|
|
18
|
+
*/ class SpringPostProcessor extends SkeletonPostProcessor {
|
|
19
|
+
_springSystem;
|
|
20
|
+
/**
|
|
21
|
+
* Create a spring post-processor.
|
|
22
|
+
*
|
|
23
|
+
* @param springSystem - The spring system to integrate
|
|
24
|
+
* @param weight - Blend weight [0-1] (default: 1.0)
|
|
25
|
+
* @param priority - Priority for ordering (default: 50)
|
|
26
|
+
*/ constructor(springSystem, weight = 1.0, priority = 50){
|
|
27
|
+
super(weight, priority);
|
|
28
|
+
this._springSystem = springSystem;
|
|
29
|
+
}
|
|
30
|
+
/**
|
|
31
|
+
* Get the spring system.
|
|
32
|
+
*/ get springSystem() {
|
|
33
|
+
return this._springSystem;
|
|
34
|
+
}
|
|
35
|
+
/**
|
|
36
|
+
* Apply spring physics to skeleton joints.
|
|
37
|
+
*/ apply(_skeleton, deltaTime) {
|
|
38
|
+
if (!this._enabled || this._weight <= 0) {
|
|
39
|
+
return;
|
|
40
|
+
}
|
|
41
|
+
// Update spring physics simulation
|
|
42
|
+
this._springSystem.update(deltaTime);
|
|
43
|
+
// Apply results to scene nodes with blending
|
|
44
|
+
this._springSystem.applyToNodes(this._weight);
|
|
45
|
+
}
|
|
46
|
+
/**
|
|
47
|
+
* Reset the spring system to initial state.
|
|
48
|
+
*/ reset() {
|
|
49
|
+
this._springSystem.reset();
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
export { SpringPostProcessor };
|
|
54
|
+
//# sourceMappingURL=spring_postprocessor.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"spring_postprocessor.js","sources":["../../src/animation/spring_postprocessor.ts"],"sourcesContent":["import { SkeletonPostProcessor } from './skeleton_postprocessor';\r\nimport type { Skeleton } from './skeleton';\r\nimport type { SpringSystem } from './spring/spring_system';\r\n\r\n/**\r\n * Post-processor wrapper for spring physics systems.\r\n *\r\n * Integrates spring-based physics simulation into the skeleton post-processing pipeline.\r\n * The spring system is updated each frame and results are blended with the base animation.\r\n *\r\n * @example\r\n * ```typescript\r\n * const springChain = new SpringChain([joint1, joint2, joint3]);\r\n * const springSystem = new SpringSystem(springChain);\r\n * const processor = new SpringPostProcessor(springSystem, 1.0);\r\n * skeleton.addPostProcessor(processor);\r\n * ```\r\n *\r\n * @public\r\n */\r\nexport class SpringPostProcessor extends SkeletonPostProcessor {\r\n private _springSystem: SpringSystem;\r\n\r\n /**\r\n * Create a spring post-processor.\r\n *\r\n * @param springSystem - The spring system to integrate\r\n * @param weight - Blend weight [0-1] (default: 1.0)\r\n * @param priority - Priority for ordering (default: 50)\r\n */\r\n constructor(springSystem: SpringSystem, weight: number = 1.0, priority: number = 50) {\r\n super(weight, priority);\r\n this._springSystem = springSystem;\r\n }\r\n\r\n /**\r\n * Get the spring system.\r\n */\r\n get springSystem(): SpringSystem {\r\n return this._springSystem;\r\n }\r\n\r\n /**\r\n * Apply spring physics to skeleton joints.\r\n */\r\n apply(_skeleton: Skeleton, deltaTime: number): void {\r\n if (!this._enabled || this._weight <= 0) {\r\n return;\r\n }\r\n\r\n // Update spring physics simulation\r\n this._springSystem.update(deltaTime);\r\n\r\n // Apply results to scene nodes with blending\r\n this._springSystem.applyToNodes(this._weight);\r\n }\r\n\r\n /**\r\n * Reset the spring system to initial state.\r\n */\r\n reset(): void {\r\n this._springSystem.reset();\r\n }\r\n}\r\n"],"names":["SpringPostProcessor","SkeletonPostProcessor","_springSystem","springSystem","weight","priority","apply","_skeleton","deltaTime","_enabled","_weight","update","applyToNodes","reset"],"mappings":";;AAIA;;;;;;;;;;;;;;;IAgBO,MAAMA,mBAA4BC,SAAAA,qBAAAA,CAAAA;IAC/BC,aAA4B;AAEpC;;;;;;MAOA,WAAA,CAAYC,YAA0B,EAAEC,MAAAA,GAAiB,GAAG,EAAEC,QAAAA,GAAmB,EAAE,CAAE;AACnF,QAAA,KAAK,CAACD,MAAQC,EAAAA,QAAAA,CAAAA;QACd,IAAI,CAACH,aAAa,GAAGC,YAAAA;AACvB;AAEA;;AAEC,MACD,IAAIA,YAA6B,GAAA;QAC/B,OAAO,IAAI,CAACD,aAAa;AAC3B;AAEA;;AAEC,MACDI,KAAMC,CAAAA,SAAmB,EAAEC,SAAiB,EAAQ;QAClD,IAAI,CAAC,IAAI,CAACC,QAAQ,IAAI,IAAI,CAACC,OAAO,IAAI,CAAG,EAAA;AACvC,YAAA;AACF;;AAGA,QAAA,IAAI,CAACR,aAAa,CAACS,MAAM,CAACH,SAAAA,CAAAA;;AAG1B,QAAA,IAAI,CAACN,aAAa,CAACU,YAAY,CAAC,IAAI,CAACF,OAAO,CAAA;AAC9C;AAEA;;AAEC,MACDG,KAAc,GAAA;QACZ,IAAI,CAACX,aAAa,CAACW,KAAK,EAAA;AAC1B;AACF;;;;"}
|
package/dist/app/screen.js
CHANGED
|
@@ -299,7 +299,7 @@ import { getDevice } from './api.js';
|
|
|
299
299
|
device.deviceXToScreen(device.getDrawingBufferWidth()),
|
|
300
300
|
device.deviceYToScreen(device.getDrawingBufferHeight())
|
|
301
301
|
];
|
|
302
|
-
if (
|
|
302
|
+
if (this._resolvedViewport !== vp) {
|
|
303
303
|
this._resolvedViewport = vp;
|
|
304
304
|
this._version++;
|
|
305
305
|
this._transform = null;
|
package/dist/app/screen.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"screen.js","sources":["../../src/app/screen.ts"],"sourcesContent":["import type { Immutable, Nullable, Rect } from '@zephyr3d/base';\r\nimport { Vector2 } from '@zephyr3d/base';\r\nimport { getDevice } from './api';\r\n\r\n/**\r\n * Scaling mode used to adapt the design resolution to the viewport.\r\n *\r\n * - 'fit' – Preserve aspect ratio, show whole design area, may add letterboxing (black bars).\r\n * - 'fit-width' – Match viewport width exactly; height follows aspect ratio (may crop or letterbox vertically).\r\n * - 'fit-height' – Match viewport height exactly; width follows aspect ratio (may crop or letterbox horizontall\r\n * - 'cover' – Preserve aspect ratio, fill the entire viewport, design area may be cropped.\r\n * - 'stretch' – Do not preserve aspect ratio, stretch to fill the viewport.\r\n *\r\n * @public\r\n */\r\nexport type ScreenScaleMode = 'fit' | 'fit-width' | 'fit-height' | 'cover' | 'stretch';\r\n\r\n/**\r\n * Screen adapter configuration\r\n *\r\n * @public\r\n */\r\nexport type ScreenConfig = {\r\n /** Logical width in the design resolution coordinate system. */\r\n designWidth: number;\r\n /** Logical height in the design resolution coordinate system. */\r\n designHeight: number;\r\n /** Scaling mode used to adapt the design resolution to the viewport. */\r\n scaleMode: ScreenScaleMode;\r\n};\r\n\r\n/**\r\n * Parameters used to describe a 2D affine transform in the form:\r\n *\r\n * outX = inX * scaleX + offsetX\r\n * outY = inY * scaleY + offsetY\r\n */\r\nexport type PointTransform = {\r\n scaleX: number;\r\n scaleY: number;\r\n offsetX: number;\r\n offsetY: number;\r\n};\r\n\r\n/**\r\n * Resolution transform information derived from a {@link ScreenConfig}\r\n * and a concrete viewport rectangle.\r\n */\r\nexport type ResolutionTransform = {\r\n /**\r\n * X position of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportX: number;\r\n /**\r\n * Y position of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportY: number;\r\n /**\r\n * Width of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportWidth: number;\r\n /**\r\n * Height of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportHeight: number;\r\n /**\r\n * Visible part of the adjusted viewport, i.e. intersection with original viewport.\r\n **/\r\n croppedViewport: Rect;\r\n /**\r\n * Transform from canvas coordinates to the adjusted viewport's local coordinates.\r\n *\r\n * Typically used to convert mouse / pointer positions into the active rendering region.\r\n */\r\n canvasToViewport: PointTransform;\r\n /**\r\n * Transform from canvas coordinates to logical coordinates in the\r\n * design resolution space.\r\n *\r\n * Typically used for UI editing and interaction, so that logic consistently\r\n * works in designWidth × designHeight space.\r\n */\r\n canvasToLogic: PointTransform;\r\n};\r\n\r\n/**\r\n * Adapts a given physical viewport to a logical design resolution,\r\n * and provides coordinate transforms between canvas and logical spaces.\r\n *\r\n * @public\r\n */\r\nexport class ScreenAdapter {\r\n private _config!: ScreenConfig;\r\n private _transform: Nullable<ResolutionTransform>;\r\n private _viewport: Nullable<Immutable<number[]>>;\r\n private _resolvedViewport: Nullable<Immutable<number[]>>;\r\n private _version: number;\r\n /**\r\n * Creates a new {@link ScreenAdapter}.\r\n *\r\n * @param config - Optional initial screen configuration. If omitted,\r\n * a default of 1280×720 with 'cover' mode is used.\r\n */\r\n constructor(config?: Immutable<ScreenConfig>) {\r\n this._viewport = null;\r\n this._transform = null;\r\n this._resolvedViewport = null;\r\n this._version = 1;\r\n this._config = { ...this.getDefaultConfig(), ...config };\r\n }\r\n /**\r\n * Returns the current design resolution configuration.\r\n */\r\n get config(): Immutable<ScreenConfig> {\r\n return this._config;\r\n }\r\n set config(config: Immutable<ScreenConfig>) {\r\n this._config = { ...this.getDefaultConfig(), ...config };\r\n this._transform = null;\r\n this._version++;\r\n }\r\n /**\r\n * Returns the viewport of the screen\r\n */\r\n get viewport(): Nullable<Immutable<number[]>> {\r\n return this._viewport;\r\n }\r\n set viewport(vp: Nullable<Immutable<number[]>>) {\r\n if (this._viewport !== vp) {\r\n this._viewport = vp?.slice() ?? null;\r\n this.resolveViewport();\r\n }\r\n }\r\n /**\r\n * Returns the version of the screen adapter\r\n */\r\n get version() {\r\n this.resolveViewport();\r\n return this._version;\r\n }\r\n /**\r\n * Returns the calculated resolution transform\r\n */\r\n get transform(): Immutable<ResolutionTransform> {\r\n this.resolveViewport();\r\n if (!this._transform) {\r\n this._transform = this.calculateResolutionTransform(\r\n this._resolvedViewport![0],\r\n this._resolvedViewport![1],\r\n this._resolvedViewport![2],\r\n this._resolvedViewport![3]\r\n );\r\n }\r\n return this._transform;\r\n }\r\n /**\r\n * Computes the resolution transform for a given viewport in canvas coordinates.\r\n *\r\n * @param viewportX - X position of the provided viewport (CSS pixels).\r\n * @param viewportY - Y position of the provided viewport (CSS pixels).\r\n * @param viewportWidth - Width of the provided viewport (CSS pixels).\r\n * @param viewportHeight - Height of the provided viewport (CSS pixels).\r\n * @returns A {@link ResolutionTransform} describing the adjusted viewport\r\n * and coordinate transforms. If any dimension is non-positive, a\r\n * transform with zero-sized viewport and identity-like transforms is returned.\r\n */\r\n calculateResolutionTransform(\r\n viewportX: number,\r\n viewportY: number,\r\n viewportWidth: number,\r\n viewportHeight: number\r\n ) {\r\n const { designWidth, designHeight, scaleMode } = this._config;\r\n\r\n // Guard against invalid dimensions.\r\n if (viewportWidth <= 0 || viewportHeight <= 0 || designWidth <= 0 || designHeight <= 0) {\r\n return {\r\n viewportX,\r\n viewportY,\r\n viewportWidth: 0,\r\n viewportHeight: 0,\r\n croppedViewport: { x: viewportX, y: viewportY, width: 0, height: 0 },\r\n canvasToViewport: { scaleX: 1, scaleY: 1, offsetX: 0, offsetY: 0 },\r\n canvasToLogic: { scaleX: 1, scaleY: 1, offsetX: 0, offsetY: 0 }\r\n };\r\n }\r\n\r\n const sx = viewportWidth / designWidth;\r\n const sy = viewportHeight / designHeight;\r\n\r\n let scaleX = 1;\r\n let scaleY = 1;\r\n let finalViewportWidth = viewportWidth;\r\n let finalViewportHeight = viewportHeight;\r\n let finalViewportX = viewportX;\r\n let finalViewportY = viewportY;\r\n\r\n switch (scaleMode) {\r\n case 'fit': {\r\n // Uniform scale, entire design area visible, may add letterboxing.\r\n const s = Math.min(sx, sy);\r\n scaleX = scaleY = s;\r\n finalViewportWidth = designWidth * s;\r\n finalViewportHeight = designHeight * s;\r\n finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;\r\n finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;\r\n break;\r\n }\r\n case 'cover': {\r\n // Uniform scale, viewport fully covered, design area may be cropped.\r\n const s = Math.max(sx, sy);\r\n scaleX = scaleY = s;\r\n finalViewportWidth = designWidth * s;\r\n finalViewportHeight = designHeight * s;\r\n finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;\r\n finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;\r\n break;\r\n }\r\n case 'stretch': {\r\n // Non-uniform scale, stretch to fill the viewport.\r\n scaleX = sx;\r\n scaleY = sy;\r\n finalViewportWidth = viewportWidth;\r\n finalViewportHeight = viewportHeight;\r\n finalViewportX = viewportX;\r\n finalViewportY = viewportY;\r\n break;\r\n }\r\n case 'fit-width': {\r\n // Match width exactly; height follows aspect ratio.\r\n const s = sx; // width-driven\r\n scaleX = scaleY = s;\r\n finalViewportWidth = designWidth * s; // == viewportWidth\r\n finalViewportHeight = designHeight * s; // may be > or < viewportHeight\r\n finalViewportX = viewportX;\r\n finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;\r\n break;\r\n }\r\n case 'fit-height': {\r\n // Match height exactly; width follows aspect ratio.\r\n const s = sy; // height-driven\r\n scaleX = scaleY = s;\r\n finalViewportHeight = designHeight * s; // == viewportHeight\r\n finalViewportWidth = designWidth * s; // may be > or < viewportWidth\r\n finalViewportY = viewportY;\r\n finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;\r\n break;\r\n }\r\n }\r\n\r\n // calculate cropped viewport\r\n const adjLeft = finalViewportX;\r\n const adjTop = finalViewportY;\r\n const adjRight = finalViewportX + finalViewportWidth;\r\n const adjBottom = finalViewportY + finalViewportHeight;\r\n\r\n const rawLeft = viewportX;\r\n const rawTop = viewportY;\r\n const rawRight = viewportX + viewportWidth;\r\n const rawBottom = viewportY + viewportHeight;\r\n\r\n const cropLeft = Math.max(adjLeft, rawLeft);\r\n const cropTop = Math.max(adjTop, rawTop);\r\n const cropRight = Math.min(adjRight, rawRight);\r\n const cropBottom = Math.min(adjBottom, rawBottom);\r\n\r\n let croppedViewport: Rect;\r\n if (cropRight <= cropLeft || cropBottom <= cropTop) {\r\n // No intersection\r\n croppedViewport = {\r\n x: viewportX,\r\n y: viewportY,\r\n width: 0,\r\n height: 0\r\n };\r\n } else {\r\n croppedViewport = {\r\n x: cropLeft,\r\n y: cropTop,\r\n width: cropRight - cropLeft,\r\n height: cropBottom - cropTop\r\n };\r\n }\r\n\r\n // Transform: canvas -> viewport-local\r\n // viewportLocalX = canvasX - finalViewportX\r\n // viewportLocalY = canvasY - finalViewportY\r\n const canvasToViewport: PointTransform = {\r\n scaleX: 1,\r\n scaleY: 1,\r\n offsetX: -finalViewportX,\r\n offsetY: -finalViewportY\r\n };\r\n\r\n // Transform: canvas -> logic (design space)\r\n //\r\n // canvas -> viewport-local:\r\n // vx = canvasX - finalViewportX\r\n // vy = canvasY - finalViewportY\r\n //\r\n // viewport-local -> logic:\r\n // logicX = vx / scaleX\r\n // logicY = vy / scaleY\r\n //\r\n // Combined:\r\n // logicX = (canvasX - finalViewportX) / scaleX\r\n // = (1 / scaleX) * canvasX + (-finalViewportX / scaleX)\r\n // logicY = (canvasY - finalViewportY) / scaleY\r\n // = (1 / scaleY) * canvasY + (-finalViewportY / scaleY)\r\n const canvasToLogic: PointTransform = {\r\n scaleX: 1 / scaleX,\r\n scaleY: 1 / scaleY,\r\n offsetX: -finalViewportX / scaleX,\r\n offsetY: -finalViewportY / scaleY\r\n };\r\n\r\n return {\r\n viewportX: finalViewportX,\r\n viewportY: finalViewportY,\r\n viewportWidth: finalViewportWidth,\r\n viewportHeight: finalViewportHeight,\r\n croppedViewport,\r\n canvasToViewport,\r\n canvasToLogic\r\n };\r\n }\r\n /**\r\n * Converts canvas coordinates into adjusted viewport-local coordinates.\r\n *\r\n * @remarks\r\n * This is mainly intended for picking / hit testing within the active\r\n * rendering region, where (0, 0) corresponds to the top-left of the\r\n * adapted viewport.\r\n *\r\n * @param canvasPos - Point in canvas coordinates (CSS pixels).\r\n * @param viewportPosOut - Optional output vector. If provided, it will be\r\n * written into and returned; otherwise a new {@link Vector2} is allocated.\r\n * @returns The point in viewport-local coordinates.\r\n */\r\n canvasPosToViewport(canvasPos: Vector2, viewportPosOut?: Vector2) {\r\n return this.transformPoint(this.transform.canvasToViewport, canvasPos, viewportPosOut);\r\n }\r\n /**\r\n * Converts canvas coordinates into logical coordinates in the design\r\n * resolution space.\r\n *\r\n * @remarks\r\n * This is mainly intended for UI editing and interaction, so that logic\r\n * works consistently in the designWidth × designHeight coordinate system.\r\n *\r\n * @param canvasPos - Point in canvas coordinates (CSS pixels).\r\n * @param logicPosOut - Optional output vector. If provided, it will be\r\n * written into and returned; otherwise a new {@link Vector2} is allocated.\r\n * @returns The point in logical (design resolution) coordinates.\r\n */\r\n canvasPosToLogic(canvasPos: Vector2, logicPosOut?: Vector2) {\r\n return this.transformPoint(this.transform.canvasToLogic, canvasPos, logicPosOut);\r\n }\r\n /**\r\n * Applies a 2D affine transform to a point.\r\n *\r\n * The transform is applied as:\r\n *\r\n * out.x = in.x * scaleX + offsetX\r\n * out.y = in.y * scaleY + offsetY\r\n *\r\n * @param transform - Transform parameters (scale and offset).\r\n * @param pointIn - Input point.\r\n * @param pointOut - Optional output vector. If provided, it will be\r\n * written into and returned; otherwise a new {@link Vector2} is allocated.\r\n * @returns The transformed point.\r\n */\r\n transformPoint(transform: PointTransform, pointIn: Vector2, pointOut?: Vector2) {\r\n const out = pointOut ?? new Vector2();\r\n out.x = pointIn.x * transform.scaleX + transform.offsetX;\r\n out.y = pointIn.y * transform.scaleY + transform.offsetY;\r\n return out;\r\n }\r\n /**\r\n * Resolves the current viewport, updating internal state as needed.\r\n */\r\n resolveViewport() {\r\n const device = getDevice();\r\n const vp = this._viewport?.slice() ?? [\r\n 0,\r\n 0,\r\n device.deviceXToScreen(device.getDrawingBufferWidth()),\r\n device.deviceYToScreen(device.getDrawingBufferHeight())\r\n ];\r\n if (\r\n !this._resolvedViewport ||\r\n vp[0] !== this._resolvedViewport[0] ||\r\n vp[1] !== this._resolvedViewport[1] ||\r\n vp[2] !== this._resolvedViewport[2] ||\r\n vp[3] !== this._resolvedViewport[3]\r\n ) {\r\n this._resolvedViewport = vp;\r\n this._version++;\r\n this._transform = null;\r\n }\r\n }\r\n private getDefaultConfig(): ScreenConfig {\r\n return {\r\n designWidth: 1280,\r\n designHeight: 720,\r\n scaleMode: 'cover'\r\n };\r\n }\r\n}\r\n"],"names":["ScreenAdapter","_config","_transform","_viewport","_resolvedViewport","_version","config","getDefaultConfig","viewport","vp","slice","resolveViewport","version","transform","calculateResolutionTransform","viewportX","viewportY","viewportWidth","viewportHeight","designWidth","designHeight","scaleMode","croppedViewport","x","y","width","height","canvasToViewport","scaleX","scaleY","offsetX","offsetY","canvasToLogic","sx","sy","finalViewportWidth","finalViewportHeight","finalViewportX","finalViewportY","s","Math","min","max","adjLeft","adjTop","adjRight","adjBottom","rawLeft","rawTop","rawRight","rawBottom","cropLeft","cropTop","cropRight","cropBottom","canvasPosToViewport","canvasPos","viewportPosOut","transformPoint","canvasPosToLogic","logicPosOut","pointIn","pointOut","out","Vector2","device","getDevice","deviceXToScreen","getDrawingBufferWidth","deviceYToScreen","getDrawingBufferHeight"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"screen.js","sources":["../../src/app/screen.ts"],"sourcesContent":["import type { Immutable, Nullable, Rect } from '@zephyr3d/base';\r\nimport { Vector2 } from '@zephyr3d/base';\r\nimport { getDevice } from './api';\r\n\r\n/**\r\n * Scaling mode used to adapt the design resolution to the viewport.\r\n *\r\n * - 'fit' – Preserve aspect ratio, show whole design area, may add letterboxing (black bars).\r\n * - 'fit-width' – Match viewport width exactly; height follows aspect ratio (may crop or letterbox vertically).\r\n * - 'fit-height' – Match viewport height exactly; width follows aspect ratio (may crop or letterbox horizontall\r\n * - 'cover' – Preserve aspect ratio, fill the entire viewport, design area may be cropped.\r\n * - 'stretch' – Do not preserve aspect ratio, stretch to fill the viewport.\r\n *\r\n * @public\r\n */\r\nexport type ScreenScaleMode = 'fit' | 'fit-width' | 'fit-height' | 'cover' | 'stretch';\r\n\r\n/**\r\n * Screen adapter configuration\r\n *\r\n * @public\r\n */\r\nexport type ScreenConfig = {\r\n /** Logical width in the design resolution coordinate system. */\r\n designWidth: number;\r\n /** Logical height in the design resolution coordinate system. */\r\n designHeight: number;\r\n /** Scaling mode used to adapt the design resolution to the viewport. */\r\n scaleMode: ScreenScaleMode;\r\n};\r\n\r\n/**\r\n * Parameters used to describe a 2D affine transform in the form:\r\n *\r\n * outX = inX * scaleX + offsetX\r\n * outY = inY * scaleY + offsetY\r\n */\r\nexport type PointTransform = {\r\n scaleX: number;\r\n scaleY: number;\r\n offsetX: number;\r\n offsetY: number;\r\n};\r\n\r\n/**\r\n * Resolution transform information derived from a {@link ScreenConfig}\r\n * and a concrete viewport rectangle.\r\n */\r\nexport type ResolutionTransform = {\r\n /**\r\n * X position of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportX: number;\r\n /**\r\n * Y position of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportY: number;\r\n /**\r\n * Width of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportWidth: number;\r\n /**\r\n * Height of the adjusted viewport in canvas coordinates (CSS pixels).\r\n */\r\n viewportHeight: number;\r\n /**\r\n * Visible part of the adjusted viewport, i.e. intersection with original viewport.\r\n **/\r\n croppedViewport: Rect;\r\n /**\r\n * Transform from canvas coordinates to the adjusted viewport's local coordinates.\r\n *\r\n * Typically used to convert mouse / pointer positions into the active rendering region.\r\n */\r\n canvasToViewport: PointTransform;\r\n /**\r\n * Transform from canvas coordinates to logical coordinates in the\r\n * design resolution space.\r\n *\r\n * Typically used for UI editing and interaction, so that logic consistently\r\n * works in designWidth × designHeight space.\r\n */\r\n canvasToLogic: PointTransform;\r\n};\r\n\r\n/**\r\n * Adapts a given physical viewport to a logical design resolution,\r\n * and provides coordinate transforms between canvas and logical spaces.\r\n *\r\n * @public\r\n */\r\nexport class ScreenAdapter {\r\n private _config!: ScreenConfig;\r\n private _transform: Nullable<ResolutionTransform>;\r\n private _viewport: Nullable<Immutable<number[]>>;\r\n private _resolvedViewport: Nullable<Immutable<number[]>>;\r\n private _version: number;\r\n /**\r\n * Creates a new {@link ScreenAdapter}.\r\n *\r\n * @param config - Optional initial screen configuration. If omitted,\r\n * a default of 1280×720 with 'cover' mode is used.\r\n */\r\n constructor(config?: Immutable<ScreenConfig>) {\r\n this._viewport = null;\r\n this._transform = null;\r\n this._resolvedViewport = null;\r\n this._version = 1;\r\n this._config = { ...this.getDefaultConfig(), ...config };\r\n }\r\n /**\r\n * Returns the current design resolution configuration.\r\n */\r\n get config(): Immutable<ScreenConfig> {\r\n return this._config;\r\n }\r\n set config(config: Immutable<ScreenConfig>) {\r\n this._config = { ...this.getDefaultConfig(), ...config };\r\n this._transform = null;\r\n this._version++;\r\n }\r\n /**\r\n * Returns the viewport of the screen\r\n */\r\n get viewport(): Nullable<Immutable<number[]>> {\r\n return this._viewport;\r\n }\r\n set viewport(vp: Nullable<Immutable<number[]>>) {\r\n if (this._viewport !== vp) {\r\n this._viewport = vp?.slice() ?? null;\r\n this.resolveViewport();\r\n }\r\n }\r\n /**\r\n * Returns the version of the screen adapter\r\n */\r\n get version() {\r\n this.resolveViewport();\r\n return this._version;\r\n }\r\n /**\r\n * Returns the calculated resolution transform\r\n */\r\n get transform(): Immutable<ResolutionTransform> {\r\n this.resolveViewport();\r\n if (!this._transform) {\r\n this._transform = this.calculateResolutionTransform(\r\n this._resolvedViewport![0],\r\n this._resolvedViewport![1],\r\n this._resolvedViewport![2],\r\n this._resolvedViewport![3]\r\n );\r\n }\r\n return this._transform;\r\n }\r\n /**\r\n * Computes the resolution transform for a given viewport in canvas coordinates.\r\n *\r\n * @param viewportX - X position of the provided viewport (CSS pixels).\r\n * @param viewportY - Y position of the provided viewport (CSS pixels).\r\n * @param viewportWidth - Width of the provided viewport (CSS pixels).\r\n * @param viewportHeight - Height of the provided viewport (CSS pixels).\r\n * @returns A {@link ResolutionTransform} describing the adjusted viewport\r\n * and coordinate transforms. If any dimension is non-positive, a\r\n * transform with zero-sized viewport and identity-like transforms is returned.\r\n */\r\n calculateResolutionTransform(\r\n viewportX: number,\r\n viewportY: number,\r\n viewportWidth: number,\r\n viewportHeight: number\r\n ) {\r\n const { designWidth, designHeight, scaleMode } = this._config;\r\n\r\n // Guard against invalid dimensions.\r\n if (viewportWidth <= 0 || viewportHeight <= 0 || designWidth <= 0 || designHeight <= 0) {\r\n return {\r\n viewportX,\r\n viewportY,\r\n viewportWidth: 0,\r\n viewportHeight: 0,\r\n croppedViewport: { x: viewportX, y: viewportY, width: 0, height: 0 },\r\n canvasToViewport: { scaleX: 1, scaleY: 1, offsetX: 0, offsetY: 0 },\r\n canvasToLogic: { scaleX: 1, scaleY: 1, offsetX: 0, offsetY: 0 }\r\n };\r\n }\r\n\r\n const sx = viewportWidth / designWidth;\r\n const sy = viewportHeight / designHeight;\r\n\r\n let scaleX = 1;\r\n let scaleY = 1;\r\n let finalViewportWidth = viewportWidth;\r\n let finalViewportHeight = viewportHeight;\r\n let finalViewportX = viewportX;\r\n let finalViewportY = viewportY;\r\n\r\n switch (scaleMode) {\r\n case 'fit': {\r\n // Uniform scale, entire design area visible, may add letterboxing.\r\n const s = Math.min(sx, sy);\r\n scaleX = scaleY = s;\r\n finalViewportWidth = designWidth * s;\r\n finalViewportHeight = designHeight * s;\r\n finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;\r\n finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;\r\n break;\r\n }\r\n case 'cover': {\r\n // Uniform scale, viewport fully covered, design area may be cropped.\r\n const s = Math.max(sx, sy);\r\n scaleX = scaleY = s;\r\n finalViewportWidth = designWidth * s;\r\n finalViewportHeight = designHeight * s;\r\n finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;\r\n finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;\r\n break;\r\n }\r\n case 'stretch': {\r\n // Non-uniform scale, stretch to fill the viewport.\r\n scaleX = sx;\r\n scaleY = sy;\r\n finalViewportWidth = viewportWidth;\r\n finalViewportHeight = viewportHeight;\r\n finalViewportX = viewportX;\r\n finalViewportY = viewportY;\r\n break;\r\n }\r\n case 'fit-width': {\r\n // Match width exactly; height follows aspect ratio.\r\n const s = sx; // width-driven\r\n scaleX = scaleY = s;\r\n finalViewportWidth = designWidth * s; // == viewportWidth\r\n finalViewportHeight = designHeight * s; // may be > or < viewportHeight\r\n finalViewportX = viewportX;\r\n finalViewportY = viewportY + (viewportHeight - finalViewportHeight) * 0.5;\r\n break;\r\n }\r\n case 'fit-height': {\r\n // Match height exactly; width follows aspect ratio.\r\n const s = sy; // height-driven\r\n scaleX = scaleY = s;\r\n finalViewportHeight = designHeight * s; // == viewportHeight\r\n finalViewportWidth = designWidth * s; // may be > or < viewportWidth\r\n finalViewportY = viewportY;\r\n finalViewportX = viewportX + (viewportWidth - finalViewportWidth) * 0.5;\r\n break;\r\n }\r\n }\r\n\r\n // calculate cropped viewport\r\n const adjLeft = finalViewportX;\r\n const adjTop = finalViewportY;\r\n const adjRight = finalViewportX + finalViewportWidth;\r\n const adjBottom = finalViewportY + finalViewportHeight;\r\n\r\n const rawLeft = viewportX;\r\n const rawTop = viewportY;\r\n const rawRight = viewportX + viewportWidth;\r\n const rawBottom = viewportY + viewportHeight;\r\n\r\n const cropLeft = Math.max(adjLeft, rawLeft);\r\n const cropTop = Math.max(adjTop, rawTop);\r\n const cropRight = Math.min(adjRight, rawRight);\r\n const cropBottom = Math.min(adjBottom, rawBottom);\r\n\r\n let croppedViewport: Rect;\r\n if (cropRight <= cropLeft || cropBottom <= cropTop) {\r\n // No intersection\r\n croppedViewport = {\r\n x: viewportX,\r\n y: viewportY,\r\n width: 0,\r\n height: 0\r\n };\r\n } else {\r\n croppedViewport = {\r\n x: cropLeft,\r\n y: cropTop,\r\n width: cropRight - cropLeft,\r\n height: cropBottom - cropTop\r\n };\r\n }\r\n\r\n // Transform: canvas -> viewport-local\r\n // viewportLocalX = canvasX - finalViewportX\r\n // viewportLocalY = canvasY - finalViewportY\r\n const canvasToViewport: PointTransform = {\r\n scaleX: 1,\r\n scaleY: 1,\r\n offsetX: -finalViewportX,\r\n offsetY: -finalViewportY\r\n };\r\n\r\n // Transform: canvas -> logic (design space)\r\n //\r\n // canvas -> viewport-local:\r\n // vx = canvasX - finalViewportX\r\n // vy = canvasY - finalViewportY\r\n //\r\n // viewport-local -> logic:\r\n // logicX = vx / scaleX\r\n // logicY = vy / scaleY\r\n //\r\n // Combined:\r\n // logicX = (canvasX - finalViewportX) / scaleX\r\n // = (1 / scaleX) * canvasX + (-finalViewportX / scaleX)\r\n // logicY = (canvasY - finalViewportY) / scaleY\r\n // = (1 / scaleY) * canvasY + (-finalViewportY / scaleY)\r\n const canvasToLogic: PointTransform = {\r\n scaleX: 1 / scaleX,\r\n scaleY: 1 / scaleY,\r\n offsetX: -finalViewportX / scaleX,\r\n offsetY: -finalViewportY / scaleY\r\n };\r\n\r\n return {\r\n viewportX: finalViewportX,\r\n viewportY: finalViewportY,\r\n viewportWidth: finalViewportWidth,\r\n viewportHeight: finalViewportHeight,\r\n croppedViewport,\r\n canvasToViewport,\r\n canvasToLogic\r\n };\r\n }\r\n /**\r\n * Converts canvas coordinates into adjusted viewport-local coordinates.\r\n *\r\n * @remarks\r\n * This is mainly intended for picking / hit testing within the active\r\n * rendering region, where (0, 0) corresponds to the top-left of the\r\n * adapted viewport.\r\n *\r\n * @param canvasPos - Point in canvas coordinates (CSS pixels).\r\n * @param viewportPosOut - Optional output vector. If provided, it will be\r\n * written into and returned; otherwise a new {@link Vector2} is allocated.\r\n * @returns The point in viewport-local coordinates.\r\n */\r\n canvasPosToViewport(canvasPos: Vector2, viewportPosOut?: Vector2) {\r\n return this.transformPoint(this.transform.canvasToViewport, canvasPos, viewportPosOut);\r\n }\r\n /**\r\n * Converts canvas coordinates into logical coordinates in the design\r\n * resolution space.\r\n *\r\n * @remarks\r\n * This is mainly intended for UI editing and interaction, so that logic\r\n * works consistently in the designWidth × designHeight coordinate system.\r\n *\r\n * @param canvasPos - Point in canvas coordinates (CSS pixels).\r\n * @param logicPosOut - Optional output vector. If provided, it will be\r\n * written into and returned; otherwise a new {@link Vector2} is allocated.\r\n * @returns The point in logical (design resolution) coordinates.\r\n */\r\n canvasPosToLogic(canvasPos: Vector2, logicPosOut?: Vector2) {\r\n return this.transformPoint(this.transform.canvasToLogic, canvasPos, logicPosOut);\r\n }\r\n /**\r\n * Applies a 2D affine transform to a point.\r\n *\r\n * The transform is applied as:\r\n *\r\n * out.x = in.x * scaleX + offsetX\r\n * out.y = in.y * scaleY + offsetY\r\n *\r\n * @param transform - Transform parameters (scale and offset).\r\n * @param pointIn - Input point.\r\n * @param pointOut - Optional output vector. If provided, it will be\r\n * written into and returned; otherwise a new {@link Vector2} is allocated.\r\n * @returns The transformed point.\r\n */\r\n transformPoint(transform: PointTransform, pointIn: Vector2, pointOut?: Vector2) {\r\n const out = pointOut ?? new Vector2();\r\n out.x = pointIn.x * transform.scaleX + transform.offsetX;\r\n out.y = pointIn.y * transform.scaleY + transform.offsetY;\r\n return out;\r\n }\r\n /**\r\n * Resolves the current viewport, updating internal state as needed.\r\n */\r\n resolveViewport() {\r\n const device = getDevice();\r\n const vp = this._viewport?.slice() ?? [\r\n 0,\r\n 0,\r\n device.deviceXToScreen(device.getDrawingBufferWidth()),\r\n device.deviceYToScreen(device.getDrawingBufferHeight())\r\n ];\r\n if (this._resolvedViewport !== vp) {\r\n this._resolvedViewport = vp;\r\n this._version++;\r\n this._transform = null;\r\n }\r\n }\r\n private getDefaultConfig(): ScreenConfig {\r\n return {\r\n designWidth: 1280,\r\n designHeight: 720,\r\n scaleMode: 'cover'\r\n };\r\n }\r\n}\r\n"],"names":["ScreenAdapter","_config","_transform","_viewport","_resolvedViewport","_version","config","getDefaultConfig","viewport","vp","slice","resolveViewport","version","transform","calculateResolutionTransform","viewportX","viewportY","viewportWidth","viewportHeight","designWidth","designHeight","scaleMode","croppedViewport","x","y","width","height","canvasToViewport","scaleX","scaleY","offsetX","offsetY","canvasToLogic","sx","sy","finalViewportWidth","finalViewportHeight","finalViewportX","finalViewportY","s","Math","min","max","adjLeft","adjTop","adjRight","adjBottom","rawLeft","rawTop","rawRight","rawBottom","cropLeft","cropTop","cropRight","cropBottom","canvasPosToViewport","canvasPos","viewportPosOut","transformPoint","canvasPosToLogic","logicPosOut","pointIn","pointOut","out","Vector2","device","getDevice","deviceXToScreen","getDrawingBufferWidth","deviceYToScreen","getDrawingBufferHeight"],"mappings":"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"}
|
package/dist/asset/model.js
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
import { Vector3, Quaternion, Matrix4x4, Disposable, DRef } from '@zephyr3d/base';
|
|
2
2
|
import { Mesh } from '../scene/mesh.js';
|
|
3
3
|
import { SceneNode } from '../scene/scene_node.js';
|
|
4
|
-
import { NodeTranslationTrack } from '../animation/translationtrack.js';
|
|
5
4
|
import { NodeRotationTrack } from '../animation/rotationtrack.js';
|
|
6
5
|
import '../animation/eulerrotationtrack.js';
|
|
6
|
+
import { NodeTranslationTrack } from '../animation/translationtrack.js';
|
|
7
7
|
import { NodeScaleTrack } from '../animation/scaletrack.js';
|
|
8
|
-
import { MorphTargetTrack } from '../animation/morphtrack.js';
|
|
9
8
|
import { Skeleton } from '../animation/skeleton.js';
|
|
9
|
+
import { MorphTargetTrack } from '../animation/morphtrack.js';
|
|
10
10
|
import { processMorphData } from '../animation/morphtarget.js';
|
|
11
11
|
import { MAX_MORPH_TARGETS } from '../values.js';
|
|
12
12
|
|
|
@@ -171,7 +171,7 @@ import { MAX_MORPH_TARGETS } from '../values.js';
|
|
|
171
171
|
/** The pivot node */ pivot;
|
|
172
172
|
/** Joints of the skeleton */ joints;
|
|
173
173
|
/** Inverse of the binding matrices of the joints */ inverseBindMatrices;
|
|
174
|
-
/** Binding pose matrices of the joints */
|
|
174
|
+
/** Binding pose matrices of the joints */ bindPose;
|
|
175
175
|
/**
|
|
176
176
|
* Creates an instance of AssetSkeleton
|
|
177
177
|
* @param name - Name of the skeleton
|
|
@@ -181,7 +181,7 @@ import { MAX_MORPH_TARGETS } from '../values.js';
|
|
|
181
181
|
this.pivot = null;
|
|
182
182
|
this.joints = [];
|
|
183
183
|
this.inverseBindMatrices = [];
|
|
184
|
-
this.
|
|
184
|
+
this.bindPose = [];
|
|
185
185
|
}
|
|
186
186
|
/**
|
|
187
187
|
* Adds a joint to the skeleton
|
|
@@ -191,7 +191,11 @@ import { MAX_MORPH_TARGETS } from '../values.js';
|
|
|
191
191
|
joint.attachToSkeleton(this);
|
|
192
192
|
this.joints.push(joint);
|
|
193
193
|
this.inverseBindMatrices.push(inverseBindMatrix);
|
|
194
|
-
this.
|
|
194
|
+
this.bindPose.push({
|
|
195
|
+
position: joint.position.clone(),
|
|
196
|
+
rotation: joint.rotation.clone(),
|
|
197
|
+
scale: joint.scaling.clone()
|
|
198
|
+
});
|
|
195
199
|
}
|
|
196
200
|
}
|
|
197
201
|
/**
|
|
@@ -323,7 +327,7 @@ import { MAX_MORPH_TARGETS } from '../values.js';
|
|
|
323
327
|
const nodes = skeletonMeshMap.get(sk);
|
|
324
328
|
if (nodes) {
|
|
325
329
|
if (!nodes.skeleton) {
|
|
326
|
-
nodes.skeleton = new Skeleton(sk.joints.map((val)=>nodeMap.get(val)), sk.inverseBindMatrices, sk.
|
|
330
|
+
nodes.skeleton = new Skeleton(sk.joints.map((val)=>nodeMap.get(val)), sk.inverseBindMatrices, sk.bindPose);
|
|
327
331
|
for(let i = 0; i < nodes.mesh.length; i++){
|
|
328
332
|
const mesh = nodes.mesh[i];
|
|
329
333
|
const v = {
|
package/dist/asset/model.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"model.js","sources":["../../src/asset/model.ts"],"sourcesContent":["import type { Vector4, TypedArray, Interpolator, Nullable } from '@zephyr3d/base';\r\nimport { DRef } from '@zephyr3d/base';\r\nimport { Disposable, Matrix4x4, Quaternion, Vector3 } from '@zephyr3d/base';\r\nimport { type Texture2D, type TextureSampler } from '@zephyr3d/device';\r\nimport type { Primitive } from '../render/primitive';\r\nimport type { MeshMaterial } from '../material/meshmaterial';\r\nimport { Mesh } from '../scene/mesh';\r\nimport type { BoundingBox } from '../utility';\r\nimport type { Scene } from '../scene';\r\nimport { SceneNode } from '../scene/scene_node';\r\nimport { NodeRotationTrack, NodeScaleTrack, Skeleton, NodeTranslationTrack } from '../animation';\r\nimport { processMorphData } from '../animation/morphtarget';\r\nimport { MAX_MORPH_TARGETS } from '../values';\r\nimport { MorphTargetTrack } from '../animation/morphtrack';\r\n\r\n/**\r\n * Named object interface for model loading\r\n * @public\r\n */\r\nexport class NamedObject {\r\n name: string;\r\n /**\r\n * Creates an instance of NamedObject\r\n * @param name - Name of the object\r\n */\r\n constructor(name: string) {\r\n this.name = name;\r\n }\r\n}\r\n\r\n/**\r\n * Texture information for model loading\r\n * @public\r\n */\r\nexport interface MaterialTextureInfo {\r\n texture: Nullable<Texture2D>;\r\n sampler: Nullable<TextureSampler>;\r\n texCoord: number;\r\n transform: Nullable<Matrix4x4>;\r\n}\r\n\r\n/**\r\n * Common properties of material for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterialCommon {\r\n vertexColor?: boolean;\r\n vertexNormal?: boolean;\r\n useTangent?: boolean;\r\n alphaMode?: 'blend' | 'mask';\r\n alphaCutoff?: number;\r\n doubleSided?: boolean;\r\n normalMap?: Nullable<MaterialTextureInfo>;\r\n bumpScale?: number;\r\n emissiveMap?: Nullable<MaterialTextureInfo>;\r\n emissiveColor?: Vector3;\r\n emissiveStrength?: number;\r\n occlusionMap?: Nullable<MaterialTextureInfo>;\r\n occlusionStrength?: number;\r\n}\r\n\r\n/**\r\n * Base material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterial {\r\n type: string;\r\n common: AssetMaterialCommon;\r\n}\r\n\r\n/**\r\n * Unlit related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetUnlitMaterial extends AssetMaterial {\r\n diffuseMap?: Nullable<MaterialTextureInfo>;\r\n diffuse?: Vector4;\r\n}\r\n\r\n/**\r\n * Sheen related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterialSheen {\r\n sheenColorFactor?: Vector3;\r\n sheenColorMap?: Nullable<MaterialTextureInfo>;\r\n sheenRoughnessFactor?: number;\r\n sheenRoughnessMap?: Nullable<MaterialTextureInfo>;\r\n}\r\n\r\n/**\r\n * Clearcoat related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterialClearcoat {\r\n clearCoatFactor?: number;\r\n clearCoatIntensityMap?: Nullable<MaterialTextureInfo>;\r\n clearCoatRoughnessFactor?: number;\r\n clearCoatRoughnessMap?: Nullable<MaterialTextureInfo>;\r\n clearCoatNormalMap?: Nullable<MaterialTextureInfo>;\r\n}\r\n\r\n/**\r\n * Transmission related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterialTransmission {\r\n transmissionFactor?: number;\r\n transmissionMap?: Nullable<MaterialTextureInfo>;\r\n thicknessFactor?: number;\r\n thicknessMap?: Nullable<MaterialTextureInfo>;\r\n attenuationColor?: Vector3;\r\n attenuationDistance?: number;\r\n}\r\n\r\n/**\r\n * Iridescence related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterialIridescence {\r\n iridescenceFactor?: number;\r\n iridescenceMap?: Nullable<MaterialTextureInfo>;\r\n iridescenceIor?: number;\r\n iridescenceThicknessMinimum?: number;\r\n iridescenceThicknessMaximum?: number;\r\n iridescenceThicknessMap?: Nullable<MaterialTextureInfo>;\r\n}\r\n\r\n/**\r\n * PBR related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetPBRMaterialCommon extends AssetUnlitMaterial {\r\n ior?: number;\r\n}\r\n\r\n/**\r\n * PBR of Metallic-Roughness workflow related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetPBRMaterialMR extends AssetPBRMaterialCommon {\r\n metallic?: number;\r\n roughness?: number;\r\n metallicMap?: Nullable<MaterialTextureInfo>;\r\n metallicIndex?: number;\r\n roughnessIndex?: number;\r\n specularMap?: Nullable<MaterialTextureInfo>;\r\n specularColorMap?: Nullable<MaterialTextureInfo>;\r\n specularFactor?: Vector4;\r\n sheen?: AssetMaterialSheen;\r\n clearcoat?: AssetMaterialClearcoat;\r\n transmission?: AssetMaterialTransmission;\r\n iridescence?: AssetMaterialIridescence;\r\n}\r\n\r\n/**\r\n * PBR of Specular-Glossness workfow related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetPBRMaterialSG extends AssetPBRMaterialCommon {\r\n specular?: Vector3;\r\n glossness?: number;\r\n specularGlossnessMap?: Nullable<MaterialTextureInfo>;\r\n}\r\n\r\n/**\r\n * Sub mesh data interface for model loading\r\n * @public\r\n */\r\nexport interface AssetSubMeshData {\r\n primitive: DRef<Primitive>;\r\n material: DRef<MeshMaterial>;\r\n mesh?: Mesh;\r\n rawPositions: Nullable<Float32Array>;\r\n rawBlendIndices: Nullable<TypedArray>;\r\n rawJointWeights: Nullable<TypedArray>;\r\n name: string;\r\n numTargets: number;\r\n targets?: Partial<Record<number, { numComponents: number; data: Float32Array[] }>>;\r\n targetBox?: BoundingBox[];\r\n morphAttribCount?: number;\r\n}\r\n\r\n/**\r\n * Mesh data interface for model loading\r\n * @public\r\n */\r\nexport interface AssetMeshData {\r\n morphWeights?: Nullable<number[]>;\r\n subMeshes: AssetSubMeshData[];\r\n}\r\n\r\n/**\r\n * Animation track interface for model loading\r\n * @public\r\n */\r\nexport interface AssetAnimationTrack {\r\n node: AssetHierarchyNode;\r\n type: 'translation' | 'scale' | 'rotation' | 'weights';\r\n interpolator: Interpolator;\r\n defaultMorphWeights?: number[];\r\n}\r\n\r\n/**\r\n * Animation data interface for model loading\r\n * @public\r\n */\r\nexport interface AssetAnimationData {\r\n name: string;\r\n tracks: AssetAnimationTrack[];\r\n skeletons: AssetSkeleton[];\r\n nodes: AssetHierarchyNode[];\r\n}\r\n\r\n/**\r\n * Skeletal animation track interface for model loading\r\n * @public\r\n */\r\nexport interface AssetSkeletalAnimationTrack extends AssetAnimationTrack {\r\n skeleton: AssetSkeleton;\r\n keyFrames: Record<number, { translation: Vector3; rotation: Quaternion; scale: Vector3 }[]>;\r\n}\r\n\r\n/**\r\n * Rotation track of key frame animation interface for model loading\r\n * @public\r\n */\r\nexport interface AssetRotationTrack extends AssetAnimationTrack {\r\n keyFrames: Record<number, Quaternion[]>;\r\n nodes: number[];\r\n}\r\n\r\n/**\r\n * Translation track of key frame animation interface for model loading\r\n * @public\r\n */\r\nexport interface AssetTranslationTrack extends AssetAnimationTrack {\r\n keyFrames: Record<number, Vector3[]>;\r\n nodes: number[];\r\n}\r\n\r\n/**\r\n * Scale track of key frame animation interface for model loading\r\n * @public\r\n */\r\nexport interface AssetScaleTrack extends AssetAnimationTrack {\r\n keyFrames: Record<number, Vector3[]>;\r\n nodes: number[];\r\n}\r\n\r\n/**\r\n * Heirarchical node interface for model loading\r\n * @public\r\n */\r\nexport class AssetHierarchyNode extends NamedObject {\r\n private _parent: Nullable<AssetHierarchyNode>;\r\n private _position: Vector3;\r\n private _rotation: Quaternion;\r\n private _scaling: Vector3;\r\n private _mesh: Nullable<AssetMeshData>;\r\n private _skeleton: Nullable<AssetSkeleton>;\r\n private _attachToSkeleton: Nullable<Set<AssetSkeleton>>;\r\n private _meshAttached: boolean;\r\n private _matrix: Nullable<Matrix4x4>;\r\n private _worldMatrix: Nullable<Matrix4x4>;\r\n private _weights: Nullable<number[]>;\r\n private readonly _children: AssetHierarchyNode[];\r\n private readonly _instances?: { t: Vector3; s: Vector3; r: Quaternion }[];\r\n /**\r\n * Creates an instance of AssetHierarchyNode\r\n * @param name - Name of the node\r\n * @param parent - Parent of the node\r\n */\r\n constructor(name: string, parent?: Nullable<AssetHierarchyNode>) {\r\n super(name);\r\n this._parent = null;\r\n this._position = Vector3.zero();\r\n this._rotation = Quaternion.identity();\r\n this._scaling = Vector3.one();\r\n this._children = [];\r\n this._mesh = null;\r\n this._skeleton = null;\r\n this._attachToSkeleton = null;\r\n this._meshAttached = false;\r\n this._matrix = null;\r\n this._weights = null;\r\n this._worldMatrix = null;\r\n this._instances = [];\r\n parent?.addChild(this);\r\n }\r\n /** Parent of the node */\r\n get parent() {\r\n return this._parent;\r\n }\r\n /** Local transformation matrix of the node */\r\n get matrix() {\r\n return this._matrix;\r\n }\r\n /** World transformation matrix of the node */\r\n get worldMatrix() {\r\n return this._worldMatrix;\r\n }\r\n /** Mesh data of the node, or null if this is not a mesh node */\r\n get mesh() {\r\n return this._mesh;\r\n }\r\n set mesh(data) {\r\n this._mesh = data;\r\n this.setMeshAttached();\r\n }\r\n /** instances */\r\n get instances() {\r\n return this._instances ?? null;\r\n }\r\n /** Default morph target weights */\r\n get weights() {\r\n return this._weights;\r\n }\r\n set weights(val) {\r\n this._weights = val;\r\n }\r\n /** The skeleton used to control the node */\r\n get skeleton() {\r\n return this._skeleton;\r\n }\r\n set skeleton(skeleton) {\r\n this._skeleton = skeleton;\r\n }\r\n /** The translation of the node */\r\n get position() {\r\n return this._position;\r\n }\r\n set position(val) {\r\n this._position = val;\r\n }\r\n /** The rotation of the node */\r\n get rotation() {\r\n return this._rotation;\r\n }\r\n set rotation(val) {\r\n this._rotation = val;\r\n }\r\n /** The scale of the node */\r\n get scaling() {\r\n return this._scaling;\r\n }\r\n set scaling(val) {\r\n this._scaling = val;\r\n }\r\n /** true if the node is parent of a mesh node */\r\n get meshAttached() {\r\n return this._meshAttached;\r\n }\r\n /** Children of the node */\r\n get children() {\r\n return this._children;\r\n }\r\n /** The skeleton to which the node belongs if this is a joint node */\r\n get skeletonAttached() {\r\n return this._attachToSkeleton;\r\n }\r\n /** @internal */\r\n computeTransforms(parentTransform: Nullable<Matrix4x4>) {\r\n this._matrix = Matrix4x4.scaling(this._scaling).rotateLeft(this._rotation).translateLeft(this._position);\r\n this._worldMatrix = parentTransform\r\n ? Matrix4x4.multiply(parentTransform, this._matrix)\r\n : new Matrix4x4(this._matrix);\r\n for (const child of this._children) {\r\n child.computeTransforms(this._worldMatrix);\r\n }\r\n }\r\n /**\r\n * Adds a child to this node\r\n * @param child - The child node to be added\r\n */\r\n addChild(child: AssetHierarchyNode) {\r\n if (!child || child.parent) {\r\n throw new Error('AssetHierarchyNode.addChild(): invalid child node');\r\n }\r\n this._children.push(child);\r\n child._parent = this;\r\n if (child.meshAttached) {\r\n this.setMeshAttached();\r\n }\r\n }\r\n /**\r\n * Removes a child of this node\r\n * @param child - The child node to be removed\r\n */\r\n removeChild(child: AssetHierarchyNode) {\r\n const index = this._children.indexOf(child);\r\n if (index < 0) {\r\n throw new Error('AssetHierarchyNode.removeChild(): invalid child node');\r\n }\r\n this._children[index]._parent = null;\r\n this._children.splice(index, 1);\r\n }\r\n /**\r\n * Attach this node to a skeleton\r\n * @param skeleton - The skeleton to which to node will attach\r\n * @param index - The joint index\r\n */\r\n attachToSkeleton(skeleton: AssetSkeleton) {\r\n if (!this._attachToSkeleton) {\r\n this._attachToSkeleton = new Set();\r\n }\r\n this._attachToSkeleton.add(skeleton);\r\n }\r\n /** @internal */\r\n private setMeshAttached() {\r\n this._meshAttached = true;\r\n this._parent?.setMeshAttached();\r\n }\r\n}\r\n\r\n/**\r\n * Skeleton information for model loading\r\n * @public\r\n */\r\nexport class AssetSkeleton extends NamedObject {\r\n /** The pivot node */\r\n pivot: Nullable<AssetHierarchyNode>;\r\n /** Joints of the skeleton */\r\n joints: AssetHierarchyNode[];\r\n /** Inverse of the binding matrices of the joints */\r\n inverseBindMatrices: Matrix4x4[];\r\n /** Binding pose matrices of the joints */\r\n bindPoseMatrices: Matrix4x4[];\r\n /**\r\n * Creates an instance of AssetSkeleton\r\n * @param name - Name of the skeleton\r\n */\r\n constructor(name: string) {\r\n super(name);\r\n this.name = name;\r\n this.pivot = null;\r\n this.joints = [];\r\n this.inverseBindMatrices = [];\r\n this.bindPoseMatrices = [];\r\n }\r\n /**\r\n * Adds a joint to the skeleton\r\n * @param joint - The joint node\r\n * @param inverseBindMatrix - Inverse binding matrix of the joint\r\n */\r\n addJoint(joint: AssetHierarchyNode, inverseBindMatrix: Matrix4x4) {\r\n joint.attachToSkeleton(this);\r\n this.joints.push(joint);\r\n this.inverseBindMatrices.push(inverseBindMatrix);\r\n this.bindPoseMatrices.push(joint.worldMatrix!.clone());\r\n }\r\n}\r\n\r\n/**\r\n * Scene for model loading\r\n * @public\r\n */\r\nexport class AssetScene extends NamedObject {\r\n /** Root nodes of the scene */\r\n rootNodes: AssetHierarchyNode[];\r\n /**\r\n * Creates an instance of AssetScene\r\n * @param name - Name of the scene\r\n */\r\n constructor(name: string) {\r\n super(name);\r\n this.rootNodes = [];\r\n }\r\n}\r\n\r\n/**\r\n * Model information that can be shared by multiple model nodes\r\n * @public\r\n */\r\nexport class SharedModel extends Disposable {\r\n /** @internal */\r\n private _name: string;\r\n /** @internal */\r\n private _skeletons: AssetSkeleton[];\r\n /** @internal */\r\n private _nodes: AssetHierarchyNode[];\r\n /** @internal */\r\n private _animations: AssetAnimationData[];\r\n /** @internal */\r\n private _scenes: AssetScene[];\r\n /** @internal */\r\n private _activeScene: number;\r\n /**\r\n * Creates an instance of SharedModel\r\n * @param name - Name of the model\r\n */\r\n constructor(name?: string) {\r\n super();\r\n this._name = name || '';\r\n this._skeletons = [];\r\n this._nodes = [];\r\n this._scenes = [];\r\n this._animations = [];\r\n this._activeScene = -1;\r\n }\r\n /** Name of the model */\r\n get name() {\r\n return this._name;\r\n }\r\n set name(val) {\r\n this._name = val;\r\n }\r\n /** All scenes that the model contains */\r\n get scenes() {\r\n return this._scenes;\r\n }\r\n /** All animations that the model contains */\r\n get animations() {\r\n return this._animations;\r\n }\r\n /** All skeletons that the model contains */\r\n get skeletons() {\r\n return this._skeletons;\r\n }\r\n /** All nodes that the model contains */\r\n get nodes() {\r\n return this._nodes;\r\n }\r\n /** The active scene of the model */\r\n get activeScene() {\r\n return this._activeScene;\r\n }\r\n set activeScene(val) {\r\n this._activeScene = val;\r\n }\r\n /**\r\n * Adds a node to the scene\r\n * @param parent - Under which node the node should be added\r\n * @param index - Index of the node\r\n * @param name - Name of the node\r\n * @returns The added node\r\n */\r\n addNode(parent: Nullable<AssetHierarchyNode>, index: number, name: string) {\r\n const childNode = new AssetHierarchyNode(name, parent);\r\n this._nodes[index] = childNode;\r\n return childNode;\r\n }\r\n /**\r\n * Adds a skeleton to the scene\r\n * @param skeleton - The skeleton to be added\r\n */\r\n addSkeleton(skeleton: AssetSkeleton) {\r\n this._skeletons.push(skeleton);\r\n }\r\n /**\r\n * Adds an animation to the scene\r\n * @param animation - The animation to be added\r\n */\r\n addAnimation(animation: AssetAnimationData) {\r\n this._animations.push(animation);\r\n }\r\n createSceneNode(scene: Scene, instancing: boolean) {\r\n const group = new SceneNode(scene);\r\n group.name = this.name;\r\n const animationSet = group.animationSet;\r\n for (let i = 0; i < this.scenes.length; i++) {\r\n const assetScene = this.scenes[i];\r\n const skeletonMeshMap: Map<\r\n AssetSkeleton,\r\n { mesh: Mesh[]; bounding: AssetSubMeshData[]; skeleton?: Skeleton }\r\n > = new Map();\r\n const nodeMap: Map<AssetHierarchyNode, SceneNode> = new Map();\r\n for (let k = 0; k < assetScene.rootNodes.length; k++) {\r\n this.setAssetNodeToSceneNode(\r\n scene,\r\n group,\r\n assetScene.rootNodes[k],\r\n skeletonMeshMap,\r\n nodeMap,\r\n instancing\r\n );\r\n }\r\n for (const animationData of this.animations) {\r\n let name = animationData.name ?? `_embbeded_animation`;\r\n if (animationSet.getAnimationClip(name)) {\r\n const baseName = name;\r\n for (let t = 1; ; t++) {\r\n name = `${baseName}_${t}`;\r\n if (!animationSet.getAnimationClip(name)) {\r\n break;\r\n }\r\n }\r\n }\r\n const animation = animationSet.createAnimation(name, true)!;\r\n for (const track of animationData.tracks) {\r\n if (track.type === 'translation') {\r\n animation.addTrack(nodeMap.get(track.node)!, new NodeTranslationTrack(track.interpolator, true));\r\n } else if (track.type === 'scale') {\r\n animation.addTrack(nodeMap.get(track.node)!, new NodeScaleTrack(track.interpolator, true));\r\n } else if (track.type === 'rotation') {\r\n animation.addTrack(nodeMap.get(track.node)!, new NodeRotationTrack(track.interpolator, true));\r\n } else if (track.type === 'weights') {\r\n for (const m of track.node.mesh!.subMeshes) {\r\n if (track.interpolator.stride > MAX_MORPH_TARGETS) {\r\n console.error(\r\n `Morph target too large: ${track.interpolator.stride}, the maximum is ${MAX_MORPH_TARGETS}`\r\n );\r\n } else {\r\n const morphTrack = new MorphTargetTrack(\r\n track.interpolator,\r\n track.defaultMorphWeights,\r\n m.targetBox,\r\n m.mesh!.getBoundingVolume()!.toAABB(),\r\n true\r\n );\r\n animation.addTrack(m.mesh!, morphTrack);\r\n }\r\n }\r\n } else {\r\n console.error(`Invalid animation track type: ${track.type}`);\r\n }\r\n }\r\n for (const sk of animationData.skeletons) {\r\n const nodes = skeletonMeshMap.get(sk);\r\n if (nodes) {\r\n if (!nodes.skeleton) {\r\n nodes.skeleton = new Skeleton(\r\n sk.joints.map((val) => nodeMap.get(val)!),\r\n sk.inverseBindMatrices,\r\n sk.bindPoseMatrices\r\n );\r\n for (let i = 0; i < nodes.mesh.length; i++) {\r\n const mesh = nodes.mesh[i];\r\n const v = {\r\n positions: nodes.bounding[i].rawPositions!,\r\n blendIndices: nodes.bounding[i].rawBlendIndices!,\r\n weights: nodes.bounding[i].rawJointWeights!\r\n };\r\n mesh.setSkinnedBoundingInfo(nodes.skeleton.getBoundingInfo(v));\r\n mesh.skeletonName = nodes.skeleton.persistentId;\r\n }\r\n animationSet.skeletons.push(new DRef(nodes.skeleton));\r\n }\r\n animation.addSkeleton(nodes.skeleton.persistentId);\r\n }\r\n }\r\n }\r\n }\r\n group.iterate((child) => {\r\n if (child !== group) {\r\n child.sealed = true;\r\n }\r\n });\r\n group.sharedModel = this;\r\n return group;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n const nodes = [...this._nodes];\r\n while (nodes.length > 0) {\r\n const node = nodes.shift();\r\n nodes.push(...node!.children);\r\n const mesh = node!.mesh;\r\n if (mesh) {\r\n for (const subMesh of mesh.subMeshes) {\r\n subMesh.primitive?.dispose();\r\n subMesh.material?.dispose();\r\n }\r\n }\r\n }\r\n this._nodes = [];\r\n this._skeletons = [];\r\n this._scenes = [];\r\n this._animations = [];\r\n }\r\n private setAssetNodeToSceneNode(\r\n scene: Scene,\r\n parent: SceneNode,\r\n assetNode: AssetHierarchyNode,\r\n skeletonMeshMap: Map<AssetSkeleton, { mesh: Mesh[]; bounding: AssetSubMeshData[] }>,\r\n nodeMap: Map<AssetHierarchyNode, SceneNode>,\r\n instancing: boolean\r\n ) {\r\n const node: SceneNode = new SceneNode(scene);\r\n nodeMap.set(assetNode, node);\r\n node.name = assetNode.name ?? '';\r\n node.position.set(assetNode.position);\r\n node.rotation.set(assetNode.rotation);\r\n node.scale.set(assetNode.scaling);\r\n if (assetNode.mesh) {\r\n const meshData = assetNode.mesh;\r\n const skeleton = assetNode.skeleton;\r\n for (const subMesh of meshData.subMeshes) {\r\n for (const instance of assetNode.instances!) {\r\n const meshNode = new Mesh(scene);\r\n meshNode.position = instance.t;\r\n meshNode.scale = instance.s;\r\n meshNode.rotation = instance.r;\r\n meshNode.name = subMesh.name;\r\n meshNode.clipTestEnabled = true;\r\n meshNode.showState = 'inherit';\r\n meshNode.skinAnimation = !!skeleton;\r\n meshNode.morphAnimation = subMesh.numTargets > 0;\r\n meshNode.primitive = subMesh.primitive.get()!;\r\n meshNode.material =\r\n instancing && !meshNode.skinAnimation && !meshNode.morphAnimation\r\n ? subMesh.material.get()!.createInstance()\r\n : subMesh.material.get()!.clone();\r\n meshNode.parent = node;\r\n subMesh.mesh = meshNode;\r\n processMorphData(subMesh, meshData.morphWeights!);\r\n if (skeleton) {\r\n if (!skeletonMeshMap.has(skeleton)) {\r\n skeletonMeshMap.set(skeleton, { mesh: [meshNode], bounding: [subMesh] });\r\n } else {\r\n skeletonMeshMap.get(skeleton)!.mesh.push(meshNode);\r\n skeletonMeshMap.get(skeleton)!.bounding.push(subMesh);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n node.parent = parent;\r\n for (const child of assetNode.children) {\r\n this.setAssetNodeToSceneNode(scene, node, child, skeletonMeshMap, nodeMap, instancing);\r\n }\r\n }\r\n}\r\n"],"names":["NamedObject","name","AssetHierarchyNode","_parent","_position","_rotation","_scaling","_mesh","_skeleton","_attachToSkeleton","_meshAttached","_matrix","_worldMatrix","_weights","_children","_instances","parent","Vector3","zero","Quaternion","identity","one","addChild","matrix","worldMatrix","mesh","data","setMeshAttached","instances","weights","val","skeleton","position","rotation","scaling","meshAttached","children","skeletonAttached","computeTransforms","parentTransform","Matrix4x4","rotateLeft","translateLeft","multiply","child","Error","push","removeChild","index","indexOf","splice","attachToSkeleton","Set","add","AssetSkeleton","pivot","joints","inverseBindMatrices","bindPoseMatrices","addJoint","joint","inverseBindMatrix","clone","AssetScene","rootNodes","SharedModel","Disposable","_name","_skeletons","_nodes","_scenes","_animations","_activeScene","scenes","animations","skeletons","nodes","activeScene","addNode","childNode","addSkeleton","addAnimation","animation","createSceneNode","scene","instancing","group","SceneNode","animationSet","i","length","assetScene","skeletonMeshMap","Map","nodeMap","k","setAssetNodeToSceneNode","animationData","getAnimationClip","baseName","t","createAnimation","track","tracks","type","addTrack","get","node","NodeTranslationTrack","interpolator","NodeScaleTrack","NodeRotationTrack","m","subMeshes","stride","MAX_MORPH_TARGETS","console","error","morphTrack","MorphTargetTrack","defaultMorphWeights","targetBox","getBoundingVolume","toAABB","sk","Skeleton","map","v","positions","bounding","rawPositions","blendIndices","rawBlendIndices","rawJointWeights","setSkinnedBoundingInfo","getBoundingInfo","skeletonName","persistentId","DRef","iterate","sealed","sharedModel","onDispose","shift","subMesh","primitive","dispose","material","assetNode","set","scale","meshData","instance","meshNode","Mesh","s","r","clipTestEnabled","showState","skinAnimation","morphAnimation","numTargets","createInstance","processMorphData","morphWeights","has"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"model.js","sources":["../../src/asset/model.ts"],"sourcesContent":["import type { Vector4, TypedArray, Interpolator, Nullable } from '@zephyr3d/base';\r\nimport { DRef } from '@zephyr3d/base';\r\nimport { Disposable, Matrix4x4, Quaternion, Vector3 } from '@zephyr3d/base';\r\nimport { type Texture2D, type TextureSampler } from '@zephyr3d/device';\r\nimport type { Primitive } from '../render/primitive';\r\nimport type { MeshMaterial } from '../material/meshmaterial';\r\nimport { Mesh } from '../scene/mesh';\r\nimport type { BoundingBox } from '../utility';\r\nimport type { Scene } from '../scene';\r\nimport { SceneNode } from '../scene/scene_node';\r\nimport { NodeRotationTrack, NodeScaleTrack, Skeleton, NodeTranslationTrack } from '../animation';\r\nimport { processMorphData } from '../animation/morphtarget';\r\nimport { MAX_MORPH_TARGETS } from '../values';\r\nimport { MorphTargetTrack } from '../animation/morphtrack';\r\n\r\n/**\r\n * Named object interface for model loading\r\n * @public\r\n */\r\nexport class NamedObject {\r\n name: string;\r\n /**\r\n * Creates an instance of NamedObject\r\n * @param name - Name of the object\r\n */\r\n constructor(name: string) {\r\n this.name = name;\r\n }\r\n}\r\n\r\n/**\r\n * Texture information for model loading\r\n * @public\r\n */\r\nexport interface MaterialTextureInfo {\r\n texture: Nullable<Texture2D>;\r\n sampler: Nullable<TextureSampler>;\r\n texCoord: number;\r\n transform: Nullable<Matrix4x4>;\r\n}\r\n\r\n/**\r\n * Common properties of material for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterialCommon {\r\n vertexColor?: boolean;\r\n vertexNormal?: boolean;\r\n useTangent?: boolean;\r\n alphaMode?: 'blend' | 'mask';\r\n alphaCutoff?: number;\r\n doubleSided?: boolean;\r\n normalMap?: Nullable<MaterialTextureInfo>;\r\n bumpScale?: number;\r\n emissiveMap?: Nullable<MaterialTextureInfo>;\r\n emissiveColor?: Vector3;\r\n emissiveStrength?: number;\r\n occlusionMap?: Nullable<MaterialTextureInfo>;\r\n occlusionStrength?: number;\r\n}\r\n\r\n/**\r\n * Base material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterial {\r\n type: string;\r\n common: AssetMaterialCommon;\r\n}\r\n\r\n/**\r\n * Unlit related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetUnlitMaterial extends AssetMaterial {\r\n diffuseMap?: Nullable<MaterialTextureInfo>;\r\n diffuse?: Vector4;\r\n}\r\n\r\n/**\r\n * Sheen related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterialSheen {\r\n sheenColorFactor?: Vector3;\r\n sheenColorMap?: Nullable<MaterialTextureInfo>;\r\n sheenRoughnessFactor?: number;\r\n sheenRoughnessMap?: Nullable<MaterialTextureInfo>;\r\n}\r\n\r\n/**\r\n * Clearcoat related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterialClearcoat {\r\n clearCoatFactor?: number;\r\n clearCoatIntensityMap?: Nullable<MaterialTextureInfo>;\r\n clearCoatRoughnessFactor?: number;\r\n clearCoatRoughnessMap?: Nullable<MaterialTextureInfo>;\r\n clearCoatNormalMap?: Nullable<MaterialTextureInfo>;\r\n}\r\n\r\n/**\r\n * Transmission related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterialTransmission {\r\n transmissionFactor?: number;\r\n transmissionMap?: Nullable<MaterialTextureInfo>;\r\n thicknessFactor?: number;\r\n thicknessMap?: Nullable<MaterialTextureInfo>;\r\n attenuationColor?: Vector3;\r\n attenuationDistance?: number;\r\n}\r\n\r\n/**\r\n * Iridescence related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetMaterialIridescence {\r\n iridescenceFactor?: number;\r\n iridescenceMap?: Nullable<MaterialTextureInfo>;\r\n iridescenceIor?: number;\r\n iridescenceThicknessMinimum?: number;\r\n iridescenceThicknessMaximum?: number;\r\n iridescenceThicknessMap?: Nullable<MaterialTextureInfo>;\r\n}\r\n\r\n/**\r\n * PBR related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetPBRMaterialCommon extends AssetUnlitMaterial {\r\n ior?: number;\r\n}\r\n\r\n/**\r\n * PBR of Metallic-Roughness workflow related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetPBRMaterialMR extends AssetPBRMaterialCommon {\r\n metallic?: number;\r\n roughness?: number;\r\n metallicMap?: Nullable<MaterialTextureInfo>;\r\n metallicIndex?: number;\r\n roughnessIndex?: number;\r\n specularMap?: Nullable<MaterialTextureInfo>;\r\n specularColorMap?: Nullable<MaterialTextureInfo>;\r\n specularFactor?: Vector4;\r\n sheen?: AssetMaterialSheen;\r\n clearcoat?: AssetMaterialClearcoat;\r\n transmission?: AssetMaterialTransmission;\r\n iridescence?: AssetMaterialIridescence;\r\n}\r\n\r\n/**\r\n * PBR of Specular-Glossness workfow related material properties for model loading\r\n * @public\r\n */\r\nexport interface AssetPBRMaterialSG extends AssetPBRMaterialCommon {\r\n specular?: Vector3;\r\n glossness?: number;\r\n specularGlossnessMap?: Nullable<MaterialTextureInfo>;\r\n}\r\n\r\n/**\r\n * Sub mesh data interface for model loading\r\n * @public\r\n */\r\nexport interface AssetSubMeshData {\r\n primitive: DRef<Primitive>;\r\n material: DRef<MeshMaterial>;\r\n mesh?: Mesh;\r\n rawPositions: Nullable<Float32Array>;\r\n rawBlendIndices: Nullable<TypedArray>;\r\n rawJointWeights: Nullable<TypedArray>;\r\n name: string;\r\n numTargets: number;\r\n targets?: Partial<Record<number, { numComponents: number; data: Float32Array[] }>>;\r\n targetBox?: BoundingBox[];\r\n morphAttribCount?: number;\r\n}\r\n\r\n/**\r\n * Mesh data interface for model loading\r\n * @public\r\n */\r\nexport interface AssetMeshData {\r\n morphWeights?: Nullable<number[]>;\r\n subMeshes: AssetSubMeshData[];\r\n}\r\n\r\n/**\r\n * Animation track interface for model loading\r\n * @public\r\n */\r\nexport interface AssetAnimationTrack {\r\n node: AssetHierarchyNode;\r\n type: 'translation' | 'scale' | 'rotation' | 'weights';\r\n interpolator: Interpolator;\r\n defaultMorphWeights?: number[];\r\n}\r\n\r\n/**\r\n * Animation data interface for model loading\r\n * @public\r\n */\r\nexport interface AssetAnimationData {\r\n name: string;\r\n tracks: AssetAnimationTrack[];\r\n skeletons: AssetSkeleton[];\r\n nodes: AssetHierarchyNode[];\r\n}\r\n\r\n/**\r\n * Skeletal animation track interface for model loading\r\n * @public\r\n */\r\nexport interface AssetSkeletalAnimationTrack extends AssetAnimationTrack {\r\n skeleton: AssetSkeleton;\r\n keyFrames: Record<number, { translation: Vector3; rotation: Quaternion; scale: Vector3 }[]>;\r\n}\r\n\r\n/**\r\n * Rotation track of key frame animation interface for model loading\r\n * @public\r\n */\r\nexport interface AssetRotationTrack extends AssetAnimationTrack {\r\n keyFrames: Record<number, Quaternion[]>;\r\n nodes: number[];\r\n}\r\n\r\n/**\r\n * Translation track of key frame animation interface for model loading\r\n * @public\r\n */\r\nexport interface AssetTranslationTrack extends AssetAnimationTrack {\r\n keyFrames: Record<number, Vector3[]>;\r\n nodes: number[];\r\n}\r\n\r\n/**\r\n * Scale track of key frame animation interface for model loading\r\n * @public\r\n */\r\nexport interface AssetScaleTrack extends AssetAnimationTrack {\r\n keyFrames: Record<number, Vector3[]>;\r\n nodes: number[];\r\n}\r\n\r\n/**\r\n * Heirarchical node interface for model loading\r\n * @public\r\n */\r\nexport class AssetHierarchyNode extends NamedObject {\r\n private _parent: Nullable<AssetHierarchyNode>;\r\n private _position: Vector3;\r\n private _rotation: Quaternion;\r\n private _scaling: Vector3;\r\n private _mesh: Nullable<AssetMeshData>;\r\n private _skeleton: Nullable<AssetSkeleton>;\r\n private _attachToSkeleton: Nullable<Set<AssetSkeleton>>;\r\n private _meshAttached: boolean;\r\n private _matrix: Nullable<Matrix4x4>;\r\n private _worldMatrix: Nullable<Matrix4x4>;\r\n private _weights: Nullable<number[]>;\r\n private readonly _children: AssetHierarchyNode[];\r\n private readonly _instances?: { t: Vector3; s: Vector3; r: Quaternion }[];\r\n /**\r\n * Creates an instance of AssetHierarchyNode\r\n * @param name - Name of the node\r\n * @param parent - Parent of the node\r\n */\r\n constructor(name: string, parent?: Nullable<AssetHierarchyNode>) {\r\n super(name);\r\n this._parent = null;\r\n this._position = Vector3.zero();\r\n this._rotation = Quaternion.identity();\r\n this._scaling = Vector3.one();\r\n this._children = [];\r\n this._mesh = null;\r\n this._skeleton = null;\r\n this._attachToSkeleton = null;\r\n this._meshAttached = false;\r\n this._matrix = null;\r\n this._weights = null;\r\n this._worldMatrix = null;\r\n this._instances = [];\r\n parent?.addChild(this);\r\n }\r\n /** Parent of the node */\r\n get parent() {\r\n return this._parent;\r\n }\r\n /** Local transformation matrix of the node */\r\n get matrix() {\r\n return this._matrix;\r\n }\r\n /** World transformation matrix of the node */\r\n get worldMatrix() {\r\n return this._worldMatrix;\r\n }\r\n /** Mesh data of the node, or null if this is not a mesh node */\r\n get mesh() {\r\n return this._mesh;\r\n }\r\n set mesh(data) {\r\n this._mesh = data;\r\n this.setMeshAttached();\r\n }\r\n /** instances */\r\n get instances() {\r\n return this._instances ?? null;\r\n }\r\n /** Default morph target weights */\r\n get weights() {\r\n return this._weights;\r\n }\r\n set weights(val) {\r\n this._weights = val;\r\n }\r\n /** The skeleton used to control the node */\r\n get skeleton() {\r\n return this._skeleton;\r\n }\r\n set skeleton(skeleton) {\r\n this._skeleton = skeleton;\r\n }\r\n /** The translation of the node */\r\n get position() {\r\n return this._position;\r\n }\r\n set position(val) {\r\n this._position = val;\r\n }\r\n /** The rotation of the node */\r\n get rotation() {\r\n return this._rotation;\r\n }\r\n set rotation(val) {\r\n this._rotation = val;\r\n }\r\n /** The scale of the node */\r\n get scaling() {\r\n return this._scaling;\r\n }\r\n set scaling(val) {\r\n this._scaling = val;\r\n }\r\n /** true if the node is parent of a mesh node */\r\n get meshAttached() {\r\n return this._meshAttached;\r\n }\r\n /** Children of the node */\r\n get children() {\r\n return this._children;\r\n }\r\n /** The skeleton to which the node belongs if this is a joint node */\r\n get skeletonAttached() {\r\n return this._attachToSkeleton;\r\n }\r\n /** @internal */\r\n computeTransforms(parentTransform: Nullable<Matrix4x4>) {\r\n this._matrix = Matrix4x4.scaling(this._scaling).rotateLeft(this._rotation).translateLeft(this._position);\r\n this._worldMatrix = parentTransform\r\n ? Matrix4x4.multiply(parentTransform, this._matrix)\r\n : new Matrix4x4(this._matrix);\r\n for (const child of this._children) {\r\n child.computeTransforms(this._worldMatrix);\r\n }\r\n }\r\n /**\r\n * Adds a child to this node\r\n * @param child - The child node to be added\r\n */\r\n addChild(child: AssetHierarchyNode) {\r\n if (!child || child.parent) {\r\n throw new Error('AssetHierarchyNode.addChild(): invalid child node');\r\n }\r\n this._children.push(child);\r\n child._parent = this;\r\n if (child.meshAttached) {\r\n this.setMeshAttached();\r\n }\r\n }\r\n /**\r\n * Removes a child of this node\r\n * @param child - The child node to be removed\r\n */\r\n removeChild(child: AssetHierarchyNode) {\r\n const index = this._children.indexOf(child);\r\n if (index < 0) {\r\n throw new Error('AssetHierarchyNode.removeChild(): invalid child node');\r\n }\r\n this._children[index]._parent = null;\r\n this._children.splice(index, 1);\r\n }\r\n /**\r\n * Attach this node to a skeleton\r\n * @param skeleton - The skeleton to which to node will attach\r\n * @param index - The joint index\r\n */\r\n attachToSkeleton(skeleton: AssetSkeleton) {\r\n if (!this._attachToSkeleton) {\r\n this._attachToSkeleton = new Set();\r\n }\r\n this._attachToSkeleton.add(skeleton);\r\n }\r\n /** @internal */\r\n private setMeshAttached() {\r\n this._meshAttached = true;\r\n this._parent?.setMeshAttached();\r\n }\r\n}\r\n\r\n/**\r\n * Skeleton information for model loading\r\n * @public\r\n */\r\nexport class AssetSkeleton extends NamedObject {\r\n /** The pivot node */\r\n pivot: Nullable<AssetHierarchyNode>;\r\n /** Joints of the skeleton */\r\n joints: AssetHierarchyNode[];\r\n /** Inverse of the binding matrices of the joints */\r\n inverseBindMatrices: Matrix4x4[];\r\n /** Binding pose matrices of the joints */\r\n bindPose: { position: Vector3; rotation: Quaternion; scale: Vector3 }[];\r\n /**\r\n * Creates an instance of AssetSkeleton\r\n * @param name - Name of the skeleton\r\n */\r\n constructor(name: string) {\r\n super(name);\r\n this.name = name;\r\n this.pivot = null;\r\n this.joints = [];\r\n this.inverseBindMatrices = [];\r\n this.bindPose = [];\r\n }\r\n /**\r\n * Adds a joint to the skeleton\r\n * @param joint - The joint node\r\n * @param inverseBindMatrix - Inverse binding matrix of the joint\r\n */\r\n addJoint(joint: AssetHierarchyNode, inverseBindMatrix: Matrix4x4) {\r\n joint.attachToSkeleton(this);\r\n this.joints.push(joint);\r\n this.inverseBindMatrices.push(inverseBindMatrix);\r\n this.bindPose.push({\r\n position: joint.position.clone(),\r\n rotation: joint.rotation.clone(),\r\n scale: joint.scaling.clone()\r\n });\r\n }\r\n}\r\n\r\n/**\r\n * Scene for model loading\r\n * @public\r\n */\r\nexport class AssetScene extends NamedObject {\r\n /** Root nodes of the scene */\r\n rootNodes: AssetHierarchyNode[];\r\n /**\r\n * Creates an instance of AssetScene\r\n * @param name - Name of the scene\r\n */\r\n constructor(name: string) {\r\n super(name);\r\n this.rootNodes = [];\r\n }\r\n}\r\n\r\n/**\r\n * Model information that can be shared by multiple model nodes\r\n * @public\r\n */\r\nexport class SharedModel extends Disposable {\r\n /** @internal */\r\n private _name: string;\r\n /** @internal */\r\n private _skeletons: AssetSkeleton[];\r\n /** @internal */\r\n private _nodes: AssetHierarchyNode[];\r\n /** @internal */\r\n private _animations: AssetAnimationData[];\r\n /** @internal */\r\n private _scenes: AssetScene[];\r\n /** @internal */\r\n private _activeScene: number;\r\n /**\r\n * Creates an instance of SharedModel\r\n * @param name - Name of the model\r\n */\r\n constructor(name?: string) {\r\n super();\r\n this._name = name || '';\r\n this._skeletons = [];\r\n this._nodes = [];\r\n this._scenes = [];\r\n this._animations = [];\r\n this._activeScene = -1;\r\n }\r\n /** Name of the model */\r\n get name() {\r\n return this._name;\r\n }\r\n set name(val) {\r\n this._name = val;\r\n }\r\n /** All scenes that the model contains */\r\n get scenes() {\r\n return this._scenes;\r\n }\r\n /** All animations that the model contains */\r\n get animations() {\r\n return this._animations;\r\n }\r\n /** All skeletons that the model contains */\r\n get skeletons() {\r\n return this._skeletons;\r\n }\r\n /** All nodes that the model contains */\r\n get nodes() {\r\n return this._nodes;\r\n }\r\n /** The active scene of the model */\r\n get activeScene() {\r\n return this._activeScene;\r\n }\r\n set activeScene(val) {\r\n this._activeScene = val;\r\n }\r\n /**\r\n * Adds a node to the scene\r\n * @param parent - Under which node the node should be added\r\n * @param index - Index of the node\r\n * @param name - Name of the node\r\n * @returns The added node\r\n */\r\n addNode(parent: Nullable<AssetHierarchyNode>, index: number, name: string) {\r\n const childNode = new AssetHierarchyNode(name, parent);\r\n this._nodes[index] = childNode;\r\n return childNode;\r\n }\r\n /**\r\n * Adds a skeleton to the scene\r\n * @param skeleton - The skeleton to be added\r\n */\r\n addSkeleton(skeleton: AssetSkeleton) {\r\n this._skeletons.push(skeleton);\r\n }\r\n /**\r\n * Adds an animation to the scene\r\n * @param animation - The animation to be added\r\n */\r\n addAnimation(animation: AssetAnimationData) {\r\n this._animations.push(animation);\r\n }\r\n createSceneNode(scene: Scene, instancing: boolean) {\r\n const group = new SceneNode(scene);\r\n group.name = this.name;\r\n const animationSet = group.animationSet;\r\n for (let i = 0; i < this.scenes.length; i++) {\r\n const assetScene = this.scenes[i];\r\n const skeletonMeshMap: Map<\r\n AssetSkeleton,\r\n { mesh: Mesh[]; bounding: AssetSubMeshData[]; skeleton?: Skeleton }\r\n > = new Map();\r\n const nodeMap: Map<AssetHierarchyNode, SceneNode> = new Map();\r\n for (let k = 0; k < assetScene.rootNodes.length; k++) {\r\n this.setAssetNodeToSceneNode(\r\n scene,\r\n group,\r\n assetScene.rootNodes[k],\r\n skeletonMeshMap,\r\n nodeMap,\r\n instancing\r\n );\r\n }\r\n for (const animationData of this.animations) {\r\n let name = animationData.name ?? `_embbeded_animation`;\r\n if (animationSet.getAnimationClip(name)) {\r\n const baseName = name;\r\n for (let t = 1; ; t++) {\r\n name = `${baseName}_${t}`;\r\n if (!animationSet.getAnimationClip(name)) {\r\n break;\r\n }\r\n }\r\n }\r\n const animation = animationSet.createAnimation(name, true)!;\r\n for (const track of animationData.tracks) {\r\n if (track.type === 'translation') {\r\n animation.addTrack(nodeMap.get(track.node)!, new NodeTranslationTrack(track.interpolator, true));\r\n } else if (track.type === 'scale') {\r\n animation.addTrack(nodeMap.get(track.node)!, new NodeScaleTrack(track.interpolator, true));\r\n } else if (track.type === 'rotation') {\r\n animation.addTrack(nodeMap.get(track.node)!, new NodeRotationTrack(track.interpolator, true));\r\n } else if (track.type === 'weights') {\r\n for (const m of track.node.mesh!.subMeshes) {\r\n if (track.interpolator.stride > MAX_MORPH_TARGETS) {\r\n console.error(\r\n `Morph target too large: ${track.interpolator.stride}, the maximum is ${MAX_MORPH_TARGETS}`\r\n );\r\n } else {\r\n const morphTrack = new MorphTargetTrack(\r\n track.interpolator,\r\n track.defaultMorphWeights,\r\n m.targetBox,\r\n m.mesh!.getBoundingVolume()!.toAABB(),\r\n true\r\n );\r\n animation.addTrack(m.mesh!, morphTrack);\r\n }\r\n }\r\n } else {\r\n console.error(`Invalid animation track type: ${track.type}`);\r\n }\r\n }\r\n for (const sk of animationData.skeletons) {\r\n const nodes = skeletonMeshMap.get(sk);\r\n if (nodes) {\r\n if (!nodes.skeleton) {\r\n nodes.skeleton = new Skeleton(\r\n sk.joints.map((val) => nodeMap.get(val)!),\r\n sk.inverseBindMatrices,\r\n sk.bindPose\r\n );\r\n for (let i = 0; i < nodes.mesh.length; i++) {\r\n const mesh = nodes.mesh[i];\r\n const v = {\r\n positions: nodes.bounding[i].rawPositions!,\r\n blendIndices: nodes.bounding[i].rawBlendIndices!,\r\n weights: nodes.bounding[i].rawJointWeights!\r\n };\r\n mesh.setSkinnedBoundingInfo(nodes.skeleton.getBoundingInfo(v));\r\n mesh.skeletonName = nodes.skeleton.persistentId;\r\n }\r\n animationSet.skeletons.push(new DRef(nodes.skeleton));\r\n }\r\n animation.addSkeleton(nodes.skeleton.persistentId);\r\n }\r\n }\r\n }\r\n }\r\n group.iterate((child) => {\r\n if (child !== group) {\r\n child.sealed = true;\r\n }\r\n });\r\n group.sharedModel = this;\r\n return group;\r\n }\r\n protected onDispose() {\r\n super.onDispose();\r\n const nodes = [...this._nodes];\r\n while (nodes.length > 0) {\r\n const node = nodes.shift();\r\n nodes.push(...node!.children);\r\n const mesh = node!.mesh;\r\n if (mesh) {\r\n for (const subMesh of mesh.subMeshes) {\r\n subMesh.primitive?.dispose();\r\n subMesh.material?.dispose();\r\n }\r\n }\r\n }\r\n this._nodes = [];\r\n this._skeletons = [];\r\n this._scenes = [];\r\n this._animations = [];\r\n }\r\n private setAssetNodeToSceneNode(\r\n scene: Scene,\r\n parent: SceneNode,\r\n assetNode: AssetHierarchyNode,\r\n skeletonMeshMap: Map<AssetSkeleton, { mesh: Mesh[]; bounding: AssetSubMeshData[] }>,\r\n nodeMap: Map<AssetHierarchyNode, SceneNode>,\r\n instancing: boolean\r\n ) {\r\n const node: SceneNode = new SceneNode(scene);\r\n nodeMap.set(assetNode, node);\r\n node.name = assetNode.name ?? '';\r\n node.position.set(assetNode.position);\r\n node.rotation.set(assetNode.rotation);\r\n node.scale.set(assetNode.scaling);\r\n if (assetNode.mesh) {\r\n const meshData = assetNode.mesh;\r\n const skeleton = assetNode.skeleton;\r\n for (const subMesh of meshData.subMeshes) {\r\n for (const instance of assetNode.instances!) {\r\n const meshNode = new Mesh(scene);\r\n meshNode.position = instance.t;\r\n meshNode.scale = instance.s;\r\n meshNode.rotation = instance.r;\r\n meshNode.name = subMesh.name;\r\n meshNode.clipTestEnabled = true;\r\n meshNode.showState = 'inherit';\r\n meshNode.skinAnimation = !!skeleton;\r\n meshNode.morphAnimation = subMesh.numTargets > 0;\r\n meshNode.primitive = subMesh.primitive.get()!;\r\n meshNode.material =\r\n instancing && !meshNode.skinAnimation && !meshNode.morphAnimation\r\n ? subMesh.material.get()!.createInstance()\r\n : subMesh.material.get()!.clone();\r\n meshNode.parent = node;\r\n subMesh.mesh = meshNode;\r\n processMorphData(subMesh, meshData.morphWeights!);\r\n if (skeleton) {\r\n if (!skeletonMeshMap.has(skeleton)) {\r\n skeletonMeshMap.set(skeleton, { mesh: [meshNode], bounding: [subMesh] });\r\n } else {\r\n skeletonMeshMap.get(skeleton)!.mesh.push(meshNode);\r\n skeletonMeshMap.get(skeleton)!.bounding.push(subMesh);\r\n }\r\n }\r\n }\r\n }\r\n }\r\n node.parent = parent;\r\n for (const child of assetNode.children) {\r\n this.setAssetNodeToSceneNode(scene, node, child, skeletonMeshMap, nodeMap, instancing);\r\n }\r\n }\r\n}\r\n"],"names":["NamedObject","name","AssetHierarchyNode","_parent","_position","_rotation","_scaling","_mesh","_skeleton","_attachToSkeleton","_meshAttached","_matrix","_worldMatrix","_weights","_children","_instances","parent","Vector3","zero","Quaternion","identity","one","addChild","matrix","worldMatrix","mesh","data","setMeshAttached","instances","weights","val","skeleton","position","rotation","scaling","meshAttached","children","skeletonAttached","computeTransforms","parentTransform","Matrix4x4","rotateLeft","translateLeft","multiply","child","Error","push","removeChild","index","indexOf","splice","attachToSkeleton","Set","add","AssetSkeleton","pivot","joints","inverseBindMatrices","bindPose","addJoint","joint","inverseBindMatrix","clone","scale","AssetScene","rootNodes","SharedModel","Disposable","_name","_skeletons","_nodes","_scenes","_animations","_activeScene","scenes","animations","skeletons","nodes","activeScene","addNode","childNode","addSkeleton","addAnimation","animation","createSceneNode","scene","instancing","group","SceneNode","animationSet","i","length","assetScene","skeletonMeshMap","Map","nodeMap","k","setAssetNodeToSceneNode","animationData","getAnimationClip","baseName","t","createAnimation","track","tracks","type","addTrack","get","node","NodeTranslationTrack","interpolator","NodeScaleTrack","NodeRotationTrack","m","subMeshes","stride","MAX_MORPH_TARGETS","console","error","morphTrack","MorphTargetTrack","defaultMorphWeights","targetBox","getBoundingVolume","toAABB","sk","Skeleton","map","v","positions","bounding","rawPositions","blendIndices","rawBlendIndices","rawJointWeights","setSkinnedBoundingInfo","getBoundingInfo","skeletonName","persistentId","DRef","iterate","sealed","sharedModel","onDispose","shift","subMesh","primitive","dispose","material","assetNode","set","meshData","instance","meshNode","Mesh","s","r","clipTestEnabled","showState","skinAnimation","morphAnimation","numTargets","createInstance","processMorphData","morphWeights","has"],"mappings":"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"}
|
|
@@ -79,10 +79,10 @@ import { getDevice, getEngine } from '../app/api.js';
|
|
|
79
79
|
}
|
|
80
80
|
}
|
|
81
81
|
/** Adjust aspect ratio according to viewport settings of the camera */ adjustAspectRatio() {
|
|
82
|
-
if (this.
|
|
83
|
-
this.aspect = this.
|
|
82
|
+
if (this.viewport) {
|
|
83
|
+
this.aspect = this.viewport[2] / this.viewport[3];
|
|
84
84
|
} else {
|
|
85
|
-
if (getDevice().getFramebuffer()) {
|
|
85
|
+
if (!this.adapted || getDevice().getFramebuffer()) {
|
|
86
86
|
const vp = getDevice().getViewport();
|
|
87
87
|
this.aspect = vp.width / vp.height;
|
|
88
88
|
} else {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"perspectivecamera.js","sources":["../../src/camera/perspectivecamera.ts"],"sourcesContent":["import { Camera } from './camera';\r\nimport type { Scene } from '../scene/scene';\r\nimport type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Matrix4x4 } from '@zephyr3d/base';\r\nimport { getDevice, getEngine } from '../app/api';\r\n\r\n/**\r\n * Perspective camera class\r\n * @public\r\n */\r\nexport class PerspectiveCamera extends Camera {\r\n /** @internal */\r\n private _near: number;\r\n private _far: number;\r\n private _fovY: number;\r\n private _aspect: number;\r\n private _autoAspect: boolean;\r\n private _window: Nullable<number[]>;\r\n /**\r\n * Creates an instance of PerspectiveCamera\r\n * @param scene - The scene that the camera belongs to.\r\n * @param fovY - A radian value indicates the field of view in Y axis\r\n * @param aspect - Aspect ratio of the perspective transform\r\n * @param near - The near clip plane\r\n * @param far - The far clip plane\r\n */\r\n constructor(scene: Nullable<Scene>, fovY = Math.PI / 3, near = 1, far = 1000, aspect = 1) {\r\n super(scene);\r\n this._fovY = fovY;\r\n this._aspect = aspect;\r\n this._near = near;\r\n this._far = far;\r\n this._autoAspect = true;\r\n this._window = null;\r\n this._invalidate(true);\r\n }\r\n /** Sub-window of the frustum */\r\n get window(): Nullable<Immutable<number[]>> {\r\n return this._window;\r\n }\r\n set window(val: Nullable<number[]>) {\r\n this._window = val?.slice() ?? null;\r\n this._invalidate(true);\r\n }\r\n /** Automatically calculate aspect ratio before render according to current viewport */\r\n get autoAspect() {\r\n return this._autoAspect;\r\n }\r\n set autoAspect(val) {\r\n this._autoAspect = !!val;\r\n }\r\n /** The near clip plane */\r\n get near() {\r\n return this._near;\r\n }\r\n set near(val) {\r\n if (val !== this._near) {\r\n this._near = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The far clip plane */\r\n get far() {\r\n return this._far;\r\n }\r\n set far(val) {\r\n if (val !== this._far) {\r\n this._far = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Radian value indicates the field of view in Y axis */\r\n get fovY() {\r\n return this._fovY;\r\n }\r\n set fovY(val) {\r\n if (val !== this._fovY) {\r\n this._fovY = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Aspect ratio of the perspective transform */\r\n get aspect() {\r\n return this._aspect;\r\n }\r\n set aspect(val) {\r\n if (val !== this._aspect) {\r\n this._aspect = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Adjust aspect ratio according to viewport settings of the camera */\r\n adjustAspectRatio() {\r\n if (this._viewport) {\r\n this.aspect = this._viewport[2] / this._viewport[3];\r\n } else {\r\n if (getDevice().getFramebuffer()) {\r\n const vp = getDevice().getViewport();\r\n this.aspect = vp.width / vp.height;\r\n } else {\r\n const transform = getEngine().screen.transform;\r\n this.aspect = transform.viewportWidth / transform.viewportHeight;\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Camera.setPerspective}\r\n */\r\n setPerspective(fovY: number, aspect: number, zNear: number, zFar: number) {\r\n this._aspect = aspect;\r\n this._fovY = fovY;\r\n this._near = zNear;\r\n this._far = zFar;\r\n this._invalidate(true);\r\n return this;\r\n }\r\n /**\r\n * Not valid for PerspectiveCamera\r\n *\r\n * @remarks\r\n * This method is only valid for {@link Camera} class or {@link OrthoCamera} class.\r\n */\r\n setOrtho(_left: number, _right: number, _bottom: number, _top: number, _near: number, _far: number): this {\r\n throw new Error(`setOrtho() not allowed on PerspectiveCamera`);\r\n }\r\n /**\r\n * Setup a projection matrix for the camera\r\n * @param matrix - The projection matrix\r\n */\r\n setProjectionMatrix(matrix: Matrix4x4) {\r\n if (matrix !== this._projMatrix) {\r\n if (matrix?.isPerspective()) {\r\n super.setProjectionMatrix(matrix);\r\n this._aspect = matrix.getAspect();\r\n this._fovY = matrix.getFov();\r\n this._near = matrix.getNearPlane();\r\n this._far = matrix.getFarPlane();\r\n } else {\r\n throw new Error(\r\n `PerspectiveCamera.setProjectionMatrix(): param is not a perspective projection matrix`\r\n );\r\n }\r\n }\r\n }\r\n /** {@inheritDoc Camera.render} */\r\n render(scene: Scene) {\r\n if (this._autoAspect) {\r\n this.adjustAspectRatio();\r\n }\r\n super.render(scene);\r\n }\r\n /** @internal */\r\n protected _computeProj() {\r\n if (this.adapted) {\r\n this.calcAdaptedPerspectiveProjection(this._fovY, this._near, this._far, this._projMatrix);\r\n } else {\r\n const h = this._near * Math.tan(this._fovY * 0.5);\r\n const w = h * this._aspect;\r\n let left = -w;\r\n let right = w;\r\n let top = h;\r\n let bottom = -h;\r\n if (this._window) {\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * this._window[0];\r\n bottom += height * this._window[1];\r\n right = left + width * this._window[2];\r\n top = bottom + height * this._window[3];\r\n }\r\n this._projMatrix.frustum(left, right, bottom, top, this._near, this._far);\r\n }\r\n Matrix4x4.invert(this._projMatrix, this._invProjMatrix);\r\n }\r\n}\r\n"],"names":["PerspectiveCamera","Camera","_far","_fovY","_aspect","_autoAspect","_window","scene","fovY","Math","PI","near","far","aspect","_near","_invalidate","window","val","slice","autoAspect","adjustAspectRatio","_viewport","getDevice","getFramebuffer","vp","getViewport","width","height","transform","getEngine","screen","viewportWidth","viewportHeight","setPerspective","zNear","zFar","setOrtho","_left","_right","_bottom","_top","Error","setProjectionMatrix","matrix","_projMatrix","isPerspective","getAspect","getFov","getNearPlane","getFarPlane","render","adapted","calcAdaptedPerspectiveProjection","h","tan","w","left","right","top","bottom","frustum","Matrix4x4","invert","_invProjMatrix"],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"perspectivecamera.js","sources":["../../src/camera/perspectivecamera.ts"],"sourcesContent":["import { Camera } from './camera';\r\nimport type { Scene } from '../scene/scene';\r\nimport type { Immutable, Nullable } from '@zephyr3d/base';\r\nimport { Matrix4x4 } from '@zephyr3d/base';\r\nimport { getDevice, getEngine } from '../app/api';\r\n\r\n/**\r\n * Perspective camera class\r\n * @public\r\n */\r\nexport class PerspectiveCamera extends Camera {\r\n /** @internal */\r\n private _near: number;\r\n private _far: number;\r\n private _fovY: number;\r\n private _aspect: number;\r\n private _autoAspect: boolean;\r\n private _window: Nullable<number[]>;\r\n /**\r\n * Creates an instance of PerspectiveCamera\r\n * @param scene - The scene that the camera belongs to.\r\n * @param fovY - A radian value indicates the field of view in Y axis\r\n * @param aspect - Aspect ratio of the perspective transform\r\n * @param near - The near clip plane\r\n * @param far - The far clip plane\r\n */\r\n constructor(scene: Nullable<Scene>, fovY = Math.PI / 3, near = 1, far = 1000, aspect = 1) {\r\n super(scene);\r\n this._fovY = fovY;\r\n this._aspect = aspect;\r\n this._near = near;\r\n this._far = far;\r\n this._autoAspect = true;\r\n this._window = null;\r\n this._invalidate(true);\r\n }\r\n /** Sub-window of the frustum */\r\n get window(): Nullable<Immutable<number[]>> {\r\n return this._window;\r\n }\r\n set window(val: Nullable<number[]>) {\r\n this._window = val?.slice() ?? null;\r\n this._invalidate(true);\r\n }\r\n /** Automatically calculate aspect ratio before render according to current viewport */\r\n get autoAspect() {\r\n return this._autoAspect;\r\n }\r\n set autoAspect(val) {\r\n this._autoAspect = !!val;\r\n }\r\n /** The near clip plane */\r\n get near() {\r\n return this._near;\r\n }\r\n set near(val) {\r\n if (val !== this._near) {\r\n this._near = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** The far clip plane */\r\n get far() {\r\n return this._far;\r\n }\r\n set far(val) {\r\n if (val !== this._far) {\r\n this._far = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Radian value indicates the field of view in Y axis */\r\n get fovY() {\r\n return this._fovY;\r\n }\r\n set fovY(val) {\r\n if (val !== this._fovY) {\r\n this._fovY = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Aspect ratio of the perspective transform */\r\n get aspect() {\r\n return this._aspect;\r\n }\r\n set aspect(val) {\r\n if (val !== this._aspect) {\r\n this._aspect = val;\r\n this._invalidate(true);\r\n }\r\n }\r\n /** Adjust aspect ratio according to viewport settings of the camera */\r\n adjustAspectRatio() {\r\n if (this.viewport) {\r\n this.aspect = this.viewport[2] / this.viewport[3];\r\n } else {\r\n if (!this.adapted || getDevice().getFramebuffer()) {\r\n const vp = getDevice().getViewport();\r\n this.aspect = vp.width / vp.height;\r\n } else {\r\n const transform = getEngine().screen.transform;\r\n this.aspect = transform.viewportWidth / transform.viewportHeight;\r\n }\r\n }\r\n }\r\n /**\r\n * {@inheritDoc Camera.setPerspective}\r\n */\r\n setPerspective(fovY: number, aspect: number, zNear: number, zFar: number) {\r\n this._aspect = aspect;\r\n this._fovY = fovY;\r\n this._near = zNear;\r\n this._far = zFar;\r\n this._invalidate(true);\r\n return this;\r\n }\r\n /**\r\n * Not valid for PerspectiveCamera\r\n *\r\n * @remarks\r\n * This method is only valid for {@link Camera} class or {@link OrthoCamera} class.\r\n */\r\n setOrtho(_left: number, _right: number, _bottom: number, _top: number, _near: number, _far: number): this {\r\n throw new Error(`setOrtho() not allowed on PerspectiveCamera`);\r\n }\r\n /**\r\n * Setup a projection matrix for the camera\r\n * @param matrix - The projection matrix\r\n */\r\n setProjectionMatrix(matrix: Matrix4x4) {\r\n if (matrix !== this._projMatrix) {\r\n if (matrix?.isPerspective()) {\r\n super.setProjectionMatrix(matrix);\r\n this._aspect = matrix.getAspect();\r\n this._fovY = matrix.getFov();\r\n this._near = matrix.getNearPlane();\r\n this._far = matrix.getFarPlane();\r\n } else {\r\n throw new Error(\r\n `PerspectiveCamera.setProjectionMatrix(): param is not a perspective projection matrix`\r\n );\r\n }\r\n }\r\n }\r\n /** {@inheritDoc Camera.render} */\r\n render(scene: Scene) {\r\n if (this._autoAspect) {\r\n this.adjustAspectRatio();\r\n }\r\n super.render(scene);\r\n }\r\n /** @internal */\r\n protected _computeProj() {\r\n if (this.adapted) {\r\n this.calcAdaptedPerspectiveProjection(this._fovY, this._near, this._far, this._projMatrix);\r\n } else {\r\n const h = this._near * Math.tan(this._fovY * 0.5);\r\n const w = h * this._aspect;\r\n let left = -w;\r\n let right = w;\r\n let top = h;\r\n let bottom = -h;\r\n if (this._window) {\r\n const width = right - left;\r\n const height = top - bottom;\r\n left += width * this._window[0];\r\n bottom += height * this._window[1];\r\n right = left + width * this._window[2];\r\n top = bottom + height * this._window[3];\r\n }\r\n this._projMatrix.frustum(left, right, bottom, top, this._near, this._far);\r\n }\r\n Matrix4x4.invert(this._projMatrix, this._invProjMatrix);\r\n }\r\n}\r\n"],"names":["PerspectiveCamera","Camera","_far","_fovY","_aspect","_autoAspect","_window","scene","fovY","Math","PI","near","far","aspect","_near","_invalidate","window","val","slice","autoAspect","adjustAspectRatio","viewport","adapted","getDevice","getFramebuffer","vp","getViewport","width","height","transform","getEngine","screen","viewportWidth","viewportHeight","setPerspective","zNear","zFar","setOrtho","_left","_right","_bottom","_top","Error","setProjectionMatrix","matrix","_projMatrix","isPerspective","getAspect","getFov","getNearPlane","getFarPlane","render","calcAdaptedPerspectiveProjection","h","tan","w","left","right","top","bottom","frustum","Matrix4x4","invert","_invProjMatrix"],"mappings":"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"}
|