/******************************************************************************* * This is part of SketchChair, an open-source tool for designing your own furniture. * www.sketchchair.cc * * Copyright (C) 2012, Diatom Studio ltd. Contact: hello@diatom.cc * * This program is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 3 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program. If not, see <http://www.gnu.org/licenses/>. ******************************************************************************/ package cc.sketchchair.ragdoll; /* * Java port of Bullet (c) 2008 Martin Dvorak <jezek2@advel.cz> * * Bullet Continuous Collision Detection and Physics Library * Ragdoll Demo * Copyright (c) 2007 Starbreeze Studios * * This software is provided 'as-is', without any express or implied warranty. * In no event will the authors be held liable for any damages arising from * the use of this software. * * Permission is granted to anyone to use this software for any purpose, * including commercial applications, and to alter it and redistribute it * freely, subject to the following restrictions: * * 1. The origin of this software must not be misrepresented; you must not * claim that you wrote the original software. If you use this software * in a product, an acknowledgment in the product documentation would be * appreciated but is not required. * 2. Altered source versions must be plainly marked as such, and must not be * misrepresented as being the original software. * 3. This notice may not be removed or altered from any source distribution. * * Written by: Marten Svanfeldt */ import java.util.HashMap; import java.util.Map; import cc.sketchchair.core.GLOBAL; import cc.sketchchair.core.LOGGER; import cc.sketchchair.core.SETTINGS; import cc.sketchchair.core.SketchChair; import cc.sketchchair.core.UITools; import cc.sketchchair.functions.functions; import com.bulletphysics.BulletGlobals; import com.bulletphysics.collision.broadphase.CollisionAlgorithm; import com.bulletphysics.collision.dispatch.CollisionFlags; import com.bulletphysics.collision.dispatch.ManifoldResult; import com.bulletphysics.collision.narrowphase.PersistentManifold; import com.bulletphysics.collision.shapes.CapsuleShape; import com.bulletphysics.collision.shapes.CollisionShape; import com.bulletphysics.dynamics.DynamicsWorld; import com.bulletphysics.dynamics.RigidBody; import com.bulletphysics.dynamics.RigidBodyConstructionInfo; import com.bulletphysics.dynamics.constraintsolver.Generic6DofConstraint; import com.bulletphysics.dynamics.constraintsolver.HingeConstraint; import com.bulletphysics.dynamics.constraintsolver.TranslationalLimitMotor; import com.bulletphysics.dynamics.constraintsolver.TypedConstraint; import com.bulletphysics.linearmath.DefaultMotionState; import com.bulletphysics.linearmath.MatrixUtil; import com.bulletphysics.linearmath.MotionState; import com.bulletphysics.linearmath.Transform; import javax.vecmath.Matrix4f; import javax.vecmath.Vector3f; import processing.core.PApplet; import processing.core.PGraphics; /** * The ergonomic figure representing the user. * This is based on code from the jBullet examples. * This needs to be improved. * Arms removed as they were gettign in the way. * @author gregsaul * */ public class ergoDoll { //protected final BulletStack stack = BulletStack.get(); public enum BodyPart { BODYPART_PELVIS, BODYPART_SPINE, BODYPART_HEAD, BODYPART_NECK, BODYPART_LEFT_UPPER_LEG, BODYPART_LEFT_LOWER_LEG, BODYPART_RIGHT_UPPER_LEG, BODYPART_RIGHT_LOWER_LEG, BODYPART_RIGHT_FOOT, BODYPART_LEFT_FOOT, BODYPART_LEFT_UPPER_ARM, BODYPART_LEFT_LOWER_ARM, BODYPART_RIGHT_UPPER_ARM, BODYPART_RIGHT_LOWER_ARM, BODYPART_RIGHT_HAND, BODYPART_LEFT_HAND, BODYPART_COUNT; } // Expressions public enum faceExpressions { HAPPY, SAD, SCARED, EXPRESSION_COUNT } public enum JointType { JOINT_PLANE, JOINT_PELVIS_SPINE, JOINT_NECK_HEAD, JOINT_LEFT_HIP, JOINT_LEFT_KNEE, JOINT_RIGHT_HIP, JOINT_RIGHT_KNEE, JOINT_LEFT_SHOULDER, JOINT_LEFT_ELBOW, JOINT_RIGHT_SHOULDER, JOINT_RIGHT_ELBOW, JOINT_RIGHT_WRIST, JOINT_LEFT_WRIST, JOINT_RIGHT_ANKLE, JOINT_LEFT_ANKLE, JOINT_COUNT } boolean hasArms = false; //private PImage FaceImages[] = new PImage[faceExpressions.EXPRESSION_COUNT.ordinal()]; private CollisionShape[] shapes = new CollisionShape[BodyPart.BODYPART_COUNT .ordinal()]; private RigidBody[] bodies = new RigidBody[BodyPart.BODYPART_COUNT .ordinal()]; private MotionState[] motionState = new MotionState[BodyPart.BODYPART_COUNT .ordinal()]; private TypedConstraint[] joints = new TypedConstraint[JointType.JOINT_COUNT .ordinal()]; private float[] proportions = new float[BodyPart.BODYPART_COUNT.ordinal()]; private float[] proportionsWidth = new float[BodyPart.BODYPART_COUNT .ordinal()]; private float[] limbLengths = new float[BodyPart.BODYPART_COUNT.ordinal()]; private float[] limbWidths = new float[BodyPart.BODYPART_COUNT.ordinal()]; private boolean scaling = false; float scale = 1f; float destScale = 1f; float maxScale = 1.5f; float minScale = 0.15f; private DynamicsWorld ownerWorld; private Vector3f startPos; float height = 23.5f;//mm private float mass = 30; Map proportionsGrowthMap = new HashMap(); private Map proportionsGrowthLenMap = new HashMap(); private Map proportionsGrowthWidMap = new HashMap(); private float buildScale; public boolean clickedOnPerson; public boolean dragged; private boolean on = true; public ergoDoll(DynamicsWorld ownerWorld, Vector3f positionOffset) { this(ownerWorld, positionOffset, 1.0f); } public ergoDoll(DynamicsWorld ownerWorld, Vector3f positionOffset, float scale_ragdoll) { this.ownerWorld = ownerWorld; this.startPos = positionOffset; this.scale = scale_ragdoll; makeBody(this.ownerWorld, positionOffset, this.scale); this.translate(this.startPos.x, this.startPos.y, this.startPos.z); //FaceImages[faceExpressions.HAPPY.ordinal()] = GLOBAL.applet.loadImage("faceExpressionsHappy.png"); } void applyMatrix(Transform myTransform, PGraphics g) { g.translate(myTransform.origin.x, myTransform.origin.y, myTransform.origin.z); g.applyMatrix(myTransform.basis.m00, myTransform.basis.m01, myTransform.basis.m02, 0, myTransform.basis.m10, myTransform.basis.m11, myTransform.basis.m12, 0, myTransform.basis.m20, myTransform.basis.m21, myTransform.basis.m22, 0, 0, 0, 0, 1); } private void buildLimbConstraints() { Vector3f tmp = new Vector3f(); for (int i = 0; i < JointType.JOINT_COUNT.ordinal(); ++i) { if (joints[i] != null) { ownerWorld.removeConstraint(joints[i]); } } ///////////////////////////// SETTING THE CONSTRAINTS /////////////////////////////////////////////7777 // Now setup the constraints Generic6DofConstraint joint6DOF; Transform localA = new Transform(), localB = new Transform(); boolean useLinearReferenceFrameA = true; /// ******* SPINE HEAD ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin .set(0f, -(limbLengths[BodyPart.BODYPART_SPINE.ordinal()] + limbLengths[BodyPart.BODYPART_NECK .ordinal()]), 0f); localB.origin.set(0f, limbLengths[BodyPart.BODYPART_HEAD.ordinal()], 0f); joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_SPINE.ordinal()], bodies[BodyPart.BODYPART_HEAD.ordinal()], localA, localB, useLinearReferenceFrameA); //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_PI * 0.2f, -BulletGlobals.FLT_EPSILON, -BulletGlobals.SIMD_PI * 0.1f); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_PI * 0.1f, BulletGlobals.FLT_EPSILON, BulletGlobals.SIMD_PI * 0.10f); joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_NECK_HEAD.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_NECK_HEAD.ordinal()], true); } /// *************************** /// /// ******* PELVIS ******** /// { localA.setIdentity(); localB.setIdentity(); MatrixUtil.setEulerZYX(localA.basis, 0, BulletGlobals.SIMD_HALF_PI, 0); localA.origin.set(0f, -limbLengths[BodyPart.BODYPART_PELVIS.ordinal()], 0f); MatrixUtil.setEulerZYX(localB.basis, 0, BulletGlobals.SIMD_HALF_PI, 0); localB.origin.set(0f, limbLengths[BodyPart.BODYPART_SPINE.ordinal()], 0f); joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_PELVIS.ordinal()], bodies[BodyPart.BODYPART_SPINE.ordinal()], localA, localB, useLinearReferenceFrameA); //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_PI * 0.1f, -BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_PI * 0.1f); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_PI * 0.2f, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_PI * 0.15f); joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_PELVIS_SPINE.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_PELVIS_SPINE.ordinal()], true); } /// *************************** /// /// ******* SPINE 2D ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin.set(0f, 0f, 0f); localB.origin.set(0f, 0f, 0f); CollisionShape ZeroShape = null; GLOBAL.jBullet.ZeroBody = new RigidBody(0.0f, null, ZeroShape); Transform Rotation = new Transform(); Rotation.setIdentity(); GLOBAL.jBullet.ZeroBody.setWorldTransform(Rotation); joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_SPINE.ordinal()], GLOBAL.jBullet.ZeroBody, localA, localB, false); joint6DOF.setLimit(0, 1, 0); // Disable X axis limits joint6DOF.setLimit(1, 1, 0); // Disable Y axis limits joint6DOF.setLimit(2, 0, 0); // Set the Z axis to always be equal to zero joint6DOF.setLimit(3, 0, 0); // Disable X rotational axes joint6DOF.setLimit(4, 0, 0); // Disable Y rotational axes joint6DOF.setLimit(5, 1, 0); // Uncap the rotational axes //#endif joints[JointType.JOINT_PLANE.ordinal()] = joint6DOF; ownerWorld.addConstraint(joints[JointType.JOINT_PLANE.ordinal()], true); bodies[BodyPart.BODYPART_SPINE.ordinal()] .setAngularFactor(new Vector3f(0, 0, 1)); } /// *************************** /// if (hasArms) { /// ******* LEFT SHOULDER ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin.set(0f, -limbLengths[BodyPart.BODYPART_SPINE.ordinal()], limbWidths[BodyPart.BODYPART_SPINE.ordinal()] * 1.2f); //joint on spine MatrixUtil.setEulerZYX(localB.basis, BulletGlobals.SIMD_PI, BulletGlobals.SIMD_PI, BulletGlobals.SIMD_PI); localB.origin .set(0f, limbLengths[BodyPart.BODYPART_LEFT_UPPER_ARM .ordinal()], 0f); // upper arm joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_SPINE.ordinal()], bodies[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()], localA, localB, useLinearReferenceFrameA); tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_HALF_PI * 0.5f); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_HALF_PI * 0.6f, BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_HALF_PI * 1.3f); //bend foward joint6DOF.setAngularUpperLimit(tmp); joints[JointType.JOINT_LEFT_SHOULDER.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_LEFT_SHOULDER.ordinal()], true); } /// *************************** /// /// ******* RIGHT SHOULDER ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin.set(0f, -limbLengths[BodyPart.BODYPART_SPINE.ordinal()], -limbWidths[BodyPart.BODYPART_SPINE.ordinal()] * 1.2f); //joint on spine //MatrixUtil.setEulerZYX(localB.basis,BulletGlobals.SIMD_PI, BulletGlobals.SIMD_PI, BulletGlobals.SIMD_PI); localB.origin .set(0f, limbLengths[BodyPart.BODYPART_RIGHT_UPPER_ARM .ordinal()], 0f); // upper arm joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_SPINE.ordinal()], bodies[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()], localA, localB, useLinearReferenceFrameA); //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_HALF_PI * 0.5f); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_HALF_PI * 0.6f, BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_HALF_PI * 1.3f); //bend foward joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_RIGHT_SHOULDER.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_RIGHT_SHOULDER.ordinal()], true); } /// *************************** /// /// ******* LEFT ELBOW ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin .set(0f, -limbLengths[BodyPart.BODYPART_LEFT_UPPER_ARM .ordinal()], 0f); // upper arm localB.origin .set(0f, -limbLengths[BodyPart.BODYPART_LEFT_LOWER_ARM .ordinal()], 0f); // lower arm joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()], bodies[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()], localA, localB, useLinearReferenceFrameA); //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_HALF_PI * 0.5f); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_HALF_PI * 0.6f, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_HALF_PI * 1.3f); //bend foward joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_LEFT_ELBOW.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_LEFT_ELBOW.ordinal()], true); } /// *************************** /// /// ******* RIGHT ELBOW ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin .set(0f, -limbLengths[BodyPart.BODYPART_LEFT_UPPER_ARM .ordinal()], 0f); // upper arm localB.origin .set(0f, -limbLengths[BodyPart.BODYPART_LEFT_LOWER_ARM .ordinal()], 0f); // lower arm joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()], bodies[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()], localA, localB, useLinearReferenceFrameA); //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_HALF_PI * 0.5f); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_HALF_PI * 0.6f, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_HALF_PI * 1.3f); //bend foward joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_RIGHT_ELBOW.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_RIGHT_ELBOW.ordinal()], true); } /// *************************** /// /// ******* RIGHT Wrist ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin .set(0f, limbLengths[BodyPart.BODYPART_RIGHT_LOWER_ARM .ordinal()], 0f); // upper arm localB.origin.set(0f, -limbLengths[BodyPart.BODYPART_RIGHT_HAND.ordinal()], 0f); // lower arm joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()], bodies[BodyPart.BODYPART_RIGHT_HAND.ordinal()], localA, localB, useLinearReferenceFrameA); //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_PI * 0.7f, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON); joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_RIGHT_WRIST.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_RIGHT_WRIST.ordinal()], true); } /// *************************** /// /// ******* LEFT Wrist ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin .set(0f, limbLengths[BodyPart.BODYPART_LEFT_LOWER_ARM .ordinal()], 0f); // upper arm localB.origin .set(0f, -limbLengths[BodyPart.BODYPART_LEFT_HAND .ordinal()], 0f); // lower arm joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()], bodies[BodyPart.BODYPART_LEFT_HAND.ordinal()], localA, localB, useLinearReferenceFrameA); //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_PI * 0.7f, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON); joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_LEFT_WRIST.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_LEFT_WRIST.ordinal()], true); } /// *************************** /// } /// ******* LEFT HIP ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin.set(0f, limbLengths[BodyPart.BODYPART_PELVIS.ordinal()], limbWidths[BodyPart.BODYPART_PELVIS.ordinal()]); localB.origin .set(0f, -limbLengths[BodyPart.BODYPART_LEFT_UPPER_LEG .ordinal()] * .6f, 0f); joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_PELVIS.ordinal()], bodies[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()], localA, localB, useLinearReferenceFrameA); //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_HALF_PI * 0.5f); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_HALF_PI * 0.6f, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_HALF_PI * 1.3f); //bend foward joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_LEFT_HIP.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_LEFT_HIP.ordinal()], true); } /// *************************** /// /// ******* RIGHT HIP ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin.set(0f, limbLengths[BodyPart.BODYPART_PELVIS.ordinal()], -limbWidths[BodyPart.BODYPART_PELVIS.ordinal()]); localB.origin .set(0f, -limbLengths[BodyPart.BODYPART_RIGHT_UPPER_LEG .ordinal()] * .6f, 0f); joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_PELVIS.ordinal()], bodies[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()], localA, localB, useLinearReferenceFrameA); //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_HALF_PI * 0.6f, -BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_HALF_PI * 0.5f); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_HALF_PI * 1.3f); joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_RIGHT_HIP.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_RIGHT_HIP.ordinal()], true); } /// *************************** /// /// ******* LEFT KNEE ******** /// { localA.setIdentity(); localB.setIdentity(); localA.origin .set(0f, limbLengths[BodyPart.BODYPART_LEFT_UPPER_LEG .ordinal()], 0f); localB.origin.set(0f, -limbLengths[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()], 0f); joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()], bodies[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()], localA, localB, useLinearReferenceFrameA); // //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_PI * .9f); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON); joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_LEFT_KNEE.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_LEFT_KNEE.ordinal()], true); } /// *************************** /// /// ******* RIGHT KNEE ******** /// { localA.setIdentity(); localB.setIdentity(); HingeConstraint jointHinge = null; localA.origin.set(0f, limbLengths[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()], 0f); localB.origin.set(0f, -limbLengths[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()], 0f); joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()], bodies[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()], localA, localB, useLinearReferenceFrameA); // //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_PI * .9f); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON); joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_RIGHT_KNEE.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_RIGHT_KNEE.ordinal()], true); } /// *************************** /// /// ******* RIGHT FOOT ******** /// { localA.setIdentity(); localB.setIdentity(); HingeConstraint jointHinge = null; localA.origin.set(0f, limbLengths[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()], 0f); localB.origin.set(0f, -limbLengths[BodyPart.BODYPART_RIGHT_FOOT.ordinal()] * .5f, 0f); joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()], bodies[BodyPart.BODYPART_RIGHT_FOOT.ordinal()], localA, localB, useLinearReferenceFrameA); // //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_PI * .7f); joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_RIGHT_ANKLE.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_RIGHT_ANKLE.ordinal()], true); } /// *************************** /// /// ******* LEFT FOOT ******** /// { localA.setIdentity(); localB.setIdentity(); HingeConstraint jointHinge = null; localA.origin .set(0f, limbLengths[BodyPart.BODYPART_LEFT_LOWER_LEG .ordinal()], 0f); localB.origin.set(0f, -limbLengths[BodyPart.BODYPART_LEFT_FOOT.ordinal()] * .5f, 0f); joint6DOF = new Generic6DofConstraint( bodies[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()], bodies[BodyPart.BODYPART_LEFT_FOOT.ordinal()], localA, localB, useLinearReferenceFrameA); // //#ifdef RIGID //joint6DOF->setAngularLowerLimit(btVector3(-SIMD_EPSILON,-SIMD_EPSILON,-SIMD_EPSILON)); //joint6DOF->setAngularUpperLimit(btVector3(SIMD_EPSILON,SIMD_EPSILON,SIMD_EPSILON)); //#else tmp.set(-BulletGlobals.SIMD_EPSILON, -BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON); joint6DOF.setAngularLowerLimit(tmp); tmp.set(BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_EPSILON, BulletGlobals.SIMD_PI * .7f); joint6DOF.setAngularUpperLimit(tmp); //#endif joints[JointType.JOINT_LEFT_ANKLE.ordinal()] = joint6DOF; ownerWorld.addConstraint( joints[JointType.JOINT_LEFT_ANKLE.ordinal()], true); } /// *************************** /// } void buildProportions() { float[] tempProportions1 = new float[BodyPart.BODYPART_COUNT.ordinal()]; float[] tempProportionsWidth1 = new float[BodyPart.BODYPART_COUNT .ordinal()]; float[] tempProportions2 = new float[BodyPart.BODYPART_COUNT.ordinal()]; float[] tempProportionsWidth2 = new float[BodyPart.BODYPART_COUNT .ordinal()]; //Adult //these proportions are based on a human body being 7.5 heads tall tempProportions1[BodyPart.BODYPART_HEAD.ordinal()] = 0.13f; tempProportions1[BodyPart.BODYPART_NECK.ordinal()] = 0.09f; tempProportions1[BodyPart.BODYPART_SPINE.ordinal()] = 0.23f; tempProportions1[BodyPart.BODYPART_PELVIS.ordinal()] = 0.09f; tempProportions1[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()] = 0.28f; tempProportions1[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()] = 0.22f; tempProportions1[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()] = 0.28f; tempProportions1[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()] = 0.22f; tempProportions1[BodyPart.BODYPART_RIGHT_FOOT.ordinal()] = 0.15f; tempProportions1[BodyPart.BODYPART_LEFT_FOOT.ordinal()] = 0.15f; tempProportions1[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()] = 0.175f; tempProportions1[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()] = 0.145f; tempProportions1[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()] = 0.175f; tempProportions1[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()] = 0.145f; tempProportions1[BodyPart.BODYPART_RIGHT_HAND.ordinal()] = 0.08f; tempProportions1[BodyPart.BODYPART_LEFT_HAND.ordinal()] = 0.08f; tempProportionsWidth1[BodyPart.BODYPART_HEAD.ordinal()] = 0.093f; tempProportionsWidth1[BodyPart.BODYPART_NECK.ordinal()] = 0.05f; tempProportionsWidth1[BodyPart.BODYPART_SPINE.ordinal()] = 0.12f; tempProportionsWidth1[BodyPart.BODYPART_PELVIS.ordinal()] = 0.11f; tempProportionsWidth1[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()] = 0.087f; tempProportionsWidth1[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()] = 0.052f; tempProportionsWidth1[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()] = 0.087f; tempProportionsWidth1[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()] = 0.052f; tempProportionsWidth1[BodyPart.BODYPART_RIGHT_FOOT.ordinal()] = 0.055f; tempProportionsWidth1[BodyPart.BODYPART_LEFT_FOOT.ordinal()] = 0.055f; tempProportionsWidth1[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()] = 0.045f; tempProportionsWidth1[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()] = 0.035f; tempProportionsWidth1[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()] = 0.045f; tempProportionsWidth1[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()] = 0.035f; tempProportionsWidth1[BodyPart.BODYPART_RIGHT_HAND.ordinal()] = 0.05f; tempProportionsWidth1[BodyPart.BODYPART_LEFT_HAND.ordinal()] = 0.05f; //proportionsGrowthLenMap.put(1, tempProportions); //proportionsGrowthWidMap.put(1, tempProportionsWidth); //15 years old //these proportions are based on a human body being 7.5 heads tall tempProportions2[BodyPart.BODYPART_HEAD.ordinal()] = 0.25f; tempProportions2[BodyPart.BODYPART_NECK.ordinal()] = 0.04f; tempProportions2[BodyPart.BODYPART_SPINE.ordinal()] = 0.23f; tempProportions2[BodyPart.BODYPART_PELVIS.ordinal()] = 0.17f; tempProportions2[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()] = 0.19f; tempProportions2[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()] = 0.16f; tempProportions2[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()] = 0.19f; tempProportions2[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()] = 0.16f; tempProportions2[BodyPart.BODYPART_RIGHT_FOOT.ordinal()] = 0.1f; tempProportions2[BodyPart.BODYPART_LEFT_FOOT.ordinal()] = 0.1f; tempProportions2[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()] = 0.16f; tempProportions2[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()] = 0.140f; tempProportions2[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()] = 0.16f; tempProportions2[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()] = 0.140f; tempProportions2[BodyPart.BODYPART_RIGHT_HAND.ordinal()] = 0.06f; tempProportions2[BodyPart.BODYPART_LEFT_HAND.ordinal()] = 0.06f; tempProportionsWidth2[BodyPart.BODYPART_HEAD.ordinal()] = 0.2f; tempProportionsWidth2[BodyPart.BODYPART_NECK.ordinal()] = 0.02f; tempProportionsWidth2[BodyPart.BODYPART_SPINE.ordinal()] = 0.22f; tempProportionsWidth2[BodyPart.BODYPART_PELVIS.ordinal()] = 0.2f; tempProportionsWidth2[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()] = 0.11f; tempProportionsWidth2[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()] = 0.1f; tempProportionsWidth2[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()] = 0.11f; tempProportionsWidth2[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()] = 0.1f; tempProportionsWidth2[BodyPart.BODYPART_RIGHT_FOOT.ordinal()] = 0.055f; tempProportionsWidth2[BodyPart.BODYPART_LEFT_FOOT.ordinal()] = 0.055f; tempProportionsWidth2[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()] = 0.035f; tempProportionsWidth2[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()] = 0.025f; tempProportionsWidth2[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()] = 0.035f; tempProportionsWidth2[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()] = 0.025f; tempProportionsWidth2[BodyPart.BODYPART_RIGHT_HAND.ordinal()] = 0.03f; tempProportionsWidth2[BodyPart.BODYPART_LEFT_HAND.ordinal()] = 0.03f; //proportionsGrowthLenMap.put(0, tempProportions); //proportionsGrowthWidMap.put(0, tempProportionsWidth); // float[] tempProportions1 = (float[]) proportionsGrowthLenMap.get(0); // float[] tempProportionsWidth1 = (float[]) proportionsGrowthWidMap.get(0); // // float[] tempProportions2 = (float[]) proportionsGrowthLenMap.get(1); // float[] tempProportionsWidth2 = (float[]) proportionsGrowthWidMap.get(1); float delta = this.scale; delta = PApplet.map(delta, 1, .3f, 1, 0); if (delta < 0) delta = 0; // Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if(delta <= 1){ proportions[i] = (tempProportions2[i] * (1 - delta)) + (tempProportions1[i] * (delta)); }else{ proportions[i] = tempProportions1[i] * (delta); } } for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if(delta <= 1){ proportionsWidth[i] = (tempProportionsWidth2[i] * (1 - delta)) + (tempProportionsWidth1[i] * (delta)); }else{ proportionsWidth[i] = tempProportionsWidth1[i] * (delta); } } // Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { limbLengths[i] = (this.height * proportions[i]) * this.scale; } // Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { limbWidths[i] = (this.height * proportionsWidth[i]) * this.scale; } } void collisions() { //Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if (this.bodies[i] != null) this.bodies[i] .setCollisionFlags(CollisionFlags.KINEMATIC_OBJECT); } } public void destroy() { int i; // Remove all constraints for (i = 0; i < JointType.JOINT_COUNT.ordinal(); ++i) { if (joints[i] != null) { ownerWorld.removeConstraint(joints[i]); //joints[i].destroy(); joints[i] = null; } } // Remove all bodies and shapes for (i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if (bodies[i] != null) { ownerWorld.removeRigidBody(bodies[i]); //ownerWorld.removeCollisionObject(bodies[i].getCollisionShape().); //ownerWorld.getCollisionObjectArray().remove(bodies[i].getCollisionShape()); ownerWorld.removeCollisionObject(bodies[i]); //bodies[i].getMotionState(). //bodies[i].destroy(); bodies[i] = null; //shapes[i].destroy(); shapes[i] = null; } } } public void dragScale(float mouseX, float mouseY) { //this.freeze(); } public void freeze() { // Setup some damping on the m_bodies for (int i = 1; i < JointType.JOINT_COUNT.ordinal(); ++i) { if (joints[i] != null) { Generic6DofConstraint joint = (Generic6DofConstraint) joints[i]; joint.setLimit(3, joint.getAngle(0), joint.getAngle(0)); joint.setLimit(4, joint.getAngle(1), joint.getAngle(1)); joint.setLimit(5, joint.getAngle(2), joint.getAngle(2)); //joint.setLimit(3, joint.getAngle(3), joint.getAngle(3)); //joint.setLimit(4, joint.getAngle(4), joint.getAngle(4)); //joint.setLimit(5, joint.getAngle(5), joint.getAngle(5)); } } } public float getScale() { return this.scale; } void hide() { this.translate(10000, 100, 0); this.noCollisions(); } void liftLeg() { Generic6DofConstraint dofConstraint = (Generic6DofConstraint) joints[JointType.JOINT_RIGHT_KNEE .ordinal()]; dofConstraint.buildJacobian(); float angle = dofConstraint.getAngle(1); dofConstraint.testAngularLimitMotor(1); // RotationalLimitMotor lim = dofConstraint.getRotationalLimitMotor(1); TranslationalLimitMotor translim = dofConstraint .getTranslationalLimitMotor(); //dofConstraint. // translim. } private RigidBody localCreateRigidBody(float mass, Transform startTransform, CollisionShape shape) { boolean isDynamic = (mass != 0f); Vector3f localInertia = new Vector3f(); localInertia.set(0f, 0f, 0f); if (isDynamic) { shape.calculateLocalInertia(mass, localInertia); } DefaultMotionState myMotionState = new DefaultMotionState( startTransform); RigidBodyConstructionInfo rbInfo = new RigidBodyConstructionInfo(mass, myMotionState, shape, localInertia); rbInfo.additionalDamping = true; RigidBody body = new RigidBody(rbInfo); ownerWorld.addRigidBody(body); return body; } void makeBody(DynamicsWorld ownerWorld, Vector3f positionOffset, float scale_ragdoll) { this.buildScale = scale_ragdoll; Transform tmpTrans = new Transform(); Vector3f tmp = new Vector3f(); // Setup the geometry int partNum = 0; this.buildProportions(); // Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { shapes[i] = new CapsuleShape(limbWidths[i], limbLengths[i]); } // Setup all the rigid bodies Transform offset = new Transform(); offset.setIdentity(); offset.origin.set(positionOffset); Transform transform = new Transform(); transform.setIdentity(); transform.origin.set(42.00441f, 28.350739f, -1.8362772f); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_HEAD.ordinal()] = localCreateRigidBody( .06f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_HEAD.ordinal()]); transform.setIdentity(); transform.origin.set(40.328167f, 34.438187f, -0.02232361f); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_SPINE.ordinal()] = localCreateRigidBody( 1f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_SPINE.ordinal()]); transform.setIdentity(); transform.origin.set(38.91143f, 39.836838f, 0.29198787f); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_PELVIS.ordinal()] = localCreateRigidBody( 1f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_PELVIS.ordinal()]); // transform.setIdentity(); // transform.origin.set(0f, scale_ragdoll * -1.6f, 0f); // tmpTrans.mul(offset, transform); // bodies[BodyPart.BODYPART_NECK.ordinal()] = localCreateRigidBody(.1f, tmpTrans, shapes[BodyPart.BODYPART_NECK.ordinal()]); if (this.hasArms) { transform.setIdentity(); transform.origin.set(41.880104f, 33.694458f, 2.016673f); MatrixUtil.setEulerZYX(transform.basis, -BulletGlobals.SIMD_HALF_PI, 0, 0); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()] = localCreateRigidBody( .006f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()]); transform.setIdentity(); transform.origin.set(42.41656f, 37.918385f, 0.61924f); MatrixUtil.setEulerZYX(transform.basis, -BulletGlobals.SIMD_HALF_PI, 0, 0); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()] = localCreateRigidBody( .006f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()]); transform.setIdentity(); transform.origin.set(42.514267f, 33.331062f, -3.8124154f); MatrixUtil.setEulerZYX(transform.basis, -BulletGlobals.SIMD_HALF_PI, 0, 0); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_LEFT_HAND.ordinal()] = localCreateRigidBody( .006f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_LEFT_HAND.ordinal()]); transform.setIdentity(); transform.setIdentity(); transform.origin.set(39.261406f, 46.36395f, 2.412697f); MatrixUtil.setEulerZYX(transform.basis, BulletGlobals.SIMD_HALF_PI, 0, 0); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()] = localCreateRigidBody( .006f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()]); transform.setIdentity(); transform.origin.set(39.526512f, 54.545227f, 2.1793346f); MatrixUtil.setEulerZYX(transform.basis, BulletGlobals.SIMD_HALF_PI, 0, 0); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()] = localCreateRigidBody( .006f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()]); transform.setIdentity(); transform.origin.set(42.192146f, 40.39129f, -1.8401904f); MatrixUtil.setEulerZYX(transform.basis, BulletGlobals.SIMD_HALF_PI, 0, 0); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_RIGHT_HAND.ordinal()] = localCreateRigidBody( .006f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_RIGHT_HAND.ordinal()]); } //LEFT LEG transform.setIdentity(); transform.origin.set(39.261406f, 46.36395f, 2.412697f); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()] = localCreateRigidBody( 1.2f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()]); transform.setIdentity(); transform.origin.set(39.526512f, 54.545227f, 2.1793346f); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()] = localCreateRigidBody( .6f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()]); transform.setIdentity(); transform.origin.set(39.758045f, 59.2257f, 2.0889432f); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_LEFT_FOOT.ordinal()] = localCreateRigidBody( .6f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_LEFT_FOOT.ordinal()]); //RIGHT LEG transform.setIdentity(); transform.origin.set(39.261406f, 46.36395f, -2.412697f); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()] = localCreateRigidBody( 1.2f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()]); transform.setIdentity(); transform.origin.set(39.526512f, 54.545227f, -2.1793346f); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()] = localCreateRigidBody( .6f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()]); transform.setIdentity(); transform.origin.set(39.758045f, 59.2257f, -2.0889432f); tmpTrans.mul(offset, transform); bodies[BodyPart.BODYPART_RIGHT_FOOT.ordinal()] = localCreateRigidBody( 0.6f * this.mass, tmpTrans, shapes[BodyPart.BODYPART_RIGHT_FOOT.ordinal()]); //Remembered positions //BODYPART_HEAD bodies[BodyPart.BODYPART_HEAD.ordinal()].getMotionState() .getWorldTransform(transform); transform.set(new Matrix4f(0.999522f, -0.02457619f, 0.01875775f, 103.311295f, 0.03083701f, 0.83602184f, -0.547829f, 22.693146f * this.scale, -0.0022183368f, 0.5481455f, 0.83638f, -1.0370132f * this.scale, 0.0f, 0.0f, 0.0f, 1.0f * this.scale)); bodies[BodyPart.BODYPART_HEAD.ordinal()] .setMotionState(new DefaultMotionState(transform)); //BODYPART_SPINE bodies[BodyPart.BODYPART_SPINE.ordinal()].getMotionState() .getWorldTransform(transform); transform.setIdentity(); transform.set(new Matrix4f(0.9932064f, 0.116363324f, 7.786779E-4f, 104.067566f, -0.1162641f, 0.99203515f, 0.04846615f, 31.873365f * this.scale, 0.004867207f, -0.048227426f, 0.99882454f, 0.0021075667f * this.scale, 0.0f, 0.0f, 0.0f, 1.0f * this.scale)); bodies[BodyPart.BODYPART_SPINE.ordinal()] .setMotionState(new DefaultMotionState(transform)); //BODYPART_PELVIS bodies[BodyPart.BODYPART_PELVIS.ordinal()].getMotionState() .getWorldTransform(transform); transform.setIdentity(); transform.set(new Matrix4f(0.9835286f, 0.17898695f, -0.025202362f, 105.264946f, -0.18059899f, 0.97884035f, -0.09620573f, 40.34729f * this.scale, 0.007449517f, 0.099172615f, 0.9950424f, 0.04683579f * this.scale, 0.0f, 0.0f, 0.0f, 1.0f * this.scale)); bodies[BodyPart.BODYPART_PELVIS.ordinal()] .setMotionState(new DefaultMotionState(transform)); //BODYPART_LEFT_UPPER_LEG bodies[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()].getMotionState() .getWorldTransform(transform); transform.setIdentity(); transform.set(new Matrix4f(0.29188365f, 0.9564537f, -4.4153258E-4f, 109.79127f, -0.9526396f, 0.29067844f, -0.0893526f, 44.345417f * this.scale, -0.08533329f, 0.026501186f, 0.99599993f, 3.9808998f * this.scale, 0.0f, 0.0f, 0.0f, 1.0f * this.scale)); bodies[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()] .setMotionState(new DefaultMotionState(transform)); //BODYPART_LEFT_LOWER_LEG bodies[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()].getMotionState() .getWorldTransform(transform); transform.setIdentity(); transform.set(new Matrix4f(0.9873329f, -0.15865491f, 0.0015572663f, 115.62421f, 0.15813647f, 0.98321307f, -0.09102161f, 52.051834f * this.scale, 0.012909901f, 0.09011489f, 0.9958477f, 4.6894903f * this.scale, 0.0f, 0.0f, 0.0f, 1.0f * this.scale)); bodies[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()] .setMotionState(new DefaultMotionState(transform)); //RIGHT_UPPER_LEG bodies[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()].getMotionState() .getWorldTransform(transform); transform.setIdentity(); transform.set(new Matrix4f(0.23838913f, 0.9675928f, -0.08327571f, 110.01697f, -0.9671425f, 0.22872531f, -0.110996194f, 44.76596f * this.scale, -0.08835185f, 0.10699976f, 0.9903257f, -2.6929f * this.scale, 0.0f, 0.0f, 0.0f, 1.0f * this.scale)); bodies[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()] .setMotionState(new DefaultMotionState(transform)); //BODYPART_RIGHT_LOWER_LEG bodies[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()].getMotionState() .getWorldTransform(transform); transform.setIdentity(); transform.set(new Matrix4f(0.9864584f, -0.14225316f, -0.081632055f, 116.022156f, 0.13265687f, 0.98470926f, -0.11291519f, 52.043633f * this.scale, 0.09644639f, 0.10055709f, 0.9902456f, -1.3562305f * this.scale, 0.0f, 0.0f, 0.0f, 1.0f * this.scale)); bodies[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()] .setMotionState(new DefaultMotionState(transform)); //BODYPART_RIGHT_FOOT bodies[BodyPart.BODYPART_RIGHT_FOOT.ordinal()].getMotionState() .getWorldTransform(transform); transform.setIdentity(); transform.set(new Matrix4f(0.00923717f, 0.9967484f, -0.080045804f, 116.96003f, -0.99355465f, 1.0448694E-4f, -0.11335374f, 57.707912f * this.scale, -0.11297679f, 0.08057695f, 0.990325f, -0.6338565f * this.scale, 0.0f, 0.0f, 0.0f, 1.0f * this.scale)); bodies[BodyPart.BODYPART_RIGHT_FOOT.ordinal()] .setMotionState(new DefaultMotionState(transform)); //BODYPART_LEFT_FOOT bodies[BodyPart.BODYPART_LEFT_FOOT.ordinal()].getMotionState() .getWorldTransform(transform); transform.setIdentity(); transform.set(new Matrix4f(-3.4880638E-4f, 0.99999404f, 0.0034378879f, 116.47286f, -0.9958018f, -3.2663345E-5f, -0.09153569f, 57.707455f * this.scale, -0.09153503f, -0.0034553856f, 0.99579585f, 5.203514f * this.scale, 0.0f, 0.0f, 0.0f, 1.0f * this.scale)); bodies[BodyPart.BODYPART_LEFT_FOOT.ordinal()] .setMotionState(new DefaultMotionState(transform)); // Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if (bodies[i] != null) { bodies[i].setDamping(0.5f, 9.95f); bodies[i].setDeactivationTime(0.8f); bodies[i].setSleepingThresholds(1.6f, 2.5f); bodies[i].setFriction(SETTINGS.person_friction); } } this.buildLimbConstraints(); // GLOBAL.jBullet.update(); this.freeze(); } public void mouseClicked(float mouseX, float mouseY) { boolean overPerson = false; if (this.mouseOver(mouseX, mouseY)) { this.clickedOnPerson = true; overPerson = true; if (GLOBAL.jBullet.physics_on) this.buildLimbConstraints(); } } public void mouseDown(float mouseX, float mouseY) { if (!GLOBAL.jBullet.physics_on && GLOBAL.personTranslate && this.clickedOnPerson) { float deltaMx = (GLOBAL.uiTools.mouseXworld - GLOBAL.uiTools.pmouseXworld) * GLOBAL.jBullet.scale; float deltaMy = (GLOBAL.uiTools.mouseYworld - GLOBAL.uiTools.pmouseYworld) * GLOBAL.jBullet.scale; float maxMouse = SETTINGS.mouseMoveClamp; if(deltaMx > maxMouse || deltaMx < -maxMouse || deltaMy > maxMouse || deltaMy < -maxMouse ) return; this.translate(deltaMx,deltaMy , 0); } if (GLOBAL.uiTools.getCurrentTool() == UITools.SCALE_TOOL && this.clickedOnPerson) { float scaleDelta = (GLOBAL.uiTools.mouseY - GLOBAL.uiTools.pmouseY); scaleDelta /= 100; //if(this.scale > 0 && this.scale < 100 ) GLOBAL.person.scale(scaleDelta); GLOBAL.jBullet.update(); } if(this.clickedOnPerson) this.dragged = true; } public boolean mouseOver(float mouseX, float mouseY) { RigidBody body = GLOBAL.jBullet.getOver(mouseX, mouseY); if (body == null || !this.on) { return false; } else { if (body != null && body == bodies[BodyPart.BODYPART_HEAD.ordinal()] || body == bodies[BodyPart.BODYPART_SPINE.ordinal()] || body == bodies[BodyPart.BODYPART_PELVIS.ordinal()] || body == bodies[BodyPart.BODYPART_LEFT_UPPER_LEG .ordinal()] || body == bodies[BodyPart.BODYPART_LEFT_LOWER_LEG .ordinal()] || body == bodies[BodyPart.BODYPART_LEFT_FOOT.ordinal()] || body == bodies[BodyPart.BODYPART_RIGHT_UPPER_LEG .ordinal()] || body == bodies[BodyPart.BODYPART_RIGHT_LOWER_LEG .ordinal()] || body == bodies[BodyPart.BODYPART_RIGHT_FOOT.ordinal()] || body == bodies[BodyPart.BODYPART_LEFT_UPPER_ARM .ordinal()] || body == bodies[BodyPart.BODYPART_LEFT_LOWER_ARM .ordinal()] || body == bodies[BodyPart.BODYPART_LEFT_HAND.ordinal()] || body == bodies[BodyPart.BODYPART_RIGHT_UPPER_ARM .ordinal()] || body == bodies[BodyPart.BODYPART_RIGHT_LOWER_ARM .ordinal()] || body == bodies[BodyPart.BODYPART_RIGHT_HAND.ordinal()] ) { return true; } else { return false; } } } public void mouseReleased(float mouseX, float mouseY) { this.clickedOnPerson = false; //if(GLOBAL.uiTools.currentTool == UITools.MOVE_OBJECT ){ this.freeze(); //} } void noCollisions() { //Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if (this.bodies[i] != null) this.bodies[i] .setCollisionFlags(CollisionFlags.NO_CONTACT_RESPONSE); } } private boolean overlapsWith(RigidBody rigidBody) { GLOBAL.jBullet.myWorld.performDiscreteCollisionDetection(); //performDiscreteCollisionDetection for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if (bodies[i] != null && rigidBody != null) { CollisionAlgorithm Algorithm = GLOBAL.jBullet.myWorld .getDispatcher().findAlgorithm(rigidBody, bodies[i]);//getDispatcher()->findAlgorithm( pBulletObj1, pBulletObj2 ); ManifoldResult manifoldResult = new ManifoldResult(rigidBody, bodies[i]); Algorithm.processCollision(rigidBody, bodies[i], GLOBAL.jBullet.myWorld.getDispatchInfo(), manifoldResult); PersistentManifold pManifold = manifoldResult .getPersistentManifold(); if (pManifold != null){ GLOBAL.jBullet.myWorld.getCollisionWorld().getDispatcher().releaseManifold(pManifold); return true; } } } return false; } public void printOrigins() { Transform transform = new Transform(); Vector3f origin = new Vector3f(); Matrix4f matrix = new Matrix4f(); bodies[BodyPart.BODYPART_HEAD.ordinal()].getMotionState() .getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_HEAD"); System.out .println("bodies[BodyPart.BODYPART_HEAD.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.set(new Matrix4f(" + matrix.m00 + "f," + matrix.m01 + "f," + matrix.m02 + "f," + matrix.m03 + "f," + matrix.m10 + "f," + matrix.m11 + "f," + matrix.m12 + "f," + matrix.m13 + "f * this.scale," + matrix.m20 + "f," + matrix.m21 + "f," + matrix.m22 + "f," + matrix.m23 + "f * this.scale," + matrix.m30 + "f," + matrix.m31 + "f," + matrix.m32 + "f," + matrix.m33 + "f * this.scale));"); System.out .println("bodies[BodyPart.BODYPART_HEAD.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_SPINE.ordinal()].getMotionState() .getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_SPINE"); System.out .println("bodies[BodyPart.BODYPART_SPINE.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f(" + matrix.m00 + "f," + matrix.m01 + "f," + matrix.m02 + "f," + matrix.m03 + "f," + matrix.m10 + "f," + matrix.m11 + "f," + matrix.m12 + "f," + matrix.m13 + "f * this.scale," + matrix.m20 + "f," + matrix.m21 + "f," + matrix.m22 + "f," + matrix.m23 + "f * this.scale," + matrix.m30 + "f," + matrix.m31 + "f," + matrix.m32 + "f," + matrix.m33 + "f * this.scale));"); System.out .println("bodies[BodyPart.BODYPART_SPINE.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_PELVIS.ordinal()].getMotionState() .getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_PELVIS"); System.out .println("bodies[BodyPart.BODYPART_PELVIS.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f(" + matrix.m00 + "f," + matrix.m01 + "f," + matrix.m02 + "f," + matrix.m03 + "f," + matrix.m10 + "f," + matrix.m11 + "f," + matrix.m12 + "f," + matrix.m13 + "f * this.scale," + matrix.m20 + "f," + matrix.m21 + "f," + matrix.m22 + "f," + matrix.m23 + "f * this.scale," + matrix.m30 + "f," + matrix.m31 + "f," + matrix.m32 + "f," + matrix.m33 + "f * this.scale));"); System.out .println("bodies[BodyPart.BODYPART_PELVIS.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()].getMotionState() .getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_LEFT_UPPER_LEG"); System.out .println("bodies[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f(" + matrix.m00 + "f," + matrix.m01 + "f," + matrix.m02 + "f," + matrix.m03 + "f," + matrix.m10 + "f," + matrix.m11 + "f," + matrix.m12 + "f," + matrix.m13 + "f * this.scale," + matrix.m20 + "f," + matrix.m21 + "f," + matrix.m22 + "f," + matrix.m23 + "f * this.scale," + matrix.m30 + "f," + matrix.m31 + "f," + matrix.m32 + "f," + matrix.m33 + "f * this.scale));"); System.out .println("bodies[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()].getMotionState() .getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_LEFT_LOWER_LEG"); System.out .println("bodies[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f(" + matrix.m00 + "f," + matrix.m01 + "f," + matrix.m02 + "f," + matrix.m03 + "f," + matrix.m10 + "f," + matrix.m11 + "f," + matrix.m12 + "f," + matrix.m13 + "f * this.scale," + matrix.m20 + "f," + matrix.m21 + "f," + matrix.m22 + "f," + matrix.m23 + "f * this.scale," + matrix.m30 + "f," + matrix.m31 + "f," + matrix.m32 + "f," + matrix.m33 + "f * this.scale));"); System.out .println("bodies[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()].getMotionState() .getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//RIGHT_UPPER_LEG"); System.out .println("bodies[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f(" + matrix.m00 + "f," + matrix.m01 + "f," + matrix.m02 + "f," + matrix.m03 + "f," + matrix.m10 + "f," + matrix.m11 + "f," + matrix.m12 + "f," + matrix.m13 + "f * this.scale," + matrix.m20 + "f," + matrix.m21 + "f," + matrix.m22 + "f," + matrix.m23 + "f * this.scale," + matrix.m30 + "f," + matrix.m31 + "f," + matrix.m32 + "f," + matrix.m33 + "f * this.scale));"); System.out .println("bodies[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()].getMotionState() .getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_RIGHT_LOWER_LEG"); System.out .println("bodies[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f(" + matrix.m00 + "f," + matrix.m01 + "f," + matrix.m02 + "f," + matrix.m03 + "f," + matrix.m10 + "f," + matrix.m11 + "f," + matrix.m12 + "f," + matrix.m13 + "f * this.scale," + matrix.m20 + "f," + matrix.m21 + "f," + matrix.m22 + "f," + matrix.m23 + "f * this.scale," + matrix.m30 + "f," + matrix.m31 + "f," + matrix.m32 + "f," + matrix.m33 + "f * this.scale));"); System.out .println("bodies[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_RIGHT_FOOT.ordinal()].getMotionState() .getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_RIGHT_FOOT"); System.out .println("bodies[BodyPart.BODYPART_RIGHT_FOOT.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f(" + matrix.m00 + "f," + matrix.m01 + "f," + matrix.m02 + "f," + matrix.m03 + "f," + matrix.m10 + "f," + matrix.m11 + "f," + matrix.m12 + "f," + matrix.m13 + "f * this.scale," + matrix.m20 + "f," + matrix.m21 + "f," + matrix.m22 + "f," + matrix.m23 + "f * this.scale," + matrix.m30 + "f," + matrix.m31 + "f," + matrix.m32 + "f," + matrix.m33 + "f * this.scale));"); System.out .println("bodies[BodyPart.BODYPART_RIGHT_FOOT.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_LEFT_FOOT.ordinal()].getMotionState() .getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_LEFT_FOOT"); System.out .println("bodies[BodyPart.BODYPART_LEFT_FOOT.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f(" + matrix.m00 + "f," + matrix.m01 + "f," + matrix.m02 + "f," + matrix.m03 + "f," + matrix.m10 + "f," + matrix.m11 + "f," + matrix.m12 + "f," + matrix.m13 + "f * this.scale," + matrix.m20 + "f," + matrix.m21 + "f," + matrix.m22 + "f," + matrix.m23 + "f * this.scale," + matrix.m30 + "f," + matrix.m31 + "f," + matrix.m32 + "f," + matrix.m33 + "f * this.scale));"); System.out .println("bodies[BodyPart.BODYPART_LEFT_FOOT.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); /* bodies[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()].getMotionState().getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_LEFT_UPPER_ARM"); System.out.println("bodies[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f("+matrix.m00+"f,"+matrix.m01+"f,"+matrix.m02+"f,"+matrix.m03+"f," +matrix.m10+"f,"+matrix.m11+"f,"+matrix.m12+"f,"+matrix.m13+"f * this.scale," +matrix.m20+"f,"+matrix.m21+"f,"+matrix.m22+"f,"+matrix.m23+"f * this.scale," +matrix.m30+"f,"+matrix.m31+"f,"+matrix.m32+"f,"+matrix.m33+"f * this.scale));"); System.out.println("bodies[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()].getMotionState().getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_LEFT_LOWER_ARM"); System.out.println("bodies[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f("+matrix.m00+"f,"+matrix.m01+"f,"+matrix.m02+"f,"+matrix.m03+"f," +matrix.m10+"f,"+matrix.m11+"f,"+matrix.m12+"f,"+matrix.m13+"f * this.scale," +matrix.m20+"f,"+matrix.m21+"f,"+matrix.m22+"f,"+matrix.m23+"f * this.scale," +matrix.m30+"f,"+matrix.m31+"f,"+matrix.m32+"f,"+matrix.m33+"f * this.scale));"); System.out.println("bodies[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()].getMotionState().getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_RIGHT_UPPER_ARM"); System.out.println("bodies[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f("+matrix.m00+"f,"+matrix.m01+"f,"+matrix.m02+"f,"+matrix.m03+"f," +matrix.m10+"f,"+matrix.m11+"f,"+matrix.m12+"f,"+matrix.m13+"f * this.scale," +matrix.m20+"f,"+matrix.m21+"f,"+matrix.m22+"f,"+matrix.m23+"f * this.scale," +matrix.m30+"f,"+matrix.m31+"f,"+matrix.m32+"f,"+matrix.m33+"f * this.scale));"); System.out.println("bodies[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()].getMotionState().getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_RIGHT_LOWER_ARM"); System.out.println("bodies[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f("+matrix.m00+"f,"+matrix.m01+"f,"+matrix.m02+"f,"+matrix.m03+"f," +matrix.m10+"f,"+matrix.m11+"f,"+matrix.m12+"f,"+matrix.m13+"f * this.scale," +matrix.m20+"f,"+matrix.m21+"f,"+matrix.m22+"f,"+matrix.m23+"f * this.scale," +matrix.m30+"f,"+matrix.m31+"f,"+matrix.m32+"f,"+matrix.m33+"f * this.scale));"); System.out.println("bodies[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_RIGHT_HAND.ordinal()].getMotionState().getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_RIGHT_HAND"); System.out.println("bodies[BodyPart.BODYPART_RIGHT_HAND.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f("+matrix.m00+"f,"+matrix.m01+"f,"+matrix.m02+"f,"+matrix.m03+"f," +matrix.m10+"f,"+matrix.m11+"f,"+matrix.m12+"f,"+matrix.m13+"f * this.scale," +matrix.m20+"f,"+matrix.m21+"f,"+matrix.m22+"f,"+matrix.m23+"f * this.scale," +matrix.m30+"f,"+matrix.m31+"f,"+matrix.m32+"f,"+matrix.m33+"f * this.scale));"); System.out.println("bodies[BodyPart.BODYPART_RIGHT_HAND.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); bodies[BodyPart.BODYPART_LEFT_HAND.ordinal()].getMotionState().getWorldTransform(transform); transform.getMatrix(matrix); System.out.println("//BODYPART_LEFT_HAND"); System.out.println("bodies[BodyPart.BODYPART_LEFT_HAND.ordinal()].getMotionState().getWorldTransform(transform);"); System.out.println("transform.setIdentity();"); System.out.println("transform.set(new Matrix4f("+matrix.m00+"f,"+matrix.m01+"f,"+matrix.m02+"f,"+matrix.m03+"f," +matrix.m10+"f,"+matrix.m11+"f,"+matrix.m12+"f,"+matrix.m13+"f * this.scale," +matrix.m20+"f,"+matrix.m21+"f,"+matrix.m22+"f,"+matrix.m23+"f * this.scale ," +matrix.m30+"f,"+matrix.m31+"f,"+matrix.m32+"f,"+matrix.m33+"f * this.scale));"); System.out.println("bodies[BodyPart.BODYPART_LEFT_HAND.ordinal()].setMotionState(new DefaultMotionState(transform));"); System.out.println(); */ } public void rememberPosition() { /* // Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if(bodies[i] != null){ System.out.print("rem"); motionState[i] = bodies[i].getMotionState(); } } */ } public void render(float renderScale, PGraphics g) { if (!on) return; if(destScale > scale+0.1f){ scale(( scale-destScale)/10.0f); } if(destScale < scale-0.1f){ scale(((scale-destScale)/10.0f)); } if (GLOBAL.performanceMode) g.fill(SETTINGS.ERGODOLL_FILL_COLOUR_PERFORMANCE); else g.fill(SETTINGS.ERGODOLL_FILL_COLOUR); g.pushMatrix(); g.scale(renderScale); g.noStroke(); Transform myTransform = new Transform(); if (!GLOBAL.performanceMode) g.sphereDetail(SETTINGS.sphere_res); //head float ratio = 1; //shapes[BodyPart.BODYPART_HEAD.ordinal()]. //HEAD//_________________________________________________________________________ ratio = 0.9f; g.pushMatrix(); CapsuleShape capsule = (CapsuleShape) shapes[BodyPart.BODYPART_HEAD .ordinal()]; float radius = capsule.getRadius(); float halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_HEAD.ordinal()].getMotionState() .getWorldTransform(myTransform); //g.fill(0); applyMatrix(myTransform, g); if (this.scaling) { g.pushMatrix(); g.scale(GLOBAL.jBullet.getScale()); g.fill(SETTINGS.person_height_text_fill_colour); g.text((int) (this.scale * 177f) + " cm", -50, (-radius - 2) * (1 / GLOBAL.jBullet.getScale())); g.fill(SETTINGS.ERGODOLL_FILL_COLOUR); g.popMatrix(); } /* functions.cylinder(radius, radius * ratio, halfHeight * 2, SETTINGS.cylinder_res, g); g.translate(0, halfHeight, 0); if (!GLOBAL.performanceMode) g.sphere(radius * ratio); //jaw g.translate(0, -halfHeight * 2, 0); if (!GLOBAL.performanceMode) g.sphere(radius); this.renderFace(g); */ functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.popMatrix(); //gl.drawCylinder(radius, halfHeight, upAxis); //SPINE_______________________________________________________________________ ratio = 0.80f; g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_SPINE.ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_SPINE.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); g.pushMatrix(); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.popMatrix(); //functions.cylinder(radius, radius * ratio, halfHeight * 2, // SETTINGS.cylinder_res, g); //functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * ratio); g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius); // top g.popMatrix(); //Pelvis_________________________________________________________________________ ratio = 1.0f; g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_PELVIS.ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_PELVIS.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius * ratio, radius, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius); g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * ratio); // top g.popMatrix(); if (hasArms) { //RIGHT_UPPER_ARM_________________________________________________________________________ g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_RIGHT_UPPER_ARM .ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_RIGHT_UPPER_ARM.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * .5f, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 1.1f); g.popMatrix(); //LEFT_UPPER_ARM_________________________________________________________________________ g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_LEFT_UPPER_ARM .ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_LEFT_UPPER_ARM.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * .5f, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 1.1f); g.popMatrix(); //RIGHT_LOWER_ARM_________________________________________________________________________ g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_RIGHT_LOWER_ARM .ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_RIGHT_LOWER_ARM.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * .5f, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 1.1f); g.popMatrix(); //LEFT_LOWER_ARM_________________________________________________________________________ g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_LEFT_LOWER_ARM .ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_LEFT_LOWER_ARM.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * .5f, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 1.1f); g.popMatrix(); //LEFT HAND_________________________________________________________________________ g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_LEFT_HAND .ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_LEFT_HAND.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * .5f, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 1.1f); g.popMatrix(); //RIGHT HAND_________________________________________________________________________ g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_RIGHT_HAND .ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_RIGHT_HAND.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * .5f, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 1.1f); g.popMatrix(); } //LEFT Upper Leg_________________________________________________________________________ //ratio = .7f; ratio = 0.9f; g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_LEFT_UPPER_LEG .ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_LEFT_UPPER_LEG.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * ratio, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius); g.popMatrix(); //Right Upper Leg_________________________________________________________________________ ratio = 0.9f; g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_RIGHT_UPPER_LEG .ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_RIGHT_UPPER_LEG.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * ratio, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius); g.popMatrix(); //LOWER LEFT LEG_________________________________________________________________________ ratio = 0.9f; g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_LEFT_LOWER_LEG .ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_LEFT_LOWER_LEG.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * .5f, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 1.1f); g.popMatrix(); //LOWER RIGHT LEG_________________________________________________________________________ ratio = 0.9f; g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_RIGHT_LOWER_LEG .ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_RIGHT_LOWER_LEG.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * .5f, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 1.1f); g.popMatrix(); // RIGHT Foot_________________________________________________________________________ g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_RIGHT_FOOT.ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_RIGHT_FOOT.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * .5f, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 1.1f); g.popMatrix(); //LEFT Foot_________________________________________________________________________ g.pushMatrix(); capsule = (CapsuleShape) shapes[BodyPart.BODYPART_LEFT_FOOT.ordinal()]; radius = capsule.getRadius(); halfHeight = capsule.getHalfHeight(); if (GLOBAL.performanceMode) halfHeight = halfHeight * 1.75f; myTransform = bodies[BodyPart.BODYPART_LEFT_FOOT.ordinal()] .getMotionState().getWorldTransform(myTransform); applyMatrix(myTransform, g); functions.cylinder(radius, radius * .5f, halfHeight * 2, SETTINGS.cylinder_res, g); functions.flatCylinder(radius, radius * ratio, halfHeight * 2, myTransform,g); g.translate(0, halfHeight, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 0.7f); //jaw g.translate(0, -halfHeight * 2, 0); //if (!GLOBAL.performanceMode) // g.sphere(radius * 1.1f); g.popMatrix(); g.popMatrix(); scaling = false; } private void renderFace(PGraphics g) { g.rotateY((float) (Math.PI / 2)); g.translate(0, 0, 3); g.scale(.003f * this.getScale()); //g.image(FaceImages[faceExpressions.HAPPY.ordinal()], -45, -25); } public void resetPhysics() { if(!this.on) return; // TODO Auto-generated method stub this.dragged = false; //this.scale = 10; destroy(); makeBody(this.ownerWorld, this.startPos, this.scale); //GLOBAL.person.translate(-40, 0, 0); this.translate(this.startPos.x, this.startPos.y, this.startPos.z); this.solveOverlap(); /* // Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if(bodies[i] != null){ System.out.print("set"); bodies[i].setMotionState(motionState[i]); } } GLOBAL.jBullet.update(); */ } public void scale(float scaleIn) { if(scaleIn > 1 || scaleIn < -1) return; if (this.scale < 0.1f && scaleIn > 0) return; float newScale = scale - scaleIn; if(newScale < minScale || newScale > maxScale) return; this.scale = newScale; scaling = true; // Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if (bodies[i] != null) { motionState[i] = bodies[i].getMotionState(); } } destroy(); makeBody(this.ownerWorld, this.startPos, this.scale); for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if (motionState[i] != null) { bodies[i].setMotionState(motionState[i]); bodies[i].clearForces(); } } } //place the ergoDoll so that it is in front of the chair for sitting. public void seat(SketchChair sketchChair, float x, float y, float z) { //if(GLOBAL.sketchChairs.getCurChair() != null && GLOBAL.sketchChairs.getCurChair().rigidBody != null) // GLOBAL.jBullet.myWorld.removeRigidBody(GLOBAL.sketchChairs.getCurChair().rigidBody); //GLOBAL.sketchChairs.getCurChair().rigidBody.clearForces(); if (sketchChair.rigidBody == null || !this.on) return; LOGGER.info("Number of Manifolds: "+ GLOBAL.jBullet.myWorld.getCollisionWorld().getDispatcher().getNumManifolds()); //GLOBAL.jBullet.myWorld.getBroadphase() for(int m = 0; m < GLOBAL.jBullet.myWorld.getDispatcher().getNumManifolds(); m++){ PersistentManifold manifold = GLOBAL.jBullet.myWorld.getDispatcher().getManifoldByIndexInternal(m); // GLOBAL.jBullet.myWorld.getDispatcher().releaseManifold(manifold); //LOGGER.info("removing " + manifold.index1a); //manifold.clearManifold(); //GLOBAL.jBullet.myWorld.getDispatcher().releaseManifold(arg0) } GLOBAL.jBullet.myWorld.getDispatcher().dispatchAllCollisionPairs(GLOBAL.jBullet.myWorld.getPairCache(), GLOBAL.jBullet.myWorld.getDispatchInfo(), GLOBAL.jBullet.myWorld.getDispatcher()); //PhysWorld->getDispatcher()->dispatchAllCollisionPairs(Ghost->getOverlappingPairCache(), PhysWorld->getDispatchInfo(), PhysWorld->getDispatcher()); GLOBAL.jBullet.update(); LOGGER.info("Number of Manifolds after: "+ GLOBAL.jBullet.myWorld.getCollisionWorld().getDispatcher().getNumManifolds()); this.noCollisions(); //sketchChair.rigidBody // .setCollisionFlags(CollisionFlags.NO_CONTACT_RESPONSE); x = GLOBAL.jBullet.scaleVal(x); y = GLOBAL.jBullet.scaleVal(y); z = GLOBAL.jBullet.scaleVal(z); destroy(); makeBody(this.ownerWorld, this.startPos, this.scale); float footWidth = limbLengths[BodyPart.BODYPART_RIGHT_FOOT.ordinal()]; Vector3f out = new Vector3f(); joints[JointType.JOINT_RIGHT_ANKLE.ordinal()].getRigidBodyB() .getCenterOfMassPosition(out); this.translate((x - out.x) + (footWidth * 2), y - out.y, z - out.z); solveOverlap(); //this.collisions(); //sketchChair.rigidBody.setCollisionFlags(CollisionFlags.KINEMATIC_OBJECT); //sketchChair.rigidBody.setActivationState(1); //sketchChair.updateCollisionShape(); this.buildLimbConstraints(); //sketchChair.removeRigidModel(); //sketchChair.updateCollisionShape(); //GLOBAL.jBullet.myWorld.removeRigidBody(sketchChair.rigidBody); // GLOBAL.jBullet.myWorld.addRigidBody(sketchChair.rigidBody); //GLOBAL.jBullet.rigidBodies.add(sketchChair.rigidBody); //sketchChair.rigidBody //.setCollisionFlags(CollisionFlags.CHARACTER_OBJECT); this.freeze(); } void show() { this.collisions(); this.resetPhysics(); } void solveOverlap() { int offset = 0; if (GLOBAL.sketchChairs.getCurChair() == null) return; while (overlapsWith(GLOBAL.sketchChairs.getCurChair().rigidBody) && offset < 10000) { this.translate(0, -1f, 0); //this.translate(((x - out.x)+(footWidth*2) )+ offset , y - out.y, z -out.z ); //LOGGER.info("OVERLAP "+offset); offset++; //GLOBAL.jBullet.myWorld.stepSimulation(10); //..GLOBAL.jBullet.step(); } } public void toggleON() { this.on = !this.on; if (this.on) this.show(); else this.hide(); } void translate(float x, float y, float z) { Vector3f offset3f = new Vector3f(x, y, z); // Setup some damping on the m_bodies for (int i = 0; i < BodyPart.BODYPART_COUNT.ordinal(); ++i) { if (bodies[i] != null) { bodies[i].translate(offset3f); bodies[i].clearForces(); bodies[i].setAngularVelocity(new Vector3f(0, 0, 0)); bodies[i].setLinearVelocity(new Vector3f(0, 0, 0)); } } GLOBAL.jBullet.update(); } public void bigger() { if(destScale < maxScale) destScale+=0.1; } public void smaller() { if(destScale > minScale) destScale-=0.1; } }