Skip to content

Commit

Permalink
FlashMobDemo: fewer assumptions about the structure of imported models
Browse files Browse the repository at this point in the history
  • Loading branch information
stephengold committed Oct 24, 2023
1 parent 2a258ae commit 792bb23
Showing 1 changed file with 72 additions and 11 deletions.
83 changes: 72 additions & 11 deletions WesExamples/src/main/java/jme3utilities/test/wes/FlashMobDemo.java
Original file line number Diff line number Diff line change
Expand Up @@ -231,12 +231,11 @@ public void acorusInit() {
SkeletonMapping s2m = assetManager.loadAsset(s2mKey);

// Retarget the "Dance" animation from Sinbad to MhGame.
SkinningControl skinningControl
= mhGame.getControl(SkinningControl.class);
SkinningControl skinningControl = findSkinner(mhGame);
Armature armature = skinningControl.getArmature();
AnimClip danceClip = AnimationEdit.retargetAnimation(
sinbadClip, sinbadArmature, armature, s2m, "Dance");
AnimComposer composer = mhGame.getControl(AnimComposer.class);
AnimComposer composer = findComposer(mhGame);
composer.addAnimClip(danceClip);

// Load the Sinbad-to-Oto skeleton map.
Expand All @@ -245,11 +244,11 @@ public void acorusInit() {
SkeletonMapping s2o = assetManager.loadAsset(s2oKey);

// Retarget the "Dance" animation from Sinbad to Oto.
skinningControl = oto.getControl(SkinningControl.class);
skinningControl = findSkinner(oto);
armature = skinningControl.getArmature();
danceClip = AnimationEdit.retargetAnimation(
sinbadClip, sinbadArmature, armature, s2o, "Dance");
composer = oto.getControl(AnimComposer.class);
composer = findComposer(oto);
composer.addAnimClip(danceClip);

// Load the Puppet-to-Sinbad skeleton map.
Expand Down Expand Up @@ -433,11 +432,11 @@ private void addMhGame() {
mhGame.move(2f, 0f, -1f); // behind Sinbad and to his left

// Add composer to the master list.
AnimComposer composer = mhGame.getControl(AnimComposer.class);
AnimComposer composer = findComposer(mhGame);
composers.add(composer);

// Add a skeleton visualizer.
SkinningControl sc = mhGame.getControl(SkinningControl.class);
SkinningControl sc = findSkinner(mhGame);
SkeletonVisualizer sv = new SkeletonVisualizer(assetManager, sc);
visualizers.add(sv);
}
Expand All @@ -458,11 +457,11 @@ private void addOto() {
oto.move(0f, 0f, -1f); // directly behind Sinbad

// Add composer to the master list.
AnimComposer composer = oto.getControl(AnimComposer.class);
AnimComposer composer = findComposer(oto);
composers.add(composer);

// Add a skeleton visualizer.
SkinningControl sc = oto.getControl(SkinningControl.class);
SkinningControl sc = findSkinner(oto);
SkeletonVisualizer sv = new SkeletonVisualizer(assetManager, sc);
visualizers.add(sv);
}
Expand Down Expand Up @@ -512,10 +511,10 @@ private void addSinbad() {
centerCgm(cgModel);
cgModel.move(0f, 0f, 1f); // in front of the origin

AnimComposer composer = cgModel.getControl(AnimComposer.class);
AnimComposer composer = findComposer(cgModel);
sinbadClip = composer.getAnimClip("Dance");

SkinningControl sc = cgModel.getControl(SkinningControl.class);
SkinningControl sc = findSkinner(cgModel);
sinbadArmature = sc.getArmature();

// Add composer to the master list.
Expand Down Expand Up @@ -557,6 +556,68 @@ private void dumpScenes() {
dumper.dump(renderManager);
}

/**
* Access the first AnimComposer (if any) in the specified scene-graph
* subtree.
*
* @param subtree the subtree to analyze (not null)
* @return the pre-existing control, or null if none
*/
private static AnimComposer findComposer(Spatial subtree) {
List<AnimComposer> list
= MySpatial.listControls(subtree, AnimComposer.class, null);
int numComposers = list.size();

AnimComposer result;
switch (numComposers) {
case 0:
result = null;
break;

case 1:
result = list.get(0);
break;

default:
result = list.get(0);
logger.warning("Multiple anim composers in subtree.");
break;
}

return result;
}

/**
* Access the first SkinningControl (if any) in the specified scene-graph
* subtree.
*
* @param subtree the subtree to analyze (not null)
* @return the pre-existing control, or null if none
*/
private static SkinningControl findSkinner(Spatial subtree) {
List<SkinningControl> list
= MySpatial.listControls(subtree, SkinningControl.class, null);
int numSkinners = list.size();

SkinningControl result;
switch (numSkinners) {
case 0:
result = null;
break;

case 1:
result = list.get(0);
break;

default:
result = list.get(0);
logger.warning("Multiple anim composers in subtree.");
break;
}

return result;
}

/**
* Additional initialization performed on the 2nd invocation of
* {@link #simpleUpdate(float)}.
Expand Down

0 comments on commit 792bb23

Please sign in to comment.