diff --git a/2.10/Source/About.dfm b/2.10/Source/About.dfm index 0bd3eb8..0fd2085 100644 --- a/2.10/Source/About.dfm +++ b/2.10/Source/About.dfm @@ -1866,7 +1866,7 @@ object AboutForm: TAboutForm object Label1: TLabel Left = 120 Top = 8 - Width = 137 + Width = 131 Height = 36 Caption = 'Apophysis' Font.Charset = ANSI_CHARSET @@ -1877,11 +1877,11 @@ object AboutForm: TAboutForm ParentFont = False end object Label2: TLabel - Left = 260 + Left = 268 Top = 24 - Width = 65 + Width = 58 Height = 13 - Caption = 'Version 2.03b' + Caption = 'version 2.03' end object Label3: TLabel Left = 120 diff --git a/2.10/Source/Adjust.dfm b/2.10/Source/Adjust.dfm index 8442ed2..f2f4917 100644 --- a/2.10/Source/Adjust.dfm +++ b/2.10/Source/Adjust.dfm @@ -4,7 +4,7 @@ object AdjustForm: TAdjustForm BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'Adjust' - ClientHeight = 264 + ClientHeight = 263 ClientWidth = 390 Color = clBtnFace Font.Charset = DEFAULT_CHARSET @@ -172,7 +172,7 @@ object AdjustForm: TAdjustForm Left = 0 Top = 133 Width = 390 - Height = 131 + Height = 130 ActivePage = TabSheet1 Align = alBottom TabOrder = 1 @@ -331,13 +331,12 @@ object AdjustForm: TAdjustForm Caption = 'Rendering' ImageIndex = 1 object lblContrast: TLabel - Left = 8 + Left = 4 Top = 80 - Width = 93 + Width = 69 Height = 13 - Alignment = taRightJustify AutoSize = False - Caption = 'Background color:' + Caption = 'Background' end object btnGamma: TSpeedButton Left = 4 @@ -375,6 +374,13 @@ object AdjustForm: TAdjustForm ShowHint = True OnClick = btnVibrancyClick end + object Label1: TLabel + Left = 236 + Top = 80 + Width = 62 + Height = 13 + Caption = 'Master Scale' + end object scrollGamma: TScrollBar Left = 72 Top = 7 @@ -446,9 +452,9 @@ object AdjustForm: TAdjustForm OnKeyPress = txtVibrancyKeyPress end object ColorPanel: TPanel - Left = 112 + Left = 72 Top = 78 - Width = 113 + Width = 65 Height = 21 Cursor = crHandPoint BevelOuter = bvLowered @@ -456,31 +462,24 @@ object AdjustForm: TAdjustForm TabOrder = 6 OnClick = ColorPanelClick end - object cbColor: TComboBox - Left = 232 - Top = 78 - Width = 59 - Height = 21 - Enabled = False - ItemHeight = 13 - ItemIndex = 0 - TabOrder = 7 - Text = '000000' - Visible = False - Items.Strings = ( - '000000' - 'FFFFFF') - end object chkTransparent: TCheckBox - Left = 296 + Left = 144 Top = 80 Width = 81 Height = 17 Caption = 'Transparent' Enabled = False - TabOrder = 8 + TabOrder = 7 Visible = False end + object editPPU: TEdit + Left = 304 + Top = 76 + Width = 75 + Height = 21 + TabOrder = 8 + OnKeyPress = editPPUKeyPress + end end object TabSheet3: TTabSheet Caption = 'Gradient' @@ -674,7 +673,7 @@ object AdjustForm: TAdjustForm Left = 0 Top = 0 Width = 382 - Height = 45 + Height = 49 Align = alTop BevelOuter = bvLowered Color = clAppWorkSpace @@ -683,7 +682,7 @@ object AdjustForm: TAdjustForm Left = 1 Top = 1 Width = 380 - Height = 43 + Height = 47 Cursor = crHandPoint Align = alClient PopupMenu = GradientPopup diff --git a/2.10/Source/Adjust.pas b/2.10/Source/Adjust.pas index 547aa3e..bd73cd9 100644 --- a/2.10/Source/Adjust.pas +++ b/2.10/Source/Adjust.pas @@ -61,7 +61,6 @@ type txtVibrancy: TEdit; ColorPanel: TPanel; TabSheet3: TTabSheet; - cbColor: TComboBox; scrollAngle: TScrollBar; txtAngle: TEdit; btnZoom: TSpeedButton; @@ -131,6 +130,8 @@ type Bevel2: TBevel; N8: TMenuItem; mnuInstantPreview: TMenuItem; + Label1: TLabel; + editPPU: TEdit; procedure FormCreate(Sender: TObject); procedure FormClose(Sender: TObject; var Action: TCloseAction); procedure FormDestroy(Sender: TObject); @@ -248,6 +249,7 @@ type procedure btnColorPresetClick(Sender: TObject); procedure btnApplySizeClick(Sender: TObject); procedure mnuInstantPreviewClick(Sender: TObject); + procedure editPPUKeyPress(Sender: TObject; var Key: Char); private Resetting: boolean; @@ -337,7 +339,7 @@ begin PreviewImage.Top := 1; PreviewImage.Left := (pw - PreviewImage.Width) div 2; end; - AdjustScale(cp, PreviewImage.Width, PreviewImage.Height); + cp.AdjustScale(PreviewImage.Width, PreviewImage.Height); cp.cmap := MainCp.cmap; @@ -361,7 +363,7 @@ begin end; ColorPanel.color := cp.background[2] shl 16 + cp.background[1] shl 8 + cp.background[0]; - cbColor.text := IntToHex(integer(ColorPanel.Color), 6); + //cbColor.text := IntToHex(integer(ColorPanel.Color), 6); GetMainWindowSize; @@ -373,7 +375,7 @@ begin BackupPal := cp.cmap; Resetting := False; - +editPPU.Text := FloatToStr(cp.pixels_per_unit); end; //*** DrawPreview; end; @@ -532,7 +534,14 @@ begin Preset[i].Width := 512; Preset[i].Height := 384; end; - end; + end + else + for i:=1 to 3 do begin + Preset[i].Left := MainForm.Left; + Preset[i].Top := MainForm.Top; + Preset[i].Width := 512; + Preset[i].Height := 384; + end; Registry.CloseKey; finally Registry.Free; @@ -898,7 +907,7 @@ begin if ColorDialog.Execute then begin ColorPanel.Color := ColorDialog.Color; - cbColor.text := IntToHex(integer(ColorDialog.Color), 6); + //cbColor.text := IntToHex(integer(ColorDialog.Color), 6); col := ColorToRGB(ColorDialog.Color); cp.background[0] := col and 255; cp.background[1] := col shr 8 and 255; @@ -1862,7 +1871,7 @@ end; procedure TAdjustForm.btnColorPresetClick(Sender: TObject); begin - cmbPalette.ItemIndex := random(701); + cmbPalette.ItemIndex := Random(NRCMAPS); cmbPaletteChange(Sender); end; @@ -1876,5 +1885,23 @@ begin mnuInstantPreview.Checked := not mnuInstantPreview.Checked; end; +procedure TAdjustForm.editPPUKeyPress(Sender: TObject; var Key: Char); +var + t: double; +begin + if key=#13 then + begin + key := #0; + try + t:=strtofloat(editPPU.Text); + except + exit; + end; + MainForm.UpdateUndo; + cp.pixels_per_unit:=t; + UpdateFlame; + end; +end; + end. diff --git a/2.10/Source/BaseVariation.pas b/2.10/Source/BaseVariation.pas index d3e7cfd..0efc19a 100644 --- a/2.10/Source/BaseVariation.pas +++ b/2.10/Source/BaseVariation.pas @@ -56,7 +56,7 @@ begin end; /////////////////////////////////////////////////////////////////////////////// -procedure TBaseVariation.prepare; +procedure TBaseVariation.Prepare; begin end; diff --git a/2.10/Source/ControlPoint.pas b/2.10/Source/ControlPoint.pas index a1e3216..ed74eb3 100644 --- a/2.10/Source/ControlPoint.pas +++ b/2.10/Source/ControlPoint.pas @@ -156,11 +156,12 @@ type // CP-specific functions moved from unit Main function NumXForms: integer; function TrianglesFromCP(var Triangles: TTriangles): integer; + procedure GetFromTriangles(const Triangles: TTriangles; const t: integer); procedure EqualizeWeights; procedure NormalizeWeights; procedure RandomizeWeights; procedure ComputeWeights(Triangles: TTriangles; t: integer); - procedure GetFromTriangles(const Triangles: TTriangles; const t: integer); + procedure AdjustScale(w, h: integer); constructor Create; destructor Destroy; override; @@ -272,7 +273,7 @@ begin end; LoopValue := 0; - for i := 0 to 1023 do begin + for i := 0 to PROP_TABLE_SIZE-1 do begin propsum := 0; j := -1; repeat @@ -726,6 +727,7 @@ var CurrentXForm: integer; i: integer; OldDecimalSperator: Char; + v: double; begin ParseValues := TStringList.Create; ParseValues.CommaText := AString; @@ -871,7 +873,20 @@ begin xform[CurrentXForm].c[2, 0] := StrToFloat(ParseValues[ParsePos]); Inc(ParsePos); xform[CurrentXForm].c[2, 1] := StrToFloat(ParseValues[ParsePos]); - end else if AnsiCompareText(CurrentToken, 'var') = 0 then begin + end else if AnsiCompareText(CurrentToken, 'post') = 0 then begin + Inc(ParsePos); + xform[CurrentXForm].p[0, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].p[0, 1] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].p[1, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].p[1, 1] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].p[2, 0] := StrToFloat(ParseValues[ParsePos]); + Inc(ParsePos); + xform[CurrentXForm].p[2, 1] := StrToFloat(ParseValues[ParsePos]); + end else if AnsiCompareText(CurrentToken, 'vars') = 0 then begin for i := 0 to NRVAR - 1 do begin xform[CurrentXForm].vars[i] := 0; end; @@ -887,6 +902,24 @@ begin xform[CurrentXForm].vars[i] := StrToFloat(ParseValues[ParsePos]); Inc(i); end; + end else if AnsiCompareText(CurrentToken, 'variables') = 0 then begin + v := 0; + for i:= 0 to GetNrVariableNames-1 do begin + xform[CurrentXForm].SetVariable(GetVariableNameAt(i), v); + end; + + i := 0; + while true do begin + if (ParsePos + 1) >= ParseValues.Count then + break; + if ParseValues[ParsePos + 1][1] in ['a'..'z', 'A'..'Z'] then + break; + + Inc(ParsePos); + v := StrToFloat(ParseValues[ParsePos]); + xform[CurrentXForm].SetVariable(GetVariableNameAt(i), v); + Inc(i); + end; end else begin OutputDebugString(Pchar('Unknown Token: ' + CurrentToken)); @@ -1251,13 +1284,14 @@ begin end; -class function TControlPoint.interpolate(cp1, cp2: TControlPoint; Time: double): TControlPoint; +class function TControlPoint.Interpolate(cp1, cp2: TControlPoint; Time: double): TControlPoint; var c0, c1: double; i, j: integer; r, s, t: array[0..2] of double; // totvar: double; {z,rhtime: double;} + v1, v2: double; begin if (cp2.time - cp1.time) > 1E-6 then begin c0 := (cp2.time - time) / (cp2.time - cp1.time); @@ -1319,9 +1353,18 @@ begin for i := 0 to NXFORMS - 1 do begin Result.xform[i].density := c0 * cp1.xform[i].density + c1 * cp2.xform[i].density; Result.xform[i].color := c0 * cp1.xform[i].color + c1 * cp2.xform[i].color; - for j := 0 to NRVAR - 1 do begin +// for j := 0 to NRVAR - 1 do +// Result.xform[i].vars[j] := c0 * cp1.xform[i].vars[j] + c1 * cp2.xform[i].vars[j]; + for j := 0 to NrVar-1 do + begin Result.xform[i].vars[j] := c0 * cp1.xform[i].vars[j] + c1 * cp2.xform[i].vars[j]; end; + for j:= 0 to GetNrVariableNames-1 do begin + cp1.xform[i].GetVariable(GetVariableNameAt(j), v1); + cp2.xform[i].GetVariable(GetVariableNameAt(j), v2); + v1 := c0 * v1 + c1 * v2; + Result.xform[i].SetVariable(GetVariableNameAt(j), v1); + end; (* totvar := 0; @@ -1371,6 +1414,7 @@ var c0, c1: double; i, j: integer; r, s, t: array[0..2] of double; + v1, v2: double; // totvar: double; {z,rhtime: double;} begin @@ -1434,8 +1478,15 @@ begin Result.xform[i].density := c0 * cp1.xform[i].density + c1 * cp2.xform[i].density; Result.xform[i].color := c0 * cp1.xform[i].color + c1 * cp2.xform[i].color; Result.xform[i].symmetry := c0 * cp1.xform[i].symmetry + c1 * cp2.xform[i].symmetry; - for j := 0 to NRVAR - 1 do begin +// for j := 0 to NrVar - 1 do +// Result.xform[i].vars[j] := c0 * cp1.xform[i].vars[j] + c1 * cp2.xform[i].vars[j]; + for j := 0 to NrVar-1 do Result.xform[i].vars[j] := c0 * cp1.xform[i].vars[j] + c1 * cp2.xform[i].vars[j]; + for j:= 0 to GetNrVariableNames-1 do begin + cp1.xform[i].GetVariable(GetVariableNameAt(j), v1); + cp2.xform[i].GetVariable(GetVariableNameAt(j), v2); + v1 := c0 * v1 + c1 * v2; + Result.xform[i].SetVariable(GetVariableNameAt(j), v1); end; (* totvar := 0; @@ -1472,9 +1523,10 @@ end; procedure TControlPoint.SaveToStringlist(sl: TStringlist); var - i, j: Integer; + i, j, k: Integer; s: string; OldDecimalSperator: Char; + v: double; begin OldDecimalSperator := DecimalSeparator; DecimalSeparator := '.'; @@ -1495,22 +1547,27 @@ begin sl.add(format('brightness %f gamma %f vibrancy %f hue_rotation %f cmap_inter %d', [brightness * BRIGHT_ADJUST, gamma, vibrancy, hue_rotation, cmap_inter])); - for i := 0 to NXFORMS - 1 do begin - if xform[i].density = 0 then - Continue; + for i := 0 to NXFORMS - 1 do + with xform[i] do begin + if density = 0 then continue; - sl.add(format('xform %d density %g color %g symmetry %g', [i, xform[i].density, xform[i].color, xform[i].symmetry])); - s := 'var'; - for j := 0 to NRVAR - 1 do begin - s := format('%s %g', [s, xform[i].vars[j]]); + sl.add(format('xform %d density %g color %g symmetry %g', [i, density, color, symmetry])); + s := 'vars'; + for j := 0 to NRVAR - 1 do begin + s := format('%s %g', [s, vars[j]]); + end; + sl.add(s); + s := 'variables'; + for j:= 0 to GetNrVariableNames-1 do begin + GetVariable(GetVariableNameAt(j), v); + s := format('%s %g', [s, v]); + end; + sl.add(s); + sl.Add(format('coefs %.6f %.6f %.6f %.6f %.6f %.6f', + [c[0][0], c[0][1], c[1][0], c[1][1], c[2][0], c[2][1]])); + sl.Add(format('post %.6f %.6f %.6f %.6f %.6f %.6f', + [p[0][0], p[0][1], p[1][0], p[1][1], p[2][0], p[2][1]])); end; - sl.add(s); -// sl.Add(format('coefs %f %f %f %f %f %f', - sl.Add(format('coefs %.6f %.6f %.6f %.6f %.6f %.6f', - [xform[i].c[0][0], xform[i].c[0][1], - xform[i].c[1][0], xform[i].c[1][1], - xform[i].c[2][0], xform[i].c[2][1]])); - end; DecimalSeparator := OldDecimalSperator; end; @@ -1697,7 +1754,7 @@ begin if xform[i].density = 0 then break; - for v := 23 to NrVar - 1 do + for v := NRLOCVAR to NrVar - 1 do result := Result or (xform[i].vars[v] > 0); if result then @@ -2007,5 +2064,15 @@ begin end; end; +procedure TControlPoint.AdjustScale(w, h: integer); +begin +// if width >= height then + pixels_per_unit := pixels_per_unit * w/width; +// else +// pixels_per_unit := pixels_per_unit * h/height; + width := w; + height := h; +end; + end. diff --git a/2.10/Source/Editor.dfm b/2.10/Source/Editor.dfm index 47a3c1a..4a5bb18 100644 --- a/2.10/Source/Editor.dfm +++ b/2.10/Source/Editor.dfm @@ -1,8 +1,8 @@ object EditForm: TEditForm - Left = 279 - Top = 234 + Left = 302 + Top = 226 Width = 586 - Height = 582 + Height = 573 Caption = 'Transform Editor' Color = clBtnFace Constraints.MinHeight = 400 @@ -54,7 +54,7 @@ object EditForm: TEditForm TextHeight = 13 object StatusBar: TStatusBar Left = 0 - Top = 539 + Top = 530 Width = 578 Height = 15 Panels = < @@ -244,28 +244,8 @@ object EditForm: TEditForm ShowHint = True OnClick = mnuFlipVerticalClick end - object tbFlipAllHorz: TToolButton - Left = 324 - Top = 0 - Hint = 'Flip all triangles horizontal' - Caption = 'Flip All Horizontal' - ImageIndex = 12 - MenuItem = mnuHorizintalFlipAll - ParentShowHint = False - ShowHint = True - end - object tbFlipAllVert: TToolButton - Left = 349 - Top = 0 - Hint = 'Flip all triangles vertical' - Caption = 'Flip All Vertical ' - ImageIndex = 13 - MenuItem = mnuVerticalFlipAll - ParentShowHint = False - ShowHint = True - end object ToolButton2: TToolButton - Left = 374 + Left = 324 Top = 0 Width = 8 Caption = 'ToolButton2' @@ -273,7 +253,7 @@ object EditForm: TEditForm Style = tbsSeparator end object tbVarPreview: TToolButton - Left = 382 + Left = 332 Top = 0 Hint = 'Show/hide variation preview' Caption = 'Variation Preview' @@ -289,14 +269,14 @@ object EditForm: TEditForm Left = 0 Top = 24 Width = 578 - Height = 515 + Height = 506 Align = alClient TabOrder = 1 object Splitter1: TSplitter Left = 396 Top = 1 Width = 9 - Height = 513 + Height = 504 Align = alRight AutoSnap = False Beveled = True @@ -307,7 +287,7 @@ object EditForm: TEditForm Left = 1 Top = 1 Width = 395 - Height = 513 + Height = 504 Align = alClient BevelOuter = bvNone Color = clAppWorkSpace @@ -317,7 +297,7 @@ object EditForm: TEditForm Left = 405 Top = 1 Width = 172 - Height = 513 + Height = 504 Align = alRight Alignment = taLeftJustify BevelOuter = bvNone @@ -356,7 +336,7 @@ object EditForm: TEditForm Left = 0 Top = 138 Width = 172 - Height = 375 + Height = 366 Align = alClient TabOrder = 0 object lblTransform: TLabel @@ -389,7 +369,7 @@ object EditForm: TEditForm Left = 1 Top = 30 Width = 170 - Height = 344 + Height = 335 ActivePage = TriangleTab Align = alBottom Anchors = [akLeft, akTop, akRight, akBottom] @@ -402,7 +382,7 @@ object EditForm: TEditForm Left = 0 Top = 0 Width = 162 - Height = 298 + Height = 289 HorzScrollBar.Visible = False VertScrollBar.Smooth = True VertScrollBar.Style = ssFlat @@ -416,29 +396,29 @@ object EditForm: TEditForm Left = 0 Top = 0 Width = 162 - Height = 277 + Height = 281 BevelOuter = bvNone TabOrder = 0 - object Label9: TLabel + object LabelB: TLabel Left = 4 Top = 32 - Width = 10 + Width = 12 Height = 13 - Caption = 'B:' + Caption = 'O:' end - object Label7: TLabel + object LabelA: TLabel Left = 4 Top = 8 - Width = 11 + Width = 10 Height = 13 - Caption = 'A:' + Caption = 'X:' end - object Label11: TLabel + object LabelC: TLabel Left = 4 Top = 56 - Width = 11 + Width = 10 Height = 13 - Caption = 'C:' + Caption = 'Y:' end object btTrgRotateRight: TSpeedButton Left = 106 @@ -1016,27 +996,6 @@ object EditForm: TEditForm OnExit = CornerEditExit OnKeyPress = CornerEditKeyPress end - object rgPivot: TRadioGroup - Left = 16 - Top = 210 - Width = 129 - Height = 65 - BiDiMode = bdLeftToRight - Caption = 'Triangle Pivot' - Columns = 2 - Ctl3D = True - ItemIndex = 1 - Items.Strings = ( - 'A' - 'B' - 'C' - 'Center' - '( 0; 0 )') - ParentBiDiMode = False - ParentCtl3D = False - TabOrder = 6 - OnClick = rgPivotClicked - end object txtTrgMoveValue: TComboBox Left = 56 Top = 132 @@ -1045,7 +1004,7 @@ object EditForm: TEditForm AutoComplete = False ItemHeight = 13 ItemIndex = 3 - TabOrder = 8 + TabOrder = 7 Text = '0.1' OnExit = txtValidateValue OnKeyPress = txtValKeyPress @@ -1065,7 +1024,7 @@ object EditForm: TEditForm Height = 21 AutoComplete = False ItemHeight = 13 - TabOrder = 7 + TabOrder = 6 Text = '15' OnExit = txtValidateValue OnKeyPress = txtValKeyPress @@ -1087,7 +1046,7 @@ object EditForm: TEditForm AutoComplete = False ItemHeight = 13 ItemIndex = 1 - TabOrder = 9 + TabOrder = 8 Text = '125' OnExit = txtValidateValue OnKeyPress = txtValKeyPress @@ -1099,43 +1058,98 @@ object EditForm: TEditForm '200') end end - object chkPreserve: TCheckBox - Left = 30 - Top = 280 - Width = 105 - Height = 17 - Caption = 'Preserve weights' - Checked = True - State = cbChecked + object GroupBox3: TGroupBox + Left = 8 + Top = 208 + Width = 146 + Height = 65 + Caption = 'Pivot Point' TabOrder = 1 + object btnResetPivot: TSpeedButton + Left = 6 + Top = 40 + Width = 17 + Height = 17 + Hint = 'Reset pivot point to (0, 0)' + Caption = 'R' + ParentShowHint = False + ShowHint = True + OnClick = btnResetPivotClick + end + object btnPickPivot: TSpeedButton + Left = 122 + Top = 40 + Width = 17 + Height = 17 + Hint = 'Pick pivot point using mouse' + Caption = 'P' + ParentShowHint = False + ShowHint = True + OnClick = btnPickPivotClick + end + object btnPivotMode: TSpeedButton + Left = 24 + Top = 40 + Width = 97 + Height = 17 + Hint = 'Toggle pivot point mode' + Caption = 'Local Pivot' + ParentShowHint = False + ShowHint = True + OnClick = btnPivotModeClick + end + object editPivotY: TEdit + Left = 74 + Top = 16 + Width = 65 + Height = 21 + Hint = 'Pivot point coordinates in chosen coordinate system' + AutoSelect = False + ParentShowHint = False + ShowHint = True + TabOrder = 1 + Text = '0' + OnExit = PivotValidate + OnKeyPress = PivotKeyPress + end + object editPivotX: TEdit + Left = 6 + Top = 16 + Width = 65 + Height = 21 + Hint = 'Pivot point coordinates in chosen coordinate system' + AutoSelect = False + ParentShowHint = False + ShowHint = True + TabOrder = 0 + Text = '0' + OnExit = PivotValidate + OnKeyPress = PivotKeyPress + end end end end object tabXForm: TTabSheet Caption = 'Transform' object Label6: TLabel - Left = 36 - Top = 100 + Left = 10 + Top = 126 Width = 38 Height = 13 + Hint = '"weight" is the probability of this transform to be applied' Caption = 'Weight:' - end - object Label29: TLabel - Left = 36 - Top = 124 - Width = 52 - Height = 13 - Caption = 'Symmetry:' + ParentShowHint = False + ShowHint = True end object btnResetCoefs: TSpeedButton Left = 8 - Top = 148 + Top = 76 Width = 145 Height = 22 - Hint = 'Reset all vectors to default' - Caption = 'Reset Coefs' + Hint = 'Reset all vectors to default position' + Caption = 'Reset transform' ParentShowHint = False - ShowHint = False + ShowHint = True OnClick = mnuResetClick end object btnXcoefs: TSpeedButton @@ -1143,10 +1157,10 @@ object EditForm: TEditForm Top = 4 Width = 25 Height = 21 - Hint = 'Reset point A' + Hint = 'Reset vector X' Caption = 'X' ParentShowHint = False - ShowHint = False + ShowHint = True OnClick = btnXcoefsClick end object btnYcoefs: TSpeedButton @@ -1154,10 +1168,10 @@ object EditForm: TEditForm Top = 28 Width = 25 Height = 21 - Hint = 'Reset point C' + Hint = 'Reset vector Y' Caption = 'Y' ParentShowHint = False - ShowHint = False + ShowHint = True OnClick = btnYcoefsClick end object btnOcoefs: TSpeedButton @@ -1165,33 +1179,99 @@ object EditForm: TEditForm Top = 52 Width = 25 Height = 21 - Hint = 'Reset point B' + Hint = 'Reset vector O' Caption = 'O' ParentShowHint = False - ShowHint = False + ShowHint = True OnClick = btnOcoefsClick end object btnCoefsRect: TSpeedButton Left = 8 - Top = 76 + Top = 101 Width = 71 Height = 17 + Hint = 'Show vectors in rectangular (cartesian) coordinates' GroupIndex = 1 Down = True Caption = 'Rectangular' - Flat = True + ParentShowHint = False + ShowHint = True OnClick = btnCoefsModeClick end object btnCoefsPolar: TSpeedButton Left = 82 - Top = 76 + Top = 101 Width = 71 Height = 17 + Hint = 'Show vectors in polar coordinates' GroupIndex = 1 Caption = 'Polar (deg)' - Flat = True + ParentShowHint = False + ShowHint = True OnClick = btnCoefsModeClick end + object btnXpost: TSpeedButton + Left = 8 + Top = 188 + Width = 25 + Height = 21 + Hint = 'Reset vector X' + Caption = 'X' + ParentShowHint = False + ShowHint = True + OnClick = btnXpostClick + end + object btnYpost: TSpeedButton + Left = 8 + Top = 212 + Width = 25 + Height = 21 + Hint = 'Reset vector Y' + Caption = 'Y' + ParentShowHint = False + ShowHint = True + OnClick = btnYpostClick + end + object btnOpost: TSpeedButton + Left = 8 + Top = 236 + Width = 25 + Height = 21 + Hint = 'Reset vector O' + Caption = 'O' + ParentShowHint = False + ShowHint = True + OnClick = btnOpostClick + end + object btnResetPostXForm: TSpeedButton + Left = 8 + Top = 164 + Width = 145 + Height = 22 + Hint = 'Reset post-transform vectors to defaults' + Caption = 'Reset post-transform' + ParentShowHint = False + ShowHint = True + OnClick = btnResetPostXFormClick + end + object btnSwapXforms: TSpeedButton + Left = 8 + Top = 260 + Width = 145 + Height = 22 + Hint = 'Swap Xform with PostXform' + Caption = '[ Xform <-> PostXform ]' + Flat = True + Font.Charset = ANSI_CHARSET + Font.Color = clWindowText + Font.Height = -11 + Font.Name = 'Tahoma' + Font.Style = [] + ParentFont = False + ParentShowHint = False + ShowHint = True + OnClick = btnSwapXformsClick + end object txtA: TEdit Left = 36 Top = 4 @@ -1254,7 +1334,7 @@ object EditForm: TEditForm end object txtP: TEdit Left = 96 - Top = 96 + Top = 122 Width = 57 Height = 21 TabOrder = 6 @@ -1262,15 +1342,81 @@ object EditForm: TEditForm OnExit = txtPExit OnKeyPress = txtPKeyPress end - object txtSymmetry: TEdit - Left = 96 - Top = 120 + object chkPreserve: TCheckBox + Left = 8 + Top = 145 + Width = 145 + Height = 17 + Hint = + 'Keep this checked if you don'#39't want all weights to be recalculat' + + 'ed to screw up all your flame :-)' + Alignment = taLeftJustify + Caption = 'Preserve weights' + Checked = True + ParentShowHint = False + ShowHint = True + State = cbChecked + TabOrder = 7 + end + object txtPost00: TEdit + Left = 36 + Top = 188 Width = 57 Height = 21 - TabOrder = 7 + TabOrder = 8 Text = '0' - OnExit = txtSymmetryExit - OnKeyPress = txtSymmetryKeyPress + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object txtPost01: TEdit + Left = 96 + Top = 188 + Width = 57 + Height = 21 + TabOrder = 9 + Text = '0' + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object txtPost10: TEdit + Left = 36 + Top = 212 + Width = 57 + Height = 21 + TabOrder = 10 + Text = '0' + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object txtPost11: TEdit + Left = 96 + Top = 212 + Width = 57 + Height = 21 + TabOrder = 11 + Text = '0' + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object txtPost20: TEdit + Left = 36 + Top = 236 + Width = 57 + Height = 21 + TabOrder = 12 + Text = '0' + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress + end + object txtPost21: TEdit + Left = 96 + Top = 236 + Width = 57 + Height = 21 + TabOrder = 13 + Text = '0' + OnExit = PostCoefValidate + OnKeyPress = PostCoefKeypress end end object tabVariations: TTabSheet @@ -1279,7 +1425,7 @@ object EditForm: TEditForm Left = 0 Top = 0 Width = 162 - Height = 298 + Height = 289 Align = alClient ScrollBars = ssVertical TabOrder = 0 @@ -1305,7 +1451,7 @@ object EditForm: TEditForm Left = 0 Top = 0 Width = 162 - Height = 298 + Height = 289 Align = alClient ScrollBars = ssVertical TabOrder = 0 @@ -1331,9 +1477,16 @@ object EditForm: TEditForm Left = 8 Top = 2 Width = 145 - Height = 71 + Height = 100 Caption = 'Transform color' TabOrder = 0 + object Label29: TLabel + Left = 10 + Top = 72 + Width = 52 + Height = 13 + Caption = 'Symmetry:' + end object scrlXFormColor: TScrollBar Left = 8 Top = 46 @@ -1363,67 +1516,43 @@ object EditForm: TEditForm OnExit = txtXFormColorExit OnKeyPress = txtXFormColorKeyPress end + object txtSymmetry: TComboBox + Left = 80 + Top = 70 + Width = 57 + Height = 21 + ItemHeight = 13 + ItemIndex = 0 + TabOrder = 3 + Text = '0' + OnExit = txtSymmetryExit + OnKeyPress = txtSymmetryKeyPress + Items.Strings = ( + '0' + '1') + end end object GroupBox2: TGroupBox Left = 8 - Top = 77 + Top = 108 Width = 145 - Height = 212 + Height = 137 Caption = 'Graph' TabOrder = 1 - object Label20: TLabel - Left = 8 - Top = 56 - Width = 56 - Height = 13 - Caption = 'Background' - end - object Label21: TLabel - Left = 8 - Top = 96 - Width = 50 - Height = 13 - Caption = 'Reference' - end - object Label8: TLabel - Left = 75 - Top = 56 - Width = 50 - Height = 13 - Caption = 'Grid colors' - end - object Label10: TLabel - Left = 75 - Top = 96 - Width = 36 - Height = 13 - Caption = 'Helpers' - end object Label1: TLabel Left = 8 - Top = 136 + Top = 56 Width = 83 Height = 13 Caption = 'Variation preview' end - object pnlBackColor: TPanel - Left = 8 - Top = 72 - Width = 62 - Height = 17 - Cursor = crHandPoint - BevelOuter = bvLowered - Color = clBlack - TabOrder = 0 - OnClick = pnlBackColorClick - end object chkUseXFormColor: TCheckBox Left = 8 Top = 16 Width = 129 Height = 17 Caption = 'Use transform color' - TabOrder = 1 + TabOrder = 0 OnClick = chkUseXFormColorClick end object chkHelpers: TCheckBox @@ -1434,56 +1563,12 @@ object EditForm: TEditForm Caption = 'Helper lines' Checked = True State = cbChecked - TabOrder = 2 + TabOrder = 1 OnClick = chkHelpersClick end - object pnlReference: TPanel - Left = 8 - Top = 112 - Width = 62 - Height = 17 - Cursor = crHandPoint - BevelOuter = bvLowered - Color = clGray - TabOrder = 3 - OnClick = pnlReferenceClick - end - object pnlGridColor1: TPanel - Left = 75 - Top = 72 - Width = 29 - Height = 17 - Cursor = crHandPoint - BevelOuter = bvLowered - Color = clBlack - TabOrder = 4 - OnClick = pnlGridColor1Click - end - object pnlGridColor2: TPanel - Left = 108 - Top = 72 - Width = 29 - Height = 17 - Cursor = crHandPoint - BevelOuter = bvLowered - Color = clBlack - TabOrder = 5 - OnClick = pnlGridColor2Click - end - object pnlHelpersColor: TPanel - Left = 75 - Top = 112 - Width = 62 - Height = 17 - Cursor = crHandPoint - BevelOuter = bvLowered - Color = clGray - TabOrder = 6 - OnClick = pnlHelpersColorClick - end object trkVarPreviewDensity: TTrackBar Left = 8 - Top = 184 + Top = 104 Width = 65 Height = 25 Max = 5 @@ -1492,14 +1577,14 @@ object EditForm: TEditForm PageSize = 1 Position = 2 ShowHint = True - TabOrder = 7 + TabOrder = 2 TabStop = False ThumbLength = 15 OnChange = trkVarPreviewDensityChange end object trkVarPreviewRange: TTrackBar Left = 8 - Top = 152 + Top = 72 Width = 129 Height = 25 Min = 1 @@ -1507,14 +1592,14 @@ object EditForm: TEditForm PageSize = 1 Position = 2 ShowHint = True - TabOrder = 8 + TabOrder = 3 TabStop = False ThumbLength = 15 OnChange = trkVarPreviewRangeChange end object trkVarPreviewDepth: TTrackBar Left = 72 - Top = 184 + Top = 104 Width = 65 Height = 25 Max = 5 @@ -1523,7 +1608,7 @@ object EditForm: TEditForm PageSize = 1 Position = 1 ShowHint = True - TabOrder = 9 + TabOrder = 4 TabStop = False ThumbLength = 15 OnChange = trkVarPreviewDepthChange diff --git a/2.10/Source/Editor.pas b/2.10/Source/Editor.pas index 217ab36..a8267e9 100644 --- a/2.10/Source/Editor.pas +++ b/2.10/Source/Editor.pas @@ -66,7 +66,6 @@ type TriangleTab: TTabSheet; tabXForm: TTabSheet; Label6: TLabel; - Label29: TLabel; txtA: TEdit; txtB: TEdit; txtC: TEdit; @@ -74,7 +73,6 @@ type txtE: TEdit; txtF: TEdit; txtP: TEdit; - txtSymmetry: TEdit; tabVariations: TTabSheet; VEVars: TValueListEditor; tabColors: TTabSheet; @@ -83,12 +81,8 @@ type pnlXFormColor: TPanel; txtXFormColor: TEdit; GroupBox2: TGroupBox; - Label20: TLabel; - Label21: TLabel; - pnlBackColor: TPanel; chkUseXFormColor: TCheckBox; chkHelpers: TCheckBox; - pnlReference: TPanel; TriangleScrollBox: TScrollBox; TrianglePanel: TPanel; txtCy: TEdit; @@ -97,9 +91,9 @@ type txtBx: TEdit; txtAy: TEdit; txtAx: TEdit; - Label9: TLabel; - Label7: TLabel; - Label11: TLabel; + LabelB: TLabel; + LabelA: TLabel; + LabelC: TLabel; btTrgRotateRight: TSpeedButton; btTrgRotateLeft: TSpeedButton; btTrgMoveUp: TSpeedButton; @@ -108,7 +102,6 @@ type btTrgMoveDown: TSpeedButton; btTrgScaleUp: TSpeedButton; btTrgScaleDown: TSpeedButton; - rgPivot: TRadioGroup; btTrgRotateRight90: TSpeedButton; btTrgRotateLeft90: TSpeedButton; txtTrgMoveValue: TComboBox; @@ -130,35 +123,47 @@ type tbScale: TToolButton; tbFlipHorz: TToolButton; tbFlipVert: TToolButton; - tbFlipAllHorz: TToolButton; - tbFlipAllVert: TToolButton; tbSelect: TToolButton; btTrgMoveLU: TSpeedButton; btTrgMoveLD: TSpeedButton; btTrgMoveRU: TSpeedButton; btTrgMoveRD: TSpeedButton; EditorTB: TImageList; - Label8: TLabel; - pnlGridColor1: TPanel; - pnlGridColor2: TPanel; TabSheet4: TTabSheet; vleVariables: TValueListEditor; tbResetAll: TToolButton; - Label10: TLabel; - pnlHelpersColor: TPanel; btnResetCoefs: TSpeedButton; btnXcoefs: TSpeedButton; btnYcoefs: TSpeedButton; btnOcoefs: TSpeedButton; btnCoefsRect: TSpeedButton; btnCoefsPolar: TSpeedButton; - chkPreserve: TCheckBox; Label1: TLabel; trkVarPreviewDensity: TTrackBar; trkVarPreviewRange: TTrackBar; ToolButton2: TToolButton; tbVarPreview: TToolButton; trkVarPreviewDepth: TTrackBar; + Label29: TLabel; + chkPreserve: TCheckBox; + btnXpost: TSpeedButton; + btnYpost: TSpeedButton; + btnOpost: TSpeedButton; + txtPost00: TEdit; + txtPost01: TEdit; + txtPost10: TEdit; + txtPost11: TEdit; + txtPost20: TEdit; + txtPost21: TEdit; + btnResetPostXForm: TSpeedButton; + btnSwapXforms: TSpeedButton; + txtSymmetry: TComboBox; + GroupBox3: TGroupBox; + editPivotY: TEdit; + editPivotX: TEdit; + btnResetPivot: TSpeedButton; + btnPickPivot: TSpeedButton; + btnPivotMode: TSpeedButton; procedure ValidateVariable; procedure vleVariablesValidate(Sender: TObject; ACol, ARow: Integer; const KeyName, KeyValue: string); procedure vleVariablesKeyPress(Sender: TObject; var Key: Char); @@ -181,6 +186,7 @@ type Shift: TShiftState); procedure TriangleViewExit(Sender: TObject); procedure TriangleViewMouseLeave(Sender: TObject); + procedure TriangleViewInvalidate(Sender: TObject); procedure FormShow(Sender: TObject); procedure mnuDeleteClick(Sender: TObject); @@ -214,8 +220,6 @@ type procedure scrlXFormColorChange(Sender: TObject); procedure chkUseXFormColorClick(Sender: TObject); procedure chkHelpersClick(Sender: TObject); - procedure pnlBackColorClick(Sender: TObject); - procedure pnlReferenceClick(Sender: TObject); procedure txtXFormColorExit(Sender: TObject); procedure txtXFormColorKeyPress(Sender: TObject; var Key: Char); procedure txtSymmetryExit(Sender: TObject); @@ -239,10 +243,7 @@ type procedure splitterMoved(Sender: TObject); procedure tbSelectClick(Sender: TObject); procedure EditKeyPress(Sender: TObject; var Key: Char); - procedure rgPivotClicked(Sender: TObject); procedure tbEditModeClick(Sender: TObject); - procedure pnlGridColor1Click(Sender: TObject); - procedure pnlGridColor2Click(Sender: TObject); procedure ValidateVariation; // procedure ValidateValue(Sender: TObject); @@ -257,28 +258,18 @@ type procedure VEVarsMouseUp(Sender: TObject; Button: TMouseButton; Shift: TShiftState; X, Y: Integer); procedure VEVarsDblClick(Sender: TObject); -// procedure VEVarsDrawCell(Sender: TObject; ACol, ARow: Integer; -// Rect: TRect; State: TGridDrawState); procedure cbTransformsDrawItem(Control: TWinControl; Index: Integer; Rect: TRect; State: TOwnerDrawState); procedure tbFullViewClick(Sender: TObject); -{ - procedure ColorImageMouseDown(Sender: TObject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); - procedure ColorImageMouseMove(Sender: TObject; Shift: TShiftState; X, - Y: Integer); - procedure ColorImageMouseUp(Sender: TObject; Button: TMouseButton; - Shift: TShiftState; X, Y: Integer); -} + procedure EditKeyDown(Sender: TObject; var Key: Word; Shift: TShiftState); procedure txtValidateValue(Sender: TObject); procedure txtValKeyPress(Sender: TObject; var Key: Char); procedure mnuResetClick(Sender: TObject); procedure mnuResetAllClick(Sender: TObject); - procedure pnlHelpersColorClick(Sender: TObject); procedure btnXcoefsClick(Sender: TObject); procedure btnYcoefsClick(Sender: TObject); procedure btnOcoefsClick(Sender: TObject); @@ -287,6 +278,18 @@ type procedure trkVarPreviewRangeChange(Sender: TObject); procedure trkVarPreviewDensityChange(Sender: TObject); procedure trkVarPreviewDepthChange(Sender: TObject); + procedure btnXpostClick(Sender: TObject); + procedure btnYpostClick(Sender: TObject); + procedure btnOpostClick(Sender: TObject); + procedure PostCoefValidate(Sender: TObject); + procedure PostCoefKeypress(Sender: TObject; var Key: Char); + procedure btnResetPostXFormClick(Sender: TObject); + procedure btnSwapXformsClick(Sender: TObject); + procedure btnPivotModeClick(Sender: TObject); + procedure PivotValidate(Sender: TObject); + procedure PivotKeyPress(Sender: TObject; var Key: Char); + procedure btnResetPivotClick(Sender: TObject); + procedure btnPickPivotClick(Sender: TObject); private TriangleView: TCustomDrawControl; @@ -296,7 +299,7 @@ type // --Z-- viewDragMode, viewDragged: boolean; - editMode, oldMode: (modeNone, modeMove, modeRotate, modeScale); + editMode, oldMode: (modeNone, modeMove, modeRotate, modeScale, modePick); modeKey: word; key_handled: boolean; @@ -326,17 +329,19 @@ type HasChanged: boolean; oldx, oldy, olddist: double; - Pivot: TSPoint; + Pivot, LocalPivot, WorldPivot: TSPoint; + PivotMode: (pivotLocal, pivotWorld); VarsCache: array[0..64] of double; // hack: to prevent slow valuelist redraw colorDrag, colorChanged: boolean; colorDragX, colorOldX: integer; +(* { Options } UseFlameBackground, UseTransformColors: boolean; BackGroundColor, ReferenceTrianglecolor: integer; GridColor1, GridColor2, HelpersColor: integer; - +*) procedure UpdateFlameX; procedure UpdateFlame(DrawMain: boolean); procedure DeleteTriangle(t: integer); @@ -584,7 +589,7 @@ begin PreviewImage.Top := 1; PreviewImage.Left := (pw - PreviewImage.Width) div 2; end; - AdjustScale(cp, PreviewImage.Width, PreviewImage.Height); + cp.AdjustScale(PreviewImage.Width, PreviewImage.Height); DrawPreview; end; @@ -710,7 +715,6 @@ begin with cp.xform[SelectedTriangle] do begin - // OMG. and now these coefs are stored with inverse sign? :-\ if btnCoefsRect.Down then begin txtA.text := Format('%.6g', [ c[0][0]]); txtB.text := Format('%.6g', [-c[0][1]]); @@ -718,6 +722,12 @@ begin txtD.text := Format('%.6g', [ c[1][1]]); txtE.text := Format('%.6g', [ c[2][0]]); txtF.text := Format('%.6g', [-c[2][1]]); + txtPost00.text := Format('%.6g', [ p[0][0]]); + txtPost01.text := Format('%.6g', [-p[0][1]]); + txtPost10.text := Format('%.6g', [-p[1][0]]); + txtPost11.text := Format('%.6g', [ p[1][1]]); + txtPost20.text := Format('%.6g', [ p[2][0]]); + txtPost21.text := Format('%.6g', [-p[2][1]]); end else begin txtA.text := Format('%.6g', [Hypot(c[0][0], c[0][1])]); @@ -726,6 +736,12 @@ begin txtD.text := Format('%.6g', [arctan2(c[1][1], -c[1][0])*180/PI]); txtE.text := Format('%.6g', [Hypot(c[2][0], c[2][1])]); txtF.text := Format('%.6g', [arctan2(-c[2][1], c[2][0])*180/PI]); + txtPost00.text := Format('%.6g', [Hypot(p[0][0], p[0][1])]); + txtPost01.text := Format('%.6g', [arctan2(-p[0][1], p[0][0])*180/PI]); + txtPost10.text := Format('%.6g', [Hypot(p[1][0], p[1][1])]); + txtPost11.text := Format('%.6g', [arctan2(p[1][1], -p[1][0])*180/PI]); + txtPost20.text := Format('%.6g', [Hypot(p[2][0], p[2][1])]); + txtPost21.text := Format('%.6g', [arctan2(-p[2][1], p[2][0])*180/PI]); end; txtP.text := Format('%.6g', [density]); @@ -753,6 +769,15 @@ begin end; end; + if PivotMode = pivotLocal then begin + editPivotX.Text := Format('%.6g', [LocalPivot.x]); + editPivotY.Text := Format('%.6g', [LocalPivot.y]); + end + else begin + editPivotX.Text := Format('%.6g', [WorldPivot.x]); + editPivotY.Text := Format('%.6g', [WorldPivot.y]); + end; + PageControl.Refresh; end; @@ -818,7 +843,7 @@ begin end; cp.GetFromTriangles(MainTriangles, Transforms); -// if not chkPreserve.checked then ComputeWeights(cp, MainTriangles, transforms); + if not chkPreserve.checked then cp.ComputeWeights(MainTriangles, transforms); DrawPreview; ShowSelectedInfo; TriangleView.Refresh;; @@ -871,11 +896,7 @@ begin begin { copy higher transforms down } MainTriangles[i] := MainTriangles[i + 1]; - cp.xform[i].density := cp.xform[i + 1].density; - cp.xform[i].color := cp.xform[i + 1].color; - cp.xform[i].symmetry := cp.xform[i + 1].symmetry; - for j := 0 to NRVAR - 1 do - cp.xform[i].vars[j] := cp.xform[i + 1].vars[j]; + cp.xform[i].Assign(cp.xform[i + 1]); end; Transforms := Transforms - 1; cp.xform[transforms].density := 0; @@ -968,6 +989,8 @@ var gridX1, gridX2, gridY1, gridY2, gi, gstep: double; gp: TRoundToRange; + + tps: TPenStyle; label DrawCorner; begin assert(SelectedTriangle >= 0); @@ -985,7 +1008,7 @@ begin try with Bitmap.Canvas do begin - brush.Color := pnlBackColor.Color; + brush.Color := EditorBkgColor; //pnlBackColor.Color; FillRect(Rect(0, 0, Width, Height)); Pen.Style := psSolid; @@ -1032,30 +1055,60 @@ begin {Reference Triangle} Pen.Style := psDot; - Pen.color := pnlReference.Color; + Pen.color := ReferenceTriangleColor; //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; + brush.Color := EditorBkgColor; //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(c.x-9, c.y-12, 'Y'); + TextOut(b.x-8, b.y+1, 'O'); + TextOut(a.x+2, a.y+1, 'X'); Pen.Style := psSolid; {Transforms} for i := 0 to Transforms - 1 do begin + if i <> SelectedTriangle then Pen.Style := psDot; + +with cp.xform[i] do +if (p[0,0]<>1) or (p[0,1]<>0) or(p[1,0]<>0) or (p[1,1]<>1) or (p[2,0]<>0) or (p[2,1]<>0) then +begin + Pen.Color := GetTriangleColor(i) shr 1 and $7f7f7f; + //Pen.Mode := pmMerge; + a:=toscreen(p[0,0] - p[1,0] + p[2,0], -p[0,1] + p[1,1] - p[2,1]); + moveto(a.x, a.y); + b:=toscreen(p[0,0] + p[1,0] + p[2,0], -p[0,1] - p[1,1] - p[2,1]); + lineto(b.x, b.y); + b:=toscreen(-p[0,0] + p[1,0] + p[2,0], p[0,1] - p[1,1] - p[2,1]); + lineto(b.x, b.y); + b:=toscreen(-p[0,0] - p[1,0] + p[2,0], p[0,1] + p[1,1] - p[2,1]); + lineto(b.x, b.y); + lineto(a.x, a.y); + + + tps := Pen.Style; + Pen.Style := psDot; + a:=toscreen(p[1,0] + p[2,0], -p[1,1] - p[2,1]); + moveto(a.x, a.y); + a:=toscreen(-p[1,0] + p[2,0], p[1,1] - p[2,1]); + lineto(a.x, a.y); + + a:=toscreen(p[0,0] + p[2,0], -p[0,1] - p[2,1]); + lineto(a.x, a.y); + a:=toscreen(-p[0,0] + p[2,0], p[0,1] - p[2,1]); + lineto(a.x, a.y); + Pen.Style := tps; +end; + + Pen.Color := GetTriangleColor(i); a := ToScreen(MainTriangles[i].x[0], MainTriangles[i].y[0]); b := ToScreen(MainTriangles[i].x[1], MainTriangles[i].y[1]); c := ToScreen(MainTriangles[i].x[2], MainTriangles[i].y[2]); - - Pen.Color := GetTriangleColor(i); - if i <> SelectedTriangle then Pen.Style := psDot; Polyline([a, b, c, a]); Pen.Style := psSolid; @@ -1064,9 +1117,9 @@ begin Ellipse(c.x - 4, c.y - 4, c.x + 4, c.y + 4); Font.color := Pen.color; - TextOut(c.x+2, c.y+1, 'C'); - TextOut(b.x+2, b.y+1, 'B'); - TextOut(a.x+2, a.y+1, 'A'); + TextOut(c.x+2, c.y+1, 'Y'); + TextOut(b.x+2, b.y+1, 'O'); + TextOut(a.x+2, a.y+1, 'X'); end; if tbVarPreview.Down then @@ -1084,7 +1137,7 @@ begin tx := ax / d1; ty := ay / d1; for i := trkVarPreviewDepth.position downto 1 do - cp.xform[SelectedTriangle].PreviewPoint(tx, ty); + cp.xform[SelectedTriangle].NextPointXY(tx, ty); a := toscreen(tx, -ty); Pixels[a.x, a.y] := tc; except @@ -1234,14 +1287,14 @@ begin end else if (mouseOverTriangle>=0) and (mouseOverCorner >= 0) then // highlight corner under cursor begin - brush.Color:=clSilver; -{ +// brush.Color:=clSilver; + case mouseOverCorner of 0: brush.Color:=clRed; 2: brush.Color:=clGreen; - else brush.Color:=clYellow; + else brush.Color:=clSilver; end; -} + a := ToScreen(MainTriangles[mouseOverTriangle].x[mouseOverCorner], MainTriangles[mouseOverTriangle].y[mouseOverCorner]); Ellipse(a.x - 4, a.y - 4, a.x + 4, a.y + 4); @@ -1326,7 +1379,7 @@ begin TriangleView.OnKeyDown := TriangleViewKeyDown; TriangleView.OnKeyUp := TriangleViewKeyUp; - TriangleView.OnEnter := rgPivotClicked; // hack: it's only Invalidate() in there :) + TriangleView.OnEnter := TriangleViewInvalidate; TriangleView.OnExit := TriangleViewExit; TriangleView.OnMouseLeave := TriangleViewmouseLeave; // @@ -1422,10 +1475,13 @@ begin // -- from MouseDown -- for highlighting: // TODO: optimize... - if (j = 1) and ((rgPivot.ItemIndex = 1) or (rgPivot.ItemIndex = 4)) then + if (j = 1) then //and ((rgPivot.ItemIndex = 1) or (rgPivot.ItemIndex = 4)) then begin - Pivot.x := 0; - Pivot.y := 0; + if PivotMode = pivotLocal then begin + Pivot.x := 0; + Pivot.y := 0; + end + else Pivot := GetPivot; LocalAxisLocked := true; end @@ -1435,7 +1491,7 @@ begin end; oldx := MainTriangles[mouseOverTriangle].x[j] - Pivot.X; oldy := MainTriangles[mouseOverTriangle].y[j] - Pivot.Y; - olddist := Hypot(oldx, oldy); //sqrt(oldx*oldx + oldy*oldy); + olddist := Hypot(oldx, oldy); // -- goto FoundCorner; @@ -1495,10 +1551,10 @@ Skip1: if LocalAxisLocked then with MainTriangles[SelectedTriangle] do begin assert(SelectedCorner = 1); - x[0] := OldTriangle.x[0] + vx - OldTriangle.x[1]; - y[0] := OldTriangle.y[0] + vy - OldTriangle.y[1]; - x[2] := OldTriangle.x[2] + vx - OldTriangle.x[1]; - y[2] := OldTriangle.y[2] + vy - OldTriangle.y[1]; + x[0] := OldTriangle.x[0] + Pivot.X+vx - OldTriangle.x[1]; + y[0] := OldTriangle.y[0] + Pivot.Y+vy - OldTriangle.y[1]; + x[2] := OldTriangle.x[2] + Pivot.X+vx - OldTriangle.x[1]; + y[2] := OldTriangle.y[2] + Pivot.Y+vy - OldTriangle.y[1]; end; MainTriangles[SelectedTriangle].x[SelectedCorner] := Pivot.X+vx; MainTriangles[SelectedTriangle].y[SelectedCorner] := Pivot.Y+vy; @@ -1535,10 +1591,10 @@ Skip1: if LocalAxisLocked then with MainTriangles[SelectedTriangle] do begin assert(SelectedCorner = 1); - x[0] := OldTriangle.x[0] + vx - OldTriangle.x[1]; - y[0] := OldTriangle.y[0] + vy - OldTriangle.y[1]; - x[2] := OldTriangle.x[2] + vx - OldTriangle.x[1]; - y[2] := OldTriangle.y[2] + vy - OldTriangle.y[1]; + x[0] := OldTriangle.x[0] + Pivot.X+vx - OldTriangle.x[1]; + y[0] := OldTriangle.y[0] + Pivot.Y+vy - OldTriangle.y[1]; + x[2] := OldTriangle.x[2] + Pivot.X+vx - OldTriangle.x[1]; + y[2] := OldTriangle.y[2] + Pivot.Y+vy - OldTriangle.y[1]; end; MainTriangles[SelectedTriangle].x[SelectedCorner] := Pivot.X + vx; MainTriangles[SelectedTriangle].y[SelectedCorner] := Pivot.Y + vy; @@ -1678,6 +1734,28 @@ begin Scale(fx, fy, x, y); + if editMode = modePick then + begin + if PivotMode = pivotLocal then + with MainTriangles[SelectedTriangle] do begin + LocalPivot.x := + ((fx - x[1]) - (x[2]-x[1])/(y[2]-y[1])*(fy - y[1]))/ + ((x[0]-x[1]) - (x[2]-x[1])/(y[2]-y[1])*(y[0]-y[1])); + LocalPivot.y := + ((fy - y[1]) - (y[0]-y[1])*LocalPivot.x)/(y[2]-y[1]); + end + else begin + WorldPivot.x := fx; + WorldPivot.y := fy; + end; + editMode := oldMode; + oldMode := modeNone; + btnPickPivot.Down := false; + ShowSelectedInfo; + TriangleView.Invalidate; + exit; + end; + if Button = mbLeft then begin Shift := Shift - [ssLeft]; @@ -1703,10 +1781,13 @@ begin SelectedCorner := j; // Pivot := GetPivot; - if (j = 1) and ((rgPivot.ItemIndex = 1) or (rgPivot.ItemIndex = 4)) then + if (j = 1) then //and ((rgPivot.ItemIndex = 1) or (rgPivot.ItemIndex = 4)) then begin - Pivot.x := 0; - Pivot.y := 0; + if PivotMode = pivotLocal then begin + Pivot.x := 0; + Pivot.y := 0; + end + else Pivot := GetPivot; LocalAxisLocked := true; end @@ -1750,7 +1831,7 @@ begin TriangleView.Invalidate; exit; end - else if (Button = mbRight) and + else if (Button = mbRight) and not (TriangleCaught or CornerCaught) then // graph panning begin SetCaptureControl(TriangleView); @@ -1818,6 +1899,7 @@ begin begin UseTransformColors := False; end; +(* if Registry.ValueExists('UseFlameBackground') then begin UseFlameBackground := Registry.ReadBool('UseFlameBackground'); @@ -1846,6 +1928,7 @@ begin ReferenceTriangleColor := Registry.ReadInteger('ReferenceTriangleColor') else ReferenceTriangleColor := $7f7f7f; +*) if Registry.ValueExists('ResetLocation') then mnuResetLoc.checked := Registry.ReadBool('ResetLocation') else mnuResetLoc.checked := true; @@ -1864,11 +1947,11 @@ begin else begin UseTransformColors := False; UseFlameBackground := False; - BackgroundColor := $000000; - GridColor1 := $444444; - GridColor2 := $333333; - HelpersColor := $808080; - ReferenceTriangleColor := integer(clGray); +// BackgroundColor := $000000; +// GridColor1 := $444444; +// GridColor2 := $333333; +// HelpersColor := $808080; +// ReferenceTriangleColor := integer(clGray); mnuResetLoc.checked := true; //tbResetLoc.Down := true; end; @@ -1878,12 +1961,13 @@ begin end; chkUseXFormColor.checked := UseTransformColors; // chkFlameBack.checked := UseFlameBackground; - pnlBackColor.Color := TColor(BackgroundColor); +{ GrphPnl.Color := TColor(BackgroundColor); + pnlBackColor.Color := TColor(EditorBkgColor); pnlGridColor1.Color := GridColor1; pnlGridColor2.Color := GridColor2; pnlReference.color := TColor(ReferenceTriangleColor); - +} UpdateDisplay; end; @@ -1920,9 +2004,7 @@ begin begin MainForm.UpdateUndo; MainTriangles[Transforms] := MainTriangles[SelectedTriangle]; - cp.xform[Transforms].density := cp.xform[SelectedTriangle].density; - for i := 0 to NRVAR - 1 do - cp.xform[Transforms].vars[i] := cp.xform[SelectedTriangle].vars[i]; + cp.xform[Transforms].Assign(cp.xform[SelectedTriangle]); SelectedTriangle := Transforms; Inc(Transforms); cbTransforms.clear; @@ -1966,8 +2048,8 @@ begin Val := Format('%.6f', [MainTriangles[SelectedTriangle].x[2]]) else if Sender = txtCy then Val := Format('%.6f', [MainTriangles[SelectedTriangle].y[2]]) - else if Sender = txtP then ; - val := Format('%.6f', [cp.xform[SelectedTriangle].density]); + else if Sender = txtP then + val := Format('%.6f', [cp.xform[SelectedTriangle].density]); OldText := Val; { Test that it's a valid floating point number } try @@ -2026,8 +2108,8 @@ begin Val := Format('%.6f', [MainTriangles[SelectedTriangle].x[2]]) else if Sender = txtCy then Val := Format('%.6f', [MainTriangles[SelectedTriangle].y[2]]) - else if Sender = txtP then ; - val := Format('%.6f', [cp.xform[SelectedTriangle].density]); + else if Sender = txtP then + val := Format('%.6f', [cp.xform[SelectedTriangle].density]); OldText := Val; { Stop the beep } Key := #0; @@ -2151,13 +2233,15 @@ begin if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Editor', True) then begin { Options } +// Registry.WriteBool('UseFlameBackground', UseFlameBackground); +{ Registry.WriteBool('UseTransformColors', UseTransformColors); - Registry.WriteBool('UseFlameBackground', UseFlameBackground); Registry.WriteInteger('BackgroundColor', BackgroundColor); Registry.WriteInteger('GridColor1', GridColor1); Registry.WriteInteger('GridColor2', GridColor2); Registry.WriteInteger('HelpersColor', HelpersColor); Registry.WriteInteger('ReferenceTriangleColor', ReferenceTriangleColor); +} Registry.WriteBool('ResetLocation', mnuResetLoc.checked); Registry.WriteBool('VariationPreview', tbVarPreview.Down); Registry.WriteInteger('VariationPreviewRange', trkVarPreviewRange.Position); @@ -2231,7 +2315,7 @@ begin cp.width := MainCp.width; cp.height := MainCp.height; cp.pixels_per_unit := MainCp.pixels_per_unit; - AdjustScale(cp, PreviewImage.width, PreviewImage.Height); + cp.AdjustScale(PreviewImage.width, PreviewImage.Height); cp.zoom := MainCp.zoom; cp.center[0] := MainCp.center[0]; cp.center[1] := MainCp.center[1]; @@ -2248,6 +2332,7 @@ begin begin MainTriangles[i] := FlipTriangleVertical(MainTriangles[i]); end; + //cp.TrianglesFromCP(MainTriangles); AutoZoom; UpdateFlame(True); end; @@ -2261,6 +2346,7 @@ begin begin MainTriangles[i] := FlipTriangleHorizontal(MainTriangles[i]); end; + //cp.TrianglesFromCP(MainTriangles); AutoZoom; UpdateFlame(True); end; @@ -2368,18 +2454,12 @@ begin begin if btnCoefsRect.Down = true then begin - if Sender = txtA then - cp.xform[SelectedTriangle].c[0][0] := NewVal - else if Sender = txtB then - cp.xform[SelectedTriangle].c[0][1] := -NewVal - else if Sender = txtC then - cp.xform[SelectedTriangle].c[1][0] := -NewVal - else if Sender = txtD then - cp.xform[SelectedTriangle].c[1][1] := NewVal - else if Sender = txtE then - cp.xform[SelectedTriangle].c[2][0] := NewVal - else if Sender = txtF then - cp.xform[SelectedTriangle].c[2][1] := -NewVal; + if Sender = txtA then c[0][0] := NewVal + else if Sender = txtB then c[0][1] := -NewVal + else if Sender = txtC then c[1][0] := -NewVal + else if Sender = txtD then c[1][1] := NewVal + else if Sender = txtE then c[2][0] := NewVal + else if Sender = txtF then c[2][1] := -NewVal; end else begin if (Sender = txtA) or (Sender = txtB) then begin @@ -2453,9 +2533,10 @@ begin TriangleView.Invalidate; end; +(* procedure TEditForm.pnlBackColorClick(Sender: TObject); begin - AdjustForm.ColorDialog.Color := pnlBackColor.Color; + AdjustForm.ColorDialog.Color := EditorBkgColor; //pnlBackColor.Color; if AdjustForm.ColorDialog.Execute then begin pnlBackColor.Color := AdjustForm.ColorDialog.Color; @@ -2508,6 +2589,7 @@ begin TriangleView.Invalidate; end; end; +*) procedure TEditForm.txtXFormColorExit(Sender: TObject); var @@ -2825,7 +2907,7 @@ begin VEVars.Values[VarNames(varDragIndex)] := '0'; end else begin - v := 0; // <<<----- hey!!! why there is 'var' in SETvariable??? + v := 0; // hmm cp.xform[SelectedTriangle].SetVariable(vleVariables.Keys[varDragIndex+1], v); vleVariables.Values[vleVariables.Keys[varDragIndex+1]] := '0'; end; @@ -2842,23 +2924,14 @@ end; function TEditForm.GetPivot(n: integer): TSPoint; begin - case (rgPivot.ItemIndex) of - 0: begin - Result.x:=MainTriangles[n].x[0]; - Result.y:=MainTriangles[n].y[0]; - end; - 1: begin - Result.x:=MainTriangles[n].x[1]; - Result.y:=MainTriangles[n].y[1]; - end; - 2: begin - Result.x:=MainTriangles[n].x[2]; - Result.y:=MainTriangles[n].y[2]; - end; - 3: Result:=Centroid(MainTriangles[n]); - else - Result.x:=0; - Result.y:=0; + if PivotMode = pivotLocal then + with MainTriangles[n] do begin + Result.x := x[1] + (x[0] - x[1])*LocalPivot.x + (x[2] - x[1])*LocalPivot.y; + Result.y := y[1] + (y[0] - y[1])*LocalPivot.x + (y[2] - y[1])*LocalPivot.y; + end + else begin + Result.x := WorldPivot.x; + Result.y := WorldPivot.y; end; end; @@ -3172,9 +3245,10 @@ begin TriangleView.Invalidate; ShowSelectedInfo; end; -{ // these keys are not so good, must think about it... - VK_SPACE: EditForm.tbSelectClick(Sender); + VK_SPACE: btnPivotModeClick(Sender); + +{ // these keys are not so good, must think about it... Ord('Q'): EditForm.tbEditModeClick(tbMove); Ord('W'): EditForm.tbEditModeClick(tbRotate); @@ -3184,12 +3258,6 @@ begin Ord('S'): PageControl.TabIndex := 1; Ord('D'): PageControl.TabIndex := 2; Ord('F'): PageControl.TabIndex := 3; - - Ord('Z'): EditForm.rgPivot.ItemIndex:=0; - Ord('X'): EditForm.rgPivot.ItemIndex:=1; - Ord('C'): EditForm.rgPivot.ItemIndex:=2; - Ord('V'): EditForm.rgPivot.ItemIndex:=3; - Ord('B'): EditForm.rgPivot.ItemIndex:=4; } else key_handled := false; @@ -3239,7 +3307,7 @@ begin Handled := true; end; -procedure TEditForm.rgPivotClicked(Sender: TObject); +procedure TEditForm.TriangleViewInvalidate(Sender: TObject); begin TriangleView.Invalidate; end; @@ -3275,65 +3343,6 @@ begin MainForm.mnuFullScreenClick(Sender); end; -(* -// --Z-- // transform color scroller - TODO - -procedure TEditForm.ColorImageMouseDown(Sender: TObject; - Button: TMouseButton; Shift: TShiftState; X, Y: Integer); -begin - if Button = mbLeft then - begin - SetCaptureControl(ColorImage); - colorDragX:=0; - colorOldX:=x; - colorDrag:=true; - colorChanged:=false; - end; -end; - -procedure TEditForm.ColorImageMouseMove(Sender: TObject; - Shift: TShiftState; X, Y: Integer); -var - i, offset: integer; -begin - if colorDrag and (OldX<>x) then - begin -{ oldX:=x; - offset := ( ((x - colorDragX) shl 8) div ColorImage.Width ) mod 256; - colorChanged := true; - - 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]; - end; - - cp.CmapIndex := cmbPalette.ItemIndex; - cp.cmap := Palette; - - colorImage.Refresh; -} end; -end; - -procedure TEditForm.ColorImageMouseUp(Sender: TObject; - Button: TMouseButton; Shift: TShiftState; X, Y: Integer); -begin - if (Button = mbLeft) and colorDrag then - begin - colorDrag := false; - - if colorChanged then begin - // MainForm.UpdateUndo; - // cp.xxx := xxx; - // MainCP.copy(cp); - // UpdateXXXX; - SetCaptureControl(nil); - end; - end; -end; -*) - //-- Variable List ------------------------------------------------------------- // --Z-- hmmmm! @@ -3423,13 +3432,31 @@ begin Transforms := 2; SelectedTriangle := 1; MainTriangles[0] := MainTriangles[-1]; - cp.xform[0].density := 0.5; - cp.xform[0].color := 0; - cp.xform[0].vars[0] := 1; + with cp.xform[0] do begin + density := 0.5; + color := 0; + symmetry := 0; + vars[0] := 1; + p[0, 0] := 1; + p[0, 1] := 0; + p[1, 0] := 0; + p[1, 1] := 1; + p[2, 0] := 0; + p[2, 1] := 0; + end; MainTriangles[1] := MainTriangles[-1]; - cp.xform[1].density := 0.5; - cp.xform[0].color := 1; - cp.xform[1].vars[0] := 1; + with cp.xform[1] do begin + density := 0.5; + color := 1; + symmetry := 0; + vars[0] := 1; + p[0, 0] := 1; + p[0, 1] := 0; + p[1, 0] := 0; + p[1, 1] := 1; + p[2, 0] := 0; + p[2, 1] := 0; + end; for i := 1 to NRVAR - 1 do begin cp.xform[0].vars[i] := 0; @@ -3511,5 +3538,238 @@ begin TriangleView.Invalidate; end; +procedure TEditForm.btnXpostClick(Sender: TObject); +begin + with cp.xform[SelectedTriangle] do + begin + if (p[0][0] = 1) and (p[0][1] = 0) then exit; + + MainForm.UpdateUndo; + p[0][0] := 1; + p[0][1] := 0; + end; + UpdateFlame(True); +end; + +procedure TEditForm.btnYpostClick(Sender: TObject); +begin + if (cp.xform[SelectedTriangle].p[1][0] = 0) and + (cp.xform[SelectedTriangle].p[1][1] = 1) then exit; + + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].p[1][0] := 0; + cp.xform[SelectedTriangle].p[1][1] := 1; + UpdateFlame(True); +end; + +procedure TEditForm.btnOpostClick(Sender: TObject); +begin + if (cp.xform[SelectedTriangle].p[2][0] = 0) and + (cp.xform[SelectedTriangle].p[2][1] = 0) then exit; + + MainForm.UpdateUndo; + cp.xform[SelectedTriangle].p[2][0] := 0; + cp.xform[SelectedTriangle].p[2][1] := 0; + UpdateFlame(True); +end; + +// --Z-- copying functions is dumb... I am so lazy :-( + +procedure TEditForm.PostCoefKeypress(Sender: TObject; var Key: Char); +begin + if key <> #13 then exit; + key := #0; + PostCoefValidate(Sender); +end; + +procedure TEditForm.PostCoefValidate(Sender: TObject); +var + NewVal: double; + x, y, r, a: double; // dumb... must optimize +begin + try + NewVal := Round6(StrToFloat(TEdit(Sender).Text)); + except on Exception do + begin + ShowSelectedInfo; + exit; + end; + end; + + MainForm.UpdateUndo; // TODO - prevent unnecessary UpdateUndo... + with cp.xform[SelectedTriangle] do + begin + if btnCoefsRect.Down = true then + begin + if Sender = txtPost00 then p[0][0] := NewVal + else if Sender = txtPost01 then p[0][1] := -NewVal + else if Sender = txtPost10 then p[1][0] := -NewVal + else if Sender = txtPost11 then p[1][1] := NewVal + else if Sender = txtPost20 then p[2][0] := NewVal + else if Sender = txtPost21 then p[2][1] := -NewVal; + end + else begin + if (Sender = txtPost00) or (Sender = txtPost01) then begin + x := p[0][0]; + y := -p[0][1]; + end else + if (Sender = txtPost10) or (Sender = txtPost11) then begin + x := -p[1][0]; + y := p[1][1]; + end else + begin + x := p[2][0]; + y := -p[2][1]; + end; + r := Hypot(x, y); + a := arctan2(y, x); + + if (Sender = txtPost00) or (Sender = txtPost10) or (Sender = txtPost20) then + r := NewVal + else + a := NewVal*PI/180; + + x := r * cos(a); + y := r * sin(a); + if (Sender = txtPost00) or (Sender = txtPost01) then begin + p[0][0] := x; + p[0][1] := -y; + end else + if (Sender = txtPost10) or (Sender = txtPost11) then begin + p[1][0] := -x; + p[1][1] := y; + end else + begin + p[2][0] := x; + p[2][1] := -y; + end; + end; + end; + ShowSelectedInfo; + UpdateFlame(true); +end; + +procedure TEditForm.btnResetPostXFormClick(Sender: TObject); +begin + with cp.xform[SelectedTriangle] do + begin + if (p[0,0]<>1) or (p[0,1]<>0) or(p[1,0]<>0) or (p[1,1]<>1) or (p[2,0]<>0) or (p[2,1]<>0) then + begin + MainForm.UpdateUndo; + p[0, 0] := 1; + p[0, 1] := 0; + p[1, 0] := 0; + p[1, 1] := 1; + p[2, 0] := 0; + p[2, 1] := 0; + ShowSelectedInfo; + UpdateFlame(True); + end; + end; +end; + +procedure TEditForm.btnPivotModeClick(Sender: TObject); +begin + if PivotMode <> pivotLocal then + with MainTriangles[SelectedTriangle] do begin + PivotMode := pivotLocal; + btnPivotMode.Caption := 'Local Pivot'; + end + else + with MainTriangles[SelectedTriangle] do begin + PivotMode := pivotWorld; + btnPivotMode.Caption := 'World Pivot'; + end; + + TriangleView.Invalidate; + ShowSelectedInfo; +end; + +procedure TEditForm.PivotValidate(Sender: TObject); +var + v: double; +begin + try + v := Round6(StrToFloat(TEdit(Sender).Text)); + except on Exception do + begin + ShowSelectedInfo; + exit; + end; + end; + + if Sender = editPivotX then + if v <> Round6(GetPivot.x) then begin + if PivotMode = pivotLocal then LocalPivot.x := v + else WorldPivot.x := v; + end + else exit + else + if v <> Round6(GetPivot.y) then begin + if PivotMode = pivotLocal then LocalPivot.y := v + else WorldPivot.y := v; + end + else exit; + + TriangleView.Invalidate; + ShowSelectedInfo; +end; + +procedure TEditForm.PivotKeyPress(Sender: TObject; var Key: Char); +begin + if key <> #13 then exit; + key := #0; + PivotValidate(Sender); +end; + +procedure TEditForm.btnResetPivotClick(Sender: TObject); +begin + if PivotMode = pivotLocal then + begin + LocalPivot.x := 0; + LocalPivot.y := 0; + end + else begin + WorldPivot.x := 0; + WorldPivot.y := 0; + end; + TriangleView.Invalidate; + ShowSelectedInfo; +end; + +procedure TEditForm.btnPickPivotClick(Sender: TObject); +begin + if editMode = modePick then begin + editMode := oldMode; + oldMode := modeNone; + exit; + end; + if oldMode <> modeNone then exit; + oldMode := editMode; + editMode := modePick; + TriangleView.Cursor := crCross; //... + btnPickPivot.Down := true; +end; + +// this function is temporary................................................... +procedure TEditForm.btnSwapXformsClick(Sender: TObject); +var + i, j: integer; + t: double; +begin + MainForm.UpdateUndo; + for i := 0 to 2 do + for j := 0 to 1 do + with cp.xform[SelectedTriangle] do + begin + t:=c[i,j]; + c[i,j]:=p[i,j]; + p[i,j]:=t; + end; + cp.TrianglesFromCP(MainTriangles); + ShowSelectedInfo; + UpdateFlame(true); +end; + end. diff --git a/2.10/Source/FormRender.dfm b/2.10/Source/FormRender.dfm index d9ac1b0..b7af46a 100644 --- a/2.10/Source/FormRender.dfm +++ b/2.10/Source/FormRender.dfm @@ -4,7 +4,7 @@ object RenderForm: TRenderForm BorderIcons = [biSystemMenu, biMinimize] BorderStyle = bsSingle Caption = 'RenderForm' - ClientHeight = 424 + ClientHeight = 416 ClientWidth = 424 Color = clBtnFace Font.Charset = DEFAULT_CHARSET @@ -51,7 +51,7 @@ object RenderForm: TRenderForm TextHeight = 13 object ProgressBar: TProgressBar Left = 0 - Top = 392 + Top = 384 Width = 424 Height = 13 Align = alBottom @@ -59,7 +59,7 @@ object RenderForm: TRenderForm end object btnRender: TButton Left = 256 - Top = 364 + Top = 356 Width = 75 Height = 23 Caption = 'Render' @@ -69,7 +69,7 @@ object RenderForm: TRenderForm end object btnCancel: TButton Left = 344 - Top = 362 + Top = 354 Width = 75 Height = 25 Caption = 'Close' @@ -140,7 +140,6 @@ object RenderForm: TRenderForm Width = 281 Height = 21 TabOrder = 0 - Text = 'txtFilename' OnChange = txtFilenameChange end end @@ -368,7 +367,7 @@ object RenderForm: TRenderForm end object btnPause: TButton Left = 168 - Top = 362 + Top = 354 Width = 75 Height = 25 Caption = 'Pause' @@ -377,7 +376,7 @@ object RenderForm: TRenderForm end object chkSave: TCheckBox Left = 8 - Top = 330 + Top = 322 Width = 113 Height = 17 Caption = 'Save parameters' @@ -439,7 +438,7 @@ object RenderForm: TRenderForm end object StatusBar: TStatusBar Left = 0 - Top = 405 + Top = 397 Width = 424 Height = 19 Panels = < @@ -455,7 +454,7 @@ object RenderForm: TRenderForm end object chkShutdown: TCheckBox Left = 8 - Top = 368 + Top = 360 Width = 137 Height = 17 Caption = 'Shutdown on complete' @@ -463,14 +462,14 @@ object RenderForm: TRenderForm end object cbPostProcess: TCheckBox Left = 8 - Top = 348 + Top = 340 Width = 97 Height = 17 Caption = 'Post render' TabOrder = 9 end object SaveDialog: TSaveDialog - Left = 368 - Top = 328 + Left = 376 + Top = 320 end end diff --git a/2.10/Source/FormRender.pas b/2.10/Source/FormRender.pas index 56a05e2..33beace 100644 --- a/2.10/Source/FormRender.pas +++ b/2.10/Source/FormRender.pas @@ -89,8 +89,8 @@ type procedure cmbPresetChange(Sender: TObject); procedure chkMaintainClick(Sender: TObject); private - StartTime: TDateTime; - Remainder: TDateTime; + StartTime, oldElapsed, edt: TDateTime; + oldProg: double; procedure DoPostProcess; @@ -171,7 +171,7 @@ begin if not chkLimitMem.Checked and cbPostProcess.checked then DoPostProcess; - Renderer.SaveImage(RenderForm.FileName); + Renderer.SaveImage(FileName); Renderer.Free; Renderer := nil; @@ -192,33 +192,50 @@ end; procedure TRenderForm.OnProgress(prog: double); var - Elapsed: TDateTime; - e, r: string; + Elapsed, Remaining, dt: TDateTime; begin + Elapsed := Now - StartTime; + dt := Elapsed - oldElapsed; + if (prog = 1.0) then begin + StatusBar.Panels[0].text := Format('Elapsed %2.2d:%2.2d:%2.2d.%2.2d', + [Trunc(Elapsed * 24), + Trunc(Elapsed * 24 * 60) mod 60, + Trunc(Elapsed * 24 * 60 * 60) mod 60, + Trunc(Elapsed * 24 * 60 * 60 * 100) mod 100]); + StatusBar.Panels[1].text := 'Remaining 00:00:00.00'; + exit; + end; + + if (dt < 1/24/60/60/10) then exit; + oldElapsed := Elapsed; prog := (Renderer.Slice + Prog) / Renderer.NrSlices; - if ShowProgress then ProgressBar.Position := round(100 * prog); - Elapsed := Now - StartTime; - e := Format('Elapsed %2.2d:%2.2d:%2.2d.%2.2d', + StatusBar.Panels[0].text := Format('Elapsed %2.2d:%2.2d:%2.2d.%2.2d', [Trunc(Elapsed * 24), - Trunc((Elapsed * 24 - Trunc(Elapsed * 24)) * 60), - Trunc((Elapsed * 24 * 60 - Trunc(Elapsed * 24 * 60)) * 60), - Trunc((Elapsed * 24 * 60 * 60 - Trunc(Elapsed * 24 * 60 * 60)) * 100)]); + Trunc(Elapsed * 24 * 60) mod 60, + Trunc(Elapsed * 24 * 60 * 60) mod 60, + Trunc(Elapsed * 24 * 60 * 60 * 100) mod 100]); - if prog > 0 then - Remainder := Min(Remainder, Elapsed * (power(1 / prog, 1.2) - 1)); + edt := edt + dt; + if (edt > 1/24/60/60/2) and (prog > 0) then + begin +// Remainder := Min(Remainder, Elapsed * (power(1 / prog, 1.2) - 1)); // --Z-- this power() is weird +// Remaining := Elapsed/prog - Elapsed; // --Z-- should've been like this maybe? ;) too easy anyway... - r := Format('Remaining %2.2d:%2.2d:%2.2d.%2.2d', - [Trunc(Remainder * 24), - Trunc((Remainder * 24 - Trunc(Remainder * 24)) * 60), - Trunc((Remainder * 24 * 60 - Trunc(Remainder * 24 * 60)) * 60), - Trunc((Remainder * 24 * 60 * 60 - Trunc(Remainder * 24 * 60 * 60)) * 100)]); + Remaining := (1 - prog) * edt / (prog - oldProg); + edt := 0; + oldProg := prog; - StatusBar.Panels[0].text := e; - StatusBar.Panels[1].text := r; - StatusBar.Panels[2].text := 'Slice ' + IntToStr(Renderer.Slice + 1) + ' of ' + IntToStr(Renderer.nrSlices); + StatusBar.Panels[1].text := Format('Remaining %2.2d:%2.2d:%2.2d.%2.2d', + [Trunc(Remaining * 24), + Trunc(Remaining * 24 * 60) mod 60, + Trunc(Remaining * 24 * 60 * 60) mod 60, + Trunc(Remaining * 24 * 60 * 60 * 100) mod 100]); + end; + + StatusBar.Panels[2].text := 'Slice ' + IntToStr(Renderer.Slice + 1) + ' of ' + IntToStr(Renderer.nrSlices); end; procedure TRenderForm.FormCreate(Sender: TObject); @@ -232,9 +249,14 @@ end; procedure TRenderForm.FormDestroy(Sender: TObject); begin - if assigned(Renderer) then Renderer.Terminate; - if assigned(Renderer) then Renderer.WaitFor; - if assigned(Renderer) then Renderer.Free; +// if assigned(Renderer) then Renderer.Terminate; +// if assigned(Renderer) then Renderer.WaitFor; +// if assigned(Renderer) then Renderer.Free; + if assigned(Renderer) then begin + Renderer.Terminate; + Renderer.WaitFor; + Renderer.Free; + end; cp.free; end; @@ -312,26 +334,31 @@ begin btnPause.enabled := true; btnCancel.Caption := 'Stop'; StartTime := Now; - Remainder := 365; +// Remaining := 365; if Assigned(Renderer) then Renderer.Terminate; if Assigned(Renderer) then Renderer.WaitFor; if not Assigned(Renderer) then begin - // disable screensaver + // disable screensaver SystemParametersInfo(SPI_SETSCREENSAVEACTIVE, 0, nil, 0); cp.sample_density := Sample_density; cp.spatial_oversample := Oversample; cp.spatial_filter_radius := Filter_Radius; - AdjustScale(cp, ImageWidth, ImageHeight); + cp.AdjustScale(ImageWidth, ImageHeight); renderPath := ExtractFilePath(Filename); if chkSave.checked then MainForm.SaveXMLFlame(cp, ExtractFileName(FileName), renderPath + 'renders.flame'); + + oldProg:=0; + oldElapsed:=0; + edt:=0; + Renderer := TRenderThread.Create; if chkLimitMem.checked then Renderer.MaxMem := StrToInt(cbMaxMemory.text); Renderer.OnProgress := OnProgress; - Renderer.TargetHandle := RenderForm.Handle; + Renderer.TargetHandle := self.Handle; Renderer.Compatibility := compatibility; Renderer.SetCP(cp); Renderer.Priority := tpLower; @@ -354,9 +381,9 @@ begin if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Render', False) then begin if Registry.ValueExists('Left') then - RenderForm.Left := Registry.ReadInteger('Left'); + self.Left := Registry.ReadInteger('Left'); if Registry.ValueExists('Top') then - RenderForm.Top := Registry.ReadInteger('Top'); + self.Top := Registry.ReadInteger('Top'); end; Registry.CloseKey; finally @@ -409,15 +436,26 @@ begin end; procedure TRenderForm.txtOversampleChange(Sender: TObject); +var + o: integer; begin - if StrToInt(txtOversample.Text) > udOversample.Max then - txtOversample.Text := IntToStr(udOversample.Max); - if StrToInt(txtOversample.Text) < udOversample.Min then - txtOversample.Text := IntToStr(udOversample.Min); try - Oversample := StrToInt(txtOversample.Text); + o := StrToInt(txtOversample.Text); except + txtOversample.Text := IntToStr(Oversample); + exit; end; + if o > udOversample.Max then + begin + o := udOversample.Max; + txtOversample.Text := IntToStr(o); + end + else if o < udOversample.Min then + begin + o := udOversample.Min; + txtOversample.Text := IntToStr(o); + end; + Oversample := o; ShowMemoryStatus; end; @@ -435,9 +473,11 @@ end; procedure TRenderForm.btnCancelClick(Sender: TObject); begin if Assigned(Renderer) then - Renderer.Terminate - else - close; + begin + Renderer.Terminate; + Renderer.WaitFor; // --?-- + end + else close; end; procedure TRenderForm.txtDensityChange(Sender: TObject); @@ -476,8 +516,8 @@ begin Registry.RootKey := HKEY_CURRENT_USER; if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Render', True) then begin - Registry.WriteInteger('Top', RenderForm.Top); - Registry.WriteInteger('Left', RenderForm.Left); + Registry.WriteInteger('Top', Top); + Registry.WriteInteger('Left', Left); end; finally Registry.Free; @@ -504,7 +544,10 @@ begin CanClose := False else begin - if Assigned(Renderer) then Renderer.Terminate; + if Assigned(Renderer) then begin + Renderer.Terminate; + Renderer.WaitFor; + end; end; end; @@ -677,7 +720,7 @@ procedure TRenderForm.DoPostProcess; begin frmPostProcess.SetRenderer(Renderer.GetRenderer); frmPostProcess.SetControlPoint(CP); - frmPostProcess.SetImageName(RenderForm.FileName); + frmPostProcess.SetImageName(FileName); frmPostProcess.Show; end; diff --git a/2.10/Source/Fullscreen.pas b/2.10/Source/Fullscreen.pas index 3b75d41..6443dfc 100644 --- a/2.10/Source/Fullscreen.pas +++ b/2.10/Source/Fullscreen.pas @@ -62,7 +62,7 @@ uses Main, Math, Global; procedure TFullscreenForm.DrawFlame; begin - AdjustScale(cp, Image.Width, Image.Height); + cp.AdjustScale(Image.Width, Image.Height); // cp.Zoom := MainForm.Zoom; // cp.center[0] := MainForm.center[0]; // cp.center[1] := MainForm.center[1]; diff --git a/2.10/Source/Global.pas b/2.10/Source/Global.pas index 2e20670..c1a04ab 100644 --- a/2.10/Source/Global.pas +++ b/2.10/Source/Global.pas @@ -80,6 +80,10 @@ var Variation: TVariation; // Current variation NumTries, TryLength: integer; // Settings for smooth palette SmoothPaletteFile: string; +{ Editor } + UseFlameBackground, UseTransformColors: boolean; + EditorBkgColor, ReferenceTriangleColor: integer; + GridColor1, GridColor2, HelpersColor: integer; { Display } defSampleDensity, defPreviewDensity: Double; defGamma, defBrightness, defVibrancy, defFilterRadius: Double; diff --git a/2.10/Source/Main.dfm b/2.10/Source/Main.dfm index bfa5c6a..0823521 100644 --- a/2.10/Source/Main.dfm +++ b/2.10/Source/Main.dfm @@ -1,10 +1,12 @@ object MainForm: TMainForm - Left = 387 - Top = 166 - Width = 605 - Height = 635 + Left = 400 + Top = 157 + Width = 731 + Height = 530 Caption = 'Apophysis' Color = clBtnFace + Constraints.MinHeight = 240 + Constraints.MinWidth = 320 Font.Charset = ANSI_CHARSET Font.Color = clWindowText Font.Height = -11 @@ -27,12 +29,12 @@ object MainForm: TMainForm Left = 160 Top = 28 Width = 4 - Height = 540 + Height = 435 end object ToolBar: TToolBar Left = 0 Top = 0 - Width = 597 + Width = 723 Height = 28 BorderWidth = 1 Flat = True @@ -43,7 +45,7 @@ object MainForm: TMainForm object btnOpen: TToolButton Left = 0 Top = 0 - Hint = 'Open (Ctrl+O)|Opens parameter files for browsing' + Hint = 'Open (Ctrl+O)|Open a parameter file for browsing' Caption = 'btnOpen' ImageIndex = 1 OnClick = mnuOpenClick @@ -131,7 +133,7 @@ object MainForm: TMainForm object btnFullScreen: TToolButton Left = 194 Top = 0 - Hint = 'Fullscreen View (F3)|Shows full-screen view of the flame' + Hint = 'Fullscreen View (F3)|Show full-screen view of the flame' Caption = 'btnFullScreen' ImageIndex = 52 OnClick = mnuFullScreenClick @@ -147,7 +149,7 @@ object MainForm: TMainForm object btnEditor: TToolButton Left = 225 Top = 0 - Hint = 'Editor (F4)|Shows the Transform Editor' + Hint = 'Editor (F4)|Show Transform Editor' Caption = 'btnEditor' ImageIndex = 19 OnClick = mnuEditorClick @@ -155,7 +157,7 @@ object MainForm: TMainForm object btnAdjust: TToolButton Left = 248 Top = 0 - Hint = 'Adjust (F5)|Shows the Adjust window' + Hint = 'Adjust (F5)|Adjust render-settings' Caption = 'btnAdjust' ImageIndex = 18 OnClick = mnuAdjustClick @@ -179,7 +181,7 @@ object MainForm: TMainForm object btnSize: TToolButton Left = 317 Top = 0 - Hint = 'Image Size (F2)|Shows the Image Size window' + Hint = 'Image Size|Adjust image size' Caption = 'ma' ImageIndex = 51 OnClick = mnuImageSizeClick @@ -192,27 +194,29 @@ object MainForm: TMainForm ImageIndex = 14 Style = tbsSeparator end - object btnRun: TToolButton + object btnDefine: TToolButton Left = 348 Top = 0 - Hint = 'Run Script|Runs the Default Animation script' + Hint = 'Edit Script (F8)|Open the Script Editor' + Caption = 'btnDefine' + ImageIndex = 42 + OnClick = mnuEditScriptClick + end + object btnRun: TToolButton + Left = 371 + Top = 0 + Hint = 'Run Script|Run Script' + Caption = 'Run' ImageIndex = 43 OnClick = btnRunClick end object btnStop: TToolButton - Left = 371 - Top = 0 - Caption = 'btnStop' - ImageIndex = 36 - OnClick = mnuStopClick - end - object btnDefine: TToolButton Left = 394 Top = 0 - Hint = 'Edit Script (F8)|Opens the Script Editor' - Caption = 'btnDefine' - ImageIndex = 42 - OnClick = mnuEditScriptClick + Hint = 'Stop Script|Stop Script' + Caption = 'Stop' + ImageIndex = 36 + OnClick = mnuStopClick end object ToolButton5: TToolButton Left = 417 @@ -284,7 +288,7 @@ object MainForm: TMainForm Left = 0 Top = 28 Width = 160 - Height = 540 + Height = 435 Align = alLeft Columns = < item @@ -302,8 +306,8 @@ object MainForm: TMainForm object BackPanel: TPanel Left = 164 Top = 28 - Width = 433 - Height = 540 + Width = 559 + Height = 435 Align = alClient BevelInner = bvLowered BevelOuter = bvNone @@ -313,8 +317,8 @@ object MainForm: TMainForm object Image: TImage Left = 1 Top = 1 - Width = 431 - Height = 538 + Width = 557 + Height = 433 Align = alClient AutoSize = True PopupMenu = DisplayPopup @@ -327,8 +331,8 @@ object MainForm: TMainForm end object StatusBar: TStatusBar Left = 0 - Top = 568 - Width = 597 + Top = 463 + Width = 723 Height = 19 Panels = < item @@ -2668,7 +2672,6 @@ object MainForm: TMainForm object mnuImageSize: TMenuItem Caption = 'Image Size' ImageIndex = 51 - ShortCut = 119 OnClick = mnuImageSizeClick end object mnuimage: TMenuItem diff --git a/2.10/Source/Main.pas b/2.10/Source/Main.pas index c76913c..74c3c3f 100644 --- a/2.10/Source/Main.pas +++ b/2.10/Source/Main.pas @@ -38,7 +38,7 @@ const RS_XO = 2; RS_VO = 3; - AppVersionString = 'Apophysis 2.03b'; + AppVersionString = 'Apophysis 2.03c pre-release 5'; type TMouseMoveState = (msUsual, msZoomWindow, msZoomOutWindow, msZoomWindowMove, msZoomOutWindowMove, msDrag, msDragMove, msRotate, msRotateMove); @@ -352,7 +352,7 @@ function NumXForms(const cp: TControlPoint): integer; procedure MultMatrix(var s: TMatrix; const m: TMatrix); procedure ListFlames(FileName: string; sel: integer); procedure ListIFS(FileName: string; sel: integer); -procedure AdjustScale(var cp1: TControlPoint; width, height: integer); +//procedure AdjustScale(var cp1: TControlPoint; width, height: integer); procedure NormalizeVariations(var cp1: TControlPoint); function GetWinVersion: TWin32Version; @@ -418,16 +418,6 @@ begin end end; -procedure AdjustScale(var cp1: TControlPoint; width, height: integer); -begin -// if width >= height then - cp1.pixels_per_unit := cp1.pixels_per_unit / (cp1.width / width); -// else -// cp1.pixels_per_unit := cp1.pixels_per_unit / (cp1.height / height); - cp1.width := width; - cp1.height := height; -end; - procedure MultMatrix(var s: TMatrix; const m: TMatrix); var a, b, c, d, e, f, g, h: double; @@ -1803,7 +1793,7 @@ begin begin if (MainCp.width <> Image.Width) or (MainCp.height <> Image.height) then begin - AdjustScale(MainCp, Image.width, Image.height); + MainCp.AdjustScale(Image.width, Image.height); if EditForm.Visible then EditForm.UpdateDisplay(true); // preview only? end; if AdjustForm.Visible then AdjustForm.UpdateDisplay(true); // preview only! @@ -3728,7 +3718,8 @@ begin cp1.spatial_oversample := ExportOversample; cp1.spatial_filter_radius := ExportFilter; cp1.nbatches := ExportBatches; - if (cp1.width <> ExportWidth) or (cp1.Height <> ExportHeight) then AdjustScale(cp1, ExportWidth, ExportHeight); + if (cp1.width <> ExportWidth) or (cp1.Height <> ExportHeight) then + cp1.AdjustScale(ExportWidth, ExportHeight); FileList.Text := FlameToXML(cp1, false); FileList.SaveToFile(ChangeFileExt(ExportDialog.Filename, '.flame')); FileList.Clear; @@ -3992,6 +3983,7 @@ begin try if TagName = 'xform' then begin + Parsecp.xform[nxform].Clear; v := Attributes.Value('weight'); if v <> '' then ParseCp.xform[nxform].density := StrToFloat(v); v := Attributes.Value('color'); @@ -4010,6 +4002,20 @@ begin c[2][0] := StrToFloat(Tokens[4]); c[2][1] := StrToFloat(Tokens[5]); end; + v := Attributes.Value('post'); + if v <> '' then begin + GetTokens(v, tokens); + if Tokens.Count < 6 then ShowMessage('Not enough post-cooeficients...crash?'); + with Parsecp.xform[nxform] do + begin + p[0][0] := StrToFloat(Tokens[0]); + p[0][1] := StrToFloat(Tokens[1]); + p[1][0] := StrToFloat(Tokens[2]); + p[1][1] := StrToFloat(Tokens[3]); + p[2][0] := StrToFloat(Tokens[4]); + p[2][1] := StrToFloat(Tokens[5]); + end; + end; for i := 0 to NRVAR - 1 do begin @@ -4450,4 +4456,5 @@ end; {$ENDIF} /////////////////////////////////////////////////////////////////////////////// + end. diff --git a/2.10/Source/Mutate.pas b/2.10/Source/Mutate.pas index 0f3c5e4..a1fb66e 100644 --- a/2.10/Source/Mutate.pas +++ b/2.10/Source/Mutate.pas @@ -138,7 +138,7 @@ end; procedure TMutateForm.UpdateDisplay; begin cps[0].copy(MainCp); - AdjustScale(cps[0], Image0.Width, Image0.Height); + cps[0].AdjustScale(Image0.Width, Image0.Height); cps[0].cmap := MainCp.cmap; cmap := MainCp.cmap; name := Maincp.name; @@ -600,7 +600,7 @@ begin cps[0].width := MainCp.width; cps[0].height := MainCp.height; cps[0].pixels_per_unit := MainCp.pixels_per_unit; - AdjustScale(cps[0], Image0.width, Image0.Height); + cps[0].AdjustScale(Image0.width, Image0.Height); cps[0].zoom := MainCp.zoom; cps[0].center[0] := MainCp.center[0]; cps[0].center[1] := MainCp.center[1]; diff --git a/2.10/Source/Options.dfm b/2.10/Source/Options.dfm index 5fcd186..a4e26d0 100644 --- a/2.10/Source/Options.dfm +++ b/2.10/Source/Options.dfm @@ -51,19 +51,19 @@ object OptionsForm: TOptionsForm HelpContext = 1 Caption = 'General' object chkConfirmDel: TCheckBox - Left = 144 - Top = 135 - Width = 97 + Left = 8 + Top = 175 + Width = 121 Height = 17 HelpContext = 1005 Caption = 'Confirm delete' - TabOrder = 4 + TabOrder = 2 end object JPEG: TGroupBox Left = 8 - Top = 132 + Top = 116 Width = 121 - Height = 53 + Height = 55 Caption = 'JPEG Quality' TabOrder = 0 object txtJPEGquality: TComboBox @@ -83,23 +83,23 @@ object OptionsForm: TOptionsForm end end object chkResize: TCheckBox - Left = 144 - Top = 153 - Width = 169 + Left = 8 + Top = 193 + Width = 121 Height = 17 Caption = 'Resize on load' - TabOrder = 5 + TabOrder = 3 end object GroupBox16: TGroupBox Left = 8 Top = 4 Width = 121 - Height = 69 + Height = 55 Caption = 'Multithreading' TabOrder = 1 object cbNrTheads: TComboBox Left = 16 - Top = 24 + Top = 20 Width = 89 Height = 21 ItemHeight = 13 @@ -113,18 +113,21 @@ object OptionsForm: TOptionsForm '8') end end - object chkShowTransparency: TCheckBox - Left = 144 - Top = 171 - Width = 169 - Height = 17 - Caption = 'Show Transparency' - TabOrder = 6 + object rgRotationMode: TRadioGroup + Left = 8 + Top = 60 + Width = 121 + Height = 55 + Caption = 'Rotation Mode' + Items.Strings = ( + 'Rotate image' + 'Rotate frame') + TabOrder = 4 end object rgReferenceMode: TRadioGroup - Left = 280 + Left = 288 Top = 4 - Width = 153 + Width = 145 Height = 69 Caption = 'Reference Triangle' ItemIndex = 0 @@ -132,30 +135,116 @@ object OptionsForm: TOptionsForm 'Normal' 'Proportional' 'Wandering (old-style)') - TabOrder = 3 + TabOrder = 5 end - object rgTransparency: TRadioGroup + object GroupBox1: TGroupBox Left = 136 Top = 4 - Width = 137 - Height = 69 - Caption = 'PNG Transparency' - Items.Strings = ( - 'No transparency' - 'Flam3-style' - 'Flamesong-style') - TabOrder = 2 - end - object rgRotationMode: TRadioGroup - Left = 8 - Top = 76 - Width = 121 - Height = 53 - Caption = 'Rotation Mode' - Items.Strings = ( - 'Rotate image' - 'Rotate frame') - TabOrder = 7 + Width = 145 + Height = 138 + Caption = 'Editor Graph' + TabOrder = 6 + object Label40: TLabel + Left = 8 + Top = 56 + Width = 56 + Height = 13 + Caption = 'Background' + end + object Label41: TLabel + Left = 8 + Top = 96 + Width = 50 + Height = 13 + Caption = 'Reference' + end + object Label42: TLabel + Left = 75 + Top = 56 + Width = 50 + Height = 13 + Caption = 'Grid colors' + end + object Label43: TLabel + Left = 75 + Top = 96 + Width = 36 + Height = 13 + Caption = 'Helpers' + end + object pnlBackColor: TPanel + Left = 8 + Top = 72 + Width = 62 + Height = 17 + Cursor = crHandPoint + BevelOuter = bvLowered + Color = clBlack + TabOrder = 0 + OnClick = pnlBackColorClick + end + object chkUseXFormColor: TCheckBox + Left = 8 + Top = 16 + Width = 129 + Height = 17 + Caption = 'Use transform color' + TabOrder = 1 + end + object chkHelpers: TCheckBox + Left = 8 + Top = 36 + Width = 129 + Height = 17 + Caption = 'Helper lines' + Checked = True + State = cbChecked + TabOrder = 2 + end + object pnlReference: TPanel + Left = 8 + Top = 112 + Width = 62 + Height = 17 + Cursor = crHandPoint + BevelOuter = bvLowered + Color = clGray + TabOrder = 3 + OnClick = pnlReferenceClick + end + object pnlGridColor1: TPanel + Left = 75 + Top = 72 + Width = 29 + Height = 17 + Cursor = crHandPoint + BevelOuter = bvLowered + Color = clBlack + TabOrder = 4 + OnClick = pnlGridColor1Click + end + object pnlGridColor2: TPanel + Left = 108 + Top = 72 + Width = 29 + Height = 17 + Cursor = crHandPoint + BevelOuter = bvLowered + Color = clBlack + TabOrder = 5 + OnClick = pnlGridColor2Click + end + object pnlHelpersColor: TPanel + Left = 75 + Top = 112 + Width = 62 + Height = 17 + Cursor = crHandPoint + BevelOuter = bvLowered + Color = clGray + TabOrder = 6 + OnClick = pnlHelpersColorClick + end end end object DisplayPage: TTabSheet @@ -311,6 +400,27 @@ object OptionsForm: TOptionsForm TabOrder = 5 end end + object chkShowTransparency: TCheckBox + Left = 192 + Top = 179 + Width = 129 + Height = 17 + Caption = 'Show Transparency' + TabOrder = 2 + end + object rgTransparency: TRadioGroup + Left = 184 + Top = 104 + Width = 193 + Height = 69 + Caption = 'PNG Transparency' + ItemIndex = 0 + Items.Strings = ( + 'No transparency' + 'Flam3-style' + 'Flamesong-style') + TabOrder = 3 + end end object RandomPage: TTabSheet Caption = 'Random' @@ -424,7 +534,7 @@ object OptionsForm: TOptionsForm Height = 21 HelpContext = 1004 TabOrder = 1 - Text = '100' + Text = '10' end object udBatchSize: TUpDown Left = 169 @@ -434,7 +544,7 @@ object OptionsForm: TOptionsForm Associate = txtBatchSize Min = 1 Max = 300 - Position = 100 + Position = 10 TabOrder = 2 Thousands = False end @@ -609,8 +719,8 @@ object OptionsForm: TOptionsForm object clbVarEnabled: TCheckListBox Left = 12 Top = 16 - Width = 309 - Height = 201 + Width = 317 + Height = 206 Columns = 2 ItemHeight = 13 TabOrder = 0 @@ -1196,7 +1306,7 @@ object OptionsForm: TOptionsForm end end end - object Paths: TTabSheet + object PathsPage: TTabSheet Caption = 'Paths' ImageIndex = 7 object GroupBox10: TGroupBox diff --git a/2.10/Source/Options.pas b/2.10/Source/Options.pas index 5e9f7e1..f688182 100644 --- a/2.10/Source/Options.pas +++ b/2.10/Source/Options.pas @@ -146,7 +146,7 @@ type Label17: TLabel; txtServer: TEdit; chkResize: TCheckBox; - Paths: TTabSheet; + PathsPage: TTabSheet; GroupBox10: TGroupBox; btnDefGradient: TSpeedButton; Label25: TLabel; @@ -166,15 +166,12 @@ type clbVarEnabled: TCheckListBox; GroupBox16: TGroupBox; cbNrTheads: TComboBox; - chkShowTransparency: TCheckBox; - rgReferenceMode: TRadioGroup; GroupBox13: TGroupBox; Label8: TLabel; Label10: TLabel; txtNumtries: TEdit; txtTryLength: TEdit; txtJPEGquality: TComboBox; - rgTransparency: TRadioGroup; Label24: TLabel; txtSymNVars: TEdit; udSymNVars: TUpDown; @@ -183,6 +180,21 @@ type udBatchSize: TUpDown; Label38: TLabel; Label39: TLabel; + chkShowTransparency: TCheckBox; + rgTransparency: TRadioGroup; + rgReferenceMode: TRadioGroup; + GroupBox1: TGroupBox; + Label40: TLabel; + Label41: TLabel; + Label42: TLabel; + Label43: TLabel; + pnlBackColor: TPanel; + chkUseXFormColor: TCheckBox; + chkHelpers: TCheckBox; + pnlReference: TPanel; + pnlGridColor1: TPanel; + pnlGridColor2: TPanel; + pnlHelpersColor: TPanel; procedure btnCancelClick(Sender: TObject); procedure FormShow(Sender: TObject); procedure btnOKClick(Sender: TObject); @@ -207,6 +219,11 @@ type procedure btnRendererClick(Sender: TObject); procedure SpeedButton2Click(Sender: TObject); procedure FormCreate(Sender: TObject); + procedure pnlBackColorClick(Sender: TObject); + procedure pnlReferenceClick(Sender: TObject); + procedure pnlGridColor1Click(Sender: TObject); + procedure pnlGridColor2Click(Sender: TObject); + procedure pnlHelpersColorClick(Sender: TObject); private { Private declarations } public @@ -221,7 +238,7 @@ implementation {$R *.DFM} uses - Main, Global, Editor, ControlPoint, XFormMan; + Main, Global, Editor, ControlPoint, XFormMan, Adjust; procedure TOptionsForm.btnCancelClick(Sender: TObject); begin @@ -278,6 +295,11 @@ begin txtMediumQuality.Text := FloatToStr(prevMediumQuality); txtHighQuality.Text := FloatToStr(prevHighQuality); + pnlBackColor.Color := TColor(EditorBkgColor); + pnlGridColor1.Color := GridColor1; + pnlGridColor2.Color := GridColor2; + pnlReference.color := TColor(ReferenceTriangleColor); + { Random tab } udMinXforms.Position := randMinTransforms; udMaxXforms.Position := randMaxTransforms; @@ -620,5 +642,61 @@ begin end; end; +procedure TOptionsForm.pnlBackColorClick(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlBackColor.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlBackColor.Color := AdjustForm.ColorDialog.Color; + EditorBkgColor := Integer(pnlBackColor.color); +// GrphPnl.Color := BackgroundColor; +// TriangleView.Invalidate; + end; +end; + +procedure TOptionsForm.pnlReferenceClick(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlReference.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlReference.Color := AdjustForm.ColorDialog.Color; + ReferenceTriangleColor := Integer(pnlReference.color); +// TriangleView.Invalidate; + end; +end; + +procedure TOptionsForm.pnlGridColor1Click(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlGridColor1.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlGridColor1.Color := AdjustForm.ColorDialog.Color; + GridColor1 := Integer(pnlGridColor1.color); +// TriangleView.Invalidate; + end; +end; + +procedure TOptionsForm.pnlGridColor2Click(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlGridColor2.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlGridColor2.Color := AdjustForm.ColorDialog.Color; + GridColor2 := Integer(pnlGridColor2.color); +// TriangleView.Invalidate; + end; +end; + +procedure TOptionsForm.pnlHelpersColorClick(Sender: TObject); +begin + AdjustForm.ColorDialog.Color := pnlHelpersColor.Color; + if AdjustForm.ColorDialog.Execute then + begin + pnlHelpersColor.Color := AdjustForm.ColorDialog.Color; + HelpersColor := Integer(pnlHelpersColor.color); +// TriangleView.Invalidate; + end; +end; + end. diff --git a/2.10/Source/ScriptForm.dfm b/2.10/Source/ScriptForm.dfm index 36d7396..40d678d 100644 --- a/2.10/Source/ScriptForm.dfm +++ b/2.10/Source/ScriptForm.dfm @@ -3,7 +3,7 @@ object ScriptEditor: TScriptEditor Top = 383 Width = 539 Height = 390 - Caption = 'Default Animation' + Caption = 'Script Editor' Color = clBtnFace Font.Charset = DEFAULT_CHARSET Font.Color = clWindowText @@ -20,7 +20,7 @@ object ScriptEditor: TScriptEditor TextHeight = 13 object Splitter1: TSplitter Left = 0 - Top = 244 + Top = 250 Width = 531 Height = 4 Cursor = crVSplit @@ -30,7 +30,7 @@ object ScriptEditor: TScriptEditor Left = 508 Top = 0 Width = 23 - Height = 244 + Height = 250 Align = alRight AutoSize = True Caption = 'ToolBar' @@ -96,7 +96,7 @@ object ScriptEditor: TScriptEditor end object StatusBar: TStatusBar Left = 0 - Top = 337 + Top = 343 Width = 531 Height = 19 Anchors = [akLeft, akRight] @@ -106,7 +106,7 @@ object ScriptEditor: TScriptEditor Left = 0 Top = 0 Width = 508 - Height = 244 + Height = 250 Align = alClient BevelInner = bvLowered BevelOuter = bvLowered @@ -116,7 +116,7 @@ object ScriptEditor: TScriptEditor Left = 2 Top = 2 Width = 504 - Height = 240 + Height = 246 Cursor = crIBeam PopupMenu = PopupMenu ActiveLineSettings.ShowActiveLine = False @@ -190,14 +190,14 @@ object ScriptEditor: TScriptEditor UrlStyle.BkColor = clWhite UrlStyle.Style = [fsUnderline] UseStyler = True - Version = '1.6.0.8' + Version = '1.6.0.17' WordWrap = wwNone OnChange = EditorChange end end object Console: TMemo Left = 0 - Top = 248 + Top = 254 Width = 531 Height = 89 Align = alBottom @@ -389,6 +389,13 @@ object ScriptEditor: TScriptEditor EventSupport = False OnCompileError = ScripterCompileError ShortBooleanEval = False + LibOptions.SearchPath.Strings = ( + '$(CURDIR)' + '$(APPDIR)') + LibOptions.SourceFileExt = '.psc' + LibOptions.CompiledFileExt = '.pcu' + LibOptions.UseScriptFiles = False + CallExecHookEvent = False Left = 360 Top = 32 end diff --git a/2.10/Source/ScriptForm.pas b/2.10/Source/ScriptForm.pas index ec15192..f20d7db 100644 --- a/2.10/Source/ScriptForm.pas +++ b/2.10/Source/ScriptForm.pas @@ -1475,7 +1475,7 @@ begin if nxform < NXFORMS then for i := nxform to NXFORMS - 1 do cp1.xform[i].density := 0; - cp1.NormalizeWeights; + // --?-- cp1.NormalizeWeights; // Check for symmetry parameter if cp1.symmetry <> 0 then begin @@ -1517,7 +1517,7 @@ begin for i := 0 to NXFORMS - 1 do if ScriptEditor.cp.xform[i].density = 0 then break; NumTransforms := i; - ScriptEditor.cp.NormalizeWeights; + // --?-- ScriptEditor.cp.NormalizeWeights; // FlameName := FileList[index]; finally IFSStrings.Free; @@ -1589,7 +1589,7 @@ begin for i := 0 to NXFORMS - 1 do if ScriptEditor.cp.xform[i].density = 0 then break; NumTransforms := i; - ScriptEditor.cp.NormalizeWeights; + // --?-- ScriptEditor.cp.NormalizeWeights; if SavedPal then ScriptEditor.cp.cmap := Palette; ScriptEditor.cp.name := FileList[index]; finally @@ -1749,9 +1749,9 @@ begin if NumTransforms > 1 then begin AMachine.Paused := True; - ScriptEditor.cp.NormalizeWeights; + // --?-- ScriptEditor.cp.NormalizeWeights; PreviewForm.cp.Copy(ScriptEditor.cp); - AdjustScale(PreviewForm.cp, PreviewForm.Image.Width, PreviewForm.Image.Height); + PreviewForm.cp.AdjustScale(PreviewForm.Image.Width, PreviewForm.Image.Height); PreviewForm.Show; PreviewForm.DrawFlame; AMachine.Paused := False; @@ -1764,7 +1764,7 @@ procedure TOperationLibrary.RenderProc(AMachine: TatVirtualMachine); begin if NumTransforms > 1 then begin - ScriptEditor.cp.NormalizeWeights; + // --?-- ScriptEditor.cp.NormalizeWeights; ScriptRenderForm.cp.Copy(ScriptEditor.cp); ScriptRenderForm.Caption := 'Rendering ' + ScriptEditor.Renderer.Filename; ; ScriptRenderForm.Show; @@ -2913,7 +2913,7 @@ begin else if (LastError = '') and UpdateIt then begin - cp.NormalizeWeights; + // --?-- cp.NormalizeWeights; MainForm.UpdateUndo; MainCp.Copy(cp); UpdateFlame; @@ -2945,11 +2945,11 @@ procedure TScriptEditor.UpdateFlame; begin MainForm.StopThread; MainForm.UpdateUndo; - cp.NormalizeWeights; + // --?-- cp.NormalizeWeights; MainCp.Copy(cp); // MainCp.name := FlameName; Transforms := MainCp.TrianglesFromCP(MainTriangles); - AdjustScale(MainCp, MainForm.Image.Width, MainForm.Image.Height); + MainCp.AdjustScale(MainForm.Image.Width, MainForm.Image.Height); if ResetLocation then MainCp.CalcBoundBox else begin; MainCp.Zoom := cp.zoom; diff --git a/2.10/Source/ScriptRender.pas b/2.10/Source/ScriptRender.pas index 1327b3c..aa34d7f 100644 --- a/2.10/Source/ScriptRender.pas +++ b/2.10/Source/ScriptRender.pas @@ -21,12 +21,7 @@ interface uses Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs, - ComCtrls, StdCtrls, Render, cmap, ControlPoint; - -const - WM_THREAD_COMPLETE = WM_APP + 5437; - WM_THREAD_TERMINATE = WM_APP + 5438; - + ComCtrls, StdCtrls, RenderThread, cmap, ControlPoint; type TScriptRenderForm = class(TForm) @@ -36,11 +31,16 @@ type procedure FormCreate(Sender: TObject); procedure btnCancelClick(Sender: TObject); private - PixelsPerUnit: double; +// PixelsPerUnit: double; StartTime: TDateTime; Remainder: TDateTime; + + procedure HandleThreadCompletion(var Message: TMessage); + message WM_THREAD_COMPLETE; + procedure HandleThreadTermination(var Message: TMessage); + message WM_THREAD_TERMINATE; public - Renderer: TRenderer; + Renderer: TRenderThread; ColorMap: TColorMap; cp: TControlPoint; Filename: string; @@ -64,34 +64,44 @@ uses Global, Math, FormRender, ScriptForm; procedure TScriptRenderForm.SetRenderBounds; begin cp.copy(ScriptEditor.cp); - cp.Width := ScriptEditor.Renderer.Width; - cp.Height := ScriptEditor.Renderer.Height; - cp.CalcBoundBox; + //cp.Width := ScriptEditor.Renderer.Width; + //cp.Height := ScriptEditor.Renderer.Height; + cp.AdjustScale(ScriptEditor.Renderer.Width, ScriptEditor.Renderer.Height); + // --?-- cp.CalcBoundBox; cp.center[0] := ScriptEditor.cp.center[0]; cp.center[1] := ScriptEditor.cp.center[1]; cp.zoom := ScriptEditor.cp.zoom; - PixelsPerUnit := cp.Pixels_per_unit; + //PixelsPerUnit := cp.Pixels_per_unit; end; procedure TScriptRenderForm.Render; begin + assert(not Assigned(Renderer)); + Renderer := TRenderThread.Create; + Cancelled := False; ScriptEditor.Scripter.Paused := True; StartTime := Now; Remainder := 1; cp.copy(ScriptEditor.cp); Filename := ScriptEditor.Renderer.Filename; - cp.Width := ScriptEditor.Renderer.Width; - cp.Height := ScriptEditor.Renderer.Height; - cp.pixels_per_unit := PixelsPerUnit; + //cp.Width := ScriptEditor.Renderer.Width; + //cp.Height := ScriptEditor.Renderer.Height; + //cp.pixels_per_unit := PixelsPerUnit; + cp.AdjustScale(ScriptEditor.Renderer.Width, ScriptEditor.Renderer.Height); + Renderer.OnProgress := OnProgress; - Renderer.Compatibility := Compatibility; + Renderer.Compatibility := Compatibility; Renderer.SetCP(cp); - if (ScriptEditor.Renderer.MaxMemory > 0) then - Renderer.RenderMaxMem(ScriptEditor.Renderer.MaxMemory) - else Renderer.Render; - Renderer.SaveImage(FileName); - ScriptEditor.Scripter.Paused := False; + if (ScriptEditor.Renderer.MaxMemory > 0) then Renderer.MaxMem := ScriptEditor.Renderer.MaxMemory; + Renderer.TargetHandle := Handle; + renderPath := ExtractFilePath(ScriptEditor.Renderer.Filename); + Renderer.Priority := tpLower; + Renderer.NrThreads := NrTreads; + Renderer.Resume; + +// Renderer.SaveImage(FileName); +// ScriptEditor.Scripter.Paused := False; end; procedure TScriptRenderForm.OnProgress(prog: double); @@ -101,20 +111,19 @@ begin prog := (Renderer.Slice + Prog) / Renderer.NrSlices; ProgressBar.Position := round(100 * prog); Elapsed := Now - StartTime; - if prog > 0 then - Remainder := Min(Remainder, Elapsed * (power(1 / prog, 1.2) - 1)); +// if prog > 0 then Remainder := Elapsed * (1/prog - 1); Application.ProcessMessages; end; procedure TScriptRenderForm.FormDestroy(Sender: TObject); begin cp.free; - Renderer.free; + assert(not Assigned(Renderer)); //if Assigned(Renderer) then Renderer.free; end; procedure TScriptRenderForm.FormCreate(Sender: TObject); begin - Renderer := TRenderer.Create; + //Renderer := TRenderThread.Create; cp := TControlPoint.Create; end; @@ -122,9 +131,34 @@ procedure TScriptRenderForm.btnCancelClick(Sender: TObject); begin ScriptEditor.Scripter.Halt; Cancelled := True; - Renderer.Stop; +// Renderer.Stop; + if Assigned(Renderer) then begin + Renderer.Terminate; + Renderer.WaitFor; + Renderer.Free; + Renderer := nil; + end; LastError := 'Render cancelled'; end; +procedure TScriptRenderForm.HandleThreadCompletion(var Message: TMessage); +begin + Renderer.SaveImage(FileName); + + Renderer.Free; + Renderer := nil; + + ScriptEditor.Scripter.Paused := False; +end; + +procedure TScriptRenderForm.HandleThreadTermination(var Message: TMessage); +begin + if Assigned(Renderer) then + begin + Renderer.Free; + Renderer := nil; + end; +end; + end. diff --git a/2.10/Source/XForm.pas b/2.10/Source/XForm.pas index 519e928..b06749d 100644 --- a/2.10/Source/XForm.pas +++ b/2.10/Source/XForm.pas @@ -21,6 +21,8 @@ type TMatrix = array[0..2, 0..2] of double; +{$define _ASM_} + type TXForm = class private @@ -35,6 +37,12 @@ type FCosA: double; FLength: double; // CalculateAngle, CalculateLength, CalculateSinCos: boolean; + colorC1, colorC2: double; + + waves_f1, waves_f2, + rings_dx, + fan_dx, fan_dx2, + cosine_var2: double; // precalc... FRegVariations: array of TBaseVariation; @@ -66,11 +74,10 @@ type procedure Cosine; // var[20] procedure Rings; // var[21] procedure Fan; // var[22] - -// procedure Triblob; // var[23] -// procedure Daisy; // var[24] -// procedure Checkers; // var[25] -// procedure CRot; // var[26] + procedure Eyefish; // var[23] + procedure Bubble; // var[24] + procedure Cylinder; // var[25] + procedure Smoke; // var[26] function Mul33(const M1, M2: TMatrix): TMatrix; function Identity: TMatrix; @@ -79,10 +86,10 @@ type procedure AddRegVariations; public - vars: array of double; // normalized interp coefs between variations + vars: array of double; // {normalized} interp coefs between variations c: array[0..2, 0..1] of double; // the coefs to the affine part of the function p: array[0..2, 0..1] of double; // post-transform coefs! - density: double; // prob is this function is chosen. 0 - 1 + density: double; // prob is this function is chosen color: double; // color coord for this function. 0 - 1 color2: double; // Second color coord for this function. 0 - 1 symmetry: double; @@ -96,11 +103,11 @@ type constructor Create; destructor Destroy; override; + procedure Clear; procedure Prepare; procedure Assign(Xform: TXForm); - procedure PreviewPoint(var px, py: double); procedure NextPoint(var px, py, pc: double); overload; procedure NextPoint(var CPpoint: TCPpoint); overload; // procedure NextPoint(var px, py, pz, pc: double); overload; @@ -124,7 +131,7 @@ uses SysUtils, Math; const - EPS = 1E-10; + EPS: double = 1E-10; procedure SinCos(const Theta: double; var Sin, Cos: double); // I'm not sure, but maybe it'll help... asm @@ -139,12 +146,21 @@ end; /////////////////////////////////////////////////////////////////////////////// constructor TXForm.Create; +begin + AddRegVariations; + BuildFunctionlist; + SetLength(vars, NRLOCVAR + Length(FRegVariations)); + + Clear; +end; + +procedure TXForm.Clear; var i: Integer; begin density := 0; - Color := 0; - Symmetry := 0; + color := 0; + symmetry := 0; c[0, 0] := 1; c[0, 1] := 0; @@ -160,13 +176,9 @@ begin p[2, 0] := 0; p[2, 1] := 0; - AddRegVariations; - BuildFunctionlist; - - SetLength(vars, NRLOCVAR + Length(FRegVariations)); - Vars[0] := 1; + vars[0] := 1; for i := 1 to High(vars) do - Vars[i] := 0; + vars[i] := 0; end; /////////////////////////////////////////////////////////////////////////////// @@ -182,6 +194,9 @@ begin c20 := c[2][0]; c21 := c[2][1]; + colorC1 := (1 + symmetry)/2; + colorC2 := color*(1 - symmetry)/2; + FNrFunctions := 0; for i := 0 to High(FRegVariations) do begin @@ -217,6 +232,15 @@ begin end; end; + waves_f1 := 1 / (sqr(c20) + EPS); + waves_f2 := 1 / (sqr(c21) + EPS); + + rings_dx := sqr(c20) + EPS; + fan_dx := PI * (sqr(c20) + EPS); + fan_dx2 := fan_dx/2; + + cosine_var2 := vars[20]/2; + if (p[0,0]<>1) or (p[0,1]<>0) or(p[1,0]<>0) or (p[1,1]<>1) or (p[2,0]<>0) or (p[2,1]<>0) then begin p00 := p[0][0]; @@ -282,6 +306,9 @@ asm fmul st, st faddp fsqrt + + fadd qword ptr [EPS] // test... + fdiv st(1), st fdiv st(2), st fstp qword ptr [eax + FLength] @@ -304,6 +331,9 @@ asm fmul st, st faddp fsqrt + + fadd qword ptr [EPS] // test... + fdiv st(1), st fdiv st(2), st fstp qword ptr [eax + FLength] @@ -324,39 +354,45 @@ asm fmul qword ptr [eax + p00] faddp fadd qword ptr [eax + p20] - fstp qword ptr [eax + FPx] // + px] + fstp qword ptr [eax + FPx] fmul qword ptr [eax + p01] fld qword ptr [eax + p11] fmulp st(2), st faddp fadd qword ptr [eax + p21] - fstp qword ptr [eax + FPy] // + py] + fstp qword ptr [eax + FPy] fwait end; //--0--//////////////////////////////////////////////////////////////////////// procedure TXForm.Linear; -//begin -// FPx := FPx + vars[0] * FTx; -// FPy := FPy + vars[0] * FTy; +{$ifndef _ASM_} +begin + FPx := FPx + vars[0] * FTx; + FPy := FPy + vars[0] * FTy; +{$else} asm mov edx, [eax + vars] fld qword ptr [edx] - fld st - fmul qword ptr [eax + FTx] + fld qword ptr [eax + FTx] + fmul st, st(1) + fld qword ptr [eax + FTy] + fmulp st(2), st fadd qword ptr [eax + FPx] fstp qword ptr [eax + FPx] - fmul qword ptr [eax + FTy] fadd qword ptr [eax + FPy] fstp qword ptr [eax + FPy] fwait +{$endif} end; //--1--//////////////////////////////////////////////////////////////////////// procedure TXForm.Sinusoidal; -//begin - //FPx := FPx + vars[1] * sin(FTx); - //FPy := FPy + vars[1] * sin(FTy); +{$ifndef _ASM_} +begin + FPx := FPx + vars[1] * sin(FTx); + FPy := FPy + vars[1] * sin(FTy); +{$else} asm mov edx, [eax + vars] fld qword ptr [edx + 1*8] @@ -371,23 +407,43 @@ asm fadd qword ptr [eax + FPy] fstp qword ptr [eax + FPy] fwait +{$endif} end; //--2--//////////////////////////////////////////////////////////////////////// procedure TXForm.Spherical; +{$ifndef _ASM_} var r: double; begin r := vars[2] / (sqr(FTx) + sqr(FTy) + 1E-6); FPx := FPx + FTx * r; FPy := FPy + FTy * r; +{$else} +asm + fld qword ptr [eax + FTy] + fld qword ptr [eax + FTx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fadd qword ptr [EPS] + mov edx, [eax + vars] + fdivr qword ptr [edx + 2*8] + fmul st(2), st + fmulp + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} end; //--3--//////////////////////////////////////////////////////////////////////// procedure TXForm.Swirl; -var - sinr, cosr: double; -begin +{$ifndef _ASM_} { r2 := FTx * FTx + FTy * FTy; c1 := sin(r2); @@ -395,34 +451,45 @@ begin FPx := FPx + vars[3] * (c1 * FTx - c2 * FTy); FPy := FPy + vars[3] * (c2 * FTx + c1 * FTy); } -// SinCos(sqr(FTx) + sqr(FTy), rsin, rcos); - asm - fld qword ptr [eax + FTx] - fmul st, st +var + sinr, cosr: double; +begin + SinCos(sqr(FTx) + sqr(FTy), sinr, cosr); + FPx := FPx + vars[3] * (sinr * FTx - cosr * FTy); + FPy := FPy + vars[3] * (cosr * FTx + sinr * FTy); +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 3*8] fld qword ptr [eax + FTy] + fld qword ptr [eax + FTx] + fld st(1) + fmul st, st + fld st(1) fmul st, st faddp fsincos - fstp qword ptr [cosr] - fstp qword ptr [sinr] + fld st(1) + fmul st, st(3) + fld st(1) + fmul st, st(5) + fsubp st(1), st + fmul st, st(5) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmulp st(2), st + fmulp st(2), st + faddp + fmulp + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] fwait - end; - FPx := FPx + vars[3] * (sinr * FTx - cosr * FTy); - FPy := FPy + vars[3] * (cosr * FTx + sinr * FTy); +{$endif} end; //--4--//////////////////////////////////////////////////////////////////////// procedure TXForm.Horseshoe; -//var -// a, c1, c2: double; -//begin -// if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then -// a := arctan2(FTx, FTy) -// else -// a := 0.0; -// c1 := sin(FAngle); -// c2 := cos(FAngle); - +{$ifndef _ASM_} // --Z-- he he he... // FTx/FLength FTy/FLength // FPx := FPx + vars[4] * (FSinA * FTx - FCosA * FTy); @@ -430,14 +497,44 @@ procedure TXForm.Horseshoe; var r: double; begin - r := vars[4] / sqrt(sqr(FTx) + sqr(FTy)); + r := vars[4] / (sqrt(sqr(FTx) + sqr(FTy)) + EPS); FPx := FPx + (FTx - FTy) * (FTx + FTy) * r; FPy := FPy + (2*FTx*FTy) * r; +{$else} +asm + fld qword ptr [eax + FTx] + fld qword ptr [eax + FTy] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fsqrt + fadd qword ptr [EPS] + mov edx, [eax + vars] + fdivr qword ptr [edx + 4*8] + fld st(2) + fadd st, st(2) + fld st(3) + fsub st, st(3) + fmulp + fmul st, st(1) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmulp + fmulp + fadd st, st + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} end; //--5--//////////////////////////////////////////////////////////////////////// procedure TXForm.Polar; -{var +{$ifndef _ASM_} +{ +var ny: double; rPI: double; begin @@ -446,9 +543,10 @@ begin FPx := FPx + vars[5] * (FAngle*rPI); FPy := FPy + vars[5] * ny; } -//begin -// FPx := FPx + vars[5] * FAngle / PI; -// FPy := FPy + vars[5] * (sqrt(sqr(FTx) + sqr(FTy)) - 1.0); +begin + FPx := FPx + vars[5] * FAngle / PI; + FPy := FPy + vars[5] * (sqrt(sqr(FTx) + sqr(FTy)) - 1.0); +{$else} asm mov edx, [eax + vars] fld qword ptr [edx + 5*8] @@ -470,18 +568,19 @@ asm fadd qword ptr [eax + FPy] fstp qword ptr [eax + FPy] fwait +{$endif} end; //--6--//////////////////////////////////////////////////////////////////////// procedure TXForm.FoldedHandkerchief; -{ +{$ifndef _ASM_} var r: double; begin r := sqrt(sqr(FTx) + sqr(FTy)); FPx := FPx + vars[6] * sin(FAngle + r) * r; FPy := FPy + vars[6] * cos(FAngle - r) * r; -} +{$else} asm mov edx, [eax + vars] fld qword ptr [edx + 6*8] @@ -506,37 +605,46 @@ asm fadd qword ptr [eax + FPy] fstp qword ptr [eax + FPy] fwait +{$endif} end; //--7--//////////////////////////////////////////////////////////////////////// procedure TXForm.Heart; +{$ifndef _ASM_} var r, sinr, cosr: double; begin -// r := sqrt(sqr(FTx) + sqr(FTy)); -// Sincos(r*FAngle, sinr, cosr); - asm + r := sqrt(sqr(FTx) + sqr(FTy)); + Sincos(r*FAngle, sinr, cosr); + r := r * vars[7]; + FPx := FPx + r * sinr; + FPy := FPy - r * cosr; +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 7*8] fld qword ptr [eax + FTx] fmul st, st fld qword ptr [eax + FTy] fmul st, st faddp fsqrt - fst qword ptr [r] + fmul st(1), st fmul qword ptr [eax + FAngle] fsincos - fstp qword ptr [cosr] - fstp qword ptr [sinr] + fmul st, st(2) + fsubr qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fmulp + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] fwait - end; - r := r * vars[7]; - FPx := FPx + r * sinr; - FPy := FPy - r * cosr; +{$endif} end; //--8--//////////////////////////////////////////////////////////////////////// procedure TXForm.Disc; -{ +{$ifndef _ASM_} var // nx, ny: double; r, sinr, cosr: double; @@ -550,7 +658,7 @@ begin r := vars[8] * FAngle / PI; FPx := FPx + sinr * r; FPy := FPy + cosr * r; -} +{$else} asm mov edx, [eax + vars] fld qword ptr [edx + 8*8] @@ -573,29 +681,43 @@ asm fadd qword ptr [eax + FPx] fstp qword ptr [eax + FPx] fwait +{$endif} end; //--9--//////////////////////////////////////////////////////////////////////// procedure TXForm.Spiral; +{$ifndef _ASM_} var r, sinr, cosr: double; begin r := Flength + 1E-6; -// SinCos(r, sinr, cosr); - asm - fld qword ptr [r] - fsincos - fstp qword ptr [cosr] - fstp qword ptr [sinr] - fwait - end; + SinCos(r, sinr, cosr); r := vars[9] / r; FPx := FPx + (FCosA + sinr) * r; FPy := FPy + (FsinA - cosr) * r; +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 9*8] + fld qword ptr [eax + FLength] + fadd qword ptr [EPS] + fdiv st(1), st + fsincos + fsubr qword ptr [eax + FSinA] + fmul st, st(2) + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fadd qword ptr [eax + FCosA] + fmulp + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fwait +{$endif} end; //--10--/////////////////////////////////////////////////////////////////////// procedure TXForm.Hyperbolic; +{$ifndef _ASM_} { var r: double; @@ -604,28 +726,44 @@ begin FPx := FPx + vars[10] * FSinA / r; FPy := FPy + vars[10] * FCosA * r; } - // --Z-- Yikes!!! SOMEONE SHOULD GO BACK TO SCHOOL!!!!!!! -// Scott Draves, you aren't so cool after all! :-)) -// And did no one niticed it?!! -// After ALL THESE YEARS!!! - // Now watch and learn how to do this WITHOUT calculating sin and cos: begin - FPx := FPx + vars[10] * FTx / (sqr(FTx) + sqr(FTy) + 1E-6); + FPx := FPx + vars[10] * FTx / (sqr(FTx) + sqr(FTy) + EPS); FPy := FPy + vars[10] * FTy; +{$else} +asm + mov edx, [eax + vars] + fld qword ptr [edx + 10*8] + fld qword ptr [eax + FTy] + fld qword ptr [eax + FTx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fadd qword ptr [EPS] + fdivp st(1), st + fmul st, st(2) + fadd qword ptr [eax + FPx] + fstp qword ptr [eax + FPx] + fmulp + fadd qword ptr [eax + FPy] + fstp qword ptr [eax + FPy] + fwait +{$endif} end; //--11--/////////////////////////////////////////////////////////////////////// procedure TXForm.Square; -{ +{$ifndef _ASM_} var sinr, cosr: double; begin SinCos(FLength, sinr, cosr); FPx := FPx + vars[11] * FSinA * cosr; FPy := FPy + vars[11] * FCosA * sinr; -} +{$else} asm mov edx, [eax + vars] fld qword ptr [edx + 11*8] @@ -640,11 +778,13 @@ asm fadd qword ptr [eax + FPy] fstp qword ptr [eax + FPy] fwait +{$endif} end; //--12--/////////////////////////////////////////////////////////////////////// procedure TXForm.Ex; -{var +{$ifndef _ASM_} +var r: double; n0, n1, m0, m1: double; begin @@ -656,7 +796,7 @@ begin r := r * vars[12]; FPx := FPx + r * (m0 + m1); FPy := FPy + r * (m0 - m1); -} +{$else} asm fld qword ptr [eax + FTx] fmul st, st @@ -685,7 +825,6 @@ asm fld st fadd st, st(2) fmul st, st(3) - fadd qword ptr [eax + FPx] fstp qword ptr [eax + FPx] fsubp st(1), st @@ -693,16 +832,17 @@ asm fadd qword ptr [eax + FPy] fstp qword ptr [eax + FPy] fwait +{$endif} end; //--13--/////////////////////////////////////////////////////////////////////// procedure TXForm.Julia; -{ +{$ifndef _ASM_} var a, r: double; sinr, cosr: double; begin - if random > 0.5 then + if random(2) <> 0 then a := FAngle/2 + PI else a := FAngle/2; @@ -710,7 +850,7 @@ begin r := vars[13] * sqrt(sqrt(sqr(FTx) + sqr(FTy))); FPx := FPx + r * cosr; FPy := FPy + r * sinr; -} +{$else} asm fld qword ptr [ebx + FAngle] // assert: self is in ebx fld1 @@ -742,10 +882,12 @@ asm fadd qword ptr [ebx + FPy] fstp qword ptr [ebx + FPy] fwait +{$endif} end; //--14--/////////////////////////////////////////////////////////////////////// procedure TXForm.Bent; +{$ifndef _ASM_} { var nx, ny: double; @@ -769,10 +911,40 @@ begin FPy := FPy + vars[14] * (FTy/2) else FPy := FPy + vars[14] * FTy; +{$else} +// haven't noticed any improvement here... :-/ +asm + mov edx, [eax + vars] + fld qword ptr [edx + 14*8] + fld qword ptr [ebx + FTx] + ftst + fstsw ax + sahf + ja @posx + fadd st, st +@posx: + fmul st, st(1) + fadd qword ptr [ebx + FPx] + fstp qword ptr [ebx + FPx] + fld qword ptr [ebx + FTy] + ftst + fstsw ax + sahf + ja @posy + fld1 + fadd st, st + fdivp st(1), st +@posy: + fmulp + fadd qword ptr [ebx + FPy] + fstp qword ptr [ebx + FPy] + fwait +{$endif} end; //--15--/////////////////////////////////////////////////////////////////////// procedure TXForm.Waves; +{$ifndef _ASM_} { var dx,dy,nx,ny: double; @@ -785,13 +957,38 @@ begin FPy := FPy + vars[15] * ny; } begin - FPx := FPx + vars[15] * (FTx + c10 * sin(FTy / (sqr(c20) + EPS))); - FPy := FPy + vars[15] * (FTy + c11 * sin(FTx / (sqr(c21) + EPS))); + //FPx := FPx + vars[15] * (FTx + c10 * sin(FTy / (sqr(c20) + EPS))); + //FPy := FPy + vars[15] * (FTy + c11 * sin(FTx / (sqr(c21) + EPS))); + FPx := FPx + vars[15] * (FTx + c10 * sin(FTy * waves_f1)); + FPy := FPy + vars[15] * (FTy + c11 * sin(FTx * waves_f2)); +{$else} +asm + mov edx, [ebx + vars] + fld qword ptr [edx + 15*8] + fld qword ptr [ebx + FTy] + fld qword ptr [ebx + FTx] + fld st(1) + fmul qword ptr [ebx + waves_f1] + fsin + fmul qword ptr [ebx + c10] + fadd st, st(1) + fmul st, st(3) + fadd qword ptr [ebx + FPx] + fstp qword ptr [ebx + FPx] + fmul qword ptr [ebx + waves_f2] + fsin + fmul qword ptr [ebx + c11] + faddp + fmulp + fadd qword ptr [ebx + FPy] + fstp qword ptr [ebx + FPy] + fwait +{$endif} end; //--16--/////////////////////////////////////////////////////////////////////// procedure TXForm.Fisheye; -(* +{$ifndef _ASM_} var r: double; begin @@ -808,13 +1005,13 @@ begin // by the way, now we can clearly see that the original author messed X and Y: FPx := FPx + r * FTy; FPy := FPy + r * FTx; -*) +{$else} asm - mov edx, [eax + vars] + mov edx, [ebx + vars] fld qword ptr [edx + 16*8] fadd st, st - fld qword ptr [eax + FTx] - fld qword ptr [eax + FTy] + fld qword ptr [ebx + FTx] + fld qword ptr [ebx + FTy] fld st(1) fmul st, st fld st(1) @@ -831,11 +1028,12 @@ asm fadd qword ptr [ebx + FPy] fstp qword ptr [ebx + FPy] fwait +{$endif} end; //--17--/////////////////////////////////////////////////////////////////////// procedure TXForm.Popcorn; -(* +{$ifndef _ASM_} var dx, dy: double; // nx, ny: double; @@ -852,7 +1050,7 @@ begin // FPy := FPy + vars[17] * ny; FPx := FPx + vars[17] * (FTx + c20 * sin(dx)); FPy := FPy + vars[17] * (FTy + c21 * sin(dy)); -*) +{$else} asm mov edx, [eax + vars] fld qword ptr [edx + 17*8] @@ -884,11 +1082,12 @@ asm fadd qword ptr [ebx + FPy] fstp qword ptr [ebx + FPy] fwait +{$endif} end; //--18--/////////////////////////////////////////////////////////////////////// procedure TXForm.Exponential; -{ +{$ifndef _ASM_} var d: double; sinr, cosr: double; @@ -897,7 +1096,7 @@ begin d := vars[18] * exp(FTx - 1); // --Z-- (e^x)/e = e^(x-1) FPx := FPx + cosr * d; FPy := FPy + sinr * d; -} +{$else} asm fld qword ptr [eax + FTx] fld1 @@ -928,33 +1127,56 @@ asm fadd qword ptr [ebx + FPy] fstp qword ptr [ebx + FPy] fwait +{$endif} end; //--19--/////////////////////////////////////////////////////////////////////// procedure TXForm.Power; +{$ifndef _ASM_} var r: double; -// nx, ny: double; begin -// r := sqrt(FTx * FTx + FTy * FTy); -// sa := sin(FAngle); r := vars[19] * Math.Power(FLength, FSinA); -// nx := r * FCosA; -// ny := r * FSinA; FPx := FPx + r * FCosA; FPy := FPy + r * FSinA; +{$else} +// --Z-- x^y = 2^(y*log2(x)) +asm + fld qword ptr [ebx + FSinA] + fld st + fld qword ptr [ebx + FLength] + fyl2x + fld st + frndint + fsub st(1), st + fxch st(1) + f2xm1 + fld1 + fadd + fscale + fstp st(1) + mov edx, [eax + vars] + fmul qword ptr [edx + 19*8] + fmul st(1), st + fmul qword ptr [ebx + FCosA] + fadd qword ptr [ebx + FPx] + fstp qword ptr [ebx + FPx] + fadd qword ptr [ebx + FPy] + fstp qword ptr [ebx + FPy] + fwait +{$endif} end; //--20--/////////////////////////////////////////////////////////////////////// procedure TXForm.Cosine; +{$ifndef _ASM_} var - vsin2, vcos2: double; + sinr, cosr: double; e1, e2: double; begin // SinCos(FTx * PI, sinr, cosr); // FPx := FPx + vars[20] * cosr * cosh(FTy); // FPy := FPy - vars[20] * sinr * sinh(FTy); -{ SinCos(FTx * PI, sinr, cosr); if FTy = 0 then begin @@ -968,241 +1190,325 @@ begin FPx := FPx + vars[20] * cosr * (e1 + e2)/2; FPy := FPy - vars[20] * sinr * (e1 - e2)/2; end; -} - asm - mov edx, [eax + vars] - fld qword ptr [edx + 20*8] - fld1 - fld1 - faddp - fdivp st(1), st +{$else} +asm fld qword ptr [eax + FTx] fldpi fmulp fsincos - fmul st, st(2) - fstp qword ptr [vcos2] + fld qword ptr [eax + cosine_var2] + fmul st(2), st fmulp - fstp qword ptr [vsin2] + fld qword ptr [eax + FTy] +// --Z-- here goes exp(x) modified to compute both exp(x) and exp(-x) + FLDL2E + FMUL + FLD ST(0) + FRNDINT + FSUB ST(1), ST + fld st + fchs + fld st(2) + fchs + F2XM1 + FLD1 + FADD + FSCALE + FSTP ST(1) + fxch st(2) + F2XM1 + FLD1 + FADD + FSCALE + FST ST(1) +// ----- + fadd st, st(2) + fmulp st(3), st + fsubp st(1), st + fmulp st(2), st + fadd qword ptr [ebx + FPx] + fstp qword ptr [ebx + FPx] + fadd qword ptr [ebx + FPy] // "add" because: + fstp qword ptr [ebx + FPy] // FPy := FPy + vars[20] * sinr * (e2 - e1)/2; fwait - end; - if FTy = 0 then - begin - // sinh(0) = 0, cosh(0) = 1 - FPx := FPx + 2 * vcos2; - end - else begin - // --Z-- sinh() and cosh() both calculate exp(y) and exp(-y) - e1 := exp(FTy); - e2 := exp(-FTy); - FPx := FPx + vcos2 * (e1 + e2); - FPy := FPy - vsin2 * (e1 - e2); - end; +{$endif} end; //--21--/////////////////////////////////////////////////////////////////////// procedure TXForm.Rings; +{$ifndef _ASM_} var r: double; - dx: double; + //dx: double; begin - dx := sqr(c20) + EPS; + //dx := sqr(c20) + EPS; // r := FLength; // r := r + dx - System.Int((r + dx)/(2 * dx)) * 2 * dx - dx + r * (1-dx); // --Z-- ^^^^ heheeeee :-) ^^^^ -// FPx := FPx + vars[21] * r * FCosA; -// FPy := FPy + vars[21] * r * FSinA; r := vars[21] * ( - 2 * FLength - dx * (System.Int((FLength/dx + 1)/2) * 2 + FLength) + 2 * FLength - rings_dx * (System.Int((FLength/rings_dx + 1)/2) * 2 + FLength) ); FPx := FPx + r * FCosA; FPy := FPy + r * FSinA; +{$else} +asm + fld qword ptr [eax + FLength] + fld qword ptr [eax + rings_dx] + fld st(1) + fdiv st, st(1) + fld1 + faddp + fld1 + fld1 + faddp + fdivp st(1), st + call System.@Int + fadd st, st + fadd st, st(2) + fmulp + fsub st, st(1) + fsubp st(1), st + mov edx, [eax + vars] + fmul qword ptr [edx + 21*8] + fld st + fmul qword ptr [eax + FCosA] + fadd qword ptr [ebx + FPx] + fstp qword ptr [ebx + FPx] + fmul qword ptr [eax + FSinA] + fadd qword ptr [ebx + FPy] + fstp qword ptr [ebx + FPy] + fwait +{$endif} end; //--22--/////////////////////////////////////////////////////////////////////// procedure TXForm.Fan; +{$ifndef _ASM_} var -// r, a : double; -// sinr, cosr: double; - dx, dy, dx2: double; + r, a : double; + sinr, cosr: double; + //dx, dy, dx2: double; begin - dy := c21; - dx := PI * (sqr(c20) + EPS); - dx2 := dx/2; + //dy := c21; + //dx := PI * (sqr(c20) + EPS); + //dx2 := dx/2; - if (FAngle+dy - System.Int((FAngle + dy)/dx) * dx) > dx2 then - //a := FAngle - dx2 - asm - fld qword ptr [ebx + FAngle] - fsub qword ptr [dx2] - end +// if (FAngle+c21 - System.Int((FAngle + c21)/fan_dx) * fan_dx) > fan_dx2 then +// if (FAngle + c21)/fan_dx - System.Int((FAngle + c21)/fan_dx) > 0.5 then + if System.Frac((FAngle + c21)/fan_dx) > 0.5 then + a := FAngle - fan_dx2 else - //a := FAngle + dx2; - asm - fld qword ptr [ebx + FAngle] - fadd qword ptr [dx2] - end; -// SinCos(a, sinr, cosr); -// r := vars[22] * sqrt(sqr(FTx) + sqr(FTy)); -// FPx := FPx + r * cosr; -// FPy := FPy + r * sinr; - asm + a := FAngle + fan_dx2; + SinCos(a, sinr, cosr); + r := vars[22] * sqrt(sqr(FTx) + sqr(FTy)); + FPx := FPx + r * cosr; + FPy := FPy + r * sinr; +{$else} +asm + fld qword ptr [ebx + FAngle] + fld st + fadd qword ptr [ebx + c21] + fdiv qword ptr [ebx + fan_dx] +// --Z-- here goes Frac() code from System.pas + FLD ST(0) + SUB ESP,4 + FNSTCW [ESP].Word // save + FNSTCW [ESP+2].Word // scratch + FWAIT + OR [ESP+2].Word, $0F00 // trunc toward zero, full precision + FLDCW [ESP+2].Word + FRNDINT + FWAIT + FLDCW [ESP].Word + ADD ESP,4 + FSUB +// ----- + fadd st, st + fld1 +// fcompp <-- replaced with FCOMIP +// fnstsw ax +// shr ah, 1 +// jnc @else + fcomip st, st(1) + fstp st + //fwait? + ja @else + fsub qword ptr [ebx + fan_dx2] + jmp @skip +@else: + fadd qword ptr [ebx + fan_dx2] +@skip: fsincos - fld qword ptr [ebx + FTx] - fmul st, st - fld qword ptr [ebx + FTy] - fmul st, st + fld qword ptr [ebx + FTx] + fmul st, st + fld qword ptr [ebx + FTy] + fmul st, st faddp fsqrt - mov edx, [ebx + vars] - fmul qword ptr [edx + 22*8] - fmul st(2), st + mov edx, [ebx + vars] + fmul qword ptr [edx + 22*8] + fmul st(2), st fmulp fadd qword ptr [ebx + FPx] fstp qword ptr [ebx + FPx] fadd qword ptr [ebx + FPy] fstp qword ptr [ebx + FPy] fwait - end; +{$endif} end; -(* - //--23--/////////////////////////////////////////////////////////////////////// -procedure TXForm.Triblob; +procedure TXForm.Eyefish; +{$ifndef _ASM_} var - r : double; - Angle: double; - sinr, cosr: double; + r: double; begin - r := sqrt(sqr(FTx) + sqr(FTy)); - if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then - Angle := arctan2(FTx, FTy) - else - Angle := 0.0; - - r := r * (0.6 + 0.4 * sin(3 * Angle)); - SinCos(Angle, sinr, cosr); - - FPx := FPx + vars[23] * r * cosr; - FPy := FPy + vars[23] * r * sinr; + r := 2 * vars[23] / (sqrt(sqr(FTx) + sqr(FTy)) + 1); + FPx := FPx + r * FTx; + FPy := FPy + r * FTy; +{$else} +asm + mov edx, [ebx + vars] + fld qword ptr [edx + 23*8] + fadd st, st + fld qword ptr [ebx + FTy] + fld qword ptr [ebx + FTx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + faddp + fsqrt + fld1 + faddp + fdivp st(3), st + fmul st, st(2) + fadd qword ptr [ebx + FPx] + fstp qword ptr [ebx + FPx] + fmulp + fadd qword ptr [ebx + FPy] + fstp qword ptr [ebx + FPy] + fwait +{$endif} end; //--24--/////////////////////////////////////////////////////////////////////// -procedure TXForm.Daisy; +procedure TXForm.Bubble; +{$ifndef _ASM_} var - r : double; - Angle: double; - sinr, cosr: double; + r: double; begin - r := sqrt(sqr(FTx) + sqr(FTy)); - if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then - Angle := arctan2(FTx, FTy) - else - Angle := 0.0; + r := vars[24] / ((sqr(FTx) + sqr(FTy))/4 + 1); -// r := r * (0.6 + 0.4 * sin(3 * Angle)); - r := r * ( 1 - Sqr(sin(5 * Angle))); - SinCos(Angle, sinr, cosr); - - FPx := FPx + vars[24] * r * cosr; - FPy := FPy + vars[24] * r * sinr; + FPx := FPx + r * FTx; + FPy := FPy + r * FTy; +{$else} +asm + fld qword ptr [ebx + FTy] + fld qword ptr [ebx + FTx] + fld st(1) + fmul st, st + fld st(1) + fmul st, st + fadd + fld1 + fadd st, st + fadd st, st + fdivp st(1), st + fld1 + fadd + mov edx, [ebx + vars] + fdivr qword ptr [edx + 24*8] + fmul st(2), st + fmulp + fadd qword ptr [ebx + FPx] + fstp qword ptr [ebx + FPx] + fadd qword ptr [ebx + FPy] + fstp qword ptr [ebx + FPy] + fwait +{$endif} end; //--25--/////////////////////////////////////////////////////////////////////// -procedure TXForm.Checkers; -var - dx: double; +procedure TXForm.Cylinder; +{$ifndef _ASM_} begin - if odd(Round(FTX * 5) + Round(FTY * 5)) then - dx := 0.2 - else - dx := 0; - - FPx := FPx + vars[25] * FTx + dx; + FPx := FPx + vars[25] * sin(FTx); FPy := FPy + vars[25] * FTy; +{$else} +asm + mov edx, [ebx + vars] + fld qword ptr [edx + 25*8] + fld qword ptr [ebx + FTx] + fsin + fld qword ptr [ebx + FTy] + fmul st, st(2) + fadd qword ptr [ebx + FPy] + fstp qword ptr [ebx + FPy] + fmulp + fadd qword ptr [ebx + FPx] + fstp qword ptr [ebx + FPx] + fwait +{$endif} end; //--26--/////////////////////////////////////////////////////////////////////// -procedure TXForm.CRot; -var - r : double; - Angle: double; - sinr, cosr: double; +procedure TXForm.Smoke; +const + amplitude: single = 0.353553390593274; // a = sqrt(2)/4 +{$ifndef _ASM_} begin - r := sqrt(sqr(FTx) + sqr(FTy)); - if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then - Angle := arctan2(FTx, FTy) - else - Angle := 0.0; - - if r < 3 then - Angle := Angle + (3 - r) * sin(3 * r); - SinCos(Angle, sinr, cosr); - -// r:= R - 0.04 * sin(6.2 * R - 1) - 0.008 * R; - - FPx := FPx + vars[26] * r * cosr; - FPy := FPy + vars[26] * r * sinr; + FPx := FPx + vars[26] * (FTx + amplitude * sin(FTy * pi)); + FPy := FPy + vars[26] * (FTy + amplitude * sin(FTx * pi)); +{$else} +asm + mov edx, [ebx + vars] + fld qword ptr [edx + 26*8] + fld dword ptr [amplitude] + fld qword ptr [ebx + FTy] + fldpi + fld qword ptr [ebx + FTx] + fld st(2) + fmul st, st(2) + fsin + fmul st, st(4) + fadd st, st(1) + fmul st, st(5) + fadd qword ptr [ebx + FPx] + fstp qword ptr [ebx + FPx] + fmulp + fsin + fmulp st(2), st + faddp + fmulp + fadd qword ptr [ebx + FPy] + fstp qword ptr [ebx + FPy] + fwait +{$endif} end; -*) - //***************************************************************************// -procedure TXForm.PreviewPoint(var px, py: double); -var - i: Integer; -begin - FTx := c00 * px + c10 * py + c20; - FTy := c01 * px + c11 * py + c21; - - Fpx := 0; - Fpy := 0; - - for i := 0 to FNrFunctions - 1 do - FCalcFunctionList[i]; - - px := FPx; - py := FPy; -end; - procedure TXForm.NextPoint(var px, py, pc: double); var i: Integer; begin // first compute the color coord - if symmetry = 0 then - pc := (pc + color) / 2 - else - pc := (pc + color) * 0.5 * (1 - symmetry) + symmetry * pc; +// --Z-- no, first let's optimize this huge expression ;) +// pc := (pc + color) * 0.5 * (1 - symmetry) + symmetry * pc; +// = (pc + color)/2 - (pc + color)/2*symmetry + symmetry * pc; +// = (pc + color)/2 - (pc + color)*symmetry/2 + 2*pc*symmetry/2 +// = (pc + color - pc*symmetry - color*symmetry + 2*pc*symmetry)/2 +// = (pc + pc*symmetry + color - color*symmetry)/2 +// = (pc*(1 + symmetry) + color*(1 - symmetry))/2; +// ---> = pc*(1 + symmetry)/2 + color*(1 - symmetry)/2; +// ^^^^^^const^^^^^ ^^^^^^^^^const^^^^^^^^ + pc := pc * colorC1 + colorC2; // heh! :-) FTx := c00 * px + c10 * py + c20; FTy := c01 * px + c11 * py + c21; -(* - if CalculateAngle then begin - if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then - FAngle := arctan2(FTx, FTy) - else - FAngle := 0.0; - end; - if CalculateSinCos then begin - Flength := sqrt(sqr(FTx) + sqr(FTy)); - if FLength = 0 then begin - FSinA := 0; - FCosA := 0; - end else begin - FSinA := FTx/FLength; - FCosA := FTy/FLength; - end; - end; - -// if CalculateLength then begin -// FLength := sqrt(FTx * FTx + FTy * FTy); -// end; -*) Fpx := 0; Fpy := 0; @@ -1221,43 +1527,17 @@ var i: Integer; begin // first compute the color coord - if symmetry = 0 then - CPpoint.c := (CPpoint.c + color) / 2 - else - CPpoint.c := (CPpoint.c + color) * 0.5 * (1 - symmetry) + symmetry * CPpoint.c; +// CPpoint.c := (CPpoint.c + color) * 0.5 * (1 - symmetry) + symmetry * CPpoint.c; + CPpoint.c := CPpoint.c * colorC1 + colorC2; FTx := c00 * CPpoint.x + c10 * CPpoint.y + c20; FTy := c01 * CPpoint.x + c11 * CPpoint.y + c21; -(* - if CalculateAngle then begin - if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then - FAngle := arctan2(FTx, FTy) - else - FAngle := 0.0; - end; - - if CalculateSinCos then begin - Flength := sqrt(sqr(FTx) + sqr(FTy)); - if FLength = 0 then begin - FSinA := 0; - FCosA := 1; - end else begin - FSinA := FTx/FLength; - FCosA := FTy/FLength; - end; - end; - -// if CalculateLength then begin -// FLength := sqrt(FTx * FTx + FTy * FTy); -// end; -*) - Fpx := 0; Fpy := 0; for i:= 0 to FNrFunctions-1 do - FFunctionList[i]; + FCalcFunctionList[i]; CPpoint.x := FPx; CPpoint.y := FPy; @@ -1349,41 +1629,19 @@ var i: Integer; begin // first compute the color coord - pc1 := (pc1 + color) * 0.5 * (1 - symmetry) + symmetry * pc1; - pc2 := (pc2 + color) * 0.5 * (1 - symmetry) + symmetry * pc2; +// pc1 := (pc1 + color) * 0.5 * (1 - symmetry) + symmetry * pc1; +// pc2 := (pc2 + color) * 0.5 * (1 - symmetry) + symmetry * pc2; + pc1 := pc1 * colorC1 + colorC2; + pc2 := pc2 * colorC1 + colorC2; FTx := c00 * px + c10 * py + c20; FTy := c01 * px + c11 * py + c21; -(* - if CalculateAngle then begin - if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then - FAngle := arctan2(FTx, FTy) - else - FAngle := 0.0; - end; - - if CalculateSinCos then begin - Flength := sqrt(sqr(FTx) + sqr(FTy)); - if FLength = 0 then begin - FSinA := 0; - FCosA := 1; - end else begin - FSinA := FTx/FLength; - FCosA := FTy/FLength; - end; - end; - -// if CalculateLength then begin -// FLength := sqrt(FTx * FTx + FTy * FTy); -// end; -*) - Fpx := 0; Fpy := 0; for i:= 0 to FNrFunctions-1 do - FFunctionList[i]; + FCalcFunctionList[i]; px := FPx; py := FPy; @@ -1399,31 +1657,11 @@ begin FTx := c00 * px + c10 * py + c20; FTy := c01 * px + c11 * py + c21; -(* - if CalculateAngle then begin - if (FTx < -EPS) or (FTx > EPS) or (FTy < -EPS) or (FTy > EPS) then - FAngle := arctan2(FTx, FTy) - else - FAngle := 0.0; - end; - - if CalculateSinCos then begin - Flength := sqrt(sqr(FTx) + sqr(FTy)); - if FLength = 0 then begin - FSinA := 0; - FCosA := 0; - end else begin - FSinA := FTx/FLength; - FCosA := FTy/FLength; - end; - end; -*) - Fpx := 0; Fpy := 0; for i:= 0 to FNrFunctions-1 do - FFunctionList[i]; + FCalcFunctionList[i]; px := FPx; py := FPy; @@ -1607,15 +1845,14 @@ begin FFunctionList[20] := Cosine; FFunctionList[21] := Rings; FFunctionList[22] := Fan; - -// FFunctionList[23] := Triblob; -// FFunctionList[24] := Daisy; -// FFunctionList[25] := Checkers; -// FFunctionList[26] := CRot; + FFunctionList[23] := Eyefish; + FFunctionList[24] := Bubble; + FFunctionList[25] := Cylinder; + FFunctionList[26] := Smoke; //registered for i := 0 to High(FRegVariations) do - FFunctionList[23 + i] := FRegVariations[i].CalcFunction; + FFunctionList[NRLOCVAR + i] := FRegVariations[i].CalcFunction; end; /////////////////////////////////////////////////////////////////////////////// diff --git a/2.10/Source/XFormMan.pas b/2.10/Source/XFormMan.pas index ab7617b..d0f4bfc 100644 --- a/2.10/Source/XFormMan.pas +++ b/2.10/Source/XFormMan.pas @@ -6,7 +6,7 @@ uses BaseVariation; const - NRLOCVAR = 23; + NRLOCVAR = 27; function NrVar: integer; function Varnames(const index: integer): String; @@ -57,7 +57,11 @@ const 'power', 'cosine', 'rings', - 'fan' + 'fan', + 'eyefish', + 'bubble', + 'cylinder', + 'smoke' ); begin if Index < NRLOCVAR then diff --git a/2.10/Source/formPostProcess.dfm b/2.10/Source/formPostProcess.dfm index 347f216..baf2898 100644 --- a/2.10/Source/formPostProcess.dfm +++ b/2.10/Source/formPostProcess.dfm @@ -1,8 +1,8 @@ object frmPostProcess: TfrmPostProcess - Left = 0 - Top = 0 - Width = 434 - Height = 320 + Left = 38 + Top = 43 + Width = 640 + Height = 534 Caption = 'Post Render' Color = clBtnFace Font.Charset = DEFAULT_CHARSET @@ -19,14 +19,14 @@ object frmPostProcess: TfrmPostProcess object Panel1: TPanel Left = 0 Top = 0 - Width = 426 - Height = 149 + Width = 632 + Height = 71 Align = alTop BevelOuter = bvLowered TabOrder = 0 DesignSize = ( - 426 - 149) + 632 + 71) object Label1: TLabel Left = 12 Top = 12 @@ -42,36 +42,36 @@ object frmPostProcess: TfrmPostProcess Caption = 'Filter' end object Label3: TLabel - Left = 12 - Top = 52 + Left = 172 + Top = 12 Width = 35 Height = 13 Caption = 'Gamma' end object Label4: TLabel - Left = 12 - Top = 72 + Left = 332 + Top = 32 Width = 45 Height = 13 Caption = 'Vibrancy:' end object Label5: TLabel - Left = 12 - Top = 92 + Left = 332 + Top = 12 Width = 42 Height = 13 Caption = 'Contrast' end object Label6: TLabel - Left = 12 - Top = 112 + Left = 172 + Top = 32 Width = 50 Height = 13 Caption = 'Brightness' end object btnSave: TButton - Left = 340 - Top = 36 + Left = 552 + Top = 30 Width = 75 Height = 25 Anchors = [akTop, akRight] @@ -82,7 +82,7 @@ object frmPostProcess: TfrmPostProcess object pnlBackColor: TPanel Left = 104 Top = 8 - Width = 97 + Width = 57 Height = 21 BevelOuter = bvLowered TabOrder = 0 @@ -90,15 +90,15 @@ object frmPostProcess: TfrmPostProcess end object ProgressBar1: TProgressBar Left = 1 - Top = 136 - Width = 424 + Top = 58 + Width = 630 Height = 12 Align = alBottom TabOrder = 1 end object btnApply: TButton - Left = 340 - Top = 8 + Left = 552 + Top = 4 Width = 75 Height = 25 Anchors = [akTop, akRight] @@ -110,44 +110,44 @@ object frmPostProcess: TfrmPostProcess object txtFilterRadius: TEdit Left = 104 Top = 28 - Width = 97 + Width = 57 Height = 21 TabOrder = 2 end object txtGamma: TEdit - Left = 104 - Top = 48 - Width = 97 + Left = 264 + Top = 8 + Width = 57 Height = 21 TabOrder = 3 end object txtVib: TEdit - Left = 104 - Top = 68 - Width = 97 + Left = 424 + Top = 28 + Width = 57 Height = 21 TabOrder = 4 end object txtContrast: TEdit - Left = 104 - Top = 88 - Width = 97 + Left = 424 + Top = 8 + Width = 57 Height = 21 TabOrder = 5 end object txtBrightness: TEdit - Left = 104 - Top = 108 - Width = 97 + Left = 264 + Top = 28 + Width = 57 Height = 21 TabOrder = 6 end end object ScrollBox1: TScrollBox Left = 0 - Top = 149 - Width = 426 - Height = 137 + Top = 71 + Width = 632 + Height = 435 Align = alClient TabOrder = 1 object Image: TImage @@ -159,7 +159,7 @@ object frmPostProcess: TfrmPostProcess end end object ColorDialog: TColorDialog - Left = 284 - Top = 4 + Left = 508 + Top = 20 end end