List of usage examples for com.badlogic.gdx.utils ArrayMap iterator
public Iterator<Entry<K, V>> iterator()
From source file:com.mygdx.game.objects.Ragdoll.java
License:Apache License
/** * @param empties Blender empties containing rigid body dimension data * @param armatureNodeId The name of the root skeleton/armature node *//*ww w. j a v a 2s .co m*/ private void createRagdoll(Array<BlenderEmpty> empties, String armatureNodeId) { Node armature = modelInstance.getNode(armatureNodeId, true, true); // Load mass and shape half extent data from Blender json ArrayMap<String, Vector3> halfExtMap = new ArrayMap<String, Vector3>(); ArrayMap<String, Float> massMap = new ArrayMap<String, Float>(); for (BlenderEmpty empty : empties) { Vector3 halfExtents = new Vector3(empty.scale); halfExtents.x = Math.abs(halfExtents.x); halfExtents.y = Math.abs(halfExtents.y); halfExtents.z = Math.abs(halfExtents.z); halfExtMap.put(empty.name, halfExtents); float partMass = Float.parseFloat(empty.custom_properties.get("mass")); massMap.put(empty.name, super.mass * partMass); } ArrayMap<String, btCollisionShape> shapeMap = new ArrayMap<String, btCollisionShape>(); ArrayMap<String, btRigidBody> bodyMap = new ArrayMap<String, btRigidBody>(); // Create rigid bodies using the previously loaded mass and half extents. // Put them along with the shapes into maps. for (Iterator<ObjectMap.Entry<String, Vector3>> iterator = halfExtMap.iterator(); iterator.hasNext();) { ObjectMap.Entry<String, Vector3> entry = iterator.next(); String partName = entry.key; Vector3 partHalfExt = entry.value; float partMass = massMap.get(partName); btCollisionShape partShape = new btBoxShape(partHalfExt); shapeMap.put(partName, partShape); InvisibleBody phyCmp = new InvisibleBody(partName, partShape, partMass, new Matrix4(), this.belongsToFlag, this.collidesWithFlag, false, true); phyCmp.constructionInfo.dispose(); bodyMap.put(partName, phyCmp.body); this.addPart(phyCmp.body, armature.getChild(partName, true, true)); } // Abdomen is the at the top of the armature hierarchy this.addPart(bodyMap.get("abdomen"), armature, new Vector3(0, halfExtMap.get("abdomen").y * 1.6f, 0)); final Matrix4 localA = new Matrix4(); final Matrix4 localB = new Matrix4(); btHingeConstraint hingeC; btConeTwistConstraint coneC; btFixedConstraint fixedC; String a, b; // TODO: This part could probably be automated somehow... // Set the ragdollConstraints a = "abdomen"; b = "chest"; localA.setFromEulerAnglesRad(0, PI0_25, 0).trn(0, halfExtMap.get(a).y, 0); localB.setFromEulerAnglesRad(0, PI0_25, 0).trn(0, -halfExtMap.get(b).y, 0); this.constraints.add(hingeC = new btHingeConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); hingeC.setLimit(-PI0_25, PI0_5); a = "chest"; b = "neck"; localA.setFromEulerAnglesRad(0, 0, 0).trn(0, halfExtMap.get(a).y, 0); localB.setFromEulerAnglesRad(0, 0, 0).trn(0, -halfExtMap.get(b).y, 0); this.constraints.add(fixedC = new btFixedConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); a = "neck"; b = "head"; localA.setFromEulerAnglesRad(-PI0_5, 0, 0).trn(0, halfExtMap.get(a).y, 0); localB.setFromEulerAnglesRad(-PI0_5, 0, 0).trn(0, -halfExtMap.get(b).y, 0); this.constraints.add(coneC = new btConeTwistConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); coneC.setLimit(PI0_25, PI0_25, PI0_25); a = "abdomen"; b = "left_thigh"; localA.setFromEulerAnglesRad(0, PI, 0).scl(-1, 1, 1).trn(halfExtMap.get(a).x * 0.5f, -halfExtMap.get("abdomen").y, 0); localB.setFromEulerAnglesRad(0, 0, 0).scl(-1, 1, 1).trn(0, -halfExtMap.get(b).y, 0); this.constraints.add(coneC = new btConeTwistConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); coneC.setLimit(PI0_25, PI0_25, PI0_25); coneC.setDamping(10); a = "abdomen"; b = "right_thigh"; localA.setFromEulerAnglesRad(0, PI, 0).trn(-halfExtMap.get(a).x * 0.5f, -halfExtMap.get("abdomen").y, 0); localB.setFromEulerAnglesRad(0, 0, 0).trn(0, -halfExtMap.get(b).y, 0); this.constraints.add(coneC = new btConeTwistConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); coneC.setLimit(PI0_25, PI0_25, PI0_25); coneC.setDamping(10); a = "left_thigh"; b = "left_shin"; localA.setFromEulerAnglesRad(-PI0_5, 0, 0).trn(0, halfExtMap.get(a).y, 0); localB.setFromEulerAnglesRad(-PI0_5, 0, 0).trn(0, -halfExtMap.get(b).y, 0); this.constraints.add(hingeC = new btHingeConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); hingeC.setLimit(0, PI0_25 * 3); a = "right_thigh"; b = "right_shin"; localA.setFromEulerAnglesRad(-PI0_5, 0, 0).trn(0, halfExtMap.get(a).y, 0); localB.setFromEulerAnglesRad(-PI0_5, 0, 0).trn(0, -halfExtMap.get(b).y, 0); this.constraints.add(hingeC = new btHingeConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); hingeC.setLimit(0, PI0_25 * 3); // TODO: causes shoulder rotation a = "chest"; b = "left_upper_arm"; localA.setFromEulerAnglesRad(0, PI, 0).trn(halfExtMap.get(a).x + halfExtMap.get(b).x, halfExtMap.get(a).y, 0); localB.setFromEulerAnglesRad(PI0_25, 0, 0).trn(0, -halfExtMap.get(b).y, 0); this.constraints.add(coneC = new btConeTwistConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); coneC.setLimit(PI0_5, PI0_5, 0); coneC.setDamping(10); // TODO: as above a = "chest"; b = "right_upper_arm"; localA.setFromEulerAnglesRad(0, PI, 0).trn(-halfExtMap.get(a).x - halfExtMap.get(b).x, halfExtMap.get(a).y, 0); localB.setFromEulerAnglesRad(-PI0_25, 0, 0).trn(0, -halfExtMap.get("right_upper_arm").y, 0); this.constraints.add(coneC = new btConeTwistConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); coneC.setLimit(PI0_5, PI0_5, 0); coneC.setDamping(10); a = "left_upper_arm"; b = "left_forearm"; localA.setFromEulerAnglesRad(PI0_5, 0, 0).trn(0, halfExtMap.get(a).y, 0); localB.setFromEulerAnglesRad(PI0_5, 0, 0).trn(0, -halfExtMap.get(b).y, 0); this.constraints.add(hingeC = new btHingeConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); hingeC.setLimit(0, PI0_5); a = "right_upper_arm"; b = "right_forearm"; localA.setFromEulerAnglesRad(PI0_5, 0, 0).trn(0, halfExtMap.get(a).y, 0); localB.setFromEulerAnglesRad(PI0_5, 0, 0).trn(0, -halfExtMap.get(b).y, 0); this.constraints.add(hingeC = new btHingeConstraint(bodyMap.get(a), bodyMap.get(b), localA, localB)); hingeC.setLimit(0, PI0_5); }