📄 oxnewtonopenal.pas
字号:
begin
FActived:= False;
if Fplaying then Stop;
AlDeleteBuffers(1, @Fbuffer);
AlDeleteSources(1, @FData);
inherited destroy;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
constructor TOXVehicleOpenAL.Create;
begin
FMotor:= false;
FActived:= True;
Fplaying:= false;
gain:= 1.0;
pitch:= 1.0;
FIdle:= 0.4;
FRevolution:= 0.0;
AlGenBuffers(1, @Fbuffer);
AlGenSources(1, @FData);
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
procedure TOXVehicleOpenAL.LoadFromFile(filename: string);
var
size: TALSizei;
freq: TALSizei;
Data: TALVoid;
format: TALEnum;
floop: TALInt;
begin
AlutLoadWavFile(filename, format, data, size, freq, floop);
AlBufferData(Fbuffer, format, data, size, freq);
AlutUnloadWav(format, data, size, freq);
loop:= floop;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
procedure TOXVehicleOpenAL.Play;
begin
AlSourcePlay(FData);
Update;
Fplaying:=true;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
procedure TOXVehicleOpenAL.Pause;
begin
AlSourcePause(FData);
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
procedure TOXVehicleOpenAL.Stop;
begin
Fplaying:=false;
AlSourceStop(FData);
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
procedure TOXVehicleOpenAL.update;
var
vhl: TOXNewtonVehicle;
listenerori: array [0..5] of TALfloat;
aWomega: single;
bWomega: single;
cWomega: single;
dWomega: single;
RetroPitch: single;
begin
if FActived = false then exit;
//Source
AlSourcei(FData, AL_BUFFER, Fbuffer);
AlSourcef(FData, AL_PITCH, Fpitch);
AlSourcef(FData, AL_GAIN, Fgain);
AlSourcefv(FData, AL_POSITION, @FSource.Position.AsVector);
//AlSourcefv(FData, AL_VELOCITY, @Fvelocity);
AlSourcei(FData, AL_LOOPING, Flooping);
//Listener
AlListenerfv ( AL_POSITION, @FListener.Position.AsVector);
//AlListenerfv ( AL_VELOCITY, @Flvelocity);
with FListener.Up do begin listenerori[0]:= X; listenerori[1]:= Y; listenerori[2]:= Z; end;
with FListener.Direction do begin listenerori[3]:= X; listenerori[4]:= Y; listenerori[5]:= Z; end;
AlListenerfv ( AL_ORIENTATION, @listenerori);
vhl:= TOXNewtonVehicle(Source);
if FRevolution > 2.0 then FRevolution:= 2.0;
if FRevolution < 0 then FRevolution:= 0;
if FMotor then
begin
FRevolution:= FRevolution+0.1;
end else
begin
FRevolution:= FRevolution-0.1;
end;
aWomega:= vhl.WheelaOmega;
bWomega:= vhl.WheelbOmega;
cWomega:= vhl.WheelcOmega;
dWomega:= vhl.WheeldOmega;
//
aWomega:= Abs((aWomega+bWomega)/2);
dWomega:= Abs((dWomega+cWomega)/2);
//if (dWomega > 100) then dWomega:= 100;
RetroPitch:= Abs((FRevolution)+(dWomega/50)*(aWomega/vhl.WheelaRadius)/1000);
if (RetroPitch/1.5 > 2.2) then
Pitch:= 2.2 else
Pitch:= RetroPitch/1.5;
//if RetroPitch<3.0 then Pitch:= RetroPitch
//else //(aWomega/100)+(dWomega/35)*vhl.WheelaRadius*(FRevolution/200);
//Pitch:= 3.0;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
destructor TOXVehicleOpenAL.Destroy;
begin
FActived:= False;
if Fplaying then Stop;
AlDeleteBuffers(1, @Fbuffer);
AlDeleteSources(1, @FData);
inherited destroy;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
constructor TOXManagerOpenAL.Create(aOwner: TComponent);
var argv: array of PChar;
begin
inherited Create(aOwner);
argv:= nil;
AlutInit( nil, argv );
//ReadOpenALExtensions;
FVSList:= TList.Create;
FVSCount:= 0;
FSSList:= TList.Create;
FSSCount:= 0;
FActived:= True;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
procedure TOXManagerOpenAL.AddVehicleSound(name: string; soundfile:string; ssource, slistener: TGLBaseSceneObject);
begin
if (FActived = false) then exit;
Inc(FVSCount);
SetLength(FVehicleSound,FVSCount);
FVehicleSound[FVSCount-1]:= TOXVehicleOpenAL.Create;
FVehicleSound[FVSCount-1].Name:= name;
FVehicleSound[FVSCount-1].Source:= ssource;
FVehicleSound[FVSCount-1].Listener:= slistener;
FVehicleSound[FVSCount-1].LoadFromFile(soundfile);
FVehicleSound[FVSCount-1].pitch:= 1.0;
FVehicleSound[FVSCount-1].gain:= 1.0;
FVehicleSound[FVSCount-1].loop:= 1;
FVehicleSound[FVSCount-1].update;
if not FVSList.indexOf(FVehicleSound[FVSCount-1])>-1 then
FVSList.Add(FVehicleSound[FVSCount-1])
else
FVehicleSound[FVSCount-1].Free;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
procedure TOXManagerOpenAL.AddSimpleSound(name: string; soundfile:string; ssource, slistener: TGLBaseSceneObject);
begin
if (FActived = false) then exit;
Inc(FSSCount);
SetLength(FSimpleSound,FSSCount);
FSimpleSound[FSSCount-1]:= TOXSimpleOpenAL.Create;
FSimpleSound[FSSCount-1].Name:= name;
FSimpleSound[FSSCount-1].Source:= ssource;
FSimpleSound[FSSCount-1].Listener:= slistener;
FSimpleSound[FSSCount-1].LoadFromFile(soundfile);
FSimpleSound[FSSCount-1].pitch:= 1.0;
FSimpleSound[FSSCount-1].gain:= 1.0;
FSimpleSound[FSSCount-1].loop:= 1;
FSimpleSound[FSSCount-1].update;
if not FSSList.indexOf(FSimpleSound[FSSCount-1])>-1 then
FSSList.Add(FSimpleSound[FSSCount-1])
else
FSimpleSound[FSSCount-1].Free;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
function TOXManagerOpenAL.VehicleSound(name: string): TOXVehicleOpenAL;
var i: integer;
begin
result:= nil;
if FActived = false then exit;
for i:= 0 to FVSList.Count-1 do
if TOXVehicleOpenAL(FVSList.Items[i]).name = name then
result:= TOXVehicleOpenAL(FVSList.Items[i]);
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
procedure TOXManagerOpenAL.RemoveSound(name: string);
var i: integer;
begin
if Assigned(FSSList) then
for i:= FSSList.Count-1 downto 0 do
begin
if TOXSimpleOpenAL(FSSList.Items[i]).Name = name then
FSSList.Delete(i);
end;
if Assigned(FVSList) then
for i:= 0 to FVSList.Count-1 do
begin
if TOXVehicleOpenAL(FVSList.Items[i]).name = name then
FVSList.Delete(i);
end;
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
function TOXManagerOpenAL.SimpleSound(name: string): TOXSimpleOpenAL;
var i: integer;
begin
result:= nil;
if FActived = false then exit;
for i:= 0 to FSSList.Count-1 do
if TOXSimpleOpenAL(FSSList.Items[i]).name = name then
result:= TOXSimpleOpenAL(FSSList.Items[i]);
end;
{******************************************************************************}
// [05-25-2007]: TOXManagerOpenAL last change by Dave Gravel. //
{******************************************************************************}
destructor TOXManagerOpenAL.Destroy;
var i: integer;
begin
FActived:= false;
for i:= 0 to FVSList.Count-1 do begin
if TOXVehicleOpenAL(FVSList.Items[i]).playing then
begin
TOXVehicleOpenAL(FVSList.Items[i]).Stop;
TOXVehicleOpenAL(FVSList.Items[i]).loop:= 0;
TOXVehicleOpenAL(FVSList.Items[i]).update;
end;
TOXVehicleOpenAL(FVSList.Items[i]).Free;
end;
for i:= 0 to FSSList.Count-1 do begin
if TOXSimpleOpenAL(FSSList.Items[i]).playing then
begin
TOXSimpleOpenAL(FSSList.Items[i]).Stop;
TOXSimpleOpenAL(FSSList.Items[i]).loop:= 0;
TOXSimpleOpenAL(FSSList.Items[i]).update;
end;
TOXSimpleOpenAL(FSSList.Items[i]).Free;
end;
FVSList.Clear;
FSSList.Clear;
FreeAndNil(FVSList);
FreeAndNil(FSSList);
alutExit;
inherited Destroy;
end;
{******************************************************************************}
{$D '[05-25-2007]: TOXNewtonManager v1.48 by Dave Gravel under MPL-1.1 license.'}
{******************************************************************************}
initialization
RegisterClasses( [ TOXManagerOpenAL] );
end.
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -