#include "BipedDef.h" int16 BipedDef::count = 0; const float32 k_scale = 3.0f; BipedDef::BipedDef() { SetMotorTorque(2.0f); SetMotorSpeed(0.0f); SetDensity(20.0f); SetRestitution(0.0f); SetLinearDamping(0.0f); SetAngularDamping(0.005f); SetGroupIndex(--count); EnableMotor(); EnableLimit(); DefaultVertices(); DefaultPositions(); DefaultJoints(); LFootPoly.friction = RFootPoly.friction = 0.85f; } void BipedDef::IsFast(bool b) { B2_NOT_USED(b); /* LFootDef.isFast = b; RFootDef.isFast = b; LCalfDef.isFast = b; RCalfDef.isFast = b; LThighDef.isFast = b; RThighDef.isFast = b; PelvisDef.isFast = b; StomachDef.isFast = b; ChestDef.isFast = b; NeckDef.isFast = b; HeadDef.isFast = b; LUpperArmDef.isFast = b; RUpperArmDef.isFast = b; LForearmDef.isFast = b; RForearmDef.isFast = b; LHandDef.isFast = b; RHandDef.isFast = b; */ } void BipedDef::SetGroupIndex(int16 i) { LFootPoly.filter.groupIndex = i; RFootPoly.filter.groupIndex = i; LCalfPoly.filter.groupIndex = i; RCalfPoly.filter.groupIndex = i; LThighPoly.filter.groupIndex = i; RThighPoly.filter.groupIndex = i; PelvisPoly.filter.groupIndex = i; StomachPoly.filter.groupIndex = i; ChestPoly.filter.groupIndex = i; NeckPoly.filter.groupIndex = i; HeadCirc.filter.groupIndex = i; LUpperArmPoly.filter.groupIndex = i; RUpperArmPoly.filter.groupIndex = i; LForearmPoly.filter.groupIndex = i; RForearmPoly.filter.groupIndex = i; LHandPoly.filter.groupIndex = i; RHandPoly.filter.groupIndex = i; } void BipedDef::SetLinearDamping(float f) { LFootDef.linearDamping = f; RFootDef.linearDamping = f; LCalfDef.linearDamping = f; RCalfDef.linearDamping = f; LThighDef.linearDamping = f; RThighDef.linearDamping = f; PelvisDef.linearDamping = f; StomachDef.linearDamping = f; ChestDef.linearDamping = f; NeckDef.linearDamping = f; HeadDef.linearDamping = f; LUpperArmDef.linearDamping = f; RUpperArmDef.linearDamping = f; LForearmDef.linearDamping = f; RForearmDef.linearDamping = f; LHandDef.linearDamping = f; RHandDef.linearDamping = f; } void BipedDef::SetAngularDamping(float f) { LFootDef.angularDamping = f; RFootDef.angularDamping = f; LCalfDef.angularDamping = f; RCalfDef.angularDamping = f; LThighDef.angularDamping = f; RThighDef.angularDamping = f; PelvisDef.angularDamping = f; StomachDef.angularDamping = f; ChestDef.angularDamping = f; NeckDef.angularDamping = f; HeadDef.angularDamping = f; LUpperArmDef.angularDamping = f; RUpperArmDef.angularDamping = f; LForearmDef.angularDamping = f; RForearmDef.angularDamping = f; LHandDef.angularDamping = f; RHandDef.angularDamping = f; } void BipedDef::SetMotorTorque(float f) { LAnkleDef.maxMotorTorque = f; RAnkleDef.maxMotorTorque = f; LKneeDef.maxMotorTorque = f; RKneeDef.maxMotorTorque = f; LHipDef.maxMotorTorque = f; RHipDef.maxMotorTorque = f; LowerAbsDef.maxMotorTorque = f; UpperAbsDef.maxMotorTorque = f; LowerNeckDef.maxMotorTorque = f; UpperNeckDef.maxMotorTorque = f; LShoulderDef.maxMotorTorque = f; RShoulderDef.maxMotorTorque = f; LElbowDef.maxMotorTorque = f; RElbowDef.maxMotorTorque = f; LWristDef.maxMotorTorque = f; RWristDef.maxMotorTorque = f; } void BipedDef::SetMotorSpeed(float f) { LAnkleDef.motorSpeed = f; RAnkleDef.motorSpeed = f; LKneeDef.motorSpeed = f; RKneeDef.motorSpeed = f; LHipDef.motorSpeed = f; RHipDef.motorSpeed = f; LowerAbsDef.motorSpeed = f; UpperAbsDef.motorSpeed = f; LowerNeckDef.motorSpeed = f; UpperNeckDef.motorSpeed = f; LShoulderDef.motorSpeed = f; RShoulderDef.motorSpeed = f; LElbowDef.motorSpeed = f; RElbowDef.motorSpeed = f; LWristDef.motorSpeed = f; RWristDef.motorSpeed = f; } void BipedDef::SetDensity(float f) { LFootPoly.density = f; RFootPoly.density = f; LCalfPoly.density = f; RCalfPoly.density = f; LThighPoly.density = f; RThighPoly.density = f; PelvisPoly.density = f; StomachPoly.density = f; ChestPoly.density = f; NeckPoly.density = f; HeadCirc.density = f; LUpperArmPoly.density = f; RUpperArmPoly.density = f; LForearmPoly.density = f; RForearmPoly.density = f; LHandPoly.density = f; RHandPoly.density = f; } void BipedDef::SetRestitution(float f) { LFootPoly.restitution = f; RFootPoly.restitution = f; LCalfPoly.restitution = f; RCalfPoly.restitution = f; LThighPoly.restitution = f; RThighPoly.restitution = f; PelvisPoly.restitution = f; StomachPoly.restitution = f; ChestPoly.restitution = f; NeckPoly.restitution = f; HeadCirc.restitution = f; LUpperArmPoly.restitution = f; RUpperArmPoly.restitution = f; LForearmPoly.restitution = f; RForearmPoly.restitution = f; LHandPoly.restitution = f; RHandPoly.restitution = f; } void BipedDef::EnableLimit() { SetLimit(true); } void BipedDef::DisableLimit() { SetLimit(false); } void BipedDef::SetLimit(bool b) { LAnkleDef.enableLimit = b; RAnkleDef.enableLimit = b; LKneeDef.enableLimit = b; RKneeDef.enableLimit = b; LHipDef.enableLimit = b; RHipDef.enableLimit = b; LowerAbsDef.enableLimit = b; UpperAbsDef.enableLimit = b; LowerNeckDef.enableLimit = b; UpperNeckDef.enableLimit = b; LShoulderDef.enableLimit = b; RShoulderDef.enableLimit = b; LElbowDef.enableLimit = b; RElbowDef.enableLimit = b; LWristDef.enableLimit = b; RWristDef.enableLimit = b; } void BipedDef::EnableMotor() { SetMotor(true); } void BipedDef::DisableMotor() { SetMotor(false); } void BipedDef::SetMotor(bool b) { LAnkleDef.enableMotor = b; RAnkleDef.enableMotor = b; LKneeDef.enableMotor = b; RKneeDef.enableMotor = b; LHipDef.enableMotor = b; RHipDef.enableMotor = b; LowerAbsDef.enableMotor = b; UpperAbsDef.enableMotor = b; LowerNeckDef.enableMotor = b; UpperNeckDef.enableMotor = b; LShoulderDef.enableMotor = b; RShoulderDef.enableMotor = b; LElbowDef.enableMotor = b; RElbowDef.enableMotor = b; LWristDef.enableMotor = b; RWristDef.enableMotor = b; } BipedDef::~BipedDef(void) { } void BipedDef::DefaultVertices() { { // feet LFootPoly.vertexCount = RFootPoly.vertexCount = 5; LFootPoly.vertices[0] = RFootPoly.vertices[0] = k_scale * b2Vec2(.033f,.143f); LFootPoly.vertices[1] = RFootPoly.vertices[1] = k_scale * b2Vec2(.023f,.033f); LFootPoly.vertices[2] = RFootPoly.vertices[2] = k_scale * b2Vec2(.267f,.035f); LFootPoly.vertices[3] = RFootPoly.vertices[3] = k_scale * b2Vec2(.265f,.065f); LFootPoly.vertices[4] = RFootPoly.vertices[4] = k_scale * b2Vec2(.117f,.143f); } { // calves LCalfPoly.vertexCount = RCalfPoly.vertexCount = 4; LCalfPoly.vertices[0] = RCalfPoly.vertices[0] = k_scale * b2Vec2(.089f,.016f); LCalfPoly.vertices[1] = RCalfPoly.vertices[1] = k_scale * b2Vec2(.178f,.016f); LCalfPoly.vertices[2] = RCalfPoly.vertices[2] = k_scale * b2Vec2(.205f,.417f); LCalfPoly.vertices[3] = RCalfPoly.vertices[3] = k_scale * b2Vec2(.095f,.417f); } { // thighs LThighPoly.vertexCount = RThighPoly.vertexCount = 4; LThighPoly.vertices[0] = RThighPoly.vertices[0] = k_scale * b2Vec2(.137f,.032f); LThighPoly.vertices[1] = RThighPoly.vertices[1] = k_scale * b2Vec2(.243f,.032f); LThighPoly.vertices[2] = RThighPoly.vertices[2] = k_scale * b2Vec2(.318f,.343f); LThighPoly.vertices[3] = RThighPoly.vertices[3] = k_scale * b2Vec2(.142f,.343f); } { // pelvis PelvisPoly.vertexCount = 5; PelvisPoly.vertices[0] = k_scale * b2Vec2(.105f,.051f); PelvisPoly.vertices[1] = k_scale * b2Vec2(.277f,.053f); PelvisPoly.vertices[2] = k_scale * b2Vec2(.320f,.233f); PelvisPoly.vertices[3] = k_scale * b2Vec2(.112f,.233f); PelvisPoly.vertices[4] = k_scale * b2Vec2(.067f,.152f); } { // stomach StomachPoly.vertexCount = 4; StomachPoly.vertices[0] = k_scale * b2Vec2(.088f,.043f); StomachPoly.vertices[1] = k_scale * b2Vec2(.284f,.043f); StomachPoly.vertices[2] = k_scale * b2Vec2(.295f,.231f); StomachPoly.vertices[3] = k_scale * b2Vec2(.100f,.231f); } { // chest ChestPoly.vertexCount = 4; ChestPoly.vertices[0] = k_scale * b2Vec2(.091f,.042f); ChestPoly.vertices[1] = k_scale * b2Vec2(.283f,.042f); ChestPoly.vertices[2] = k_scale * b2Vec2(.177f,.289f); ChestPoly.vertices[3] = k_scale * b2Vec2(.065f,.289f); } { // head HeadCirc.radius = k_scale * .115f; } { // neck NeckPoly.vertexCount = 4; NeckPoly.vertices[0] = k_scale * b2Vec2(.038f,.054f); NeckPoly.vertices[1] = k_scale * b2Vec2(.149f,.054f); NeckPoly.vertices[2] = k_scale * b2Vec2(.154f,.102f); NeckPoly.vertices[3] = k_scale * b2Vec2(.054f,.113f); } { // upper arms LUpperArmPoly.vertexCount = RUpperArmPoly.vertexCount = 5; LUpperArmPoly.vertices[0] = RUpperArmPoly.vertices[0] = k_scale * b2Vec2(.092f,.059f); LUpperArmPoly.vertices[1] = RUpperArmPoly.vertices[1] = k_scale * b2Vec2(.159f,.059f); LUpperArmPoly.vertices[2] = RUpperArmPoly.vertices[2] = k_scale * b2Vec2(.169f,.335f); LUpperArmPoly.vertices[3] = RUpperArmPoly.vertices[3] = k_scale * b2Vec2(.078f,.335f); LUpperArmPoly.vertices[4] = RUpperArmPoly.vertices[4] = k_scale * b2Vec2(.064f,.248f); } { // forearms LForearmPoly.vertexCount = RForearmPoly.vertexCount = 4; LForearmPoly.vertices[0] = RForearmPoly.vertices[0] = k_scale * b2Vec2(.082f,.054f); LForearmPoly.vertices[1] = RForearmPoly.vertices[1] = k_scale * b2Vec2(.138f,.054f); LForearmPoly.vertices[2] = RForearmPoly.vertices[2] = k_scale * b2Vec2(.149f,.296f); LForearmPoly.vertices[3] = RForearmPoly.vertices[3] = k_scale * b2Vec2(.088f,.296f); } { // hands LHandPoly.vertexCount = RHandPoly.vertexCount = 5; LHandPoly.vertices[0] = RHandPoly.vertices[0] = k_scale * b2Vec2(.066f,.031f); LHandPoly.vertices[1] = RHandPoly.vertices[1] = k_scale * b2Vec2(.123f,.020f); LHandPoly.vertices[2] = RHandPoly.vertices[2] = k_scale * b2Vec2(.160f,.127f); LHandPoly.vertices[3] = RHandPoly.vertices[3] = k_scale * b2Vec2(.127f,.178f); LHandPoly.vertices[4] = RHandPoly.vertices[4] = k_scale * b2Vec2(.074f,.178f);; } } void BipedDef::DefaultJoints() { //b.LAnkleDef.body1 = LFoot; //b.LAnkleDef.body2 = LCalf; //b.RAnkleDef.body1 = RFoot; //b.RAnkleDef.body2 = RCalf; { // ankles b2Vec2 anchor = k_scale * b2Vec2(-.045f,-.75f); LAnkleDef.localAnchor1 = RAnkleDef.localAnchor1 = anchor - LFootDef.position; LAnkleDef.localAnchor2 = RAnkleDef.localAnchor2 = anchor - LCalfDef.position; LAnkleDef.referenceAngle = RAnkleDef.referenceAngle = 0.0f; LAnkleDef.lowerAngle = RAnkleDef.lowerAngle = -0.523598776f; LAnkleDef.upperAngle = RAnkleDef.upperAngle = 0.523598776f; } //b.LKneeDef.body1 = LCalf; //b.LKneeDef.body2 = LThigh; //b.RKneeDef.body1 = RCalf; //b.RKneeDef.body2 = RThigh; { // knees b2Vec2 anchor = k_scale * b2Vec2(-.030f,-.355f); LKneeDef.localAnchor1 = RKneeDef.localAnchor1 = anchor - LCalfDef.position; LKneeDef.localAnchor2 = RKneeDef.localAnchor2 = anchor - LThighDef.position; LKneeDef.referenceAngle = RKneeDef.referenceAngle = 0.0f; LKneeDef.lowerAngle = RKneeDef.lowerAngle = 0; LKneeDef.upperAngle = RKneeDef.upperAngle = 2.61799388f; } //b.LHipDef.body1 = LThigh; //b.LHipDef.body2 = Pelvis; //b.RHipDef.body1 = RThigh; //b.RHipDef.body2 = Pelvis; { // hips b2Vec2 anchor = k_scale * b2Vec2(.005f,-.045f); LHipDef.localAnchor1 = RHipDef.localAnchor1 = anchor - LThighDef.position; LHipDef.localAnchor2 = RHipDef.localAnchor2 = anchor - PelvisDef.position; LHipDef.referenceAngle = RHipDef.referenceAngle = 0.0f; LHipDef.lowerAngle = RHipDef.lowerAngle = -2.26892803f; LHipDef.upperAngle = RHipDef.upperAngle = 0; } //b.LowerAbsDef.body1 = Pelvis; //b.LowerAbsDef.body2 = Stomach; { // lower abs b2Vec2 anchor = k_scale * b2Vec2(.035f,.135f); LowerAbsDef.localAnchor1 = anchor - PelvisDef.position; LowerAbsDef.localAnchor2 = anchor - StomachDef.position; LowerAbsDef.referenceAngle = 0.0f; LowerAbsDef.lowerAngle = -0.523598776f; LowerAbsDef.upperAngle = 0.523598776f; } //b.UpperAbsDef.body1 = Stomach; //b.UpperAbsDef.body2 = Chest; { // upper abs b2Vec2 anchor = k_scale * b2Vec2(.045f,.320f); UpperAbsDef.localAnchor1 = anchor - StomachDef.position; UpperAbsDef.localAnchor2 = anchor - ChestDef.position; UpperAbsDef.referenceAngle = 0.0f; UpperAbsDef.lowerAngle = -0.523598776f; UpperAbsDef.upperAngle = 0.174532925f; } //b.LowerNeckDef.body1 = Chest; //b.LowerNeckDef.body2 = Neck; { // lower neck b2Vec2 anchor = k_scale * b2Vec2(-.015f,.575f); LowerNeckDef.localAnchor1 = anchor - ChestDef.position; LowerNeckDef.localAnchor2 = anchor - NeckDef.position; LowerNeckDef.referenceAngle = 0.0f; LowerNeckDef.lowerAngle = -0.174532925f; LowerNeckDef.upperAngle = 0.174532925f; } //b.UpperNeckDef.body1 = Chest; //b.UpperNeckDef.body2 = Head; { // upper neck b2Vec2 anchor = k_scale * b2Vec2(-.005f,.630f); UpperNeckDef.localAnchor1 = anchor - ChestDef.position; UpperNeckDef.localAnchor2 = anchor - HeadDef.position; UpperNeckDef.referenceAngle = 0.0f; UpperNeckDef.lowerAngle = -0.610865238f; UpperNeckDef.upperAngle = 0.785398163f; } //b.LShoulderDef.body1 = Chest; //b.LShoulderDef.body2 = LUpperArm; //b.RShoulderDef.body1 = Chest; //b.RShoulderDef.body2 = RUpperArm; { // shoulders b2Vec2 anchor = k_scale * b2Vec2(-.015f,.545f); LShoulderDef.localAnchor1 = RShoulderDef.localAnchor1 = anchor - ChestDef.position; LShoulderDef.localAnchor2 = RShoulderDef.localAnchor2 = anchor - LUpperArmDef.position; LShoulderDef.referenceAngle = RShoulderDef.referenceAngle = 0.0f; LShoulderDef.lowerAngle = RShoulderDef.lowerAngle = -1.04719755f; LShoulderDef.upperAngle = RShoulderDef.upperAngle = 3.14159265f; } //b.LElbowDef.body1 = LForearm; //b.LElbowDef.body2 = LUpperArm; //b.RElbowDef.body1 = RForearm; //b.RElbowDef.body2 = RUpperArm; { // elbows b2Vec2 anchor = k_scale * b2Vec2(-.005f,.290f); LElbowDef.localAnchor1 = RElbowDef.localAnchor1 = anchor - LForearmDef.position; LElbowDef.localAnchor2 = RElbowDef.localAnchor2 = anchor - LUpperArmDef.position; LElbowDef.referenceAngle = RElbowDef.referenceAngle = 0.0f; LElbowDef.lowerAngle = RElbowDef.lowerAngle = -2.7925268f; LElbowDef.upperAngle = RElbowDef.upperAngle = 0; } //b.LWristDef.body1 = LHand; //b.LWristDef.body2 = LForearm; //b.RWristDef.body1 = RHand; //b.RWristDef.body2 = RForearm; { // wrists b2Vec2 anchor = k_scale * b2Vec2(-.010f,.045f); LWristDef.localAnchor1 = RWristDef.localAnchor1 = anchor - LHandDef.position; LWristDef.localAnchor2 = RWristDef.localAnchor2 = anchor - LForearmDef.position; LWristDef.referenceAngle = RWristDef.referenceAngle = 0.0f; LWristDef.lowerAngle = RWristDef.lowerAngle = -0.174532925f; LWristDef.upperAngle = RWristDef.upperAngle = 0.174532925f; } } void BipedDef::DefaultPositions() { LFootDef.position = RFootDef.position = k_scale * b2Vec2(-.122f,-.901f); LCalfDef.position = RCalfDef.position = k_scale * b2Vec2(-.177f,-.771f); LThighDef.position = RThighDef.position = k_scale * b2Vec2(-.217f,-.391f); LUpperArmDef.position = RUpperArmDef.position = k_scale * b2Vec2(-.127f,.228f); LForearmDef.position = RForearmDef.position = k_scale * b2Vec2(-.117f,-.011f); LHandDef.position = RHandDef.position = k_scale * b2Vec2(-.112f,-.136f); PelvisDef.position = k_scale * b2Vec2(-.177f,-.101f); StomachDef.position = k_scale * b2Vec2(-.142f,.088f); ChestDef.position = k_scale * b2Vec2(-.132f,.282f); NeckDef.position = k_scale * b2Vec2(-.102f,.518f); HeadDef.position = k_scale * b2Vec2(.022f,.738f); }