postxform editing added
added and then disabled string-variables (buggy?)
This commit is contained in:
parent
07078fa223
commit
6b890ba584
@ -12,7 +12,7 @@ type
|
|||||||
procedure CalcFunction; virtual; abstract;
|
procedure CalcFunction; virtual; abstract;
|
||||||
|
|
||||||
public
|
public
|
||||||
vvar: double; // normalized interp coefs between variations
|
vvar: double;
|
||||||
FTx, FTy: ^double;
|
FTx, FTy: ^double;
|
||||||
FPx, FPy: ^double;
|
FPx, FPy: ^double;
|
||||||
|
|
||||||
@ -26,6 +26,9 @@ type
|
|||||||
function SetVariable(const Name: string; var Value: double): boolean; virtual;
|
function SetVariable(const Name: string; var Value: double): boolean; virtual;
|
||||||
function ResetVariable(const Name: string): boolean; virtual;
|
function ResetVariable(const Name: string): boolean; virtual;
|
||||||
|
|
||||||
|
function GetVariableStr(const Name: string): string; virtual;
|
||||||
|
function SetVariableStr(const Name: string; var strValue: string): boolean; virtual;
|
||||||
|
|
||||||
procedure Prepare; virtual;
|
procedure Prepare; virtual;
|
||||||
|
|
||||||
procedure GetCalcFunction(var Delphi_Suxx: TCalcFunction); virtual;
|
procedure GetCalcFunction(var Delphi_Suxx: TCalcFunction); virtual;
|
||||||
@ -65,6 +68,34 @@ begin
|
|||||||
Result := SetVariable(Name, zero);
|
Result := SetVariable(Name, zero);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function TBaseVariation.GetVariableStr(const Name: string): string;
|
||||||
|
var
|
||||||
|
value: double;
|
||||||
|
begin
|
||||||
|
if GetVariable(Name, value) then
|
||||||
|
Result := Format('%.6g', [value])
|
||||||
|
else
|
||||||
|
Result := '';
|
||||||
|
end;
|
||||||
|
|
||||||
|
function TBaseVariation.SetVariableStr(const Name: string; var strValue: string): boolean;
|
||||||
|
var
|
||||||
|
v, oldv: double;
|
||||||
|
begin
|
||||||
|
if GetVariable(Name, oldv) then begin
|
||||||
|
try
|
||||||
|
v := StrToFloat(strValue);
|
||||||
|
SetVariable(Name, v);
|
||||||
|
except
|
||||||
|
v := oldv;
|
||||||
|
end;
|
||||||
|
strValue := Format('%.6g', [v]);
|
||||||
|
Result := true;
|
||||||
|
end
|
||||||
|
else Result := false;
|
||||||
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
class function TBaseVariation.GetVariableNameAt(const Index: integer): string;
|
class function TBaseVariation.GetVariableNameAt(const Index: integer): string;
|
||||||
begin
|
begin
|
||||||
|
@ -21,6 +21,8 @@ unit ControlPoint;
|
|||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
|
//{$define VAR_STR}
|
||||||
|
|
||||||
uses
|
uses
|
||||||
Classes, Windows, Cmap, XForm, XFormMan;
|
Classes, Windows, Cmap, XForm, XFormMan;
|
||||||
|
|
||||||
@ -40,10 +42,6 @@ type
|
|||||||
TTriangle = record
|
TTriangle = record
|
||||||
x: array[0..2] of double;
|
x: array[0..2] of double;
|
||||||
y: array[0..2] of double;
|
y: array[0..2] of double;
|
||||||
{ color: integer;
|
|
||||||
locked, visible: boolean;
|
|
||||||
pCoefs: pCoefsArray;
|
|
||||||
pXform: ^TXform; }
|
|
||||||
end;
|
end;
|
||||||
TTriangles = array[-1..NXFORMS] of TTriangle;
|
TTriangles = array[-1..NXFORMS] of TTriangle;
|
||||||
TSPoint = record
|
TSPoint = record
|
||||||
@ -86,7 +84,6 @@ type
|
|||||||
T2CPointsArray = array of T2Cpoint;
|
T2CPointsArray = array of T2Cpoint;
|
||||||
|
|
||||||
TControlPoint = class
|
TControlPoint = class
|
||||||
|
|
||||||
public
|
public
|
||||||
finalXform: TXForm;
|
finalXform: TXForm;
|
||||||
finalXformEnabled: boolean;
|
finalXformEnabled: boolean;
|
||||||
@ -173,8 +170,8 @@ type
|
|||||||
function TrianglesFromCP(var Triangles: TTriangles): integer;
|
function TrianglesFromCP(var Triangles: TTriangles): integer;
|
||||||
procedure GetFromTriangles(const Triangles: TTriangles; const t: integer);
|
procedure GetFromTriangles(const Triangles: TTriangles; const t: integer);
|
||||||
|
|
||||||
procedure GetPostTriangle(var Triangles: TTriangles; const n: integer);
|
procedure GetTriangle(var Triangle: TTriangle; const n: integer);
|
||||||
procedure SetPostTriangle(const Triangles: TTriangles; const n: integer);
|
procedure GetPostTriangle(var Triangle: TTriangle; const n: integer);
|
||||||
|
|
||||||
procedure EqualizeWeights;
|
procedure EqualizeWeights;
|
||||||
procedure NormalizeWeights;
|
procedure NormalizeWeights;
|
||||||
@ -726,6 +723,9 @@ begin
|
|||||||
xform[CurrentXForm].p[2, 0] := StrToFloat(ParseValues[ParsePos]);
|
xform[CurrentXForm].p[2, 0] := StrToFloat(ParseValues[ParsePos]);
|
||||||
Inc(ParsePos);
|
Inc(ParsePos);
|
||||||
xform[CurrentXForm].p[2, 1] := StrToFloat(ParseValues[ParsePos]);
|
xform[CurrentXForm].p[2, 1] := StrToFloat(ParseValues[ParsePos]);
|
||||||
|
end else if AnsiCompareText(CurrentToken, 'postxswap') = 0 then begin
|
||||||
|
Inc(ParsePos);
|
||||||
|
xform[CurrentXForm].postXswap := (ParseValues[ParsePos] = '1');
|
||||||
end else if AnsiCompareText(CurrentToken, 'vars') = 0 then begin
|
end else if AnsiCompareText(CurrentToken, 'vars') = 0 then begin
|
||||||
for i := 0 to NRVAR - 1 do begin
|
for i := 0 to NRVAR - 1 do begin
|
||||||
xform[CurrentXForm].vars[i] := 0;
|
xform[CurrentXForm].vars[i] := 0;
|
||||||
@ -743,10 +743,15 @@ begin
|
|||||||
Inc(i);
|
Inc(i);
|
||||||
end;
|
end;
|
||||||
end else if AnsiCompareText(CurrentToken, 'variables') = 0 then begin
|
end else if AnsiCompareText(CurrentToken, 'variables') = 0 then begin
|
||||||
|
{
|
||||||
v := 0;
|
v := 0;
|
||||||
for i:= 0 to GetNrVariableNames-1 do begin
|
for i:= 0 to GetNrVariableNames-1 do begin
|
||||||
xform[CurrentXForm].SetVariable(GetVariableNameAt(i), v);
|
xform[CurrentXForm].SetVariable(GetVariableNameAt(i), v);
|
||||||
end;
|
end;
|
||||||
|
}
|
||||||
|
for i:= 0 to GetNrVariableNames-1 do begin
|
||||||
|
xform[CurrentXForm].ResetVariable(GetVariableNameAt(i));
|
||||||
|
end;
|
||||||
|
|
||||||
i := 0;
|
i := 0;
|
||||||
while true do begin
|
while true do begin
|
||||||
@ -1464,14 +1469,22 @@ begin
|
|||||||
sl.add(s);
|
sl.add(s);
|
||||||
s := 'variables';
|
s := 'variables';
|
||||||
for j:= 0 to GetNrVariableNames-1 do begin
|
for j:= 0 to GetNrVariableNames-1 do begin
|
||||||
|
{$ifndef VAR_STR}
|
||||||
GetVariable(GetVariableNameAt(j), v);
|
GetVariable(GetVariableNameAt(j), v);
|
||||||
s := format('%s %g', [s, v]);
|
s := format('%s %g', [s, v]);
|
||||||
|
{$else}
|
||||||
|
s := s + ' ' + GetVariableStr(GetVariableNameAt(j));
|
||||||
|
{$endif}
|
||||||
end;
|
end;
|
||||||
sl.add(s);
|
sl.add(s);
|
||||||
sl.Add(format('coefs %.6f %.6f %.6f %.6f %.6f %.6f',
|
sl.Add(format('coefs %.6f %.6f %.6f %.6f %.6f %.6f',
|
||||||
[c[0][0], c[0][1], c[1][0], c[1][1], c[2][0], c[2][1]]));
|
[c[0][0], c[0][1], c[1][0], c[1][1], c[2][0], c[2][1]]));
|
||||||
sl.Add(format('post %.6f %.6f %.6f %.6f %.6f %.6f',
|
sl.Add(format('post %.6f %.6f %.6f %.6f %.6f %.6f',
|
||||||
[p[0][0], p[0][1], p[1][0], p[1][1], p[2][0], p[2][1]]));
|
[p[0][0], p[0][1], p[1][0], p[1][1], p[2][0], p[2][1]]));
|
||||||
|
if postXswap then
|
||||||
|
sl.Add('postxswap 1')
|
||||||
|
else
|
||||||
|
sl.Add('postxswap 0');
|
||||||
end;
|
end;
|
||||||
DecimalSeparator := OldDecimalSperator;
|
DecimalSeparator := OldDecimalSperator;
|
||||||
end;
|
end;
|
||||||
@ -1898,10 +1911,16 @@ begin
|
|||||||
begin
|
begin
|
||||||
for i := 0 to 2 do
|
for i := 0 to 2 do
|
||||||
with xform[j] do begin
|
with xform[j] do begin
|
||||||
|
if postXswap then begin
|
||||||
|
Triangles[j].x[i] := Triangles[-1].x[i] * p[0][0] + Triangles[-1].y[i] * p[1][0] + p[2][0];
|
||||||
|
Triangles[j].y[i] := Triangles[-1].x[i] * p[0][1] + Triangles[-1].y[i] * p[1][1] + p[2][1];
|
||||||
|
end
|
||||||
|
else begin
|
||||||
Triangles[j].x[i] := Triangles[-1].x[i] * c[0][0] + Triangles[-1].y[i] * c[1][0] + c[2][0];
|
Triangles[j].x[i] := Triangles[-1].x[i] * c[0][0] + Triangles[-1].y[i] * c[1][0] + c[2][0];
|
||||||
Triangles[j].y[i] := Triangles[-1].x[i] * c[0][1] + Triangles[-1].y[i] * c[1][1] + c[2][1];
|
Triangles[j].y[i] := Triangles[-1].x[i] * c[0][1] + Triangles[-1].y[i] * c[1][1] + c[2][1];
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
end;
|
||||||
EnableFinalXform := FinalXformEnabled;
|
EnableFinalXform := FinalXformEnabled;
|
||||||
|
|
||||||
// I don't like this... :-/
|
// I don't like this... :-/
|
||||||
@ -1966,7 +1985,19 @@ var
|
|||||||
i: integer;
|
i: integer;
|
||||||
begin
|
begin
|
||||||
for i := 0 to t do
|
for i := 0 to t do
|
||||||
|
if xform[i].postXswap then
|
||||||
begin
|
begin
|
||||||
|
solve3(Triangles[-1].x[0], -Triangles[-1].y[0], Triangles[i].x[0],
|
||||||
|
Triangles[-1].x[1], -Triangles[-1].y[1], Triangles[i].x[1],
|
||||||
|
Triangles[-1].x[2], -Triangles[-1].y[2], Triangles[i].x[2],
|
||||||
|
xform[i].p[0][0], xform[i].p[1][0], xform[i].p[2][0]);
|
||||||
|
|
||||||
|
solve3(Triangles[-1].x[0], -Triangles[-1].y[0], -Triangles[i].y[0],
|
||||||
|
Triangles[-1].x[1], -Triangles[-1].y[1], -Triangles[i].y[1],
|
||||||
|
Triangles[-1].x[2], -Triangles[-1].y[2], -Triangles[i].y[2],
|
||||||
|
xform[i].p[0][1], xform[i].p[1][1], xform[i].p[2][1]);
|
||||||
|
end
|
||||||
|
else begin
|
||||||
solve3(Triangles[-1].x[0], -Triangles[-1].y[0], Triangles[i].x[0],
|
solve3(Triangles[-1].x[0], -Triangles[-1].y[0], Triangles[i].x[0],
|
||||||
Triangles[-1].x[1], -Triangles[-1].y[1], Triangles[i].x[1],
|
Triangles[-1].x[1], -Triangles[-1].y[1], Triangles[i].x[1],
|
||||||
Triangles[-1].x[2], -Triangles[-1].y[2], Triangles[i].x[2],
|
Triangles[-1].x[2], -Triangles[-1].y[2], Triangles[i].x[2],
|
||||||
@ -1980,30 +2011,26 @@ begin
|
|||||||
FinalXformEnabled := EnableFinalXform;
|
FinalXformEnabled := EnableFinalXform;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TControlPoint.GetTriangle(var Triangle: TTriangle; const n: integer);
|
||||||
procedure TControlPoint.GetPostTriangle(var Triangles: TTriangles; const n: integer);
|
|
||||||
var
|
var
|
||||||
i, j: integer;
|
i, j: integer;
|
||||||
begin
|
begin
|
||||||
for i := 0 to 2 do
|
for i := 0 to 2 do
|
||||||
with xform[n] do begin
|
with xform[n] do begin
|
||||||
Triangles[n].x[i] := Triangles[-1].x[i] * p[0][0] + Triangles[-1].y[i] * p[1][0] + p[2][0];
|
Triangle.x[i] := MainTriangles[-1].x[i] * c[0][0] - MainTriangles[-1].y[i] * c[1][0] + c[2][0];
|
||||||
Triangles[n].y[i] := Triangles[-1].x[i] * p[0][1] + Triangles[-1].y[i] * p[1][1] + p[2][1];
|
Triangle.y[i] := -MainTriangles[-1].x[i] * c[0][1] + MainTriangles[-1].y[i] * c[1][1] - c[2][1];
|
||||||
end;
|
end;
|
||||||
//for i := 0 to 2 do Triangles[n].y[i] := -Triangles[n].y[i];
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TControlPoint.SetPostTriangle(const Triangles: TTriangles; const n: integer);
|
procedure TControlPoint.GetPostTriangle(var Triangle: TTriangle; const n: integer);
|
||||||
|
var
|
||||||
|
i, j: integer;
|
||||||
begin
|
begin
|
||||||
solve3(Triangles[-1].x[0], -Triangles[-1].y[0], Triangles[n].x[0],
|
for i := 0 to 2 do
|
||||||
Triangles[-1].x[1], -Triangles[-1].y[1], Triangles[n].x[1],
|
with xform[n] do begin
|
||||||
Triangles[-1].x[2], -Triangles[-1].y[2], Triangles[n].x[2],
|
Triangle.x[i] := MainTriangles[-1].x[i] * p[0][0] - MainTriangles[-1].y[i] * p[1][0] + p[2][0];
|
||||||
xform[n].p[0][0], xform[n].p[1][0], xform[n].p[2][0]);
|
Triangle.y[i] := -MainTriangles[-1].x[i] * p[0][1] + MainTriangles[-1].y[i] * p[1][1] - p[2][1];
|
||||||
|
end;
|
||||||
solve3(Triangles[-1].x[0], -Triangles[-1].y[0], -Triangles[n].y[0],
|
|
||||||
Triangles[-1].x[1], -Triangles[-1].y[1], -Triangles[n].y[1],
|
|
||||||
Triangles[-1].x[2], -Triangles[-1].y[2], -Triangles[n].y[2],
|
|
||||||
xform[n].p[0][1], xform[n].p[1][1], xform[n].p[2][1]);
|
|
||||||
end;
|
end;
|
||||||
|
|
||||||
////////////////////////////////////////////////////////////////////////////////
|
////////////////////////////////////////////////////////////////////////////////
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -19,6 +19,8 @@
|
|||||||
//{$D-,L-,O+,Q-,R-,Y-,S-}
|
//{$D-,L-,O+,Q-,R-,Y-,S-}
|
||||||
unit Editor;
|
unit Editor;
|
||||||
|
|
||||||
|
//{$define VAR_STR}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -33,7 +35,6 @@ type
|
|||||||
GrphPnl: TPanel;
|
GrphPnl: TPanel;
|
||||||
StatusBar: TStatusBar;
|
StatusBar: TStatusBar;
|
||||||
ControlPanel: TPanel;
|
ControlPanel: TPanel;
|
||||||
lblTransform: TLabel;
|
|
||||||
PrevPnl: TPanel;
|
PrevPnl: TPanel;
|
||||||
PreviewImage: TImage;
|
PreviewImage: TImage;
|
||||||
EditPopup: TPopupMenu;
|
EditPopup: TPopupMenu;
|
||||||
@ -70,7 +71,6 @@ type
|
|||||||
pnlXFormColor: TPanel;
|
pnlXFormColor: TPanel;
|
||||||
txtXFormColor: TEdit;
|
txtXFormColor: TEdit;
|
||||||
GroupBox2: TGroupBox;
|
GroupBox2: TGroupBox;
|
||||||
chkHelpers: TCheckBox;
|
|
||||||
TriangleScrollBox: TScrollBox;
|
TriangleScrollBox: TScrollBox;
|
||||||
TrianglePanel: TPanel;
|
TrianglePanel: TPanel;
|
||||||
txtCy: TEdit;
|
txtCy: TEdit;
|
||||||
@ -122,13 +122,11 @@ type
|
|||||||
btnOcoefs: TSpeedButton;
|
btnOcoefs: TSpeedButton;
|
||||||
btnCoefsRect: TSpeedButton;
|
btnCoefsRect: TSpeedButton;
|
||||||
btnCoefsPolar: TSpeedButton;
|
btnCoefsPolar: TSpeedButton;
|
||||||
Label1: TLabel;
|
|
||||||
trkVarPreviewDensity: TTrackBar;
|
trkVarPreviewDensity: TTrackBar;
|
||||||
trkVarPreviewRange: TTrackBar;
|
trkVarPreviewRange: TTrackBar;
|
||||||
ToolButton2: TToolButton;
|
ToolButton2: TToolButton;
|
||||||
tbVarPreview: TToolButton;
|
tbVarPreview: TToolButton;
|
||||||
trkVarPreviewDepth: TTrackBar;
|
trkVarPreviewDepth: TTrackBar;
|
||||||
chkPreserve: TCheckBox;
|
|
||||||
btnXpost: TSpeedButton;
|
btnXpost: TSpeedButton;
|
||||||
btnYpost: TSpeedButton;
|
btnYpost: TSpeedButton;
|
||||||
btnOpost: TSpeedButton;
|
btnOpost: TSpeedButton;
|
||||||
@ -138,8 +136,7 @@ type
|
|||||||
txtPost11: TEdit;
|
txtPost11: TEdit;
|
||||||
txtPost20: TEdit;
|
txtPost20: TEdit;
|
||||||
txtPost21: TEdit;
|
txtPost21: TEdit;
|
||||||
btnResetPostXForm: TSpeedButton;
|
btnResetPostCoefs: TSpeedButton;
|
||||||
btnPostTriangle: TSpeedButton;
|
|
||||||
GroupBox3: TGroupBox;
|
GroupBox3: TGroupBox;
|
||||||
editPivotY: TEdit;
|
editPivotY: TEdit;
|
||||||
editPivotX: TEdit;
|
editPivotX: TEdit;
|
||||||
@ -147,7 +144,6 @@ type
|
|||||||
btnPickPivot: TSpeedButton;
|
btnPickPivot: TSpeedButton;
|
||||||
btnPivotMode: TSpeedButton;
|
btnPivotMode: TSpeedButton;
|
||||||
tbEnableFinalXform: TToolButton;
|
tbEnableFinalXform: TToolButton;
|
||||||
chkUseXFormColor: TCheckBox;
|
|
||||||
ToolButton3: TToolButton;
|
ToolButton3: TToolButton;
|
||||||
TrianglePopup: TPopupMenu;
|
TrianglePopup: TPopupMenu;
|
||||||
mnuDuplicate: TMenuItem;
|
mnuDuplicate: TMenuItem;
|
||||||
@ -162,7 +158,6 @@ type
|
|||||||
txtSymmetry: TEdit;
|
txtSymmetry: TEdit;
|
||||||
pnlWeight: TPanel;
|
pnlWeight: TPanel;
|
||||||
pnlSymmetry: TPanel;
|
pnlSymmetry: TPanel;
|
||||||
tbExtendedEdit: TToolButton;
|
|
||||||
mnuResetTrgRotation: TMenuItem;
|
mnuResetTrgRotation: TMenuItem;
|
||||||
mnuResetTrgPosition: TMenuItem;
|
mnuResetTrgPosition: TMenuItem;
|
||||||
mnuResetTrgScale: TMenuItem;
|
mnuResetTrgScale: TMenuItem;
|
||||||
@ -170,13 +165,26 @@ type
|
|||||||
mnuExtendedEdit: TMenuItem;
|
mnuExtendedEdit: TMenuItem;
|
||||||
N8: TMenuItem;
|
N8: TMenuItem;
|
||||||
mnuAxisLock: TMenuItem;
|
mnuAxisLock: TMenuItem;
|
||||||
tbAxisLock: TToolButton;
|
|
||||||
mnuSelectmode: TMenuItem;
|
mnuSelectmode: TMenuItem;
|
||||||
ToolButton6: TToolButton;
|
ToolButton6: TToolButton;
|
||||||
tbPivotMode: TToolButton;
|
tbPivotMode: TToolButton;
|
||||||
tbRotate90CCW: TToolButton;
|
tbRotate90CCW: TToolButton;
|
||||||
tbRotate90CW: TToolButton;
|
tbRotate90CW: TToolButton;
|
||||||
chkAxisLock: TCheckBox;
|
lblTransform: TLabel;
|
||||||
|
chkPreserve: TCheckBox;
|
||||||
|
bvlCoefs: TBevel;
|
||||||
|
bvlPostCoefs: TBevel;
|
||||||
|
tbPostXswap: TToolButton;
|
||||||
|
ToolBar1: TToolBar;
|
||||||
|
tbCopyTriangle: TToolButton;
|
||||||
|
tbPasteTriangle: TToolButton;
|
||||||
|
tbExtendedEdit: TToolButton;
|
||||||
|
tbAxisLock: TToolButton;
|
||||||
|
tbAutoWeights: TToolButton;
|
||||||
|
tb2PostXswap: TToolButton;
|
||||||
|
oggleposttriangleediting1: TMenuItem;
|
||||||
|
mnuCopyTriangle: TMenuItem;
|
||||||
|
mnuPasteTriangle: TMenuItem;
|
||||||
procedure ValidateVariable;
|
procedure ValidateVariable;
|
||||||
procedure vleVariablesValidate(Sender: TObject; ACol, ARow: Integer; const KeyName, KeyValue: string);
|
procedure vleVariablesValidate(Sender: TObject; ACol, ARow: Integer; const KeyName, KeyValue: string);
|
||||||
procedure vleVariablesKeyPress(Sender: TObject; var Key: Char);
|
procedure vleVariablesKeyPress(Sender: TObject; var Key: Char);
|
||||||
@ -231,8 +239,8 @@ type
|
|||||||
procedure scrlXFormColorScroll(Sender: TObject;
|
procedure scrlXFormColorScroll(Sender: TObject;
|
||||||
ScrollCode: TScrollCode; var ScrollPos: Integer);
|
ScrollCode: TScrollCode; var ScrollPos: Integer);
|
||||||
procedure scrlXFormColorChange(Sender: TObject);
|
procedure scrlXFormColorChange(Sender: TObject);
|
||||||
procedure chkUseXFormColorClick(Sender: TObject);
|
// procedure chkUseXFormColorClick(Sender: TObject);
|
||||||
procedure chkHelpersClick(Sender: TObject);
|
// procedure chkHelpersClick(Sender: TObject);
|
||||||
procedure txtXFormColorExit(Sender: TObject);
|
procedure txtXFormColorExit(Sender: TObject);
|
||||||
procedure txtXFormColorKeyPress(Sender: TObject; var Key: Char);
|
procedure txtXFormColorKeyPress(Sender: TObject; var Key: Char);
|
||||||
procedure txtSymmetrySet(Sender: TObject);
|
procedure txtSymmetrySet(Sender: TObject);
|
||||||
@ -292,8 +300,7 @@ type
|
|||||||
procedure btnOpostClick(Sender: TObject);
|
procedure btnOpostClick(Sender: TObject);
|
||||||
procedure PostCoefValidate(Sender: TObject);
|
procedure PostCoefValidate(Sender: TObject);
|
||||||
procedure PostCoefKeypress(Sender: TObject; var Key: Char);
|
procedure PostCoefKeypress(Sender: TObject; var Key: Char);
|
||||||
procedure btnResetPostXFormClick(Sender: TObject);
|
procedure btnResetPostCoefsClick(Sender: TObject);
|
||||||
procedure btnPostTriangleClick(Sender: TObject);
|
|
||||||
procedure btnPivotModeClick(Sender: TObject);
|
procedure btnPivotModeClick(Sender: TObject);
|
||||||
procedure PivotValidate(Sender: TObject);
|
procedure PivotValidate(Sender: TObject);
|
||||||
procedure PivotKeyPress(Sender: TObject; var Key: Char);
|
procedure PivotKeyPress(Sender: TObject; var Key: Char);
|
||||||
@ -315,6 +322,9 @@ type
|
|||||||
procedure ResetAxisScale(n: integer);
|
procedure ResetAxisScale(n: integer);
|
||||||
procedure tbExtendedEditClick(Sender: TObject);
|
procedure tbExtendedEditClick(Sender: TObject);
|
||||||
procedure tbAxisLockClick(Sender: TObject);
|
procedure tbAxisLockClick(Sender: TObject);
|
||||||
|
procedure tbPostXswapClick(Sender: TObject);
|
||||||
|
procedure btnCopyTriangleClick(Sender: TObject);
|
||||||
|
procedure btnPasteTriangleClick(Sender: TObject);
|
||||||
|
|
||||||
private
|
private
|
||||||
TriangleView: TCustomDrawControl;
|
TriangleView: TCustomDrawControl;
|
||||||
@ -352,6 +362,12 @@ type
|
|||||||
SelectedCorner: integer;
|
SelectedCorner: integer;
|
||||||
HasChanged: boolean;
|
HasChanged: boolean;
|
||||||
|
|
||||||
|
oldTriangle: TTriangle;
|
||||||
|
gCenterX: double;
|
||||||
|
gCenterY: double;
|
||||||
|
|
||||||
|
MemTriangle: TTriangle;
|
||||||
|
|
||||||
oldx, oldy, olddist: double;
|
oldx, oldy, olddist: double;
|
||||||
Pivot, LocalPivot, WorldPivot: TSPoint;
|
Pivot, LocalPivot, WorldPivot: TSPoint;
|
||||||
PivotMode: (pivotLocal, pivotWorld);
|
PivotMode: (pivotLocal, pivotWorld);
|
||||||
@ -417,11 +433,6 @@ implementation
|
|||||||
uses
|
uses
|
||||||
Main, Global, Adjust, Mutate, XformMan;
|
Main, Global, Adjust, Mutate, XformMan;
|
||||||
|
|
||||||
var
|
|
||||||
oldTriangle: TTriangle;
|
|
||||||
gCenterX: double;
|
|
||||||
gCenterY: double;
|
|
||||||
|
|
||||||
{$R *.DFM}
|
{$R *.DFM}
|
||||||
|
|
||||||
{ Triangle transformations }
|
{ Triangle transformations }
|
||||||
@ -636,6 +647,8 @@ begin
|
|||||||
EdgeCaught := false;
|
EdgeCaught := false;
|
||||||
TriangleCaught := false;
|
TriangleCaught := false;
|
||||||
|
|
||||||
|
cp.TrianglesFromCP(MainTriangles);
|
||||||
|
|
||||||
ShowSelectedInfo;
|
ShowSelectedInfo;
|
||||||
if MainForm.UndoIndex = 0 then AutoZoom // auto-zoom only on 'new' flame
|
if MainForm.UndoIndex = 0 then AutoZoom // auto-zoom only on 'new' flame
|
||||||
else TriangleView.Invalidate;
|
else TriangleView.Invalidate;
|
||||||
@ -721,6 +734,33 @@ begin
|
|||||||
txtPost21.text := Format('%.6g', [arctan2(-p[2][1], p[2][0])*180/PI]);
|
txtPost21.text := Format('%.6g', [arctan2(-p[2][1], p[2][0])*180/PI]);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
tbPostXswap.Down := postXswap;
|
||||||
|
tb2PostXswap.Down := postXswap;
|
||||||
|
|
||||||
|
bvlPostCoefs.Visible := postXswap;
|
||||||
|
btnXpost.Enabled := postXswap;
|
||||||
|
btnYpost.Enabled := postXswap;
|
||||||
|
btnOpost.Enabled := postXswap;
|
||||||
|
txtPost00.Enabled := postXswap;
|
||||||
|
txtPost01.Enabled := postXswap;
|
||||||
|
txtPost10.Enabled := postXswap;
|
||||||
|
txtPost11.Enabled := postXswap;
|
||||||
|
txtPost20.Enabled := postXswap;
|
||||||
|
txtPost21.Enabled := postXswap;
|
||||||
|
btnResetPostCoefs.Enabled := postXswap;
|
||||||
|
|
||||||
|
bvlCoefs.Visible := not postXswap;
|
||||||
|
btnXcoefs.Enabled := not postXswap;
|
||||||
|
btnYcoefs.Enabled := not postXswap;
|
||||||
|
btnOcoefs.Enabled := not postXswap;
|
||||||
|
txtA.Enabled := not postXswap;
|
||||||
|
txtB.Enabled := not postXswap;
|
||||||
|
txtC.Enabled := not postXswap;
|
||||||
|
txtD.Enabled := not postXswap;
|
||||||
|
txtE.Enabled := not postXswap;
|
||||||
|
txtF.Enabled := not postXswap;
|
||||||
|
btnResetCoefs.Enabled := not postXswap;
|
||||||
|
|
||||||
if SelectedTriangle < Transforms then
|
if SelectedTriangle < Transforms then
|
||||||
begin
|
begin
|
||||||
txtP.text := Format('%.6g', [density]);
|
txtP.text := Format('%.6g', [density]);
|
||||||
@ -748,9 +788,12 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
for i:= 0 to GetNrVariableNames - 1 do begin
|
for i:= 0 to GetNrVariableNames - 1 do begin
|
||||||
|
{$ifndef VAR_STR}
|
||||||
GetVariable(GetVariableNameAt(i), v);
|
GetVariable(GetVariableNameAt(i), v);
|
||||||
strval := Format('%.6g', [v]);
|
strval := Format('%.6g', [v]);
|
||||||
//strval := GetVariableStr(GetVariableNameAt(i));
|
{$else}
|
||||||
|
strval := GetVariableStr(GetVariableNameAt(i));
|
||||||
|
{$endif}
|
||||||
// kinda funny, but it really helped...
|
// kinda funny, but it really helped...
|
||||||
if vleVariables.Values[GetVariableNameAt(i)] <> strval then
|
if vleVariables.Values[GetVariableNameAt(i)] <> strval then
|
||||||
vleVariables.Values[GetVariableNameAt(i)] := strval;
|
vleVariables.Values[GetVariableNameAt(i)] := strval;
|
||||||
@ -818,7 +861,7 @@ procedure TEditForm.UpdateFlameX;
|
|||||||
begin
|
begin
|
||||||
cp.GetFromTriangles(MainTriangles, Transforms);
|
cp.GetFromTriangles(MainTriangles, Transforms);
|
||||||
|
|
||||||
if not chkPreserve.checked then cp.ComputeWeights(MainTriangles, Transforms);
|
if tbAutoWeights.Down then cp.ComputeWeights(MainTriangles, Transforms);
|
||||||
DrawPreview;
|
DrawPreview;
|
||||||
ShowSelectedInfo;
|
ShowSelectedInfo;
|
||||||
TriangleView.Refresh;
|
TriangleView.Refresh;
|
||||||
@ -957,7 +1000,7 @@ function TEditForm.GetTriangleColor(n: integer): TColor;
|
|||||||
begin
|
begin
|
||||||
if n = Transforms then Result := clWhite
|
if n = Transforms then Result := clWhite
|
||||||
else
|
else
|
||||||
if chkUseXFormColor.checked then
|
if UseTransformColors then
|
||||||
Result := ColorValToColor(MainCp.cmap, cp.xform[n].color)
|
Result := ColorValToColor(MainCp.cmap, cp.xform[n].color)
|
||||||
else Result := TrgColors[n mod 14];
|
else Result := TrgColors[n mod 14];
|
||||||
end;
|
end;
|
||||||
@ -1006,6 +1049,7 @@ var
|
|||||||
|
|
||||||
var
|
var
|
||||||
a, b, c: TPoint;
|
a, b, c: TPoint;
|
||||||
|
e, f: TPoint;
|
||||||
|
|
||||||
procedure DrawWidgets;
|
procedure DrawWidgets;
|
||||||
var
|
var
|
||||||
@ -1037,6 +1081,8 @@ var
|
|||||||
gp: TRoundToRange;
|
gp: TRoundToRange;
|
||||||
|
|
||||||
tps: TPenStyle;
|
tps: TPenStyle;
|
||||||
|
tT: TTriangle;
|
||||||
|
txx, txy, tyx, tyy: double;
|
||||||
label DrawCorner;
|
label DrawCorner;
|
||||||
begin
|
begin
|
||||||
if (SelectedTriangle < 0) then begin
|
if (SelectedTriangle < 0) then begin
|
||||||
@ -1124,33 +1170,49 @@ begin
|
|||||||
begin
|
begin
|
||||||
if i <> SelectedTriangle then Pen.Style := psDot;
|
if i <> SelectedTriangle then Pen.Style := psDot;
|
||||||
|
|
||||||
// this is still a hack --------------------------------------------------------
|
with cp.xform[i] do // draw post-triangle
|
||||||
with cp.xform[i] do
|
if postXswap or
|
||||||
if (p[0,0]<>1) or (p[0,1]<>0) or(p[1,0]<>0) or (p[1,1]<>1) or (p[2,0]<>0) or (p[2,1]<>0) then
|
(p[0,0]<>1) or (p[0,1]<>0) or
|
||||||
|
(p[1,0]<>0) or (p[1,1]<>1) or
|
||||||
|
(p[2,0]<>0) or (p[2,1]<>0) then
|
||||||
begin
|
begin
|
||||||
Pen.Color := GetTriangleColor(i) shr 1 and $7f7f7f;
|
Pen.Color := GetTriangleColor(i) shr 1 and $7f7f7f;
|
||||||
a:=toscreen(p[0,0] - p[1,0] + p[2,0], -p[0,1] + p[1,1] - p[2,1]);
|
|
||||||
moveto(a.x, a.y);
|
|
||||||
b:=toscreen(p[0,0] + p[1,0] + p[2,0], -p[0,1] - p[1,1] - p[2,1]);
|
|
||||||
lineto(b.x, b.y);
|
|
||||||
b:=toscreen(-p[0,0] + p[1,0] + p[2,0], p[0,1] - p[1,1] - p[2,1]);
|
|
||||||
lineto(b.x, b.y);
|
|
||||||
b:=toscreen(-p[0,0] - p[1,0] + p[2,0], p[0,1] + p[1,1] - p[2,1]);
|
|
||||||
lineto(b.x, b.y);
|
|
||||||
lineto(a.x, a.y);
|
|
||||||
|
|
||||||
|
|
||||||
tps := Pen.Style;
|
tps := Pen.Style;
|
||||||
Pen.Style := psDot;
|
Pen.Style := psDot;
|
||||||
a:=toscreen(p[1,0] + p[2,0], -p[1,1] - p[2,1]);
|
|
||||||
moveto(a.x, a.y);
|
|
||||||
a:=toscreen(-p[1,0] + p[2,0], p[1,1] - p[2,1]);
|
|
||||||
lineto(a.x, a.y);
|
|
||||||
|
|
||||||
a:=toscreen(p[0,0] + p[2,0], -p[0,1] - p[2,1]);
|
cp.GetPostTriangle(tT, i);
|
||||||
lineto(a.x, a.y);
|
txx := tT.x[0] - tT.x[1];
|
||||||
a:=toscreen(-p[0,0] + p[2,0], p[0,1] - p[2,1]);
|
txy := tT.y[0] - tT.y[1];
|
||||||
|
tyx := tT.x[2] - tT.x[1];
|
||||||
|
tyy := tT.y[2] - tT.y[1];
|
||||||
|
a := ToScreen(tT.x[1] + txx + tyx, tT.y[1] + txy + tyy);
|
||||||
|
b := ToScreen(tT.x[1] - txx + tyx, tT.y[1] - txy + tyy);
|
||||||
|
e := ToScreen(tT.x[1] + txx - tyx, tT.y[1] + txy - tyy);
|
||||||
|
f := ToScreen(tT.x[1] - txx - tyx, tT.y[1] - txy - tyy);
|
||||||
|
Polyline([a, b, f, e, a]);
|
||||||
|
|
||||||
|
pen.Style := psSolid;
|
||||||
|
a := ToScreen(tT.x[1] - txx, tT.y[1] - txy);
|
||||||
|
b := ToScreen(tT.x[1] + txx, tT.y[1] + txy);
|
||||||
|
e := ToScreen(tT.x[1] + tyx, tT.y[1] + tyy);
|
||||||
|
f := ToScreen(tT.x[1] - tyx, tT.y[1] - tyy);
|
||||||
|
Polyline([a, b, e, f]);
|
||||||
|
|
||||||
|
if postXswap then begin
|
||||||
|
Pen.Style := psDot;
|
||||||
|
cp.GetTriangle(tT, i);
|
||||||
|
|
||||||
|
a:=toscreen(tT.x[0], tT.y[0]);
|
||||||
|
moveto(a.x, a.y);
|
||||||
|
b:=toscreen(tT.x[2], tT.y[2]);
|
||||||
|
lineto(b.x, b.y);
|
||||||
|
|
||||||
|
pen.Style := psSolid;
|
||||||
|
b:=toscreen(tT.x[1], tT.y[1]);
|
||||||
|
lineto(b.x, b.y);
|
||||||
lineto(a.x, a.y);
|
lineto(a.x, a.y);
|
||||||
|
end;
|
||||||
|
|
||||||
Pen.Style := tps;
|
Pen.Style := tps;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -1525,6 +1587,13 @@ begin
|
|||||||
mouseOverWidget := -1;
|
mouseOverWidget := -1;
|
||||||
oldSelected := -1;
|
oldSelected := -1;
|
||||||
|
|
||||||
|
MemTriangle.x[0] := 1;
|
||||||
|
MemTriangle.y[0] := 0;
|
||||||
|
MemTriangle.x[1] := 0;
|
||||||
|
MemTriangle.y[1] := 0;
|
||||||
|
MemTriangle.x[2] := 0;
|
||||||
|
MemTriangle.y[2] := 1;
|
||||||
|
|
||||||
for i := 0 to NRVAR-1 do
|
for i := 0 to NRVAR-1 do
|
||||||
VarsCache[i] := MinDouble;
|
VarsCache[i] := MinDouble;
|
||||||
end;
|
end;
|
||||||
@ -2215,11 +2284,12 @@ begin
|
|||||||
finally
|
finally
|
||||||
Registry.Free;
|
Registry.Free;
|
||||||
end;
|
end;
|
||||||
chkUseXFormColor.checked := UseTransformColors;
|
// chkUseXFormColor.checked := UseTransformColors;
|
||||||
chkHelpers.Checked := HelpersEnabled;
|
// chkHelpers.Checked := HelpersEnabled;
|
||||||
|
|
||||||
if ExtendedEdit then tbExtendedEdit.Down := true
|
if ExtendedEdit then tbExtendedEdit.Down := true
|
||||||
else tbMove.Down := true;
|
else tbMove.Down := true;
|
||||||
|
|
||||||
UpdateDisplay;
|
UpdateDisplay;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2780,6 +2850,7 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
(*
|
||||||
procedure TEditForm.chkUseXFormColorClick(Sender: TObject);
|
procedure TEditForm.chkUseXFormColorClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
UseTransformColors := chkUseXFormColor.checked;
|
UseTransformColors := chkUseXFormColor.checked;
|
||||||
@ -2791,6 +2862,7 @@ begin
|
|||||||
HelpersEnabled := chkHelpers.checked;
|
HelpersEnabled := chkHelpers.checked;
|
||||||
TriangleView.Invalidate;
|
TriangleView.Invalidate;
|
||||||
end;
|
end;
|
||||||
|
*)
|
||||||
|
|
||||||
procedure TEditForm.txtXFormColorExit(Sender: TObject);
|
procedure TEditForm.txtXFormColorExit(Sender: TObject);
|
||||||
var
|
var
|
||||||
@ -3057,7 +3129,10 @@ begin
|
|||||||
else begin
|
else begin
|
||||||
cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[varDragIndex+1], v);
|
cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[varDragIndex+1], v);
|
||||||
vleVariables.Values[vleVariables.Keys[varDragIndex+1]] := FloatToStr(v);
|
vleVariables.Values[vleVariables.Keys[varDragIndex+1]] := FloatToStr(v);
|
||||||
// cp.xform[SelectedTriangle].GetVariableStr(vleVariables.Keys[varDragIndex+1]);
|
{
|
||||||
|
vleVariables.Values[vleVariables.Keys[varDragIndex+1]] :=
|
||||||
|
cp.xform[SelectedTriangle].GetVariableStr(vleVariables.Keys[varDragIndex+1]);
|
||||||
|
}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
HasChanged := True;
|
HasChanged := True;
|
||||||
@ -3367,6 +3442,7 @@ begin
|
|||||||
// can be changed in the future...
|
// can be changed in the future...
|
||||||
Ord('R'): btnResetPivotClick(Sender);
|
Ord('R'): btnResetPivotClick(Sender);
|
||||||
Ord('P'): btnPickPivotClick(Sender);
|
Ord('P'): btnPickPivotClick(Sender);
|
||||||
|
Ord('T'): tbPostXswapClick(Sender);
|
||||||
|
|
||||||
189: // "-"
|
189: // "-"
|
||||||
begin
|
begin
|
||||||
@ -3465,20 +3541,8 @@ begin
|
|||||||
TriangleView.Invalidate;
|
TriangleView.Invalidate;
|
||||||
ShowSelectedInfo;
|
ShowSelectedInfo;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
VK_SPACE: btnPivotModeClick(Sender);
|
VK_SPACE: btnPivotModeClick(Sender);
|
||||||
|
|
||||||
{ // these keys are not so good, must think about it...
|
|
||||||
|
|
||||||
Ord('Q'): EditForm.tbEditModeClick(tbMove);
|
|
||||||
Ord('W'): EditForm.tbEditModeClick(tbRotate);
|
|
||||||
Ord('E'): EditForm.tbEditModeClick(tbScale);
|
|
||||||
|
|
||||||
Ord('A'): PageControl.TabIndex := 0;
|
|
||||||
Ord('S'): PageControl.TabIndex := 1;
|
|
||||||
Ord('D'): PageControl.TabIndex := 2;
|
|
||||||
Ord('F'): PageControl.TabIndex := 3;
|
|
||||||
}
|
|
||||||
else
|
else
|
||||||
key_handled := false;
|
key_handled := false;
|
||||||
exit;
|
exit;
|
||||||
@ -3518,11 +3582,24 @@ end;
|
|||||||
|
|
||||||
procedure TEditForm.TriangleViewMouseWheel(Sender: TObject; Shift: TShiftState;
|
procedure TEditForm.TriangleViewMouseWheel(Sender: TObject; Shift: TShiftState;
|
||||||
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
WheelDelta: Integer; MousePos: TPoint; var Handled: Boolean);
|
||||||
|
var
|
||||||
|
fx, fy, sc: double;
|
||||||
|
p: TPoint;
|
||||||
begin
|
begin
|
||||||
|
p := TriangleView.ScreenToClient(MousePos);
|
||||||
|
Scale(fx, fy, p.X, p.Y);
|
||||||
|
|
||||||
if WheelDelta > 0 then GraphZoom := GraphZoom * 1.25
|
if WheelDelta > 0 then GraphZoom := GraphZoom * 1.25
|
||||||
else GraphZoom := GraphZoom * 0.8;
|
else GraphZoom := GraphZoom * 0.8;
|
||||||
|
|
||||||
EditForm.StatusBar.Panels[2].Text := Format('Zoom: %f', [GraphZoom]);
|
EditForm.StatusBar.Panels[2].Text := Format('Zoom: %f', [GraphZoom]);
|
||||||
|
|
||||||
|
if viewDragMode then begin
|
||||||
|
sc := GraphZoom * 50;
|
||||||
|
gCenterX := fx - (p.X - TriangleView.Width/2) / sc;
|
||||||
|
gCenterY := fy + (p.Y - TriangleView.Height/2) / sc;
|
||||||
|
end;
|
||||||
|
|
||||||
TriangleView.Invalidate;
|
TriangleView.Invalidate;
|
||||||
Handled := true;
|
Handled := true;
|
||||||
end;
|
end;
|
||||||
@ -3535,7 +3612,16 @@ begin
|
|||||||
case mouseOverCorner of
|
case mouseOverCorner of
|
||||||
0: if editMode = modeRotate then ResetAxisRotation(0) else ResetAxisScale(0);
|
0: if editMode = modeRotate then ResetAxisRotation(0) else ResetAxisScale(0);
|
||||||
1: if editMode = modeRotate then ResetAxisRotation(1)
|
1: if editMode = modeRotate then ResetAxisRotation(1)
|
||||||
else if editMode = modeScale then ResetAxisScale(1) else btnOcoefsClick(Sender);
|
else begin
|
||||||
|
if editMode = modeScale then
|
||||||
|
ResetAxisScale(1)
|
||||||
|
else begin
|
||||||
|
if cp.xform[SelectedTriangle].postXswap then
|
||||||
|
btnOpostClick(Sender)
|
||||||
|
else
|
||||||
|
btnOcoefsClick(Sender);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
2: if editMode = modeRotate then ResetAxisRotation(2) else ResetAxisScale(2);
|
2: if editMode = modeRotate then ResetAxisRotation(2) else ResetAxisScale(2);
|
||||||
end;
|
end;
|
||||||
end
|
end
|
||||||
@ -3602,10 +3688,10 @@ end;
|
|||||||
|
|
||||||
procedure TEditForm.tbAxisLockClick(Sender: TObject);
|
procedure TEditForm.tbAxisLockClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
if Sender = chkAxisLock then AxisLock := chkAxisLock.Checked
|
{if Sender = chkAxisLock then AxisLock := chkAxisLock.Checked
|
||||||
else AxisLock := not AxisLock;
|
else} AxisLock := not AxisLock;
|
||||||
tbAxisLock.Down := AxisLock;
|
tbAxisLock.Down := AxisLock;
|
||||||
chkAxisLock.Checked := AxisLock;
|
//chkAxisLock.Checked := AxisLock;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TEditForm.tbFullViewClick(Sender: TObject);
|
procedure TEditForm.tbFullViewClick(Sender: TObject);
|
||||||
@ -3619,14 +3705,11 @@ procedure TEditForm.ValidateVariable;
|
|||||||
var
|
var
|
||||||
i: integer;
|
i: integer;
|
||||||
NewVal, OldVal: double;
|
NewVal, OldVal: double;
|
||||||
|
str, oldstr: string;
|
||||||
begin
|
begin
|
||||||
i := vleVariables.Row;
|
i := vleVariables.Row;
|
||||||
|
|
||||||
{ oldstr := cp.xform[SelectedTriangle].GetVariableStr(vleVariables.Keys[i]);
|
{$ifndef VAR_STR}
|
||||||
str := vleVariables.Values[vleVariables.Keys[i]];
|
|
||||||
cp.xform[SelectedTriangle].SetVariableStr(vleVariables.Keys[i], str);
|
|
||||||
}
|
|
||||||
|
|
||||||
cp.xform[SelectedTriangle].GetVariable(vleVariables.Keys[i], OldVal);
|
cp.xform[SelectedTriangle].GetVariable(vleVariables.Keys[i], OldVal);
|
||||||
{ Test that it's a valid floating point number }
|
{ Test that it's a valid floating point number }
|
||||||
try
|
try
|
||||||
@ -3639,15 +3722,30 @@ begin
|
|||||||
end;
|
end;
|
||||||
{ 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) then
|
if (NewVal <> OldVal) then
|
||||||
// if str <> oldstr then
|
|
||||||
begin
|
begin
|
||||||
MainForm.UpdateUndo;
|
MainForm.UpdateUndo;
|
||||||
|
|
||||||
cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[i], NewVal);
|
cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[i], NewVal);
|
||||||
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [NewVal]);
|
vleVariables.Values[vleVariables.Keys[i]] := Format('%.6g', [NewVal]);
|
||||||
//vleVariables.Values[vleVariables.Keys[i]] := str; //Format('%.6g', [NewVal]);
|
|
||||||
ShowSelectedInfo;
|
ShowSelectedInfo;
|
||||||
UpdateFlame(True);
|
UpdateFlame(True);
|
||||||
end;
|
end;
|
||||||
|
{$else}
|
||||||
|
oldstr := cp.xform[SelectedTriangle].GetVariableStr(vleVariables.Keys[i]);
|
||||||
|
str := vleVariables.Values[vleVariables.Keys[i]];
|
||||||
|
cp.xform[SelectedTriangle].SetVariableStr(vleVariables.Keys[i], str);
|
||||||
|
|
||||||
|
if str <> oldstr then
|
||||||
|
begin
|
||||||
|
MainForm.UpdateUndo;
|
||||||
|
|
||||||
|
vleVariables.Values[vleVariables.Keys[i]] := str;
|
||||||
|
|
||||||
|
ShowSelectedInfo;
|
||||||
|
UpdateFlame(True);
|
||||||
|
end;
|
||||||
|
{$endif}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TEditForm.vleVariablesExit(Sender: TObject);
|
procedure TEditForm.vleVariablesExit(Sender: TObject);
|
||||||
@ -3710,9 +3808,27 @@ end;
|
|||||||
|
|
||||||
procedure TEditForm.mnuResetClick(Sender: TObject);
|
procedure TEditForm.mnuResetClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
|
{
|
||||||
MainForm.UpdateUndo;
|
MainForm.UpdateUndo;
|
||||||
MainTriangles[SelectedTriangle] := MainTriangles[-1];
|
MainTriangles[SelectedTriangle] := MainTriangles[-1];
|
||||||
UpdateFlame(True);
|
UpdateFlame(True);
|
||||||
|
}
|
||||||
|
with cp.xform[SelectedTriangle] do
|
||||||
|
begin
|
||||||
|
if (c[0,0]<>1) or (c[0,1]<>0) or(c[1,0]<>0) or (c[1,1]<>1) or (c[2,0]<>0) or (c[2,1]<>0) then
|
||||||
|
begin
|
||||||
|
MainForm.UpdateUndo;
|
||||||
|
c[0, 0] := 1;
|
||||||
|
c[0, 1] := 0;
|
||||||
|
c[1, 0] := 0;
|
||||||
|
c[1, 1] := 1;
|
||||||
|
c[2, 0] := 0;
|
||||||
|
c[2, 1] := 0;
|
||||||
|
ShowSelectedInfo;
|
||||||
|
cp.TrianglesFromCP(MainTriangles);
|
||||||
|
UpdateFlame(True);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TEditForm.mnuResetAllClick(Sender: TObject);
|
procedure TEditForm.mnuResetAllClick(Sender: TObject);
|
||||||
@ -3783,6 +3899,12 @@ end;
|
|||||||
|
|
||||||
procedure TEditForm.btnOcoefsClick(Sender: TObject);
|
procedure TEditForm.btnOcoefsClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
|
if (sender = mnuResetTrgPosition) and cp.xform[SelectedTriangle].postXswap then
|
||||||
|
begin
|
||||||
|
btnOpostClick(Sender);
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
|
||||||
if (cp.xform[SelectedTriangle].c[2][0] = 0) and
|
if (cp.xform[SelectedTriangle].c[2][0] = 0) and
|
||||||
(cp.xform[SelectedTriangle].c[2][1] = 0) then exit;
|
(cp.xform[SelectedTriangle].c[2][1] = 0) then exit;
|
||||||
|
|
||||||
@ -3834,6 +3956,7 @@ begin
|
|||||||
p[0][0] := 1;
|
p[0][0] := 1;
|
||||||
p[0][1] := 0;
|
p[0][1] := 0;
|
||||||
end;
|
end;
|
||||||
|
cp.TrianglesFromCP(MainTriangles);
|
||||||
UpdateFlame(True);
|
UpdateFlame(True);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3845,6 +3968,7 @@ begin
|
|||||||
MainForm.UpdateUndo;
|
MainForm.UpdateUndo;
|
||||||
cp.xform[SelectedTriangle].p[1][0] := 0;
|
cp.xform[SelectedTriangle].p[1][0] := 0;
|
||||||
cp.xform[SelectedTriangle].p[1][1] := 1;
|
cp.xform[SelectedTriangle].p[1][1] := 1;
|
||||||
|
cp.TrianglesFromCP(MainTriangles);
|
||||||
UpdateFlame(True);
|
UpdateFlame(True);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3856,6 +3980,7 @@ begin
|
|||||||
MainForm.UpdateUndo;
|
MainForm.UpdateUndo;
|
||||||
cp.xform[SelectedTriangle].p[2][0] := 0;
|
cp.xform[SelectedTriangle].p[2][0] := 0;
|
||||||
cp.xform[SelectedTriangle].p[2][1] := 0;
|
cp.xform[SelectedTriangle].p[2][1] := 0;
|
||||||
|
cp.TrianglesFromCP(MainTriangles);
|
||||||
UpdateFlame(True);
|
UpdateFlame(True);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -3931,11 +4056,14 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
cp.TrianglesFromCP(MainTriangles);
|
||||||
|
|
||||||
ShowSelectedInfo;
|
ShowSelectedInfo;
|
||||||
UpdateFlame(true);
|
UpdateFlame(true);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
procedure TEditForm.btnResetPostXFormClick(Sender: TObject);
|
procedure TEditForm.btnResetPostCoefsClick(Sender: TObject);
|
||||||
begin
|
begin
|
||||||
with cp.xform[SelectedTriangle] do
|
with cp.xform[SelectedTriangle] do
|
||||||
begin
|
begin
|
||||||
@ -3949,6 +4077,7 @@ begin
|
|||||||
p[2, 0] := 0;
|
p[2, 0] := 0;
|
||||||
p[2, 1] := 0;
|
p[2, 1] := 0;
|
||||||
ShowSelectedInfo;
|
ShowSelectedInfo;
|
||||||
|
cp.TrianglesFromCP(MainTriangles);
|
||||||
UpdateFlame(True);
|
UpdateFlame(True);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -4052,27 +4181,6 @@ begin
|
|||||||
btnPickPivot.Down := true;
|
btnPickPivot.Down := true;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
// this function is temporary...................................................
|
|
||||||
procedure TEditForm.btnPostTriangleClick(Sender: TObject);
|
|
||||||
var
|
|
||||||
i, j: integer;
|
|
||||||
t: double;
|
|
||||||
begin
|
|
||||||
MainForm.UpdateUndo;
|
|
||||||
for i := 0 to 2 do
|
|
||||||
for j := 0 to 1 do
|
|
||||||
with cp.xform[SelectedTriangle] do
|
|
||||||
begin
|
|
||||||
t:=c[i,j];
|
|
||||||
c[i,j]:=p[i,j];
|
|
||||||
p[i,j]:=t;
|
|
||||||
end;
|
|
||||||
cp.TrianglesFromCP(MainTriangles);
|
|
||||||
ShowSelectedInfo;
|
|
||||||
UpdateFlame(true);
|
|
||||||
end;
|
|
||||||
// .............................................................................
|
|
||||||
|
|
||||||
procedure TEditForm.VEVarsDrawCell(Sender: TObject; ACol, ARow: Integer;
|
procedure TEditForm.VEVarsDrawCell(Sender: TObject; ACol, ARow: Integer;
|
||||||
Rect: TRect; State: TGridDrawState);
|
Rect: TRect; State: TGridDrawState);
|
||||||
begin
|
begin
|
||||||
@ -4413,5 +4521,54 @@ begin
|
|||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure TEditForm.tbPostXswapClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
cp.GetFromTriangles(MainTriangles, cp.NumXForms);
|
||||||
|
with cp.xform[SelectedTriangle] do begin
|
||||||
|
{ if sender = chkPostXswap then begin
|
||||||
|
postXswap := chkPostXswap.Checked;
|
||||||
|
tbPostXswap.Down := postXswap;
|
||||||
|
tb2PostXswap.Down := postXswap;
|
||||||
|
end
|
||||||
|
else begin
|
||||||
|
chkPostXswap.Checked := not postXswap;
|
||||||
|
exit;
|
||||||
|
end;
|
||||||
|
}
|
||||||
|
if (sender = tbPostXswap) or (sender = tb2PostXswap) then
|
||||||
|
postXswap := TToolButton(sender).Down
|
||||||
|
else
|
||||||
|
postXswap := not postXswap;
|
||||||
|
tbPostXswap.Down := postXswap;
|
||||||
|
tb2PostXswap.Down := postXswap;
|
||||||
|
|
||||||
|
// bvlPostCoefs.Visible := postXswap;
|
||||||
|
// bvlCoefs.Visible := not postXswap;
|
||||||
|
ShowSelectedInfo;
|
||||||
|
end;
|
||||||
|
cp.TrianglesFromCP(MainTriangles);
|
||||||
|
TriangleView.Refresh;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TEditForm.btnCopyTriangleClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
MemTriangle := MainTriangles[SelectedTriangle];
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TEditForm.btnPasteTriangleClick(Sender: TObject);
|
||||||
|
begin
|
||||||
|
if (MainTriangles[SelectedTriangle].x[0] <> MemTriangle.x[0]) or
|
||||||
|
(MainTriangles[SelectedTriangle].x[1] <> MemTriangle.x[1]) or
|
||||||
|
(MainTriangles[SelectedTriangle].x[2] <> MemTriangle.x[2]) or
|
||||||
|
(MainTriangles[SelectedTriangle].y[0] <> MemTriangle.y[0]) or
|
||||||
|
(MainTriangles[SelectedTriangle].y[1] <> MemTriangle.y[1]) or
|
||||||
|
(MainTriangles[SelectedTriangle].y[2] <> MemTriangle.y[2]) then
|
||||||
|
begin
|
||||||
|
MainForm.UpdateUndo;
|
||||||
|
MainTriangles[SelectedTriangle] := MemTriangle;
|
||||||
|
UpdateFlame(True);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
|
||||||
|
@ -299,7 +299,6 @@ object MainForm: TMainForm
|
|||||||
Caption = 'ToolButton2'
|
Caption = 'ToolButton2'
|
||||||
ImageIndex = 39
|
ImageIndex = 39
|
||||||
Style = tbsSeparator
|
Style = tbsSeparator
|
||||||
Visible = False
|
|
||||||
end
|
end
|
||||||
object tbShowTrace: TToolButton
|
object tbShowTrace: TToolButton
|
||||||
Left = 579
|
Left = 579
|
||||||
@ -307,7 +306,6 @@ object MainForm: TMainForm
|
|||||||
Hint = 'Show trace window'
|
Hint = 'Show trace window'
|
||||||
Caption = 'tbShowTrace'
|
Caption = 'tbShowTrace'
|
||||||
ImageIndex = 38
|
ImageIndex = 38
|
||||||
Visible = False
|
|
||||||
OnClick = tbShowTraceClick
|
OnClick = tbShowTraceClick
|
||||||
end
|
end
|
||||||
end
|
end
|
||||||
|
@ -21,6 +21,8 @@
|
|||||||
|
|
||||||
unit Main;
|
unit Main;
|
||||||
|
|
||||||
|
//{$define VAR_STR}
|
||||||
|
|
||||||
interface
|
interface
|
||||||
|
|
||||||
uses
|
uses
|
||||||
@ -39,7 +41,7 @@ const
|
|||||||
RS_XO = 2;
|
RS_XO = 2;
|
||||||
RS_VO = 3;
|
RS_VO = 3;
|
||||||
|
|
||||||
AppVersionString = 'Apophysis 2.05 beta';
|
AppVersionString = 'Apophysis 2.05 post-release 2';
|
||||||
|
|
||||||
type
|
type
|
||||||
TMouseMoveState = (msUsual, msZoomWindow, msZoomOutWindow, msZoomWindowMove,
|
TMouseMoveState = (msUsual, msZoomWindow, msZoomOutWindow, msZoomWindowMove,
|
||||||
@ -2225,8 +2227,13 @@ begin
|
|||||||
Strings.Add(' ' + xf_str + '_var_' + VarNames(i) + '=' +
|
Strings.Add(' ' + xf_str + '_var_' + VarNames(i) + '=' +
|
||||||
floatToStr(cp1.xform[m].vars[i]));
|
floatToStr(cp1.xform[m].vars[i]));
|
||||||
for j:= 0 to GetNrVariableNames - 1 do begin
|
for j:= 0 to GetNrVariableNames - 1 do begin
|
||||||
|
{$ifndef VAR_STR}
|
||||||
cp1.xform[m].GetVariable(GetVariableNameAt(j), v);
|
cp1.xform[m].GetVariable(GetVariableNameAt(j), v);
|
||||||
Strings.Add(' ' + xf_str + '_par_' + GetVariableNameAt(j) + '=' + floatToStr(v));
|
Strings.Add(' ' + xf_str + '_par_' + GetVariableNameAt(j) + '=' + floatToStr(v));
|
||||||
|
{$else}
|
||||||
|
Strings.Add(' ' + xf_str + '_par_' +
|
||||||
|
GetVariableNameAt(j) + '=' + cp1.xform[m].GetVariableStr(GetVariableNameAt(j)));
|
||||||
|
{$endif}
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -4183,8 +4190,12 @@ begin
|
|||||||
for i := 0 to GetNrVariableNames - 1 do begin
|
for i := 0 to GetNrVariableNames - 1 do begin
|
||||||
v := Attributes.Value(GetVariableNameAt(i));
|
v := Attributes.Value(GetVariableNameAt(i));
|
||||||
if v <> '' then begin
|
if v <> '' then begin
|
||||||
|
{$ifndef VAR_STR}
|
||||||
d := StrToFloat(v);
|
d := StrToFloat(v);
|
||||||
SetVariable(GetVariableNameAt(i), d);
|
SetVariable(GetVariableNameAt(i), d);
|
||||||
|
{$else}
|
||||||
|
SetVariableStr(GetVariableNameAt(i), v);
|
||||||
|
{$endif}
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
@ -4601,7 +4612,7 @@ const
|
|||||||
cornerSize = 32;
|
cornerSize = 32;
|
||||||
var
|
var
|
||||||
bkuPen: TPen;
|
bkuPen: TPen;
|
||||||
dx, dy: integer;
|
dx, dy, cx, cy: integer;
|
||||||
l, r, t, b: integer;
|
l, r, t, b: integer;
|
||||||
begin
|
begin
|
||||||
bkuPen := TPen.Create;
|
bkuPen := TPen.Create;
|
||||||
@ -4659,7 +4670,14 @@ begin
|
|||||||
MoveTo(l + dx, b);
|
MoveTo(l + dx, b);
|
||||||
LineTo(l, b);
|
LineTo(l, b);
|
||||||
LineTo(l, b - dy);
|
LineTo(l, b - dy);
|
||||||
|
{
|
||||||
|
cx := (l + r) div 2;
|
||||||
|
cy := (t + b) div 2;
|
||||||
|
MoveTo(cx - dx div 2, cy);
|
||||||
|
LineTo(cx + dx div 2 + 1, cy);
|
||||||
|
MoveTo(cx, cy - dy div 2);
|
||||||
|
LineTo(cx, cy + dy div 2 + 1);
|
||||||
|
}
|
||||||
Pen.Assign(bkuPen);
|
Pen.Assign(bkuPen);
|
||||||
end;
|
end;
|
||||||
bkuPen.Free;
|
bkuPen.Free;
|
||||||
|
@ -70,7 +70,7 @@ procedure TTraceForm.FormCreate(Sender: TObject);
|
|||||||
var
|
var
|
||||||
Registry: TRegistry;
|
Registry: TRegistry;
|
||||||
begin
|
begin
|
||||||
TraceLevel := 0; // Tracer disabled in release version
|
//TraceLevel := 0; // Tracer disabled in release version
|
||||||
|
|
||||||
{ Read position from registry }
|
{ Read position from registry }
|
||||||
Registry := TRegistry.Create;
|
Registry := TRegistry.Create;
|
||||||
|
@ -36,7 +36,7 @@ type
|
|||||||
symmetry: double;
|
symmetry: double;
|
||||||
c00, c01, c10, c11, c20, c21: double;// unnecessary duplicated variables
|
c00, c01, c10, c11, c20, c21: double;// unnecessary duplicated variables
|
||||||
p00, p01, p10, p11, p20, p21: double;// :-)
|
p00, p01, p10, p11, p20, p21: double;// :-)
|
||||||
|
postXswap: boolean;
|
||||||
// nx,ny,x,y: double;
|
// nx,ny,x,y: double;
|
||||||
// script: TatPascalScripter;
|
// script: TatPascalScripter;
|
||||||
|
|
||||||
@ -132,6 +132,9 @@ type
|
|||||||
procedure SetVariable(const name: string; var Value: double);
|
procedure SetVariable(const name: string; var Value: double);
|
||||||
procedure ResetVariable(const name: string);
|
procedure ResetVariable(const name: string);
|
||||||
|
|
||||||
|
function GetVariableStr(const name: string): string;
|
||||||
|
procedure SetVariableStr(const name: string; var Value: string);
|
||||||
|
|
||||||
function ToXMLString: string;
|
function ToXMLString: string;
|
||||||
function FinalToXMLString(IsEnabled: boolean): string;
|
function FinalToXMLString(IsEnabled: boolean): string;
|
||||||
end;
|
end;
|
||||||
@ -172,6 +175,7 @@ begin
|
|||||||
density := 0;
|
density := 0;
|
||||||
color := 0;
|
color := 0;
|
||||||
symmetry := 0;
|
symmetry := 0;
|
||||||
|
postXswap := false;
|
||||||
|
|
||||||
c[0, 0] := 1;
|
c[0, 0] := 1;
|
||||||
c[0, 1] := 0;
|
c[0, 1] := 0;
|
||||||
@ -1998,6 +2002,8 @@ begin
|
|||||||
symmetry := XForm.symmetry;
|
symmetry := XForm.symmetry;
|
||||||
Orientationtype := XForm.Orientationtype;
|
Orientationtype := XForm.Orientationtype;
|
||||||
|
|
||||||
|
postXswap := Xform.postXswap;
|
||||||
|
|
||||||
for i := 0 to High(FRegVariations) do begin
|
for i := 0 to High(FRegVariations) do begin
|
||||||
for j:= 0 to FRegVariations[i].GetNrVariables -1 do begin
|
for j:= 0 to FRegVariations[i].GetNrVariables -1 do begin
|
||||||
Name := FRegVariations[i].GetVariableNameAt(j);
|
Name := FRegVariations[i].GetVariableNameAt(j);
|
||||||
@ -2029,8 +2035,9 @@ begin
|
|||||||
if vars[i+NRLOCVAR] <> 0 then
|
if vars[i+NRLOCVAR] <> 0 then
|
||||||
for j:= 0 to FRegVariations[i].GetNrVariables -1 do begin
|
for j:= 0 to FRegVariations[i].GetNrVariables -1 do begin
|
||||||
Name := FRegVariations[i].GetVariableNameAt(j);
|
Name := FRegVariations[i].GetVariableNameAt(j);
|
||||||
FRegVariations[i].GetVariable(Name,Value);
|
// FRegVariations[i].GetVariable(Name,Value);
|
||||||
Result := Result + Format('%s="%g" ', [name, value]);
|
// Result := Result + Format('%s="%g" ', [name, value]);
|
||||||
|
Result := Result + Format('%s="%s" ', [name, FRegVariations[i].GetVariableStr(Name)]);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2059,8 +2066,9 @@ begin
|
|||||||
if vars[i+NRLOCVAR] <> 0 then
|
if vars[i+NRLOCVAR] <> 0 then
|
||||||
for j:= 0 to FRegVariations[i].GetNrVariables -1 do begin
|
for j:= 0 to FRegVariations[i].GetNrVariables -1 do begin
|
||||||
Name := FRegVariations[i].GetVariableNameAt(j);
|
Name := FRegVariations[i].GetVariableNameAt(j);
|
||||||
FRegVariations[i].GetVariable(Name,Value);
|
// FRegVariations[i].GetVariable(Name,Value);
|
||||||
Result := Result + Format('%s="%g" ', [name, value]);
|
// Result := Result + Format('%s="%g" ', [name, value]);
|
||||||
|
Result := Result + Format('%s="%s" ', [name, FRegVariations[i].GetVariableStr(Name)]);
|
||||||
end;
|
end;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
@ -2096,5 +2104,23 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
///////////////////////////////////////////////////////////////////////////////
|
///////////////////////////////////////////////////////////////////////////////
|
||||||
|
function TXForm.GetVariableStr(const name: string): string;
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
for i := 0 to High(FRegVariations) do begin
|
||||||
|
Result := FRegVariations[i].GetVariableStr(name);
|
||||||
|
if Result <> '' then break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure TXForm.SetVariableStr(const name: string; var Value: string);
|
||||||
|
var
|
||||||
|
i: integer;
|
||||||
|
begin
|
||||||
|
for i := 0 to High(FRegVariations) do begin
|
||||||
|
if FRegVariations[i].SetVariableStr(name, value) then break;
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
end.
|
end.
|
||||||
|
Loading…
Reference in New Issue
Block a user