{ Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina }

unit varTangent;

interface
uses
  BaseVariation, XFormMan;

type
  TVariationTangent = class(TBaseVariation)
  private
    
  public
    constructor Create;

    class function GetName: string; override;
    class function GetInstance: TBaseVariation; override;

    procedure CalcFunction; override;
  end;

implementation

uses
  Math;
  
////////////////////////

procedure TVariationTangent.CalcFunction;
var  
	sx, cx, sy, cy: double;
begin                    
  SinCos(FTx^, sx, cx);
  SinCos(FTy^, sy, cy);
  if cx = 0 then cx := 1e-20;
  if cy = 0 then cy := 1e-20;
  FPx^ := FPx^ + vvar * sx / cy;
  FPy^ := FPy^ + vvar * sy / cy;
  // AV: added real 3D support
  FPz^ := FPz^ + vvar * sx / cx;  
end;

constructor TVariationTangent.Create;
begin
  inherited Create;
end;

class function TVariationTangent.GetInstance: TBaseVariation;
begin
   Result := TVariationTangent.Create;
end;

class function TVariationTangent.GetName: string;
begin
   Result := 'tangent';
end;

//////////////////////////////
initialization
  RegisterVariation(TVariationClassLoader.Create(TVariationTangent), true, false);

end.
