Parameterized variations
This commit is contained in:
parent
41a160f51c
commit
ab49c4053a
64
2.10/Source/BaseVariation.pas
Normal file
64
2.10/Source/BaseVariation.pas
Normal file
@ -0,0 +1,64 @@
|
|||||||
|
unit BaseVariation;
|
||||||
|
|
||||||
|
interface
|
||||||
|
type
|
||||||
|
TBaseVariation = class
|
||||||
|
protected
|
||||||
|
|
||||||
|
public
|
||||||
|
vvar: double; // normalized interp coefs between variations
|
||||||
|
FTx, FTy: ^double;
|
||||||
|
FPx, FPy: ^double;
|
||||||
|
|
||||||
|
class function GetName: string; virtual; abstract;
|
||||||
|
class function GetInstance: TBaseVariation; virtual; abstract;
|
||||||
|
|
||||||
|
class function GetNrVariables: integer; virtual;
|
||||||
|
class function GetVariableNameAt(const Index: integer): string; virtual;
|
||||||
|
|
||||||
|
function SetVariable(const Name: string; var value: double): boolean; virtual;
|
||||||
|
function GetVariable(const Name: string; var value: double): boolean; virtual;
|
||||||
|
|
||||||
|
procedure Prepare; virtual;
|
||||||
|
|
||||||
|
procedure CalcFunction; virtual; abstract;
|
||||||
|
end;
|
||||||
|
|
||||||
|
TBaseVariationClass = class of TBaseVariation;
|
||||||
|
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
{ TBaseVariation }
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TBaseVariation.GetNrVariables: integer;
|
||||||
|
begin
|
||||||
|
Result := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function TBaseVariation.GetVariable(const Name: string; var value: double): boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function TBaseVariation.SetVariable(const Name: string; var value: double): boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TBaseVariation.GetVariableNameAt(const Index: integer): string;
|
||||||
|
begin
|
||||||
|
Result := ''
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure TBaseVariation.prepare;
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
end.
|
@ -53,7 +53,7 @@ object EditForm: TEditForm
|
|||||||
TextHeight = 13
|
TextHeight = 13
|
||||||
object StatusBar: TStatusBar
|
object StatusBar: TStatusBar
|
||||||
Left = 0
|
Left = 0
|
||||||
Top = 547
|
Top = 541
|
||||||
Width = 578
|
Width = 578
|
||||||
Height = 15
|
Height = 15
|
||||||
Panels = <
|
Panels = <
|
||||||
@ -325,14 +325,14 @@ object EditForm: TEditForm
|
|||||||
Left = 0
|
Left = 0
|
||||||
Top = 24
|
Top = 24
|
||||||
Width = 578
|
Width = 578
|
||||||
Height = 523
|
Height = 517
|
||||||
Align = alClient
|
Align = alClient
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
object Splitter1: TSplitter
|
object Splitter1: TSplitter
|
||||||
Left = 396
|
Left = 396
|
||||||
Top = 1
|
Top = 1
|
||||||
Width = 9
|
Width = 9
|
||||||
Height = 521
|
Height = 515
|
||||||
Align = alRight
|
Align = alRight
|
||||||
AutoSnap = False
|
AutoSnap = False
|
||||||
Beveled = True
|
Beveled = True
|
||||||
@ -343,7 +343,7 @@ object EditForm: TEditForm
|
|||||||
Left = 1
|
Left = 1
|
||||||
Top = 1
|
Top = 1
|
||||||
Width = 395
|
Width = 395
|
||||||
Height = 521
|
Height = 515
|
||||||
Align = alClient
|
Align = alClient
|
||||||
BevelOuter = bvNone
|
BevelOuter = bvNone
|
||||||
Color = clBlack
|
Color = clBlack
|
||||||
@ -353,7 +353,7 @@ object EditForm: TEditForm
|
|||||||
Left = 0
|
Left = 0
|
||||||
Top = 0
|
Top = 0
|
||||||
Width = 395
|
Width = 395
|
||||||
Height = 521
|
Height = 515
|
||||||
Align = alClient
|
Align = alClient
|
||||||
PopupMenu = EditPopup
|
PopupMenu = EditPopup
|
||||||
OnDblClick = GraphImageDblClick
|
OnDblClick = GraphImageDblClick
|
||||||
@ -366,7 +366,7 @@ object EditForm: TEditForm
|
|||||||
Left = 405
|
Left = 405
|
||||||
Top = 1
|
Top = 1
|
||||||
Width = 172
|
Width = 172
|
||||||
Height = 521
|
Height = 515
|
||||||
Align = alRight
|
Align = alRight
|
||||||
Alignment = taLeftJustify
|
Alignment = taLeftJustify
|
||||||
BevelOuter = bvNone
|
BevelOuter = bvNone
|
||||||
@ -406,7 +406,7 @@ object EditForm: TEditForm
|
|||||||
Left = 0
|
Left = 0
|
||||||
Top = 136
|
Top = 136
|
||||||
Width = 172
|
Width = 172
|
||||||
Height = 385
|
Height = 379
|
||||||
Align = alClient
|
Align = alClient
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
object lblTransform: TLabel
|
object lblTransform: TLabel
|
||||||
@ -439,10 +439,10 @@ object EditForm: TEditForm
|
|||||||
end
|
end
|
||||||
object PageControl: TPageControl
|
object PageControl: TPageControl
|
||||||
Left = 1
|
Left = 1
|
||||||
Top = 26
|
Top = 20
|
||||||
Width = 170
|
Width = 170
|
||||||
Height = 358
|
Height = 358
|
||||||
ActivePage = TriangleTab
|
ActivePage = TabSheet4
|
||||||
Align = alBottom
|
Align = alBottom
|
||||||
Anchors = [akLeft, akTop, akRight, akBottom]
|
Anchors = [akLeft, akTop, akRight, akBottom]
|
||||||
MultiLine = True
|
MultiLine = True
|
||||||
@ -1319,6 +1319,28 @@ object EditForm: TEditForm
|
|||||||
63)
|
63)
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
object TabSheet4: TTabSheet
|
||||||
|
Caption = 'Variables'
|
||||||
|
ImageIndex = 4
|
||||||
|
object vleVariables: TValueListEditor
|
||||||
|
Left = 0
|
||||||
|
Top = 0
|
||||||
|
Width = 162
|
||||||
|
Height = 312
|
||||||
|
Align = alClient
|
||||||
|
ScrollBars = ssVertical
|
||||||
|
TabOrder = 0
|
||||||
|
TitleCaptions.Strings = (
|
||||||
|
'Variation'
|
||||||
|
'Value')
|
||||||
|
OnExit = vleVariablesExit
|
||||||
|
OnKeyPress = vleVariablesKeyPress
|
||||||
|
OnValidate = vleVariablesValidate
|
||||||
|
ColWidths = (
|
||||||
|
93
|
||||||
|
63)
|
||||||
|
end
|
||||||
|
end
|
||||||
object tabColors: TTabSheet
|
object tabColors: TTabSheet
|
||||||
Caption = 'Colors'
|
Caption = 'Colors'
|
||||||
ImageIndex = 3
|
ImageIndex = 3
|
||||||
|
@ -154,6 +154,11 @@ type
|
|||||||
ToolButton9: TToolButton;
|
ToolButton9: TToolButton;
|
||||||
Panel1: TPanel;
|
Panel1: TPanel;
|
||||||
ColorImage: TImage;
|
ColorImage: TImage;
|
||||||
|
TabSheet4: TTabSheet;
|
||||||
|
vleVariables: TValueListEditor;
|
||||||
|
procedure vleVariablesValidate(Sender: TObject; ACol, ARow: Integer; const KeyName, KeyValue: string);
|
||||||
|
procedure vleVariablesKeyPress(Sender: TObject; var Key: Char);
|
||||||
|
procedure vleVariablesExit(Sender: TObject);
|
||||||
procedure FormCreate(Sender: TObject);
|
procedure FormCreate(Sender: TObject);
|
||||||
procedure GraphImageMouseMove(Sender: TObject; Shift: TShiftState; X,
|
procedure GraphImageMouseMove(Sender: TObject; Shift: TShiftState; X,
|
||||||
Y: integer);
|
Y: integer);
|
||||||
@ -284,7 +289,7 @@ type
|
|||||||
GraphZoom: double;
|
GraphZoom: double;
|
||||||
CornerCaught: boolean;
|
CornerCaught: boolean;
|
||||||
TriangleCaught: boolean;
|
TriangleCaught: boolean;
|
||||||
// SelectedTriangle: integer; // outside only for scripting (??)
|
// SelectedTriangle: integer; // outside only for scripting (??)
|
||||||
SelectedCorner: integer;
|
SelectedCorner: integer;
|
||||||
SelectMode: boolean;
|
SelectMode: boolean;
|
||||||
// Drawing: boolean;
|
// Drawing: boolean;
|
||||||
@ -294,7 +299,7 @@ type
|
|||||||
// --Z--
|
// --Z--
|
||||||
olddist: double;
|
olddist: double;
|
||||||
Pivot: TSPoint;
|
Pivot: TSPoint;
|
||||||
VarsCache: array[0..32] of double; // hack
|
VarsCache: array[0..64] of double; // hack
|
||||||
|
|
||||||
colorDrag, colorChanged: boolean;
|
colorDrag, colorChanged: boolean;
|
||||||
colorDragX, colorOldX: integer;
|
colorDragX, colorOldX: integer;
|
||||||
@ -357,7 +362,7 @@ procedure ScaleAll;
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Main, Global, Adjust, Mutate, Xform;
|
Main, Global, Adjust, Mutate, XformMan;
|
||||||
|
|
||||||
const
|
const
|
||||||
SUB_BATCH_SIZE = 1000;
|
SUB_BATCH_SIZE = 1000;
|
||||||
@ -625,6 +630,7 @@ var
|
|||||||
i: integer;
|
i: integer;
|
||||||
a, b, c, d, e, f: double;
|
a, b, c, d, e, f: double;
|
||||||
v: double;
|
v: double;
|
||||||
|
val: double;
|
||||||
begin
|
begin
|
||||||
t := SelectedTriangle; // why 't' ?
|
t := SelectedTriangle; // why 't' ?
|
||||||
|
|
||||||
@ -674,15 +680,19 @@ begin
|
|||||||
EditForm.txtXFormColor.Text := Format('%1.3f', [cp.xform[t].color]);//FloatToStr(EditForm.cp.xform[t].color);
|
EditForm.txtXFormColor.Text := Format('%1.3f', [cp.xform[t].color]);//FloatToStr(EditForm.cp.xform[t].color);
|
||||||
EditForm.scrlXFormcolor.Position := Trunc(EditForm.cp.xform[t].color * scrlXFormColor.Max);
|
EditForm.scrlXFormcolor.Position := Trunc(EditForm.cp.xform[t].color * scrlXFormColor.Max);
|
||||||
|
|
||||||
for i := 0 to NRVISVAR-1 do begin
|
for i := 0 to NRVAR-1 do begin
|
||||||
v:=EditForm.cp.xform[SelectedTriangle].vars[i];
|
v:=EditForm.cp.xform[SelectedTriangle].vars[i];
|
||||||
if v <> VarsCache[i] then
|
if v <> VarsCache[i] then
|
||||||
begin
|
begin
|
||||||
VarsCache[i]:=v;
|
VarsCache[i]:=v;
|
||||||
EditForm.VEVars.Values[VarNames[i]] := Format('%.6g', [v]);
|
EditForm.VEVars.Values[VarNames(i)] := Format('%.6g', [v]);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
for i:= 0 to GetNrVariableNames - 1 do begin
|
||||||
|
EditForm.cp.xform[SelectedTriangle].GetVariable(GetVariableNameAt(i), val);
|
||||||
|
EditForm.vleVariables.Values[GetVariableNameAt(i)] := Format('%.6g', [val]);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TEditForm.Scale(var fx, fy: double; x, y, Width, Height: integer);
|
procedure TEditForm.Scale(var fx, fy: double; x, y, Width, Height: integer);
|
||||||
@ -1154,8 +1164,23 @@ procedure TEditForm.FormCreate(Sender: TObject);
|
|||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
for i:= 0 to NRVISVAR - 1 do begin
|
(*
|
||||||
VEVars.InsertRow(Varnames[i], '0', True);
|
Drawcntrl := TDrawingControl.Create(self);
|
||||||
|
Drawcntrl.TabStop := True;
|
||||||
|
Drawcntrl.Parent := GrphPnl;
|
||||||
|
Drawcntrl.Align := alClient;
|
||||||
|
Drawcntrl.Visible := True;
|
||||||
|
|
||||||
|
Drawcntrl.OnDblClick := GraphImageDblClick;
|
||||||
|
Drawcntrl.Onpaint := viewPaint;
|
||||||
|
*)
|
||||||
|
|
||||||
|
for i:= 0 to NRVAR - 1 do begin
|
||||||
|
VEVars.InsertRow(Varnames(i), '0', True);
|
||||||
|
end;
|
||||||
|
|
||||||
|
for i:= 0 to GetNrVariableNames - 1 do begin
|
||||||
|
vleVariables.InsertRow(GetVariableNameAt(i), '0', True);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
bm := TBitmap.Create;
|
bm := TBitmap.Create;
|
||||||
@ -1183,7 +1208,8 @@ begin
|
|||||||
mouseOverTriangle := -1;
|
mouseOverTriangle := -1;
|
||||||
mouseOverCorner := -1;
|
mouseOverCorner := -1;
|
||||||
|
|
||||||
for i := 0 to NRVISVAR-1 do VarsCache[i] := MinDouble;
|
for i := 0 to NRVAR-1 do
|
||||||
|
VarsCache[i] := MinDouble;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TEditForm.GraphImageMouseMove(Sender: TObject; Shift: TShiftState;
|
procedure TEditForm.GraphImageMouseMove(Sender: TObject; Shift: TShiftState;
|
||||||
@ -2458,17 +2484,17 @@ begin
|
|||||||
OldVal := Round6(cp.xform[SelectedTriangle].vars[i]);
|
OldVal := Round6(cp.xform[SelectedTriangle].vars[i]);
|
||||||
{ Test that it's a valid floating point number }
|
{ Test that it's a valid floating point number }
|
||||||
try
|
try
|
||||||
StrToFloat(VEVars.Values[VarNames[i]]);
|
StrToFloat(VEVars.Values[VarNames(i)]);
|
||||||
except on Exception do
|
except on Exception do
|
||||||
begin
|
begin
|
||||||
{ It's not, so we restore the old value }
|
{ It's not, so we restore the old value }
|
||||||
VEVars.Values[VarNames[i]] := Format('%.6g', [OldVal]);
|
VEVars.Values[VarNames(i)] := Format('%.6g', [OldVal]);
|
||||||
Allow := False;
|
Allow := False;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
NewVal := Round6(StrToFloat(VEVars.Values[VarNames[i]]));
|
NewVal := Round6(StrToFloat(VEVars.Values[VarNames(i)]));
|
||||||
// if NewVal < 0 then NewVal := 0;
|
// if NewVal < 0 then NewVal := 0;
|
||||||
VEVars.Values[VarNames[i]] := Format('%.6g', [NewVal]);
|
VEVars.Values[VarNames(i)] := Format('%.6g', [NewVal]);
|
||||||
|
|
||||||
{ If it's not the same as the old value and it was valid }
|
{ If it's not the same as the old value and it was valid }
|
||||||
if (NewVal <> OldVal) and Allow then
|
if (NewVal <> OldVal) and Allow then
|
||||||
@ -2477,7 +2503,7 @@ begin
|
|||||||
// EditedVariation := i;
|
// EditedVariation := i;
|
||||||
cp.xform[SelectedTriangle].vars[i] := NewVal;
|
cp.xform[SelectedTriangle].vars[i] := NewVal;
|
||||||
// VarNormalize(cp);
|
// VarNormalize(cp);
|
||||||
VEVars.Values[VarNames[i]] := Format('%.6g', [cp.xform[SelectedTriangle].vars[i]]);
|
VEVars.Values[VarNames(i)] := Format('%.6g', [cp.xform[SelectedTriangle].vars[i]]);
|
||||||
ShowSelectedInfo;
|
ShowSelectedInfo;
|
||||||
UpdateFlame(True);
|
UpdateFlame(True);
|
||||||
end;
|
end;
|
||||||
@ -2497,17 +2523,17 @@ begin
|
|||||||
OldVal := Round6(cp.xform[SelectedTriangle].vars[i]);
|
OldVal := Round6(cp.xform[SelectedTriangle].vars[i]);
|
||||||
{ Test that it's a valid floating point number }
|
{ Test that it's a valid floating point number }
|
||||||
try
|
try
|
||||||
StrToFloat(VEVars.Values[VarNames[i]]);
|
StrToFloat(VEVars.Values[VarNames(i)]);
|
||||||
except on Exception do
|
except on Exception do
|
||||||
begin
|
begin
|
||||||
{ It's not, so we restore the old value }
|
{ It's not, so we restore the old value }
|
||||||
VEVars.Values[VarNames[i]] := Format('%.6g', [OldVal]);
|
VEVars.Values[VarNames(i)] := Format('%.6g', [OldVal]);
|
||||||
Allow := False;
|
Allow := False;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
NewVal := Round6(StrToFloat(VEVars.Values[VarNames[i]]));
|
NewVal := Round6(StrToFloat(VEVars.Values[VarNames(i)]));
|
||||||
// if NewVal < 0 then NewVal := 0;
|
// if NewVal < 0 then NewVal := 0;
|
||||||
VEVars.Values[VarNames[i]] := Format('%.6g', [NewVal]);
|
VEVars.Values[VarNames(i)] := Format('%.6g', [NewVal]);
|
||||||
|
|
||||||
{ If it's not the same as the old value and it was valid }
|
{ If it's not the same as the old value and it was valid }
|
||||||
if (NewVal <> OldVal) and Allow then
|
if (NewVal <> OldVal) and Allow then
|
||||||
@ -2516,7 +2542,7 @@ begin
|
|||||||
// EditedVariation := i;
|
// EditedVariation := i;
|
||||||
cp.xform[SelectedTriangle].vars[i] := NewVal;
|
cp.xform[SelectedTriangle].vars[i] := NewVal;
|
||||||
// VarNormalize(cp);
|
// VarNormalize(cp);
|
||||||
VEVars.Values[VarNames[i]] := Format('%.6g', [cp.xform[SelectedTriangle].vars[i]]);
|
VEVars.Values[VarNames(i)] := Format('%.6g', [cp.xform[SelectedTriangle].vars[i]]);
|
||||||
ShowSelectedInfo;
|
ShowSelectedInfo;
|
||||||
UpdateFlame(True);
|
UpdateFlame(True);
|
||||||
end;
|
end;
|
||||||
@ -2535,17 +2561,17 @@ begin
|
|||||||
OldVal := Round6(cp.xform[SelectedTriangle].vars[i]);
|
OldVal := Round6(cp.xform[SelectedTriangle].vars[i]);
|
||||||
{ Test that it's a valid floating point number }
|
{ Test that it's a valid floating point number }
|
||||||
try
|
try
|
||||||
StrToFloat(VEVars.Values[VarNames[i]]);
|
StrToFloat(VEVars.Values[VarNames(i)]);
|
||||||
except on Exception do
|
except on Exception do
|
||||||
begin
|
begin
|
||||||
{ It's not, so we restore the old value }
|
{ It's not, so we restore the old value }
|
||||||
VEVars.Values[VarNames[i]] := Format('%.6g', [OldVal]);
|
VEVars.Values[VarNames(i)] := Format('%.6g', [OldVal]);
|
||||||
Allow := False;
|
Allow := False;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
NewVal := Round6(StrToFloat(VEVars.Values[VarNames[i]]));
|
NewVal := Round6(StrToFloat(VEVars.Values[VarNames(i)]));
|
||||||
// if NewVal < 0 then NewVal := 0;
|
// if NewVal < 0 then NewVal := 0;
|
||||||
VEVars.Values[VarNames[i]] := Format('%.6g', [NewVal]);
|
VEVars.Values[VarNames(i)] := Format('%.6g', [NewVal]);
|
||||||
|
|
||||||
{ If it's not the same as the old value and it was valid }
|
{ If it's not the same as the old value and it was valid }
|
||||||
if (NewVal <> OldVal) and Allow then
|
if (NewVal <> OldVal) and Allow then
|
||||||
@ -2554,7 +2580,7 @@ begin
|
|||||||
// EditedVariation := i;
|
// EditedVariation := i;
|
||||||
cp.xform[SelectedTriangle].vars[i] := NewVal;
|
cp.xform[SelectedTriangle].vars[i] := NewVal;
|
||||||
// VarNormalize(cp);
|
// VarNormalize(cp);
|
||||||
VEVars.Values[VarNames[i]] := Format('%.6g', [cp.xform[SelectedTriangle].vars[i]]);
|
VEVars.Values[VarNames(i)] := Format('%.6g', [cp.xform[SelectedTriangle].vars[i]]);
|
||||||
ShowSelectedInfo;
|
ShowSelectedInfo;
|
||||||
UpdateFlame(True);
|
UpdateFlame(True);
|
||||||
end;
|
end;
|
||||||
@ -2762,7 +2788,8 @@ begin
|
|||||||
// if (key in [VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN,VK_PRIOR,VK_NEXT,VK_HOME,VK_END]) and
|
// if (key in [VK_LEFT,VK_RIGHT,VK_UP,VK_DOWN,VK_PRIOR,VK_NEXT,VK_HOME,VK_END]) and
|
||||||
// if VEVars.Focused = false then
|
// if VEVars.Focused = false then
|
||||||
// if FocusedControl = VEVars then
|
// if FocusedControl = VEVars then
|
||||||
if PageControl.TabIndex <> 2 then
|
if (PageControl.TabIndex <> 2) or // variations
|
||||||
|
(PageControl.TabIndex <> 3) then // variables
|
||||||
begin
|
begin
|
||||||
// MainForm.UpdateUndo;
|
// MainForm.UpdateUndo;
|
||||||
case key of
|
case key of
|
||||||
@ -2953,7 +2980,7 @@ begin
|
|||||||
varMM:=true;
|
varMM:=true;
|
||||||
|
|
||||||
cp.xform[SelectedTriangle].vars[varDragIndex] := v;
|
cp.xform[SelectedTriangle].vars[varDragIndex] := v;
|
||||||
VEVars.Values[VarNames[varDragIndex]] := Format('%.6g', [v]);
|
VEVars.Values[VarNames(varDragIndex)] := Format('%.6g', [v]);
|
||||||
|
|
||||||
HasChanged := True;
|
HasChanged := True;
|
||||||
UpdateFlameX;
|
UpdateFlameX;
|
||||||
@ -2986,7 +3013,7 @@ begin
|
|||||||
|
|
||||||
// i := EditForm.VEVars.Row - 1;
|
// i := EditForm.VEVars.Row - 1;
|
||||||
cp.xform[SelectedTriangle].vars[varDragIndex] := 0;
|
cp.xform[SelectedTriangle].vars[varDragIndex] := 0;
|
||||||
VEVars.Values[VarNames[varDragIndex]] := '0';
|
VEVars.Values[VarNames(varDragIndex)] := '0';
|
||||||
HasChanged := True;
|
HasChanged := True;
|
||||||
UpdateFlameX;
|
UpdateFlameX;
|
||||||
end;
|
end;
|
||||||
@ -3072,5 +3099,118 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TEditForm.vleVariablesExit(Sender: TObject);
|
||||||
|
var
|
||||||
|
Allow: boolean;
|
||||||
|
i: integer;
|
||||||
|
NewVal, OldVal: double;
|
||||||
|
begin
|
||||||
|
Allow := True;
|
||||||
|
|
||||||
|
i := vleVariables.Row;
|
||||||
|
|
||||||
|
cp.xform[SelectedTriangle].GetVariable(vleVariables.Keys[i], OldVal);
|
||||||
|
{ Test that it's a valid floating point number }
|
||||||
|
try
|
||||||
|
StrToFloat(vleVariables.Values[vleVariables.Keys[i]]);
|
||||||
|
except on Exception do
|
||||||
|
begin
|
||||||
|
{ It's not, so we restore the old value }
|
||||||
|
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [OldVal]);
|
||||||
|
Allow := False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
NewVal := Round6(StrToFloat(vleVariables.Values[vleVariables.Keys[i]]));
|
||||||
|
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [NewVal]);
|
||||||
|
|
||||||
|
{ If it's not the same as the old value and it was valid }
|
||||||
|
if (NewVal <> OldVal) and Allow then
|
||||||
|
begin
|
||||||
|
MainForm.UpdateUndo;
|
||||||
|
cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[i], NewVal);
|
||||||
|
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [NewVal]);
|
||||||
|
ShowSelectedInfo;
|
||||||
|
UpdateFlame(True);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TEditForm.vleVariablesKeyPress(Sender: TObject; var Key: Char);
|
||||||
|
var
|
||||||
|
Allow: boolean;
|
||||||
|
i: integer;
|
||||||
|
NewVal, OldVal: double;
|
||||||
|
begin
|
||||||
|
if key <> #13 then
|
||||||
|
Exit;
|
||||||
|
|
||||||
|
key := #0;
|
||||||
|
|
||||||
|
Allow := True;
|
||||||
|
|
||||||
|
i := vleVariables.Row;
|
||||||
|
|
||||||
|
cp.xform[SelectedTriangle].GetVariable(vleVariables.Keys[i], OldVal);
|
||||||
|
{ Test that it's a valid floating point number }
|
||||||
|
try
|
||||||
|
StrToFloat(vleVariables.Values[vleVariables.Keys[i]]);
|
||||||
|
except on Exception do
|
||||||
|
begin
|
||||||
|
{ It's not, so we restore the old value }
|
||||||
|
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [OldVal]);
|
||||||
|
Allow := False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
NewVal := Round6(StrToFloat(vleVariables.Values[vleVariables.Keys[i]]));
|
||||||
|
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [NewVal]);
|
||||||
|
|
||||||
|
{ If it's not the same as the old value and it was valid }
|
||||||
|
if (NewVal <> OldVal) and Allow then
|
||||||
|
begin
|
||||||
|
MainForm.UpdateUndo;
|
||||||
|
cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[i], NewVal);
|
||||||
|
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [NewVal]);
|
||||||
|
ShowSelectedInfo;
|
||||||
|
UpdateFlame(True);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TEditForm.vleVariablesValidate(Sender: TObject; ACol, ARow: Integer; const KeyName, KeyValue: string);
|
||||||
|
var
|
||||||
|
Allow: boolean;
|
||||||
|
i: integer;
|
||||||
|
NewVal, OldVal: double;
|
||||||
|
begin
|
||||||
|
Allow := True;
|
||||||
|
|
||||||
|
i := vleVariables.Row;
|
||||||
|
|
||||||
|
cp.xform[SelectedTriangle].GetVariable(vleVariables.Keys[i], OldVal);
|
||||||
|
{ Test that it's a valid floating point number }
|
||||||
|
try
|
||||||
|
StrToFloat(vleVariables.Values[vleVariables.Keys[i]]);
|
||||||
|
except on Exception do
|
||||||
|
begin
|
||||||
|
{ It's not, so we restore the old value }
|
||||||
|
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [OldVal]);
|
||||||
|
Allow := False;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
NewVal := Round6(StrToFloat(vleVariables.Values[vleVariables.Keys[i]]));
|
||||||
|
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [NewVal]);
|
||||||
|
|
||||||
|
{ If it's not the same as the old value and it was valid }
|
||||||
|
if (NewVal <> OldVal) and Allow then
|
||||||
|
begin
|
||||||
|
MainForm.UpdateUndo;
|
||||||
|
cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[i], NewVal);
|
||||||
|
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [NewVal]);
|
||||||
|
ShowSelectedInfo;
|
||||||
|
UpdateFlame(True);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -49,6 +49,13 @@ object RenderForm: TRenderForm
|
|||||||
OnShow = FormShow
|
OnShow = FormShow
|
||||||
PixelsPerInch = 96
|
PixelsPerInch = 96
|
||||||
TextHeight = 13
|
TextHeight = 13
|
||||||
|
object Label6: TLabel
|
||||||
|
Left = 204
|
||||||
|
Top = 340
|
||||||
|
Width = 118
|
||||||
|
Height = 13
|
||||||
|
Caption = 'TestValue Nr Of Threads'
|
||||||
|
end
|
||||||
object ProgressBar: TProgressBar
|
object ProgressBar: TProgressBar
|
||||||
Left = 0
|
Left = 0
|
||||||
Top = 392
|
Top = 392
|
||||||
@ -181,8 +188,10 @@ object RenderForm: TRenderForm
|
|||||||
Top = 20
|
Top = 20
|
||||||
Width = 73
|
Width = 73
|
||||||
Height = 21
|
Height = 21
|
||||||
|
BiDiMode = bdRightToLeftNoAlign
|
||||||
Enabled = False
|
Enabled = False
|
||||||
ItemHeight = 13
|
ItemHeight = 13
|
||||||
|
ParentBiDiMode = False
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
OnChange = txtWidthChange
|
OnChange = txtWidthChange
|
||||||
Items.Strings = (
|
Items.Strings = (
|
||||||
@ -199,8 +208,10 @@ object RenderForm: TRenderForm
|
|||||||
Top = 44
|
Top = 44
|
||||||
Width = 73
|
Width = 73
|
||||||
Height = 21
|
Height = 21
|
||||||
|
BiDiMode = bdRightToLeftNoAlign
|
||||||
Enabled = False
|
Enabled = False
|
||||||
ItemHeight = 13
|
ItemHeight = 13
|
||||||
|
ParentBiDiMode = False
|
||||||
TabOrder = 2
|
TabOrder = 2
|
||||||
OnChange = txtHeightChange
|
OnChange = txtHeightChange
|
||||||
Items.Strings = (
|
Items.Strings = (
|
||||||
@ -247,7 +258,9 @@ object RenderForm: TRenderForm
|
|||||||
Top = 68
|
Top = 68
|
||||||
Width = 57
|
Width = 57
|
||||||
Height = 21
|
Height = 21
|
||||||
|
BiDiMode = bdRightToLeft
|
||||||
Enabled = False
|
Enabled = False
|
||||||
|
ParentBiDiMode = False
|
||||||
ReadOnly = True
|
ReadOnly = True
|
||||||
TabOrder = 2
|
TabOrder = 2
|
||||||
Text = '2'
|
Text = '2'
|
||||||
@ -258,6 +271,8 @@ object RenderForm: TRenderForm
|
|||||||
Top = 44
|
Top = 44
|
||||||
Width = 57
|
Width = 57
|
||||||
Height = 21
|
Height = 21
|
||||||
|
BiDiMode = bdRightToLeft
|
||||||
|
ParentBiDiMode = False
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
OnChange = txtFilterRadiusChange
|
OnChange = txtFilterRadiusChange
|
||||||
end
|
end
|
||||||
@ -266,6 +281,8 @@ object RenderForm: TRenderForm
|
|||||||
Top = 20
|
Top = 20
|
||||||
Width = 57
|
Width = 57
|
||||||
Height = 21
|
Height = 21
|
||||||
|
BiDiMode = bdRightToLeft
|
||||||
|
ParentBiDiMode = False
|
||||||
TabOrder = 0
|
TabOrder = 0
|
||||||
OnChange = txtDensityChange
|
OnChange = txtDensityChange
|
||||||
end
|
end
|
||||||
@ -314,8 +331,10 @@ object RenderForm: TRenderForm
|
|||||||
Top = 44
|
Top = 44
|
||||||
Width = 57
|
Width = 57
|
||||||
Height = 21
|
Height = 21
|
||||||
|
BiDiMode = bdRightToLeftNoAlign
|
||||||
Enabled = False
|
Enabled = False
|
||||||
ItemHeight = 13
|
ItemHeight = 13
|
||||||
|
ParentBiDiMode = False
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
Items.Strings = (
|
Items.Strings = (
|
||||||
'32'
|
'32'
|
||||||
@ -439,6 +458,16 @@ object RenderForm: TRenderForm
|
|||||||
Caption = 'Post render'
|
Caption = 'Post render'
|
||||||
TabOrder = 9
|
TabOrder = 9
|
||||||
end
|
end
|
||||||
|
object edtNrThreads: TEdit
|
||||||
|
Left = 336
|
||||||
|
Top = 336
|
||||||
|
Width = 73
|
||||||
|
Height = 21
|
||||||
|
BiDiMode = bdRightToLeft
|
||||||
|
ParentBiDiMode = False
|
||||||
|
TabOrder = 13
|
||||||
|
Text = '1'
|
||||||
|
end
|
||||||
object SaveDialog: TSaveDialog
|
object SaveDialog: TSaveDialog
|
||||||
Left = 368
|
Left = 368
|
||||||
Top = 256
|
Top = 256
|
||||||
|
@ -108,8 +108,8 @@ var
|
|||||||
defFlameFile: string;
|
defFlameFile: string;
|
||||||
SymmetryType: integer;
|
SymmetryType: integer;
|
||||||
SymmetryOrder: integer;
|
SymmetryOrder: integer;
|
||||||
Variations: array[0..NRVAR - 1] of boolean;
|
Variations: array[0..63] of boolean;
|
||||||
VariationOptions: integer;
|
VariationOptions: int64;
|
||||||
{ For random gradients }
|
{ For random gradients }
|
||||||
MinNodes, MaxNodes, MinHue, MaxHue, MinSat, MaxSat, MinLum, MaxLum: integer;
|
MinNodes, MaxNodes, MinHue, MaxHue, MinSat, MaxSat, MinLum, MaxLum: integer;
|
||||||
FixedReference: boolean;
|
FixedReference: boolean;
|
||||||
|
@ -700,7 +700,7 @@ begin
|
|||||||
Clipboard.SetTextBuf(PChar(gradstr.text));
|
Clipboard.SetTextBuf(PChar(gradstr.text));
|
||||||
btnPaste.enabled := true;
|
btnPaste.enabled := true;
|
||||||
mnuPaste.enabled := true;
|
mnuPaste.enabled := true;
|
||||||
MainForm.btnPaste.enabled := False;
|
// MainForm.btnPaste.enabled := False;
|
||||||
MainForm.mnuPaste.enabled := False;
|
MainForm.mnuPaste.enabled := False;
|
||||||
finally
|
finally
|
||||||
gradstr.free
|
gradstr.free
|
||||||
|
@ -60,9 +60,9 @@ uses
|
|||||||
|
|
||||||
type
|
type
|
||||||
TRGB = packed Record
|
TRGB = packed Record
|
||||||
red: byte;
|
|
||||||
green: byte;
|
|
||||||
blue: byte;
|
blue: byte;
|
||||||
|
green: byte;
|
||||||
|
red: byte;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
PByteArray = ^TByteArray;
|
PByteArray = ^TByteArray;
|
||||||
@ -146,8 +146,8 @@ end;
|
|||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
function TImageMaker.GetImage: TBitmap;
|
function TImageMaker.GetImage: TBitmap;
|
||||||
begin
|
begin
|
||||||
Result := GetTransparentImage;
|
// Result := GetTransparentImage;
|
||||||
// Result := FBitmap;
|
Result := FBitmap;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -384,6 +384,9 @@ var
|
|||||||
area: double;
|
area: double;
|
||||||
MaxA: int64;
|
MaxA: int64;
|
||||||
ACount: double;
|
ACount: double;
|
||||||
|
RCount: double;
|
||||||
|
GCount: double;
|
||||||
|
BCount: double;
|
||||||
offsetLow: double;
|
offsetLow: double;
|
||||||
offsetHigh: double;
|
offsetHigh: double;
|
||||||
densLow: double;
|
densLow: double;
|
||||||
@ -463,6 +466,9 @@ begin
|
|||||||
fp[2] := fp[2] + filterValue * ls * FBuckets[filterpos].Blue;
|
fp[2] := fp[2] + filterValue * ls * FBuckets[filterpos].Blue;
|
||||||
fp[3] := fp[3] + filterValue * ls * FBuckets[filterpos].Count;
|
fp[3] := fp[3] + filterValue * ls * FBuckets[filterpos].Count;
|
||||||
ACount := ACount + filterValue * FBuckets[filterpos].Count;
|
ACount := ACount + filterValue * FBuckets[filterpos].Count;
|
||||||
|
// RCount := RCount + filterValue * FBuckets[bucketpos].Red;
|
||||||
|
// GCount := GCount + filterValue * FBuckets[bucketpos].Green;
|
||||||
|
// BCount := BCount + filterValue * FBuckets[bucketpos].Blue;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -478,7 +484,9 @@ begin
|
|||||||
fp[2] := ls * FBuckets[bucketpos].Blue;
|
fp[2] := ls * FBuckets[bucketpos].Blue;
|
||||||
fp[3] := ls * FBuckets[bucketpos].Count * fcp.white_level;
|
fp[3] := ls * FBuckets[bucketpos].Count * fcp.white_level;
|
||||||
ACount := FBuckets[bucketpos].Count;
|
ACount := FBuckets[bucketpos].Count;
|
||||||
|
RCount := FBuckets[bucketpos].Red;
|
||||||
|
GCount := FBuckets[bucketpos].Green;
|
||||||
|
BCount := FBuckets[bucketpos].Blue;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Inc(bucketpos, FOversample);
|
Inc(bucketpos, FOversample);
|
||||||
@ -533,7 +541,26 @@ begin
|
|||||||
bi := 0
|
bi := 0
|
||||||
else if (bi > 255) then
|
else if (bi > 255) then
|
||||||
bi := 255;
|
bi := 255;
|
||||||
|
(*
|
||||||
|
|
||||||
|
ri := Round(RCount/ACount) + (ai * bgi[0]) shr 8;
|
||||||
|
if (ri < 0) then
|
||||||
|
ri := 0
|
||||||
|
else if (ri > 255) then
|
||||||
|
ri := 255;
|
||||||
|
|
||||||
|
gi := Round(GCount/ACount) + (ai * bgi[1]) shr 8;
|
||||||
|
if (gi < 0) then
|
||||||
|
gi := 0
|
||||||
|
else if (gi > 255) then
|
||||||
|
gi := 255;
|
||||||
|
|
||||||
|
bi := Round(BCount/ACount) + (ai * bgi[2]) shr 8;
|
||||||
|
if (bi < 0) then
|
||||||
|
bi := 0
|
||||||
|
else if (bi > 255) then
|
||||||
|
bi := 255;
|
||||||
|
*)
|
||||||
Row[j].red := ri;
|
Row[j].red := ri;
|
||||||
Row[j].green := gi;
|
Row[j].green := gi;
|
||||||
Row[j].blue := bi;
|
Row[j].blue := bi;
|
||||||
@ -545,8 +572,6 @@ begin
|
|||||||
Inc(bucketpos, (FOversample - 1) * FBucketWidth);
|
Inc(bucketpos, (FOversample - 1) * FBucketWidth);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
FBitmap.PixelFormat := pf24bit;
|
|
||||||
|
|
||||||
Progress(1);
|
Progress(1);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -611,8 +636,7 @@ begin
|
|||||||
if assigned(FTransparentImage) then
|
if assigned(FTransparentImage) then
|
||||||
FTransparentImage.Free;
|
FTransparentImage.Free;
|
||||||
|
|
||||||
FTransparentImage := tBitmap.Create;
|
FTransparentImage := TBitmap.Create;
|
||||||
// FTransparentImage.PixelFormat := pf24bit;
|
|
||||||
|
|
||||||
FTransparentImage.Width := Fcp.Width;
|
FTransparentImage.Width := Fcp.Width;
|
||||||
FTransparentImage.Height := Fcp.Height;
|
FTransparentImage.Height := Fcp.Height;
|
||||||
|
@ -110,7 +110,7 @@ var
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Main, Global, Registry, Editor, Adjust, XForm;
|
Main, Global, Registry, Editor, Adjust, XFormMan;
|
||||||
|
|
||||||
{$R *.DFM}
|
{$R *.DFM}
|
||||||
|
|
||||||
@ -300,7 +300,7 @@ begin
|
|||||||
mutants[i].xform[j].c[1][1] := cps[0].xform[j].c[1][1];
|
mutants[i].xform[j].c[1][1] := cps[0].xform[j].c[1][1];
|
||||||
mutants[i].xform[j].c[2][0] := cps[0].xform[j].c[2][0];
|
mutants[i].xform[j].c[2][0] := cps[0].xform[j].c[2][0];
|
||||||
mutants[i].xform[j].c[2][1] := cps[0].xform[j].c[2][1];
|
mutants[i].xform[j].c[2][1] := cps[0].xform[j].c[2][1];
|
||||||
for k := 0 to NRVISVAR - 1 do
|
for k := 0 to NRVAR - 1 do
|
||||||
mutants[i].xform[j].vars[k] := cps[0].xform[j].vars[k];
|
mutants[i].xform[j].vars[k] := cps[0].xform[j].vars[k];
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -354,8 +354,8 @@ var
|
|||||||
begin
|
begin
|
||||||
cmbTrend.Items.clear;
|
cmbTrend.Items.clear;
|
||||||
cmbTrend.AddItem('Random', Tobject(vRandom));
|
cmbTrend.AddItem('Random', Tobject(vRandom));
|
||||||
for i:= 0 to NRVISVAR -1 do begin
|
for i:= 0 to NRVAR -1 do begin
|
||||||
cmbTrend.AddItem(varnames[i], Tobject(i));
|
cmbTrend.AddItem(varnames(i), Tobject(i));
|
||||||
end;
|
end;
|
||||||
|
|
||||||
bm := TBitMap.Create;
|
bm := TBitMap.Create;
|
||||||
|
@ -209,10 +209,11 @@ var
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
|
||||||
Main, Global, Editor, ControlPoint, XForm;
|
|
||||||
{$R *.DFM}
|
{$R *.DFM}
|
||||||
|
|
||||||
|
uses
|
||||||
|
Main, Global, Editor, ControlPoint, XFormMan;
|
||||||
|
|
||||||
procedure TOptionsForm.btnCancelClick(Sender: TObject);
|
procedure TOptionsForm.btnCancelClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
Close;
|
Close;
|
||||||
@ -274,7 +275,7 @@ begin
|
|||||||
|
|
||||||
{ Variations tab }
|
{ Variations tab }
|
||||||
UnpackVariations(VariationOptions);
|
UnpackVariations(VariationOptions);
|
||||||
for i := 0 to NRVISVAR -1 do
|
for i := 0 to NRVAR -1 do
|
||||||
clbVarEnabled.Checked[i] := Variations[i];
|
clbVarEnabled.Checked[i] := Variations[i];
|
||||||
|
|
||||||
{ Gradient tab }
|
{ Gradient tab }
|
||||||
@ -318,7 +319,7 @@ begin
|
|||||||
|
|
||||||
{ Variations tab }
|
{ Variations tab }
|
||||||
{ Get option values from controls. Disallow bad values }
|
{ Get option values from controls. Disallow bad values }
|
||||||
for i := 0 to NRVISVAR -1 do
|
for i := 0 to NRVAR -1 do
|
||||||
Variations[i] := clbVarEnabled.Checked[i];
|
Variations[i] := clbVarEnabled.Checked[i];
|
||||||
|
|
||||||
v := PackVariations;
|
v := PackVariations;
|
||||||
@ -471,7 +472,7 @@ procedure TOptionsForm.btnSetAllClick(Sender: TObject);
|
|||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
for i := 0 to NRVISVAR - 1 do
|
for i := 0 to NRVAR - 1 do
|
||||||
clbVarEnabled.Checked[i] := True;
|
clbVarEnabled.Checked[i] := True;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -479,7 +480,7 @@ procedure TOptionsForm.btnClearAllClick(Sender: TObject);
|
|||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
for i := 0 to NRVISVAR - 1 do
|
for i := 0 to NRVAR - 1 do
|
||||||
clbVarEnabled.Checked[i] := False;
|
clbVarEnabled.Checked[i] := False;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -582,8 +583,8 @@ procedure TOptionsForm.FormCreate(Sender: TObject);
|
|||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
for i:= 0 to NRVISVAR - 1 do begin
|
for i:= 0 to NRVAR - 1 do begin
|
||||||
clbVarEnabled.AddItem(varnames[i],nil);
|
clbVarEnabled.AddItem(varnames(i),nil);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -26,7 +26,7 @@ procedure SaveSettings;
|
|||||||
|
|
||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses Windows, SysUtils, Forms, Registry, Global, Dialogs, XForm;
|
uses Windows, SysUtils, Forms, Registry, Global, Dialogs, XFormMan;
|
||||||
|
|
||||||
procedure UnpackVariations(v: integer);
|
procedure UnpackVariations(v: integer);
|
||||||
{ Unpacks the variation options form an integer }
|
{ Unpacks the variation options form an integer }
|
||||||
|
@ -28,7 +28,7 @@ function RandomFlame(SourceCP: TControlPoint= nil; algorithm: integer = 0): TCon
|
|||||||
implementation
|
implementation
|
||||||
|
|
||||||
uses
|
uses
|
||||||
SysUtils, Global, cmap, MyTypes, GradientHlpr, XForm;
|
SysUtils, Global, cmap, MyTypes, GradientHlpr, XFormMan;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
procedure RandomGradient(SourceCP, DestCP: TControlPoint);
|
procedure RandomGradient(SourceCP, DestCP: TControlPoint);
|
||||||
@ -86,7 +86,7 @@ begin
|
|||||||
RandSeed := MainSeed;
|
RandSeed := MainSeed;
|
||||||
|
|
||||||
VarPossible := false;
|
VarPossible := false;
|
||||||
for j := 0 to NRVISVAR - 1 do begin
|
for j := 0 to NRVAR - 1 do begin
|
||||||
VarPossible := VarPossible or Variations[j];
|
VarPossible := VarPossible or Variations[j];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -96,11 +96,11 @@ begin
|
|||||||
|
|
||||||
if VarPossible then begin
|
if VarPossible then begin
|
||||||
repeat
|
repeat
|
||||||
a := random(NRVISVAR);
|
a := random(NRVAR);
|
||||||
until Variations[a];
|
until Variations[a];
|
||||||
|
|
||||||
repeat
|
repeat
|
||||||
b := random(NRVISVAR);
|
b := random(NRVAR);
|
||||||
until Variations[b];
|
until Variations[b];
|
||||||
end else begin
|
end else begin
|
||||||
a := 0;
|
a := 0;
|
||||||
|
@ -21,8 +21,9 @@ interface
|
|||||||
|
|
||||||
uses
|
uses
|
||||||
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
||||||
ExtCtrls, StdCtrls, ControlPoint, cmap, Buttons, ComCtrls, ToolWin,
|
ExtCtrls, StdCtrls, ControlPoint, Buttons, ComCtrls, ToolWin,
|
||||||
Menus, atScript, atPascal, AdvMemo, Advmps, XForm, GradientHlpr;
|
Menus, atScript, atPascal, AdvMemo, Advmps, XFormMan, XForm, GradientHlpr,
|
||||||
|
cmap, Gradient;
|
||||||
|
|
||||||
const NCPS = 10;
|
const NCPS = 10;
|
||||||
type
|
type
|
||||||
@ -324,7 +325,7 @@ implementation
|
|||||||
}
|
}
|
||||||
|
|
||||||
uses Main, Editor, Adjust, Global, Mutate, Registry, Preview,
|
uses Main, Editor, Adjust, Global, Mutate, Registry, Preview,
|
||||||
ScriptRender, {Gradient,} ap_math, ap_classes, ap_sysutils, MyTypes,
|
ScriptRender, ap_math, ap_classes, ap_sysutils, MyTypes,
|
||||||
SavePreset, ap_windows, ap_FileCtrl, bmdll32;
|
SavePreset, ap_windows, ap_FileCtrl, bmdll32;
|
||||||
|
|
||||||
{$R *.DFM}
|
{$R *.DFM}
|
||||||
@ -1683,7 +1684,7 @@ begin
|
|||||||
with AMachine do
|
with AMachine do
|
||||||
begin
|
begin
|
||||||
i := integer(Variation);
|
i := integer(Variation);
|
||||||
if (i >= NRVISVAR) or (i < 0) then
|
if (i >= NRVAR) or (i < 0) then
|
||||||
i := -1;
|
i := -1;
|
||||||
ReturnOutputArg(i);
|
ReturnOutputArg(i);
|
||||||
end
|
end
|
||||||
@ -1696,10 +1697,10 @@ begin
|
|||||||
with AMachine do
|
with AMachine do
|
||||||
begin
|
begin
|
||||||
i := GetInputArgAsInteger(0);
|
i := GetInputArgAsInteger(0);
|
||||||
if (i < 0) or (i >= NRVISVAR) then
|
if (i < 0) or (i >= NRVAR) then
|
||||||
i := NRVISVAR ;
|
i := NRVAR ;
|
||||||
Variation := TVariation(i);
|
Variation := TVariation(i);
|
||||||
if i = NRVISVAR then
|
if i = NRVAR then
|
||||||
MainForm.mnuVRandom.checked := True
|
MainForm.mnuVRandom.checked := True
|
||||||
else
|
else
|
||||||
MainForm.VarMenus[i].Checked := True;
|
MainForm.VarMenus[i].Checked := True;
|
||||||
|
@ -30,8 +30,6 @@ object ScriptRenderForm: TScriptRenderForm
|
|||||||
Top = 8
|
Top = 8
|
||||||
Width = 249
|
Width = 249
|
||||||
Height = 13
|
Height = 13
|
||||||
Min = 0
|
|
||||||
Max = 100
|
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
66
2.10/Source/VarTest.pas
Normal file
66
2.10/Source/VarTest.pas
Normal file
@ -0,0 +1,66 @@
|
|||||||
|
unit VarTest;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
BaseVariation, XFormMan;
|
||||||
|
|
||||||
|
type
|
||||||
|
TVariationTest = class(TBaseVariation)
|
||||||
|
public
|
||||||
|
class function GetName: string; override;
|
||||||
|
class function GetInstance: TBaseVariation; override;
|
||||||
|
|
||||||
|
procedure CalcFunction; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
math;
|
||||||
|
|
||||||
|
{ TVariationTest }
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure TVariationTest.CalcFunction;
|
||||||
|
const
|
||||||
|
EPS = 1E-10;
|
||||||
|
var
|
||||||
|
r : double;
|
||||||
|
// dx, dy, dx2: double;
|
||||||
|
Angle: double;
|
||||||
|
begin
|
||||||
|
r := sqrt(FTx^ * FTx^ + FTy^ * FTy^);
|
||||||
|
if (FTx^ < -EPS) or (FTx^ > EPS) or (FTy^ < -EPS) or (FTy^ > EPS) then
|
||||||
|
Angle := arctan2(FTx^, FTy^)
|
||||||
|
else
|
||||||
|
Angle := 0.0;
|
||||||
|
|
||||||
|
Angle := Angle + Max(0, (3 - r)) * sin(2 * r);
|
||||||
|
|
||||||
|
// r:= R - 0.04 * sin(6.2 * R - 1) - 0.008 * R;
|
||||||
|
|
||||||
|
FPx^ := FPx^ + vvar * r * cos(Angle);
|
||||||
|
FPy^ := FPy^ + vvar * r * sin(Angle);
|
||||||
|
|
||||||
|
// FPx^ := FPx^ + vvar * FTx^;
|
||||||
|
// FPy^ := FPy^ + vvar * FTy^;
|
||||||
|
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TVariationTest.GetInstance: TBaseVariation;
|
||||||
|
begin
|
||||||
|
Result := TVariationTest.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TVariationTest.GetName: string;
|
||||||
|
begin
|
||||||
|
Result := 'test';
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
initialization
|
||||||
|
RegisterVariation(TVariationTest);
|
||||||
|
end.
|
@ -3,44 +3,7 @@ unit XForm;
|
|||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
atPascal;
|
XFormMan, baseVariation;
|
||||||
|
|
||||||
|
|
||||||
const
|
|
||||||
NRVISVAR = 29;
|
|
||||||
NRVAR = 29;
|
|
||||||
|
|
||||||
varnames: array[0..NRVAR - 1] of PChar = (
|
|
||||||
'linear',
|
|
||||||
'sinusoidal',
|
|
||||||
'spherical',
|
|
||||||
'swirl',
|
|
||||||
'horseshoe',
|
|
||||||
'polar',
|
|
||||||
'handkerchief',
|
|
||||||
'heart',
|
|
||||||
'disc',
|
|
||||||
'spiral',
|
|
||||||
'hyperbolic',
|
|
||||||
'diamond',
|
|
||||||
'ex',
|
|
||||||
'julia',
|
|
||||||
'bent',
|
|
||||||
'waves',
|
|
||||||
'fisheye',
|
|
||||||
'popcorn',
|
|
||||||
'exponential',
|
|
||||||
'power',
|
|
||||||
'cosine',
|
|
||||||
'rings',
|
|
||||||
'fan',
|
|
||||||
'triblob',
|
|
||||||
'daisy',
|
|
||||||
'checkers',
|
|
||||||
'crot',
|
|
||||||
'testscript',
|
|
||||||
'test'
|
|
||||||
);
|
|
||||||
|
|
||||||
type
|
type
|
||||||
TCalcMethod = procedure of object;
|
TCalcMethod = procedure of object;
|
||||||
@ -62,7 +25,8 @@ type
|
|||||||
TXForm = class
|
TXForm = class
|
||||||
private
|
private
|
||||||
FNrFunctions: Integer;
|
FNrFunctions: Integer;
|
||||||
FFunctionList: array[0..NRVAR-1] of TCalcMethod;
|
FFunctionList: array of TCalcMethod;
|
||||||
|
FCalcFunctionList: array[0..64] of TCalcMethod;
|
||||||
|
|
||||||
FTx, FTy: double;
|
FTx, FTy: double;
|
||||||
FPx, FPy: double;
|
FPx, FPy: double;
|
||||||
@ -74,6 +38,8 @@ type
|
|||||||
CalculateLength: boolean;
|
CalculateLength: boolean;
|
||||||
CalculateSinCos: boolean;
|
CalculateSinCos: boolean;
|
||||||
|
|
||||||
|
FRegVariations: array of TBaseVariation;
|
||||||
|
|
||||||
procedure Linear; // var[0]
|
procedure Linear; // var[0]
|
||||||
procedure Sinusoidal; // var[1]
|
procedure Sinusoidal; // var[1]
|
||||||
procedure Spherical; // var[2]
|
procedure Spherical; // var[2]
|
||||||
@ -101,25 +67,25 @@ type
|
|||||||
procedure Daisy; // var[24]
|
procedure Daisy; // var[24]
|
||||||
procedure Checkers; // var[25]
|
procedure Checkers; // var[25]
|
||||||
procedure CRot; // var[26]
|
procedure CRot; // var[26]
|
||||||
procedure TestScript; // var[27]
|
|
||||||
procedure TestVar; // var[NVARS - 1]
|
|
||||||
|
|
||||||
function Mul33(const M1, M2: TMatrix): TMatrix;
|
function Mul33(const M1, M2: TMatrix): TMatrix;
|
||||||
function Identity: TMatrix;
|
function Identity: TMatrix;
|
||||||
|
|
||||||
|
procedure BuildFunctionlist;
|
||||||
|
procedure AddRegVariations;
|
||||||
|
|
||||||
public
|
public
|
||||||
vars: array[0..NRVAR - 1] of double; // normalized interp coefs between variations
|
vars: array of double; // normalized interp coefs between variations
|
||||||
c: array[0..2, 0..1] of double; // the coefs to the affine part of the function
|
c: array[0..2, 0..1] of double; // the coefs to the affine part of the function
|
||||||
|
p: array[0..2, 0..1] of double; // the coefs to the affine part of the function
|
||||||
density: double; // prob is this function is chosen. 0 - 1
|
density: double; // prob is this function is chosen. 0 - 1
|
||||||
color: double; // color coord for this function. 0 - 1
|
color: double; // color coord for this function. 0 - 1
|
||||||
color2: double; // Second color coord for this function. 0 - 1
|
color2: double; // Second color coord for this function. 0 - 1
|
||||||
symmetry: double;
|
symmetry: double;
|
||||||
c00, c01, c10, c11, c20, c21: double;
|
c00, c01, c10, c11, c20, c21: double;
|
||||||
|
|
||||||
varType: integer;
|
// nx,ny,x,y: double;
|
||||||
|
// script: TatPascalScripter;
|
||||||
nx,ny,x,y: double;
|
|
||||||
script: TatPascalScripter;
|
|
||||||
|
|
||||||
Orientationtype: integer;
|
Orientationtype: integer;
|
||||||
|
|
||||||
@ -127,6 +93,8 @@ type
|
|||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
procedure Prepare;
|
procedure Prepare;
|
||||||
|
|
||||||
|
procedure Assign(Xform: TXForm);
|
||||||
|
|
||||||
procedure NextPoint(var px, py, pc: double); overload;
|
procedure NextPoint(var px, py, pc: double); overload;
|
||||||
procedure NextPoint(var CPpoint: TCPpoint); overload;
|
procedure NextPoint(var CPpoint: TCPpoint); overload;
|
||||||
procedure NextPoint(var px, py, pz, pc: double); overload;
|
procedure NextPoint(var px, py, pz, pc: double); overload;
|
||||||
@ -137,6 +105,11 @@ type
|
|||||||
procedure Translate(const x, y: double);
|
procedure Translate(const x, y: double);
|
||||||
procedure Multiply(const a, b, c, d: double);
|
procedure Multiply(const a, b, c, d: double);
|
||||||
procedure Scale(const s: double);
|
procedure Scale(const s: double);
|
||||||
|
|
||||||
|
procedure SetVariable(const name: string; var Value: double);
|
||||||
|
procedure GetVariable(const name: string; var Value: double);
|
||||||
|
|
||||||
|
function ToXMLString: string;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
implementation
|
implementation
|
||||||
@ -156,10 +129,6 @@ var
|
|||||||
begin
|
begin
|
||||||
density := 0;
|
density := 0;
|
||||||
Color := 0;
|
Color := 0;
|
||||||
Vars[0] := 1;
|
|
||||||
for i := 1 to NRVAR - 1 do begin
|
|
||||||
Vars[i] := 0;
|
|
||||||
end;
|
|
||||||
c[0, 0] := 1;
|
c[0, 0] := 1;
|
||||||
c[0, 1] := 0;
|
c[0, 1] := 0;
|
||||||
c[1, 0] := 0;
|
c[1, 0] := 0;
|
||||||
@ -168,11 +137,19 @@ begin
|
|||||||
c[2, 1] := 0;
|
c[2, 1] := 0;
|
||||||
Symmetry := 0;
|
Symmetry := 0;
|
||||||
|
|
||||||
end;
|
AddRegVariations;
|
||||||
|
BuildFunctionlist;
|
||||||
|
|
||||||
|
SetLength(vars, NRLOCVAR + Length(FRegVariations));
|
||||||
|
Vars[0] := 1;
|
||||||
|
for i := 1 to High(vars) do
|
||||||
|
Vars[i] := 0;
|
||||||
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
procedure TXForm.Prepare;
|
procedure TXForm.Prepare;
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
begin
|
begin
|
||||||
c00 := c[0][0];
|
c00 := c[0][0];
|
||||||
c01 := c[0][1];
|
c01 := c[0][1];
|
||||||
@ -183,141 +160,23 @@ begin
|
|||||||
|
|
||||||
FNrFunctions := 0;
|
FNrFunctions := 0;
|
||||||
|
|
||||||
if (vars[0] <> 0.0) then begin
|
for i := 0 to High(FRegVariations) do begin
|
||||||
FFunctionList[FNrFunctions] := Linear;
|
FRegVariations[i].FPX := @FPX;
|
||||||
Inc(FNrFunctions);
|
FRegVariations[i].FPY := @FPY;
|
||||||
|
FRegVariations[i].FTX := @FTX;
|
||||||
|
FRegVariations[i].FTY := @FTY;
|
||||||
|
|
||||||
|
FRegVariations[i].vvar := vars[i + NRLOCVAR];
|
||||||
|
FRegVariations[i].prepare;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if (vars[1] <> 0.0) then begin
|
for i := 0 to NrVar - 1 do begin
|
||||||
FFunctionList[FNrFunctions] := Sinusoidal;
|
if (vars[i] <> 0.0) then begin
|
||||||
Inc(FNrFunctions);
|
FCalcFunctionList[FNrFunctions] := FFunctionList[i];
|
||||||
|
Inc(FNrFunctions);
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
(*
|
||||||
if (vars[2] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Spherical;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[3] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Swirl;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[4] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Horseshoe;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[5] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Polar;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[6] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := FoldedHandkerchief;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[7] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Heart;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[8] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Disc;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[9] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Spiral;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[10] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Hyperbolic;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[11] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Square;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[12] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Ex;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[13] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Julia;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[14] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Bent;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[15] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Waves;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[16] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Fisheye;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[17] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Popcorn;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[18] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Exponential;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[19] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Power;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[20] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Cosine;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[21] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Rings;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[22] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Fan;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[23] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Triblob;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[24] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Daisy;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[25] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := Checkers;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[26] <> 0.0) then begin
|
|
||||||
FFunctionList[FNrFunctions] := CRot;
|
|
||||||
Inc(FNrFunctions);
|
|
||||||
end;
|
|
||||||
|
|
||||||
if (vars[27] <> 0.0) then begin
|
if (vars[27] <> 0.0) then begin
|
||||||
FFunctionList[FNrFunctions] := TestScript;
|
FFunctionList[FNrFunctions] := TestScript;
|
||||||
Inc(FNrFunctions);
|
Inc(FNrFunctions);
|
||||||
@ -333,7 +192,9 @@ begin
|
|||||||
'begin' + #10#13 +
|
'begin' + #10#13 +
|
||||||
'nx := x;' + #10#13 +
|
'nx := x;' + #10#13 +
|
||||||
'ny := y;' + #10#13 +
|
'ny := y;' + #10#13 +
|
||||||
'end;' + #10#13;
|
'end;' + #10#13 +
|
||||||
|
'nx := x;' + #10#13 +
|
||||||
|
'ny := y;' + #10#13;
|
||||||
Script.AddVariable('x',x);
|
Script.AddVariable('x',x);
|
||||||
Script.AddVariable('y',y);
|
Script.AddVariable('y',y);
|
||||||
Script.AddVariable('nx',nx);
|
Script.AddVariable('nx',nx);
|
||||||
@ -341,10 +202,11 @@ begin
|
|||||||
Script.Compile;
|
Script.Compile;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
if (vars[NRVAR -1] <> 0.0) then begin
|
if (vars[NRLOCVAR -1] <> 0.0) then begin
|
||||||
FFunctionList[FNrFunctions] := TestVar;
|
FFunctionList[FNrFunctions] := TestVar;
|
||||||
Inc(FNrFunctions);
|
Inc(FNrFunctions);
|
||||||
end;
|
end;
|
||||||
|
*)
|
||||||
|
|
||||||
CalculateAngle := (vars[5] <> 0.0) or (vars[6] <> 0.0) or (vars[7] <> 0.0) or (vars[8] <> 0.0) or
|
CalculateAngle := (vars[5] <> 0.0) or (vars[6] <> 0.0) or (vars[7] <> 0.0) or (vars[8] <> 0.0) or
|
||||||
(vars[12] <> 0.0) or (vars[13] <> 0.0) or (vars[21] <> 0.0) or (vars[22] <> 0.0);
|
(vars[12] <> 0.0) or (vars[13] <> 0.0) or (vars[21] <> 0.0) or (vars[22] <> 0.0);
|
||||||
@ -715,41 +577,6 @@ begin
|
|||||||
FPy := FPy + vars[26] * r * sin(Angle);
|
FPy := FPy + vars[26] * r * sin(Angle);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TXForm.TestScript;
|
|
||||||
begin
|
|
||||||
// Script.ExecuteSubroutine('test', [FTX, FTY, nvx,nvy]);
|
|
||||||
|
|
||||||
x := FTX;
|
|
||||||
y := FTY;
|
|
||||||
Script.ExecuteSubroutine('test2');
|
|
||||||
|
|
||||||
|
|
||||||
FPx := FPx + vars[27] * nx;
|
|
||||||
FPy := FPy + vars[27] * ny;
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
|
||||||
procedure TXForm.TestVar;
|
|
||||||
var
|
|
||||||
r : double;
|
|
||||||
// dx, dy, dx2: double;
|
|
||||||
Angle: double;
|
|
||||||
begin
|
|
||||||
r := sqrt(FTx * FTx + FTy * FTy);
|
|
||||||
if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then
|
|
||||||
Angle := arctan2(FTx, FTy)
|
|
||||||
else
|
|
||||||
Angle := 0.0;
|
|
||||||
|
|
||||||
Angle := Angle + Max(0, (3 - r)) * sin(2 * r);
|
|
||||||
|
|
||||||
// r:= R - 0.04 * sin(6.2 * R - 1) - 0.008 * R;
|
|
||||||
|
|
||||||
FPx := FPx + vars[NRVAR - 1] * r * cos(Angle);
|
|
||||||
FPy := FPy + vars[NRVAR - 1] * r * sin(Angle);
|
|
||||||
end;
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
procedure TXForm.NextPoint(var px,py,pc: double);
|
procedure TXForm.NextPoint(var px,py,pc: double);
|
||||||
var
|
var
|
||||||
@ -787,10 +614,13 @@ begin
|
|||||||
Fpy := 0;
|
Fpy := 0;
|
||||||
|
|
||||||
for i := 0 to FNrFunctions - 1 do
|
for i := 0 to FNrFunctions - 1 do
|
||||||
FFunctionList[i];
|
FCalcFunctionList[i];
|
||||||
|
|
||||||
px := FPx;
|
px := FPx;
|
||||||
py := FPy;
|
py := FPy;
|
||||||
|
|
||||||
|
// px := p[0,0] * FPx + p[1,0] * FPy + p[2,0];
|
||||||
|
// py := p[0,1] * FPx + p[1,1] * FPy + p[2,1];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -834,6 +664,8 @@ begin
|
|||||||
|
|
||||||
CPpoint.x := FPx;
|
CPpoint.x := FPx;
|
||||||
CPpoint.y := FPy;
|
CPpoint.y := FPy;
|
||||||
|
// CPpoint.x := p[0,0] * FPx + p[1,0] * FPy + p[2,0];
|
||||||
|
// CPpoint.y := p[0,1] * FPx + p[1,1] * FPy + p[2,1];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
@ -871,10 +703,22 @@ begin
|
|||||||
else
|
else
|
||||||
FAngle := 0.0;
|
FAngle := 0.0;
|
||||||
end;
|
end;
|
||||||
if CalculateLength then begin
|
|
||||||
FLength := sqrt(FTx * FTx + FTy * FTy);
|
if CalculateSinCos then begin
|
||||||
|
Flength := sqrt(FTx * FTx + FTy * FTy);
|
||||||
|
if FLength = 0 then begin
|
||||||
|
FSinA := 0;
|
||||||
|
FCosA := 1;
|
||||||
|
end else begin
|
||||||
|
FSinA := FTx/FLength;
|
||||||
|
FCosA := FTy/FLength;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
// if CalculateLength then begin
|
||||||
|
// FLength := sqrt(FTx * FTx + FTy * FTy);
|
||||||
|
// end;
|
||||||
|
|
||||||
Fpx := 0;
|
Fpx := 0;
|
||||||
Fpy := 0;
|
Fpy := 0;
|
||||||
|
|
||||||
@ -916,6 +760,18 @@ begin
|
|||||||
else
|
else
|
||||||
FAngle := 0.0;
|
FAngle := 0.0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
if CalculateSinCos then begin
|
||||||
|
Flength := sqrt(FTx * FTx + FTy * FTy);
|
||||||
|
if FLength = 0 then begin
|
||||||
|
FSinA := 0;
|
||||||
|
FCosA := 1;
|
||||||
|
end else begin
|
||||||
|
FSinA := FTx/FLength;
|
||||||
|
FCosA := FTy/FLength;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
// if CalculateLength then begin
|
// if CalculateLength then begin
|
||||||
// FLength := sqrt(FTx * FTx + FTy * FTy);
|
// FLength := sqrt(FTx * FTx + FTy * FTy);
|
||||||
// end;
|
// end;
|
||||||
@ -928,6 +784,8 @@ begin
|
|||||||
|
|
||||||
px := FPx;
|
px := FPx;
|
||||||
py := FPy;
|
py := FPy;
|
||||||
|
// px := p[0,0] * FPx + p[1,0] * FPy + p[2,0];
|
||||||
|
// py := p[0,1] * FPx + p[1,1] * FPy + p[2,1];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -964,6 +822,8 @@ begin
|
|||||||
|
|
||||||
px := FPx;
|
px := FPx;
|
||||||
py := FPy;
|
py := FPy;
|
||||||
|
// px := p[0,0] * FPx + p[1,0] * FPy + p[2,0];
|
||||||
|
// py := p[0,1] * FPx + p[1,1] * FPy + p[2,1];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
@ -1097,14 +957,147 @@ begin
|
|||||||
c[2, 1] := Matrix[1][2];
|
c[2, 1] := Matrix[1][2];
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
destructor TXForm.Destroy;
|
destructor TXForm.Destroy;
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
begin
|
begin
|
||||||
if assigned(Script) then
|
// if assigned(Script) then
|
||||||
Script.Free;
|
// Script.Free;
|
||||||
|
|
||||||
|
for i := 0 to High(FRegVariations) do
|
||||||
|
FRegVariations[i].Free;
|
||||||
|
|
||||||
inherited;
|
inherited;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure TXForm.BuildFunctionlist;
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
SetLength(FFunctionList, NrVar + Length(FRegVariations));
|
||||||
|
|
||||||
|
//fixed
|
||||||
|
FFunctionList[0] := Linear;
|
||||||
|
FFunctionList[1] := Sinusoidal;
|
||||||
|
FFunctionList[2] := Spherical;
|
||||||
|
FFunctionList[3] := Swirl;
|
||||||
|
FFunctionList[4] := Horseshoe;
|
||||||
|
FFunctionList[5] := Polar;
|
||||||
|
FFunctionList[6] := FoldedHandkerchief;
|
||||||
|
FFunctionList[7] := Heart;
|
||||||
|
FFunctionList[8] := Disc;
|
||||||
|
FFunctionList[9] := Spiral;
|
||||||
|
FFunctionList[10] := Hyperbolic;
|
||||||
|
FFunctionList[11] := Square;
|
||||||
|
FFunctionList[12] := Ex;
|
||||||
|
FFunctionList[13] := Julia;
|
||||||
|
FFunctionList[14] := Bent;
|
||||||
|
FFunctionList[15] := Waves;
|
||||||
|
FFunctionList[16] := Fisheye;
|
||||||
|
FFunctionList[17] := Popcorn;
|
||||||
|
FFunctionList[18] := Exponential;
|
||||||
|
FFunctionList[19] := Power;
|
||||||
|
FFunctionList[20] := Cosine;
|
||||||
|
FFunctionList[21] := Fan;
|
||||||
|
FFunctionList[22] := Rings;
|
||||||
|
FFunctionList[23] := Triblob;
|
||||||
|
FFunctionList[24] := Daisy;
|
||||||
|
FFunctionList[25] := Checkers;
|
||||||
|
FFunctionList[26] := CRot;
|
||||||
|
|
||||||
|
//registered
|
||||||
|
for i := 0 to High(FRegVariations) do
|
||||||
|
FFunctionList[27 + i] := FRegVariations[i].CalcFunction;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure TXForm.AddRegVariations;
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
SetLength(FRegVariations, GetNrRegisteredVariations);
|
||||||
|
for i := 0 to GetNrRegisteredVariations - 1 do begin
|
||||||
|
FRegVariations[i] := GetRegisteredVariation(i).GetInstance;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure TXForm.Assign(XForm: TXForm);
|
||||||
|
var
|
||||||
|
i,j: integer;
|
||||||
|
Name: string;
|
||||||
|
Value: double;
|
||||||
|
begin
|
||||||
|
if Not assigned(XForm) then
|
||||||
|
Exit;
|
||||||
|
|
||||||
|
for i := 0 to High(vars) do
|
||||||
|
vars[i] := XForm.vars[i];
|
||||||
|
|
||||||
|
c := Xform.c;
|
||||||
|
density := XForm.density;
|
||||||
|
color := XForm.color;
|
||||||
|
color2 := XForm.color2;
|
||||||
|
symmetry := XForm.symmetry;
|
||||||
|
Orientationtype := XForm.Orientationtype;
|
||||||
|
|
||||||
|
for i := 0 to High(FRegVariations) do begin
|
||||||
|
for j:= 0 to FRegVariations[i].GetNrVariables -1 do begin
|
||||||
|
Name := FRegVariations[i].GetVariableNameAt(j);
|
||||||
|
XForm.FRegVariations[i].GetVariable(Name,Value);
|
||||||
|
FRegVariations[i].SetVariable(Name,Value);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function TXForm.ToXMLString: string;
|
||||||
|
var
|
||||||
|
i, j: integer;
|
||||||
|
Name: string;
|
||||||
|
Value: double;
|
||||||
|
begin
|
||||||
|
result := Format(' <xform weight="%g" color="%g" symmetry="%g" ', [density, color, symmetry]);
|
||||||
|
for i := 0 to nrvar - 1 do begin
|
||||||
|
if vars[i] <> 0 then
|
||||||
|
Result := Result + varnames(i) + format('="%f" ', [vars[i]]);
|
||||||
|
end;
|
||||||
|
Result := Result + Format('coefs="%g %g %g %g %g %g" ', [c[0,0], c[0,1], c[1,0], c[1,1], c[2,0], c[2,1]]);
|
||||||
|
// Result := Result + Format('post="%g %g %g %g %g %g" ', [p[0,0], p[0,1], p[1,0], p[1,1], p[2,0], p[2,1]]);
|
||||||
|
|
||||||
|
for i := 0 to High(FRegVariations) do begin
|
||||||
|
if vars[i+NRLOCVAR] <> 0 then
|
||||||
|
for j:= 0 to FRegVariations[i].GetNrVariables -1 do begin
|
||||||
|
Name := FRegVariations[i].GetVariableNameAt(j);
|
||||||
|
FRegVariations[i].GetVariable(Name,Value);
|
||||||
|
Result := Result + Format('%s="%g" ', [name, value]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
Result := Result + '/>';
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure TXForm.SetVariable(const name: string; var Value: double);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
for i := 0 to High(FRegVariations) do
|
||||||
|
if FRegVariations[i].SetVariable(name, value) then
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure TXForm.GetVariable(const name: string; var Value: double);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
for i := 0 to High(FRegVariations) do
|
||||||
|
if FRegVariations[i].GetVariable(name, value) then
|
||||||
|
break;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
end.
|
end.
|
||||||
|
115
2.10/Source/XFormMan.pas
Normal file
115
2.10/Source/XFormMan.pas
Normal file
@ -0,0 +1,115 @@
|
|||||||
|
unit XFormMan;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
BaseVariation;
|
||||||
|
|
||||||
|
const
|
||||||
|
NRLOCVAR = 27;
|
||||||
|
|
||||||
|
function NrVar: integer;
|
||||||
|
function Varnames(const index: integer): String;
|
||||||
|
procedure RegisterVariation(Variation: TBaseVariationClass);
|
||||||
|
function GetNrRegisteredVariations: integer;
|
||||||
|
function GetRegisteredVariation(const Index: integer): TBaseVariationClass;
|
||||||
|
function GetNrVariableNames: integer;
|
||||||
|
function GetVariableNameAt(const Index: integer): string;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
Classes;
|
||||||
|
|
||||||
|
var
|
||||||
|
VariationList: TList;
|
||||||
|
VariableNames: TStringlist;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function NrVar: integer;
|
||||||
|
begin
|
||||||
|
Result := NRLOCVAR + VariationList.Count;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function Varnames(const index: integer): String;
|
||||||
|
const
|
||||||
|
cvarnames: array[0..NRLOCVAR-1] of string = (
|
||||||
|
'linear',
|
||||||
|
'sinusoidal',
|
||||||
|
'spherical',
|
||||||
|
'swirl',
|
||||||
|
'horseshoe',
|
||||||
|
'polar',
|
||||||
|
'handkerchief',
|
||||||
|
'heart',
|
||||||
|
'disc',
|
||||||
|
'spiral',
|
||||||
|
'hyperbolic',
|
||||||
|
'diamond',
|
||||||
|
'ex',
|
||||||
|
'julia',
|
||||||
|
'bent',
|
||||||
|
'waves',
|
||||||
|
'fisheye',
|
||||||
|
'popcorn',
|
||||||
|
'exponential',
|
||||||
|
'power',
|
||||||
|
'cosine',
|
||||||
|
'rings',
|
||||||
|
'fan',
|
||||||
|
'triblob',
|
||||||
|
'daisy',
|
||||||
|
'checkers',
|
||||||
|
'crot'
|
||||||
|
);
|
||||||
|
begin
|
||||||
|
if Index < NRLOCVAR then
|
||||||
|
Result := cvarnames[Index]
|
||||||
|
else
|
||||||
|
Result := TBaseVariationClass(VariationList[Index - NRLOCVAR]).GetName;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure RegisterVariation(Variation: TBaseVariationClass);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
VariationList.Add(Variation);
|
||||||
|
|
||||||
|
for i := 0 to Variation.GetNrVariables - 1 do
|
||||||
|
VariableNames.Add(Variation.GetVariableNameAt(i))
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function GetNrRegisteredVariations: integer;
|
||||||
|
begin
|
||||||
|
Result := VariationList.count;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function GetRegisteredVariation(const Index: integer): TBaseVariationClass;
|
||||||
|
begin
|
||||||
|
Result := TBaseVariationClass(VariationList[Index]);
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function GetNrVariableNames: integer;
|
||||||
|
begin
|
||||||
|
Result := VariableNames.Count;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function GetVariableNameAt(const Index: integer): string;
|
||||||
|
begin
|
||||||
|
Result := VariableNames[Index];
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
initialization
|
||||||
|
VariationList := TList.Create;
|
||||||
|
VariableNames := TStringlist.create;
|
||||||
|
finalization
|
||||||
|
VariableNames.Free;
|
||||||
|
VariationList.Free;
|
||||||
|
end.
|
@ -94,8 +94,6 @@ object frmPostProcess: TfrmPostProcess
|
|||||||
Width = 424
|
Width = 424
|
||||||
Height = 12
|
Height = 12
|
||||||
Align = alBottom
|
Align = alBottom
|
||||||
Min = 0
|
|
||||||
Max = 100
|
|
||||||
TabOrder = 1
|
TabOrder = 1
|
||||||
end
|
end
|
||||||
object btnApply: TButton
|
object btnApply: TButton
|
||||||
@ -161,7 +159,6 @@ object frmPostProcess: TfrmPostProcess
|
|||||||
end
|
end
|
||||||
end
|
end
|
||||||
object ColorDialog: TColorDialog
|
object ColorDialog: TColorDialog
|
||||||
Ctl3D = True
|
|
||||||
Left = 284
|
Left = 284
|
||||||
Top = 4
|
Top = 4
|
||||||
end
|
end
|
||||||
|
132
2.10/Source/varblob.pas
Normal file
132
2.10/Source/varblob.pas
Normal file
@ -0,0 +1,132 @@
|
|||||||
|
unit varblob;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
BaseVariation, XFormMan;
|
||||||
|
|
||||||
|
type
|
||||||
|
TVariationBlob = class(TBaseVariation)
|
||||||
|
private
|
||||||
|
FWaves: double;
|
||||||
|
FLow: double;
|
||||||
|
FHigh: double;
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
|
||||||
|
class function GetName: string; override;
|
||||||
|
class function GetInstance: TBaseVariation; override;
|
||||||
|
|
||||||
|
class function GetNrVariables: integer; override;
|
||||||
|
class 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;
|
||||||
|
|
||||||
|
procedure CalcFunction; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
Math;
|
||||||
|
|
||||||
|
{ TVariationTest }
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure TVariationBlob.CalcFunction;
|
||||||
|
const
|
||||||
|
EPS = 1E-10;
|
||||||
|
var
|
||||||
|
r : double;
|
||||||
|
Angle: double;
|
||||||
|
begin
|
||||||
|
r := sqrt(FTx^ * FTx^ + FTy^ * FTy^);
|
||||||
|
if (FTx^ < -EPS) or (FTx^ > EPS) or (FTy^ < -EPS) or (FTy^ > EPS) then
|
||||||
|
Angle := arctan2(FTx^, FTy^)
|
||||||
|
else
|
||||||
|
Angle := 0.0;
|
||||||
|
|
||||||
|
r := r * (FLow + (FHigh - FLow) * (0.5 + 0.5 * sin(FWaves * Angle)));
|
||||||
|
|
||||||
|
FPx^ := FPx^ + vvar * r * cos(Angle);
|
||||||
|
FPy^ := FPy^ + vvar * r * sin(Angle);
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TVariationBlob.GetName: string;
|
||||||
|
begin
|
||||||
|
Result := 'blob';
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TVariationBlob.GetVariableNameAt(const Index: integer): string;
|
||||||
|
begin
|
||||||
|
case Index Of
|
||||||
|
0: Result := 'blob_low';
|
||||||
|
1: Result := 'blob_high';
|
||||||
|
2: Result := 'blob_waves';
|
||||||
|
else
|
||||||
|
Result := '';
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TVariationBlob.GetNrVariables: integer;
|
||||||
|
begin
|
||||||
|
Result := 3;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function TVariationBlob.SetVariable(const Name: string; var value: double): boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
if Name = 'blob_low' then begin
|
||||||
|
FLow := Value;
|
||||||
|
Result := True;
|
||||||
|
end else if Name = 'blob_high' then begin
|
||||||
|
FHigh := Value;
|
||||||
|
Result := True;
|
||||||
|
end else if Name = 'blob_waves' then begin
|
||||||
|
Value := Round(Value);
|
||||||
|
FWaves := Value;
|
||||||
|
Result := True;
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function TVariationBlob.GetVariable(const Name: string; var value: double): boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
if Name = 'blob_low' then begin
|
||||||
|
Value := FLow;
|
||||||
|
Result := True;
|
||||||
|
end else if Name = 'blob_high' then begin
|
||||||
|
Value := FHigh;
|
||||||
|
Result := True;
|
||||||
|
end else if Name = 'blob_waves' then begin
|
||||||
|
Value := FWaves;
|
||||||
|
Result := True;
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
constructor TVariationBlob.Create;
|
||||||
|
begin
|
||||||
|
inherited Create;
|
||||||
|
|
||||||
|
FWaves := Round(2 + 5 * Random);
|
||||||
|
FLow := 0.2 + 0.5 * random;
|
||||||
|
FHigh := 0.8 + 0.4 * random;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TVariationBlob.GetInstance: TBaseVariation;
|
||||||
|
begin
|
||||||
|
Result := TVariationBlob.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
initialization
|
||||||
|
RegisterVariation(TVariationBlob);
|
||||||
|
end.
|
123
2.10/Source/varpdj.pas
Normal file
123
2.10/Source/varpdj.pas
Normal file
@ -0,0 +1,123 @@
|
|||||||
|
unit varpdj;
|
||||||
|
|
||||||
|
interface
|
||||||
|
|
||||||
|
uses
|
||||||
|
BaseVariation, XFormMan;
|
||||||
|
|
||||||
|
type
|
||||||
|
TVariationPDJ = class(TBaseVariation)
|
||||||
|
private
|
||||||
|
FA,FB,FC,FD: double;
|
||||||
|
public
|
||||||
|
constructor Create;
|
||||||
|
|
||||||
|
class function GetName: string; override;
|
||||||
|
class function GetInstance: TBaseVariation; override;
|
||||||
|
|
||||||
|
class function GetNrVariables: integer; override;
|
||||||
|
class 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;
|
||||||
|
|
||||||
|
|
||||||
|
procedure CalcFunction; override;
|
||||||
|
end;
|
||||||
|
|
||||||
|
implementation
|
||||||
|
|
||||||
|
uses
|
||||||
|
Math;
|
||||||
|
|
||||||
|
{ TVariationTest }
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
procedure TVariationPDJ.CalcFunction;
|
||||||
|
begin
|
||||||
|
FPx^ := FPx^ + vvar * (sin(FA * FTy^) - cos(FB * FTx^));
|
||||||
|
FPy^ := FPy^ + vvar * (sin(FC * FTx^) - cos(FD * FTy^));
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
constructor TVariationPDJ.Create;
|
||||||
|
begin
|
||||||
|
FA := 6 * Random - 3;
|
||||||
|
FB := 6 * Random - 3;
|
||||||
|
FC := 6 * Random - 3;
|
||||||
|
FD := 6 * Random - 3;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TVariationPDJ.GetInstance: TBaseVariation;
|
||||||
|
begin
|
||||||
|
Result := TVariationPDJ.Create;
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TVariationPDJ.GetName: string;
|
||||||
|
begin
|
||||||
|
Result := 'pdj';
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TVariationPDJ.GetVariableNameAt(const Index: integer): string;
|
||||||
|
begin
|
||||||
|
case Index Of
|
||||||
|
0: Result := 'pdj_a';
|
||||||
|
1: Result := 'pdj_b';
|
||||||
|
2: Result := 'pdj_c';
|
||||||
|
3: Result := 'pdj_d';
|
||||||
|
else
|
||||||
|
Result := '';
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function TVariationPDJ.SetVariable(const Name: string; var value: double): boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
if Name = 'pdj_a' then begin
|
||||||
|
FA := Value;
|
||||||
|
Result := True;
|
||||||
|
end else if Name = 'pdj_b' then begin
|
||||||
|
FB := Value;
|
||||||
|
Result := True;
|
||||||
|
end else if Name = 'pdj_c' then begin
|
||||||
|
FC := Value;
|
||||||
|
Result := True;
|
||||||
|
end else if Name = 'pdj_d' then begin
|
||||||
|
FD := Value;
|
||||||
|
Result := True;
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
class function TVariationPDJ.GetNrVariables: integer;
|
||||||
|
begin
|
||||||
|
Result := 4
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function TVariationPDJ.GetVariable(const Name: string; var value: double): boolean;
|
||||||
|
begin
|
||||||
|
Result := False;
|
||||||
|
if Name = 'pdj_a' then begin
|
||||||
|
Value := FA;
|
||||||
|
Result := True;
|
||||||
|
end else if Name = 'pdj_b' then begin
|
||||||
|
Value := FB;
|
||||||
|
Result := True;
|
||||||
|
end else if Name = 'pdj_c' then begin
|
||||||
|
Value := FC;
|
||||||
|
Result := True;
|
||||||
|
end else if Name = 'pdj_d' then begin
|
||||||
|
Value := FD;
|
||||||
|
Result := True;
|
||||||
|
end
|
||||||
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
initialization
|
||||||
|
RegisterVariation(TVariationPDJ);
|
||||||
|
end.
|
Loading…
Reference in New Issue
Block a user