@zephyr3d/scene 0.9.3 → 0.9.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/animation/animationmask.js +224 -0
- package/dist/animation/animationmask.js.map +1 -0
- package/dist/animation/animationset.js +268 -67
- package/dist/animation/animationset.js.map +1 -1
- package/dist/animation/animationtrack.js.map +1 -1
- package/dist/animation/eulerrotationtrack.js +3 -0
- package/dist/animation/eulerrotationtrack.js.map +1 -1
- package/dist/animation/fixed_geometry_cache_track.js +7 -0
- package/dist/animation/fixed_geometry_cache_track.js.map +1 -1
- package/dist/animation/ik_modifier.js.map +1 -1
- package/dist/animation/joint_dynamics/collision.js +6 -4
- package/dist/animation/joint_dynamics/collision.js.map +1 -1
- package/dist/animation/joint_dynamics/controller.js +390 -43
- package/dist/animation/joint_dynamics/controller.js.map +1 -1
- package/dist/animation/joint_dynamics/joint_dynamics_system.js +62 -3
- package/dist/animation/joint_dynamics/joint_dynamics_system.js.map +1 -1
- package/dist/animation/joint_dynamics/solver.js +4 -3
- package/dist/animation/joint_dynamics/solver.js.map +1 -1
- package/dist/animation/joint_dynamics/types.js.map +1 -1
- package/dist/animation/joint_dynamics_modifier.js +2 -0
- package/dist/animation/joint_dynamics_modifier.js.map +1 -1
- package/dist/animation/morphtarget.js +3 -72
- package/dist/animation/morphtarget.js.map +1 -1
- package/dist/animation/morphtrack.js +3 -0
- package/dist/animation/morphtrack.js.map +1 -1
- package/dist/animation/pca_geometry_cache_track.js +3 -0
- package/dist/animation/pca_geometry_cache_track.js.map +1 -1
- package/dist/animation/proptrack.js +3 -0
- package/dist/animation/proptrack.js.map +1 -1
- package/dist/animation/rotationtrack.js +3 -0
- package/dist/animation/rotationtrack.js.map +1 -1
- package/dist/animation/scaletrack.js +3 -0
- package/dist/animation/scaletrack.js.map +1 -1
- package/dist/animation/skeleton.js +254 -79
- package/dist/animation/skeleton.js.map +1 -1
- package/dist/animation/skeleton_modifier.js.map +1 -1
- package/dist/animation/spring/spring_particle.js +4 -4
- package/dist/animation/spring/spring_particle.js.map +1 -1
- package/dist/animation/spring_modifier.js.map +1 -1
- package/dist/animation/translationtrack.js +3 -0
- package/dist/animation/translationtrack.js.map +1 -1
- package/dist/app/engine.js +129 -17
- package/dist/app/engine.js.map +1 -1
- package/dist/app/scriptregistry.js +251 -80
- package/dist/app/scriptregistry.js.map +1 -1
- package/dist/asset/assetmanager.js +133 -102
- package/dist/asset/assetmanager.js.map +1 -1
- package/dist/asset/loaders/gltf/gltf_loader.js +18 -14
- package/dist/asset/loaders/gltf/gltf_loader.js.map +1 -1
- package/dist/asset/loaders/loader.js +1 -6
- package/dist/asset/loaders/loader.js.map +1 -1
- package/dist/asset/loaders/zabc/zabc_loader.js.map +1 -1
- package/dist/asset/model.js +1052 -183
- package/dist/asset/model.js.map +1 -1
- package/dist/avatar/wardrobe.js +474 -0
- package/dist/avatar/wardrobe.js.map +1 -0
- package/dist/index.d.ts +1810 -233
- package/dist/index.js +13 -3
- package/dist/index.js.map +1 -1
- package/dist/material/material.js +1 -1
- package/dist/material/material.js.map +1 -1
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js +6 -3
- package/dist/material/mixins/lightmodel/pbrmetallicroughness.js.map +1 -1
- package/dist/material/mixins/pbr/common.js +72 -15
- package/dist/material/mixins/pbr/common.js.map +1 -1
- package/dist/material/msdf_text.js +180 -0
- package/dist/material/msdf_text.js.map +1 -0
- package/dist/material/msdf_text_sprite.js +64 -0
- package/dist/material/msdf_text_sprite.js.map +1 -0
- package/dist/material/pbrblueprint.js +21 -6
- package/dist/material/pbrblueprint.js.map +1 -1
- package/dist/material/shader/helper.js +277 -277
- package/dist/material/shader/helper.js.map +1 -1
- package/dist/material/sprite_sdf.js +106 -0
- package/dist/material/sprite_sdf.js.map +1 -0
- package/dist/posteffect/ssr.js +1 -0
- package/dist/posteffect/ssr.js.map +1 -1
- package/dist/render/abuffer_oit.js +1 -0
- package/dist/render/abuffer_oit.js.map +1 -1
- package/dist/render/cluster_light.js.map +1 -1
- package/dist/render/cull_visitor.js +28 -0
- package/dist/render/cull_visitor.js.map +1 -1
- package/dist/render/drawable.js.map +1 -1
- package/dist/render/drawable_mixin.js +1 -0
- package/dist/render/drawable_mixin.js.map +1 -1
- package/dist/render/envlight.js +54 -1
- package/dist/render/envlight.js.map +1 -1
- package/dist/render/fbm_wavegenerator.js +1 -0
- package/dist/render/fbm_wavegenerator.js.map +1 -1
- package/dist/render/gerstner_wavegenerator.js +1 -0
- package/dist/render/gerstner_wavegenerator.js.map +1 -1
- package/dist/render/globalbindgroup_allocator.js +1 -0
- package/dist/render/globalbindgroup_allocator.js.map +1 -1
- package/dist/render/render_queue.js +1 -0
- package/dist/render/render_queue.js.map +1 -1
- package/dist/render/sky.js +9 -0
- package/dist/render/sky.js.map +1 -1
- package/dist/scene/basesprite.js +1 -5
- package/dist/scene/basesprite.js.map +1 -1
- package/dist/scene/batchgroup.js +18 -8
- package/dist/scene/batchgroup.js.map +1 -1
- package/dist/scene/environment.js +16 -2
- package/dist/scene/environment.js.map +1 -1
- package/dist/scene/mesh.js +164 -102
- package/dist/scene/mesh.js.map +1 -1
- package/dist/scene/meshdrawable.js +96 -0
- package/dist/scene/meshdrawable.js.map +1 -0
- package/dist/scene/msdftext.js +341 -0
- package/dist/scene/msdftext.js.map +1 -0
- package/dist/scene/msdftextsprite.js +349 -0
- package/dist/scene/msdftextsprite.js.map +1 -0
- package/dist/scene/particlesys.js +1 -0
- package/dist/scene/particlesys.js.map +1 -1
- package/dist/scene/scene.js +2 -0
- package/dist/scene/scene.js.map +1 -1
- package/dist/scene/scene_node.js +437 -230
- package/dist/scene/scene_node.js.map +1 -1
- package/dist/scene/sdftextsprite.js +322 -0
- package/dist/scene/sdftextsprite.js.map +1 -0
- package/dist/scene/terrain-cm/grass.js +1 -0
- package/dist/scene/terrain-cm/grass.js.map +1 -1
- package/dist/scene/terrain-cm/grassmaterial.js +1 -0
- package/dist/scene/terrain-cm/grassmaterial.js.map +1 -1
- package/dist/scene/terrain-cm/terrain-cm.js +1 -0
- package/dist/scene/terrain-cm/terrain-cm.js.map +1 -1
- package/dist/scene/textsprite.js +120 -0
- package/dist/scene/textsprite.js.map +1 -0
- package/dist/scene/water.js +1 -0
- package/dist/scene/water.js.map +1 -1
- package/dist/shadow/shader.js +1 -0
- package/dist/shadow/shader.js.map +1 -1
- package/dist/text/font/font_asset.js +884 -0
- package/dist/text/font/font_asset.js.map +1 -0
- package/dist/text/font/sfnt_reader.js +43 -0
- package/dist/text/font/sfnt_reader.js.map +1 -0
- package/dist/text/msdf/generator.js +417 -0
- package/dist/text/msdf/generator.js.map +1 -0
- package/dist/text/msdf/shape.js +146 -0
- package/dist/text/msdf/shape.js.map +1 -0
- package/dist/text/runtime/msdf_glyph_atlas.js +146 -0
- package/dist/text/runtime/msdf_glyph_atlas.js.map +1 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js +50 -0
- package/dist/text/runtime/msdf_text_atlas_manager.js.map +1 -0
- package/dist/text/runtime/text_layout.js +96 -0
- package/dist/text/runtime/text_layout.js.map +1 -0
- package/dist/utility/blueprint/material/inputs.js +188 -1
- package/dist/utility/blueprint/material/inputs.js.map +1 -1
- package/dist/utility/blueprint/material/ir.js +16 -1
- package/dist/utility/blueprint/material/ir.js.map +1 -1
- package/dist/utility/blueprint/material/pbr.js +32 -0
- package/dist/utility/blueprint/material/pbr.js.map +1 -1
- package/dist/utility/bounding_volume.js.map +1 -1
- package/dist/utility/pmrem.js +34 -8
- package/dist/utility/pmrem.js.map +1 -1
- package/dist/utility/serialization/manager.js +340 -283
- package/dist/utility/serialization/manager.js.map +1 -1
- package/dist/utility/serialization/scene/animation.js +702 -7
- package/dist/utility/serialization/scene/animation.js.map +1 -1
- package/dist/utility/serialization/scene/batch.js +2 -0
- package/dist/utility/serialization/scene/batch.js.map +1 -1
- package/dist/utility/serialization/scene/camera.js +2 -0
- package/dist/utility/serialization/scene/camera.js.map +1 -1
- package/dist/utility/serialization/scene/light.js +2 -0
- package/dist/utility/serialization/scene/light.js.map +1 -1
- package/dist/utility/serialization/scene/material.js +1 -0
- package/dist/utility/serialization/scene/material.js.map +1 -1
- package/dist/utility/serialization/scene/mesh.js +66 -4
- package/dist/utility/serialization/scene/mesh.js.map +1 -1
- package/dist/utility/serialization/scene/node.js +189 -8
- package/dist/utility/serialization/scene/node.js.map +1 -1
- package/dist/utility/serialization/scene/particle.js +2 -0
- package/dist/utility/serialization/scene/particle.js.map +1 -1
- package/dist/utility/serialization/scene/primitive.js +1 -0
- package/dist/utility/serialization/scene/primitive.js.map +1 -1
- package/dist/utility/serialization/scene/sprite.js +2 -0
- package/dist/utility/serialization/scene/sprite.js.map +1 -1
- package/dist/utility/serialization/scene/terrain.js +2 -0
- package/dist/utility/serialization/scene/terrain.js.map +1 -1
- package/dist/utility/serialization/scene/text.js +516 -0
- package/dist/utility/serialization/scene/text.js.map +1 -0
- package/dist/utility/serialization/scene/water.js +2 -0
- package/dist/utility/serialization/scene/water.js.map +1 -1
- package/dist/utility/serialization/types.js.map +1 -1
- package/dist/utility/textures/sheenlut.js +138 -0
- package/dist/utility/textures/sheenlut.js.map +1 -0
- package/dist/values.js +48 -48
- package/dist/values.js.map +1 -1
- package/package.json +3 -3
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { NodeEulerRotationTrack } from './eulerrotationtrack.js';
|
|
2
|
+
import { NodeRotationTrack } from './rotationtrack.js';
|
|
3
|
+
import { NodeScaleTrack } from './scaletrack.js';
|
|
4
|
+
import { HumanoidBodyRig } from './skeleton.js';
|
|
5
|
+
import { NodeTranslationTrack } from './translationtrack.js';
|
|
6
|
+
|
|
7
|
+
function isNodeTransformTrack(track) {
|
|
8
|
+
return track instanceof NodeRotationTrack || track instanceof NodeEulerRotationTrack || track instanceof NodeTranslationTrack || track instanceof NodeScaleTrack;
|
|
9
|
+
}
|
|
10
|
+
function cloneTrack(track) {
|
|
11
|
+
const cloned = track.clone();
|
|
12
|
+
cloned.name = track.name;
|
|
13
|
+
cloned.target = track.target;
|
|
14
|
+
cloned.jointIndex = track.jointIndex;
|
|
15
|
+
return cloned;
|
|
16
|
+
}
|
|
17
|
+
function addJoint(set, rig, joint) {
|
|
18
|
+
if (joint && rig.joints.includes(joint)) {
|
|
19
|
+
set.add(joint);
|
|
20
|
+
}
|
|
21
|
+
}
|
|
22
|
+
function addJointAndDescendants(set, rig, joint) {
|
|
23
|
+
if (!joint) {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
for (const candidate of rig.joints){
|
|
27
|
+
if (joint === candidate || joint.isParentOf(candidate)) {
|
|
28
|
+
set.add(candidate);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
function removeJointAndDescendants(set, rig, joint) {
|
|
33
|
+
if (!joint) {
|
|
34
|
+
return;
|
|
35
|
+
}
|
|
36
|
+
for (const candidate of rig.joints){
|
|
37
|
+
if (joint === candidate || joint.isParentOf(candidate)) {
|
|
38
|
+
set.delete(candidate);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
function addSemanticJoint(set, rig, joint, includeDescendants) {
|
|
43
|
+
if (includeDescendants) {
|
|
44
|
+
addJointAndDescendants(set, rig, joint);
|
|
45
|
+
} else {
|
|
46
|
+
addJoint(set, rig, joint);
|
|
47
|
+
}
|
|
48
|
+
}
|
|
49
|
+
function removeSemanticJoint(set, rig, joint, includeDescendants) {
|
|
50
|
+
if (includeDescendants) {
|
|
51
|
+
removeJointAndDescendants(set, rig, joint);
|
|
52
|
+
} else if (joint) {
|
|
53
|
+
set.delete(joint);
|
|
54
|
+
}
|
|
55
|
+
}
|
|
56
|
+
function addHumanoidPreset(set, rig, mapping, preset, boundary) {
|
|
57
|
+
const body = mapping.body;
|
|
58
|
+
switch(preset){
|
|
59
|
+
case 'fullBody':
|
|
60
|
+
for (const joint of rig.joints){
|
|
61
|
+
set.add(joint);
|
|
62
|
+
}
|
|
63
|
+
break;
|
|
64
|
+
case 'upperBody':
|
|
65
|
+
addJointAndDescendants(set, rig, body[boundary ?? HumanoidBodyRig.Spine]);
|
|
66
|
+
removeJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftUpperLeg]);
|
|
67
|
+
removeJointAndDescendants(set, rig, body[HumanoidBodyRig.RightUpperLeg]);
|
|
68
|
+
break;
|
|
69
|
+
case 'lowerBody':
|
|
70
|
+
addJoint(set, rig, body[HumanoidBodyRig.Hips]);
|
|
71
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftUpperLeg]);
|
|
72
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.RightUpperLeg]);
|
|
73
|
+
break;
|
|
74
|
+
case 'head':
|
|
75
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.Neck]);
|
|
76
|
+
break;
|
|
77
|
+
case 'arms':
|
|
78
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftShoulder]);
|
|
79
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.RightShoulder]);
|
|
80
|
+
break;
|
|
81
|
+
case 'leftArm':
|
|
82
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftShoulder]);
|
|
83
|
+
break;
|
|
84
|
+
case 'rightArm':
|
|
85
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.RightShoulder]);
|
|
86
|
+
break;
|
|
87
|
+
case 'legs':
|
|
88
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftUpperLeg]);
|
|
89
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.RightUpperLeg]);
|
|
90
|
+
break;
|
|
91
|
+
case 'leftLeg':
|
|
92
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftUpperLeg]);
|
|
93
|
+
break;
|
|
94
|
+
case 'rightLeg':
|
|
95
|
+
addJointAndDescendants(set, rig, body[HumanoidBodyRig.RightUpperLeg]);
|
|
96
|
+
break;
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
function selectHumanoidJoints(rig, options) {
|
|
100
|
+
const mapping = rig.humanoidJointMapping;
|
|
101
|
+
if (!mapping) {
|
|
102
|
+
console.error('createSkeletalMaskedAnimation: skeleton does not have a humanoid joint mapping');
|
|
103
|
+
return null;
|
|
104
|
+
}
|
|
105
|
+
const selected = new Set();
|
|
106
|
+
if (options.preset) {
|
|
107
|
+
addHumanoidPreset(selected, rig, mapping, options.preset, options.boundary);
|
|
108
|
+
} else if (!options.includeBody?.length && !options.includeLeftHand?.length && !options.includeRightHand?.length) {
|
|
109
|
+
for (const joint of rig.joints){
|
|
110
|
+
selected.add(joint);
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
const includeDescendants = options.includeDescendants ?? true;
|
|
114
|
+
for (const semantic of options.includeBody ?? []){
|
|
115
|
+
addSemanticJoint(selected, rig, mapping.body[semantic], includeDescendants);
|
|
116
|
+
}
|
|
117
|
+
for (const semantic of options.includeLeftHand ?? []){
|
|
118
|
+
addSemanticJoint(selected, rig, mapping.leftHand?.[semantic], includeDescendants);
|
|
119
|
+
}
|
|
120
|
+
for (const semantic of options.includeRightHand ?? []){
|
|
121
|
+
addSemanticJoint(selected, rig, mapping.rightHand?.[semantic], includeDescendants);
|
|
122
|
+
}
|
|
123
|
+
for (const semantic of options.excludeBody ?? []){
|
|
124
|
+
removeSemanticJoint(selected, rig, mapping.body[semantic], includeDescendants);
|
|
125
|
+
}
|
|
126
|
+
for (const semantic of options.excludeLeftHand ?? []){
|
|
127
|
+
removeSemanticJoint(selected, rig, mapping.leftHand?.[semantic], includeDescendants);
|
|
128
|
+
}
|
|
129
|
+
for (const semantic of options.excludeRightHand ?? []){
|
|
130
|
+
removeSemanticJoint(selected, rig, mapping.rightHand?.[semantic], includeDescendants);
|
|
131
|
+
}
|
|
132
|
+
return selected;
|
|
133
|
+
}
|
|
134
|
+
function matchesJointName(joint, matcher) {
|
|
135
|
+
if (typeof matcher === 'string') {
|
|
136
|
+
return joint.name === matcher;
|
|
137
|
+
}
|
|
138
|
+
if (matcher instanceof RegExp) {
|
|
139
|
+
matcher.lastIndex = 0;
|
|
140
|
+
return matcher.test(joint.name);
|
|
141
|
+
}
|
|
142
|
+
return matcher(joint);
|
|
143
|
+
}
|
|
144
|
+
function selectNamedJoints(rig, options) {
|
|
145
|
+
const selected = new Set();
|
|
146
|
+
const includeDescendants = options.includeDescendants ?? false;
|
|
147
|
+
const included = options.include?.length ? rig.joints.filter((joint)=>options.include.some((matcher)=>matchesJointName(joint, matcher))) : rig.joints;
|
|
148
|
+
for (const joint of included){
|
|
149
|
+
if (includeDescendants) {
|
|
150
|
+
addJointAndDescendants(selected, rig, joint);
|
|
151
|
+
} else {
|
|
152
|
+
selected.add(joint);
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
for (const joint of rig.joints){
|
|
156
|
+
if (options.exclude?.some((matcher)=>matchesJointName(joint, matcher))) {
|
|
157
|
+
if (includeDescendants) {
|
|
158
|
+
removeJointAndDescendants(selected, rig, joint);
|
|
159
|
+
} else {
|
|
160
|
+
selected.delete(joint);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
return selected;
|
|
165
|
+
}
|
|
166
|
+
function getDefaultRootMotionMode(options) {
|
|
167
|
+
if (options.rootMotion) {
|
|
168
|
+
return options.rootMotion;
|
|
169
|
+
}
|
|
170
|
+
if (options.type === 'humanoid' && (options.preset === 'lowerBody' || options.preset === 'fullBody')) {
|
|
171
|
+
return 'include';
|
|
172
|
+
}
|
|
173
|
+
return 'exclude';
|
|
174
|
+
}
|
|
175
|
+
function isRootMotionTrack(target, track, rig) {
|
|
176
|
+
if (!(track instanceof NodeTranslationTrack)) {
|
|
177
|
+
return false;
|
|
178
|
+
}
|
|
179
|
+
const hips = rig.humanoidJointMapping?.body[HumanoidBodyRig.Hips];
|
|
180
|
+
return !!rig.rootJoint && target === rig.rootJoint || !!hips && target === hips;
|
|
181
|
+
}
|
|
182
|
+
function copySkeletonReferences(sourceClip, targetClip) {
|
|
183
|
+
for (const id of sourceClip.skeletons){
|
|
184
|
+
targetClip.addSkeleton(id);
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
/** @internal */ function createSkeletalMaskedAnimationClip(animationSet, sourceClip, targetName, rig, options) {
|
|
188
|
+
const selectedJoints = options.type === 'humanoid' ? selectHumanoidJoints(rig, options) : selectNamedJoints(rig, options);
|
|
189
|
+
if (!selectedJoints) {
|
|
190
|
+
return null;
|
|
191
|
+
}
|
|
192
|
+
const rootMotion = getDefaultRootMotionMode(options);
|
|
193
|
+
const unsupportedTracks = options.unsupportedTracks ?? 'skip';
|
|
194
|
+
const targetClip = animationSet.createAnimation(targetName);
|
|
195
|
+
if (!targetClip) {
|
|
196
|
+
return null;
|
|
197
|
+
}
|
|
198
|
+
targetClip.timeDuration = sourceClip.timeDuration;
|
|
199
|
+
targetClip.weight = sourceClip.weight;
|
|
200
|
+
targetClip.autoPlay = sourceClip.autoPlay;
|
|
201
|
+
copySkeletonReferences(sourceClip, targetClip);
|
|
202
|
+
for (const [target, tracks] of sourceClip.tracks){
|
|
203
|
+
for (const track of tracks){
|
|
204
|
+
if (!isNodeTransformTrack(track)) {
|
|
205
|
+
if (unsupportedTracks === 'error') {
|
|
206
|
+
console.error(`createSkeletalMaskedAnimation: unsupported track type '${track.constructor.name}'`);
|
|
207
|
+
animationSet.deleteAnimation(targetName);
|
|
208
|
+
return null;
|
|
209
|
+
}
|
|
210
|
+
continue;
|
|
211
|
+
}
|
|
212
|
+
const rootMotionTrack = isRootMotionTrack(target, track, rig);
|
|
213
|
+
const shouldCopy = rootMotion === 'only' ? rootMotionTrack : rootMotionTrack ? rootMotion === 'include' : selectedJoints.has(target);
|
|
214
|
+
if (shouldCopy) {
|
|
215
|
+
targetClip.addTrack(target, cloneTrack(track));
|
|
216
|
+
}
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
targetClip.timeDuration = sourceClip.timeDuration;
|
|
220
|
+
return targetClip;
|
|
221
|
+
}
|
|
222
|
+
|
|
223
|
+
export { createSkeletalMaskedAnimationClip };
|
|
224
|
+
//# sourceMappingURL=animationmask.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"animationmask.js","sources":["../../src/animation/animationmask.ts"],"sourcesContent":["import type { AnimationSet } from './animationset';\r\nimport type { AnimationClip } from './animation';\r\nimport type { AnimationTrack } from './animationtrack';\r\nimport { NodeEulerRotationTrack } from './eulerrotationtrack';\r\nimport { NodeRotationTrack } from './rotationtrack';\r\nimport { NodeScaleTrack } from './scaletrack';\r\nimport { HumanoidBodyRig } from './skeleton';\r\nimport type { HumanoidJointMapping, SkeletonRig, HumanoidHandRig } from './skeleton';\r\nimport { NodeTranslationTrack } from './translationtrack';\r\nimport type { SceneNode } from '../scene';\r\n\r\n/** @public */\r\nexport type SkeletalAnimationMaskRootMotionMode = 'include' | 'exclude' | 'only';\r\n\r\n/** @public */\r\nexport type SkeletalAnimationMaskUnsupportedTrackMode = 'skip' | 'error';\r\n\r\n/** @public */\r\nexport type HumanoidSkeletalAnimationMaskPreset =\r\n | 'fullBody'\r\n | 'upperBody'\r\n | 'lowerBody'\r\n | 'head'\r\n | 'arms'\r\n | 'leftArm'\r\n | 'rightArm'\r\n | 'legs'\r\n | 'leftLeg'\r\n | 'rightLeg';\r\n\r\n/** @public */\r\nexport type JointNameMatcher = string | RegExp | ((joint: SceneNode) => boolean);\r\n\r\n/** @public */\r\nexport type SkeletalAnimationMaskCommonOptions = {\r\n /**\r\n * How root translation tracks are copied.\r\n *\r\n * Defaults to `include` for lower/full body humanoid masks and to `exclude` otherwise.\r\n */\r\n rootMotion?: SkeletalAnimationMaskRootMotionMode;\r\n /**\r\n * How tracks outside node transform animation should be handled.\r\n *\r\n * Defaults to `skip`.\r\n */\r\n unsupportedTracks?: SkeletalAnimationMaskUnsupportedTrackMode;\r\n};\r\n\r\n/** @public */\r\nexport type HumanoidSkeletalAnimationMaskOptions = SkeletalAnimationMaskCommonOptions & {\r\n type: 'humanoid';\r\n /**\r\n * Optional semantic preset used as the initial joint set.\r\n */\r\n preset?: HumanoidSkeletalAnimationMaskPreset;\r\n /**\r\n * Boundary joint for `upperBody`. Defaults to `HumanoidBodyRig.Spine`.\r\n */\r\n boundary?: HumanoidBodyRig;\r\n /**\r\n * Additional body joints selected by semantic name.\r\n */\r\n includeBody?: HumanoidBodyRig[];\r\n /**\r\n * Body joints removed from the selected set.\r\n */\r\n excludeBody?: HumanoidBodyRig[];\r\n includeLeftHand?: HumanoidHandRig[];\r\n includeRightHand?: HumanoidHandRig[];\r\n excludeLeftHand?: HumanoidHandRig[];\r\n excludeRightHand?: HumanoidHandRig[];\r\n /**\r\n * Whether explicit semantic include/exclude entries affect their descendants.\r\n *\r\n * Defaults to true for humanoid semantic masks.\r\n */\r\n includeDescendants?: boolean;\r\n};\r\n\r\n/** @public */\r\nexport type NamedJointsSkeletalAnimationMaskOptions = SkeletalAnimationMaskCommonOptions & {\r\n type: 'joints';\r\n /**\r\n * Joint name matchers. If omitted, all rig joints are selected before exclusions.\r\n */\r\n include?: JointNameMatcher[];\r\n /**\r\n * Joint name matchers removed from the selected set.\r\n */\r\n exclude?: JointNameMatcher[];\r\n /**\r\n * Whether selected or excluded joints affect their descendants.\r\n *\r\n * Defaults to false for name masks.\r\n */\r\n includeDescendants?: boolean;\r\n};\r\n\r\n/** @public */\r\nexport type SkeletalAnimationMaskOptions =\r\n | HumanoidSkeletalAnimationMaskOptions\r\n | NamedJointsSkeletalAnimationMaskOptions;\r\n\r\nfunction isNodeTransformTrack(track: AnimationTrack): boolean {\r\n return (\r\n track instanceof NodeRotationTrack ||\r\n track instanceof NodeEulerRotationTrack ||\r\n track instanceof NodeTranslationTrack ||\r\n track instanceof NodeScaleTrack\r\n );\r\n}\r\n\r\nfunction cloneTrack(track: AnimationTrack): AnimationTrack {\r\n const cloned = track.clone();\r\n cloned.name = track.name;\r\n cloned.target = track.target;\r\n cloned.jointIndex = track.jointIndex;\r\n return cloned;\r\n}\r\n\r\nfunction addJoint(set: Set<SceneNode>, rig: SkeletonRig, joint: SceneNode | undefined) {\r\n if (joint && rig.joints.includes(joint)) {\r\n set.add(joint);\r\n }\r\n}\r\n\r\nfunction addJointAndDescendants(set: Set<SceneNode>, rig: SkeletonRig, joint: SceneNode | undefined) {\r\n if (!joint) {\r\n return;\r\n }\r\n for (const candidate of rig.joints) {\r\n if (joint === candidate || joint.isParentOf(candidate)) {\r\n set.add(candidate);\r\n }\r\n }\r\n}\r\n\r\nfunction removeJointAndDescendants(set: Set<SceneNode>, rig: SkeletonRig, joint: SceneNode | undefined) {\r\n if (!joint) {\r\n return;\r\n }\r\n for (const candidate of rig.joints) {\r\n if (joint === candidate || joint.isParentOf(candidate)) {\r\n set.delete(candidate);\r\n }\r\n }\r\n}\r\n\r\nfunction addSemanticJoint(\r\n set: Set<SceneNode>,\r\n rig: SkeletonRig,\r\n joint: SceneNode | undefined,\r\n includeDescendants: boolean\r\n) {\r\n if (includeDescendants) {\r\n addJointAndDescendants(set, rig, joint);\r\n } else {\r\n addJoint(set, rig, joint);\r\n }\r\n}\r\n\r\nfunction removeSemanticJoint(\r\n set: Set<SceneNode>,\r\n rig: SkeletonRig,\r\n joint: SceneNode | undefined,\r\n includeDescendants: boolean\r\n) {\r\n if (includeDescendants) {\r\n removeJointAndDescendants(set, rig, joint);\r\n } else if (joint) {\r\n set.delete(joint);\r\n }\r\n}\r\n\r\nfunction addHumanoidPreset(\r\n set: Set<SceneNode>,\r\n rig: SkeletonRig,\r\n mapping: HumanoidJointMapping<SceneNode>,\r\n preset: HumanoidSkeletalAnimationMaskPreset,\r\n boundary: HumanoidBodyRig | undefined\r\n) {\r\n const body = mapping.body;\r\n switch (preset) {\r\n case 'fullBody':\r\n for (const joint of rig.joints) {\r\n set.add(joint);\r\n }\r\n break;\r\n case 'upperBody':\r\n addJointAndDescendants(set, rig, body[boundary ?? HumanoidBodyRig.Spine]);\r\n removeJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftUpperLeg]);\r\n removeJointAndDescendants(set, rig, body[HumanoidBodyRig.RightUpperLeg]);\r\n break;\r\n case 'lowerBody':\r\n addJoint(set, rig, body[HumanoidBodyRig.Hips]);\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftUpperLeg]);\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.RightUpperLeg]);\r\n break;\r\n case 'head':\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.Neck]);\r\n break;\r\n case 'arms':\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftShoulder]);\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.RightShoulder]);\r\n break;\r\n case 'leftArm':\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftShoulder]);\r\n break;\r\n case 'rightArm':\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.RightShoulder]);\r\n break;\r\n case 'legs':\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftUpperLeg]);\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.RightUpperLeg]);\r\n break;\r\n case 'leftLeg':\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.LeftUpperLeg]);\r\n break;\r\n case 'rightLeg':\r\n addJointAndDescendants(set, rig, body[HumanoidBodyRig.RightUpperLeg]);\r\n break;\r\n }\r\n}\r\n\r\nfunction selectHumanoidJoints(\r\n rig: SkeletonRig,\r\n options: HumanoidSkeletalAnimationMaskOptions\r\n): Set<SceneNode> | null {\r\n const mapping = rig.humanoidJointMapping;\r\n if (!mapping) {\r\n console.error('createSkeletalMaskedAnimation: skeleton does not have a humanoid joint mapping');\r\n return null;\r\n }\r\n const selected = new Set<SceneNode>();\r\n if (options.preset) {\r\n addHumanoidPreset(selected, rig, mapping, options.preset, options.boundary);\r\n } else if (\r\n !options.includeBody?.length &&\r\n !options.includeLeftHand?.length &&\r\n !options.includeRightHand?.length\r\n ) {\r\n for (const joint of rig.joints) {\r\n selected.add(joint);\r\n }\r\n }\r\n\r\n const includeDescendants = options.includeDescendants ?? true;\r\n for (const semantic of options.includeBody ?? []) {\r\n addSemanticJoint(selected, rig, mapping.body[semantic], includeDescendants);\r\n }\r\n for (const semantic of options.includeLeftHand ?? []) {\r\n addSemanticJoint(selected, rig, mapping.leftHand?.[semantic], includeDescendants);\r\n }\r\n for (const semantic of options.includeRightHand ?? []) {\r\n addSemanticJoint(selected, rig, mapping.rightHand?.[semantic], includeDescendants);\r\n }\r\n for (const semantic of options.excludeBody ?? []) {\r\n removeSemanticJoint(selected, rig, mapping.body[semantic], includeDescendants);\r\n }\r\n for (const semantic of options.excludeLeftHand ?? []) {\r\n removeSemanticJoint(selected, rig, mapping.leftHand?.[semantic], includeDescendants);\r\n }\r\n for (const semantic of options.excludeRightHand ?? []) {\r\n removeSemanticJoint(selected, rig, mapping.rightHand?.[semantic], includeDescendants);\r\n }\r\n return selected;\r\n}\r\n\r\nfunction matchesJointName(joint: SceneNode, matcher: JointNameMatcher): boolean {\r\n if (typeof matcher === 'string') {\r\n return joint.name === matcher;\r\n }\r\n if (matcher instanceof RegExp) {\r\n matcher.lastIndex = 0;\r\n return matcher.test(joint.name);\r\n }\r\n return matcher(joint);\r\n}\r\n\r\nfunction selectNamedJoints(\r\n rig: SkeletonRig,\r\n options: NamedJointsSkeletalAnimationMaskOptions\r\n): Set<SceneNode> {\r\n const selected = new Set<SceneNode>();\r\n const includeDescendants = options.includeDescendants ?? false;\r\n const included = options.include?.length\r\n ? rig.joints.filter((joint) => options.include!.some((matcher) => matchesJointName(joint, matcher)))\r\n : rig.joints;\r\n\r\n for (const joint of included) {\r\n if (includeDescendants) {\r\n addJointAndDescendants(selected, rig, joint);\r\n } else {\r\n selected.add(joint);\r\n }\r\n }\r\n\r\n for (const joint of rig.joints) {\r\n if (options.exclude?.some((matcher) => matchesJointName(joint, matcher))) {\r\n if (includeDescendants) {\r\n removeJointAndDescendants(selected, rig, joint);\r\n } else {\r\n selected.delete(joint);\r\n }\r\n }\r\n }\r\n return selected;\r\n}\r\n\r\nfunction getDefaultRootMotionMode(\r\n options: SkeletalAnimationMaskOptions\r\n): SkeletalAnimationMaskRootMotionMode {\r\n if (options.rootMotion) {\r\n return options.rootMotion;\r\n }\r\n if (options.type === 'humanoid' && (options.preset === 'lowerBody' || options.preset === 'fullBody')) {\r\n return 'include';\r\n }\r\n return 'exclude';\r\n}\r\n\r\nfunction isRootMotionTrack(target: object, track: AnimationTrack, rig: SkeletonRig): boolean {\r\n if (!(track instanceof NodeTranslationTrack)) {\r\n return false;\r\n }\r\n const hips = rig.humanoidJointMapping?.body[HumanoidBodyRig.Hips];\r\n return (!!rig.rootJoint && target === rig.rootJoint) || (!!hips && target === hips);\r\n}\r\n\r\nfunction copySkeletonReferences(sourceClip: AnimationClip, targetClip: AnimationClip) {\r\n for (const id of sourceClip.skeletons) {\r\n targetClip.addSkeleton(id);\r\n }\r\n}\r\n\r\n/** @internal */\r\nexport function createSkeletalMaskedAnimationClip(\r\n animationSet: AnimationSet,\r\n sourceClip: AnimationClip,\r\n targetName: string,\r\n rig: SkeletonRig,\r\n options: SkeletalAnimationMaskOptions\r\n): AnimationClip | null {\r\n const selectedJoints =\r\n options.type === 'humanoid' ? selectHumanoidJoints(rig, options) : selectNamedJoints(rig, options);\r\n if (!selectedJoints) {\r\n return null;\r\n }\r\n\r\n const rootMotion = getDefaultRootMotionMode(options);\r\n const unsupportedTracks = options.unsupportedTracks ?? 'skip';\r\n const targetClip = animationSet.createAnimation(targetName);\r\n if (!targetClip) {\r\n return null;\r\n }\r\n targetClip.timeDuration = sourceClip.timeDuration;\r\n targetClip.weight = sourceClip.weight;\r\n targetClip.autoPlay = sourceClip.autoPlay;\r\n copySkeletonReferences(sourceClip, targetClip);\r\n\r\n for (const [target, tracks] of sourceClip.tracks) {\r\n for (const track of tracks) {\r\n if (!isNodeTransformTrack(track)) {\r\n if (unsupportedTracks === 'error') {\r\n console.error(`createSkeletalMaskedAnimation: unsupported track type '${track.constructor.name}'`);\r\n animationSet.deleteAnimation(targetName);\r\n return null;\r\n }\r\n continue;\r\n }\r\n\r\n const rootMotionTrack = isRootMotionTrack(target, track, rig);\r\n const shouldCopy =\r\n rootMotion === 'only'\r\n ? rootMotionTrack\r\n : rootMotionTrack\r\n ? rootMotion === 'include'\r\n : selectedJoints.has(target as SceneNode);\r\n\r\n if (shouldCopy) {\r\n targetClip.addTrack(target, cloneTrack(track));\r\n }\r\n }\r\n }\r\n targetClip.timeDuration = sourceClip.timeDuration;\r\n return targetClip;\r\n}\r\n"],"names":["isNodeTransformTrack","track","NodeRotationTrack","NodeEulerRotationTrack","NodeTranslationTrack","NodeScaleTrack","cloneTrack","cloned","clone","name","target","jointIndex","addJoint","set","rig","joint","joints","includes","add","addJointAndDescendants","candidate","isParentOf","removeJointAndDescendants","delete","addSemanticJoint","includeDescendants","removeSemanticJoint","addHumanoidPreset","mapping","preset","boundary","body","HumanoidBodyRig","Spine","LeftUpperLeg","RightUpperLeg","Hips","Neck","LeftShoulder","RightShoulder","selectHumanoidJoints","options","humanoidJointMapping","console","error","selected","Set","includeBody","length","includeLeftHand","includeRightHand","semantic","leftHand","rightHand","excludeBody","excludeLeftHand","excludeRightHand","matchesJointName","matcher","RegExp","lastIndex","test","selectNamedJoints","included","include","filter","some","exclude","getDefaultRootMotionMode","rootMotion","type","isRootMotionTrack","hips","rootJoint","copySkeletonReferences","sourceClip","targetClip","id","skeletons","addSkeleton","createSkeletalMaskedAnimationClip","animationSet","targetName","selectedJoints","unsupportedTracks","createAnimation","timeDuration","weight","autoPlay","tracks","deleteAnimation","rootMotionTrack","shouldCopy","has","addTrack"],"mappings":"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"}
|