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

📄 oxnewtondynamicmesh.pas

📁 Newton Game Dynamic 1.52 Delphi下基于GLScene的OpenGL游戏开发控件。功能非常强大和易于使用。 Advanced physics engine for re
💻 PAS
📖 第 1 页 / 共 3 页
字号:
procedure TOXNewtonDynMesh.SetConcretX( const val: Float );
begin
  FConcretX:= val;
  SetMassValues;
end;
// SetConcretY                                                                //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetConcretY( const val: Float );
begin
  FConcretY:= val;
  SetMassValues;
end;
// SetConcretZ                                                                //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetConcretZ( const val: Float );
begin
  FConcretZ:= val;
  SetMassValues;
end;
// SetInertiaX                                                                //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetInertiaX( const val: Float );
begin
  FInertiaX:= val;
  SetMassValues;
end;
// SetInertiaY                                                                //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetInertiaY( const val: Float );
begin
  FInertiaY:= val;
  SetMassValues;
end;
// SetInertiaZ                                                                //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetInertiaZ( const val: Float );
begin
  FInertiaZ:= val;
  SetMassValues;
end;
// SetOriginX                                                                 //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetOriginX( const val: Float );
begin
  FOriginX:= val;
  SetMassValues;
end;
// SetOriginY                                                                 //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetOriginY( const val: Float );
begin
  FOriginY:= val;
  SetMassValues;
end;
// SetOriginZ                                                                 //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetOriginZ( const val: Float );
begin
  FOriginZ:= val;
  SetMassValues;
end;
// SetAngularDampingX                                                         //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetAngularDampingX( const val: Float );
var DamVec: TOXVector3;
begin
  FAngularDampingX:= val;
  DamVec:= oxV3Make( FAngularDampingX, FAngularDampingY, FAngularDampingZ );
  if FActived then
    NewtonBodySetAngularDamping( FBody, @DamVec[0] );
end;
// SetAngularDampingY                                                         //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetAngularDampingY( const val: Float );
var DamVec: TOXVector3;
begin
  FAngularDampingY:= val;
  DamVec:= oxV3Make( FAngularDampingX, FAngularDampingY, FAngularDampingZ );
  if FActived then
    NewtonBodySetAngularDamping( FBody, @DamVec[0] );
end;
// SetAngularDampingZ                                                         //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetAngularDampingZ( const val: Float );
var DamVec: TOXVector3;
begin
  FAngularDampingZ:= val;
  DamVec:= oxV3Make( FAngularDampingX, FAngularDampingY, FAngularDampingZ );
  if FActived then
    NewtonBodySetAngularDamping( FBody, @DamVec[0] );
end;
// InitNewton                                                                 //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.InitNewton;
var
  mTriangles: TAffineVectorList;
  vArray: array of TOXVector3;
  i: integer;
begin
  FManager:= TOXNewtonManager(Scene);
  if FActived or ( FManager = nil ) then Exit;
  if ( FPathFile <> '' ) then begin
    SetCurrentDir(FPathFile);
    LoadFromFile(FPathFile);
    SetCurrentDir(ExtractFilePath(Application.ExeName));
  end;
  mTriangles:= MeshObjects.ExtractTriangles;
  mTriangles.Scale( Scale.AsAffineVector );
  SetLength( vArray, mTriangles.Count );
  for i:= 0 to mTriangles.Count -1 do vArray[i]:= oxV3FToV3D( mTriangles.List[i] );
  FCollision:= NewtonCreateConvexHull( FManager.World, mTriangles.Count,
  @vArray[0], SizeOf( TOXVector3 ), nil );
  mTriangles.Free;
  SetLength( vArray, 0 );
  oxDynMeshConvexHull( self );
  FBody:= NewtonCreateBody( FManager.World, FCollision );
  NewtonBodySetUserData( FBody, Self );
  oxPSetInitTransform( FBody, Self );
  if FContinuousCollisionMode then
    NewtonBodySetContinuousCollisionMode( FBody, 1 ) else
    NewtonBodySetContinuousCollisionMode( FBody, 0 );
  if FManager.WorldMatrialCustom then begin
    FContactID:= FManager.WorldDefaultMaterialID;
    oxSetObjectMaterial( FBody );
  end;
  if Assigned( FOnCustomMass ) then
    FOnCustomMass( FMass, FOriginX, FOriginY, FOriginZ, FInertiaX, FInertiaY, FInertiaZ )
  else
    oxMeshSetMass( FBody, FMass, FInertiaX, FInertiaY, FInertiaZ,
                                 FOriginX, FOriginY, FOriginZ,
                                 FConcretX, FConcretY, FConcretZ );
  NewtonBodySetTransformCallback( FBody, @oxPSetTransform );
  NewtonBodySetForceAndTorqueCallBack( FBody, @oxObjectPhysicsApplyForceAndTorque );
  if FAutoFreeze then begin
    NewtonBodySetAutoFreeze( FBody, 1 );
  end else begin
    NewtonBodySetAutoFreeze( FBody, 0 );
    NewtonWorldUnfreezeBody( FManager.World, FBody );
  end;
  NewtonReleaseCollision( FManager.World, FCollision );
  NewtonBodySetFreezeTreshold( FBody, FFreezeSpeedMag2, FFreezeOmegaMag2, FFreezeFramesCount );
  FManager.AddLog( 'Dynamic Mesh Name: '+Name, 1, ':Info Object' );
  FManager.AddLog(  Name + ' InitNewton.', 1, ':Info Object' );
  FActived:= True;
  SetLinearDamping( FLinearDamping );
  SetAngularDampingX( FAngularDampingX );
  SetAngularDampingY( FAngularDampingY );
  SetAngularDampingZ( FAngularDampingZ );
end;
// SetMass                                                                    //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.SetMass( const val: Float );
begin
  if ( val <> FMass ) then
    FMass:= val;
  if FActived then if Assigned( FOnCustomMass ) then
    FOnCustomMass( FMass, FOriginX, FOriginY, FOriginZ,
                          FInertiaX, FInertiaY, FInertiaZ )
  else
  oxMeshSetMass( FBody, FMass, FInertiaX, FInertiaY, FInertiaZ,
                               FOriginX, FOriginY, FOriginZ,
                               FConcretX, FConcretY, FConcretZ );
end;
// DoProgress                                                                 //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
procedure TOXNewtonDynMesh.DoProgress( const progressTime: TProgressTimes );
begin
  inherited;
  if FActived then begin
    if Assigned( FOnStepRender ) then
      FOnStepRender( progressTime.deltaTime, progressTime.newTime );
  end;
end;
// Destroy                                                                    //
{******************************************************************************}
// [15-9-2007]: TOXNewtonDynMesh last change by Dave Gravel.                 //
{******************************************************************************}
destructor TOXNewtonDynMesh.Destroy;
begin
  if FActived and assigned( FBody ) then begin
    if ( not ( csDesigning in ComponentState ) ) then
      if Name = '' then FManager.AddLog( ClassName + ' destroyed.', 1, ':Info Object' )
      else FManager.AddLog( Name + ' destroyed.', 1, ':Info Object' );
    FActived:= False;
    NewtonBodySetTransformCallback( FBody, nil );
    NewtonBodySetForceAndTorqueCallBack( FBody, nil );
    NewtonDestroyBody( FManager.World, FBody );
  end;
  inherited destroy;
end;
// TOXNewtonManager                                                           //
{******************************************************************************}
{$D '[15-9-2007]: TOXNewtonManager v1.55 by Dave Gravel under MPL-1.1 license.'}
{******************************************************************************}
initialization
  RegisterClasses( [ TOXNewtonDynMesh ] );
end.

⌨️ 快捷键说明

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