159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/* 259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * To change this template, choose Tools | Templates 359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * and open the template in the editor. 459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 559b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapackage com.jme3.bullet.control.ragdoll; 659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport com.jme3.bullet.joints.SixDofJoint; 859b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.HashMap; 959b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.Map; 1059b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Level; 1159b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartaimport java.util.logging.Logger; 1259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta/** 1459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * 1559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta * @author Nehon 1659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta */ 1759b2e6871c65f58fdad78cd7229c292f6a177578Scott Bartapublic abstract class RagdollPreset { 1859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 1959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected static final Logger logger = Logger.getLogger(RagdollPreset.class.getName()); 2059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Map<String, JointPreset> boneMap = new HashMap<String, JointPreset>(); 2159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected Map<String, LexiconEntry> lexicon = new HashMap<String, LexiconEntry>(); 2259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected abstract void initBoneMap(); 2459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected abstract void initLexicon(); 2659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setupJointForBone(String boneName, SixDofJoint joint) { 2859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 2959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (boneMap.isEmpty()) { 3059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initBoneMap(); 3159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 3259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (lexicon.isEmpty()) { 3359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta initLexicon(); 3459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 3559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String resultName = ""; 3659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int resultScore = 0; 3759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 3859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (String key : lexicon.keySet()) { 3959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int score = lexicon.get(key).getScore(boneName); 4159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (score > resultScore) { 4259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta resultScore = score; 4359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta resultName = key; 4459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 4559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 4759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 4859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta JointPreset preset = boneMap.get(resultName); 4959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 5059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (preset != null && resultScore >= 50) { 5159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.INFO, "Found matching joint for bone {0} : {1} with score {2}", new Object[]{boneName, resultName, resultScore}); 5259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta preset.setupJoint(joint); 5359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } else { 5459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.INFO, "No joint match found for bone {0}", boneName); 5559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (resultScore > 0) { 5659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta logger.log(Level.INFO, "Best match found is {0} with score {1}", new Object[]{resultName, resultScore}); 5759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 5859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta new JointPreset().setupJoint(joint); 5959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected class JointPreset { 6459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta private float maxX, minX, maxY, minY, maxZ, minZ; 6659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 6759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public JointPreset() { 6859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 6959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public JointPreset(float maxX, float minX, float maxY, float minY, float maxZ, float minZ) { 7159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.maxX = maxX; 7259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.minX = minX; 7359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.maxY = maxY; 7459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.minY = minY; 7559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.maxZ = maxZ; 7659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta this.minZ = minZ; 7759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 7859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 7959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void setupJoint(SixDofJoint joint) { 8059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joint.getRotationalLimitMotor(0).setHiLimit(maxX); 8159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joint.getRotationalLimitMotor(0).setLoLimit(minX); 8259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joint.getRotationalLimitMotor(1).setHiLimit(maxY); 8359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joint.getRotationalLimitMotor(1).setLoLimit(minY); 8459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joint.getRotationalLimitMotor(2).setHiLimit(maxZ); 8559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta joint.getRotationalLimitMotor(2).setLoLimit(minZ); 8659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 8859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 8959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta protected class LexiconEntry extends HashMap<String, Integer> { 9059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public void addSynonym(String word, int score) { 9259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta put(word.toLowerCase(), score); 9359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 9459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta 9559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta public int getScore(String word) { 9659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta int score = 0; 9759b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta String searchWord = word.toLowerCase(); 9859b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta for (String key : this.keySet()) { 9959b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta if (searchWord.indexOf(key) >= 0) { 10059b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta score += get(key); 10159b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10259b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10359b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta return score; 10459b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10559b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta } 10659b2e6871c65f58fdad78cd7229c292f6a177578Scott Barta} 107