311 lines
8.1 KiB
ObjectPascal
311 lines
8.1 KiB
ObjectPascal
|
{
|
||
|
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
||
|
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov
|
||
|
Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov
|
||
|
|
||
|
Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov
|
||
|
Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne
|
||
|
Apophysis AV "Phoenix Edition" Copyright (C) 2021 Alice V. Koryagina
|
||
|
|
||
|
This program is free software; you can redistribute it and/or modify
|
||
|
it under the terms of the GNU General Public License as published by
|
||
|
the Free Software Foundation; either version 2 of the License, or
|
||
|
(at your option) any later version.
|
||
|
|
||
|
This program is distributed in the hope that it will be useful,
|
||
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||
|
GNU General Public License for more details.
|
||
|
|
||
|
You should have received a copy of the GNU General Public License
|
||
|
along with this program; if not, write to the Free Software
|
||
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
||
|
}
|
||
|
|
||
|
unit varPostCrop;
|
||
|
|
||
|
interface
|
||
|
|
||
|
uses
|
||
|
BaseVariation, XFormMan;
|
||
|
|
||
|
type
|
||
|
TVariationPostCrop = class(TBaseVariation)
|
||
|
const
|
||
|
n_x0 : string = 'post_crop_left';
|
||
|
n_y0 : string = 'post_crop_top';
|
||
|
n_x1 : string = 'post_crop_right';
|
||
|
n_y1 : string = 'post_crop_bottom';
|
||
|
n_s : string = 'post_crop_scatter_area';
|
||
|
n_z : string = 'post_crop_zero';
|
||
|
n : string = 'post_crop';
|
||
|
n_z1 : string = 'post_crop_high'; // AV
|
||
|
n_z0 : string = 'post_crop_low'; //AV
|
||
|
n_3D : string = 'post_crop_use3D'; // AV
|
||
|
private
|
||
|
x0, y0, x1, y1, z0, z1, s, w, h, l: double;
|
||
|
_x0, _y0, _x1, _y1, _z0, _z1: double;
|
||
|
z, c3D: byte;
|
||
|
|
||
|
procedure Calc2D;
|
||
|
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 Prepare; override;
|
||
|
procedure CalcFunction; override;
|
||
|
procedure GetCalcFunction(var f: TCalcFunction); override;
|
||
|
end;
|
||
|
|
||
|
implementation
|
||
|
|
||
|
uses
|
||
|
Math;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
procedure TVariationPostCrop.Prepare;
|
||
|
begin
|
||
|
if (x0 < x1) then begin
|
||
|
_x0 := x0;
|
||
|
_x1 := x1;
|
||
|
end else begin
|
||
|
_x0 := x1;
|
||
|
_x1 := x0;
|
||
|
end;
|
||
|
|
||
|
if (y0 < y1) then begin
|
||
|
_y0 := y0;
|
||
|
_y1 := y1;
|
||
|
end else begin
|
||
|
_y0 := y1;
|
||
|
_y1 := y0;
|
||
|
end;
|
||
|
|
||
|
if (z0 < z1) then begin
|
||
|
_z0 := z0;
|
||
|
_z1 := z1;
|
||
|
end else begin
|
||
|
_z0 := z1;
|
||
|
_z1 := z0;
|
||
|
end;
|
||
|
|
||
|
w := (_x1 - _x0) * 0.5 * s;
|
||
|
h := (_y1 - _y0) * 0.5 * s;
|
||
|
l := (_z1 - _z0) * 0.5 * s;
|
||
|
end;
|
||
|
|
||
|
/////////////////////////////////////////////////
|
||
|
procedure TVariationPostCrop.GetCalcFunction(var f: TCalcFunction);
|
||
|
begin
|
||
|
if (c3D = 0) then f := Calc2D
|
||
|
else f := CalcFunction;
|
||
|
end;
|
||
|
|
||
|
////////////////////////////////////////////////////////
|
||
|
procedure TVariationPostCrop.CalcFunction;
|
||
|
var x, y, tz: double;
|
||
|
begin
|
||
|
x := FPx^;
|
||
|
y := FPy^;
|
||
|
tz := FPz^;
|
||
|
|
||
|
if ((x < _x0) or (x > _x1) or (y < _y0) or (y > _y1) or (tz < _z0) or (tz > _z1))
|
||
|
and (z <> 0) then begin
|
||
|
x := 0; y := 0; tz := 0;
|
||
|
end else begin
|
||
|
if x < _x0 then x := _x0 + random * w
|
||
|
else if x > _x1 then x := _x1 - random * w;
|
||
|
if y < _y0 then y := _y0 + random * h
|
||
|
else if y > _y1 then y := _y1 - random * h;
|
||
|
if tz < _z0 then tz := _z0 + random * l
|
||
|
else if tz > _z1 then tz := _z1 - random * l;
|
||
|
end;
|
||
|
|
||
|
FPx^ := VVAR * x;
|
||
|
FPy^ := VVAR * y;
|
||
|
FPz^ := VVAR * tz;
|
||
|
end;
|
||
|
|
||
|
procedure TVariationPostCrop.Calc2D;
|
||
|
var x, y: double;
|
||
|
begin
|
||
|
x := FPx^;
|
||
|
y := FPy^;
|
||
|
|
||
|
if ((x < _x0) or (x > _x1) or (y < _y0) or (y > _y1)) and (z <> 0) then begin
|
||
|
x := 0; y := 0;
|
||
|
end else begin
|
||
|
if x < _x0 then x := _x0 + random * w
|
||
|
else if x > _x1 then x := _x1 - random * w;
|
||
|
if y < _y0 then y := _y0 + random * h
|
||
|
else if y > _y1 then y := _y1 - random * h;
|
||
|
end;
|
||
|
|
||
|
FPx^ := VVAR * x;
|
||
|
FPy^ := VVAR * y;
|
||
|
end;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
constructor TVariationPostCrop.Create;
|
||
|
begin
|
||
|
x0 := -1; x1 := 1;
|
||
|
y0 := -1; y1 := 1;
|
||
|
z0 := -1; z1 := 1;
|
||
|
c3D := 0;
|
||
|
end;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
class function TVariationPostCrop.GetInstance: TBaseVariation;
|
||
|
begin
|
||
|
Result := TVariationPostCrop.Create;
|
||
|
end;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
class function TVariationPostCrop.GetName: string;
|
||
|
begin
|
||
|
Result := n;
|
||
|
end;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
function TVariationPostCrop.GetVariableNameAt(const Index: integer): string;
|
||
|
begin
|
||
|
case Index Of
|
||
|
0: Result := n_x0;
|
||
|
1: Result := n_y0;
|
||
|
2: Result := n_x1;
|
||
|
3: Result := n_y1;
|
||
|
4: Result := n_z0;
|
||
|
5: Result := n_z1;
|
||
|
6: Result := n_s;
|
||
|
7: Result := n_z;
|
||
|
8: Result := n_3D;
|
||
|
else
|
||
|
Result := '';
|
||
|
end
|
||
|
end;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
function TVariationPostCrop.SetVariable(const Name: string; var value: double): boolean;
|
||
|
begin
|
||
|
Result := False;
|
||
|
if Name = n_x0 then begin
|
||
|
x0 := Value;
|
||
|
Result := True;
|
||
|
end else if Name = n_y0 then begin
|
||
|
y0 := Value;
|
||
|
Result := True;
|
||
|
end else if Name = n_x1 then begin
|
||
|
x1 := Value;
|
||
|
Result := True;
|
||
|
end else if Name = n_y1 then begin
|
||
|
y1 := Value;
|
||
|
Result := True;
|
||
|
end else if Name = n_z0 then begin
|
||
|
z0 := Value;
|
||
|
Result := True;
|
||
|
end else if Name = n_z1 then begin
|
||
|
z1 := Value;
|
||
|
Result := True;
|
||
|
end else if Name = n_s then begin
|
||
|
if (Value < -1) then Value := -1;
|
||
|
if (Value > 1) then Value := 1;
|
||
|
s := Value;
|
||
|
Result := True;
|
||
|
end else if Name = n_z then begin
|
||
|
if (Value > 1) then Value := 1;
|
||
|
if (Value < 0) then Value := 0;
|
||
|
z := Round(Value);
|
||
|
Result := True;
|
||
|
end else if Name = n_3d then begin
|
||
|
if (Value > 1) then Value := 1;
|
||
|
if (Value < 0) then Value := 0;
|
||
|
c3D := Round(Value);
|
||
|
Result := True;
|
||
|
end
|
||
|
end;
|
||
|
function TVariationPostCrop.ResetVariable(const Name: string): boolean;
|
||
|
begin
|
||
|
Result := False;
|
||
|
if Name = n_x0 then begin
|
||
|
x0 := -1;
|
||
|
Result := True;
|
||
|
end else if Name = n_y0 then begin
|
||
|
y0 := -1;
|
||
|
Result := True;
|
||
|
end else if Name = n_x1 then begin
|
||
|
x1 := 1;
|
||
|
Result := True;
|
||
|
end else if Name = n_y1 then begin
|
||
|
y1 := 1;
|
||
|
Result := True;
|
||
|
end else if Name = n_z0 then begin
|
||
|
z0 := -1;
|
||
|
Result := True;
|
||
|
end else if Name = n_z1 then begin
|
||
|
z1 := 1;
|
||
|
Result := True;
|
||
|
end else if Name = n_s then begin
|
||
|
s := 0;
|
||
|
Result := True;
|
||
|
end else if Name = n_z then begin
|
||
|
z := 0;
|
||
|
Result := True;
|
||
|
end else if Name = n_3D then begin
|
||
|
c3D := 0;
|
||
|
Result := True;
|
||
|
end
|
||
|
end;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
function TVariationPostCrop.GetNrVariables: integer;
|
||
|
begin
|
||
|
Result := 9
|
||
|
end;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
function TVariationPostCrop.GetVariable(const Name: string; var value: double): boolean;
|
||
|
begin
|
||
|
Result := False;
|
||
|
if Name = n_x0 then begin
|
||
|
Value := x0;
|
||
|
Result := True;
|
||
|
end else if Name = n_y0 then begin
|
||
|
Value := y0;
|
||
|
Result := True;
|
||
|
end else if Name = n_x1 then begin
|
||
|
Value := x1;
|
||
|
Result := True;
|
||
|
end else if Name = n_y1 then begin
|
||
|
Value := y1;
|
||
|
Result := True;
|
||
|
end else if Name = n_z0 then begin
|
||
|
Value := z0;
|
||
|
Result := True;
|
||
|
end else if Name = n_z1 then begin
|
||
|
Value := z1;
|
||
|
Result := True;
|
||
|
end else if Name = n_s then begin
|
||
|
Value := s;
|
||
|
Result := True;
|
||
|
end else if Name = n_z then begin
|
||
|
Value := z;
|
||
|
Result := True;
|
||
|
end else if Name = n_3D then begin
|
||
|
Value := c3D;
|
||
|
Result := True;
|
||
|
end
|
||
|
end;
|
||
|
|
||
|
///////////////////////////////////////////////////////////////////////////////
|
||
|
initialization
|
||
|
RegisterVariation(TVariationClassLoader.Create(TVariationPostCrop), true, false);
|
||
|
end.
|