aboutsummaryrefslogtreecommitdiff
path: root/engine/src/bullet-common/com/jme3/bullet/control/ragdoll/RagdollPreset.java
diff options
context:
space:
mode:
Diffstat (limited to 'engine/src/bullet-common/com/jme3/bullet/control/ragdoll/RagdollPreset.java')
-rw-r--r--engine/src/bullet-common/com/jme3/bullet/control/ragdoll/RagdollPreset.java106
1 files changed, 106 insertions, 0 deletions
diff --git a/engine/src/bullet-common/com/jme3/bullet/control/ragdoll/RagdollPreset.java b/engine/src/bullet-common/com/jme3/bullet/control/ragdoll/RagdollPreset.java
new file mode 100644
index 0000000..51bf4ba
--- /dev/null
+++ b/engine/src/bullet-common/com/jme3/bullet/control/ragdoll/RagdollPreset.java
@@ -0,0 +1,106 @@
+/*
+ * To change this template, choose Tools | Templates
+ * and open the template in the editor.
+ */
+package com.jme3.bullet.control.ragdoll;
+
+import com.jme3.bullet.joints.SixDofJoint;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.logging.Level;
+import java.util.logging.Logger;
+
+/**
+ *
+ * @author Nehon
+ */
+public abstract class RagdollPreset {
+
+ protected static final Logger logger = Logger.getLogger(RagdollPreset.class.getName());
+ protected Map<String, JointPreset> boneMap = new HashMap<String, JointPreset>();
+ protected Map<String, LexiconEntry> lexicon = new HashMap<String, LexiconEntry>();
+
+ protected abstract void initBoneMap();
+
+ protected abstract void initLexicon();
+
+ public void setupJointForBone(String boneName, SixDofJoint joint) {
+
+ if (boneMap.isEmpty()) {
+ initBoneMap();
+ }
+ if (lexicon.isEmpty()) {
+ initLexicon();
+ }
+ String resultName = "";
+ int resultScore = 0;
+
+ for (String key : lexicon.keySet()) {
+
+ int score = lexicon.get(key).getScore(boneName);
+ if (score > resultScore) {
+ resultScore = score;
+ resultName = key;
+ }
+
+ }
+
+ JointPreset preset = boneMap.get(resultName);
+
+ if (preset != null && resultScore >= 50) {
+ logger.log(Level.INFO, "Found matching joint for bone {0} : {1} with score {2}", new Object[]{boneName, resultName, resultScore});
+ preset.setupJoint(joint);
+ } else {
+ logger.log(Level.INFO, "No joint match found for bone {0}", boneName);
+ if (resultScore > 0) {
+ logger.log(Level.INFO, "Best match found is {0} with score {1}", new Object[]{resultName, resultScore});
+ }
+ new JointPreset().setupJoint(joint);
+ }
+
+ }
+
+ protected class JointPreset {
+
+ private float maxX, minX, maxY, minY, maxZ, minZ;
+
+ public JointPreset() {
+ }
+
+ public JointPreset(float maxX, float minX, float maxY, float minY, float maxZ, float minZ) {
+ this.maxX = maxX;
+ this.minX = minX;
+ this.maxY = maxY;
+ this.minY = minY;
+ this.maxZ = maxZ;
+ this.minZ = minZ;
+ }
+
+ public void setupJoint(SixDofJoint joint) {
+ joint.getRotationalLimitMotor(0).setHiLimit(maxX);
+ joint.getRotationalLimitMotor(0).setLoLimit(minX);
+ joint.getRotationalLimitMotor(1).setHiLimit(maxY);
+ joint.getRotationalLimitMotor(1).setLoLimit(minY);
+ joint.getRotationalLimitMotor(2).setHiLimit(maxZ);
+ joint.getRotationalLimitMotor(2).setLoLimit(minZ);
+ }
+ }
+
+ protected class LexiconEntry extends HashMap<String, Integer> {
+
+ public void addSynonym(String word, int score) {
+ put(word.toLowerCase(), score);
+ }
+
+ public int getScore(String word) {
+ int score = 0;
+ String searchWord = word.toLowerCase();
+ for (String key : this.keySet()) {
+ if (searchWord.indexOf(key) >= 0) {
+ score += get(key);
+ }
+ }
+ return score;
+ }
+ }
+}