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
object cmbPalette: TComboBox
Left = 72
Top = 79
Top = 78
Width = 206
Height = 19
Height = 21
BevelInner = bvLowered
BevelOuter = bvRaised
Style = csOwnerDrawFixed
Color = clBlack
DropDownCount = 20
@ -719,7 +721,7 @@ object AdjustForm: TAdjustForm
Font.Height = -11
Font.Name = 'Tahoma'
Font.Style = []
ItemHeight = 13
ItemHeight = 15
ParentFont = False
ParentShowHint = False
ShowHint = False
@ -816,105 +818,114 @@ object AdjustForm: TAdjustForm
object TabSheet4: TTabSheet
Caption = 'Image Size'
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
Left = 58
Left = 14
Top = 15
Width = 28
Height = 13
Caption = 'Width'
end
object Label3: TLabel
Left = 58
Top = 39
Left = 14
Top = 41
Width = 31
Height = 13
Caption = 'Height'
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
Left = 200
Left = 156
Top = 12
Width = 105
Height = 25
Caption = 'Preset 1'
TabOrder = 1
TabOrder = 0
OnClick = btnPreset1Click
end
object btnPreset2: TButton
Left = 200
Left = 156
Top = 38
Width = 105
Height = 25
Caption = 'Preset 2'
TabOrder = 2
TabOrder = 1
OnClick = btnPreset2Click
end
object btnPreset3: TButton
Left = 200
Left = 156
Top = 64
Width = 105
Height = 25
Caption = 'Preset 3'
TabOrder = 3
TabOrder = 2
OnClick = btnPreset3Click
end
object btnSet1: TButton
Left = 304
Left = 260
Top = 12
Width = 27
Height = 25
Caption = 'Set'
TabOrder = 4
TabOrder = 3
OnClick = btnSet1Click
end
object btnSet2: TButton
Left = 304
Left = 260
Top = 38
Width = 27
Height = 25
Caption = 'Set'
TabOrder = 5
TabOrder = 4
OnClick = btnSet2Click
end
object btnSet3: TButton
Left = 304
Left = 260
Top = 64
Width = 27
Height = 25
Caption = 'Set'
TabOrder = 6
TabOrder = 5
OnClick = btnSet3Click
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
Left = 104
Left = 60
Top = 12
Width = 73
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 7
TabOrder = 8
Text = '512'
OnChange = txtWidthChange
OnKeyPress = txtSizeKeyPress
@ -926,13 +937,13 @@ object AdjustForm: TAdjustForm
'1280')
end
object txtHeight: TComboBox
Left = 104
Top = 36
Left = 60
Top = 38
Width = 73
Height = 21
ItemHeight = 13
ItemIndex = 0
TabOrder = 8
TabOrder = 9
Text = '384'
OnChange = txtHeightChange
OnKeyPress = txtSizeKeyPress

View File

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

View File

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

View File

@ -21,17 +21,48 @@ unit ControlPoint;
interface
uses
Classes, Windows, Cmap, Xform, XFormMan;
Classes, Windows, Cmap, XForm, XFormMan;
const
EPS = 1E-10;
NXFORMS = 100; // --Z-- I don't like limitations! 8-[]
SUB_BATCH_SIZE = 10000;
PREFILTER_WHITE = (1 shl 26);
FILTER_CUTOFF = 1.8;
BRIGHT_ADJUST = 2.3;
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 //?
PLongintArray = ^TLongintArray;
TLongintArray = array[0..8192] of Longint;
@ -121,6 +152,15 @@ type
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;
destructor Destroy; override;
@ -1783,5 +1823,185 @@ begin
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.

View File

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

View File

@ -111,7 +111,7 @@ var
VariationOptions: int64;
{ For random gradients }
MinNodes, MaxNodes, MinHue, MaxHue, MinSat, MaxSat, MinLum, MaxLum: integer;
FixedReference: boolean;
ReferenceMode: integer;//FixedReference: boolean;
BatchSize: Integer;
Compatibility: integer; //0 = original, 1 = Drave's
Favorites: TStringList;
@ -183,6 +183,7 @@ function dist(x1, y1, x2, y2: double): double;
var
d2: double;
begin
(*
{ From FDesign source
{ float pt_pt_distance(float x1, float y1, float x2, float y2) }
d2 := (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
@ -193,6 +194,12 @@ begin
end
else
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;
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);
function SaveFlame(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 OnProgress(prog: double);
procedure DrawFlame;
@ -345,17 +345,16 @@ type
procedure ListXML(FileName: string; sel: integer);
function EntryExists(En, Fl: 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 CleanIdentifier(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 PackVariations: cardinal;
procedure UnpackVariations(v: integer);
function NumXForms(const cp: TControlPoint): integer;
procedure NormalizeWeights(var cp: TControlPoint);
procedure EqualizeWeights(var cp: TControlPoint);
//procedure NormalizeWeights(var cp: TControlPoint);
//procedure EqualizeWeights(var cp: TControlPoint);
procedure MultMatrix(var s: TMatrix; const m: TMatrix);
procedure ListFlames(FileName: string; sel: integer);
procedure ListIFS(FileName: string; sel: integer);
@ -473,6 +472,7 @@ begin
end;
end;
{
procedure EqualizeWeights(var cp: TControlPoint);
var
t, i: integer;
@ -496,6 +496,7 @@ begin
for i := 0 to NumXForms(cp) - 1 do
cp.xform[i].Density := cp.xform[i].Density / td;
end;
}
function PackVariations: cardinal;
{ Packs the variation options into an integer with Linear as lowest bit }
@ -1365,7 +1366,7 @@ begin
pal := ''; hue := '';
// if sheep then
// begin
pal := 'palette="' + IntToStr(cp1.cmapindex) + '" ';
if cp1.cmapindex >= 0 then pal := 'palette="' + IntToStr(cp1.cmapindex) + '" ';
hue := 'hue="' + format('%g', [cp1.hue_rotation]) + '" ';
// end;
if Trim(SheepNick) <> '' then nick := 'nick="' + Trim(SheepNick) + '"';
@ -1832,113 +1833,9 @@ end;
{ ************************** IFS and triangle stuff ************************* }
procedure ComputeWeights(var cp1: TControlPoint; Triangles: TTriangles; t: integer);
{ 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;
{ ---Z--- moved to ControlPoint ---Z--- }
procedure RandomWeights(var cp1: TControlPoint);
{ 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;
{ // unused function, hmmm...
procedure CP_compute(var cp1: TControlPoint; t1, t0: TTriangle; const i: integer);
begin
@ -1952,25 +1849,7 @@ begin
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]);
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;
{ Creates a string containing the formated flame parameter set }
@ -2200,7 +2079,8 @@ procedure TMainForm.mnuNormalWeightsClick(Sender: TObject);
begin
StopThread;
UpdateUndo;
ComputeWeights(MainCp, MainTriangles, transforms);
// TODO: ...something
// ComputeWeights(MainCp, MainTriangles, transforms);
RedrawTimer.Enabled := True;
UpdateWindows;
end;
@ -2211,7 +2091,7 @@ begin
UpdateUndo;
inc(MainSeed);
RandSeed := MainSeed;
RandomWeights(MainCp);
MainCp.RandomizeWeights;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
@ -2338,7 +2218,7 @@ begin
inc(RandomIndex);
MainCp.name := RandomPrefix + RandomDate + '-' +
IntToStr(RandomIndex);
Transforms := TrianglesFromCP(MainCp, MainTriangles);
Transforms := MainCp.TrianglesFromCP(MainTriangles);
if AdjustForm.visible then
AdjustForm.UpdateDisplay;
@ -2353,7 +2233,7 @@ procedure TMainForm.mnuEqualizeClick(Sender: TObject);
begin
StopThread;
UpdateUndo;
EqualizeWeights(maincp);
MainCP.EqualizeWeights;
RedrawTimer.Enabled := True;
UpdateWindows;
end;
@ -2817,7 +2697,7 @@ begin
btnUndo.Enabled := false;
btnRedo.enabled := false;
Transforms := TrianglesFromCP(MainCp, MainTriangles);
Transforms := MainCp.TrianglesFromCP(MainTriangles);
UndoIndex := 0;
UndoMax := 0;
@ -2942,7 +2822,7 @@ begin
// Zoom := maincp.zoom;
Center[0] := maincp.Center[0];
Center[1] := maincp.Center[1];
NormalizeWeights(maincp);
MainCP.NormalizeWeights;
mnuSaveUndo.Enabled := false;
mnuUndo.Enabled := False;
mnuPopUndo.Enabled := False;
@ -2956,7 +2836,7 @@ begin
AdjustForm.btnRedo.enabled := false;
btnUndo.Enabled := false;
btnRedo.enabled := false;
Transforms := TrianglesFromCP(maincp, MainTriangles);
Transforms := MainCp.TrianglesFromCP(MainTriangles);
// Fix Apophysis 1.0 parameters with negative color parameteres!
for i := 0 to Transforms - 1 do
if maincp.xform[i].color < 0 then maincp.xform[i].color := 0;
@ -3054,8 +2934,8 @@ begin
Center[0] := maincp.Center[0];
Center[1] := maincp.Center[1];
// cp.CalcBoundbox;
NormalizeWeights(maincp);
Transforms := TrianglesFromCP(maincp, MainTriangles);
MainCP.NormalizeWeights;
Transforms := MainCp.TrianglesFromCP(MainTriangles);
// Trim undo index from title
maincp.name := Copy(Fstrings[0], 6, length(Fstrings[0]) - 7);
@ -3306,6 +3186,7 @@ begin
StopThread;
UpdateUndo;
maincp.cmap := Pal;
maincp.cmapindex := -1;
AdjustForm.UpdateDisplay;
if EditForm.Visible then EditForm.UpdateDisplay;
@ -3613,7 +3494,7 @@ begin
center[1] := maincp.center[1];
RedrawTimer.Enabled := True;
Application.ProcessMessages;
Transforms := TrianglesFromCP(maincp, MainTriangles);
Transforms := MainCp.TrianglesFromCP(MainTriangles);
UpdateWindows;
end;
finally
@ -3752,7 +3633,7 @@ begin
if nxform < NXFORMS then
for i := nxform to NXFORMS - 1 do
cp1.xform[i].density := 0;
NormalizeWeights(cp1);
cp1.NormalizeWeights;
// Check for symmetry parameter
if ParseCp.symmetry <> 0 then
begin
@ -3766,7 +3647,7 @@ begin
if Clipboard.HasFormat(CF_TEXT) then begin
UpdateUndo;
ParseXML(MainCP, PCHAR(Clipboard.AsText));
Transforms := TrianglesFromCP(MainCp, MainTriangles);
Transforms := MainCp.TrianglesFromCP(MainTriangles);
Statusbar.Panels[2].Text := MainCp.name;
if ResizeOnLoad then ResizeWindow;
RedrawTimer.Enabled := True;
@ -3782,10 +3663,7 @@ begin
txt := Trim(FlameToXML(Maincp, false, true));
Clipboard.SetTextBuf(PChar(txt));
mnuPaste.enabled := true;
//z btnPaste.enabled := true;
// GradientForm.mnuPaste.enabled := False;
// GradientForm.btnPaste.enabled := False;
AdjustForm.mnuPaste.enabled := False;
AdjustForm.btnPaste.enabled := False;
end;

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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

View File

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