📄 oxnewtonbonesragdoll.pas
字号:
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 + -