Home | History | Annotate | Download | only in ragdoll
      1 /*
      2  * To change this template, choose Tools | Templates
      3  * and open the template in the editor.
      4  */
      5 package com.jme3.bullet.control.ragdoll;
      6 
      7 import com.jme3.bullet.joints.SixDofJoint;
      8 import java.util.HashMap;
      9 import java.util.Map;
     10 import java.util.logging.Level;
     11 import java.util.logging.Logger;
     12 
     13 /**
     14  *
     15  * @author Nehon
     16  */
     17 public abstract class RagdollPreset {
     18 
     19     protected static final Logger logger = Logger.getLogger(RagdollPreset.class.getName());
     20     protected Map<String, JointPreset> boneMap = new HashMap<String, JointPreset>();
     21     protected Map<String, LexiconEntry> lexicon = new HashMap<String, LexiconEntry>();
     22 
     23     protected abstract void initBoneMap();
     24 
     25     protected abstract void initLexicon();
     26 
     27     public void setupJointForBone(String boneName, SixDofJoint joint) {
     28 
     29         if (boneMap.isEmpty()) {
     30             initBoneMap();
     31         }
     32         if (lexicon.isEmpty()) {
     33             initLexicon();
     34         }
     35         String resultName = "";
     36         int resultScore = 0;
     37 
     38         for (String key : lexicon.keySet()) {
     39 
     40             int score = lexicon.get(key).getScore(boneName);
     41             if (score > resultScore) {
     42                 resultScore = score;
     43                 resultName = key;
     44             }
     45 
     46         }
     47 
     48         JointPreset preset = boneMap.get(resultName);
     49 
     50         if (preset != null && resultScore >= 50) {
     51             logger.log(Level.INFO, "Found matching joint for bone {0} : {1} with score {2}", new Object[]{boneName, resultName, resultScore});
     52             preset.setupJoint(joint);
     53         } else {
     54             logger.log(Level.INFO, "No joint match found for bone {0}", boneName);
     55             if (resultScore > 0) {
     56                 logger.log(Level.INFO, "Best match found is {0} with score {1}", new Object[]{resultName, resultScore});
     57             }
     58             new JointPreset().setupJoint(joint);
     59         }
     60 
     61     }
     62 
     63     protected class JointPreset {
     64 
     65         private float maxX, minX, maxY, minY, maxZ, minZ;
     66 
     67         public JointPreset() {
     68         }
     69 
     70         public JointPreset(float maxX, float minX, float maxY, float minY, float maxZ, float minZ) {
     71             this.maxX = maxX;
     72             this.minX = minX;
     73             this.maxY = maxY;
     74             this.minY = minY;
     75             this.maxZ = maxZ;
     76             this.minZ = minZ;
     77         }
     78 
     79         public void setupJoint(SixDofJoint joint) {
     80             joint.getRotationalLimitMotor(0).setHiLimit(maxX);
     81             joint.getRotationalLimitMotor(0).setLoLimit(minX);
     82             joint.getRotationalLimitMotor(1).setHiLimit(maxY);
     83             joint.getRotationalLimitMotor(1).setLoLimit(minY);
     84             joint.getRotationalLimitMotor(2).setHiLimit(maxZ);
     85             joint.getRotationalLimitMotor(2).setLoLimit(minZ);
     86         }
     87     }
     88 
     89     protected class LexiconEntry extends HashMap<String, Integer> {
     90 
     91         public void addSynonym(String word, int score) {
     92             put(word.toLowerCase(), score);
     93         }
     94 
     95         public int getScore(String word) {
     96             int score = 0;
     97             String searchWord = word.toLowerCase();
     98             for (String key : this.keySet()) {
     99                 if (searchWord.indexOf(key) >= 0) {
    100                     score += get(key);
    101                 }
    102             }
    103             return score;
    104         }
    105     }
    106 }
    107