/* * 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 boneMap = new HashMap(); protected Map lexicon = new HashMap(); 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 { 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; } } }