📄 oxnewtonvehicle4wheels.pas
字号:
inherited Create( AOwner );
StreamList:= TStringList.create;
StreamList.Sorted:= true;
end;
destructor TOXVehicleStreams.Destroy;
begin
ClearStreams;
StreamList.free;
inherited Destroy;
end;
procedure TOXVehicleStreams.GetStream( const ID: string; Dest: TStream );
var i: integer;
begin
if ( length( id ) > 0 ) then begin
i:= Streamlist.IndexOf( ID );
if i >= 0 then
dest.CopyFrom( TMemoryStream( Streamlist.objects[i] ), 0 );
dest.Position:= 0;
end;
end;
procedure TOXVehicleStreams.LoadFromFile( const Filename: string );
var fs: TFileStream;
begin
Fs:=TFileStream.Create( FileName, fmOpenRead );
try
LoadFromStream( fs );
finally
FS.free;
end;
end;
Procedure TOXVehicleStreams.FoundCorrupt;
begin
if assigned( FOnCorrupt ) then FOnCorrupt( Self );
raise ECorruptFile.Create( 'File is corrupt.' );
end;
function TOXVehicleStreams.CheckGood( ms : TStream ): boolean;
var
GoodTest: TGoodBytes; a: integer;
begin
ms.Position:= 0;
ms.read( GoodTest, sizeof( TGoodBytes ) );
result:= true;
for a:= 1 to sizeof( TGoodBytes ) do
if goodbytes[a] <> GoodTest[a] then begin
FoundCorrupt;
result:= false;
exit;
end;
end;
procedure TOXVehicleStreams.LoadFromStream( ms: TStream );
var CMem, mem: TMemoryStream; e, c : byte;
begin
Cmem:= TMemoryStream.create;
mem:= TMemoryStream.create;
try
ms.Position:= 0;
ms.read( c, sizeof( c ) );
ms.read( e, sizeof( e ) );
CMem.copyfrom( ms, ms.size -2 );
CMEm.position:= 0;
Mem.copyfrom( Cmem, 0 );
LoadFromStreamNor( Mem );
finally
CMem.Free;
mem.free;
end;
end;
procedure TOXVehicleStreams.LoadFromStreamNor( ms: TStream );
var
Mem: TMemoryStream;
Count, size, a: integer;
ID: string;
begin
if not CheckGood( ms ) then exit;
ClearStreams;
ms.Position:= sizeof( TGoodBytes );
ms.read( count, sizeof( count ) );
for a:= 0 to count - 1 do begin
mem:= TMemoryStream.create;
ID:= ReadStr( ms );
ms.read( Size, sizeof( size ) );
if size <> 0 then
mem.CopyFrom(ms,size);
Streamlist.AddObject( ID, mem );
end;
end;
function TOXVehicleStreams.ReadStr( Stream: TStream ): string;
var
i: word;
s: string;
begin
stream.Read( i, sizeof( i ) );
setlength( s, i );
stream.Read( pchar( s )^, i );
result:= s;
end;
procedure TOXVehicleStreams.RemoveStream( const ID: String );
var i: integer;
begin
if ( length( id ) > 0 ) then begin
i:= Streamlist.IndexOf( ID );
if i >= 0 then begin
TMemoryStream( Streamlist.objects[i] ).free;
Streamlist.Delete( i );
end;
end;
end;
procedure TOXVehicleStreams.SaveToFile( const Filename: string );
var fs: TFileStream;
begin
Fs:= TFileStream.Create( FileName, fmCreate );
try
SaveToStream( fs );
finally
FS.free;
end;
end;
procedure TOXVehicleStreams.SaveToStream( ms: TStream );
var
mem,CMem: TMemoryStream; c: byte;
begin
CMem:= TMemoryStream.Create;
mem:= TMemoryStream.Create;
try
SaveToStreamNor( mem );
mem.position:= 0;
ms.Write( c, sizeof( c ) );
CMem.CopyFrom( mem, 0 );
ms.CopyFrom( CMem, 0 );
finally
mem.free;
CMem.free;
end;
end;
procedure TOXVehicleStreams.SaveToStreamNor( ms: TStream );
var
Count, size, a: integer;
begin
ms.write( goodbytes, sizeof( Tgoodbytes ) );
count:= Streamlist.Count;
ms.write( count, sizeof( count ) );
for a:= 0 to count -1 do begin
Writestr( Streamlist.strings[a], ms );
size:= TMemoryStream( Streamlist.Objects[a] ).size;
ms.Write( size, sizeof( size ) );
ms.CopyFrom( TMemoryStream( StreamList.Objects[a] ), 0 )
end;
end;
procedure TOXVehicleStreams.WriteStr( S: String; Stream: TStream );
var
i: word;
begin
i:= length( s );
stream.Write( i, sizeof( i ) );
stream.write( pchar( s )^, i );
end;
{******************************************************************************}
// [15-9-2007]: TOXNewtonVehicle last change by Dave Gravel. //
{******************************************************************************}
constructor TOXNewtonVehicle.Create( aOwner: TComponent );
begin
inherited create( aOwner );
FOrionX3D:= 100;
FVehicleStreams:= TOXVehicleStreams.Create( Self );
FMeshModel:= 0;
FOXVisual:= True;
FActived:= False;
FPath:= '';
FWheelaMeshName:= '';
FWheelbMeshName:= '';
FWheelcMeshName:= '';
FWheeldMeshName:= '';
FFrameModel:= '';
FWheelaModel:= '';
FWheelbModel:= '';
FWheelcModel:= '';
FWheeldModel:= '';
FWheelRotation:= 300;
FMassRegulation:= 15;
FWheelSideSleepCoeficient:= 0.0;
FWheelMaxSideSleepSpeed:= 0.01;
FWheelaNormalLoad:= 0.0;
FWheelbNormalLoad:= 0.0;
FWheelcNormalLoad:= 0.0;
FWheeldNormalLoad:= 0.0;
FRollingFriction:= 0;
FWheelaOmega:= 0.0;
FWheelbOmega:= 0.0;
FWheelcOmega:= 0.0;
FWheeldOmega:= 0.0;
FWheelaOnAir:= False;
FWheelbOnAir:= False;
FWheelcOnAir:= False;
FWheeldOnAir:= False;
FWheelaLostSideGrip:= False;
FWheelbLostSideGrip:= False;
FWheelcLostSideGrip:= False;
FWheeldLostSideGrip:= False;
FWheelaLostTraction:= False;
FWheelbLostTraction:= False;
FWheelcLostTraction:= False;
FWheeldLostTraction:= False;
FWheelMaxLongitudinalSlideSpeed:= 1000;
FWheelaBrakeForce:= 30000;
FWheelbBrakeForce:= 30000;
FWheelcBrakeForce:= 30000;
FWheeldBrakeForce:= 30000;
FFreezeSpeedMag2:= 0.01;
FFreezeOmegaMag2:= 0.01;
FFreezeFramesCount:= 10;
FOriginX:= 0.0; FOriginY:= 0.0; FOriginZ:= 0.0;
FInertiaX:= 0.0; FInertiaY:= 0.0; FInertiaZ:= 0.0;
FConcretX:= 0.0; FConcretY:= 0.0; FConcretZ:= 0.0;
FAngularDampingX:= 0.0; FAngularDampingY:= 0.0; FAngularDampingZ:= 0.0;
FGetMatrix:= oxEmptyHmgM;
FSetMatrix:= oxEmptyHmgM;
FisSetMatrix:= False;
FisAddImpulse:= False;
FisAddTorque:= False;
FisAddForce:= False;
FisSetOmega:= False;
FisSetVelocity:= False;
FisSetForce:= False;
FisSetTorque:= False;
FAddImpulse:= oxV3Make(0,0,0);
FAddImpulseVel:= oxV3Make(0,0,0);
FAddForce:= oxV3Make(0,0,0);
FAddTorque:= oxV3Make(0,0,0);
FSetOmega:= oxV3Make(0,0,0);
FSetVelocity:= oxV3Make(0,0,0);
FSetForce:= oxV3Make(0,0,0);
FSetTorque:= oxV3Make(0,0,0);
FWheelaPos:= TGLCoordinates.CreateInitialized( Self, VectorMake( 1.2, -1.65, -1 ), csVector );
FWheelbPos:= TGLCoordinates.CreateInitialized( Self, VectorMake( -1.2, -1.65, -1 ), csVector );
FWheelcPos:= TGLCoordinates.CreateInitialized( Self, VectorMake( 1.2, 1.6, -1 ), csVector );
FWheeldPos:= TGLCoordinates.CreateInitialized( Self, VectorMake( -1.2, 1.6, -1 ), csVector );
FPin:= TGLCoordinates.CreateInitialized( Self, VectorMake( 0, -1, 0 ), csVector );
FUpDir:= TGLCoordinates.CreateInitialized( Self, VectorMake( 0, 0, 1 ), csVector );
FWID:= -1;
FContactID:= -1;
FContinuousCollisionMode:= False;
FMaterialCustom:= False;
FWheelsMaterialCustom:= False;
FCustomMassInertiaOrigin:= False;
FAutoFreeze:= False;
FFrameModel:='';
FWheelaModel:='';
FWheelbModel:='';
FWheelcModel:='';
FWheeldModel:='';
FMass:= 2500;
FLinearDamping:= 0.0;
FWheelaWidth:= 1;
FWheelaRadius:= 0.6;
FWheelbWidth:= 1;
FWheelbRadius:= 0.6;
FWheelcWidth:= 1;
FWheelcRadius:= 0.6;
FWheeldWidth:= 1;
FWheeldRadius:= 0.6;
FSpeedForce:= 30000;
FSpeedDivide:= 1000;
FSteeringForce:= 0.015;
FSteeringDivide:= 60;
FSteeringMultiply:= 45;
FTraction:= mdRear;
FShockLength:= 0.3;
FShockSpring:= 90.0;
FShockValue:= 4.0;
FWheelPitchAngle:= 0;
FWheelRollAngle:= 90;
FWheelTurnAngle:= 0;
FWheelMass:= 10;
FOnAir:= True;
FCustomUpVector:= False;
FInternalForceAndTorque:= false;
FFrictionMotion1:= true;
FFrictionMotion2:= false;
end;
{******************************************************************************}
// [15-9-2007]: TOXNewtonVehicle last change by Dave Gravel. //
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -