normalize weights removed

removed duplicate functions
some bugs fixed, some bugs added
some other changes, can't remember them all ;)
This commit is contained in:
zueuk 2005-09-29 14:11:29 +00:00
parent 17e6f74a65
commit a058009ad0
14 changed files with 578 additions and 461 deletions

View File

@ -708,9 +708,11 @@ object AdjustForm: TAdjustForm
end end
object cmbPalette: TComboBox object cmbPalette: TComboBox
Left = 72 Left = 72
Top = 79 Top = 78
Width = 206 Width = 206
Height = 19 Height = 21
BevelInner = bvLowered
BevelOuter = bvRaised
Style = csOwnerDrawFixed Style = csOwnerDrawFixed
Color = clBlack Color = clBlack
DropDownCount = 20 DropDownCount = 20
@ -719,7 +721,7 @@ object AdjustForm: TAdjustForm
Font.Height = -11 Font.Height = -11
Font.Name = 'Tahoma' Font.Name = 'Tahoma'
Font.Style = [] Font.Style = []
ItemHeight = 13 ItemHeight = 15
ParentFont = False ParentFont = False
ParentShowHint = False ParentShowHint = False
ShowHint = False ShowHint = False
@ -816,105 +818,114 @@ object AdjustForm: TAdjustForm
object TabSheet4: TTabSheet object TabSheet4: TTabSheet
Caption = 'Image Size' Caption = 'Image Size'
ImageIndex = 3 ImageIndex = 3
object Bevel2: TBevel
Left = 4
Top = 4
Width = 137
Height = 93
Shape = bsFrame
end
object Bevel1: TBevel
Left = 148
Top = 4
Width = 148
Height = 93
Shape = bsFrame
end
object Label2: TLabel object Label2: TLabel
Left = 58 Left = 14
Top = 15 Top = 15
Width = 28 Width = 28
Height = 13 Height = 13
Caption = 'Width' Caption = 'Width'
end end
object Label3: TLabel object Label3: TLabel
Left = 58 Left = 14
Top = 39 Top = 41
Width = 31 Width = 31
Height = 13 Height = 13
Caption = 'Height' Caption = 'Height'
end end
object Bevel1: TBevel
Left = 48
Top = 4
Width = 137
Height = 93
Shape = bsFrame
end
object Bevel2: TBevel
Left = 192
Top = 4
Width = 148
Height = 93
Shape = bsFrame
end
object chkMaintain: TCheckBox
Left = 56
Top = 68
Width = 121
Height = 17
Caption = 'Maintain aspect ratio'
TabOrder = 0
OnClick = chkMaintainClick
end
object btnPreset1: TButton object btnPreset1: TButton
Left = 200 Left = 156
Top = 12 Top = 12
Width = 105 Width = 105
Height = 25 Height = 25
Caption = 'Preset 1' Caption = 'Preset 1'
TabOrder = 1 TabOrder = 0
OnClick = btnPreset1Click OnClick = btnPreset1Click
end end
object btnPreset2: TButton object btnPreset2: TButton
Left = 200 Left = 156
Top = 38 Top = 38
Width = 105 Width = 105
Height = 25 Height = 25
Caption = 'Preset 2' Caption = 'Preset 2'
TabOrder = 2 TabOrder = 1
OnClick = btnPreset2Click OnClick = btnPreset2Click
end end
object btnPreset3: TButton object btnPreset3: TButton
Left = 200 Left = 156
Top = 64 Top = 64
Width = 105 Width = 105
Height = 25 Height = 25
Caption = 'Preset 3' Caption = 'Preset 3'
TabOrder = 3 TabOrder = 2
OnClick = btnPreset3Click OnClick = btnPreset3Click
end end
object btnSet1: TButton object btnSet1: TButton
Left = 304 Left = 260
Top = 12 Top = 12
Width = 27 Width = 27
Height = 25 Height = 25
Caption = 'Set' Caption = 'Set'
TabOrder = 4 TabOrder = 3
OnClick = btnSet1Click OnClick = btnSet1Click
end end
object btnSet2: TButton object btnSet2: TButton
Left = 304 Left = 260
Top = 38 Top = 38
Width = 27 Width = 27
Height = 25 Height = 25
Caption = 'Set' Caption = 'Set'
TabOrder = 5 TabOrder = 4
OnClick = btnSet2Click OnClick = btnSet2Click
end end
object btnSet3: TButton object btnSet3: TButton
Left = 304 Left = 260
Top = 64 Top = 64
Width = 27 Width = 27
Height = 25 Height = 25
Caption = 'Set' Caption = 'Set'
TabOrder = 6 TabOrder = 5
OnClick = btnSet3Click OnClick = btnSet3Click
end end
object btnApplySize: TBitBtn
Left = 302
Top = 72
Width = 75
Height = 25
Caption = 'Apply'
TabOrder = 6
OnClick = btnApplySizeClick
end
object chkMaintain: TCheckBox
Left = 14
Top = 70
Width = 121
Height = 19
Caption = 'Maintain aspect ratio'
TabOrder = 7
OnClick = chkMaintainClick
end
object txtWidth: TComboBox object txtWidth: TComboBox
Left = 104 Left = 60
Top = 12 Top = 12
Width = 73 Width = 73
Height = 21 Height = 21
ItemHeight = 13 ItemHeight = 13
ItemIndex = 0 ItemIndex = 0
TabOrder = 7 TabOrder = 8
Text = '512' Text = '512'
OnChange = txtWidthChange OnChange = txtWidthChange
OnKeyPress = txtSizeKeyPress OnKeyPress = txtSizeKeyPress
@ -926,13 +937,13 @@ object AdjustForm: TAdjustForm
'1280') '1280')
end end
object txtHeight: TComboBox object txtHeight: TComboBox
Left = 104 Left = 60
Top = 36 Top = 38
Width = 73 Width = 73
Height = 21 Height = 21
ItemHeight = 13 ItemHeight = 13
ItemIndex = 0 ItemIndex = 0
TabOrder = 8 TabOrder = 9
Text = '384' Text = '384'
OnChange = txtHeightChange OnChange = txtHeightChange
OnKeyPress = txtSizeKeyPress OnKeyPress = txtSizeKeyPress

View File

@ -111,23 +111,24 @@ type
ApplicationEvents: TApplicationEvents; ApplicationEvents: TApplicationEvents;
lblOffset: TLabel; lblOffset: TLabel;
TabSheet4: TTabSheet; TabSheet4: TTabSheet;
Label2: TLabel;
Label3: TLabel;
chkMaintain: TCheckBox;
btnPreset1: TButton; btnPreset1: TButton;
btnPreset2: TButton; btnPreset2: TButton;
btnPreset3: TButton; btnPreset3: TButton;
btnSet1: TButton; btnSet1: TButton;
btnSet2: TButton; btnSet2: TButton;
btnSet3: TButton; btnSet3: TButton;
txtWidth: TComboBox;
txtHeight: TComboBox;
Bevel1: TBevel;
Bevel2: TBevel;
btnUndo: TSpeedButton; btnUndo: TSpeedButton;
btnRedo: TSpeedButton; btnRedo: TSpeedButton;
chkTransparent: TCheckBox; chkTransparent: TCheckBox;
btnColorPreset: TSpeedButton; btnColorPreset: TSpeedButton;
Bevel1: TBevel;
btnApplySize: TBitBtn;
Label2: TLabel;
Label3: TLabel;
chkMaintain: TCheckBox;
txtWidth: TComboBox;
txtHeight: TComboBox;
Bevel2: TBevel;
procedure FormCreate(Sender: TObject); procedure FormCreate(Sender: TObject);
procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormClose(Sender: TObject; var Action: TCloseAction);
procedure FormDestroy(Sender: TObject); procedure FormDestroy(Sender: TObject);
@ -194,7 +195,7 @@ type
// --Z-- // gradient functions // --Z-- // gradient functions
procedure cmbPaletteChange(Sender: TObject); procedure cmbPaletteChange(Sender: TObject);
procedure DrawPalette; // procedure DrawPalette;
procedure mnuReverseClick(Sender: TObject); procedure mnuReverseClick(Sender: TObject);
procedure mnuInvertClick(Sender: TObject); procedure mnuInvertClick(Sender: TObject);
procedure btnMenuClick(Sender: TObject); procedure btnMenuClick(Sender: TObject);
@ -243,6 +244,7 @@ type
procedure btnRedoClick(Sender: TObject); procedure btnRedoClick(Sender: TObject);
procedure GradientImageDblClick(Sender: TObject); procedure GradientImageDblClick(Sender: TObject);
procedure btnColorPresetClick(Sender: TObject); procedure btnColorPresetClick(Sender: TObject);
procedure btnApplySizeClick(Sender: TObject);
private private
Resetting: boolean; Resetting: boolean;
@ -320,7 +322,6 @@ begin
pw := PrevPnl.Width - 2; pw := PrevPnl.Width - 2;
ph := PrevPnl.Height - 2; ph := PrevPnl.Height - 2;
cp.copy(MainCp); cp.copy(MainCp);
// --Z-- actually this isn not correct: // if cp.width > cp.height then
if (cp.width / cp.height) > (PrevPnl.Width / PrevPnl.Height) then if (cp.width / cp.height) > (PrevPnl.Width / PrevPnl.Height) then
begin begin
PreviewImage.Width := pw; PreviewImage.Width := pw;
@ -361,16 +362,17 @@ begin
GetMainWindowSize; GetMainWindowSize;
Resetting := False;
DrawPreview;
// gradient // gradient
if cp.cmapindex >= 0 then if cp.cmapindex >= 0 then
cmbPalette.ItemIndex := cp.cmapindex; cmbPalette.ItemIndex := cp.cmapindex;
ScrollBar.Position := 0; // ScrollBar.Position := 0;
Palette := cp.cmap; Palette := cp.cmap;
BackupPal := cp.cmap; BackupPal := cp.cmap;
DrawPalette;
Resetting := False;
DrawPreview;
//DrawPalette;
end; end;
procedure TAdjustForm.UpdateFlame; procedure TAdjustForm.UpdateFlame;
@ -388,6 +390,10 @@ begin
end; end;
procedure TAdjustForm.DrawPreview; procedure TAdjustForm.DrawPreview;
var
i: integer;
Row: pRGBTripleArray;
BitMap: TBitMap;
begin begin
if not Resetting then begin if not Resetting then begin
Render.Stop; Render.Stop;
@ -406,7 +412,30 @@ begin
PreviewImage.Refresh; // --Z-- why was commented out? ;-) PreviewImage.Refresh; // --Z-- why was commented out? ;-)
DrawPalette; // (?) //--begin DrawPalette
BitMap := TBitMap.Create;
try
Bitmap.PixelFormat := pf24bit;
BitMap.Width := 256;
BitMap.Height := 1;
Row := Bitmap.Scanline[0];
for i := 0 to 255 do
begin
with Row[i] do
begin
rgbtRed := Palette[i][0];
rgbtGreen := Palette[i][1];
rgbtBlue := Palette[i][2];
end;
end;
GradientImage.Picture.Graphic := Bitmap;
GradientImage.Refresh;
finally
BitMap.Free;
end;
//--end DrawPalette
end; end;
end; end;
@ -1004,7 +1033,7 @@ begin
MainCp.CmapIndex := cmbPalette.ItemIndex; MainCp.CmapIndex := cmbPalette.ItemIndex;
MainCp.cmap := Palette; MainCp.cmap := Palette;
BackupPal := Palette; // BackupPal := Palette;
if EditForm.visible then EditForm.UpdateDisplay; if EditForm.visible then EditForm.UpdateDisplay;
if MutateForm.Visible then MutateForm.UpdateDisplay; if MutateForm.Visible then MutateForm.UpdateDisplay;
@ -1046,10 +1075,10 @@ begin
Palette := Pal; Palette := Pal;
BackupPal := Pal; BackupPal := Pal;
DrawPalette; // DrawPalette;
cp.copy(MainCp); cp.copy(MainCp);
//? DrawPreview; {//?} DrawPreview;
end; end;
procedure HSVToRGB(H, S, V: real; var Rb, Gb, Bb: integer); procedure HSVToRGB(H, S, V: real; var Rb, Gb, Bb: integer);
@ -1204,6 +1233,7 @@ begin
end; end;
end; end;
{
procedure TAdjustForm.DrawPalette; procedure TAdjustForm.DrawPalette;
var var
i: integer; i: integer;
@ -1235,16 +1265,19 @@ begin
BitMap.Free; BitMap.Free;
end; end;
end; end;
}
procedure TAdjustForm.cmbPaletteChange(Sender: TObject); procedure TAdjustForm.cmbPaletteChange(Sender: TObject);
var var
i: integer; i: integer;
begin begin
if Resetting then exit;
i := cmbPalette.ItemIndex; i := cmbPalette.ItemIndex;
GetCmap(i, 1, Palette); GetCmap(i, 1, Palette);
BackupPal := Palette; BackupPal := Palette;
ScrollBar.Position := 0; ScrollBar.Position := 0;
DrawPalette; //DrawPalette;
// MainForm.UpdateUndo; // MainForm.UpdateUndo;
Apply; Apply;
end; end;
@ -1393,7 +1426,7 @@ begin
if ScrollCode = scEndScroll then if ScrollCode = scEndScroll then
begin begin
GradientChanged:=false; GradientChanged:=false;
//Apply; Apply;
end; end;
end; end;
@ -1680,9 +1713,9 @@ begin
for i := 0 to 255 do for i := 0 to 255 do
begin begin
Palette[i][0] := BackupPal[(255 + i - offset) and $FF][0]; Palette[i][0] := BackupPal[(256 + i - offset) and $FF][0];
Palette[i][1] := BackupPal[(255 + i - offset) and $FF][1]; Palette[i][1] := BackupPal[(256 + i - offset) and $FF][1];
Palette[i][2] := BackupPal[(255 + i - offset) and $FF][2]; Palette[i][2] := BackupPal[(256 + i - offset) and $FF][2];
end; end;
cp.CmapIndex := cmbPalette.ItemIndex; cp.CmapIndex := cmbPalette.ItemIndex;
cp.cmap := Palette; cp.cmap := Palette;
@ -1773,9 +1806,6 @@ procedure TAdjustForm.SetMainWindowSize;
var var
xtot, ytot: integer; xtot, ytot: integer;
begin begin
// xdif := MainForm.Width - MainForm.Image.Width;
// ydif := MainForm.Height - MainForm.Image.Height;
xtot := ImageWidth + (MainForm.Width - MainForm.Image.Width); xtot := ImageWidth + (MainForm.Width - MainForm.Image.Width);
ytot := ImageHeight + (MainForm.Height - MainForm.Image.Height); ytot := ImageHeight + (MainForm.Height - MainForm.Image.Height);
if xtot > Screen.Width then if xtot > Screen.Width then
@ -1878,5 +1908,10 @@ begin
cmbPaletteChange(Sender); cmbPaletteChange(Sender);
end; end;
procedure TAdjustForm.btnApplySizeClick(Sender: TObject);
begin
SetMainWindowSize;
end;
end. end.

View File

@ -470,6 +470,7 @@ begin
MainForm.StopThread; MainForm.StopThread;
MainForm.UpdateUndo; MainForm.UpdateUndo;
MainCp.cmap := Palette; MainCp.cmap := Palette;
MainCP.cmapindex := -1;
if EditForm.Visible then EditForm.UpdateDisplay; if EditForm.Visible then EditForm.UpdateDisplay;
if AdjustForm.Visible then AdjustForm.UpdateDisplay; if AdjustForm.Visible then AdjustForm.UpdateDisplay;
if MutateForm.Visible then MutateForm.UpdateDisplay; if MutateForm.Visible then MutateForm.UpdateDisplay;

View File

@ -21,17 +21,48 @@ unit ControlPoint;
interface interface
uses uses
Classes, Windows, Cmap, Xform, XFormMan; Classes, Windows, Cmap, XForm, XFormMan;
const const
EPS = 1E-10; EPS = 1E-10;
NXFORMS = 100; // --Z-- I don't like limitations! 8-[] NXFORMS = 100; // --Z-- I don't like limitations! 8-[]
SUB_BATCH_SIZE = 10000; SUB_BATCH_SIZE = 10000;
PREFILTER_WHITE = (1 shl 26); PREFILTER_WHITE = (1 shl 26);
FILTER_CUTOFF = 1.8; FILTER_CUTOFF = 1.8;
BRIGHT_ADJUST = 2.3; BRIGHT_ADJUST = 2.3;
FUSE = 15; FUSE = 15;
// ---- MyTypes ----
type
TTriangle = record
x: array[0..2] of double;
y: array[0..2] of double;
end;
TTriangles = array[-1..NXFORMS] of TTriangle;
TSPoint = record
x: double;
y: double;
end;
TMapPalette = record
Red: array[0..255] of byte;
Green: array[0..255] of byte;
Blue: array[0..255] of byte;
end;
TColorMaps = record
Identifier: string;
UGRFile: string;
end;
pPixArray = ^TPixArray;
TPixArray = array[0..1279, 0..1023, 0..3] of integer;
pPreviewPixArray = ^TPreviewPixArray;
TPreviewPixArray = array[0..159, 0..119, 0..3] of integer;
TFileType = (ftIfs, ftFla, ftXML);
// -----
type //? type //?
PLongintArray = ^TLongintArray; PLongintArray = ^TLongintArray;
TLongintArray = array[0..8192] of Longint; TLongintArray = array[0..8192] of Longint;
@ -121,6 +152,15 @@ type
function HasNewVariants: boolean; function HasNewVariants: boolean;
// CP-specific functions moved from unit Main
function NumXForms: integer;
function TrianglesFromCP(var Triangles: TTriangles): integer;
procedure EqualizeWeights;
procedure NormalizeWeights;
procedure RandomizeWeights;
procedure ComputeWeights(Triangles: TTriangles; t: integer);
procedure GetFromTriangles(const Triangles: TTriangles; const t: integer);
constructor Create; constructor Create;
destructor Destroy; override; destructor Destroy; override;
@ -1783,5 +1823,185 @@ begin
end; end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
//
// --Z-- cp-specific functions moved here from MainForm
//
function TControlPoint.NumXForms: integer;
var
i: integer;
begin
//...
Result := NXFORMS;
for i := 0 to NXFORMS - 1 do
begin
if xform[i].density = 0 then
begin
Result := i;
Break;
end;
end;
Result := i;
end;
function TControlPoint.TrianglesFromCP(var Triangles: TTriangles): integer;
{ Sets up the triangles from the IFS code }
var
i, j: integer;
temp_x, temp_y, xset, yset: double;
left, top, bottom, right: double;
a, b, c, d, e, f: double;
begin
top := 0; bottom := 0; right := 0; left := 0;
Result := NumXForms;
if ReferenceMode > 0 then
begin
for i := 0 to Result-1 do
begin
a := xform[i].c[0][0];
b := xform[i].c[0][1];
c := xform[i].c[1][0];
d := xform[i].c[1][1];
e := xform[i].c[2][0];
f := xform[i].c[2][1];
xset := 1.0;
yset := 1.0;
for j := 0 to 5 do
begin
temp_x := xset * a + yset * c + e;
temp_y := xset * b + yset * d + f;
xset := temp_x;
yset := temp_y;
end;
if (i = 0) then
begin
left := xset;
right := xset;
top := yset;
bottom := yset;
end
else
begin
if (xset < left) then left := xset;
if (xset > right) then right := xset;
if (yset > top) then top := yset;
if (yset < bottom) then bottom := yset;
end;
end;
if ReferenceMode = 1 then
begin
Triangles[-1].x[0] := right-left;
Triangles[-1].y[0] := 0;
Triangles[-1].x[1] := 0;
Triangles[-1].y[1] := 0;
Triangles[-1].x[2] := 0;
Triangles[-1].y[2] := -(top-bottom);
end
else begin
Triangles[-1].x[0] := right;
Triangles[-1].y[0] := -bottom;
Triangles[-1].x[1] := left;
Triangles[-1].y[1] := -bottom;
Triangles[-1].x[2] := left;
Triangles[-1].y[2] := -top;
end;
end
else
begin
Triangles[-1].x[0] := 1; Triangles[-1].y[0] := 0; // "x"
Triangles[-1].x[1] := 0; Triangles[-1].y[1] := 0; // "0"
Triangles[-1].x[2] := 0; Triangles[-1].y[2] := -1; // "y"
end;
for j := 0 to Result-1 do
begin
a := xform[j].c[0][0];
b := xform[j].c[0][1];
c := xform[j].c[1][0];
d := xform[j].c[1][1];
e := xform[j].c[2][0];
f := xform[j].c[2][1];
for i := 0 to 2 do
begin
triangles[j].x[i] := Triangles[-1].x[i] * a + Triangles[-1].y[i] * c + e;
triangles[j].y[i] := Triangles[-1].x[i] * b + Triangles[-1].y[i] * d + f;
end;
end;
for j := -1 to Result-1 do
for i := 0 to 2 do
triangles[j].y[i] := -triangles[j].y[i];
end;
procedure TControlPoint.EqualizeWeights;
var
t, i: integer;
begin
t := NumXForms;
for i := 0 to t - 1 do
xform[i].density := 0.5;
end;
procedure TControlPoint.NormalizeWeights;
var
i: integer;
td: double;
begin
td := 0.0;
for i := 0 to NumXForms - 1 do
td := td + xform[i].Density;
if (td < 0.001) then
EqualizeWeights
else
for i := 0 to NumXForms - 1 do
xform[i].Density := xform[i].Density / td;
end;
procedure TControlPoint.RandomizeWeights;
var
i: integer;
begin
for i := 0 to Transforms - 1 do
xform[i].Density := Random;
end;
procedure TControlPoint.ComputeWeights(Triangles: TTriangles; t: integer);
// Caclulate transform weight from triangle areas
var
i: integer;
total_area: double;
begin
total_area := 0;
for i := 0 to t - 1 do
begin
xform[i].Density := triangle_area(Triangles[i]);
total_area := total_area + xform[i].Density;
end;
for i := 0 to t - 1 do
begin
xform[i].Density := xform[i].Density / total_area;
end;
//? cp1.NormalizeWeights;
end;
procedure TControlPoint.GetFromTriangles(const Triangles: TTriangles; const t: integer);
var
i: integer;
begin
for i := 0 to t-1 do
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].c[0][0], xform[i].c[1][0], xform[i].c[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].c[0][1], xform[i].c[1][1], xform[i].c[2][1]);
end;
end;
end. end.

View File

@ -335,7 +335,7 @@ type
// --Z-- functions moved from outside (?) // --Z-- functions moved from outside (?)
procedure ShowSelectedInfo; procedure ShowSelectedInfo;
procedure Scale(var fx, fy: double; x, y: integer); procedure Scale(var fx, fy: double; x, y: integer);
procedure ReadjustWeights(var cp: TControlPoint); // procedure ReadjustWeights(var cp: TControlPoint);
public public
cp: TControlPoint; cp: TControlPoint;
@ -620,8 +620,10 @@ begin
PreviewImage.refresh; PreviewImage.refresh;
end; end;
(*
procedure TEditForm.ReadjustWeights(var cp: TControlPoint); procedure TEditForm.ReadjustWeights(var cp: TControlPoint);
{ Thanks to Rudy...code from Chaos} { Thanks to Rudy...code from Chaos }
// --Z-- and thanks to me for removing this! ;-)
var var
total, othertotals, excess: double; total, othertotals, excess: double;
t, i: integer; t, i: integer;
@ -645,6 +647,7 @@ begin
//z cp.xform[i].density := cp.xform[i].density - cp.xform[i].density / othertotals * excess; //z cp.xform[i].density := cp.xform[i].density - cp.xform[i].density / othertotals * excess;
cp.xform[i].density := cp.xform[i].density * excess; // --Z-- cp.xform[i].density := cp.xform[i].density * excess; // --Z--
end; end;
*)
procedure TEditForm.ShowSelectedInfo; procedure TEditForm.ShowSelectedInfo;
var var
@ -783,8 +786,8 @@ begin
cp.xform[i].c[0][1], cp.xform[i].c[1][1], cp.xform[i].c[2][1]); cp.xform[i].c[0][1], cp.xform[i].c[1][1], cp.xform[i].c[2][1]);
end; end;
GetXForms(cp, MainTriangles, transforms); cp.GetFromTriangles(MainTriangles, transforms);
if not chkPreserve.checked then ComputeWeights(cp, MainTriangles, transforms); // if not chkPreserve.checked then ComputeWeights(cp, MainTriangles, transforms);
DrawPreview; DrawPreview;
ShowSelectedInfo; ShowSelectedInfo;
TriangleView.Refresh;; TriangleView.Refresh;;
@ -794,8 +797,8 @@ procedure TEditForm.UpdateFlame(DrawMain: boolean);
begin begin
//; MainForm.StopThread; //; MainForm.StopThread;
StatusBar.Panels[2].Text := Format('Zoom: %f', [GraphZoom]); StatusBar.Panels[2].Text := Format('Zoom: %f', [GraphZoom]);
GetXForms(cp, MainTriangles, transforms); cp.GetFromTriangles(MainTriangles, transforms);
if not chkPreserve.Checked then ComputeWeights(cp, MainTriangles, transforms); // if not chkPreserve.Checked then ComputeWeights(cp, MainTriangles, transforms);
DrawPreview; DrawPreview;
ShowSelectedInfo; ShowSelectedInfo;
TriangleView.Refresh; TriangleView.Refresh;
@ -970,7 +973,6 @@ begin
end; end;
// draw axis // draw axis
Pen.Color := GridColor1; Pen.Color := GridColor1;
// Pen.Style := psSolid;
ax := integer(round(ix - gCenterX*sc)); ax := integer(round(ix - gCenterX*sc));
ay := integer(round(iy + gCentery*sc)); ay := integer(round(iy + gCentery*sc));
MoveTo(ax, 0); MoveTo(ax, 0);
@ -981,15 +983,17 @@ begin
{Reference Triangle} {Reference Triangle}
Pen.Style := psDot; Pen.Style := psDot;
Pen.color := pnlReference.Color; Pen.color := pnlReference.Color;
brush.Color := gridColor1 shr 1 and $7f7f7f;
a := ToScreen(MainTriangles[-1].x[0], MainTriangles[-1].y[0]); a := ToScreen(MainTriangles[-1].x[0], MainTriangles[-1].y[0]);
b := ToScreen(MainTriangles[-1].x[1], MainTriangles[-1].y[1]); b := ToScreen(MainTriangles[-1].x[1], MainTriangles[-1].y[1]);
c := ToScreen(MainTriangles[-1].x[2], MainTriangles[-1].y[2]); c := ToScreen(MainTriangles[-1].x[2], MainTriangles[-1].y[2]);
Polyline([a, b, c, a]); Polyline([a, b, c, a]);
brush.Color := pnlBackColor.Color;
Font.color := Pen.color; Font.color := Pen.color;
TextOut(c.x-9, c.y-12, 'C');
TextOut(b.x-8, b.y+1, 'B');
TextOut(a.x+2, a.y+1, 'A'); TextOut(a.x+2, a.y+1, 'A');
TextOut(b.x+2, b.y+1, 'B');
TextOut(c.x+2, c.y+1, 'C');
Pen.Style := psSolid; Pen.Style := psSolid;
@ -1036,24 +1040,17 @@ begin
dx := MainTriangles[SelectedTriangle].x[SelectedCorner] - Pivot.x; dx := MainTriangles[SelectedTriangle].x[SelectedCorner] - Pivot.x;
dy := MainTriangles[SelectedTriangle].y[SelectedCorner] - Pivot.y; dy := MainTriangles[SelectedTriangle].y[SelectedCorner] - Pivot.y;
d := Hypot(dx, dy); d := Hypot(dx, dy);
// d := dist(Pivot.x, Pivot.y,
// MainTriangles[SelectedTriangle].x[SelectedCorner], MainTriangles[SelectedTriangle].y[SelectedCorner]);
end end
else begin else begin
// d := MinDouble;
dx := MainTriangles[SelectedTriangle].x[0] - Pivot.x; dx := MainTriangles[SelectedTriangle].x[0] - Pivot.x;
dy := MainTriangles[SelectedTriangle].y[0] - Pivot.y; dy := MainTriangles[SelectedTriangle].y[0] - Pivot.y;
d := Hypot(dx, dy); d := Hypot(dx, dy);
for i := 1 to 2 do for i := 1 to 2 do
begin begin
// tx := MainTriangles[SelectedTriangle].x[i] - Pivot.x;
// ty := MainTriangles[SelectedTriangle].y[i] - Pivot.y;
d1 := Hypot(tx, ty); d1 := Hypot(tx, ty);
d1 := dist(Pivot.x, Pivot.y, MainTriangles[SelectedTriangle].x[i], MainTriangles[SelectedTriangle].y[i]); d1 := dist(Pivot.x, Pivot.y, MainTriangles[SelectedTriangle].x[i], MainTriangles[SelectedTriangle].y[i]);
if d1 > d then begin if d1 > d then begin
d := d1; d := d1;
// dx := tx;
// dy := ty;
end; end;
end; end;
d1 := Hypot(dx, dy); d1 := Hypot(dx, dy);
@ -1705,7 +1702,8 @@ begin
Transforms := Transforms + 1; Transforms := Transforms + 1;
MainTriangles[Transforms - 1] := MainTriangles[-1]; MainTriangles[Transforms - 1] := MainTriangles[-1];
SelectedTriangle := Transforms - 1; SelectedTriangle := Transforms - 1;
ComputeWeights(cp, MainTriangles, transforms); // ComputeWeights(cp, MainTriangles, transforms);
cp.xform[Transforms - 1].density := 0.5;
cp.xform[Transforms - 1].vars[0] := 1; cp.xform[Transforms - 1].vars[0] := 1;
for i := 1 to NRVAR - 1 do for i := 1 to NRVAR - 1 do
cp.xform[Transforms - 1].vars[i] := 0; cp.xform[Transforms - 1].vars[i] := 0;
@ -1725,7 +1723,8 @@ begin
MainForm.UpdateUndo; MainForm.UpdateUndo;
Transforms := Transforms + 1; Transforms := Transforms + 1;
MainTriangles[Transforms - 1] := MainTriangles[SelectedTriangle]; MainTriangles[Transforms - 1] := MainTriangles[SelectedTriangle];
ComputeWeights(cp, MainTriangles, transforms); // ComputeWeights(cp, MainTriangles, transforms);
cp.xform[Transforms - 1].density := cp.xform[SelectedTriangle].density;
for i := 0 to NRVAR - 1 do for i := 0 to NRVAR - 1 do
cp.xform[Transforms - 1].vars[i] := cp.xform[SelectedTriangle].vars[i]; cp.xform[Transforms - 1].vars[i] := cp.xform[SelectedTriangle].vars[i];
SelectedTriangle := Transforms - 1; SelectedTriangle := Transforms - 1;
@ -1802,7 +1801,7 @@ begin
else if Sender = txtP then else if Sender = txtP then
begin begin
cp.xform[SelectedTriangle].density := StrToFloat(TEdit(Sender).Text); cp.xform[SelectedTriangle].density := StrToFloat(TEdit(Sender).Text);
ReadjustWeights(cp); //ReadjustWeights(cp);
TEdit(Sender).Text := Format('%.6g', [cp.xform[SelectedTriangle].density]); TEdit(Sender).Text := Format('%.6g', [cp.xform[SelectedTriangle].density]);
end; end;
MainForm.UpdateUndo; MainForm.UpdateUndo;
@ -1864,7 +1863,7 @@ begin
else if Sender = txtP then else if Sender = txtP then
begin begin
cp.xform[SelectedTriangle].density := StrToFloat(TEdit(Sender).Text); cp.xform[SelectedTriangle].density := StrToFloat(TEdit(Sender).Text);
ReadjustWeights(cp); //ReadjustWeights(cp);
TEdit(Sender).Text := Format('%.6g', [cp.xform[SelectedTriangle].density]); TEdit(Sender).Text := Format('%.6g', [cp.xform[SelectedTriangle].density]);
end; end;
MainForm.UpdateUndo; MainForm.UpdateUndo;
@ -1905,7 +1904,7 @@ begin
begin begin
MainForm.UpdateUndo; MainForm.UpdateUndo;
cp.xform[SelectedTriangle].density := NewVal; cp.xform[SelectedTriangle].density := NewVal;
ReadjustWeights(cp); //ReadjustWeights(cp);
UpdateFlame(True); UpdateFlame(True);
end; end;
end; end;
@ -1937,7 +1936,7 @@ begin
begin begin
MainForm.UpdateUndo; MainForm.UpdateUndo;
cp.xform[SelectedTriangle].density := NewVal; cp.xform[SelectedTriangle].density := NewVal;
ReadjustWeights(cp); //ReadjustWeights(cp);
UpdateFlame(True); UpdateFlame(True);
end; end;
end; end;
@ -2195,7 +2194,7 @@ begin
4: cp.xform[SelectedTriangle].c[2][0] := NewVal; //e 4: cp.xform[SelectedTriangle].c[2][0] := NewVal; //e
5: cp.xform[SelectedTriangle].c[2][1] := NewVal; //f 5: cp.xform[SelectedTriangle].c[2][1] := NewVal; //f
end; end;
MainForm.TrianglesFromCP(cp, MainTriangles); cp.TrianglesFromCP(MainTriangles);
ShowSelectedInfo; ShowSelectedInfo;
UpdateFlame(true); UpdateFlame(true);
end; end;
@ -2256,7 +2255,7 @@ begin
4: cp.xform[SelectedTriangle].c[2][0] := NewVal; //e 4: cp.xform[SelectedTriangle].c[2][0] := NewVal; //e
5: cp.xform[SelectedTriangle].c[2][1] := NewVal; //f 5: cp.xform[SelectedTriangle].c[2][1] := NewVal; //f
end; end;
MainForm.TrianglesFromCP(cp, MainTriangles); cp.TrianglesFromCP(MainTriangles);
ShowSelectedInfo; ShowSelectedInfo;
UpdateFlame(true); UpdateFlame(true);
end; end;
@ -2356,7 +2355,7 @@ begin
v := StrToFloat(txtXFormColor.Text); v := StrToFloat(txtXFormColor.Text);
except on EConvertError do except on EConvertError do
begin begin
txtXformColor.text := Format('%1.3f', [cp.xform[SelectedTriangle].color]);//FLoatToStr(cp.xform[SelectedTriangle].color); txtXformColor.text := Format('%1.3f', [cp.xform[SelectedTriangle].color]);
exit; exit;
end; end;
end; end;
@ -2380,7 +2379,7 @@ begin
v := StrToFloat(txtXFormColor.Text); v := StrToFloat(txtXFormColor.Text);
except on EConvertError do except on EConvertError do
begin begin
txtXformColor.text := Format('%1.3f', [cp.xform[SelectedTriangle].color]);//FLoattoStr(cp.xform[SelectedTriangle].color); txtXformColor.text := Format('%1.3f', [cp.xform[SelectedTriangle].color]);
exit; exit;
end; end;
end; end;

View File

@ -111,7 +111,7 @@ var
VariationOptions: int64; 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; ReferenceMode: integer;//FixedReference: boolean;
BatchSize: Integer; BatchSize: Integer;
Compatibility: integer; //0 = original, 1 = Drave's Compatibility: integer; //0 = original, 1 = Drave's
Favorites: TStringList; Favorites: TStringList;
@ -183,6 +183,7 @@ function dist(x1, y1, x2, y2: double): double;
var var
d2: double; d2: double;
begin begin
(*
{ From FDesign source { From FDesign source
{ float pt_pt_distance(float x1, float y1, float x2, float y2) } { float pt_pt_distance(float x1, float y1, float x2, float y2) }
d2 := (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2); d2 := (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
@ -193,6 +194,12 @@ begin
end end
else else
Result := sqrt(d2); Result := sqrt(d2);
*)
// --Z-- This is just amazing... :-\
// Someone needed an 'FDesign source' - to compute distance between two points??!?
Result := Hypot(x2-x1, y2-y1);
end; end;
function line_dist(x, y, x1, y1, x2, y2: double): double; function line_dist(x, y, x1, y1, x2, y2: double): double;

View File

@ -319,7 +319,7 @@ type
procedure ParseXML(var cp1: TControlPoint; const params: PCHAR); procedure ParseXML(var cp1: TControlPoint; const params: PCHAR);
function SaveFlame(cp1: TControlPoint; title, filename: string): boolean; function SaveFlame(cp1: TControlPoint; title, filename: string): boolean;
function SaveXMLFlame(const cp1: TControlPoint; title, filename: string): boolean; function SaveXMLFlame(const cp1: TControlPoint; title, filename: string): boolean;
function TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer; //function TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer;
procedure DisplayHint(Sender: TObject); procedure DisplayHint(Sender: TObject);
procedure OnProgress(prog: double); procedure OnProgress(prog: double);
procedure DrawFlame; procedure DrawFlame;
@ -345,17 +345,16 @@ type
procedure ListXML(FileName: string; sel: integer); procedure ListXML(FileName: string; sel: integer);
function EntryExists(En, Fl: string): boolean; function EntryExists(En, Fl: string): boolean;
function XMLEntryExists(title, filename: string): boolean; function XMLEntryExists(title, filename: string): boolean;
procedure ComputeWeights(var cp1: TControlPoint; Triangles: TTriangles; t: integer); //procedure ComputeWeights(var cp1: TControlPoint; Triangles: TTriangles; t: integer);
function DeleteEntry(Entry, FileName: string): boolean; function DeleteEntry(Entry, FileName: string): boolean;
function CleanIdentifier(ident: string): string; function CleanIdentifier(ident: string): string;
function CleanUPRTitle(ident: string): string; function CleanUPRTitle(ident: string): string;
procedure GetXForms(var cp1: TControlPoint; const Triangles: TTriangles; const t: integer);
function GradientString(c: TColorMap): string; function GradientString(c: TColorMap): string;
function PackVariations: cardinal; function PackVariations: cardinal;
procedure UnpackVariations(v: integer); procedure UnpackVariations(v: integer);
function NumXForms(const cp: TControlPoint): integer; function NumXForms(const cp: TControlPoint): integer;
procedure NormalizeWeights(var cp: TControlPoint); //procedure NormalizeWeights(var cp: TControlPoint);
procedure EqualizeWeights(var cp: TControlPoint); //procedure EqualizeWeights(var cp: TControlPoint);
procedure MultMatrix(var s: TMatrix; const m: TMatrix); procedure MultMatrix(var s: TMatrix; const m: TMatrix);
procedure ListFlames(FileName: string; sel: integer); procedure ListFlames(FileName: string; sel: integer);
procedure ListIFS(FileName: string; sel: integer); procedure ListIFS(FileName: string; sel: integer);
@ -473,6 +472,7 @@ begin
end; end;
end; end;
{
procedure EqualizeWeights(var cp: TControlPoint); procedure EqualizeWeights(var cp: TControlPoint);
var var
t, i: integer; t, i: integer;
@ -496,6 +496,7 @@ begin
for i := 0 to NumXForms(cp) - 1 do for i := 0 to NumXForms(cp) - 1 do
cp.xform[i].Density := cp.xform[i].Density / td; cp.xform[i].Density := cp.xform[i].Density / td;
end; end;
}
function PackVariations: cardinal; function PackVariations: cardinal;
{ Packs the variation options into an integer with Linear as lowest bit } { Packs the variation options into an integer with Linear as lowest bit }
@ -1365,7 +1366,7 @@ begin
pal := ''; hue := ''; pal := ''; hue := '';
// if sheep then // if sheep then
// begin // begin
pal := 'palette="' + IntToStr(cp1.cmapindex) + '" '; if cp1.cmapindex >= 0 then pal := 'palette="' + IntToStr(cp1.cmapindex) + '" ';
hue := 'hue="' + format('%g', [cp1.hue_rotation]) + '" '; hue := 'hue="' + format('%g', [cp1.hue_rotation]) + '" ';
// end; // end;
if Trim(SheepNick) <> '' then nick := 'nick="' + Trim(SheepNick) + '"'; if Trim(SheepNick) <> '' then nick := 'nick="' + Trim(SheepNick) + '"';
@ -1832,113 +1833,9 @@ end;
{ ************************** IFS and triangle stuff ************************* } { ************************** IFS and triangle stuff ************************* }
procedure ComputeWeights(var cp1: TControlPoint; Triangles: TTriangles; t: integer); { ---Z--- moved to ControlPoint ---Z--- }
{ Caclulates transform weight from triangles }
var
i: integer;
total_area: double;
begin
total_area := 0.0;
for i := 0 to t - 1 do
begin
cp1.xform[i].Density := triangle_area(Triangles[i]);
total_area := total_area + cp1.xform[i].Density;
end;
for i := 0 to t - 1 do
begin
cp1.xform[i].Density := cp1.xform[i].Density / total_area;
end;
NormalizeWeights(cp1);
end;
procedure RandomWeights(var cp1: TControlPoint); { // unused function, hmmm...
{ Randomizes xform weights }
var
i: integer;
begin
for i := 0 to Transforms - 1 do
cp1.xform[i].Density := random;
NormalizeWeights(cp1);
end;
function TMainForm.TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer;
{ Sets up the triangles from the IFS code }
var
xforms: integer;
i, j: integer;
temp_x, temp_y, xset, yset: double;
left, top, bottom, right: double;
a, b, c, d, e, f: double;
begin
top := 0; bottom := 0; right := 0; left := 0;
xforms := NumXForms(cp1);
Result := xforms;
if not FixedReference then
begin
for i := 0 to xforms - 1 do
begin
a := cp1.xform[i].c[0][0];
b := cp1.xform[i].c[0][1];
c := cp1.xform[i].c[1][0];
d := cp1.xform[i].c[1][1];
e := cp1.xform[i].c[2][0];
f := cp1.xform[i].c[2][1];
xset := 1.0;
yset := 1.0;
for j := 0 to 5 do
begin
temp_x := xset * a + yset * c + e;
temp_y := xset * b + yset * d + f;
xset := temp_x;
yset := temp_y;
end;
if (i = 0) then
begin
left := xset;
right := xset;
top := yset;
bottom := yset;
end
else
begin
if (xset < left) then left := xset;
if (xset > right) then right := xset;
if (yset < top) then top := yset;
if (yset > bottom) then bottom := yset;
end;
end;
Triangles[-1].x[0] := left;
Triangles[-1].x[1] := right;
Triangles[-1].x[2] := right;
Triangles[-1].y[0] := bottom;
Triangles[-1].y[1] := bottom;
Triangles[-1].y[2] := top;
end
else
begin
Triangles[-1].x[0] := 1; Triangles[-1].y[0] := 0; // "x"
Triangles[-1].x[1] := 0; Triangles[-1].y[1] := 0; // "0"
Triangles[-1].x[2] := 0; Triangles[-1].y[2] := -1; // "y"
end;
for j := 0 to xforms - 1 do
begin
a := cp1.xform[j].c[0][0];
b := cp1.xform[j].c[0][1];
c := cp1.xform[j].c[1][0];
d := cp1.xform[j].c[1][1];
e := cp1.xform[j].c[2][0];
f := cp1.xform[j].c[2][1];
for i := 0 to 2 do
begin
triangles[j].x[i] := Triangles[-1].x[i] * a + Triangles[-1].y[i] * c + e;
triangles[j].y[i] := Triangles[-1].x[i] * b + Triangles[-1].y[i] * d + f;
end;
end;
for i := -1 to xforms - 1 do
for j := 0 to 2 do
triangles[i].y[j] := -triangles[i].y[j];
end;
procedure CP_compute(var cp1: TControlPoint; t1, t0: TTriangle; const i: integer); procedure CP_compute(var cp1: TControlPoint; t1, t0: TTriangle; const i: integer);
begin begin
@ -1952,25 +1849,7 @@ begin
t0.x[2], t0.y[2], t1.y[2], t0.x[2], t0.y[2], t1.y[2],
cp1.xform[i].c[0][1], cp1.xform[i].c[1][1], cp1.xform[i].c[2][1]); cp1.xform[i].c[0][1], cp1.xform[i].c[1][1], cp1.xform[i].c[2][1]);
end; end;
}
procedure GetXForms(var cp1: TControlPoint; const Triangles: TTriangles; const t: integer);
var
i: integer;
begin
for i := 0 to t - 1 do
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],
cp1.xform[i].c[0][0], cp1.xform[i].c[1][0], cp1.xform[i].c[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],
cp1.xform[i].c[0][1], cp1.xform[i].c[1][1], cp1.xform[i].c[2][1]);
end;
end;
function FlameToString(Title: string): string; function FlameToString(Title: string): string;
{ Creates a string containing the formated flame parameter set } { Creates a string containing the formated flame parameter set }
@ -2200,7 +2079,8 @@ procedure TMainForm.mnuNormalWeightsClick(Sender: TObject);
begin begin
StopThread; StopThread;
UpdateUndo; UpdateUndo;
ComputeWeights(MainCp, MainTriangles, transforms); // TODO: ...something
// ComputeWeights(MainCp, MainTriangles, transforms);
RedrawTimer.Enabled := True; RedrawTimer.Enabled := True;
UpdateWindows; UpdateWindows;
end; end;
@ -2211,7 +2091,7 @@ begin
UpdateUndo; UpdateUndo;
inc(MainSeed); inc(MainSeed);
RandSeed := MainSeed; RandSeed := MainSeed;
RandomWeights(MainCp); MainCp.RandomizeWeights;
RedrawTimer.Enabled := True; RedrawTimer.Enabled := True;
UpdateWindows; UpdateWindows;
end; end;
@ -2338,7 +2218,7 @@ begin
inc(RandomIndex); inc(RandomIndex);
MainCp.name := RandomPrefix + RandomDate + '-' + MainCp.name := RandomPrefix + RandomDate + '-' +
IntToStr(RandomIndex); IntToStr(RandomIndex);
Transforms := TrianglesFromCP(MainCp, MainTriangles); Transforms := MainCp.TrianglesFromCP(MainTriangles);
if AdjustForm.visible then if AdjustForm.visible then
AdjustForm.UpdateDisplay; AdjustForm.UpdateDisplay;
@ -2353,7 +2233,7 @@ procedure TMainForm.mnuEqualizeClick(Sender: TObject);
begin begin
StopThread; StopThread;
UpdateUndo; UpdateUndo;
EqualizeWeights(maincp); MainCP.EqualizeWeights;
RedrawTimer.Enabled := True; RedrawTimer.Enabled := True;
UpdateWindows; UpdateWindows;
end; end;
@ -2817,7 +2697,7 @@ begin
btnUndo.Enabled := false; btnUndo.Enabled := false;
btnRedo.enabled := false; btnRedo.enabled := false;
Transforms := TrianglesFromCP(MainCp, MainTriangles); Transforms := MainCp.TrianglesFromCP(MainTriangles);
UndoIndex := 0; UndoIndex := 0;
UndoMax := 0; UndoMax := 0;
@ -2942,7 +2822,7 @@ begin
// Zoom := maincp.zoom; // Zoom := maincp.zoom;
Center[0] := maincp.Center[0]; Center[0] := maincp.Center[0];
Center[1] := maincp.Center[1]; Center[1] := maincp.Center[1];
NormalizeWeights(maincp); MainCP.NormalizeWeights;
mnuSaveUndo.Enabled := false; mnuSaveUndo.Enabled := false;
mnuUndo.Enabled := False; mnuUndo.Enabled := False;
mnuPopUndo.Enabled := False; mnuPopUndo.Enabled := False;
@ -2956,7 +2836,7 @@ begin
AdjustForm.btnRedo.enabled := false; AdjustForm.btnRedo.enabled := false;
btnUndo.Enabled := false; btnUndo.Enabled := false;
btnRedo.enabled := false; btnRedo.enabled := false;
Transforms := TrianglesFromCP(maincp, MainTriangles); Transforms := MainCp.TrianglesFromCP(MainTriangles);
// Fix Apophysis 1.0 parameters with negative color parameteres! // Fix Apophysis 1.0 parameters with negative color parameteres!
for i := 0 to Transforms - 1 do for i := 0 to Transforms - 1 do
if maincp.xform[i].color < 0 then maincp.xform[i].color := 0; if maincp.xform[i].color < 0 then maincp.xform[i].color := 0;
@ -3054,8 +2934,8 @@ begin
Center[0] := maincp.Center[0]; Center[0] := maincp.Center[0];
Center[1] := maincp.Center[1]; Center[1] := maincp.Center[1];
// cp.CalcBoundbox; // cp.CalcBoundbox;
NormalizeWeights(maincp); MainCP.NormalizeWeights;
Transforms := TrianglesFromCP(maincp, MainTriangles); Transforms := MainCp.TrianglesFromCP(MainTriangles);
// Trim undo index from title // Trim undo index from title
maincp.name := Copy(Fstrings[0], 6, length(Fstrings[0]) - 7); maincp.name := Copy(Fstrings[0], 6, length(Fstrings[0]) - 7);
@ -3306,6 +3186,7 @@ begin
StopThread; StopThread;
UpdateUndo; UpdateUndo;
maincp.cmap := Pal; maincp.cmap := Pal;
maincp.cmapindex := -1;
AdjustForm.UpdateDisplay; AdjustForm.UpdateDisplay;
if EditForm.Visible then EditForm.UpdateDisplay; if EditForm.Visible then EditForm.UpdateDisplay;
@ -3613,7 +3494,7 @@ begin
center[1] := maincp.center[1]; center[1] := maincp.center[1];
RedrawTimer.Enabled := True; RedrawTimer.Enabled := True;
Application.ProcessMessages; Application.ProcessMessages;
Transforms := TrianglesFromCP(maincp, MainTriangles); Transforms := MainCp.TrianglesFromCP(MainTriangles);
UpdateWindows; UpdateWindows;
end; end;
finally finally
@ -3752,7 +3633,7 @@ begin
if nxform < NXFORMS then if nxform < NXFORMS then
for i := nxform to NXFORMS - 1 do for i := nxform to NXFORMS - 1 do
cp1.xform[i].density := 0; cp1.xform[i].density := 0;
NormalizeWeights(cp1); cp1.NormalizeWeights;
// Check for symmetry parameter // Check for symmetry parameter
if ParseCp.symmetry <> 0 then if ParseCp.symmetry <> 0 then
begin begin
@ -3766,7 +3647,7 @@ begin
if Clipboard.HasFormat(CF_TEXT) then begin if Clipboard.HasFormat(CF_TEXT) then begin
UpdateUndo; UpdateUndo;
ParseXML(MainCP, PCHAR(Clipboard.AsText)); ParseXML(MainCP, PCHAR(Clipboard.AsText));
Transforms := TrianglesFromCP(MainCp, MainTriangles); Transforms := MainCp.TrianglesFromCP(MainTriangles);
Statusbar.Panels[2].Text := MainCp.name; Statusbar.Panels[2].Text := MainCp.name;
if ResizeOnLoad then ResizeWindow; if ResizeOnLoad then ResizeWindow;
RedrawTimer.Enabled := True; RedrawTimer.Enabled := True;
@ -3782,10 +3663,7 @@ begin
txt := Trim(FlameToXML(Maincp, false, true)); txt := Trim(FlameToXML(Maincp, false, true));
Clipboard.SetTextBuf(PChar(txt)); Clipboard.SetTextBuf(PChar(txt));
mnuPaste.enabled := true; mnuPaste.enabled := true;
//z btnPaste.enabled := true;
// GradientForm.mnuPaste.enabled := False;
// GradientForm.btnPaste.enabled := False;
AdjustForm.mnuPaste.enabled := False; AdjustForm.mnuPaste.enabled := False;
AdjustForm.btnPaste.enabled := False; AdjustForm.btnPaste.enabled := False;
end; end;

View File

@ -119,7 +119,7 @@ begin
MainForm.StopThread; MainForm.StopThread;
MainForm.UpdateUndo; MainForm.UpdateUndo;
MainCp.Copy(cps[0]); MainCp.Copy(cps[0]);
Transforms := MainForm.TrianglesFromCP(MainCp, MainTriangles); Transforms := MainCp.TrianglesFromCP(MainTriangles);
MainCp.cmap := cmap; MainCp.cmap := cmap;
MainCp.name := name; MainCp.name := name;
MainCp.nick := nick; MainCp.nick := nick;

View File

@ -17,9 +17,9 @@
} }
unit MyTypes; unit MyTypes;
interface interface
uses ControlPoint;
{uses ControlPoint;
type type
TTriangle = record TTriangle = record
@ -45,7 +45,7 @@ type
pPreviewPixArray = ^TPreviewPixArray; pPreviewPixArray = ^TPreviewPixArray;
TPreviewPixArray = array[0..159, 0..119, 0..3] of integer; TPreviewPixArray = array[0..159, 0..119, 0..3] of integer;
TFileType = (ftIfs, ftFla, ftXML); TFileType = (ftIfs, ftFla, ftXML);
}
implementation implementation
end. end.

View File

@ -5,7 +5,7 @@ object OptionsForm: TOptionsForm
BorderStyle = bsDialog BorderStyle = bsDialog
Caption = 'Options' Caption = 'Options'
ClientHeight = 296 ClientHeight = 296
ClientWidth = 470 ClientWidth = 467
Color = clBtnFace Color = clBtnFace
Font.Charset = ANSI_CHARSET Font.Charset = ANSI_CHARSET
Font.Color = clWindowText Font.Color = clWindowText
@ -42,7 +42,7 @@ object OptionsForm: TOptionsForm
object Tabs: TPageControl object Tabs: TPageControl
Left = 8 Left = 8
Top = 8 Top = 8
Width = 449 Width = 451
Height = 249 Height = 249
ActivePage = GeneralPage ActivePage = GeneralPage
TabOrder = 0 TabOrder = 0
@ -51,86 +51,44 @@ object OptionsForm: TOptionsForm
HelpContext = 1 HelpContext = 1
Caption = 'General' Caption = 'General'
object chkConfirmDel: TCheckBox object chkConfirmDel: TCheckBox
Left = 208 Left = 144
Top = 8 Top = 139
Width = 97 Width = 97
Height = 17 Height = 17
HelpContext = 1005 HelpContext = 1005
Caption = 'Confirm delete' Caption = 'Confirm delete'
TabOrder = 2 TabOrder = 1
end
object GroupBox13: TGroupBox
Left = 8
Top = 2
Width = 193
Height = 71
Caption = 'Smooth palette'
TabOrder = 0
object Label8: TLabel
Left = 10
Top = 18
Width = 78
Height = 13
Caption = 'Number of tries:'
end
object Label10: TLabel
Left = 26
Top = 42
Width = 53
Height = 13
Caption = 'Try length:'
end
object txtNumtries: TEdit
Left = 96
Top = 16
Width = 73
Height = 21
HelpContext = 1002
TabOrder = 0
Text = '50'
end
object txtTryLength: TEdit
Left = 96
Top = 40
Width = 73
Height = 21
HelpContext = 1003
TabOrder = 1
Text = '10000'
end
end end
object JPEG: TGroupBox object JPEG: TGroupBox
Left = 8 Left = 8
Top = 74 Top = 72
Width = 121 Width = 121
Height = 57 Height = 57
Caption = 'JPEG Quality' Caption = 'JPEG Quality'
TabOrder = 1 TabOrder = 0
object txtJPEGQuality: TEdit object txtJPEGquality: TComboBox
Left = 16 Left = 16
Top = 24 Top = 24
Width = 73 Width = 89
Height = 21 Height = 21
HelpContext = 1004 ItemHeight = 13
ItemIndex = 2
TabOrder = 0 TabOrder = 0
Text = '80' Text = '100'
Items.Strings = (
'60'
'80'
'100'
'120')
end end
end end
object chkFixedReference: TCheckBox
Left = 208
Top = 24
Width = 145
Height = 17
Caption = 'Fixed reference triangle'
TabOrder = 3
end
object GroupBox1: TGroupBox object GroupBox1: TGroupBox
Left = 136 Left = 8
Top = 74 Top = 4
Width = 121 Width = 121
Height = 57 Height = 57
Caption = 'Batch size' Caption = 'Batch size'
TabOrder = 4 TabOrder = 2
object txtBatchSize: TEdit object txtBatchSize: TEdit
Left = 16 Left = 16
Top = 24 Top = 24
@ -154,60 +112,29 @@ object OptionsForm: TOptionsForm
end end
end end
object chkResize: TCheckBox object chkResize: TCheckBox
Left = 208 Left = 144
Top = 40 Top = 157
Width = 169 Width = 169
Height = 17 Height = 17
Caption = 'Resize on load' Caption = 'Resize on load'
TabOrder = 5 TabOrder = 3
end
object GroupBox15: TGroupBox
Left = 8
Top = 134
Width = 129
Height = 83
Caption = 'PNG Transparency'
TabOrder = 6
object RadioButton1: TRadioButton
Left = 12
Top = 16
Width = 113
Height = 17
Caption = 'No transparency'
TabOrder = 0
end
object RadioButton2: TRadioButton
Left = 12
Top = 32
Width = 113
Height = 17
Caption = 'Like Flame3'
TabOrder = 1
end
object RadioButton3: TRadioButton
Left = 12
Top = 48
Width = 113
Height = 17
Caption = 'Like Flamesong'
TabOrder = 2
end
end end
object GroupBox16: TGroupBox object GroupBox16: TGroupBox
Left = 140 Left = 8
Top = 134 Top = 134
Width = 117 Width = 121
Height = 51 Height = 59
Caption = 'Nr processors' Caption = 'Nr processors'
TabOrder = 7 TabOrder = 4
object cbNrTheads: TComboBox object cbNrTheads: TComboBox
Left = 12 Left = 16
Top = 20 Top = 24
Width = 89 Width = 89
Height = 21 Height = 21
ItemHeight = 13 ItemHeight = 13
ItemIndex = 0
TabOrder = 0 TabOrder = 0
Text = '200' Text = 'Off'
Items.Strings = ( Items.Strings = (
'Off' 'Off'
'2' '2'
@ -215,21 +142,46 @@ object OptionsForm: TOptionsForm
'8') '8')
end end
end end
object cbShowTransparancy: TCheckBox object chkShowTransparency: TCheckBox
Left = 144 Left = 144
Top = 196 Top = 175
Width = 169 Width = 169
Height = 17 Height = 17
Caption = 'Show Transparancy' Caption = 'Show Transparency'
TabOrder = 8 TabOrder = 5
end
object rgReferenceMode: TRadioGroup
Left = 280
Top = 4
Width = 153
Height = 69
Caption = 'Reference Triangle'
ItemIndex = 0
Items.Strings = (
'Normal'
'Proportional'
'Wandering (old-style)')
TabOrder = 6
end
object rgTransparency: TRadioGroup
Left = 136
Top = 4
Width = 137
Height = 69
Caption = 'PNG Transparency'
Items.Strings = (
'No transparency'
'Flam3-style'
'Flamesong-style')
TabOrder = 7
end end
end end
object DisplayPage: TTabSheet object DisplayPage: TTabSheet
Caption = 'Display' Caption = 'Display'
object GroupBox2: TGroupBox object GroupBox2: TGroupBox
Left = 184 Left = 184
Top = 8 Top = 4
Width = 250 Width = 193
Height = 97 Height = 97
Caption = 'Preview density' Caption = 'Preview density'
TabOrder = 1 TabOrder = 1
@ -257,34 +209,31 @@ object OptionsForm: TOptionsForm
object txtLowQuality: TEdit object txtLowQuality: TEdit
Left = 112 Left = 112
Top = 16 Top = 16
Width = 121 Width = 65
Height = 21 Height = 21
HelpContext = 1012 HelpContext = 1012
TabOrder = 0 TabOrder = 0
Text = 'txtLowQuality'
end end
object txtMediumQuality: TEdit object txtMediumQuality: TEdit
Left = 112 Left = 112
Top = 40 Top = 40
Width = 121 Width = 65
Height = 21 Height = 21
HelpContext = 1013 HelpContext = 1013
TabOrder = 1 TabOrder = 1
Text = 'txtMediumQuality'
end end
object txtHighQuality: TEdit object txtHighQuality: TEdit
Left = 112 Left = 112
Top = 64 Top = 64
Width = 121 Width = 65
Height = 21 Height = 21
HelpContext = 1014 HelpContext = 1014
TabOrder = 2 TabOrder = 2
Text = 'txtHighQuality'
end end
end end
object grpRendering: TGroupBox object grpRendering: TGroupBox
Left = 8 Left = 8
Top = 6 Top = 4
Width = 169 Width = 169
Height = 169 Height = 169
Caption = 'Rendering' Caption = 'Rendering'
@ -648,9 +597,9 @@ object OptionsForm: TOptionsForm
ImageIndex = 5 ImageIndex = 5
object grpGradient: TRadioGroup object grpGradient: TRadioGroup
Left = 8 Left = 8
Top = 8 Top = 4
Width = 137 Width = 137
Height = 121 Height = 97
HelpContext = 1029 HelpContext = 1029
Caption = 'On random flame' Caption = 'On random flame'
ItemIndex = 0 ItemIndex = 0
@ -662,28 +611,28 @@ object OptionsForm: TOptionsForm
TabOrder = 0 TabOrder = 0
end end
object GroupBox3: TGroupBox object GroupBox3: TGroupBox
Left = 152 Left = 153
Top = 8 Top = 4
Width = 281 Width = 281
Height = 193 Height = 189
Caption = 'Randomize' Caption = 'Randomize'
TabOrder = 1 TabOrder = 1
object Label18: TLabel object Label18: TLabel
Left = 8 Left = 16
Top = 24 Top = 24
Width = 128 Width = 128
Height = 13 Height = 13
Caption = 'Minimum number of nodes:' Caption = 'Minimum number of nodes:'
end end
object Label19: TLabel object Label19: TLabel
Left = 8 Left = 16
Top = 56 Top = 56
Width = 128 Width = 128
Height = 13 Height = 13
Caption = 'Maximum number of nodes' Caption = 'Maximum number of nodes'
end end
object Label31: TLabel object Label31: TLabel
Left = 8 Left = 16
Top = 88 Top = 88
Width = 64 Width = 64
Height = 13 Height = 13
@ -697,7 +646,7 @@ object OptionsForm: TOptionsForm
Caption = 'and' Caption = 'and'
end end
object Label33: TLabel object Label33: TLabel
Left = 8 Left = 16
Top = 120 Top = 120
Width = 95 Width = 95
Height = 13 Height = 13
@ -711,7 +660,7 @@ object OptionsForm: TOptionsForm
Caption = 'and' Caption = 'and'
end end
object Label35: TLabel object Label35: TLabel
Left = 8 Left = 16
Top = 152 Top = 152
Width = 95 Width = 95
Height = 13 Height = 13
@ -745,8 +694,8 @@ object OptionsForm: TOptionsForm
OnChange = txtMaxNodesChange OnChange = txtMaxNodesChange
end end
object txtMinHue: TEdit object txtMinHue: TEdit
Left = 112 Left = 117
Top = 88 Top = 85
Width = 49 Width = 49
Height = 21 Height = 21
HelpContext = 1032 HelpContext = 1032
@ -756,7 +705,7 @@ object OptionsForm: TOptionsForm
end end
object txtMaxHue: TEdit object txtMaxHue: TEdit
Left = 208 Left = 208
Top = 88 Top = 85
Width = 49 Width = 49
Height = 21 Height = 21
HelpContext = 1033 HelpContext = 1033
@ -765,8 +714,8 @@ object OptionsForm: TOptionsForm
OnChange = txtMaxHueChange OnChange = txtMaxHueChange
end end
object txtMinSat: TEdit object txtMinSat: TEdit
Left = 112 Left = 117
Top = 120 Top = 117
Width = 49 Width = 49
Height = 21 Height = 21
HelpContext = 1034 HelpContext = 1034
@ -776,7 +725,7 @@ object OptionsForm: TOptionsForm
end end
object txtMaxSat: TEdit object txtMaxSat: TEdit
Left = 208 Left = 208
Top = 120 Top = 117
Width = 49 Width = 49
Height = 21 Height = 21
HelpContext = 1035 HelpContext = 1035
@ -785,8 +734,8 @@ object OptionsForm: TOptionsForm
OnChange = txtMaxSatChange OnChange = txtMaxSatChange
end end
object txtMinLum: TEdit object txtMinLum: TEdit
Left = 112 Left = 117
Top = 152 Top = 149
Width = 49 Width = 49
Height = 21 Height = 21
HelpContext = 1036 HelpContext = 1036
@ -796,7 +745,7 @@ object OptionsForm: TOptionsForm
end end
object txtMaxLum: TEdit object txtMaxLum: TEdit
Left = 208 Left = 208
Top = 152 Top = 149
Width = 49 Width = 49
Height = 21 Height = 21
HelpContext = 1037 HelpContext = 1037
@ -829,8 +778,8 @@ object OptionsForm: TOptionsForm
TabOrder = 9 TabOrder = 9
end end
object udMinHue: TUpDown object udMinHue: TUpDown
Left = 161 Left = 166
Top = 88 Top = 85
Width = 12 Width = 12
Height = 21 Height = 21
HelpContext = 1032 HelpContext = 1032
@ -840,7 +789,7 @@ object OptionsForm: TOptionsForm
end end
object udMaxHue: TUpDown object udMaxHue: TUpDown
Left = 257 Left = 257
Top = 88 Top = 85
Width = 12 Width = 12
Height = 21 Height = 21
HelpContext = 1033 HelpContext = 1033
@ -850,8 +799,8 @@ object OptionsForm: TOptionsForm
TabOrder = 11 TabOrder = 11
end end
object udMinSat: TUpDown object udMinSat: TUpDown
Left = 161 Left = 166
Top = 120 Top = 117
Width = 12 Width = 12
Height = 21 Height = 21
HelpContext = 1034 HelpContext = 1034
@ -860,7 +809,7 @@ object OptionsForm: TOptionsForm
end end
object udmaxSat: TUpDown object udmaxSat: TUpDown
Left = 257 Left = 257
Top = 120 Top = 117
Width = 12 Width = 12
Height = 21 Height = 21
HelpContext = 1035 HelpContext = 1035
@ -869,8 +818,8 @@ object OptionsForm: TOptionsForm
TabOrder = 13 TabOrder = 13
end end
object udMinLum: TUpDown object udMinLum: TUpDown
Left = 161 Left = 166
Top = 152 Top = 149
Width = 12 Width = 12
Height = 21 Height = 21
HelpContext = 1036 HelpContext = 1036
@ -879,7 +828,7 @@ object OptionsForm: TOptionsForm
end end
object udMaxLum: TUpDown object udMaxLum: TUpDown
Left = 257 Left = 257
Top = 152 Top = 149
Width = 12 Width = 12
Height = 21 Height = 21
HelpContext = 1037 HelpContext = 1037
@ -888,6 +837,46 @@ object OptionsForm: TOptionsForm
TabOrder = 15 TabOrder = 15
end end
end end
object GroupBox13: TGroupBox
Left = 8
Top = 106
Width = 137
Height = 87
Caption = 'Smooth palette'
TabOrder = 2
object Label8: TLabel
Left = 10
Top = 18
Width = 49
Height = 13
Caption = '# of tries:'
end
object Label10: TLabel
Left = 10
Top = 50
Width = 53
Height = 13
Caption = 'Try length:'
end
object txtNumtries: TEdit
Left = 80
Top = 16
Width = 49
Height = 21
HelpContext = 1002
TabOrder = 0
Text = '50'
end
object txtTryLength: TEdit
Left = 80
Top = 48
Width = 49
Height = 21
HelpContext = 1003
TabOrder = 1
Text = '10000'
end
end
end end
object TabSheet6: TTabSheet object TabSheet6: TTabSheet
Caption = 'UPR' Caption = 'UPR'

View File

@ -32,9 +32,7 @@ type
Tabs: TPageControl; Tabs: TPageControl;
GeneralPage: TTabSheet; GeneralPage: TTabSheet;
chkConfirmDel: TCheckBox; chkConfirmDel: TCheckBox;
GroupBox13: TGroupBox;
JPEG: TGroupBox; JPEG: TGroupBox;
txtJPEGQuality: TEdit;
DisplayPage: TTabSheet; DisplayPage: TTabSheet;
GroupBox2: TGroupBox; GroupBox2: TGroupBox;
Label4: TLabel; Label4: TLabel;
@ -86,10 +84,6 @@ type
GroupBox17: TGroupBox; GroupBox17: TGroupBox;
btnSetAll: TButton; btnSetAll: TButton;
btnClearAll: TButton; btnClearAll: TButton;
Label8: TLabel;
txtNumtries: TEdit;
Label10: TLabel;
txtTryLength: TEdit;
TabSheet1: TTabSheet; TabSheet1: TTabSheet;
grpGradient: TRadioGroup; grpGradient: TRadioGroup;
GroupBox3: TGroupBox; GroupBox3: TGroupBox;
@ -122,7 +116,6 @@ type
udMinMutate: TUpDown; udMinMutate: TUpDown;
udMaxMutate: TUpDown; udMaxMutate: TUpDown;
udSymOrder: TUpDown; udSymOrder: TUpDown;
chkFixedReference: TCheckBox;
GroupBox1: TGroupBox; GroupBox1: TGroupBox;
txtBatchSize: TEdit; txtBatchSize: TEdit;
udBatchSize: TUpDown; udBatchSize: TUpDown;
@ -174,13 +167,17 @@ type
Label37: TLabel; Label37: TLabel;
txtLibrary: TEdit; txtLibrary: TEdit;
clbVarEnabled: TCheckListBox; clbVarEnabled: TCheckListBox;
GroupBox15: TGroupBox;
RadioButton1: TRadioButton;
RadioButton2: TRadioButton;
RadioButton3: TRadioButton;
GroupBox16: TGroupBox; GroupBox16: TGroupBox;
cbNrTheads: TComboBox; cbNrTheads: TComboBox;
cbShowTransparancy: TCheckBox; chkShowTransparency: TCheckBox;
rgReferenceMode: TRadioGroup;
GroupBox13: TGroupBox;
Label8: TLabel;
Label10: TLabel;
txtNumtries: TEdit;
txtTryLength: TEdit;
txtJPEGquality: TComboBox;
rgTransparency: TRadioGroup;
procedure btnCancelClick(Sender: TObject); procedure btnCancelClick(Sender: TObject);
procedure FormShow(Sender: TObject); procedure FormShow(Sender: TObject);
procedure btnOKClick(Sender: TObject); procedure btnOKClick(Sender: TObject);
@ -254,20 +251,15 @@ begin
txtTryLength.text := IntToStr(Trylength); txtTryLength.text := IntToStr(Trylength);
chkConfirmDel.Checked := ConfirmDelete; chkConfirmDel.Checked := ConfirmDelete;
txtJPEGQuality.text := IntToStr(JPEGQuality); txtJPEGQuality.text := IntToStr(JPEGQuality);
chkFixedReference.Checked := FixedReference; rgReferenceMode.IteMindex := ReferenceMode;
udBatchSize.Position := BatchSize; udBatchSize.Position := BatchSize;
chkResize.checked := ResizeOnLoad; chkResize.checked := ResizeOnLoad;
case PNGTransparency of rgTransparency.ItemIndex := PNGTransparency;
0: RadioButton1.Checked := True; chkShowTransparency.Checked := ShowTransparency;
1: RadioButton2.Checked := True;
2: RadioButton3.Checked := True;
else
end;
if NrTreads <= 1 then if NrTreads <= 1 then
cbNrTheads.ItemIndex := 0 cbNrTheads.ItemIndex := 0
else else
cbNrTheads.text := intTostr(NrTreads); cbNrTheads.text := intTostr(NrTreads);
cbShowTransparancy.Checked := ShowTransparency;
{ Display tab } { Display tab }
txtSampleDensity.Text := FloatToStr(defSampleDensity); txtSampleDensity.Text := FloatToStr(defSampleDensity);
@ -363,18 +355,12 @@ begin
if BatchSize < 1 then BatchSize := 1; if BatchSize < 1 then BatchSize := 1;
if BatchSize > 300 then BatchSize := 300; if BatchSize > 300 then BatchSize := 300;
if RadioButton1.Checked then PNGTransparency := rgTransparency.ItemIndex;
PNGTransparency := 0 ShowTransparency := chkShowTransparency.Checked;
else if RadioButton2.Checked then
PNGTransparency := 1
else if RadioButton3.Checked then
PNGTransparency := 2;
ShowTransparency := cbShowTransparancy.Checked;
NrTreads := StrToIntDef(cbNrTheads.text, 0); NrTreads := StrToIntDef(cbNrTheads.text, 0);
ConfirmDelete := chkConfirmDel.Checked; ConfirmDelete := chkConfirmDel.Checked;
FixedReference := chkFixedReference.Checked; ReferenceMode := rgReferenceMode.ItemIndex;
ResizeOnLoad := chkResize.checked; ResizeOnLoad := chkResize.checked;
{ Display tab } { Display tab }
defSampleDensity := StrToFloat(txtSampleDensity.Text); defSampleDensity := StrToFloat(txtSampleDensity.Text);

View File

@ -333,14 +333,16 @@ begin
begin begin
MaxSat := 100; MaxSat := 100;
end; end;
{
if Registry.ValueExists('FixedReference') then if Registry.ValueExists('FixedReference') then
begin begin
FixedReference := Registry.ReadBool('FixedReference'); FixedReference := Registry.ReadBool('FixedReference');
end end
else else FixedReference := False;
begin }
FixedReference := False; if Registry.ValueExists('ReferenceMode') then
end; ReferenceMode := Registry.ReadInteger('ReferenceMode')
else ReferenceMode := 0;
if Registry.ValueExists('MaxLum') then if Registry.ValueExists('MaxLum') then
begin begin
MaxLum := Registry.ReadInteger('MaxLum'); MaxLum := Registry.ReadInteger('MaxLum');
@ -506,7 +508,7 @@ begin
end end
else else
begin begin
FixedReference := false; ReferenceMode := 0;
EditPrevQual := 1; EditPrevQual := 1;
MutatePrevQual := 1; MutatePrevQual := 1;
AdjustPrevQual := 1; AdjustPrevQual := 1;
@ -871,7 +873,7 @@ begin
Registry.WriteInteger('SymmetryType', SymmetryType); Registry.WriteInteger('SymmetryType', SymmetryType);
Registry.WriteInteger('SymmetryOrder', SymmetryOrder); Registry.WriteInteger('SymmetryOrder', SymmetryOrder);
Registry.WriteInteger('VariationOptions', VariationOptions); Registry.WriteInteger('VariationOptions', VariationOptions);
Registry.WriteBool('FixedReference', FixedReference); Registry.WriteInteger('ReferenceMode', ReferenceMode);
Registry.WriteInteger('MinNodes', MinNodes); Registry.WriteInteger('MinNodes', MinNodes);
Registry.WriteInteger('MinHue', MinHue); Registry.WriteInteger('MinHue', MinHue);
Registry.WriteInteger('MinSat', MinSat); Registry.WriteInteger('MinSat', MinSat);

View File

@ -133,6 +133,8 @@ begin
end; end;
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
(* --Z-- hmm, exactly the same function exists in module Main
function TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer; function TrianglesFromCP(const cp1: TControlPoint; var Triangles: TTriangles): integer;
{ Sets up the triangles from the IFS code } { Sets up the triangles from the IFS code }
var var
@ -213,6 +215,7 @@ begin
for j := 0 to 2 do for j := 0 to 2 do
triangles[i].y[j] := -triangles[i].y[j]; triangles[i].y[j] := -triangles[i].y[j];
end; end;
*)
/////////////////////////////////////////////////////////////////////////////// ///////////////////////////////////////////////////////////////////////////////
procedure EqualizeWeights(var cp: TControlPoint); procedure EqualizeWeights(var cp: TControlPoint);
@ -377,7 +380,7 @@ begin
Result.xform[i].density := 1 / Transforms; Result.xform[i].density := 1 / Transforms;
end; end;
end; // case end; // case
TrianglesFromCp(Result, Triangles); Result.TrianglesFromCp(Triangles);
if Random(2) > 0 then if Random(2) > 0 then
ComputeWeights(Result, Triangles, transforms) ComputeWeights(Result, Triangles, transforms)
else else

View File

@ -310,7 +310,7 @@ var
FileList: TStringList; FileList: TStringList;
function Mul33(M1, M2: TMatrix): TMatrix; function Mul33(M1, M2: TMatrix): TMatrix;
procedure Normalize(var cp: TControlPoint); //procedure Normalize(var cp: TControlPoint);
implementation implementation
@ -493,13 +493,14 @@ end;
procedure TScriptEditor.GetFixedReference(AMachine: TatVirtualMachine); procedure TScriptEditor.GetFixedReference(AMachine: TatVirtualMachine);
begin begin
with AMachine do with AMachine do
ReturnOutPutArg(FixedReference); ReturnOutPutArg(ReferenceMode = 0);
end; end;
procedure TScriptEditor.SetFixedReference(AMachine: TatVirtualMachine); procedure TScriptEditor.SetFixedReference(AMachine: TatVirtualMachine);
begin begin
with AMachine do with AMachine do
FixedReference := GetInputArgAsBoolean(0); if GetInputArgAsBoolean(0) then ReferenceMode := 0
else ReferenceMode := 1;
end; end;
procedure TScriptEditor.GetSampleDensity(AMachine: TatVirtualMachine); procedure TScriptEditor.GetSampleDensity(AMachine: TatVirtualMachine);
@ -1474,7 +1475,7 @@ begin
if nxform < NXFORMS then if nxform < NXFORMS then
for i := nxform to NXFORMS - 1 do for i := nxform to NXFORMS - 1 do
cp1.xform[i].density := 0; cp1.xform[i].density := 0;
NormalizeWeights(cp1); cp1.NormalizeWeights;
// Check for symmetry parameter // Check for symmetry parameter
if cp1.symmetry <> 0 then if cp1.symmetry <> 0 then
begin begin
@ -1516,7 +1517,7 @@ begin
for i := 0 to NXFORMS - 1 do for i := 0 to NXFORMS - 1 do
if ScriptEditor.cp.xform[i].density = 0 then break; if ScriptEditor.cp.xform[i].density = 0 then break;
NumTransforms := i; NumTransforms := i;
NormalizeWeights(ScriptEditor.cp); ScriptEditor.cp.NormalizeWeights;
// FlameName := FileList[index]; // FlameName := FileList[index];
finally finally
IFSStrings.Free; IFSStrings.Free;
@ -1588,7 +1589,7 @@ begin
for i := 0 to NXFORMS - 1 do for i := 0 to NXFORMS - 1 do
if ScriptEditor.cp.xform[i].density = 0 then break; if ScriptEditor.cp.xform[i].density = 0 then break;
NumTransforms := i; NumTransforms := i;
NormalizeWeights(ScriptEditor.cp); ScriptEditor.cp.NormalizeWeights;
if SavedPal then ScriptEditor.cp.cmap := Palette; if SavedPal then ScriptEditor.cp.cmap := Palette;
ScriptEditor.cp.name := FileList[index]; ScriptEditor.cp.name := FileList[index];
finally finally
@ -1620,13 +1621,13 @@ var
i: integer; i: integer;
r: double; r: double;
begin begin
MainForm.TrianglesFromCp(ScriptEditor.cp, Triangles); ScriptEditor.cp.TrianglesFromCp(Triangles);
r := AMachine.GetInputArgAsFloat(0) * pi / 180; r := AMachine.GetInputArgAsFloat(0) * pi / 180;
for i := -1 to NumTransforms - 1 do for i := -1 to NumTransforms - 1 do
begin begin
Triangles[i] := RotateTriangle(Triangles[i], r); Triangles[i] := RotateTriangle(Triangles[i], r);
end; end;
GetXForms(ScriptEditor.cp, Triangles, NumTransforms); ScriptEditor.cp.GetFromTriangles(Triangles, NumTransforms);
end; end;
procedure TOperationLibrary.AddSymmetryProc(AMachine: TatVirtualMachine); procedure TOperationLibrary.AddSymmetryProc(AMachine: TatVirtualMachine);
@ -1644,10 +1645,10 @@ var
Triangles: TTriangles; Triangles: TTriangles;
r: double; r: double;
begin begin
MainForm.TrianglesFromCp(ScriptEditor.cp, Triangles); ScriptEditor.cp.TrianglesFromCp(Triangles);
r := AMachine.GetInputArgAsFloat(0) * pi / 180; r := AMachine.GetInputArgAsFloat(0) * pi / 180;
Triangles[-1] := RotateTriangle(Triangles[-1], r); Triangles[-1] := RotateTriangle(Triangles[-1], r);
GetXForms(ScriptEditor.cp, Triangles, NumTransforms); ScriptEditor.cp.GetFromTriangles(Triangles, NumTransforms);
end; end;
procedure TOperationLibrary.ScaleProc(AMachine: TatVirtualMachine); procedure TOperationLibrary.ScaleProc(AMachine: TatVirtualMachine);
@ -1748,7 +1749,7 @@ begin
if NumTransforms > 1 then if NumTransforms > 1 then
begin begin
AMachine.Paused := True; AMachine.Paused := True;
Normalize(ScriptEditor.cp); ScriptEditor.cp.NormalizeWeights;
PreviewForm.cp.Copy(ScriptEditor.cp); PreviewForm.cp.Copy(ScriptEditor.cp);
AdjustScale(PreviewForm.cp, PreviewForm.Image.Width, PreviewForm.Image.Height); AdjustScale(PreviewForm.cp, PreviewForm.Image.Width, PreviewForm.Image.Height);
PreviewForm.Show; PreviewForm.Show;
@ -1763,7 +1764,7 @@ procedure TOperationLibrary.RenderProc(AMachine: TatVirtualMachine);
begin begin
if NumTransforms > 1 then if NumTransforms > 1 then
begin begin
Normalize(ScriptEditor.cp); ScriptEditor.cp.NormalizeWeights;
ScriptRenderForm.cp.Copy(ScriptEditor.cp); ScriptRenderForm.cp.Copy(ScriptEditor.cp);
ScriptRenderForm.Caption := 'Rendering ' + ScriptEditor.Renderer.Filename; ; ScriptRenderForm.Caption := 'Rendering ' + ScriptEditor.Renderer.Filename; ;
ScriptRenderForm.Show; ScriptRenderForm.Show;
@ -2912,7 +2913,7 @@ begin
else else
if (LastError = '') and UpdateIt then if (LastError = '') and UpdateIt then
begin begin
Normalize(cp); cp.NormalizeWeights;
MainForm.UpdateUndo; MainForm.UpdateUndo;
MainCp.Copy(cp); MainCp.Copy(cp);
UpdateFlame; UpdateFlame;
@ -2944,10 +2945,10 @@ procedure TScriptEditor.UpdateFlame;
begin begin
MainForm.StopThread; MainForm.StopThread;
MainForm.UpdateUndo; MainForm.UpdateUndo;
Normalize(cp); cp.NormalizeWeights;
MainCp.Copy(cp); MainCp.Copy(cp);
// MainCp.name := FlameName; // MainCp.name := FlameName;
Transforms := MainForm.TrianglesFromCP(MainCp, MainTriangles); Transforms := MainCp.TrianglesFromCP(MainTriangles);
AdjustScale(MainCp, MainForm.Image.Width, MainForm.Image.Height); AdjustScale(MainCp, MainForm.Image.Width, MainForm.Image.Height);
if ResetLocation then MainCp.CalcBoundBox else if ResetLocation then MainCp.CalcBoundBox else
begin; begin;
@ -2967,21 +2968,6 @@ end;
{ ******************************* Parseing *********************************** } { ******************************* Parseing *********************************** }
procedure Normalize(var cp: TControlPoint);
var
i: integer;
td: double;
begin
td := 0.0;
for i := 0 to NumTransforms - 1 do
td := td + cp.xform[i].Density;
if (td < 0.001) then
EqualizeWeights(cp)
else
for i := 0 to NumTransforms - 1 do
cp.xform[i].Density := cp.xform[i].Density / td;
end;
procedure copyxform(var dest: Txform; const source: TXform); procedure copyxform(var dest: Txform; const source: TXform);
var var
i: integer; i: integer;