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 
initBoneMap()23     protected abstract void initBoneMap();
24 
initLexicon()25     protected abstract void initLexicon();
26 
setupJointForBone(String boneName, SixDofJoint joint)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 
JointPreset()67         public JointPreset() {
68         }
69 
JointPreset(float maxX, float minX, float maxY, float minY, float maxZ, float minZ)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 
setupJoint(SixDofJoint joint)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 
addSynonym(String word, int score)91         public void addSynonym(String word, int score) {
92             put(word.toLowerCase(), score);
93         }
94 
getScore(String word)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