UBiped.pas
上传用户:zkjn0718
上传日期:2021-01-01
资源大小:776k
文件大小:38k
源码类别:

Delphi/CppBuilder

开发平台:

Delphi

  1. unit UBiped;
  2. interface
  3. {$I ......SourcePhysics2D.inc}
  4. uses
  5.    UMain,
  6.    UPhysics2DTypes,
  7.    UPhysics2D,
  8.    SysUtils,
  9.    Math;
  10. type
  11.    TBipedDef = class
  12.    public
  13.       HeadCircle: Tb2CircleDef;
  14.       LFootDef, RFootDef, LCalfDef, RCalfDef, LThighDef, RThighDef,
  15.          PelvisDef, StomachDef, ChestDef, NeckDef, HeadDef,
  16.          LUpperArmDef, RUpperArmDef, LForearmDef, RForearmDef, LHandDef, RHandDef: Tb2BodyDef;
  17.       LFootPoly, RFootPoly, LCalfPoly, RCalfPoly, LThighPoly, RThighPoly,
  18.          PelvisPoly, StomachPoly, ChestPoly, NeckPoly,
  19.          LUpperArmPoly, RUpperArmPoly, LForearmPoly, RForearmPoly, LHandPoly, RHandPoly: Tb2PolygonDef;
  20.       LAnkleDef, RAnkleDef, LKneeDef, RKneeDef, LHipDef, RHipDef,
  21.          LowerAbsDef, UpperAbsDef, LowerNeckDef, UpperNeckDef,
  22.          LShoulderDef, RShoulderDef, LElbowDef, RElbowDef, LWristDef, RWristDef: Tb2RevoluteJointDef;
  23.       constructor Create;
  24.       destructor Destroy; override;
  25.       procedure SetMotorTorque(value: Float);
  26.       procedure SetMotorSpeed(value: Float);
  27.       procedure SetDensity(value: Float);
  28.       procedure SetFriction(value: Float);
  29.       procedure SetRestitution(value: Float);
  30.       procedure SetLinearDamping(value: Float);
  31.       procedure SetAngularDamping(value: Float);
  32.       procedure EnableLimit;
  33.       procedure DisableLimit;
  34.       procedure SetLimit(value: Boolean);
  35.       procedure EnableMotor;
  36.       procedure DisableMotor;
  37.       procedure SetMotor(value: Boolean);
  38.       procedure SetGroupIndex(value: int16);
  39.       procedure IsFast(value: Boolean);
  40.       procedure DefaultVertices;
  41.       procedure DefaultPositions;
  42.       procedure DefaultJoints;
  43.    end;
  44.    TBiped = class
  45.    private
  46.       m_world: Tb2World;
  47.       LFoot, RFoot, LCalf, RCalf, LThigh, RThigh, Pelvis, Stomach,
  48.          Chest, Neck, Head, LUpperArm, RUpperArm, LForearm, RForearm, LHand, RHand: Tb2Body;
  49.       LAnkle, RAnkle, LKnee, RKnee, LHip, RHip, LowerAbs, UpperAbs, LowerNeck, UpperNeck,
  50.          LShoulder, RShoulder, LElbow, RElbow, LWrist, RWrist: Tb2RevoluteJoint;
  51.       constructor Create(world: Tb2World; const position: TVector2);
  52.       destructor Destroy; override;
  53.    end;
  54.    TBipedTest1 = class(TTester)
  55.    public
  56.       m_biped: TBiped;
  57.       constructor Create; override;
  58.       destructor Destroy; override;
  59.    end;
  60.    TBipedTest2 = class(TTester)
  61.    public
  62.       m_biped: TBiped;
  63.       constructor Create; override;
  64.       destructor Destroy; override;
  65.    end;
  66. implementation
  67. const
  68.    k_scale = 3.0;
  69. var
  70.    Biped_count: Int16;
  71. { TBipedDef }
  72. constructor TBipedDef.Create;
  73. var
  74.    pFirst: Integer;
  75.    i: Integer;
  76. begin
  77.    HeadCircle := Tb2CircleDef.Create;
  78.    pFirst := Integer(Self) + SizeOf(Pointer);
  79.    for i := 1 to 17 do
  80.       PInteger(pFirst + SizeOf(Pointer) * i)^ := Integer(Tb2BodyDef.Create);
  81.    for i := 18 to 33 do
  82.       PInteger(pFirst + SizeOf(Pointer) * i)^ := Integer(Tb2PolygonDef.Create);
  83.    for i := 34 to 49 do
  84.       PInteger(pFirst + SizeOf(Pointer) * i)^ := Integer(Tb2RevoluteJointDef.Create);
  85.    SetMotorTorque(2.0);
  86.    SetMotorSpeed(0.0);
  87.    SetDensity(20.0);
  88.    SetRestitution(0.0);
  89.    SetLinearDamping(0.0);
  90.    SetAngularDamping(0.005);
  91.    Dec(Biped_count);
  92.    SetGroupIndex(Biped_count);
  93.    EnableMotor;
  94.    EnableLimit;
  95.    DefaultVertices;
  96.    DefaultPositions;
  97.    DefaultJoints;
  98.    LFootPoly.friction := 0.85;
  99.    RFootPoly.friction := 0.85;
  100. end;
  101. destructor TBipedDef.Destroy;
  102. type
  103.    PObject = ^TObject;
  104. var
  105.    pFirst: Integer;
  106.    i: Integer;
  107. begin
  108.    HeadCircle.Free;
  109.    pFirst := Integer(Self) + SizeOf(Pointer);
  110.    for i := 1 to 49 do
  111.       PObject(pFirst + SizeOf(Pointer) * i)^.Free;
  112.    inherited;
  113. end;
  114. procedure TBipedDef.SetMotorTorque(value: Float);
  115. begin
  116.    LAnkleDef.maxMotorTorque := value;
  117.    RAnkleDef.maxMotorTorque := value;
  118.    LKneeDef.maxMotorTorque := value;
  119.    RKneeDef.maxMotorTorque := value;
  120.    LHipDef.maxMotorTorque := value;
  121.    RHipDef.maxMotorTorque := value;
  122.    LowerAbsDef.maxMotorTorque := value;
  123.    UpperAbsDef.maxMotorTorque := value;
  124.    LowerNeckDef.maxMotorTorque := value;
  125.    UpperNeckDef.maxMotorTorque := value;
  126.    LShoulderDef.maxMotorTorque := value;
  127.    RShoulderDef.maxMotorTorque := value;
  128.    LElbowDef.maxMotorTorque := value;
  129.    RElbowDef.maxMotorTorque := value;
  130.    LWristDef.maxMotorTorque := value;
  131.    RWristDef.maxMotorTorque := value;
  132. end;
  133. procedure TBipedDef.SetMotorSpeed(value: Float);
  134. begin
  135.    LAnkleDef.motorSpeed := value;
  136.    RAnkleDef.motorSpeed := value;
  137.    LKneeDef.motorSpeed := value;
  138.    RKneeDef.motorSpeed := value;
  139.    LHipDef.motorSpeed := value;
  140.    RHipDef.motorSpeed := value;
  141.    LowerAbsDef.motorSpeed := value;
  142.    UpperAbsDef.motorSpeed := value;
  143.    LowerNeckDef.motorSpeed := value;
  144.    UpperNeckDef.motorSpeed := value;
  145.    LShoulderDef.motorSpeed := value;
  146.    RShoulderDef.motorSpeed := value;
  147.    LElbowDef.motorSpeed := value;
  148.    RElbowDef.motorSpeed := value;
  149.    LWristDef.motorSpeed := value;
  150.    RWristDef.motorSpeed := value;
  151. end;
  152. procedure TBipedDef.SetDensity(value: Float);
  153. begin
  154.    LFootPoly.density := value;
  155.    RFootPoly.density := value;
  156.    LCalfPoly.density := value;
  157.    RCalfPoly.density := value;
  158.    LThighPoly.density := value;
  159.    RThighPoly.density := value;
  160.    PelvisPoly.density := value;
  161.    StomachPoly.density := value;
  162.    ChestPoly.density := value;
  163.    NeckPoly.density := value;
  164.    HeadCircle.density := value;
  165.    LUpperArmPoly.density := value;
  166.    RUpperArmPoly.density := value;
  167.    LForearmPoly.density := value;
  168.    RForearmPoly.density := value;
  169.    LHandPoly.density := value;
  170.    RHandPoly.density := value;
  171. end;
  172. procedure TBipedDef.SetFriction(value: Float);
  173. begin
  174. end;
  175. procedure TBipedDef.SetRestitution(value: Float);
  176. begin
  177.    LFootPoly.restitution := value;
  178.    RFootPoly.restitution := value;
  179.    LCalfPoly.restitution := value;
  180.    RCalfPoly.restitution := value;
  181.    LThighPoly.restitution := value;
  182.    RThighPoly.restitution := value;
  183.    PelvisPoly.restitution := value;
  184.    StomachPoly.restitution := value;
  185.    ChestPoly.restitution := value;
  186.    NeckPoly.restitution := value;
  187.    HeadCircle.restitution := value;
  188.    LUpperArmPoly.restitution := value;
  189.    RUpperArmPoly.restitution := value;
  190.    LForearmPoly.restitution := value;
  191.    RForearmPoly.restitution := value;
  192.    LHandPoly.restitution := value;
  193.    RHandPoly.restitution := value;
  194. end;
  195. procedure TBipedDef.SetLinearDamping(value: Float);
  196. begin
  197.    LFootDef.linearDamping := value;
  198.    RFootDef.linearDamping := value;
  199.    LCalfDef.linearDamping := value;
  200.    RCalfDef.linearDamping := value;
  201.    LThighDef.linearDamping := value;
  202.    RThighDef.linearDamping := value;
  203.    PelvisDef.linearDamping := value;
  204.    StomachDef.linearDamping := value;
  205.    ChestDef.linearDamping := value;
  206.    NeckDef.linearDamping := value;
  207.    HeadDef.linearDamping := value;
  208.    LUpperArmDef.linearDamping := value;
  209.    RUpperArmDef.linearDamping := value;
  210.    LForearmDef.linearDamping := value;
  211.    RForearmDef.linearDamping := value;
  212.    LHandDef.linearDamping := value;
  213.    RHandDef.linearDamping := value;
  214. end;
  215. procedure TBipedDef.SetAngularDamping(value: Float);
  216. begin
  217.    LFootDef.angularDamping := value;
  218.    RFootDef.angularDamping := value;
  219.    LCalfDef.angularDamping := value;
  220.    RCalfDef.angularDamping := value;
  221.    LThighDef.angularDamping := value;
  222.    RThighDef.angularDamping := value;
  223.    PelvisDef.angularDamping := value;
  224.    StomachDef.angularDamping := value;
  225.    ChestDef.angularDamping := value;
  226.    NeckDef.angularDamping := value;
  227.    HeadDef.angularDamping := value;
  228.    LUpperArmDef.angularDamping := value;
  229.    RUpperArmDef.angularDamping := value;
  230.    LForearmDef.angularDamping := value;
  231.    RForearmDef.angularDamping := value;
  232.    LHandDef.angularDamping := value;
  233.    RHandDef.angularDamping := value;
  234. end;
  235. procedure TBipedDef.EnableLimit;
  236. begin
  237.    SetLimit(True);
  238. end;
  239. procedure TBipedDef.DisableLimit;
  240. begin
  241.    SetLimit(False);
  242. end;
  243. procedure TBipedDef.SetLimit(value: Boolean);
  244. begin
  245.    LAnkleDef.enableLimit := value;
  246.    RAnkleDef.enableLimit := value;
  247.    LKneeDef.enableLimit := value;
  248.    RKneeDef.enableLimit := value;
  249.    LHipDef.enableLimit := value;
  250.    RHipDef.enableLimit := value;
  251.    LowerAbsDef.enableLimit := value;
  252.    UpperAbsDef.enableLimit := value;
  253.    LowerNeckDef.enableLimit := value;
  254.    UpperNeckDef.enableLimit := value;
  255.    LShoulderDef.enableLimit := value;
  256.    RShoulderDef.enableLimit := value;
  257.    LElbowDef.enableLimit := value;
  258.    RElbowDef.enableLimit := value;
  259.    LWristDef.enableLimit := value;
  260.    RWristDef.enableLimit := value;
  261. end;
  262. procedure TBipedDef.EnableMotor;
  263. begin
  264.    SetMotor(True);
  265. end;
  266. procedure TBipedDef.DisableMotor;
  267. begin
  268.    SetMotor(False);
  269. end;
  270. procedure TBipedDef.SetMotor(value: Boolean);
  271. begin
  272.    LAnkleDef.enableMotor := value;
  273.    RAnkleDef.enableMotor := value;
  274.    LKneeDef.enableMotor := value;
  275.    RKneeDef.enableMotor := value;
  276.    LHipDef.enableMotor := value;
  277.    RHipDef.enableMotor := value;
  278.    LowerAbsDef.enableMotor := value;
  279.    UpperAbsDef.enableMotor := value;
  280.    LowerNeckDef.enableMotor := value;
  281.    UpperNeckDef.enableMotor := value;
  282.    LShoulderDef.enableMotor := value;
  283.    RShoulderDef.enableMotor := value;
  284.    LElbowDef.enableMotor := value;
  285.    RElbowDef.enableMotor := value;
  286.    LWristDef.enableMotor := value;
  287.    RWristDef.enableMotor := value;
  288. end;
  289. procedure TBipedDef.SetGroupIndex(value: int16);
  290. begin
  291.    LFootPoly.filter.groupIndex := value;
  292.    RFootPoly.filter.groupIndex := value;
  293.    LCalfPoly.filter.groupIndex := value;
  294.    RCalfPoly.filter.groupIndex := value;
  295.    LThighPoly.filter.groupIndex := value;
  296.    RThighPoly.filter.groupIndex := value;
  297.    PelvisPoly.filter.groupIndex := value;
  298.    StomachPoly.filter.groupIndex := value;
  299.    ChestPoly.filter.groupIndex := value;
  300.    NeckPoly.filter.groupIndex := value;
  301.    HeadCircle.filter.groupIndex := value;
  302.    LUpperArmPoly.filter.groupIndex := value;
  303.    RUpperArmPoly.filter.groupIndex := value;
  304.    LForearmPoly.filter.groupIndex := value;
  305.    RForearmPoly.filter.groupIndex := value;
  306.    LHandPoly.filter.groupIndex := value;
  307.    RHandPoly.filter.groupIndex := value;
  308. end;
  309. procedure TBipedDef.IsFast(value: Boolean);
  310. begin
  311. end;
  312. procedure TBipedDef.DefaultVertices;
  313. begin
  314.    begin // feet
  315.       LFootPoly.vertexCount := 5;
  316.       RFootPoly.vertexCount := 5;
  317.       {$IFDEF OP_OVERLOAD}
  318.       LFootPoly.vertices[0] := k_scale * MakeVector(0.033, 0.143);
  319.       LFootPoly.vertices[1] := k_scale * MakeVector(0.023, 0.033);
  320.       LFootPoly.vertices[2] := k_scale * MakeVector(0.267, 0.035);
  321.       LFootPoly.vertices[3] := k_scale * MakeVector(0.265, 0.065);
  322.       LFootPoly.vertices[4] := k_scale * MakeVector(0.117, 0.143);
  323.       {$ELSE}
  324.       LFootPoly.vertices[0] := Multiply(MakeVector(0.033, 0.143), k_scale);
  325.       LFootPoly.vertices[1] := Multiply(MakeVector(0.023, 0.033), k_scale);
  326.       LFootPoly.vertices[2] := Multiply(MakeVector(0.267, 0.035), k_scale);
  327.       LFootPoly.vertices[3] := Multiply(MakeVector(0.265, 0.065), k_scale);
  328.       LFootPoly.vertices[4] := Multiply(MakeVector(0.117, 0.143), k_scale);
  329.       {$ENDIF}
  330.       RFootPoly.vertices := LFootPoly.vertices;
  331.    end;
  332.    begin // calves
  333.       LCalfPoly.vertexCount := 4;
  334.       RCalfPoly.vertexCount := 4;
  335.       {$IFDEF OP_OVERLOAD}
  336.       LCalfPoly.vertices[0] := k_scale * MakeVector(0.089, 0.016);
  337.       LCalfPoly.vertices[1] := k_scale * MakeVector(0.178, 0.016);
  338.       LCalfPoly.vertices[2] := k_scale * MakeVector(0.205, 0.417);
  339.       LCalfPoly.vertices[3] := k_scale * MakeVector(0.095, 0.417);
  340.       {$ELSE}
  341.       LCalfPoly.vertices[0] := Multiply(MakeVector(0.089, 0.016), k_scale);
  342.       LCalfPoly.vertices[1] := Multiply(MakeVector(0.178, 0.016), k_scale);
  343.       LCalfPoly.vertices[2] := Multiply(MakeVector(0.205, 0.417), k_scale);
  344.       LCalfPoly.vertices[3] := Multiply(MakeVector(0.095, 0.417), k_scale);
  345.       {$ENDIF}
  346.       RCalfPoly.vertices := LCalfPoly.vertices;
  347.    end;
  348.    begin // thighs
  349.       LThighPoly.vertexCount := 4;
  350.       RThighPoly.vertexCount := 4;
  351.       {$IFDEF OP_OVERLOAD}
  352.       LThighPoly.vertices[0] := k_scale * MakeVector(0.137, 0.032);
  353.       LThighPoly.vertices[1] := k_scale * MakeVector(0.243, 0.032);
  354.       LThighPoly.vertices[2] := k_scale * MakeVector(0.318, 0.343);
  355.       LThighPoly.vertices[3] := k_scale * MakeVector(0.142, 0.343);
  356.       {$ELSE}
  357.       LThighPoly.vertices[0] := Multiply(MakeVector(0.137, 0.032), k_scale);
  358.       LThighPoly.vertices[1] := Multiply(MakeVector(0.243, 0.032), k_scale);
  359.       LThighPoly.vertices[2] := Multiply(MakeVector(0.318, 0.343), k_scale);
  360.       LThighPoly.vertices[3] := Multiply(MakeVector(0.142, 0.343), k_scale);
  361.       {$ENDIF}
  362.       RThighPoly.vertices := LThighPoly.vertices;
  363.    end;
  364.    begin // pelvis
  365.       PelvisPoly.vertexCount := 5;
  366.       {$IFDEF OP_OVERLOAD}
  367.       PelvisPoly.vertices[0] := k_scale * MakeVector(0.105, 0.051);
  368.       PelvisPoly.vertices[1] := k_scale * MakeVector(0.277, 0.053);
  369.       PelvisPoly.vertices[2] := k_scale * MakeVector(0.320, 0.233);
  370.       PelvisPoly.vertices[3] := k_scale * MakeVector(0.112, 0.233);
  371.       PelvisPoly.vertices[4] := k_scale * MakeVector(0.067, 0.152);
  372.       {$ELSE}
  373.       PelvisPoly.vertices[0] := Multiply(MakeVector(0.105, 0.051), k_scale);
  374.       PelvisPoly.vertices[1] := Multiply(MakeVector(0.277, 0.053), k_scale);
  375.       PelvisPoly.vertices[2] := Multiply(MakeVector(0.320, 0.233), k_scale);
  376.       PelvisPoly.vertices[3] := Multiply(MakeVector(0.112, 0.233), k_scale);
  377.       PelvisPoly.vertices[4] := Multiply(MakeVector(0.067, 0.152), k_scale);
  378.       {$ENDIF}
  379.    end;
  380.    begin // stomach
  381.       StomachPoly.vertexCount := 4;
  382.       {$IFDEF OP_OVERLOAD}
  383.       StomachPoly.vertices[0] := k_scale * MakeVector(0.088, 0.043);
  384.       StomachPoly.vertices[1] := k_scale * MakeVector(0.284, 0.043);
  385.       StomachPoly.vertices[2] := k_scale * MakeVector(0.295, 0.231);
  386.       StomachPoly.vertices[3] := k_scale * MakeVector(0.100, 0.231);
  387.       {$ELSE}
  388.       StomachPoly.vertices[0] := Multiply(MakeVector(0.088, 0.043), k_scale);
  389.       StomachPoly.vertices[1] := Multiply(MakeVector(0.284, 0.043), k_scale);
  390.       StomachPoly.vertices[2] := Multiply(MakeVector(0.295, 0.231), k_scale);
  391.       StomachPoly.vertices[3] := Multiply(MakeVector(0.100, 0.231), k_scale);
  392.       {$ENDIF}
  393.    end;
  394.    begin // chest
  395.       ChestPoly.vertexCount := 4;
  396.       {$IFDEF OP_OVERLOAD}
  397.       ChestPoly.vertices[0] := k_scale * MakeVector(0.091, 0.042);
  398.       ChestPoly.vertices[1] := k_scale * MakeVector(0.283, 0.042);
  399.       ChestPoly.vertices[2] := k_scale * MakeVector(0.177, 0.289);
  400.       ChestPoly.vertices[3] := k_scale * MakeVector(0.065, 0.289);
  401.       {$ELSE}
  402.       ChestPoly.vertices[0] := Multiply(MakeVector(0.091, 0.042), k_scale);
  403.       ChestPoly.vertices[1] := Multiply(MakeVector(0.283, 0.042), k_scale);
  404.       ChestPoly.vertices[2] := Multiply(MakeVector(0.177, 0.289), k_scale);
  405.       ChestPoly.vertices[3] := Multiply(MakeVector(0.065, 0.289), k_scale);
  406.       {$ENDIF}
  407.    end;
  408.    begin // head
  409.       HeadCircle.radius := k_scale * 0.115;
  410.    end;
  411.    begin // neck
  412.       NeckPoly.vertexCount := 4;
  413.       {$IFDEF OP_OVERLOAD}
  414.       NeckPoly.vertices[0] := k_scale * MakeVector(0.038, 0.054);
  415.       NeckPoly.vertices[1] := k_scale * MakeVector(0.149, 0.054);
  416.       NeckPoly.vertices[2] := k_scale * MakeVector(0.154, 0.102);
  417.       NeckPoly.vertices[3] := k_scale * MakeVector(0.054, 0.113);
  418.       {$ELSE}
  419.       NeckPoly.vertices[0] := Multiply(MakeVector(0.038, 0.054), k_scale);
  420.       NeckPoly.vertices[1] := Multiply(MakeVector(0.149, 0.054), k_scale);
  421.       NeckPoly.vertices[2] := Multiply(MakeVector(0.154, 0.102), k_scale);
  422.       NeckPoly.vertices[3] := Multiply(MakeVector(0.054, 0.113), k_scale);
  423.       {$ENDIF}
  424.    end;
  425.    begin // upper arms
  426.       LUpperArmPoly.vertexCount := 5;
  427.       RUpperArmPoly.vertexCount := 5;
  428.       {$IFDEF OP_OVERLOAD}
  429.       LUpperArmPoly.vertices[0] := k_scale * MakeVector(0.092, 0.059);
  430.       LUpperArmPoly.vertices[1] := k_scale * MakeVector(0.159, 0.059);
  431.       LUpperArmPoly.vertices[2] := k_scale * MakeVector(0.169, 0.335);
  432.       LUpperArmPoly.vertices[3] := k_scale * MakeVector(0.078, 0.335);
  433.       LUpperArmPoly.vertices[4] := k_scale * MakeVector(0.064, 0.248);
  434.       {$ELSE}
  435.       LUpperArmPoly.vertices[0] := Multiply(MakeVector(0.092, 0.059), k_scale);
  436.       LUpperArmPoly.vertices[1] := Multiply(MakeVector(0.159, 0.059), k_scale);
  437.       LUpperArmPoly.vertices[2] := Multiply(MakeVector(0.169, 0.335), k_scale);
  438.       LUpperArmPoly.vertices[3] := Multiply(MakeVector(0.078, 0.335), k_scale);
  439.       LUpperArmPoly.vertices[4] := Multiply(MakeVector(0.064, 0.248), k_scale);
  440.       {$ENDIF}
  441.       RUpperArmPoly.vertices := LUpperArmPoly.vertices;
  442.    end;
  443.    begin // forearms
  444.       LForearmPoly.vertexCount := 4;
  445.       RForearmPoly.vertexCount := 4;
  446.       {$IFDEF OP_OVERLOAD}
  447.       LForearmPoly.vertices[0] := k_scale * MakeVector(0.082, 0.054);
  448.       LForearmPoly.vertices[1] := k_scale * MakeVector(0.138, 0.054);
  449.       LForearmPoly.vertices[2] := k_scale * MakeVector(0.149, 0.296);
  450.       LForearmPoly.vertices[3] := k_scale * MakeVector(0.088, 0.296);
  451.       {$ELSE}
  452.       LForearmPoly.vertices[0] := Multiply(MakeVector(0.082, 0.054), k_scale);
  453.       LForearmPoly.vertices[1] := Multiply(MakeVector(0.138, 0.054), k_scale);
  454.       LForearmPoly.vertices[2] := Multiply(MakeVector(0.149, 0.296), k_scale);
  455.       LForearmPoly.vertices[3] := Multiply(MakeVector(0.088, 0.296), k_scale);
  456.       {$ENDIF}
  457.       RForearmPoly.vertices := LForearmPoly.vertices;
  458.    end;
  459.    begin // hands
  460.       LHandPoly.vertexCount := 5;
  461.       RHandPoly.vertexCount := 5;
  462.       {$IFDEF OP_OVERLOAD}
  463.       LHandPoly.vertices[0] := k_scale * MakeVector(0.066, 0.031);
  464.       LHandPoly.vertices[1] := k_scale * MakeVector(0.123, 0.020);
  465.       LHandPoly.vertices[2] := k_scale * MakeVector(0.160, 0.127);
  466.       LHandPoly.vertices[3] := k_scale * MakeVector(0.127, 0.178);
  467.       LHandPoly.vertices[4] := k_scale * MakeVector(0.074, 0.178);
  468.       {$ELSE}
  469.       LHandPoly.vertices[0] := Multiply(MakeVector(0.066, 0.031), k_scale);
  470.       LHandPoly.vertices[1] := Multiply(MakeVector(0.123, 0.020), k_scale);
  471.       LHandPoly.vertices[2] := Multiply(MakeVector(0.160, 0.127), k_scale);
  472.       LHandPoly.vertices[3] := Multiply(MakeVector(0.127, 0.178), k_scale);
  473.       LHandPoly.vertices[4] := Multiply(MakeVector(0.074, 0.178), k_scale);
  474.       {$ENDIF}
  475.       RHandPoly.vertices := LHandPoly.vertices;
  476.    end;
  477. end;
  478. procedure TBipedDef.DefaultPositions;
  479. begin
  480.    {$IFDEF OP_OVERLOAD}
  481.    LFootDef.position := k_scale * MakeVector(-0.122, -0.901);
  482.    LCalfDef.position := k_scale * MakeVector(-0.177, -0.771);
  483.    LThighDef.position := k_scale * MakeVector(-0.217, -0.391);
  484.    LUpperArmDef.position := k_scale * MakeVector(-0.127, 0.228);
  485.    LForearmDef.position := k_scale * MakeVector(-0.117, -0.011);
  486.    LHandDef.position := k_scale * MakeVector(-0.112, -0.136);
  487.    PelvisDef.position := k_scale * MakeVector(-0.177, -0.101);
  488.    StomachDef.position := k_scale * MakeVector(-0.142, 0.088);
  489.    ChestDef.position := k_scale * MakeVector(-0.132, 0.282);
  490.    NeckDef.position := k_scale * MakeVector(-0.102, 0.518);
  491.    HeadDef.position := k_scale * MakeVector(0.022, 0.738);
  492.    {$ELSE}
  493.    LFootDef.position := Multiply(MakeVector(-0.122, -0.901), k_scale);
  494.    LCalfDef.position := Multiply(MakeVector(-0.177, -0.771), k_scale);
  495.    LThighDef.position := Multiply(MakeVector(-0.217, -0.391), k_scale);
  496.    LUpperArmDef.position := Multiply(MakeVector(-0.127, 0.228), k_scale);
  497.    LForearmDef.position := Multiply(MakeVector(-0.117, -0.011), k_scale);
  498.    LHandDef.position := Multiply(MakeVector(-0.112, -0.136), k_scale);
  499.    PelvisDef.position := Multiply(MakeVector(-0.177, -0.101), k_scale);
  500.    StomachDef.position := Multiply(MakeVector(-0.142, 0.088), k_scale);
  501.    ChestDef.position := Multiply(MakeVector(-0.132, 0.282), k_scale);
  502.    NeckDef.position := Multiply(MakeVector(-0.102, 0.518), k_scale);
  503.    HeadDef.position := Multiply(MakeVector(0.022, 0.738), k_scale);
  504.    {$ENDIF}
  505.    RFootDef.position := LFootDef.position;
  506.    RCalfDef.position := LCalfDef.position;
  507.    RThighDef.position := LThighDef.position;
  508.    RUpperArmDef.position := LUpperArmDef.position;
  509.    RForearmDef.position := LForearmDef.position;
  510.    RHandDef.position := LHandDef.position;
  511. end;
  512. procedure TBipedDef.DefaultJoints;
  513. var
  514.    anchor: TVector2;
  515. begin
  516.    begin // ankles
  517.       {$IFDEF OP_OVERLOAD}
  518.       anchor := k_scale * MakeVector(-0.045, -0.75);
  519.       LAnkleDef.localAnchor1 := anchor - LFootDef.position;
  520.       LAnkleDef.localAnchor2 := anchor - LCalfDef.position;
  521.       {$ELSE}
  522.       anchor := Multiply(MakeVector(-0.045, -0.75), k_scale);
  523.       LAnkleDef.localAnchor1 := Subtract(anchor, LFootDef.position);
  524.       LAnkleDef.localAnchor2 := Subtract(anchor, LCalfDef.position);
  525.       {$ENDIF}
  526.       RAnkleDef.localAnchor1 := LAnkleDef.localAnchor1;
  527.       RAnkleDef.localAnchor2 := LAnkleDef.localAnchor2;
  528.       LAnkleDef.referenceAngle := 0.0;
  529.       RAnkleDef.referenceAngle := 0.0;
  530.       LAnkleDef.lowerAngle := -0.523598776;
  531.       RAnkleDef.lowerAngle := -0.523598776;
  532.       LAnkleDef.upperAngle := 0.523598776;
  533.       RAnkleDef.upperAngle := 0.523598776
  534.    end;
  535.    begin // knees
  536.       {$IFDEF OP_OVERLOAD}
  537.       anchor := k_scale * MakeVector(-0.030, -0.355);
  538.       LKneeDef.localAnchor1 := anchor - LCalfDef.position;
  539.       LKneeDef.localAnchor2 := anchor - LThighDef.position;
  540.       {$ELSE}
  541.       anchor := Multiply(MakeVector(-0.030, -0.355), k_scale);
  542.       LKneeDef.localAnchor1 := Subtract(anchor, LCalfDef.position);
  543.       LKneeDef.localAnchor2 := Subtract(anchor, LThighDef.position);
  544.       {$ENDIF}
  545.       RKneeDef.localAnchor1 := LKneeDef.localAnchor1;
  546.       RKneeDef.localAnchor2 := LKneeDef.localAnchor2;
  547.       LKneeDef.referenceAngle := 0.0;
  548.       RKneeDef.referenceAngle := 0.0;
  549.       LKneeDef.lowerAngle := 0;
  550.       RKneeDef.lowerAngle := 0;
  551.       LKneeDef.upperAngle := 2.61799388;
  552.       RKneeDef.upperAngle := 2.61799388;
  553.    end;
  554.    begin // hips
  555.       {$IFDEF OP_OVERLOAD}
  556.       anchor := k_scale * MakeVector(0.005, -0.045);
  557.       LHipDef.localAnchor1 := anchor - LThighDef.position;
  558.       LHipDef.localAnchor2 := anchor - PelvisDef.position;
  559.       {$ELSE}
  560.       anchor := Multiply(MakeVector(0.005, -0.045), k_scale);
  561.       LHipDef.localAnchor1 := Subtract(anchor, LThighDef.position);
  562.       LHipDef.localAnchor2 := Subtract(anchor, PelvisDef.position);
  563.       {$ENDIF}
  564.       RHipDef.localAnchor1 := LHipDef.localAnchor1;
  565.       RHipDef.localAnchor2 := LHipDef.localAnchor2;
  566.       LHipDef.referenceAngle := 0.0;
  567.       RHipDef.referenceAngle := 0.0;
  568.       LHipDef.lowerAngle := -2.26892803;
  569.       RHipDef.lowerAngle := -2.26892803;
  570.       LHipDef.upperAngle := 0;
  571.       RHipDef.upperAngle := 0;
  572.    end;
  573.    begin // lower abs
  574.       {$IFDEF OP_OVERLOAD}
  575.       anchor := k_scale * MakeVector(0.035, 0.135);
  576.       LowerAbsDef.localAnchor1 := anchor - PelvisDef.position;
  577.       LowerAbsDef.localAnchor2 := anchor - StomachDef.position;
  578.       {$ELSE}
  579.       anchor := Multiply(MakeVector(0.035, 0.135), k_scale);
  580.       LowerAbsDef.localAnchor1 := Subtract(anchor, PelvisDef.position);
  581.       LowerAbsDef.localAnchor2 := Subtract(anchor, StomachDef.position);
  582.       {$ENDIF}
  583.       LowerAbsDef.referenceAngle := 0.0;
  584.       LowerAbsDef.lowerAngle := -0.523598776;
  585.       LowerAbsDef.upperAngle := 0.523598776;
  586.    end;
  587.    begin // upper abs
  588.       {$IFDEF OP_OVERLOAD}
  589.       anchor := k_scale * MakeVector(0.045, 0.320);
  590.       UpperAbsDef.localAnchor1 := anchor - StomachDef.position;
  591.       UpperAbsDef.localAnchor2 := anchor - ChestDef.position;
  592.       {$ELSE}
  593.       anchor := Multiply(MakeVector(0.045, 0.320), k_scale);
  594.       UpperAbsDef.localAnchor1 := Subtract(anchor, StomachDef.position);
  595.       UpperAbsDef.localAnchor2 := Subtract(anchor, ChestDef.position);
  596.       {$ENDIF}
  597.       UpperAbsDef.referenceAngle := 0.0;
  598.       UpperAbsDef.lowerAngle := -0.523598776;
  599.       UpperAbsDef.upperAngle := 0.174532925;
  600.    end;
  601.    begin // lower neck
  602.       {$IFDEF OP_OVERLOAD}
  603.       anchor := k_scale * MakeVector(-0.015, 0.575);
  604.       LowerNeckDef.localAnchor1 := anchor - ChestDef.position;
  605.       LowerNeckDef.localAnchor2 := anchor - NeckDef.position;
  606.       {$ELSE}
  607.       anchor := Multiply(MakeVector(-0.015, 0.575), k_scale);
  608.       LowerNeckDef.localAnchor1 := Subtract(anchor, ChestDef.position);
  609.       LowerNeckDef.localAnchor2 := Subtract(anchor, NeckDef.position);
  610.       {$ENDIF}
  611.       LowerNeckDef.referenceAngle := 0.0;
  612.       LowerNeckDef.lowerAngle := -0.174532925;
  613.       LowerNeckDef.upperAngle := 0.174532925;
  614.    end;
  615.    begin // upper neck
  616.       {$IFDEF OP_OVERLOAD}
  617.       anchor := k_scale * MakeVector(-0.005, 0.630);
  618.       UpperNeckDef.localAnchor1 := anchor - ChestDef.position;
  619.       UpperNeckDef.localAnchor2 := anchor - HeadDef.position;
  620.       {$ELSE}
  621.       anchor := Multiply(MakeVector(-0.005, 0.630), k_scale);
  622.       UpperNeckDef.localAnchor1 := Subtract(anchor, ChestDef.position);
  623.       UpperNeckDef.localAnchor2 := Subtract(anchor, HeadDef.position);
  624.       {$ENDIF}
  625.       UpperNeckDef.referenceAngle := 0.0;
  626.       UpperNeckDef.lowerAngle := -0.610865238;
  627.       UpperNeckDef.upperAngle := 0.785398163;
  628.    end;
  629.    begin // shoulders
  630.       {$IFDEF OP_OVERLOAD}
  631.       anchor := k_scale * MakeVector(-0.015, 0.545);
  632.       LShoulderDef.localAnchor1 := anchor - ChestDef.position;
  633.       LShoulderDef.localAnchor2 := anchor - LUpperArmDef.position;
  634.       {$ELSE}
  635.       anchor := Multiply(MakeVector(-0.015, 0.545), k_scale);
  636.       LShoulderDef.localAnchor1 := Subtract(anchor, ChestDef.position);
  637.       LShoulderDef.localAnchor2 := Subtract(anchor, LUpperArmDef.position);
  638.       {$ENDIF}
  639.       RShoulderDef.localAnchor1 := LShoulderDef.localAnchor1;
  640.       RShoulderDef.localAnchor2 := LShoulderDef.localAnchor2;
  641.       LShoulderDef.referenceAngle := 0.0;
  642.       RShoulderDef.referenceAngle := 0.0;
  643.       LShoulderDef.lowerAngle := -1.04719755;
  644.       RShoulderDef.lowerAngle := -1.04719755;
  645.       LShoulderDef.upperAngle := 3.14159265;
  646.       RShoulderDef.upperAngle := 3.14159265;
  647.    end;
  648.    begin // elbows
  649.       {$IFDEF OP_OVERLOAD}
  650.       anchor := k_scale * MakeVector(-0.005, 0.290);
  651.       LElbowDef.localAnchor1 := anchor - LForearmDef.position;
  652.       LElbowDef.localAnchor2 := anchor - LUpperArmDef.position;
  653.       {$ELSE}
  654.       anchor := Multiply(MakeVector(-0.005, 0.290), k_scale);
  655.       LElbowDef.localAnchor1 := Subtract(anchor, LForearmDef.position);
  656.       LElbowDef.localAnchor2 := Subtract(anchor, LUpperArmDef.position);
  657.       {$ENDIF}
  658.       RElbowDef.localAnchor1 := LElbowDef.localAnchor1;
  659.       RElbowDef.localAnchor2 := LElbowDef.localAnchor2;
  660.       LElbowDef.referenceAngle := 0.0;
  661.       RElbowDef.referenceAngle := 0.0;
  662.       LElbowDef.lowerAngle := -2.7925268;
  663.       RElbowDef.lowerAngle := -2.7925268;
  664.       LElbowDef.upperAngle := 0;
  665.       RElbowDef.upperAngle := 0;
  666.    end;
  667.    begin // wrists
  668.       {$IFDEF OP_OVERLOAD}
  669.       anchor := k_scale * MakeVector(-0.010, 0.045);
  670.       LWristDef.localAnchor1 := anchor - LHandDef.position;
  671.       LWristDef.localAnchor2 := anchor - LForearmDef.position;
  672.       {$ELSE}
  673.       anchor := Multiply(MakeVector(-0.010, 0.045), k_scale);
  674.       LWristDef.localAnchor1 := Subtract(anchor, LHandDef.position);
  675.       LWristDef.localAnchor2 := Subtract(anchor, LForearmDef.position);
  676.       {$ENDIF}
  677.       RWristDef.localAnchor1 := LWristDef.localAnchor1;
  678.       RWristDef.localAnchor2 := LWristDef.localAnchor2;
  679.       LWristDef.referenceAngle := 0.0;
  680.       RWristDef.referenceAngle := 0.0;
  681.       LWristDef.lowerAngle := -0.174532925;
  682.       RWristDef.lowerAngle := -0.174532925;
  683.       LWristDef.upperAngle := 0.174532925;
  684.       RWristDef.upperAngle := 0.174532925;
  685.    end;
  686. end;
  687. { TBiped }
  688. constructor TBiped.Create(world: Tb2World; const position: TVector2);
  689. var
  690.    def: TBipedDef;
  691.    bd: Tb2BodyDef;
  692. begin
  693.    m_world := world;
  694.    def := TBipedDef.Create;
  695.    // create body parts
  696.    bd := def.LFootDef;
  697.    {$IFDEF OP_OVERLOAD}
  698.    bd.position.AddBy(position);
  699.    {$ELSE}
  700.    AddBy(bd.position, position);
  701.    {$ENDIF}
  702.    LFoot := world.CreateBody(bd, False);
  703.    LFoot.CreateShape(def.LFootPoly, False);
  704.    LFoot.SetMassFromShapes;
  705.    bd := def.RFootDef;
  706.    {$IFDEF OP_OVERLOAD}
  707.    bd.position.AddBy(position);
  708.    {$ELSE}
  709.    AddBy(bd.position, position);
  710.    {$ENDIF}
  711.    RFoot := world.CreateBody(bd, False);
  712.    RFoot.CreateShape(def.RFootPoly, False);
  713.    RFoot.SetMassFromShapes;
  714.    bd := def.LCalfDef;
  715.    {$IFDEF OP_OVERLOAD}
  716.    bd.position.AddBy(position);
  717.    {$ELSE}
  718.    AddBy(bd.position, position);
  719.    {$ENDIF}
  720.    LCalf := world.CreateBody(bd, False);
  721.    LCalf.CreateShape(def.LCalfPoly, False);
  722.    LCalf.SetMassFromShapes;
  723.    bd := def.RCalfDef;
  724.    {$IFDEF OP_OVERLOAD}
  725.    bd.position.AddBy(position);
  726.    {$ELSE}
  727.    AddBy(bd.position, position);
  728.    {$ENDIF}
  729.    RCalf := world.CreateBody(bd, False);
  730.    RCalf.CreateShape(def.RCalfPoly, False);
  731.    RCalf.SetMassFromShapes;
  732.    bd := def.LThighDef;
  733.    {$IFDEF OP_OVERLOAD}
  734.    bd.position.AddBy(position);
  735.    {$ELSE}
  736.    AddBy(bd.position, position);
  737.    {$ENDIF}
  738.    LThigh := world.CreateBody(bd, False);
  739.    LThigh.CreateShape(def.LThighPoly, False);
  740.    LThigh.SetMassFromShapes;
  741.    bd := def.RThighDef;
  742.    {$IFDEF OP_OVERLOAD}
  743.    bd.position.AddBy(position);
  744.    {$ELSE}
  745.    AddBy(bd.position, position);
  746.    {$ENDIF}
  747.    RThigh := world.CreateBody(bd, False);
  748.    RThigh.CreateShape(def.RThighPoly, False);
  749.    RThigh.SetMassFromShapes;
  750.    bd := def.PelvisDef;
  751.    {$IFDEF OP_OVERLOAD}
  752.    bd.position.AddBy(position);
  753.    {$ELSE}
  754.    AddBy(bd.position, position);
  755.    {$ENDIF}
  756.    Pelvis := world.CreateBody(bd, False);
  757.    Pelvis.CreateShape(def.PelvisPoly, False);
  758.    Pelvis.SetMassFromShapes;
  759.    bd := def.StomachDef;
  760.    {$IFDEF OP_OVERLOAD}
  761.    bd.position.AddBy(position);
  762.    {$ELSE}
  763.    AddBy(bd.position, position);
  764.    {$ENDIF}
  765.    Stomach := world.CreateBody(bd, False);
  766.    Stomach.CreateShape(def.StomachPoly, False);
  767.    Stomach.SetMassFromShapes;
  768.    bd := def.ChestDef;
  769.    {$IFDEF OP_OVERLOAD}
  770.    bd.position.AddBy(position);
  771.    {$ELSE}
  772.    AddBy(bd.position, position);
  773.    {$ENDIF}
  774.    Chest := world.CreateBody(bd, False);
  775.    Chest.CreateShape(def.ChestPoly, False);
  776.    Chest.SetMassFromShapes;
  777.    bd := def.NeckDef;
  778.    {$IFDEF OP_OVERLOAD}
  779.    bd.position.AddBy(position);
  780.    {$ELSE}
  781.    AddBy(bd.position, position);
  782.    {$ENDIF}
  783.    Neck := world.CreateBody(bd, False);
  784.    Neck.CreateShape(def.NeckPoly, False);
  785.    Neck.SetMassFromShapes;
  786.    bd := def.HeadDef;
  787.    {$IFDEF OP_OVERLOAD}
  788.    bd.position.AddBy(position);
  789.    {$ELSE}
  790.    AddBy(bd.position, position);
  791.    {$ENDIF}
  792.    Head := world.CreateBody(bd, False);
  793.    Head.CreateShape(def.HeadCircle, False);
  794.    Head.SetMassFromShapes;
  795.    bd := def.LUpperArmDef;
  796.    {$IFDEF OP_OVERLOAD}
  797.    bd.position.AddBy(position);
  798.    {$ELSE}
  799.    AddBy(bd.position, position);
  800.    {$ENDIF}
  801.    LUpperArm := world.CreateBody(bd, False);
  802.    LUpperArm.CreateShape(def.LUpperArmPoly, False);
  803.    LUpperArm.SetMassFromShapes;
  804.    bd := def.RUpperArmDef;
  805.    {$IFDEF OP_OVERLOAD}
  806.    bd.position.AddBy(position);
  807.    {$ELSE}
  808.    AddBy(bd.position, position);
  809.    {$ENDIF}
  810.    RUpperArm := world.CreateBody(bd, False);
  811.    RUpperArm.CreateShape(def.RUpperArmPoly, False);
  812.    RUpperArm.SetMassFromShapes;
  813.    bd := def.LForearmDef;
  814.    {$IFDEF OP_OVERLOAD}
  815.    bd.position.AddBy(position);
  816.    {$ELSE}
  817.    AddBy(bd.position, position);
  818.    {$ENDIF}
  819.    LForearm := world.CreateBody(bd, False);
  820.    LForearm.CreateShape(def.LForearmPoly, False);
  821.    LForearm.SetMassFromShapes;
  822.    bd := def.RForearmDef;
  823.    {$IFDEF OP_OVERLOAD}
  824.    bd.position.AddBy(position);
  825.    {$ELSE}
  826.    AddBy(bd.position, position);
  827.    {$ENDIF}
  828.    RForearm := world.CreateBody(bd, False);
  829.    RForearm.CreateShape(def.RForearmPoly, False);
  830.    RForearm.SetMassFromShapes;
  831.    bd := def.LHandDef;
  832.    {$IFDEF OP_OVERLOAD}
  833.    bd.position.AddBy(position);
  834.    {$ELSE}
  835.    AddBy(bd.position, position);
  836.    {$ENDIF}
  837.    LHand := world.CreateBody(bd, False);
  838.    LHand.CreateShape(def.LHandPoly, False);
  839.    LHand.SetMassFromShapes;
  840.    bd := def.RHandDef;
  841.    {$IFDEF OP_OVERLOAD}
  842.    bd.position.AddBy(position);
  843.    {$ELSE}
  844.    AddBy(bd.position, position);
  845.    {$ENDIF}
  846.    RHand := world.CreateBody(bd, False);
  847.    RHand.CreateShape(def.RHandPoly, False);
  848.    RHand.SetMassFromShapes;
  849.    // link body parts
  850.    def.LAnkleDef.body1 := LFoot;
  851.    def.LAnkleDef.body2 := LCalf;
  852.    def.RAnkleDef.body1 := RFoot;
  853.    def.RAnkleDef.body2 := RCalf;
  854.    def.LKneeDef.body1 := LCalf;
  855.    def.LKneeDef.body2 := LThigh;
  856.    def.RKneeDef.body1 := RCalf;
  857.    def.RKneeDef.body2 := RThigh;
  858.    def.LHipDef.body1 := LThigh;
  859.    def.LHipDef.body2 := Pelvis;
  860.    def.RHipDef.body1 := RThigh;
  861.    def.RHipDef.body2 := Pelvis;
  862.    def.LowerAbsDef.body1 := Pelvis;
  863.    def.LowerAbsDef.body2 := Stomach;
  864.    def.UpperAbsDef.body1 := Stomach;
  865.    def.UpperAbsDef.body2 := Chest;
  866.    def.LowerNeckDef.body1 := Chest;
  867.    def.LowerNeckDef.body2 := Neck;
  868.    def.UpperNeckDef.body1 := Chest;
  869.    def.UpperNeckDef.body2 := Head;
  870.    def.LShoulderDef.body1 := Chest;
  871.    def.LShoulderDef.body2 := LUpperArm;
  872.    def.RShoulderDef.body1 := Chest;
  873.    def.RShoulderDef.body2 := RUpperArm;
  874.    def.LElbowDef.body1 := LForearm;
  875.    def.LElbowDef.body2 := LUpperArm;
  876.    def.RElbowDef.body1 := RForearm;
  877.    def.RElbowDef.body2 := RUpperArm;
  878.    def.LWristDef.body1 := LHand;
  879.    def.LWristDef.body2 := LForearm;
  880.    def.RWristDef.body1 := RHand;
  881.    def.RWristDef.body2 := RForearm;
  882.    // create joints
  883.    LAnkle := Tb2RevoluteJoint(world.CreateJoint(def.LAnkleDef, False));
  884.    RAnkle := Tb2RevoluteJoint(world.CreateJoint(def.RAnkleDef, False));
  885.    LKnee := Tb2RevoluteJoint(world.CreateJoint(def.LKneeDef, False));
  886.    RKnee := Tb2RevoluteJoint(world.CreateJoint(def.RKneeDef, False));
  887.    LHip := Tb2RevoluteJoint(world.CreateJoint(def.LHipDef, False));
  888.    RHip := Tb2RevoluteJoint(world.CreateJoint(def.RHipDef, False));
  889.    LowerAbs := Tb2RevoluteJoint(world.CreateJoint(def.LowerAbsDef, False));
  890.    UpperAbs := Tb2RevoluteJoint(world.CreateJoint(def.UpperAbsDef, False));
  891.    LowerNeck := Tb2RevoluteJoint(world.CreateJoint(def.LowerNeckDef, False));
  892.    UpperNeck := Tb2RevoluteJoint(world.CreateJoint(def.UpperNeckDef, False));
  893.    LShoulder := Tb2RevoluteJoint(world.CreateJoint(def.LShoulderDef, False));
  894.    RShoulder := Tb2RevoluteJoint(world.CreateJoint(def.RShoulderDef, False));
  895.    LElbow := Tb2RevoluteJoint(world.CreateJoint(def.LElbowDef, False));
  896.    RElbow := Tb2RevoluteJoint(world.CreateJoint(def.RElbowDef, False));
  897.    LWrist := Tb2RevoluteJoint(world.CreateJoint(def.LWristDef, False));
  898.    RWrist := Tb2RevoluteJoint(world.CreateJoint(def.RWristDef, False));
  899.    def.Free;
  900. end;
  901. destructor TBiped.Destroy;
  902. begin
  903.    with m_world do
  904.    begin
  905.       DestroyBody(LFoot);
  906.       DestroyBody(RFoot);
  907.       DestroyBody(LCalf);
  908.       DestroyBody(RCalf);
  909.       DestroyBody(LThigh);
  910.       DestroyBody(RThigh);
  911.       DestroyBody(Pelvis);
  912.       DestroyBody(Stomach);
  913.       DestroyBody(Chest);
  914.       DestroyBody(Neck);
  915.       DestroyBody(Head);
  916.       DestroyBody(LUpperArm);
  917.       DestroyBody(RUpperArm);
  918.       DestroyBody(LForearm);
  919.       DestroyBody(RForearm);
  920.       DestroyBody(LHand);
  921.       DestroyBody(RHand);
  922.    end;
  923.    inherited;
  924. end;
  925. { TBipedTest1 }
  926. constructor TBipedTest1.Create;
  927. const
  928.    k_restitution = 1.4;
  929. var
  930.    i: Integer;
  931.    bd: Tb2BodyDef;
  932.    body: Tb2Body;
  933.    sd: Tb2PolygonDef;
  934.    cd: Tb2CircleDef;
  935. begin
  936.    inherited;
  937.    begin
  938.       bd := Tb2BodyDef.Create;
  939.       {$IFDEF OP_OVERLOAD}
  940.       bd.position.SetValue(0.0, 20.0);
  941.       {$ELSE}
  942.       SetValue(bd.position, 0.0, 20.0);
  943.       {$ENDIF}
  944.       body := m_world.CreateBody(bd);
  945.       sd := Tb2PolygonDef.Create;
  946.       sd.density := 0.0;
  947.       sd.restitution := k_restitution;
  948.       sd.SetAsBox(0.1, 10.0, MakeVector(-10.0, 0.0), 0.0);
  949.       body.CreateShape(sd, False);
  950.       sd.SetAsBox(0.1, 10.0, MakeVector(10.0, 0.0), 0.0);
  951.       body.CreateShape(sd, False);
  952.       sd.SetAsBox(0.1, 10.0, MakeVector(0.0, -10.0), 0.5 * Pi);
  953.       body.CreateShape(sd, False);
  954.       sd.SetAsBox(0.1, 10.0, MakeVector(0.0, 10.0), -0.5 * Pi);
  955.       body.CreateShape(sd);
  956.    end;
  957.    m_biped := TBiped.Create(m_world, MakeVector(0.0, 20.0));
  958.    bd := Tb2BodyDef.Create;
  959.    bd.isBullet := True;
  960.    cd := Tb2CircleDef.Create;
  961.    cd.radius := 0.25;
  962.    cd.density := 15.0;
  963.    cd.restitution := k_restitution;
  964.    sd := Tb2PolygonDef.Create;
  965.    sd.SetAsBox(0.25, 0.25);
  966.    sd.density := 15.0;
  967.    sd.restitution := k_restitution;
  968.    for i := 0 to 7 do
  969.    begin
  970.       {$IFDEF OP_OVERLOAD}
  971.       bd.position.SetValue(5.0, 20.0 + i);
  972.       {$ELSE}
  973.       SetValue(bd.position, 5.0, 20.0 + i);
  974.       {$ENDIF}
  975.       body := m_world.CreateBody(bd, False);
  976.       body.SetLinearVelocity(MakeVector(0.0, -100.0));
  977.       body.SetAngularVelocity(RandomRange(-50, 50));
  978.       body.CreateShape(sd, False);
  979.       body.SetMassFromShapes;
  980.    end;
  981.    bd.Free;
  982.    cd.Free;
  983.    sd.Free;
  984. end;
  985. destructor TBipedTest1.Destroy;
  986. begin
  987.    m_biped.Free;
  988.    inherited;
  989. end;
  990. { TBipedTest2 }
  991. constructor TBipedTest2.Create;
  992. var
  993.    i: Integer;
  994.    pd: Tb2PolygonDef;
  995.    bd: Tb2BodyDef;
  996. begin
  997.    inherited;
  998.    pd := Tb2PolygonDef.Create;
  999.    bd := Tb2BodyDef.Create;
  1000.    for i := 0 to 8 do
  1001.    begin
  1002.       pd.SetAsBox(1, 1, MakeVector(-4 + i, 4 - i), 0);
  1003.       pd.friction := 0.2;
  1004.       {$IFDEF OP_OVERLOAD}
  1005.       bd.position.SetValue(-4 + i, 4 - i);
  1006.       {$ELSE}
  1007.       SetValue(bd.position, -4 + i, 4 - i);
  1008.       {$ENDIF}
  1009.       m_world.CreateBody(bd, False).CreateShape(pd, False);
  1010.    end;
  1011.    pd.SetAsBox(30, 0.5, MakeVector(0, -5), 0);
  1012.    pd.friction := 0.2;
  1013.    {$IFDEF OP_OVERLOAD}
  1014.    bd.position.SetValue(0, -5);
  1015.    {$ELSE}
  1016.    SetValue(bd.position, 0, -5);
  1017.    {$ENDIF}
  1018.    m_world.CreateBody(bd).CreateShape(pd);
  1019.    m_biped := TBiped.Create(m_world, MakeVector(-3.5, 10.0));
  1020. end;
  1021. destructor TBipedTest2.Destroy;
  1022. begin
  1023.    m_biped.Free;
  1024.    inherited;
  1025. end;
  1026. initialization
  1027.    Biped_count := 0;
  1028.    RegisterTestEntry('Biped1', TBipedTest1);
  1029.    RegisterTestEntry('Biped2', TBipedTest2);
  1030. end.