⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 oxnewtonbonesragdoll.pas

📁 Newton Game Dynamic 1.52 Delphi下基于GLScene的OpenGL游戏开发控件。功能非常强大和易于使用。 Advanced physics engine for re
💻 PAS
📖 第 1 页 / 共 3 页
字号:
  public
    constructor Create( AOwner: TGLBaseMesh );
    property BodyList: TList read FBodyList write FBodyList;
    property GLSceneRoot: TGLBaseSceneObject read FGLSceneRoot write FGLSceneRoot;
  end;
{******************************************************************************}
// [15-9-2007]: TSkinBone last change by Dave Gravel.                        //
{******************************************************************************}
  TSkinBone = class(TOXNewtonBone)
    private
      FBone: TNewtonRagdollBone;
    public
      property Bone: TNewtonRagdollBone read FBone write FBone;
  end;
{******************************************************************************}
// [15-9-2007]: TOXOnStartRagdoll TOXOnStopRagdoll last change by Dave Gravel.//
{******************************************************************************}
type
  TOXOnStartRagdoll = procedure( Ragdoll: TNewtonRagdoll; DummyRagdoll: TGLDummyCube; DummyRoot: TNewtonRagdollDummyJoint ) of object;
  TOXOnStopRagdoll = procedure of object;
implementation
uses oxNewtonSmdRagdoll;
{******************************************************************************}
// [15-9-2007]: TRagdollBoneList last change by Dave Gravel.                 //
{******************************************************************************}
constructor TRagdollBoneList.Create( Ragdoll: TOXRagdoll );
begin
  inherited Create;
  FRagdoll:= Ragdoll;
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBoneList last change by Dave Gravel.                 //
{******************************************************************************}
destructor TRagdollBoneList.Destroy;
var i: integer;
begin
  for i:= 0 to Count-1 do Items[i].Free;
  inherited Destroy;
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBoneList last change by Dave Gravel.                 //
{******************************************************************************}
function TRagdollBoneList.GetRagdollBone( Index: Integer ): TRagdollBone;
begin
  Result:= TRagdollBone( List^[Index] );
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
constructor TRagdollBone.Create( Ragdoll: TOXRagdoll );
begin
  inherited Create( Ragdoll );
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
procedure TRagdollBone.CreateBoundingBox;
var
  bone: TSkeletonBone;
  i, j: integer;
  BoneVertices: TAffineVectorList;
  BoneVertex, max, min: TOXVector3;
  invMat, mat: TOXMatrix;
begin
  bone:= Ragdoll.Owner.Skeleton.BoneByID( FBoneID );
  BoneVertices:= TAffineVectorList.Create;
  for i:= 0 to Ragdoll.Owner.MeshObjects.Count -1 do
  with TSkeletonMeshObject( Ragdoll.Owner.MeshObjects[i] ) do
    for j:= 0 to Vertices.Count-1 do
      if ( bone.BoneID = VerticesBonesWeights[j][0].BoneID ) then
        BoneVertices.FindOrAdd( Vertices[j] );
  invMat:= oxMFToMD( bone.GlobalMatrix );
  oxInvertM( invMat );
  if BoneVertices.Count > 0 then begin
    BoneVertex:= oxVTransform( oxV3FToV3D( BoneVertices[0] ), invMat );
    max:= BoneVertex;
    min:= BoneVertex;
    for i:=1 to BoneVertices.Count-1 do begin
      BoneVertex:= oxVTransform( oxV3FToV3D( BoneVertices[i] ), invMat );
      if ( BoneVertex[0] > max[0] ) then max[0]:= BoneVertex[0];
      if ( BoneVertex[1] > max[1] ) then max[1]:= BoneVertex[1];
      if ( BoneVertex[2] > max[2] ) then max[2]:= BoneVertex[2];
      if ( BoneVertex[0] < min[0] ) then min[0]:= BoneVertex[0];
      if ( BoneVertex[1] < min[1] ) then min[1]:= BoneVertex[1];
      if ( BoneVertex[2] < min[2] ) then min[2]:= BoneVertex[2];
    end;
    FBoundMax:= max;
    FBoundMin:= min;
    FBoundBoneDelta := oxVScale( oxVAdd( FBoundMax, FBoundMin ), 0.5 );
  end else begin
    FBoundMax:= oxNullV3;
    FBoundMin:= oxNullV3;
  end;
  AlignToSkeleton;
  FReferenceMatrix:= FBoneMatrix;
  mat:= oxMMultiply( oxMFToMD( bone.GlobalMatrix ), oxMFToMD( FRagdoll.Owner.AbsoluteMatrix ) );
  SetAnchor( oxV3Make( mat[3] ) );
  BoneVertices.Free;
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
constructor TRagdollBone.CreateOwned( aOwner: TRagdollBoneList );
begin
  Create( aOwner.Ragdoll );
  FOwner:= aOwner;
  aOwner.Add( Self );
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
destructor TRagdollBone.Destroy;
begin
  inherited Destroy;
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
procedure TRagdollBone.AlignToSkeleton;
var
  Vo: TOXVector3;
  bone: TSkeletonBone;
  mat, posMat: TOXMatrix;
  noBounds: Boolean;
begin
  bone:= Ragdoll.Owner.Skeleton.BoneByID( FBoneID );
  noBounds:= oxVIsNull( FBoundMax ) and oxVIsNull( FBoundMin );
  mat:= oxMMultiply( oxMFToMD( bone.GlobalMatrix ), oxMFToMD( FRagdoll.Owner.AbsoluteMatrix ) );
  FBoneMatrix:= mat;
  oxNormalizeM( FBoneMatrix );
  if ( noBounds ) then begin
    FOrigin:= oxV3Make( mat[3] );
    FSize:= oxV3Make( 0.1, 0.1, 0.1 );
  end else begin
    posMat:= mat;
    posMat[3]:= oxNullV4;
    Vo:= oxVTransform( FBoundBoneDelta, posMat );
    FOrigin:= oxVAdd( oxV3Make( mat[3] ), Vo );
    FSize:= oxVScale(oxVSubtract( FBoundMax, FBoundMin ), 0.75 );
    FSize[0]:= FSize[0] * oxVLength( mat[0] );
    FSize[1]:= FSize[1] * oxVLength( mat[1] );
    FSize[2]:= FSize[2] * oxVLength( mat[2] );
  end;
  FBoneMatrix[3]:= oxV4Make( FOrigin, 1 );
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
function TRagdollBone.GetRagdollBone( Index: Integer ): TRagdollBone;
begin
  Result:= TRagdollBone( List^[Index] );
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
procedure TRagdollBone.StartChild;
var i: integer;
begin
  FOriginalMatrix:= oxMFToMD( Ragdoll.Owner.Skeleton.BoneByID( FBoneID ).GlobalMatrix );
  AlignToSkeleton;
  Start;
  for i:= 0 to Count-1 do items[i].StartChild;
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
procedure TRagdollBone.UpdateChild;
var i: integer;
begin
  Update;
  for i:= 0 to Count-1 do items[i].UpdateChild;
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
procedure TRagdollBone.StopChild;
var i: integer;
begin
  Stop;
  Ragdoll.Owner.Skeleton.BoneByID( FBoneID ).SetGlobalMatrix( oxMDToMF( FOriginalMatrix ) );
  for i:= 0 to Count-1 do items[i].StopChild;
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
procedure TRagdollBone.CreateBoundsChild;
var i: integer;
begin
  CreateBoundingBox;
  for i:= 0 to Count-1 do items[i].CreateBoundsChild;
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
procedure TRagdollBone.SetAnchor( Anchor: TOXVector3 );
begin
  FAnchor:= Anchor;
end;
{******************************************************************************}
// [15-9-2007]: TRagdollBone last change by Dave Gravel.                     //
{******************************************************************************}
procedure TRagdollBone.AlignChild;
var i: integer;
begin
  Align;
  Update;
  for i:= 0 to Count-1 do items[i].AlignChild;
end;
{******************************************************************************}
// [15-9-2007]: TOXRagdoll last change by Dave Gravel.                       //
{******************************************************************************}
constructor TOXRagdoll.Create( AOwner : TGLBaseMesh );
begin
  FOwner:= AOwner;
  FEnabled:= False;
  FBuilt:= False;
end;
{******************************************************************************}
// [15-9-2007]: TOXRagdoll last change by Dave Gravel.                       //
{******************************************************************************}
destructor TOXRagdoll.Destroy;
begin
  if FEnabled then Stop;
  inherited Destroy;
end;
{******************************************************************************}
// [15-9-2007]: TOXRagdoll last change by Dave Gravel.                       //
{******************************************************************************}
procedure TOXRagdoll.SetRootBone( RootBone: TRagdollBone );
begin
  FRootBone:= RootBone;
end;
{******************************************************************************}

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -