Apophysis-AV/Variations/varCosine.pas

138 lines
3.0 KiB
ObjectPascal
Raw Permalink Normal View History

2022-03-08 12:25:51 -05:00
{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina }
unit varCosine;
interface
uses
BaseVariation, XFormMan;
type
TVariationCosine = class(TBaseVariation)
private
old: byte;
procedure CalcPlugin;
public
constructor Create;
class function GetName: string; override;
class function GetInstance: TBaseVariation; override;
function GetNrVariables: integer; override;
function GetVariableNameAt(const Index: integer): string; override;
function SetVariable(const Name: string; var value: double): boolean; override;
function GetVariable(const Name: string; var value: double): boolean; override;
function ResetVariable(const Name: string): boolean; override;
procedure CalcFunction; override;
procedure GetCalcFunction(var f: TCalcFunction); override;
end;
implementation
uses
Math;
////////////////////////
procedure TVariationCosine.GetCalcFunction(var f: TCalcFunction);
begin
if old = 1 then f := CalcFunction // Apo 2.09 version
else f := CalcPlugin; // cosine.dll
end;
procedure TVariationCosine.CalcFunction;
var
sinx, cosx, sinhy, coshy: double;
begin
SinCos(FTx^ * PI, sinx, cosx);
if FTy^ = 0 then
// sinh(0) = 0, cosh(0) = 1
FPx^ := FPx^ + vvar * cosx
else begin
SinhCosh(FTy^, sinhy, coshy);
FPx^ := FPx^ + vvar * cosx * coshy;
FPy^ := FPy^ - vvar * sinx * sinhy;
end;
end;
procedure TVariationCosine.CalcPlugin;
var
sinx, cosx, sinhy, coshy: double;
begin
SinCos(FTx^ * PI, sinx, cosx);
if FTy^ = 0 then
// sinh(0) = 0, cosh(0) = 1
FPx^ := FPx^ + vvar * cosx
else begin
SinhCosh(FTy^, sinhy, coshy);
FPx^ := FPx^ + vvar * cosx * coshy;
FPy^ := FPy^ + vvar * sinx * sinhy;
end;
end;
constructor TVariationCosine.Create;
begin
old := 1;
end;
class function TVariationCosine.GetInstance: TBaseVariation;
begin
Result := TVariationCosine.Create;
end;
class function TVariationCosine.GetName: string;
begin
Result := 'cosine';
end;
function TVariationCosine.GetNrVariables: integer;
begin
Result := 1;
end;
function TVariationCosine.GetVariable(const Name: string;
var value: double): boolean;
begin
Result := False;
if Name = 'cosine_old' then begin
value := old;
Result := True;
end;
end;
function TVariationCosine.GetVariableNameAt(const Index: integer): string;
begin
case Index of
0: Result := 'cosine_old';
else
Result := '';
end;
end;
function TVariationCosine.SetVariable(const Name: string;
var value: double): boolean;
begin
Result := False;
if Name = 'cosine_old' then begin
if Value < 0 then Value := 0;
if Value > 1 then Value := 1;
old := Round(value);
Result := True;
end;
end;
function TVariationCosine.ResetVariable(const Name: string): boolean;
begin
Result := False;
if Name = 'cosine_old' then begin
old := 1;
Result := True;
end;
end;
//////////////////////////////
initialization
RegisterVariation(TVariationClassLoader.Create(TVariationCosine), false, false);
end.