Example usage for com.badlogic.gdx.utils ArrayMap iterator

List of usage examples for com.badlogic.gdx.utils ArrayMap iterator

Introduction

In this page you can find the example usage for com.badlogic.gdx.utils ArrayMap iterator.

Prototype

public Iterator<Entry<K, V>> iterator() 

Source Link

Usage

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);

}