2022-03-08 12:25:51 -05:00
|
|
|
{
|
|
|
|
Apophysis Copyright (C) 2001-2004 Mark Townsend
|
|
|
|
Apophysis Copyright (C) 2005-2006 Ronald Hordijk, Piotr Borys, Peter Sdobnov
|
|
|
|
Apophysis Copyright (C) 2007-2008 Piotr Borys, Peter Sdobnov
|
|
|
|
|
|
|
|
Apophysis "3D hack" Copyright (C) 2007-2008 Peter Sdobnov
|
|
|
|
Apophysis "7X" Copyright (C) 2009-2010 Georg Kiehne
|
2022-06-23 06:22:32 -04:00
|
|
|
Apophysis AV "Phoenix Edition" Copyright (C) 2021-2022 Alice V. Koryagina
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
This program is free software; you can redistribute it and/or modify
|
|
|
|
it under the terms of the GNU General Public License as published by
|
|
|
|
the Free Software Foundation; either version 2 of the License, or
|
|
|
|
(at your option) any later version.
|
|
|
|
|
|
|
|
This program is distributed in the hope that it will be useful,
|
|
|
|
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
|
|
|
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
|
|
|
GNU General Public License for more details.
|
|
|
|
|
|
|
|
You should have received a copy of the GNU General Public License
|
|
|
|
along with this program; if not, write to the Free Software
|
|
|
|
Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
|
|
|
|
}
|
|
|
|
unit ScriptForm;
|
|
|
|
|
|
|
|
interface
|
|
|
|
|
|
|
|
uses
|
|
|
|
Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms, Dialogs,
|
2022-06-23 06:22:32 -04:00
|
|
|
ExtCtrls, StdCtrls, ControlPoint, Buttons, ComCtrls, ToolWin, Menus, Math,
|
|
|
|
XFormMan, XForm, GradientHlpr, cmap, LibXmlParser, LibXmlComps, Translation,
|
|
|
|
atScript, atPascal, Vcl.ScripterInit, ScrMemo, Scrmps, ScrCodeList;
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
const
|
|
|
|
NCPS = 10; // AV: max number of flames for animation
|
|
|
|
scriptFavsFilename = 'scriptsAV.fav';
|
|
|
|
|
|
|
|
type
|
|
|
|
TOptions = class
|
|
|
|
public
|
2022-06-23 06:22:32 -04:00
|
|
|
{ TOptions class is used only as an interface to user's preferencies }
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
TFlame = class
|
|
|
|
public
|
2022-06-23 06:22:32 -04:00
|
|
|
{ The TFlame class is used only as an interface. The control point parameters
|
|
|
|
are read and set directly. Parameter ranges aren't limited but values not
|
|
|
|
in the correct range are ignored. }
|
|
|
|
end;
|
|
|
|
TTransform = class
|
|
|
|
public
|
|
|
|
{ TTransform class only serves as an interface to active transform }
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
TScriptRender = class
|
|
|
|
public
|
|
|
|
MaxMemory, Width, Height: integer;
|
|
|
|
Filename: string;
|
|
|
|
EmbedParameters: boolean; // AV: to write flame params into PNG
|
|
|
|
end;
|
|
|
|
TPivot = class
|
|
|
|
public
|
2022-06-23 06:22:32 -04:00
|
|
|
{ TPivot class only serves as an interface to active transform's pivot point }
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
TScriptEditor = class(TForm)
|
|
|
|
MainOpenDialog: TOpenDialog;
|
|
|
|
MainSaveDialog: TSaveDialog;
|
|
|
|
ToolBar: TToolBar;
|
|
|
|
btnOpen: TToolButton;
|
|
|
|
btnSave: TToolButton;
|
|
|
|
btnRun: TToolButton;
|
|
|
|
StatusBar: TStatusBar;
|
|
|
|
btnNew: TToolButton;
|
|
|
|
PopupMenu: TPopupMenu;
|
|
|
|
mnuCut: TMenuItem;
|
|
|
|
mnuCopy: TMenuItem;
|
|
|
|
mnuPaste: TMenuItem;
|
|
|
|
mnuUndo: TMenuItem;
|
|
|
|
N1: TMenuItem;
|
|
|
|
BackPanel: TPanel;
|
|
|
|
Editor: TScrMemo;
|
2022-06-23 06:22:32 -04:00
|
|
|
Scripter: TatPascalScripter;
|
2022-03-08 12:25:51 -05:00
|
|
|
Splitter1: TSplitter;
|
|
|
|
Console: TMemo;
|
|
|
|
btnStop: TToolButton;
|
|
|
|
btnBreak: TToolButton;
|
|
|
|
OpenDialog: TOpenDialog;
|
|
|
|
SaveDialog: TSaveDialog;
|
|
|
|
Styler: TScrPascalMemoStyler;
|
|
|
|
Panel1: TPanel;
|
|
|
|
ScrCodeList1: TScrCodeList;
|
|
|
|
CodeButton: TToolButton;
|
|
|
|
btnPause: TToolButton;
|
|
|
|
ScrMemoFindReplaceDialog1: TScrMemoFindReplaceDialog;
|
|
|
|
FindReplace: TMenuItem;
|
|
|
|
N2: TMenuItem;
|
|
|
|
ShowCodeHints: TMenuItem;
|
|
|
|
N3: TMenuItem;
|
|
|
|
CommentOut: TMenuItem;
|
|
|
|
N4: TMenuItem;
|
|
|
|
N5: TMenuItem;
|
|
|
|
N6: TMenuItem;
|
|
|
|
SurroundBlock: TMenuItem;
|
|
|
|
N7: TMenuItem;
|
|
|
|
BeginEnd1: TMenuItem;
|
|
|
|
TryExcept1: TMenuItem;
|
|
|
|
mnuRedo: TMenuItem;
|
|
|
|
AddFromClipboard: TMenuItem;
|
|
|
|
CodeBlockPopup: TPopupMenu;
|
|
|
|
mnuDeleteBlock: TMenuItem;
|
|
|
|
Editcaption1: TMenuItem;
|
|
|
|
btnFavorite: TToolButton;
|
|
|
|
N8: TMenuItem;
|
|
|
|
CollapseBlocks: TMenuItem;
|
|
|
|
ExpandBlocks: TMenuItem;
|
|
|
|
procedure F2SXMLStartTag(Sender: TObject; TagName: string;
|
|
|
|
Attributes: TAttrList);
|
|
|
|
procedure F2SXMLEmptyTag(Sender: TObject; TagName: string;
|
|
|
|
Attributes: TAttrList);
|
|
|
|
procedure F2SXMLContent(Sender: TObject; Content: string);
|
|
|
|
// procedure FormShortCut(var Msg: TWMKey; var Handled: Boolean);
|
|
|
|
procedure FormCreate(Sender: TObject);
|
|
|
|
procedure FormDestroy(Sender: TObject);
|
|
|
|
procedure FormShow(Sender: TObject);
|
|
|
|
procedure btnOpenClick(Sender: TObject);
|
|
|
|
procedure btnSaveClick(Sender: TObject);
|
|
|
|
procedure btnRunClick(Sender: TObject);
|
|
|
|
procedure btnNewClick(Sender: TObject);
|
|
|
|
procedure mnuCutClick(Sender: TObject);
|
|
|
|
procedure mnuCopyClick(Sender: TObject);
|
|
|
|
procedure mnuPasteClick(Sender: TObject);
|
|
|
|
procedure mnuUndoClick(Sender: TObject);
|
|
|
|
procedure EditorChange(Sender: TObject);
|
|
|
|
procedure FormClose(Sender: TObject; var Action: TCloseAction);
|
|
|
|
procedure ScripterCompileError(Sender: TObject; var msg: string; row,
|
|
|
|
col: Integer; var ShowException: Boolean);
|
|
|
|
procedure btnStopClick(Sender: TObject);
|
|
|
|
procedure btnBreakClick(Sender: TObject);
|
|
|
|
procedure btnFavoriteClick(Sender: TObject);
|
|
|
|
procedure EditorGetAutoCompletionList(Sender: TObject; AToken: string;
|
|
|
|
AList: TStringList);
|
|
|
|
procedure ScrCodeList1DragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
|
|
procedure ScrCodeList1DragOver(Sender, Source: TObject; X, Y: Integer;
|
|
|
|
State: TDragState; var Accept: Boolean);
|
|
|
|
procedure EditorDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
|
|
procedure EditorDragOver(Sender, Source: TObject; X, Y: Integer;
|
|
|
|
State: TDragState; var Accept: Boolean);
|
|
|
|
procedure CodeButtonClick(Sender: TObject);
|
|
|
|
procedure btnPauseClick(Sender: TObject);
|
|
|
|
procedure ScripterRuntimeError(Sender: TObject; var msg: string; row,
|
|
|
|
col: Integer; var ShowException: Boolean);
|
|
|
|
procedure FindReplaceClick(Sender: TObject);
|
|
|
|
procedure ShowCodeHintsClick(Sender: TObject);
|
|
|
|
procedure SurroundByClick(Sender: TObject);
|
|
|
|
procedure mnuRedoClick(Sender: TObject);
|
|
|
|
procedure ScrCodeList1BlockDblClick(Sender: TObject;
|
|
|
|
ACodeBlock: TCodeBlock);
|
|
|
|
procedure AddFromClipboardClick(Sender: TObject);
|
|
|
|
procedure mnuDeleteBlockClick(Sender: TObject);
|
|
|
|
procedure ScrCodeList1BlockRightClick(Sender: TObject;
|
|
|
|
ACodeBlock: TCodeBlock);
|
|
|
|
procedure ScrCodeList1ContextPopup(Sender: TObject; MousePos: TPoint;
|
|
|
|
var Handled: Boolean);
|
|
|
|
procedure Editcaption1Click(Sender: TObject);
|
|
|
|
procedure CollapseBlocksClick(Sender: TObject);
|
|
|
|
procedure ExpandBlocksClick(Sender: TObject);
|
2022-06-23 06:22:32 -04:00
|
|
|
private
|
|
|
|
//cmap: TColorMap;
|
2022-03-08 12:25:51 -05:00
|
|
|
Flame: TFlame;
|
2022-06-23 06:22:32 -04:00
|
|
|
Transform: TTransform;
|
2022-03-08 12:25:51 -05:00
|
|
|
Options: TOptions;
|
|
|
|
Pivot: TPivot;
|
|
|
|
Another: TScriptRender;
|
|
|
|
|
|
|
|
{ Flame interface }
|
|
|
|
procedure SetFlameNameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameNameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameHueProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameHueProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameGammaProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameGammaProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameGammaThresholdProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameGammaThresholdProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameBrightnessProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameBrightnessProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameVibrancyProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameVibrancyProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameContrastProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameContrastProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameTimeProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameTimeProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameDensityProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameDensityProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameOversampleProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameOversampleProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameFilterRadiusProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameFilterRadiusProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameZoomProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameZoomProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameXProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameXProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameYProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameYProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlamePixelsPerUnitProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlamePixelsPerUnitProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlamePaletteProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlamePaletteProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameBackgroundProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameBackgroundProc(AMachine: TatVirtualMachine);
|
2022-06-23 06:22:32 -04:00
|
|
|
procedure GetFlameCommentProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameCommentProc(AMachine: TatVirtualMachine);
|
2022-03-08 12:25:51 -05:00
|
|
|
// procedure SetFlameNickProc(AMachine: TatVirtualMachine);
|
|
|
|
// procedure GetFlameNickProc(AMachine: TatVirtualMachine);
|
|
|
|
// procedure SetFlameURLProc(AMachine: TatVirtualMachine);
|
|
|
|
// procedure GetFlameURLProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameBatchesProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameBatchesProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameFinalxformEnabledProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameFinalxformEnabledProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameSoloXformProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameSoloXformProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameAngleProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameAngleProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlamePitchProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlamePitchProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameRollProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameRollProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameYawProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameYawProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameCamZposProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameCamZposProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlamePerspectiveProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlamePerspectiveProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameDOFProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFlameDOFProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
procedure GetPreviewHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetPreviewHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetPreviewWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetPreviewWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
{ Transform interface }
|
|
|
|
procedure GetTransformAProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformAProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformBProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformBProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformCProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformCProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformDProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformDProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformEProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformEProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformFProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformFProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformVarProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformVarProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformVariProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformVariProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
procedure GetTransformChaosProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformChaosProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformPlotModeProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformPlotModeProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformOpacityProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformOpacityProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
procedure GetTransformColorProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformColorProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformVarColorProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformVarColorProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformWeightProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformWeightProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformSymProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformSymProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
// AV: something new
|
|
|
|
procedure GetTransformNameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformNameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformSwapCoefsProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformResetVariables(AMachine: TatVirtualMachine);
|
|
|
|
// AV: variation order editing
|
|
|
|
procedure TransformMoveVarProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformExchangeVarsProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformCopyVarOrderProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformSortVarsProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformDefaultVarOrderProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformGetVarOrderProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformDisplayVarsProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
procedure GetTransformVariationProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformVariationProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformVariableProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformVariableProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
procedure GetTransformCoefsProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformCoefsProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformPostCoefsProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformPostCoefsProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
procedure TransformClearProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformRotateProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformScaleProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformRotateOriginProc(AMachine: TatVirtualMachine);
|
2022-06-23 06:22:32 -04:00
|
|
|
|
2022-03-08 12:25:51 -05:00
|
|
|
// AV: added reflections
|
|
|
|
procedure TransformFlipHorizProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformFlipVertProc(AMachine: TatVirtualMachine);
|
|
|
|
// AV: post-affine transformations
|
|
|
|
procedure TransformRotatePXOriginProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformRotatePXProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformFlipPXHorizProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformFlipPXVertProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TransformScalePXProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransformPostxformEnabledProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransformPostxformEnabledProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
{ Render interface }
|
|
|
|
procedure GetRenderFilenameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetRenderFilenameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetRenderWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetRenderWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetRenderHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetRenderHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetRenderMaxMemoryProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetRenderMaxMemoryProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetRenderEmbedParams(AMachine: TatVirtualMachine); // AV
|
|
|
|
procedure SetRenderEmbedParams(AMachine: TatVirtualMachine); // AV
|
|
|
|
procedure FillFileList;
|
|
|
|
|
|
|
|
{ Options interface }
|
|
|
|
procedure GetJPEGQuality(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetJPEGQuality(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMultithreading(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMultithreading(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetBatchSize(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetBatchSize(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetParameterFile(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetParameterFile(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetSmoothPaletteFile(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetSmoothPaletteFile(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetNumTries(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetNumTries(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTryLength(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTryLength(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetConfirmDelete(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetConfirmDelete(AMachine: TatVirtualMachine);
|
|
|
|
// procedure GetFixedReference(AMachine: TatVirtualMachine);
|
|
|
|
// procedure SetFixedReference(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetSampleDensity(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetSampleDensity(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetGamma(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetGamma(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetGammaThreshold(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetGammaThreshold(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetRandomGradientFile(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetRandomGradientFile(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetBrightness(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetBrightness(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetContrast(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetContrast(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetVibrancy(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetVibrancy(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetOversample(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetOversample(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFilterRadius(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetFilterRadius(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetTransparency(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetTransparency(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetLowQuality(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetLowQuality(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMediumQuality(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMediumQuality(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetHighQuality(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetHighQuality(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMinTransforms(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMinTransforms(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMaxTransforms(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMaxTransforms(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMutateMinTransforms(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMutateMinTransforms(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMutateMaxTransforms(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMutateMaxTransforms(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetPrefix(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetPrefix(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetKeepBackground(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetKeepBackground(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetSymmetryType(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetSymmetryType(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetSymmetryOrder(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetSymmetryOrder(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetVariations(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetVariations(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetRandomGradient(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetRandomGradient(AMachine: TatVirtualMachine);
|
|
|
|
// AV: new gradient options
|
|
|
|
procedure GetGradientBlending(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetGradientBlending(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetEqualGradient(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetEqualGradient(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMinNodes(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMinNodes(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMaxNodes(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMaxNodes(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMinHue(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMinHue(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMaxHue(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMaxHue(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMinSat(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMinSat(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMaxSat(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMaxSat(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMinLum(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMinLum(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetMaxLum(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetMaxLum(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetUPRSampleDensity(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetUPRSampleDensity(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetUPROversample(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetUPROversample(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetUPRFilterRadius(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetUPRFilterRadius(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetUPRColoringIdent(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetUPRColoringIdent(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetUPRColoringFile(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetUPRColoringFile(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetUPRFormulaIdent(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetUPRFormulaIdent(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetUPRFormulaFile(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetUPRFormulaFile(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetUPRAdjustDensity(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetUPRAdjustDensity(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetUPRWidth(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetUPRWidth(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetUPRHeight(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetUPRHeight(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetExportPath(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetExportPath(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
{ Pivot interface }
|
|
|
|
procedure GetPivotModeProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetPivotModeProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetPivotXProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetPivotXProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetPivotYProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetPivotYProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetPivotProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure ResetPivotProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
// AV: moved here from TOperationLibrary
|
|
|
|
procedure CopyFileProc(AMachine: TatVirtualMachine);
|
|
|
|
public
|
2022-06-23 06:22:32 -04:00
|
|
|
cp: TControlPoint;
|
|
|
|
Stopped: boolean;
|
|
|
|
Renderer: TScriptRender;
|
|
|
|
|
|
|
|
procedure LoadRunAndClear(scriptFile:string);
|
|
|
|
procedure LoadScriptFile(filename:string);
|
|
|
|
procedure ScriptFromFlame(flameXML:string);
|
|
|
|
procedure UpdateFlame;
|
|
|
|
procedure PrepareScripter;
|
|
|
|
procedure OpenScript;
|
|
|
|
procedure RunScript;
|
|
|
|
procedure AdjustScripterColors;
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
|
|
|
// TMatrix = array[0..2, 0..2] of double; // AV: we already have such a type
|
2022-06-23 06:22:32 -04:00
|
|
|
EFormatInvalid = class(Exception);
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
var
|
|
|
|
ScriptEditor: TScriptEditor;
|
2022-06-23 06:22:32 -04:00
|
|
|
ScFileList: TStringList; // AV: renamed due to sporadic name-space conflicts
|
2022-03-08 12:25:51 -05:00
|
|
|
LastError: string;
|
|
|
|
|
|
|
|
implementation
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
uses
|
|
|
|
Main, Editor, Adjust, Global, Mutate, Registry, Preview, LoadTracker,
|
|
|
|
ScriptRender, ap_math, ap_classes, ap_sysutils, ap_Dialogs, ap_windows,
|
|
|
|
ap_FileCtrl, ap_Forms;
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
{$R *.DFM}
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
var
|
|
|
|
ErrorOutOfRange, RTError, DTError: string; // AV
|
|
|
|
chaosLines : TStringList;
|
|
|
|
cps: array[0..NCPS - 1] of TControlPoint;
|
|
|
|
ResetLocation, UpdateIt: Boolean;
|
|
|
|
NumTransforms: integer; // Keeps track of number of xforms in flame.
|
|
|
|
ActiveTransform: integer; // Operations affect this transform.
|
|
|
|
ParamFile: string;
|
|
|
|
AddedXForms : integer;
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
type
|
|
|
|
TOperationLibrary = class(TatScripterLibrary)
|
|
|
|
protected
|
|
|
|
procedure RotateFlameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure RotateReferenceProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure RotateProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure ScaleProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure MulProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TranslateProc(AMachine: TatVirtualMachine);
|
|
|
|
// AV: added for completeness
|
|
|
|
procedure MulPXProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure TranslatePXProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
procedure GetActiveTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetActiveTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetSelectedTransformProc(AMachine: TatVirtualMachine); // AV
|
|
|
|
procedure SetSelectedTransformProc(AMachine: TatVirtualMachine); // AV
|
|
|
|
procedure TransformsProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure FileCountProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure AddTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure DeleteTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure CopyTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure ClearProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure PreviewProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure Print(AMachine: TatVirtualMachine);
|
2022-06-23 06:22:32 -04:00
|
|
|
procedure PrepareToMorphProc(AMachine: TatVirtualMachine); // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
procedure MorphProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure RenderProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure AddSymmetryProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure StoreFlameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFlameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure LoadFlameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetRenderBounds(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetFileName(AMachine: TatVirtualMachine);
|
|
|
|
procedure ListFileProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetParamFileProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure SaveFlameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure ShowStatusProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure RandomFlame(AMachine: TatVirtualMachine);
|
|
|
|
procedure RandomGradientProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure PresetGradientProc(AMachine: TatVirtualMachine); // AV
|
|
|
|
procedure SaveGradientProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetVariation(AMachine: TatVirtualMachine);
|
|
|
|
procedure SetVariation(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
procedure VariationIndexProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure VariationNameProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure VariableIndexProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure VariableNameProc(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
procedure CalculateScale(AMachine: TatVirtualMachine);
|
|
|
|
procedure NormalizeVars(AMachine: TatVirtualMachine);
|
|
|
|
procedure CalculateBounds(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetSaveFileName(AMachine: TatVirtualMachine);
|
|
|
|
// procedure CopyFileProc(AMachine: TatVirtualMachine);
|
|
|
|
procedure GetCurrentFile(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
// AV: added Flame Menu items
|
|
|
|
procedure CalculateColors(AMachine: TatVirtualMachine);
|
|
|
|
procedure CalculateWeights(AMachine: TatVirtualMachine);
|
|
|
|
procedure RandomizeColors(AMachine: TatVirtualMachine);
|
|
|
|
procedure RandomizeColorSpeed(AMachine: TatVirtualMachine);
|
|
|
|
procedure CalculateColorSpeed(AMachine: TatVirtualMachine);
|
|
|
|
procedure RandomizeWeights(AMachine: TatVirtualMachine);
|
|
|
|
procedure NormalizeWeights(AMachine: TatVirtualMachine);
|
|
|
|
procedure EqualizeWeights(AMachine: TatVirtualMachine);
|
|
|
|
|
|
|
|
procedure Init; override;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.ScriptFromFlame(flameXML: string);
|
|
|
|
var
|
|
|
|
i : integer;
|
|
|
|
xml : TXmlScanner;
|
|
|
|
begin
|
|
|
|
// Clear & Set caption to "New Script"
|
|
|
|
btnNewClick(btnNew);
|
|
|
|
|
|
|
|
chaosLines := TStringList.Create;
|
|
|
|
xml := TXmlScanner.Create(nil);
|
|
|
|
xml.Normalize := True;
|
|
|
|
xml.OnContent := F2SXMLContent; // AV: temporary unused
|
|
|
|
xml.OnEmptyTag := F2SXMLEmptyTag;
|
2022-06-23 06:22:32 -04:00
|
|
|
// xml.OnEndTag := F2SXMLEndTag;
|
2022-03-08 12:25:51 -05:00
|
|
|
xml.OnStartTag := F2SXMLStartTag;
|
2022-06-23 06:22:32 -04:00
|
|
|
xml.LoadFromBuffer(PAnsiChar(Utf8String(flameXML)));
|
2022-03-08 12:25:51 -05:00
|
|
|
xml.Execute;
|
|
|
|
xml.Destroy;
|
|
|
|
|
|
|
|
// use chaosLines...
|
|
|
|
for i := 0 to chaosLines.Count - 1 do
|
|
|
|
Editor.Lines.Add(chaosLines.Strings[i]);
|
|
|
|
chaosLines.Destroy;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ ************************ Options interface ********************************* }
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetJPEGQuality(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(JPEGQuality);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetJPEGQuality(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v > 0) and (v <= 100) then JPEGQuality := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetBatchSize(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(BatchSize);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetBatchSize(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 10) and (v <= 100) then BatchSize := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetParameterFile(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(defFlameFile);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetParameterFile(AMachine: TatVirtualMachine);
|
|
|
|
var s: string;
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
s := GetInputArgAsString(0);
|
|
|
|
if (s = '') or FileExists(s) then
|
|
|
|
defFlameFile := s
|
|
|
|
else begin
|
|
|
|
LastError := 'SetFlameFile: ' + TextByKey('common-noparamfile');
|
|
|
|
i := LineNumberFromInstruction(AMachine.CurrentInstruction);
|
|
|
|
Editor.ActiveLine := i; // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
AMachine.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetRandomGradientFile(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(randGradientFile);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetRandomGradientFile(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
randGradientFile := GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetSmoothPaletteFile(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(defSmoothPaletteFile);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetSmoothPaletteFile(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
defSmoothPaletteFile := GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetNumTries(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(NumTries);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetNumTries(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v > 0) and (v <= 100) then NumTries := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTryLength(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(TryLength);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTryLength(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 100) and (v <= 1000000) then TryLength := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetConfirmDelete(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(ConfirmDelete);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetConfirmDelete(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ConfirmDelete := GetInputArgAsBoolean(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetContrast(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(defContrast);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetContrast(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0.1) and (v <= 10) then defContrast := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
(*
|
|
|
|
procedure TScriptEditor.GetFixedReference(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(true); //ReferenceMode = 0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFixedReference(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
// with AMachine do
|
|
|
|
// if GetInputArgAsBoolean(0) then ReferenceMode := 0
|
|
|
|
// else ReferenceMode := 1;
|
|
|
|
end;
|
|
|
|
*)
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetSampleDensity(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(defSampleDensity);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetSampleDensity(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0.1) and (v <= 100) then defSampleDensity := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetGamma(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(defGamma);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetGamma(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
2022-06-23 06:22:32 -04:00
|
|
|
if (v >= 0.1) and (v <= 10) then defGamma := v;
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetGammaThreshold(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(defGammaThreshold);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetGammaThreshold(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v > 0) then defGammaThreshold := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetGradientBlending(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) and (v < 3) then randColorBlend := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetGradientBlending(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(randColorBlend);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetBrightness(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(defBrightness);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetBrightness(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0.1) and (v <= 100) then defBrightness := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetVibrancy(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(defVibrancy);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetVibrancy(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0) and (v <= 100) then defVibrancy := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.ShowCodeHintsClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
ScrCodeList1.ShowHint := ShowCodeHints.Checked;
|
|
|
|
Panel1.ShowHint := not ShowCodeHints.Checked;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetOversample(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(defOversample);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetOversample(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 1) and (v <= 4) then defOversample := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFilterRadius(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(defFilterRadius);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFilterRadius(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0.1) then defFilterRadius := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransparency(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
AMachine.ReturnOutPutArg(PNGTransparency);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransparency(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
if AMachine.GetInputArgAsInteger(0) = 0 then
|
|
|
|
PNGTransparency := 0
|
|
|
|
else
|
|
|
|
PNGTransparency := 1;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetLowQuality(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(prevLowQuality);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetLowQuality(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0.01) and (v <= 100) then prevLowQuality := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMediumQuality(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(prevMediumQuality);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMediumQuality(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0.01) and (v <= 100) then prevMediumQuality := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetHighQuality(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(prevHighQuality);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetHighQuality(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0.01) and (v <= 100) then prevHighQuality := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMinTransforms(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(randMinTransforms);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMinTransforms(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 2) and (v <= NXFORMS) and (v <= randMaxTransforms) then
|
|
|
|
randMinTransforms := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMaxTransforms(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(randMaxTransforms);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMaxTransforms(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 2) and (v <= NXFORMS) and (v >= randMinTransforms) then
|
|
|
|
randMaxTransforms := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMutateMinTransforms(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(mutantMinTransforms);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMutateMinTransforms(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 2) and (v <= NXFORMS) and (v <= mutantMaxTransforms) then
|
|
|
|
mutantMinTransforms := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMutateMaxTransforms(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(mutantMaxTransforms);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMutateMaxTransforms(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 2) and (v <= NXFORMS) and (v >= mutantMinTransforms) then
|
|
|
|
mutantMaxTransforms := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMultithreading(AMachine: TatVirtualMachine);
|
|
|
|
var v: integer;
|
|
|
|
begin
|
|
|
|
AMachine.ReturnOutputArg(NrTreads);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMultithreading(AMachine: TatVirtualMachine);
|
|
|
|
var v: integer;
|
|
|
|
begin
|
|
|
|
v := AMachine.GetInputArgAsInteger(0);
|
|
|
|
if (v > 0) and (v <= UseNrThreads) then // AV: changed max MT value
|
|
|
|
NrTreads := v
|
|
|
|
else begin
|
|
|
|
LastError := 'Options.Multithreading: ' + TextByKey('script-status-varoutofrange');
|
|
|
|
v := LineNumberFromInstruction(AMachine.CurrentInstruction);
|
|
|
|
Editor.ActiveLine := v; // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
AMachine.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetPrefix(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(RandomPrefix);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetPrefix(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
RandomPrefix := GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetKeepBackground(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(KeepBackground);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetKeepBackground(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
KeepBackground := GetInputArgAsBoolean(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetSymmetryType(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(SymmetryType);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetSymmetryType(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) and (v <= 3) then SymmetryType := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetSymmetryOrder(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(SymmetryOrder);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetSymmetryOrder(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 2) and (v <= 2000) then SymmetryOrder := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetVariations(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
I: Integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
i := GetArrayIndex(0);
|
|
|
|
if (i >= 0) and (i < NRVAR) then
|
|
|
|
ReturnOutPutArg(Variations[i]);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetVariations(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: boolean;
|
|
|
|
i, vars: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsBoolean(0);
|
|
|
|
i := GetArrayIndex(0);
|
|
|
|
if (i >= 0) and (i < NRVAR) then
|
|
|
|
begin
|
|
|
|
Variations[i] := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetRandomGradient(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(randGradient);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetRandomGradient(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) and (v <= 4) then randGradient := v; // AV: fixed - was max=3
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMinNodes(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(MinNodes);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMinNodes(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 2) and (v <= 64) and (v <= MaxNodes) then MinNodes := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMaxNodes(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(MaxNodes);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMaxNodes(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 2) and (v <= 64) and (v >= MinNodes) then MaxNodes := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMinHue(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(MinHue);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMinHue(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) and (v <= 600) and (v <= MaxHue) then MinHue := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMaxHue(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(MaxHue);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMaxHue(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) and (v <= 600) and (v >= MinHue) then MaxHue := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMinSat(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(MinSat);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMinSat(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) and (v <= 100) and (v <= MaxSat) then MinSat := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMaxSat(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(MaxSat);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMaxSat(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) and (v <= 100) and (v >= MinSat) then MaxSat := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMinLum(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(MinLum);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMinLum(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) and (v <= 100) and (v <= MaxLum) then MinLum := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetMaxLum(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(MaxLum);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetMaxLum(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) and (v <= 100) and (v >= MinLum) then MaxLum := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetUPRSampleDensity(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(UPRSampleDensity);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetUPRSampleDensity(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v > 0) then UPRSampleDensity := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetUPROversample(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(UPROversample);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetUPROversample(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v > 0) then UPROversample := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetUPRFilterRadius(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(UPRFilterRadius);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetUPRFilterRadius(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v > 0) then UPRFilterRadius := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetUPRColoringIdent(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(UPRColoringIdent);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetUPRColoringIdent(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
UPRColoringIdent := GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetUPRColoringFile(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(UPRColoringFile);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetUPRColoringFile(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
UPRColoringFile := GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetUPRFormulaFile(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(UPRFormulaFile);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetUPRFormulaFile(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
UPRFormulaFile := GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetUPRFormulaIdent(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(UPRFormulaIdent);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetUPRFormulaIdent(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
UPRFormulaIdent := GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetUPRAdjustDensity(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(UPRAdjustDensity);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetUPRAdjustDensity(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
UPRAdjustDensity := GetInputArgAsBoolean(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetUPRWidth(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(UPRWidth);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetUPRWidth(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v > 0) then UPRWidth := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetUPRHeight(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(UPRHeight);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetUPRHeight(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v > 0) then UPRHeight := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetEqualGradient(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(EqualStripes);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetEqualGradient(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
EqualStripes := GetInputArgAsBoolean(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetExportPath(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(flam3Path);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetExportPath(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
flam3Path := GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ ***************************** Operation Library **************************** }
|
|
|
|
|
|
|
|
procedure TOperationLibrary.Init;
|
|
|
|
begin
|
|
|
|
Scripter.DefineMethod('RotateFlame', 1, tkNone, nil, RotateFlameProc);
|
|
|
|
Scripter.DefineMethod('RotateReference', 1, tkNone, nil, RotateReferenceProc);
|
|
|
|
Scripter.DefineMethod('Rotate', 1, tkNone, nil, RotateProc);
|
|
|
|
Scripter.DefineMethod('Multiply', 4, tkNone, nil, MulProc);
|
|
|
|
Scripter.DefineMethod('StoreFlame', 1, tkNone, nil, StoreFlameProc);
|
|
|
|
Scripter.DefineMethod('GetFlame', 1, tkNone, nil, GetFlameProc);
|
|
|
|
Scripter.DefineMethod('LoadFlame', 1, tkNone, nil, LoadFlameProc);
|
|
|
|
Scripter.DefineMethod('Scale', 1, tkNone, nil, ScaleProc);
|
|
|
|
Scripter.DefineMethod('Translate', 2, tkNone, nil, TranslateProc);
|
|
|
|
|
|
|
|
Scripter.DefineMethod('MultiplyPX', 4, tkNone, nil, MulPXProc);
|
|
|
|
Scripter.DefineMethod('TranslatePX', 2, tkNone, nil, TranslatePXProc);
|
|
|
|
|
|
|
|
Scripter.DefineProp('SelectedTransform', tkInteger,
|
|
|
|
GetSelectedTransformProc, SetSelectedTransformProc); // AV
|
|
|
|
Scripter.DefineProp('ActiveTransform', tkInteger,
|
|
|
|
GetActiveTransformProc, SetActiveTransformProc);
|
|
|
|
Scripter.DefineMethod('SetActiveTransform', 1, tkInteger, nil, SetActiveTransformProc);
|
|
|
|
Scripter.DefineMethod('Transforms', 0, tkInteger, nil, TransformsProc);
|
|
|
|
Scripter.DefineMethod('FileCount', 0, tkInteger, nil, FileCountProc);
|
|
|
|
Scripter.DefineMethod('AddTransform', 0, tkNone, nil, AddTransformProc);
|
|
|
|
Scripter.DefineMethod('DeleteTransform', 0, tkNone, nil, DeleteTransformProc);
|
|
|
|
Scripter.DefineMethod('CopyTransform', 0, tkNone, nil, CopyTransformProc);
|
|
|
|
Scripter.DefineMethod('Clear', 0, tkNone, nil, ClearProc);
|
|
|
|
Scripter.DefineMethod('Preview', 0, tkNone, nil, PreviewProc);
|
|
|
|
Scripter.DefineMethod('Render', 0, tkNone, nil, RenderProc);
|
|
|
|
Scripter.DefineMethod('Print', 1, tkNone, nil, Print);
|
|
|
|
Scripter.DefineMethod('AddSymmetry', 1, tkNone, nil, AddSymmetryProc);
|
2022-06-23 06:22:32 -04:00
|
|
|
Scripter.DefineMethod('PrepareToMorph', 2, tkNone, nil, PrepareToMorphProc); // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
Scripter.DefineMethod('Morph', 4, tkNone, nil, MorphProc, false, 1);
|
|
|
|
Scripter.DefineMethod('SetRenderBounds', 0, tkNone, nil, SetRenderBounds);
|
|
|
|
Scripter.DefineMethod('SetFlameFile', 1, tkNone, nil, SetParamFileProc);
|
|
|
|
Scripter.DefineMethod('ListFile', 1, tkNone, nil, ListFileProc);
|
|
|
|
Scripter.DefineMethod('SaveFlame', 1, tkNone, nil, SaveFlameProc);
|
|
|
|
Scripter.DefineMethod('GetFileName', 0, tkString, nil, GetFileName);
|
|
|
|
Scripter.DefineMethod('ShowStatus', 1, tkNone, nil, ShowStatusProc);
|
|
|
|
Scripter.DefineMethod('RandomFlame', 1, tkNone, nil, RandomFlame);
|
|
|
|
Scripter.DefineMethod('RandomGradient', 0, tkNone, nil, RandomGradientProc);
|
|
|
|
Scripter.DefineMethod('PresetGradient', 1, tkNone, nil, PresetGradientProc); // AV
|
|
|
|
Scripter.DefineMethod('SaveGradient', 2, tkNone, nil, SaveGradientProc);
|
2022-06-23 06:22:32 -04:00
|
|
|
Scripter.DefineMethod('Variation', 0, tkInteger, nil, GetVariation); // AV: fixed
|
2022-03-08 12:25:51 -05:00
|
|
|
Scripter.DefineMethod('SetVariation', 1, tkInteger, nil, SetVariation); // AV: fixed
|
|
|
|
|
|
|
|
Scripter.AddConstant('ProgramVersionString', AppVersionString);
|
|
|
|
Scripter.DefineMethod('VariationIndex', 1, tkInteger, nil, VariationIndexProc);
|
|
|
|
Scripter.DefineMethod('VariationName', 1, tkString, nil, VariationNameProc);
|
|
|
|
Scripter.DefineMethod('VariableIndex', 1, tkInteger, nil, VariableIndexProc);
|
|
|
|
Scripter.DefineMethod('VariableName', 1, tkString, nil, VariableNameProc);
|
|
|
|
|
|
|
|
Scripter.DefineMethod('CalculateScale', 0, tkNone, nil, CalculateScale);
|
|
|
|
Scripter.DefineMethod('CalculateBounds', 0, tkNone, nil, CalculateBounds);
|
|
|
|
Scripter.DefineMethod('NormalizeVars', 0, tkNone, nil, NormalizeVars);
|
|
|
|
Scripter.DefineMethod('GetSaveFileName', 0, tkString, nil, GetSaveFileName);
|
|
|
|
// Scripter.DefineMethod('CopyFile', 2, tkString, nil, CopyFileProc);
|
|
|
|
|
|
|
|
Scripter.DefineMethod('CalculateColors', 0, tkNone, nil, CalculateColors);
|
|
|
|
Scripter.DefineMethod('CalculateColorSpeed', 0, tkNone, nil, CalculateColorSpeed);
|
|
|
|
Scripter.DefineMethod('CalculateWeights', 0, tkNone, nil, CalculateWeights);
|
|
|
|
Scripter.DefineMethod('NormalizeWeights', 0, tkNone, nil, NormalizeWeights);
|
|
|
|
Scripter.DefineMethod('RandomizeColors', 0, tkNone, nil, RandomizeColors);
|
|
|
|
Scripter.DefineMethod('RandomizeColorSpeed', 0, tkNone, nil, RandomizeColorSpeed);
|
|
|
|
Scripter.DefineMethod('RandomizeWeights', 0, tkNone, nil, RandomizeWeights);
|
|
|
|
Scripter.DefineMethod('EqualizeWeights', 0, tkNone, nil, EqualizeWeights);
|
|
|
|
|
|
|
|
Scripter.DefineProp('CurrentFile', tkString, GetCurrentFile, nil);
|
|
|
|
|
|
|
|
//Scripter.DefineMethod('BM_Open', 1, tkInteger, nil, BM_OpenProc);
|
|
|
|
//Scripter.DefineMethod('BM_DllCFunc', 2, tkInteger, nil, BM_DllCFuncProc);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.RandomFlame(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
try
|
|
|
|
i := AMachine.GetInputArgAsInteger(0);
|
|
|
|
MainForm.RandomizeCP(ScriptEditor.cp, i);
|
|
|
|
for i := 0 to NXFORMS - 1 do
|
|
|
|
if ScriptEditor.cp.xform[i].density = 0 then break;
|
|
|
|
NumTransforms := i;
|
2022-06-23 06:22:32 -04:00
|
|
|
except on EMathError do
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.RandomGradientProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
ScriptEditor.cp.cmap := GradientHelper.RandomGradient;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.PresetGradientProc(AMachine: TatVirtualMachine);
|
|
|
|
var i: integer;
|
|
|
|
begin
|
|
|
|
i := AMachine.GetInputArgAsInteger(0);
|
|
|
|
if (i >= -1) and (i < NRCMAPS) then
|
|
|
|
GetCMap(i, 1, ScriptEditor.cp.cmap);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.CalculateScale(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
x, y: double;
|
|
|
|
begin
|
|
|
|
x := ScriptEditor.cp.center[0];
|
|
|
|
y := ScriptEditor.cp.center[1];
|
|
|
|
ScriptEditor.cp.CalcBoundBox;
|
|
|
|
ScriptEditor.cp.center[0] := x;
|
|
|
|
ScriptEditor.cp.center[1] := y;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.CalculateBounds(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
ScriptEditor.cp.CalcBoundBox;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.CalculateColors(AMachine: TatVirtualMachine);
|
2022-06-23 06:22:32 -04:00
|
|
|
var i: smallint;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
if NumTransforms > 1 then // fixed divide-by-zero bug
|
2022-03-08 12:25:51 -05:00
|
|
|
for i := 0 to NumTransforms-1 do
|
2022-06-23 06:22:32 -04:00
|
|
|
ScriptEditor.cp.xform[i].color := i / (NumTransforms-1)
|
|
|
|
else
|
|
|
|
ScriptEditor.cp.xform[0].color := 0;
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.CalculateWeights(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
ScriptEditor.cp.CalculateWeights;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.RandomizeColors(AMachine: TatVirtualMachine);
|
2022-06-23 06:22:32 -04:00
|
|
|
var i: smallint;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
for i := 0 to NumTransforms-1 do
|
|
|
|
ScriptEditor.cp.xform[i].color := random;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.RandomizeColorSpeed(AMachine: TatVirtualMachine);
|
2022-06-23 06:22:32 -04:00
|
|
|
var i: smallint;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
for i := 0 to NumTransforms-1 do
|
|
|
|
ScriptEditor.cp.xform[i].symmetry := 2 * random - 1;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.CalculateColorSpeed(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
ScriptEditor.cp.CalculateColorSpeed;
|
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
procedure TOperationLibrary.EqualizeWeights(AMachine: TatVirtualMachine);
|
|
|
|
var i: smallint;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
for i := 0 to NumTransforms-1 do
|
|
|
|
ScriptEditor.cp.xform[i].density := 0.5;
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
procedure TOperationLibrary.RandomizeWeights(AMachine: TatVirtualMachine);
|
|
|
|
var i: smallint;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
for i := 0 to NumTransforms-1 do
|
|
|
|
ScriptEditor.cp.xform[i].density := random;
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
procedure TOperationLibrary.NormalizeWeights(AMachine: TatVirtualMachine);
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
ScriptEditor.cp.NormalizeProbabilities;
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.SetRenderBounds(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
// AV: it actually does nothing special... just waste of time
|
2022-03-08 12:25:51 -05:00
|
|
|
ScriptRenderForm.SetRenderBounds;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.SetSelectedTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
try
|
|
|
|
with AMachine do
|
|
|
|
i := GetInputArgAsInteger(0);
|
|
|
|
if (i >= 0) and (i < EditForm.cbTransforms.Items.Count) then
|
|
|
|
EditForm.SelectedTriangle := i
|
|
|
|
else raise EFormatInvalid.Create('SelectedTransform: ' + ErrorOutOfRange);
|
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
|
|
|
Application.ProcessMessages;
|
|
|
|
LastError := E.Message;
|
|
|
|
ScriptEditor.Editor.ActiveLine :=
|
|
|
|
LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.GetFileName(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if ScriptEditor.OpenDialog.Execute then
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutputArg(ScriptEditor.OpenDialog.Filename)
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
LastError := 'GetFileName: ' + TextByKey('save-status-invalidfilename');
|
|
|
|
ScriptEditor.Editor.ActiveLine :=
|
|
|
|
LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
AMachine.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.GetSaveFileName(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if ScriptEditor.SaveDialog.Execute then
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutputArg(ScriptEditor.SaveDialog.Filename)
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
LastError := 'GetSaveFileName: ' + TextByKey('save-status-invalidfilename');
|
|
|
|
ScriptEditor.Editor.ActiveLine :=
|
|
|
|
LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
AMachine.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.GetSelectedTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutputArg(EditForm.SelectedTriangle);
|
|
|
|
end;
|
|
|
|
|
|
|
|
(*
|
|
|
|
procedure TOperationLibrary.CopyFileProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
src, dest: string;
|
|
|
|
FileList: TStringList;
|
|
|
|
begin
|
|
|
|
{ // AV: this doesn't work with Unicode strings and conflicts with Windows.CopyFile
|
|
|
|
src := AMachine.GetInputArgAsString(0);
|
|
|
|
dest := AMachine.GetInputArgAsString(1);
|
|
|
|
FileList := TStringList.Create;
|
|
|
|
try
|
|
|
|
if FileExists(src) then
|
|
|
|
begin
|
|
|
|
FileList.LoadFromFile(src);
|
|
|
|
try
|
|
|
|
FileList.SaveToFile(dest);
|
|
|
|
except
|
|
|
|
LastError := 'CopyFile: ' + TextByKey('common-genericcopyfailure');
|
|
|
|
AMachine.Halt;
|
|
|
|
end;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
LastError := 'CopyFile: ' + TextByKey('common-genericcopyfailure');
|
|
|
|
AMachine.Halt;
|
|
|
|
end;
|
|
|
|
finally
|
|
|
|
FileList.free;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
*)
|
|
|
|
|
|
|
|
procedure TOperationLibrary.SetParamFileProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
filen: string;
|
|
|
|
begin
|
|
|
|
filen := AMachine.GetInputArgAsString(0);
|
|
|
|
if FileExists(filen) then
|
|
|
|
begin
|
|
|
|
ParamFile := filen;
|
|
|
|
ScriptEditor.FillFileList;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
LastError := 'SetFlameFile: ' + TextByKey('common-noparamfile');
|
|
|
|
AMachine.RuntimeError(LastError); // AV
|
|
|
|
AMachine.Halt;
|
2022-06-23 06:22:32 -04:00
|
|
|
if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.RotateProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
try
|
2022-06-23 06:22:32 -04:00
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then
|
|
|
|
raise EFormatInvalid.Create(ErrorOutOfRange);
|
|
|
|
with ScriptEditor.cp.xform[ActiveTransform] do
|
|
|
|
Rotate(c, AMachine.GetInputArgAsFloat(0));
|
2022-03-08 12:25:51 -05:00
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
|
|
|
// ScriptEditor.Console.Lines.Add('Rotate: ' + E.message);
|
|
|
|
LastError := 'Rotate: ' + E.Message;
|
|
|
|
Application.ProcessMessages;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TOperationLibrary.MulPXProc(AMachine: TatVirtualMachine);
|
2022-06-23 06:22:32 -04:00
|
|
|
var k, m, l, n: double;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
try
|
2022-06-23 06:22:32 -04:00
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then
|
|
|
|
raise EFormatInvalid.Create(ErrorOutOfRange);
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
k := GetInputArgAsFloat(0);
|
|
|
|
m := GetInputArgAsFloat(1);
|
|
|
|
l := GetInputArgAsFloat(2);
|
|
|
|
n := GetInputArgAsFloat(3);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
2022-06-23 06:22:32 -04:00
|
|
|
with ScriptEditor.cp.xform[ActiveTransform] do
|
|
|
|
Multiply(p, k, l, m, n); // AV: my common method for both matrices
|
2022-03-08 12:25:51 -05:00
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
|
|
|
// ScriptEditor.Console.Lines.Add('MultiplyPX: ' + E.message);
|
|
|
|
LastError := 'MultiplyPX: ' + E.Message;
|
|
|
|
Application.ProcessMessages;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.MulProc(AMachine: TatVirtualMachine);
|
2022-06-23 06:22:32 -04:00
|
|
|
var k, m, l, n: double;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
try
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then raise EFormatInvalid.Create(ErrorOutOfRange);
|
|
|
|
with AMachine do
|
|
|
|
// ScriptEditor.cp.xform[ActiveTransform].Multiply(GetInputArgAsFloat(0), GetInputArgAsFloat(1), GetInputArgAsFloat(2), GetInputArgAsFloat(3));
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
k := GetInputArgAsFloat(0);
|
|
|
|
m := GetInputArgAsFloat(1);
|
|
|
|
l := GetInputArgAsFloat(2);
|
|
|
|
n := GetInputArgAsFloat(3);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
2022-06-23 06:22:32 -04:00
|
|
|
with ScriptEditor.cp.xform[ActiveTransform] do
|
|
|
|
if postXswap then
|
|
|
|
Multiply(p, k, l, m, n) // AV: my common method for both matrices
|
|
|
|
else
|
|
|
|
Multiply(c, k, l, m, n);
|
2022-03-08 12:25:51 -05:00
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
|
|
|
// ScriptEditor.Console.Lines.Add('Multiply: ' + E.message);
|
|
|
|
LastError := 'Multiply: ' + E.Message;
|
|
|
|
Application.ProcessMessages;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.Print(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
ScriptEditor.Console.Lines.Add(AMachine.GetInputArg(0));
|
|
|
|
Application.ProcessMessages;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.ShowStatusProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
MainForm.StatusBar.Panels[0].Text := AMachine.GetInputArg(0);
|
|
|
|
Application.ProcessMessages;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TOperationLibrary.SaveFlameProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
2022-06-23 06:22:32 -04:00
|
|
|
filename, ext: string;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
filename := GetInputArgAsString(0);
|
2022-06-23 06:22:32 -04:00
|
|
|
ext := LowerCase(ExtractFileExt(filename));
|
|
|
|
if (ext = '.apo') or (ext = '.fla') then // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
MainForm.SaveFlame(ScriptEditor.cp, ScriptEditor.cp.name, filename)
|
2022-06-23 06:22:32 -04:00
|
|
|
else
|
2022-03-08 12:25:51 -05:00
|
|
|
MainForm.SaveXMLFlame(ScriptEditor.cp, ScriptEditor.cp.name, filename)
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.SaveGradientProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
gradstr: TStringList;
|
2022-06-23 06:22:32 -04:00
|
|
|
gradname: string;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
gradstr := TStringList.Create;
|
|
|
|
try
|
2022-06-23 06:22:32 -04:00
|
|
|
gradname := AMachine.GetInputArgAsString(1); // AV
|
|
|
|
gradstr.add(CleanIdentifier(gradname) + ' {');
|
|
|
|
gradstr.add(MainForm.GradientFromPalette(ScriptEditor.cp.cmap, gradname));
|
2022-03-08 12:25:51 -05:00
|
|
|
gradstr.add('}');
|
2022-06-23 06:22:32 -04:00
|
|
|
MainForm.SaveGradient(gradstr.text, gradname, AMachine.GetInputArgAsString(0));
|
2022-03-08 12:25:51 -05:00
|
|
|
finally
|
2022-06-23 06:22:32 -04:00
|
|
|
gradstr.free;
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.ListFileProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
2022-06-23 06:22:32 -04:00
|
|
|
flafile, ext: string;
|
2022-03-08 12:25:51 -05:00
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
flafile := AMachine.GetInputArgAsString(0);
|
|
|
|
if FileExists(flafile) then
|
|
|
|
begin
|
|
|
|
OpenFile := flafile;
|
|
|
|
MainForm.Caption := AppVersionString + ' - ' + OpenFile;
|
2022-06-23 06:22:32 -04:00
|
|
|
ext := LowerCase(ExtractFileExt(flafile));
|
|
|
|
if (ext = '.apo') or (ext = '.undo') then begin
|
|
|
|
OpenFileType := ftApo;
|
|
|
|
ListIFS(OpenFile, 1);
|
2022-03-08 12:25:51 -05:00
|
|
|
end
|
2022-06-23 06:22:32 -04:00
|
|
|
else begin
|
2022-03-08 12:25:51 -05:00
|
|
|
OpenFileType := ftXML;
|
2022-06-23 06:22:32 -04:00
|
|
|
ListXML(OpenFile, 1);
|
|
|
|
end;
|
2022-03-08 12:25:51 -05:00
|
|
|
MainForm.SetFocus;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
try
|
|
|
|
LastError := 'ListFile: ' + Format(TextByKey('common-genericopenfailure'), [Flafile]);
|
|
|
|
except
|
|
|
|
LastError := 'Cannot list file: ' + Flafile;
|
|
|
|
end;
|
|
|
|
i := LineNumberFromInstruction(AMachine.CurrentInstruction);
|
|
|
|
ScriptEditor.Editor.ActiveLine := i; // AV
|
|
|
|
ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
AMachine.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.StoreFlameProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
v := AMachine.GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) and (v < NCPS) then
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
cps[v].copy(ScriptEditor.cp); // <-- AV: optimized for speed
|
2022-03-08 12:25:51 -05:00
|
|
|
cps[v].cmap := ScriptEditor.cp.cmap;
|
|
|
|
end
|
|
|
|
else begin
|
|
|
|
LastError := 'StoreFlame(' + IntToStr(v) + '): ' + TextByKey('script-status-varoutofrange');
|
|
|
|
ScriptEditor.Editor.ActiveLine :=
|
|
|
|
LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
AMachine.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.GetFlameProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
2022-06-23 06:22:32 -04:00
|
|
|
i, j: integer;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
j := AMachine.GetInputArgAsInteger(0);
|
|
|
|
if (j >= 0) and (j < NCPS) then
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
ScriptEditor.cp.copy(cps[j]); // <-- AV: optimized for speed
|
|
|
|
ScriptEditor.cp.cmap := cps[j].cmap;
|
|
|
|
|
|
|
|
for i := 0 to NXFORMS - 1 do
|
|
|
|
if ScriptEditor.cp.xform[i].density = 0 then break;
|
|
|
|
NumTransforms := i;
|
|
|
|
|
|
|
|
// AV: added a special method for easy gradient animation
|
|
|
|
RotateCMapHue(ScriptEditor.cp);
|
2022-03-08 12:25:51 -05:00
|
|
|
end
|
|
|
|
else begin
|
2022-06-23 06:22:32 -04:00
|
|
|
LastError := 'GetFlame(' + IntToStr(j) + '): ' + TextByKey('script-status-varoutofrange');
|
|
|
|
ScriptEditor.Editor.ActiveLine :=
|
|
|
|
LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
AMachine.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure LoadXMLFlame(index: integer);
|
|
|
|
var
|
|
|
|
FStrings: TStringList;
|
|
|
|
IFSStrings: TStringList;
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
FStrings := TStringList.Create;
|
|
|
|
IFSStrings := TStringList.Create;
|
|
|
|
try
|
|
|
|
FStrings.LoadFromFile(ParamFile);
|
|
|
|
|
|
|
|
for i := 0 to FStrings.count - 1 do
|
|
|
|
begin
|
|
|
|
if Pos('<flame ', Trim(FStrings[i])) = 1 then
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
MainForm.ListXMLScanner.LoadFromBuffer(PAnsiChar(Utf8String(FStrings[i])));
|
2022-03-08 12:25:51 -05:00
|
|
|
MainForm.ListXMLScanner.Execute;
|
2022-06-23 06:22:32 -04:00
|
|
|
if ScFileList[index] = (pname) then
|
2022-03-08 12:25:51 -05:00
|
|
|
break;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
IFSStrings.Add(FStrings[i]);
|
|
|
|
repeat
|
|
|
|
inc(i);
|
|
|
|
IFSStrings.Add(FStrings[i]);
|
|
|
|
until Pos('</flame>', FStrings[i]) <> 0;
|
|
|
|
MainForm.ParseXML(ScriptEditor.Cp, IFSStrings.Text, true);
|
|
|
|
for i := 0 to NXFORMS - 1 do
|
|
|
|
if ScriptEditor.cp.xform[i].density = 0 then break;
|
|
|
|
NumTransforms := i;
|
2022-06-23 06:22:32 -04:00
|
|
|
// ScriptEditor.cp.name := FileList[index];
|
2022-03-08 12:25:51 -05:00
|
|
|
finally
|
|
|
|
IFSStrings.Free;
|
|
|
|
FStrings.Free;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure LoadFlame(index: integer);
|
|
|
|
var
|
2022-06-23 06:22:32 -04:00
|
|
|
i: integer;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
ScriptEditor.cp.Clear; // initialize control point for new flame;
|
|
|
|
ScriptEditor.cp.background[0] := 0;
|
|
|
|
ScriptEditor.cp.background[1] := 0;
|
|
|
|
ScriptEditor.cp.background[2] := 0;
|
|
|
|
ScriptEditor.cp.sample_density := defSampleDensity;
|
|
|
|
ScriptEditor.cp.spatial_oversample := defOversample;
|
|
|
|
ScriptEditor.cp.spatial_filter_radius := defFilterRadius;
|
2022-06-23 06:22:32 -04:00
|
|
|
|
|
|
|
FlameFromUndo(ScriptEditor.cp, ScFileList[index], ParamFile); // AV
|
|
|
|
|
2022-03-08 12:25:51 -05:00
|
|
|
for i := 0 to NXFORMS - 1 do
|
|
|
|
if ScriptEditor.cp.xform[i].density = 0 then break;
|
|
|
|
NumTransforms := i;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.LoadFlameProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
2022-06-23 06:22:32 -04:00
|
|
|
ext: string;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
i := AMachine.GetInputArgAsInteger(0);
|
2022-06-23 06:22:32 -04:00
|
|
|
if (i >= 0) and (i < ScFileList.count) then
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
ext := LowerCase(ExtractFileExt(ParamFile));
|
|
|
|
if (ext = '.apo') or (ext = '.undo') then
|
|
|
|
LoadFlame(i) // AV: added support for Undo files
|
|
|
|
else
|
|
|
|
LoadXMLFlame(i);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.RotateFlameProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
Triangles: TTriangles;
|
|
|
|
i: integer;
|
|
|
|
r: double;
|
|
|
|
tx: TXForm;
|
|
|
|
begin
|
|
|
|
tx := TXForm.Create;
|
|
|
|
tx.Assign(scripteditor.cp.xform[NumTransforms]);
|
|
|
|
ScriptEditor.cp.TrianglesFromCp(Triangles);
|
|
|
|
r := AMachine.GetInputArgAsFloat(0) * pi / 180;
|
|
|
|
for i := -1 to NumTransforms - 1 do
|
|
|
|
begin
|
|
|
|
Triangles[i] := RotateTriangle(Triangles[i], r);
|
|
|
|
end;
|
|
|
|
ScriptEditor.cp.GetFromTriangles(Triangles, NumTransforms);
|
|
|
|
scripteditor.cp.xform[NumTransforms].Assign(tx);
|
|
|
|
tx.Free;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.AddSymmetryProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
tx: TXForm;
|
|
|
|
begin
|
|
|
|
tx := TXForm.Create;
|
|
|
|
tx.Assign(scripteditor.cp.xform[NumTransforms]);
|
|
|
|
|
|
|
|
ScriptEditor.cp.NormalizeProbabilities; // AV
|
|
|
|
add_symmetry_to_control_point(ScriptEditor.cp, AMachine.GetInputArgAsInteger(0));
|
|
|
|
for i := 0 to NXFORMS - 1 do
|
|
|
|
if ScriptEditor.cp.xform[i].density = 0 then break;
|
|
|
|
NumTransforms := i;
|
|
|
|
scripteditor.cp.xform[i].Assign(tx);
|
|
|
|
tx.Free;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.RotateReferenceProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
Triangles: TTriangles;
|
|
|
|
r: double;
|
|
|
|
tx: TXForm;
|
|
|
|
begin
|
|
|
|
tx := TXForm.Create;
|
|
|
|
tx.Assign(scripteditor.cp.xform[NumTransforms]);
|
|
|
|
ScriptEditor.cp.TrianglesFromCp(Triangles);
|
|
|
|
r := AMachine.GetInputArgAsFloat(0) * pi / 180;
|
|
|
|
Triangles[-1] := RotateTriangle(Triangles[-1], r);
|
|
|
|
ScriptEditor.cp.GetFromTriangles(Triangles, NumTransforms);
|
|
|
|
scripteditor.cp.xform[NumTransforms].Assign(tx);
|
|
|
|
tx.Free;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.ScaleProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
try
|
2022-06-23 06:22:32 -04:00
|
|
|
if (ActiveTransform < 0) or (ActiveTransform >= ScriptEditor.cp.NumXForms) then
|
|
|
|
raise EFormatInvalid.Create(ErrorOutOfRange);
|
|
|
|
with ScriptEditor.cp.xform[ActiveTransform] do
|
|
|
|
Scale(c, AMachine.GetInputArgAsFloat(0));
|
2022-03-08 12:25:51 -05:00
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
//ScriptEditor.Console.Lines.Add('Scale: ' + E.message);
|
2022-03-08 12:25:51 -05:00
|
|
|
LastError := 'Scale: ' + E.Message;
|
2022-06-23 06:22:32 -04:00
|
|
|
Application.ProcessMessages;
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.GetActiveTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutputArg(ActiveTransform);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.GetCurrentFile(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutputArg(OpenFile);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.TransformsProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutputArg(NumTransforms);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.GetVariation(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
// AV: changed Variation to integer - no more ugly type-casting here!
|
|
|
|
AMachine.ReturnOutputArg(Variation);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.SetVariation(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
i := GetInputArgAsInteger(0);
|
|
|
|
if (i < 0) or (i >= NRVAR) then
|
|
|
|
begin
|
|
|
|
MainForm.mnuVRandom.Checked := True;
|
|
|
|
// AV: only one variation type can be active
|
2022-06-23 06:22:32 -04:00
|
|
|
if Variation > vRandom then begin
|
|
|
|
MainForm.VarMenus[Variation].Checked := False;
|
|
|
|
MainForm.mnuBuiltinVars.Checked := False;
|
|
|
|
MainForm.mnuPluginVars.Checked := False;
|
|
|
|
end;
|
|
|
|
Variation := vRandom; // AV: outdated type, I changed it to integer
|
2022-03-08 12:25:51 -05:00
|
|
|
end else
|
|
|
|
begin
|
|
|
|
MainForm.VarMenus[i].Checked := True;
|
|
|
|
MainForm.mnuVRandom.Checked := False;
|
2022-06-23 06:22:32 -04:00
|
|
|
if Variation > vRandom then
|
|
|
|
MainForm.VarMenus[Variation].Checked := False
|
|
|
|
else
|
|
|
|
MainForm.mnuVRandom.Checked := False;
|
|
|
|
|
|
|
|
// AV: changed Variation to integer - no more ugly type-casting here!
|
|
|
|
Variation := i;
|
|
|
|
if (i >= NumBuiltinVars) then // AV: fixme
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
MainForm.mnuBuiltinVars.Checked := False;
|
|
|
|
MainForm.mnuPluginVars.Checked := True;
|
|
|
|
end
|
|
|
|
else begin
|
|
|
|
MainForm.mnuBuiltinVars.Checked := True;
|
|
|
|
MainForm.mnuPluginVars.Checked := False;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.VariationIndexProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
str: string;
|
|
|
|
begin
|
|
|
|
with AMachine do begin
|
2022-06-23 06:22:32 -04:00
|
|
|
{
|
2022-03-08 12:25:51 -05:00
|
|
|
str := LowerCase(GetInputArgAsString(0));
|
|
|
|
i := NRVAR-1;
|
|
|
|
while (i >= 0) and (LowerCase(varnames(i)) <> str) do Dec(i);
|
2022-06-23 06:22:32 -04:00
|
|
|
}
|
|
|
|
str := GetInputArgAsString(0); // AV
|
|
|
|
i := GetVariationIndex(str); // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
ReturnOutputArg(i);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.VariationNameProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
str: string;
|
|
|
|
begin
|
|
|
|
with AMachine do begin
|
|
|
|
i := GetInputArgAsInteger(0);
|
|
|
|
if (i >= 0) and (i < NRVAR) then
|
|
|
|
ReturnOutputArg(varnames(i))
|
|
|
|
else
|
|
|
|
ReturnOutputArg('');
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.VariableIndexProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
str: string;
|
|
|
|
begin
|
|
|
|
with AMachine do begin
|
2022-06-23 06:22:32 -04:00
|
|
|
str := GetInputArgAsString(0);
|
2022-03-08 12:25:51 -05:00
|
|
|
i := GetNrVariableNames-1;
|
2022-06-23 06:22:32 -04:00
|
|
|
while (i >= 0) and (GetVariableNameAt(i) <> str) do Dec(i);
|
2022-03-08 12:25:51 -05:00
|
|
|
ReturnOutputArg(i);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.VariableNameProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do begin
|
|
|
|
i := GetInputArgAsInteger(0);
|
|
|
|
if (i >= 0) and (i < GetNrVariableNames) then
|
|
|
|
ReturnOutputArg(GetVariableNameAt(i))
|
|
|
|
else
|
|
|
|
ReturnOutputArg('');
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.FileCountProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
2022-06-23 06:22:32 -04:00
|
|
|
ReturnOutputArg(ScFileList.Count);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.ClearProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
NumTransforms := 0;
|
|
|
|
ActiveTransform := -1;
|
2022-06-23 06:22:32 -04:00
|
|
|
|
2022-03-08 12:25:51 -05:00
|
|
|
ScriptEditor.cp.Clear;
|
2022-06-23 06:22:32 -04:00
|
|
|
ScriptEditor.cp.xform[0].symmetry := 1; // AV: why?
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
with ScriptEditor.cp do
|
|
|
|
begin // AV: added 3D-camera resetting for new flames
|
|
|
|
cameraPitch := 0;
|
|
|
|
cameraYaw := 0;
|
|
|
|
cameraRoll := 0;
|
|
|
|
cameraPersp := 0;
|
|
|
|
cameraZPos := 0;
|
|
|
|
cameraDOF := 0;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
procedure TOperationLibrary.PrepareToMorphProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
a, b: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
a := GetInputArgAsInteger(0);
|
|
|
|
b := GetInputArgAsInteger(1);
|
|
|
|
if (a >= 0) and (a < NCPS) and (b >= 0) and (b < NCPS) then
|
|
|
|
begin
|
|
|
|
PrepareToInterpolation(cps[a], cps[b]); // adjust flame parameters
|
|
|
|
end
|
|
|
|
else begin
|
|
|
|
LastError := Format('PrepareToMorph(%d, %d): ', [a, b]) +
|
|
|
|
TextByKey('script-status-varoutofrange');
|
|
|
|
RuntimeError(LastError);
|
|
|
|
Scripter.Halt;
|
|
|
|
if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV: show errors
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
2022-03-08 12:25:51 -05:00
|
|
|
procedure TOperationLibrary.MorphProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
a, b, i: integer;
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
a := GetInputArgAsInteger(0);
|
|
|
|
b := GetInputArgAsInteger(1);
|
|
|
|
v := GetInputArgAsFloat(2);
|
|
|
|
if (a >= 0) and (a < NCPS) and (b >= 0) and (b < NCPS) then
|
|
|
|
begin // AV: added interpolation type, with default value "linear / HSV"
|
|
|
|
case InputArgCount of
|
|
|
|
3: ScriptEditor.cp.InterpolateAll(cps[a], cps[b], v, 3);
|
|
|
|
4: ScriptEditor.cp.InterpolateAll(cps[a], cps[b], v, GetInputArgAsInteger(3));
|
|
|
|
else Exit;
|
|
|
|
end;
|
|
|
|
for i := 0 to NXFORMS - 1 do
|
|
|
|
if ScriptEditor.cp.xform[i].density = 0 then break;
|
|
|
|
NumTransforms := i;
|
|
|
|
end
|
|
|
|
else begin
|
|
|
|
LastError := Format('Morph(%d, %d, %g): ', [a, b, v]) +
|
|
|
|
TextByKey('script-status-varoutofrange');
|
|
|
|
RuntimeError(LastError);
|
|
|
|
Scripter.Halt;
|
2022-06-23 06:22:32 -04:00
|
|
|
if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV: show errors
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.PreviewProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if NumTransforms > 0 then
|
|
|
|
begin
|
|
|
|
//AMachine.Paused := True; // AV: it doesn't let to pause the animation
|
2022-06-23 06:22:32 -04:00
|
|
|
PreviewForm.cp.Copy(ScriptEditor.cp); // <-- AV: optimized for speed
|
2022-03-08 12:25:51 -05:00
|
|
|
PreviewForm.cp.AdjustScale(PreviewForm.Image.Width, PreviewForm.Image.Height);
|
|
|
|
PreviewForm.Show;
|
|
|
|
PreviewForm.DrawFlame;
|
|
|
|
//AMachine.Paused := False; // AV: it doesn't let to pause the animation
|
|
|
|
Application.ProcessMessages;
|
|
|
|
end
|
|
|
|
else AMachine.Halt;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.RenderProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if NumTransforms > 0 then
|
|
|
|
begin
|
|
|
|
ScriptRenderForm.cp.Copy(ScriptEditor.cp);
|
|
|
|
try
|
|
|
|
ScriptRenderForm.Caption := Format(ScriptRenderForm.Hint,
|
|
|
|
[ExtractFileName(ScriptEditor.Renderer.Filename)]); // AV
|
|
|
|
except
|
|
|
|
ScriptRenderForm.Caption := TextByKey('common-trace-rendering-oneslice');
|
|
|
|
end;
|
|
|
|
ScriptRenderForm.Show;
|
|
|
|
ScriptRenderForm.Render;
|
|
|
|
end
|
|
|
|
else AMachine.Halt;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.SetActiveTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
try
|
|
|
|
with AMachine do
|
|
|
|
i := GetInputArgAsInteger(0);
|
|
|
|
if (i >= 0) and (i < NXFORMS) then
|
|
|
|
ActiveTransform := i
|
|
|
|
else raise EFormatInvalid.Create('SetActiveTransform: ' + ErrorOutOfRange);
|
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
|
|
|
Application.ProcessMessages;
|
|
|
|
LastError := E.Message;
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.AddTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
try
|
|
|
|
if NumTransforms < NXFORMS then
|
|
|
|
begin
|
|
|
|
ActiveTransform := NumTransforms;
|
|
|
|
inc(NumTransforms);
|
|
|
|
scriptEditor.cp.xform[NumTransforms].Assign(scriptEditor.cp.xform[ActiveTransform]);
|
|
|
|
scriptEditor.cp.xform[ActiveTransform].Clear;
|
|
|
|
ScriptEditor.cp.xform[ActiveTransform].density := 0.5;
|
|
|
|
end
|
|
|
|
else raise EFormatInvalid.Create('AddTransform: ' + TextByKey('script-status-toomanytransforms'));
|
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
|
|
|
Application.ProcessMessages;
|
|
|
|
LastError := E.Message;
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.DeleteTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i, j: integer;
|
|
|
|
begin
|
|
|
|
try
|
|
|
|
// I'm not sure, but *maybe* this will help scripts not to screw up finalXform
|
|
|
|
if ActiveTransform = NumTransforms then
|
|
|
|
// final xform - just clear it
|
|
|
|
begin
|
|
|
|
scriptEditor.cp.xform[NumTransforms].Clear;
|
|
|
|
scriptEditor.cp.xform[NumTransforms].symmetry := 1;
|
|
|
|
scriptEditor.cp.finalXformEnabled := false;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
if NumTransforms <= 1 then exit;
|
|
|
|
|
|
|
|
// delete xform from all probability tables
|
|
|
|
for i := 0 to NumTransforms-1 do
|
|
|
|
with scriptEditor.cp.xform[i] do begin
|
|
|
|
for j := ActiveTransform to NumTransforms-1 do
|
|
|
|
modWeights[j] := modWeights[j+1];
|
|
|
|
modWeights[NumTransforms-1] := 1;
|
|
|
|
end;
|
|
|
|
//
|
|
|
|
|
|
|
|
with scriptEditor.cp do begin
|
|
|
|
if ActiveTransform = (NumTransforms - 1) then
|
|
|
|
Dec(ActiveTransform)
|
|
|
|
else begin
|
|
|
|
for i := ActiveTransform to NumTransforms - 2 do
|
|
|
|
xform[i].Assign(xform[i + 1]);
|
|
|
|
end;
|
|
|
|
Dec(NumTransforms);
|
|
|
|
xform[NumTransforms].Assign(xform[NumTransforms+1]);
|
|
|
|
xform[NumTransforms+1].Clear;
|
|
|
|
end;
|
|
|
|
except
|
|
|
|
Application.ProcessMessages;
|
|
|
|
LastError := 'DeleteTransform: Oops!';
|
2022-06-23 06:22:32 -04:00
|
|
|
i := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
ScriptEditor.Editor.ActiveLine := i;
|
|
|
|
ScriptEditor.Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
|
|
|
procedure TOperationLibrary.CopyTransformProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
old, i: integer;
|
|
|
|
begin
|
|
|
|
try
|
|
|
|
if NumTransforms < NXFORMS then
|
|
|
|
with ScriptEditor.cp do
|
|
|
|
begin
|
|
|
|
old := ActiveTransform;
|
|
|
|
ActiveTransform := NumTransforms;
|
|
|
|
inc(NumTransforms);
|
|
|
|
xform[NumTransforms].Assign(xform[ActiveTransform]); // final xform
|
|
|
|
xform[ActiveTransform].Assign(xform[old]);
|
|
|
|
|
|
|
|
for i := 0 to NumTransforms-1 do
|
|
|
|
xform[i].modWeights[ActiveTransform] := xform[i].modWeights[old];
|
|
|
|
xform[ActiveTransform].modWeights[ActiveTransform] := xform[old].modWeights[old];
|
|
|
|
end
|
|
|
|
else raise EFormatInvalid.Create(TextByKey('script-status-toomanytransforms'));
|
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
|
|
|
Application.ProcessMessages;
|
|
|
|
LastError := 'CopyTransform: ' + E.Message;
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.TranslateProc(AMachine: TatVirtualMachine);
|
|
|
|
var x, y: double;
|
|
|
|
begin
|
|
|
|
try
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then // was: NXFORMS-1
|
|
|
|
raise EFormatInvalid.Create(ErrorOutOfRange);
|
2022-06-23 06:22:32 -04:00
|
|
|
// AV: matrix multiplication must not affect the translation
|
|
|
|
// ScriptEditor.cp.xform[ActiveTransform].Translate(GetInputArgAsFloat(0), GetInputArgAsFloat(1));
|
|
|
|
x := AMachine.GetInputArgAsFloat(0);
|
|
|
|
y := AMachine.GetInputArgAsFloat(1);
|
|
|
|
with ScriptEditor.cp.xform[ActiveTransform] do
|
|
|
|
if postXswap then
|
|
|
|
Translate(p, x, y)
|
|
|
|
else
|
|
|
|
Translate(c, x, y);
|
2022-03-08 12:25:51 -05:00
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
|
|
|
Application.ProcessMessages;
|
|
|
|
LastError := 'Translate: ' + E.Message;
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TOperationLibrary.TranslatePXProc(AMachine: TatVirtualMachine);
|
|
|
|
var x, y: double;
|
|
|
|
begin
|
|
|
|
try
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then
|
|
|
|
raise EFormatInvalid.Create(ErrorOutOfRange);
|
2022-06-23 06:22:32 -04:00
|
|
|
|
|
|
|
x := AMachine.GetInputArgAsFloat(0);
|
|
|
|
y := AMachine.GetInputArgAsFloat(1);
|
|
|
|
with ScriptEditor.cp.xform[ActiveTransform] do
|
|
|
|
Translate(p, x, y);
|
2022-03-08 12:25:51 -05:00
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
|
|
|
Application.ProcessMessages;
|
|
|
|
LastError := 'TranslatePX:' + E.Message;
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
procedure NormalizeVariations(var cp1: TControlPoint); // AV: moved from Main
|
|
|
|
var
|
|
|
|
totvar, v: double;
|
|
|
|
i, j: integer;
|
|
|
|
begin
|
|
|
|
for i := 0 to cp1.NumXForms do
|
|
|
|
begin
|
|
|
|
totvar := 0;
|
|
|
|
for j := 0 to NRVAR - 1 do
|
|
|
|
begin
|
|
|
|
v := cp1.xform[i].GetVariation(j); // AV
|
|
|
|
if v < 0 then
|
|
|
|
cp1.xform[i].SetVariation(j, -v);
|
|
|
|
totvar := totvar + v;
|
|
|
|
end;
|
|
|
|
if totVar = 0 then
|
|
|
|
cp1.xform[i].SetVariation(0, 1)
|
|
|
|
else
|
|
|
|
for j := 0 to NRVAR - 1 do begin
|
|
|
|
v := cp1.xform[i].GetVariation(j); // AV
|
|
|
|
//if totVar <> 0 then // <-- AV: we've already check it!
|
|
|
|
if v <> 0 then // AV: because 0/totvar = 0
|
|
|
|
cp1.xform[i].SetVariation(j, v / totvar);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
2022-03-08 12:25:51 -05:00
|
|
|
procedure TOperationLibrary.NormalizeVars(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
NormalizeVariations(ScriptEditor.cp);
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ ************************************* Form ********************************* }
|
|
|
|
|
|
|
|
procedure TScriptEditor.FormCreate(Sender: TObject);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
self.Caption := TextByKey('script-title');
|
|
|
|
btnBreak.Hint := TextByKey('script-break');
|
|
|
|
btnNew.Hint := TextByKey('script-new');
|
|
|
|
btnOpen.Hint := TextByKey('script-open');
|
|
|
|
btnSave.Hint := TextByKey('script-save');
|
|
|
|
btnRun.Hint := TextByKey('script-run');
|
|
|
|
btnStop.Hint := TextByKey('script-stop');
|
2022-06-23 06:22:32 -04:00
|
|
|
btnFavorite.Hint := TextByKey('script-faves');
|
2022-03-08 12:25:51 -05:00
|
|
|
CodeButton.Hint := TextByKey('script-codeblocks');
|
|
|
|
btnPause.Hint := TextByKey('script-pause');
|
|
|
|
ShowCodeHints.Caption := TextByKey('script-codeblockhints');
|
|
|
|
Panel1.Hint := TextByKey('script-codeblockhint');
|
|
|
|
mnuUndo.Caption := TextByKey('common-undo');
|
|
|
|
mnuRedo.Caption := TextByKey('common-redo');
|
|
|
|
mnuCut.Caption := TextByKey('common-cut');
|
|
|
|
mnuCopy.Caption := TextByKey('common-copy');
|
|
|
|
mnuPaste.Caption := TextByKey('common-paste');
|
|
|
|
mnuDeleteBlock.Caption := TextByKey('common-delete');
|
|
|
|
EditCaption1.Caption := TextByKey('common-rename');
|
|
|
|
FindReplace.Caption := TextByKey('script-findreplace');
|
|
|
|
SurroundBlock.Caption := TextByKey('script-surround');
|
|
|
|
CommentOut.Caption := TextByKey('script-commentout');
|
|
|
|
CollapseBlocks.Caption := TextByKey('script-collapsecode');
|
|
|
|
ExpandBlocks.Caption := TextByKey('script-expandcode');
|
|
|
|
AddFromClipboard.Caption := TextByKey('script-clipboardview');
|
|
|
|
ScrMemoFindReplaceDialog1.NotFoundMessage := TextByKey('script-textnotfound');
|
|
|
|
StatusBar.Hint := TextByKey('script-status-default');
|
|
|
|
StatusBar.SimpleText := StatusBar.Hint;
|
|
|
|
|
|
|
|
// AV: changed to variable
|
|
|
|
ErrorOutOfRange := TextByKey('script-status-outofrange');
|
|
|
|
RTError := #13#10 + TextByKey('script-runtimeerror') + #13#10 +
|
|
|
|
StringOfChar('=', length(TextByKey('script-runtimeerror'))) + #13#10;
|
|
|
|
DTError := #13#10 + TextByKey('script-compileerror') + #13#10 +
|
|
|
|
StringOfChar('=', length(TextByKey('script-compileerror'))) + #13#10;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
// AV: moved this into OnCreate handler since filters never change
|
|
|
|
MainOpenDialog.Filter := Format('%s|*.aposcript;*.asc|%s|*.*',
|
|
|
|
[TextByKey('common-filter-scriptfiles'),
|
|
|
|
TextByKey('common-filter-allfiles')]);
|
|
|
|
MainSaveDialog.Filter := MainOpenDialog.Filter; // AV
|
|
|
|
|
2022-03-08 12:25:51 -05:00
|
|
|
// AV: added language translation here:
|
|
|
|
SaveDialog.Filter := TextByKey('common-filter-flamefiles') + '|*.flame;*rand;*.template|'
|
2022-06-23 06:22:32 -04:00
|
|
|
+ TextByKey('common-filter-undofiles') + '|*.undo;*.apo|'
|
|
|
|
+ TextByKey('common-filter-allfiles') + '|*.*';
|
|
|
|
OpenDialog.Filter := TextByKey('common-filter-flamefiles') +'|*.flame;*rand;*.template|' +
|
|
|
|
TextByKey('common-filter-scriptfiles') + '|*.asc;*aposcript|' +
|
|
|
|
TextByKey('common-filter-undofiles') + '|*.undo;*.apo|' +
|
|
|
|
TextByKey('common-filter-allfiles') + '|*.*';
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
Transform := TTransform.create;
|
2022-06-23 06:22:32 -04:00
|
|
|
ScFileList := TStringList.Create;
|
2022-03-08 12:25:51 -05:00
|
|
|
Flame := TFlame.Create;
|
|
|
|
Options := TOptions.Create;
|
|
|
|
Pivot := TPivot.Create;
|
|
|
|
Renderer := TScriptRender.create;
|
|
|
|
Another := TScriptRender.create;
|
|
|
|
cp := TControlPoint.create;
|
|
|
|
for i := 0 to 9 do
|
|
|
|
cps[i] := TControlPoint.create;
|
|
|
|
ScriptEditor.PrepareScripter;
|
|
|
|
|
|
|
|
if (defScriptFile <> '') then // AV
|
|
|
|
try
|
|
|
|
if FileExists(defScriptFile) then begin
|
|
|
|
LoadScriptFile(defScriptFile);
|
|
|
|
Script := defScriptFile;
|
|
|
|
end;
|
|
|
|
except
|
|
|
|
Editor.Lines.Clear;
|
|
|
|
end;
|
2022-06-23 06:22:32 -04:00
|
|
|
// AV: change scripter font ang background for dark themes
|
|
|
|
AdjustScripterColors;
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.FormDestroy(Sender: TObject);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
ScFileList.Free;
|
2022-03-08 12:25:51 -05:00
|
|
|
Renderer.Free;
|
|
|
|
Another.Free;
|
|
|
|
for i := 0 to 9 do
|
|
|
|
cps[i].free;
|
|
|
|
cp.free;
|
|
|
|
Flame.Free;
|
|
|
|
Transform.Free;
|
|
|
|
Options.Free;
|
|
|
|
Pivot.Free;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.FormShow(Sender: TObject);
|
|
|
|
var
|
|
|
|
Registry: TRegistry;
|
|
|
|
begin
|
|
|
|
Registry := TRegistry.Create;
|
|
|
|
try
|
|
|
|
Registry.RootKey := HKEY_CURRENT_USER;
|
|
|
|
if Registry.OpenKey('Software\' + APP_NAME + '\Forms\Script', False) then
|
|
|
|
begin
|
|
|
|
{ Size and position }
|
|
|
|
if Registry.ValueExists('Left') then
|
|
|
|
ScriptEditor.Left := Registry.ReadInteger('Left');
|
|
|
|
if Registry.ValueExists('Top') then
|
|
|
|
ScriptEditor.Top := Registry.ReadInteger('Top');
|
|
|
|
if Registry.ValueExists('Width') then
|
|
|
|
ScriptEditor.Width := Registry.ReadInteger('Width');
|
|
|
|
if Registry.ValueExists('Height') then
|
|
|
|
ScriptEditor.Height := Registry.ReadInteger('Height');
|
|
|
|
if Registry.ValueExists('PreviewFrame') then // AV
|
|
|
|
PreviewForm.KeepFrame.Checked := Registry.ReadBool('PreviewFrame');
|
|
|
|
end;
|
|
|
|
Registry.CloseKey;
|
|
|
|
finally
|
|
|
|
Registry.Free;
|
|
|
|
end;
|
|
|
|
|
|
|
|
mnuUndo.Enabled := Editor.CanUndo; // AV
|
|
|
|
mnuRedo.Enabled := Editor.CanRedo; // AV
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.FormClose(Sender: TObject;
|
|
|
|
var Action: TCloseAction);
|
|
|
|
var
|
|
|
|
Registry: TRegistry;
|
|
|
|
begin
|
|
|
|
{ Write position to registry }
|
|
|
|
Registry := TRegistry.Create;
|
|
|
|
try
|
|
|
|
Registry.RootKey := HKEY_CURRENT_USER;
|
|
|
|
{ Defaults }
|
|
|
|
if Registry.OpenKey('\Software\' + APP_NAME + '\Forms\Script', True) then
|
|
|
|
begin
|
|
|
|
{ Size and position }
|
|
|
|
if ScriptEditor.WindowState <> wsMaximized then begin
|
|
|
|
Registry.WriteInteger('Top', ScriptEditor.Top);
|
|
|
|
Registry.WriteInteger('Left', ScriptEditor.Left);
|
|
|
|
Registry.WriteInteger('Width', ScriptEditor.Width);
|
|
|
|
Registry.WriteInteger('Height', ScriptEditor.Height);
|
|
|
|
Registry.WriteBool('PreviewFrame', PreviewForm.KeepFrame.Checked); // AV
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
finally
|
|
|
|
Registry.Free;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
{ ************************ Flame interface *********************************** }
|
|
|
|
|
|
|
|
{ The TFlame class is used only as an interface. The control point parameters
|
|
|
|
are read and set directly. Parameter ranges aren't limited but values not
|
|
|
|
in the correct range are ignored. }
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameGammaThresholdProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.gammaThreshRelative);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameGammaThresholdProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v > 0) then cp.gammaThreshRelative := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameGammaProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.Gamma);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameGammaProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
2022-06-23 06:22:32 -04:00
|
|
|
if (v > 0) and (v <= 10) then cp.Gamma := v; // AV: added max check
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameBrightnessProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.Brightness);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameBrightnessProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v > 0) and (v <= 100) then cp.Brightness := v; // AV: added max check
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameVibrancyProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.Vibrancy);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameVibrancyProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v > 0) and (v <= 30) then cp.Vibrancy := v; // AV: added max check
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameContrastProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.Contrast); // AV
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameContrastProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0.1) and (v <= 10) then cp.Contrast := v; // AV
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameTimeProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.Time);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameTimeProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0) then cp.Time := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetPreviewHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(PreviewForm.ClientHeight);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetPreviewHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 100) and (v <= Screen.Height - 34) then
|
|
|
|
PreviewForm.ClientHeight:= v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetPreviewWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(PreviewForm.ClientWidth);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetPreviewWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 100) and (v <= Screen.Width - 16) then
|
|
|
|
PreviewForm.ClientWidth:= v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameZoomProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.Zoom);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameZoomProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= -3) and (v <= 3) then cp.Zoom := v; // AV: added check
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameXProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.center[0]);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameXProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.center[0] := GetInputArgAsFloat(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameYProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.center[1]);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameYProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.center[1] := GetInputArgAsFloat(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameDensityProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.sample_density);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameDensityProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if v >= 0 then cp.sample_density := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameOversampleProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.spatial_oversample);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameOversampleProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
{ Range = 1 to 4 ... (document this) }
|
|
|
|
if (v >= 1) and (v <= 4) then cp.spatial_oversample := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameFilterRadiusProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.spatial_filter_radius);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameFilterRadiusProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if v >= 0 then cp.spatial_filter_radius := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameFinalxformEnabledProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.finalXformEnabled);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameFinalxformEnabledProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.finalXformEnabled := (GetInputArgAsInteger(0) <> 0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameSoloXformProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.soloXform);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameSoloXformProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.soloXform := GetInputArgAsInteger(0);
|
|
|
|
if (cp.soloXform < 0) or (cp.soloXform >= NumTransforms) then
|
|
|
|
cp.soloXform := -1;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.width);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if v >= 1 then cp.width := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.height);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if v >= 1 then cp.height := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlamePixelsPerUnitProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
// ReturnOutPutArg(cp.pixels_per_unit);
|
|
|
|
ReturnOutPutArg(100 * cp.pixels_per_unit/cp.Width);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlamePixelsPerUnitProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
// cp.pixels_per_unit := GetInputArgAsInteger(0); <<--- hmm, ppu isn't integer :-\
|
|
|
|
cp.pixels_per_unit := GetInputArgAsFloat(0) * cp.Width / 100.0;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlamePaletteProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do // AV: was Integer(GetArrayIndex())
|
|
|
|
ReturnOutPutArg(cp.cmap[GetArrayIndexAsInteger(0), GetArrayIndexAsInteger(1)]);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlamePaletteProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i0, i1, v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
i0 := GetArrayIndexAsInteger(0); // AV: was GetArrayIndex(0)
|
|
|
|
i1 := GetArrayIndexAsInteger(1); // AV: was GetArrayIndex(1)
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (i0 >= 0) and (i0 <= 255) and (i1 >= 0) and (i1 <= 2) and
|
|
|
|
(v >= 0) and (v < 256) then
|
|
|
|
cp.cmap[i0, i1] := v
|
|
|
|
else begin
|
|
|
|
LastError := 'Flame.Gradient[' + IntToStr(i0) + ', ' + IntToStr(i1) + ']: '
|
|
|
|
+ TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameBackgroundProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do // AV: was Integer(GetArrayIndex(0))
|
|
|
|
ReturnOutPutArg(cp.background[GetArrayIndexAsInteger(0)]);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameBackgroundProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i, v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
i := GetArrayIndexAsInteger(0); // AV: was GetArrayIndex(0)
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (i >= 0) and (i <= 2) and (v >= 0) and (v < 256) then
|
|
|
|
cp.Background[i] := v
|
|
|
|
else begin
|
|
|
|
LastError := 'Flame.Background[' + IntToStr(i) + ']: '
|
|
|
|
+ TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameNameProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
cp.name := AMachine.GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameNameProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
AMachine.ReturnOutPutArg(cp.name);
|
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
procedure TScriptEditor.SetFlameCommentProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
cp.comment := AMachine.GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameCommentProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
AMachine.ReturnOutPutArg(cp.comment);
|
|
|
|
end;
|
|
|
|
|
2022-03-08 12:25:51 -05:00
|
|
|
(*
|
|
|
|
procedure TScriptEditor.SetFlameNickProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
cp.nick := AMachine.GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameURLProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
AMachine.ReturnOutPutArg(cp.url);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameURLProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
cp.url := AMachine.GetInputArgAsString(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameNickProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
AMachine.ReturnOutPutArg(cp.nick);
|
|
|
|
end;
|
|
|
|
*)
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameHueProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
n: double;
|
|
|
|
//i: byte;
|
|
|
|
//h, s, v: real;
|
|
|
|
begin
|
|
|
|
n := AMachine.GetInputArgAsFloat(0);
|
|
|
|
if (n >= 0) and (n <= 1) then
|
|
|
|
begin
|
|
|
|
cp.hue_rotation := n;
|
|
|
|
{if (n = 0) or (n = 1) then exit;
|
|
|
|
for i := 0 to 255 do
|
|
|
|
begin
|
|
|
|
RGBToHSV(cp.cmap[i][0], cp.cmap[i][1], cp.cmap[i][2], h, s, v);
|
|
|
|
h := Round(360 + h + (n * 360)) mod 360;
|
|
|
|
HSVToRGB(h, s, v, cp.cmap[i][0], cp.cmap[i][1], cp.cmap[i][2]);
|
|
|
|
end; }
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameHueProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
AMachine.ReturnOutPutArg(cp.hue_rotation);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameBatchesProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.nbatches);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameBatchesProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.nbatches := GetInputArgAsInteger(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameAngleProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v:double;
|
|
|
|
begin
|
|
|
|
// AV: fixed, someone forgot to translate from/to radians
|
|
|
|
v := cp.FAngle * 180 / PI;
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(v);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameAngleProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v:double;
|
|
|
|
begin
|
|
|
|
// AV: fixed, someone forgot to translate from/to radians
|
|
|
|
with AMachine do
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
cp.FAngle := v * PI / 180;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlamePitchProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v:double;
|
|
|
|
begin
|
|
|
|
// fix: someone forgot to translate from/to radians
|
|
|
|
v := cp.cameraPitch * 180 / PI;
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(v);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlamePitchProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v:double;
|
|
|
|
begin
|
|
|
|
// fix: someone forgot to translate from/to radians
|
|
|
|
with AMachine do
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
cp.cameraPitch := v * PI / 180;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameRollProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v:double;
|
|
|
|
begin
|
|
|
|
// fix: someone forgot to translate from/to radians
|
|
|
|
v := cp.cameraRoll * 180 / PI;
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(v);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameRollProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v:double;
|
|
|
|
begin
|
|
|
|
// fix: someone forgot to translate from/to radians
|
|
|
|
with AMachine do
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
cp.cameraRoll := v * PI / 180;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameYawProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v:double;
|
|
|
|
begin
|
|
|
|
// fix: someone forgot to translate from/to radians
|
|
|
|
v := cp.cameraYaw * 180 / PI;
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(v);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameYawProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v:double;
|
|
|
|
begin
|
|
|
|
// fix: someone forgot to translate from/to radians
|
|
|
|
with AMachine do
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
cp.cameraYaw := v * PI / 180;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameCamZposProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.cameraZpos);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameCamZposProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.cameraZpos := GetInputArgAsFloat(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlamePerspectiveProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.cameraPersp);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlamePerspectiveProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.cameraPersp := GetInputArgAsFloat(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetFlameDOFProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.cameraDOF);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetFlameDOFProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.cameraDOF := GetInputArgAsFloat(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ *************************** Transform interface **************************** }
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformPostxformEnabledProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].postXswap);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformPostxformEnabledProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.xform[ActiveTransform].postXswap := (GetInputArgAsInteger(0) <> 0);
|
|
|
|
end;
|
|
|
|
///////////////////////////////
|
|
|
|
procedure TScriptEditor.GetTransformAProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].c[0, 0]);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformAProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.xform[ActiveTransform].c[0, 0] := GetInputArgAsFloat(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformBProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
v := cp.xform[ActiveTransform].c[1, 0];
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(-v); // AV: fixed the sign
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformBProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
cp.xform[ActiveTransform].c[1, 0] := -v; // AV: fixed the sign
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformCProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
v := cp.xform[ActiveTransform].c[0, 1];
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(-v); // AV: fixed the sign
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformCProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
cp.xform[ActiveTransform].c[0, 1] := -v; // AV: fixed the sign
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformDProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].c[1, 1]);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformDProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.xform[ActiveTransform].c[1, 1] := GetInputArgAsFloat(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformEProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].c[2, 0]);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformEProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
cp.xform[ActiveTransform].c[2, 0] := GetInputArgAsFloat(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformFProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
v := cp.xform[ActiveTransform].c[2, 1];
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(-v); // AV: fixed the sign
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformFProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
cp.xform[ActiveTransform].c[2, 1] := -v; // AV: fixed the sign
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformColorProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].Color);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformColorProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0) and (v <= 1) then
|
|
|
|
cp.xform[ActiveTransform].Color := v
|
|
|
|
else begin
|
|
|
|
LastError := 'Transform.Color: ' + TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformVarColorProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].pluginColor);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformVarColorProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0) and (v <= 1) then
|
|
|
|
cp.xform[ActiveTransform].pluginColor := v
|
|
|
|
else begin
|
|
|
|
LastError := 'Transform.VarColor: ' + TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformWeightProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].density);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformWeightProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 1E-6) and (v <= MAX_WEIGHT) then // AV: was min=0 that is not allowed
|
|
|
|
cp.xform[ActiveTransform].density := v
|
|
|
|
else begin
|
|
|
|
LastError := 'Transform.Weight: ' + TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformSymProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].symmetry);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformSymProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
s: string;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= -1) and (v <= 1) then
|
|
|
|
cp.xform[ActiveTransform].symmetry := v
|
|
|
|
else begin
|
|
|
|
s := AMachine.CurrentPropertyName;
|
|
|
|
LastError := 'Transform.' + s + ': ' + TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformVarProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do // AV: was GetArrayIndex(0)
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].GetVariation(GetArrayIndexAsInteger(0)));
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformVarProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
i := GetArrayIndexAsInteger(0); // AV: was GetArrayIndex(0)
|
|
|
|
if (i >= 0) and (i < NRVAR) then
|
|
|
|
cp.xform[ActiveTransform].SetVariation(i, v);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformVariProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do begin // AV: was GetArrayIndex(0)
|
|
|
|
cp.xform[ActiveTransform].GetVariable(GetVariableNameAt(GetArrayIndexAsInteger(0)), v);
|
|
|
|
ReturnOutPutArg(v);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformVariProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
i := GetArrayIndexAsInteger(0); // AV: was GetArrayIndex(0)
|
|
|
|
if (i >= 0) and (i < GetNrVariableNames) then
|
|
|
|
cp.xform[ActiveTransform].SetVariable(GetVariableNameAt(i), v);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformChaosProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].modWeights[Integer(GetArrayIndex(0))]);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformChaosProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
i := GetArrayIndexAsInteger(0); // AV: was GetArrayIndex(0)
|
|
|
|
if (i >= 0) and (i < NumTransforms) then
|
|
|
|
cp.xform[ActiveTransform].modWeights[i] := v
|
|
|
|
else begin
|
|
|
|
LastError := 'Transform.Chaos[' + IntToStr(i) + ']: '
|
|
|
|
+ TextByKey('script-status-varoutofrange');
|
|
|
|
i := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLine := i; // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformPlotModeProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
if cp.xform[ActiveTransform].transOpacity=0 then
|
|
|
|
ReturnOutPutArg(1)
|
|
|
|
else
|
|
|
|
ReturnOutPutArg(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformPlotModeProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v <> 0) then cp.xform[ActiveTransform].transOpacity := 1
|
|
|
|
else cp.xform[ActiveTransform].transOpacity := 0;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformOpacityProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
AMachine.ReturnOutPutArg(cp.xform[ActiveTransform].transOpacity)
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformOpacityProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (v >= 0) and (v <= 1) then // AV: add a check
|
|
|
|
cp.xform[ActiveTransform].transOpacity := v
|
|
|
|
else begin // AV: add error handler
|
|
|
|
LastError := 'Transform.Opacity: ' + TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine :=
|
|
|
|
LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
// -- vars as props --
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformVariationProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.Variation[]: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
i := 0;
|
|
|
|
while (i < NRVAR) and (Lowercase(varnames(i)) <> Lowercase(CurrentPropertyName)) do Inc(i);
|
|
|
|
if (i < NRVAR) then
|
|
|
|
ReturnOutPutArg(cp.xform[ActiveTransform].GetVariation(i))
|
|
|
|
else begin // shouldn't happen
|
|
|
|
LastError := 'Cannot find variation at index ' + CurrentPropertyName + ' - ignoring';
|
|
|
|
// ScriptEditor.Console.Lines.Add(LastError);
|
|
|
|
// Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformVariationProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.Variation[]: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
i := 0;
|
|
|
|
while (i < NRVAR) and (lowercase(varnames(i)) <> lowercase(CurrentPropertyName)) do Inc(i);
|
|
|
|
if (i < NRVAR) then
|
|
|
|
cp.xform[ActiveTransform].SetVariation(i, GetInputArgAsFloat(0))
|
|
|
|
else begin // shouldn't happen
|
|
|
|
LastError := 'Cannot find variation at index ' + CurrentPropertyName + ' - ignoring';
|
|
|
|
// ScriptEditor.Console.Lines.Add(LastError);
|
|
|
|
// Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformVariableProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.Variable[]: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
cp.xform[ActiveTransform].GetVariable(CurrentPropertyName, v);
|
|
|
|
ReturnOutPutArg(v);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformVariableProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
begin
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.Variable[]: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
cp.xform[ActiveTransform].SetVariable(CurrentPropertyName, v);
|
|
|
|
end
|
|
|
|
end;
|
|
|
|
|
|
|
|
//////////// Variaton Order Utils ///////////
|
|
|
|
procedure TScriptEditor.TransformMoveVarProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: string;
|
|
|
|
i, n: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do begin
|
|
|
|
v := GetInputArgAsString(0); // name
|
|
|
|
n := GetInputArgAsInteger(1); // position
|
|
|
|
end;
|
|
|
|
i := GetVariationIndex(v);
|
|
|
|
if (i >= 0) and (n >= 0) and (n < NrVar) then
|
|
|
|
begin
|
|
|
|
i := cp.xform[ActiveTransform].ifs.IndexOf(v);
|
|
|
|
cp.xform[ActiveTransform].ifs.Move(i, n);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformExchangeVarsProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v, s: string;
|
|
|
|
i, n: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do begin
|
|
|
|
v := GetInputArgAsString(0);
|
|
|
|
s := GetInputArgAsString(1);
|
|
|
|
end;
|
|
|
|
i := GetVariationIndex(v);
|
|
|
|
n := GetVariationIndex(s);
|
|
|
|
if (i >= 0) and (i < NrVar) and (n >= 0) and (n < NrVar) then
|
|
|
|
cp.xform[ActiveTransform].ifs.Exchange(i, n);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformCopyVarOrderProc(AMachine: TatVirtualMachine);
|
|
|
|
var i: integer;
|
|
|
|
begin
|
|
|
|
i := AMachine.GetInputArgAsInteger(0);
|
|
|
|
if (i <> ActiveTransform) and (i >= 0) and (i <= Transforms) then
|
|
|
|
cp.xform[ActiveTransform].ifs.Assign(cp.xform[i].ifs);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformGetVarOrderProc(AMachine: TatVirtualMachine);
|
|
|
|
var v: string;
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
v := GetInputArgAsString(0);
|
|
|
|
i := cp.xform[ActiveTransform].ifs.IndexOf(v);
|
|
|
|
AMachine.ReturnOutPutArg(i);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformSortVarsProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
cp.xform[ActiveTransform].ifs.Sort;
|
|
|
|
cp.xform[ActiveTransform].ifs.Sorted := False;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformDefaultVarOrderProc(AMachine: TatVirtualMachine);
|
|
|
|
var i: integer;
|
|
|
|
begin
|
|
|
|
for i := 0 to NrVar-1 do
|
|
|
|
cp.xform[ActiveTransform].ifs.Strings[i] := Varnames(i);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformDisplayVarsProc(AMachine: TatVirtualMachine);
|
|
|
|
var i: integer;
|
|
|
|
begin
|
|
|
|
Console.Lines.Add('');
|
|
|
|
if ActiveTransform = Transforms then
|
|
|
|
Console.Lines.Add('Variation Order for Final Transform')
|
|
|
|
else
|
|
|
|
Console.Lines.Add('Variation Order for Transform ' + IntToStr(ActiveTransform + 1));
|
|
|
|
Console.Lines.Add('===========================');
|
|
|
|
for i := 0 to NrVar-1 do
|
|
|
|
Console.Lines.Add(IntToStr(i) + #32#32 + cp.xform[ActiveTransform].ifs.Strings[i]);
|
|
|
|
end;
|
|
|
|
////////////////////////////////////////////
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformNameProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform >= Transforms) then begin
|
|
|
|
LastError := 'Transform.Name: ' + ErrorOutOfRange;
|
|
|
|
Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
with AMachine do ReturnOutputArg(cp.xform[ActiveTransform].TransformName);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformNameProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform >= Transforms) then begin
|
|
|
|
LastError := 'Transform.Name: ' + ErrorOutOfRange;
|
|
|
|
Editor.ActiveLine := LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
with AMachine do
|
|
|
|
cp.xform[ActiveTransform].TransformName := GetInputArgAsString(0);;
|
|
|
|
end;
|
|
|
|
|
|
|
|
// -- coefs & post-coefs --
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformCoefsProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
i, j: integer;
|
|
|
|
begin
|
|
|
|
{
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.coefs[]: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
}
|
|
|
|
with AMachine do begin
|
|
|
|
i := GetArrayIndex(0);
|
|
|
|
j := GetArrayIndex(1);
|
|
|
|
if (i < 0) or (i > 2) or (j < 0) or (j > 1) then begin
|
|
|
|
LastError := 'Transform.coefs[]: ' + TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine :=
|
|
|
|
LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
v := cp.xform[ActiveTransform].c[i, j];
|
|
|
|
if (i=0)and(j=0) or (i=1)and(j=1) or (i=2)and(j=0) then
|
|
|
|
ReturnOutPutArg(v)
|
|
|
|
else
|
|
|
|
ReturnOutPutArg(-v);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformCoefsProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
i, j: integer;
|
|
|
|
begin
|
|
|
|
{
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.coefs[]: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
}
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
i := GetArrayIndex(0);
|
|
|
|
j := GetArrayIndex(1);
|
|
|
|
if (i < 0) or (i > 2) or (j < 0) or (j > 1) then begin
|
|
|
|
LastError := 'Transform.coefs[]: ' + TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine :=
|
|
|
|
LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (i=0)and(j=0) or (i=1)and(j=1) or (i=2)and(j=0) then
|
|
|
|
cp.xform[ActiveTransform].c[i, j] := v
|
|
|
|
else if (i=0)and(j=1) or (i=1)and(j=0) or (i=2)and(j=1) then
|
|
|
|
cp.xform[ActiveTransform].c[i, j] := -v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetTransformPostCoefsProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
i, j: integer;
|
|
|
|
begin
|
|
|
|
{
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.post[]: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
}
|
|
|
|
with AMachine do begin
|
|
|
|
i := GetArrayIndex(0);
|
|
|
|
j := GetArrayIndex(1);
|
|
|
|
if (i < 0) or (i > 2) or (j < 0) or (j > 1) then begin
|
|
|
|
LastError := 'Transform.post[]: ' + TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine :=
|
|
|
|
LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
v := cp.xform[ActiveTransform].p[i, j];
|
|
|
|
if (i=0)and(j=0) or (i=1)and(j=1) or (i=2)and(j=0) then
|
|
|
|
ReturnOutPutArg(v)
|
|
|
|
else
|
|
|
|
ReturnOutPutArg(-v);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetTransformPostCoefsProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: double;
|
|
|
|
i, j: integer;
|
|
|
|
begin
|
|
|
|
{
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.post[]: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
}
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
i := GetArrayIndex(0);
|
|
|
|
j := GetArrayIndex(1);
|
|
|
|
if (i < 0) or (i > 2) or (j < 0) or (j > 1) then begin
|
|
|
|
LastError := 'Transform.post[]: ' + TextByKey('script-status-varoutofrange');
|
|
|
|
Editor.ActiveLine :=
|
|
|
|
LineNumberFromInstruction(AMachine.CurrentInstruction); // AV
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := true; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
v := GetInputArgAsFloat(0);
|
|
|
|
if (i=0)and(j=0) or (i=1)and(j=1) or (i=2)and(j=0) then
|
|
|
|
cp.xform[ActiveTransform].p[i, j] := v
|
|
|
|
else if (i=0)and(j=1) or (i=1)and(j=0) or (i=2)and(j=1) then
|
|
|
|
cp.xform[ActiveTransform].p[i, j] := -v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformSwapCoefsProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
i, j: integer;
|
|
|
|
t: double;
|
|
|
|
begin
|
|
|
|
with cp.xform[ActiveTransform] do
|
|
|
|
for i := 0 to 2 do
|
|
|
|
for j := 0 to 1 do
|
|
|
|
begin
|
|
|
|
t := c[i, j];
|
|
|
|
c[i,j] := p[i, j];
|
|
|
|
p[i, j] := t;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformResetVariables(AMachine: TatVirtualMachine);
|
|
|
|
var i: integer;
|
|
|
|
begin
|
|
|
|
for i:= 0 to GetNrVariableNames - 1 do begin
|
|
|
|
cp.xform[ActiveTransform].ResetVariable(GetVariableNameAt(i));
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.CodeButtonClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
Panel1.Visible := not Panel1.Visible;
|
|
|
|
CodeButton.Down := Panel1.Visible;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.CollapseBlocksClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
Editor.CollapseAllNodes;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SurroundByClick(Sender: TObject); // AV: for code auto-completition
|
|
|
|
var i, j, k, m: integer;
|
|
|
|
begin
|
|
|
|
if Sender = N5 then
|
|
|
|
Editor.Selection := ' { ' + Editor.Selection + ' } '
|
|
|
|
else if Sender = N6 then
|
|
|
|
Editor.Selection := ' (* ' + Editor.Selection + ' *) '
|
|
|
|
else if Sender = N7 then
|
|
|
|
with Editor do begin
|
|
|
|
if (SelStartY = SelEndY) then
|
|
|
|
InsertTextAtXY( ' // ', SelStartX, SelStartY)
|
|
|
|
else begin
|
|
|
|
mnuUndo.Enabled := True;
|
|
|
|
BeginUpdate;
|
|
|
|
if (SelStartY > SelEndY) then
|
|
|
|
begin
|
|
|
|
j := SelEndX;
|
|
|
|
k := SelEndY;
|
|
|
|
m := SelStartY;
|
|
|
|
end
|
|
|
|
else begin
|
|
|
|
j := SelStartX;
|
|
|
|
k := SelStartY;
|
|
|
|
m := SelEndY;
|
|
|
|
end;
|
|
|
|
for i := k + 1 to m do
|
|
|
|
InsertTextAtXY(' // ', 0, i);
|
|
|
|
InsertTextAtXY(' // ', j, k);
|
|
|
|
EndUpdate;
|
|
|
|
end;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
with Editor do
|
|
|
|
begin
|
|
|
|
//if SelLength = 0 then exit;
|
|
|
|
mnuUndo.Enabled := True;
|
|
|
|
BeginUpdate;
|
|
|
|
if (SelEndY = Lines.Count-1) then Lines.Add('');
|
|
|
|
if (SelStartY > SelEndY) then
|
|
|
|
begin
|
|
|
|
k := SelEndY;
|
|
|
|
m := SelStartY;
|
|
|
|
end
|
|
|
|
else begin
|
|
|
|
k := SelStartY;
|
|
|
|
m := SelEndY;
|
|
|
|
end;
|
2022-06-23 06:22:32 -04:00
|
|
|
BlockIndent(k, m, 4);
|
2022-03-08 12:25:51 -05:00
|
|
|
if Sender = BeginEnd1 then begin
|
|
|
|
InsertTextAtXY('begin'#13#10, 0, k);
|
|
|
|
InsertTextAtXY('end;'#13#10, 0, m + 2);
|
|
|
|
end
|
|
|
|
else begin // if Sender = TryExcept1
|
|
|
|
InsertTextAtXY('try'#13#10, 0, k);
|
|
|
|
InsertTextAtXY('except'#13#10#13#10'end;'#13#10, 0, m + 2);
|
|
|
|
end;
|
|
|
|
EndUpdate;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformClearProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
cp.xform[ActiveTransform].Clear;
|
|
|
|
if ActiveTransform < Transforms then
|
|
|
|
cp.xform[ActiveTransform].density := 0.5
|
|
|
|
else
|
|
|
|
cp.xform[ActiveTransform].symmetry := 1;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformRotateOriginProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
tx, ty, rad, sinr, cosr: double;
|
|
|
|
begin
|
|
|
|
|
|
|
|
if cp.xform[ActiveTransform].postXswap then
|
|
|
|
begin
|
|
|
|
TransformRotatePXOriginProc(AMachine);
|
|
|
|
Exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.RotateOrigin: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
rad := AMachine.GetInputArgAsFloat(0) * pi / 180;
|
|
|
|
SinCos(rad, sinr, cosr);
|
|
|
|
with EditForm.WorldPivot do
|
|
|
|
with cp.xform[ActiveTransform] do begin
|
|
|
|
tx := x + (c[2,0] - x) * cosr - (-c[2,1] - y) * sinr;
|
|
|
|
ty := y + (c[2,0] - x) * sinr + (-c[2,1] - y) * cosr;
|
|
|
|
c[2,0] := tx;
|
|
|
|
c[2,1] := -ty;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformRotatePXOriginProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
tx, ty, rad, sinr, cosr: double;
|
|
|
|
begin
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
LastError := 'Transform.RotatePXOrigin: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
rad := AMachine.GetInputArgAsFloat(0) * pi / 180;
|
|
|
|
SinCos(rad, sinr, cosr);
|
|
|
|
with EditForm.WorldPivot do
|
|
|
|
with cp.xform[ActiveTransform] do begin
|
|
|
|
tx := x + (p[2,0] - x) * cosr - (-p[2,1] - y) * sinr;
|
|
|
|
ty := y + (p[2,0] - x) * sinr + (-p[2,1] - y) * cosr;
|
|
|
|
p[2,0] := tx;
|
|
|
|
p[2,1] := -ty;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
// AV -- pivot-aware reflections --
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformFlipHorizProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if cp.xform[ActiveTransform].postXswap then
|
|
|
|
begin
|
|
|
|
TransformFlipPXHorizProc(AMachine);
|
|
|
|
Exit;
|
|
|
|
end;
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
LastError := 'Transform.FlipHoriz: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
with cp.xform[ActiveTransform] do
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
c[0,0] := -c[0,0];
|
|
|
|
c[1,0] := -c[1,0];
|
2022-03-08 12:25:51 -05:00
|
|
|
with EditForm do
|
|
|
|
if (PivotMode = PivotWorld) then
|
|
|
|
c[2,0] := 2 * WorldPivot.x - c[2,0];
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformFlipPXHorizProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
LastError := 'Transform.FlipPXHoriz: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
with cp.xform[ActiveTransform] do
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
p[0,0] := -p[0,0];
|
|
|
|
p[1,0] := -p[1,0];
|
2022-03-08 12:25:51 -05:00
|
|
|
with EditForm do
|
|
|
|
if (PivotMode = PivotWorld) then
|
|
|
|
p[2,0] := 2 * WorldPivot.x - p[2,0];
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformFlipVertProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if cp.xform[ActiveTransform].postXswap then
|
|
|
|
begin
|
|
|
|
TransformFlipPXVertProc(AMachine);
|
|
|
|
Exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
LastError := 'Transform.FlipVert: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
with cp.xform[ActiveTransform] do
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
c[0,1] := -c[0,1];
|
|
|
|
c[1,1] := -c[1,1];
|
2022-03-08 12:25:51 -05:00
|
|
|
with EditForm do
|
|
|
|
if (PivotMode = PivotWorld) then
|
|
|
|
c[2,1] := -2 * WorldPivot.y - c[2,1];
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformFlipPXVertProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
LastError := 'Transform.FlipPXVert: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
with cp.xform[ActiveTransform] do
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
p[0,1] := -p[0,1];
|
|
|
|
p[1,1] := -p[1,1];
|
2022-03-08 12:25:51 -05:00
|
|
|
with EditForm do
|
|
|
|
if (PivotMode = PivotWorld) then
|
|
|
|
p[2,1] := -2 * WorldPivot.y - p[2,1];
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
// -- pivot-aware rotating & scaling --
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformRotateProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
Triangles: TTriangles;
|
|
|
|
px, py: double;
|
|
|
|
|
|
|
|
tx: TXForm;
|
|
|
|
begin
|
|
|
|
if cp.xform[ActiveTransform].postXswap then
|
|
|
|
begin
|
|
|
|
TransformRotatePXProc(AMachine);
|
|
|
|
Exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
LastError := 'Transform.Rotate: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
tx := TXForm.Create;
|
|
|
|
tx.Assign(scripteditor.cp.xform[NumTransforms]); // just in case (?)
|
|
|
|
|
|
|
|
EditForm.ScriptGetPivot(px, py);
|
|
|
|
cp.TrianglesFromCp(Triangles); // it's ugly but it works...
|
|
|
|
Triangles[ActiveTransform] :=
|
|
|
|
RotateTrianglePoint(Triangles[ActiveTransform], px, py, AMachine.GetInputArgAsFloat(0) * pi / 180);
|
|
|
|
cp.GetFromTriangles(Triangles, NumTransforms);
|
|
|
|
|
|
|
|
cp.xform[NumTransforms].Assign(tx);
|
|
|
|
tx.Free;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformScaleProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
Triangles: TTriangles;
|
|
|
|
px, py: double;
|
|
|
|
|
|
|
|
tx: TXForm;
|
|
|
|
begin
|
|
|
|
if cp.xform[ActiveTransform].postXswap then
|
|
|
|
begin
|
|
|
|
TransformScalePXProc(AMachine);
|
|
|
|
Exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.Scale: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
tx := TXForm.Create;
|
|
|
|
tx.Assign(scripteditor.cp.xform[NumTransforms]); // just in case (?)
|
|
|
|
|
|
|
|
EditForm.ScriptGetPivot(px, py);
|
|
|
|
cp.TrianglesFromCp(Triangles); // it's ugly but it works...
|
|
|
|
Triangles[ActiveTransform] :=
|
|
|
|
ScaleTrianglePoint(Triangles[ActiveTransform], px, py, AMachine.GetInputArgAsFloat(0));
|
|
|
|
cp.GetFromTriangles(Triangles, NumTransforms);
|
|
|
|
|
|
|
|
cp.xform[NumTransforms].Assign(tx);
|
|
|
|
tx.Free;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformScalePXProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
s: double;
|
|
|
|
begin
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
|
|
|
|
// ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
|
|
|
|
LastError := 'Transform.ScalePX: ' + ErrorOutOfRange;
|
|
|
|
Scripter.Halt;
|
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
s := AMachine.GetInputArgAsFloat(0);
|
|
|
|
with cp.xform[ActiveTransform] do
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
Scale(p, s);
|
2022-03-08 12:25:51 -05:00
|
|
|
with EditForm do
|
|
|
|
if (PivotMode = PivotWorld) then
|
|
|
|
begin
|
|
|
|
p[2,0] := WorldPivot.x + (p[2,0]- WorldPivot.x) * s;
|
|
|
|
p[2,1] := -WorldPivot.y + (p[2,1]+ WorldPivot.y) * s;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.TransformRotatePXProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
2022-06-23 06:22:32 -04:00
|
|
|
v, tx, ty, sv, cv: double;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
try
|
|
|
|
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then
|
|
|
|
raise EFormatInvalid.Create('Transform.RotatePX: ' + ErrorOutOfRange);
|
2022-06-23 06:22:32 -04:00
|
|
|
with AMachine do
|
|
|
|
v := GetInputArgAsFloat(0) * PI / 180;
|
|
|
|
SinCos(v, sv, cv);
|
|
|
|
with cp.xform[ActiveTransform] do
|
|
|
|
begin
|
|
|
|
Multiply(p, cv, -sv, sv, cv); // AV: my common method for both matrices
|
|
|
|
with EditForm do
|
|
|
|
if (PivotMode = PivotWorld) then
|
|
|
|
begin
|
|
|
|
tx := WorldPivot.x + (p[2,0] - WorldPivot.x) * cv - (-p[2,1] - WorldPivot.y) * sv;
|
|
|
|
ty := WorldPivot.y + (p[2,0] - WorldPivot.x) * sv + (-p[2,1] - WorldPivot.y) * cv;
|
|
|
|
p[2,0] := tx;
|
|
|
|
p[2,1] := -ty;
|
|
|
|
end;
|
|
|
|
end;
|
2022-03-08 12:25:51 -05:00
|
|
|
except on E: EFormatInvalid do
|
|
|
|
begin
|
|
|
|
Application.ProcessMessages;
|
|
|
|
LastError := 'Transform.RotatePX: ' + E.Message;
|
|
|
|
Scripter.Halt;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ *************************** Render interface ****************************** }
|
|
|
|
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetRenderEmbedParams(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutputArg(TScriptRender(CurrentObject).EmbedParameters);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetRenderEmbedParams(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
TScriptRender(CurrentObject).EmbedParameters := GetInputArgAsBoolean(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetRenderFilenameProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(TScriptRender(CurrentObject).Filename);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetRenderFilenameProc(AMachine: TatVirtualMachine);
|
|
|
|
var rdir: string;
|
|
|
|
begin
|
|
|
|
rdir := AMachine.GetInputArgAsString(0);
|
|
|
|
if DirectoryExists(ExtractFilePath(rdir)) then
|
|
|
|
begin // AV
|
|
|
|
if ExtractFileExt(rdir) = '' then
|
|
|
|
rdir := rdir + '.jpg';
|
|
|
|
TScriptRender(AMachine.CurrentObject).Filename := rdir;
|
|
|
|
end
|
|
|
|
else begin
|
|
|
|
LastError := 'Renderer.FileName: ' + TextByKey('render-status-pathdoesnotexist');
|
|
|
|
AMachine.RuntimeError(LastError); // AV
|
|
|
|
AMachine.Halt;
|
|
|
|
if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetRenderWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(TScriptRender(CurrentObject).Width);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetRenderWidthProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
TScriptRender(CurrentObject).Width := GetInputArgAsInteger(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetRenderHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(TScriptRender(CurrentObject).Height);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetRenderHeightProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
TScriptRender(CurrentObject).Height := GetInputArgAsInteger(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetRenderMaxMemoryProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
ReturnOutPutArg(TScriptRender(CurrentObject).MaxMemory);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetRenderMaxMemoryProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
v: integer;
|
|
|
|
begin
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
v := GetInputArgAsInteger(0);
|
|
|
|
if (v >= 0) then
|
|
|
|
TScriptRender(CurrentObject).MaxMemory := v;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ **************************************************************************** }
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetPivotModeProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
AMachine.ReturnOutputArg(Integer(EditForm.PivotMode));
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetPivotModeProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
n: integer;
|
|
|
|
begin
|
|
|
|
n := AMachine.GetInputArgAsInteger(0);
|
|
|
|
if n = 0 then
|
|
|
|
EditForm.PivotMode := pivotLocal
|
|
|
|
else
|
|
|
|
EditForm.PivotMode := pivotWorld;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetPivotXProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
// EditForm.ScriptGetPivot(px, py);
|
|
|
|
// AMachine.ReturnOutputArg(px);
|
|
|
|
if EditForm.PivotMode = pivotLocal then
|
|
|
|
AMachine.ReturnOutputArg(EditForm.LocalPivot.x)
|
|
|
|
else
|
|
|
|
AMachine.ReturnOutputArg(EditForm.WorldPivot.x);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetPivotXProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if EditForm.PivotMode = pivotLocal then
|
|
|
|
EditForm.LocalPivot.x := AMachine.GetInputArgAsFloat(0)
|
|
|
|
else
|
|
|
|
EditForm.WorldPivot.x := AMachine.GetInputArgAsFloat(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.GetPivotYProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
// EditForm.ScriptGetPivot(px, py);
|
|
|
|
// AMachine.ReturnOutputArg(py);
|
|
|
|
if EditForm.PivotMode = pivotLocal then
|
|
|
|
AMachine.ReturnOutputArg(EditForm.LocalPivot.y)
|
|
|
|
else
|
|
|
|
AMachine.ReturnOutputArg(EditForm.WorldPivot.y);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetPivotYProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
if EditForm.PivotMode = pivotLocal then
|
|
|
|
EditForm.LocalPivot.y := AMachine.GetInputArgAsFloat(0)
|
|
|
|
else
|
|
|
|
EditForm.WorldPivot.y := AMachine.GetInputArgAsFloat(0);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.SetPivotProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
with AMachine do begin
|
|
|
|
if EditForm.PivotMode = pivotLocal then begin
|
|
|
|
EditForm.LocalPivot.x := GetInputArgAsFloat(0);
|
|
|
|
EditForm.LocalPivot.y := GetInputArgAsFloat(1);
|
|
|
|
end
|
|
|
|
else begin
|
|
|
|
EditForm.WorldPivot.x := GetInputArgAsFloat(0);
|
|
|
|
EditForm.WorldPivot.y := GetInputArgAsFloat(1);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.ResetPivotProc(AMachine: TatVirtualMachine);
|
|
|
|
begin
|
|
|
|
try // AV: scripter crashes here when pivot = (0,0)
|
|
|
|
EditForm.btnResetPivotClick(nil);
|
|
|
|
except
|
|
|
|
end; // all the work is already done
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ ********************************* Scripter ********************************* }
|
|
|
|
|
|
|
|
procedure TScriptEditor.PrepareScripter;
|
|
|
|
var
|
|
|
|
i: integer;
|
2022-06-23 06:22:32 -04:00
|
|
|
lib : TStringList;
|
|
|
|
s: string;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
Scripter.AddLibrary(TatSysUtilsLibrary);
|
|
|
|
with Scripter.defineClass(TScriptRender) do
|
|
|
|
begin
|
|
|
|
DefineProp('Filename', tkString, GetRenderFilenameProc, SetRenderFilenameProc);
|
|
|
|
DefineProp('Width', tkInteger, GetRenderWidthProc, SetRenderWidthProc);
|
|
|
|
DefineProp('Height', tkInteger, GetRenderHeightProc, SetRenderHeightProc);
|
|
|
|
DefineProp('MaxMemory', tkInteger, GetRenderMaxMemoryProc, SetRenderMaxMemoryProc);
|
|
|
|
DefineProp('EmbedParameters', tkVariant, GetRenderEmbedParams, SetRenderEmbedParams);
|
|
|
|
end;
|
|
|
|
Scripter.AddObject('Renderer', Renderer);
|
|
|
|
|
|
|
|
{ Flame interface }
|
|
|
|
with Scripter.defineClass(TFlame) do
|
|
|
|
begin
|
|
|
|
DefineProp('Gamma', tkFloat, GetFlameGammaProc, SetFlameGammaProc);
|
|
|
|
DefineProp('GammaThreshold', tkFloat, GetFlameGammaThresholdProc, SetFlameGammaThresholdProc);
|
|
|
|
DefineProp('Brightness', tkFloat, GetFlameBrightnessProc, SetFlameBrightnessProc);
|
|
|
|
DefineProp('Vibrancy', tkFloat, GetFlameVibrancyProc, SetFlameVibrancyProc);
|
|
|
|
DefineProp('Contrast', tkFloat, GetFlameContrastProc, SetFlameContrastProc); // AV
|
|
|
|
DefineProp('Time', tkFloat, GetFlameTimeProc, SetFlameTimeProc);
|
|
|
|
DefineProp('Zoom', tkFloat, GetFlameZoomProc, SetFlameZoomProc);
|
|
|
|
DefineProp('X', tkFloat, GetFlameXProc, SetFlameXProc);
|
|
|
|
DefineProp('Y', tkFloat, GetFlameYProc, SetFlameYProc);
|
|
|
|
DefineProp('Width', tkFloat, GetFlameWidthProc, SetFlameWidthProc);
|
|
|
|
DefineProp('Height', tkFloat, GetFlameHeightProc, SetFlameHeightProc);
|
|
|
|
DefineProp('SampleDensity', tkFloat, GetFlameDensityProc, SetFlameDensityProc);
|
|
|
|
DefineProp('Quality', tkFloat, GetFlameDensityProc, SetFlameDensityProc);
|
|
|
|
DefineProp('Oversample', tkInteger, GetFlameOversampleProc, SetFlameOversampleProc);
|
|
|
|
DefineProp('FilterRadius', tkFloat, GetFlameFilterRadiusProc, SetFlameFilterRadiusProc);
|
|
|
|
DefineProp('Scale', tkFloat, GetFlamePixelsPerUnitProc, SetFlamePixelsPerUnitProc);
|
|
|
|
DefineProp('Gradient', tkInteger, GetFlamePaletteProc, SetFlamePaletteProc, nil, false, 2);
|
|
|
|
DefineProp('Background', tkInteger, GetFlameBackgroundProc, SetFlameBackgroundProc, nil, false, 1);
|
|
|
|
DefineProp('Name', tkString, GetFlameNameProc, SetFlameNameProc);
|
2022-06-23 06:22:32 -04:00
|
|
|
DefineProp('Comment', tkString, GetFlameCommentProc, SetFlameCommentProc);
|
2022-03-08 12:25:51 -05:00
|
|
|
// DefineProp('Nick', tkString, GetFlameNickProc, SetFlameNickProc);
|
|
|
|
// DefineProp('URL', tkString, GetFlameURLProc, SetFlameURLProc);
|
|
|
|
DefineProp('Hue', tkFloat, GetFlameHueProc, SetFlameHueProc);
|
|
|
|
DefineProp('Batches', tkInteger, GetFlameBatchesProc, SetFlameBatchesProc);
|
|
|
|
DefineProp('FinalXformEnabled', tkInteger, GetFlameFinalxformEnabledProc, SetFlameFinalxformEnabledProc);
|
|
|
|
DefineProp('Angle', tkFloat, GetFlameAngleProc, SetFlameAngleProc);
|
|
|
|
DefineProp('Pitch', tkFloat, GetFlamePitchProc, SetFlamePitchProc);
|
|
|
|
DefineProp('Yaw', tkFloat, GetFlameYawProc, SetFlameYawProc);
|
|
|
|
DefineProp('Roll', tkFloat, GetFlameRollProc, SetFlameRollProc);
|
|
|
|
DefineProp('Perspective', tkFloat, GetFlamePerspectiveProc, SetFlamePerspectiveProc);
|
|
|
|
DefineProp('Z', tkFloat, GetFlameCamZposProc, SetFlameCamZposProc);
|
|
|
|
DefineProp('DOF', tkFloat, GetFlameDOFProc, SetFlameDOFProc);
|
|
|
|
DefineProp('SoloXform', tkInteger, GetFlameSoloXformProc, SetFlameSoloXformProc);
|
|
|
|
|
|
|
|
DefineProp('PreviewWidth', tkInteger, GetPreviewWidthProc, SetPreviewWidthProc);
|
|
|
|
DefineProp('PreviewHeight', tkInteger, GetPreviewHeightProc, SetPreviewHeightProc);
|
|
|
|
end;
|
|
|
|
Scripter.AddObject('Flame', Flame);
|
|
|
|
|
|
|
|
{ Transform interface }
|
|
|
|
with Scripter.defineClass(TTransform) do
|
|
|
|
begin
|
|
|
|
DefineProp('coefs', tkFloat, GetTransformCoefsProc, SetTransformCoefsProc, nil, false, 2);
|
|
|
|
DefineProp('post', tkFloat, GetTransformPostCoefsProc, SetTransformPostCoefsProc, nil, false, 2);
|
|
|
|
DefineProp('Color', tkFloat, GetTransformColorProc, SetTransformColorProc);
|
|
|
|
DefineProp('VarColor', tkFloat, GetTransformVarColorProc, SetTransformVarColorProc);
|
|
|
|
DefineProp('Weight', tkFloat, GetTransformWeightProc, SetTransformWeightProc);
|
|
|
|
DefineProp('Symmetry', tkFloat, GetTransformSymProc, SetTransformSymProc);
|
|
|
|
DefineProp('ColorSpeed', tkFloat, GetTransformSymProc, SetTransformSymProc);
|
|
|
|
for i:= 0 to NRVAR - 1 do begin
|
|
|
|
DefineProp(Varnames(i), tkFloat, GetTransformVariationProc, SetTransformVariationProc);
|
|
|
|
Editor.SyntaxStyles.AutoCompletion.Add('property ' + Varnames(i) + ': double');
|
|
|
|
end;
|
|
|
|
for i:= 0 to GetNrVariableNames - 1 do begin
|
|
|
|
DefineProp(GetVariableNameAt(i), tkFloat, GetTransformVariableProc, SetTransformVariableProc);
|
|
|
|
Editor.SyntaxStyles.AutoCompletion.Add('property ' + GetVariableNameAt(i) + ': double');
|
|
|
|
end;
|
|
|
|
Editor.SyntaxStyles.AutoCompletion.Sort;
|
|
|
|
while Editor.SyntaxStyles.AutoCompletion.Strings[0] = '' do Editor.SyntaxStyles.AutoCompletion.Delete(0);
|
|
|
|
|
|
|
|
DefineMethod('Clear', 0, tkNone, nil, TransformClearProc);
|
|
|
|
DefineMethod('Rotate', 1, tkNone, nil, TransformRotateProc);
|
|
|
|
DefineMethod('Scale', 1, tkNone, nil, TransformScaleProc);
|
|
|
|
DefineMethod('RotateOrigin', 1, tkNone, nil, TransformRotateOriginProc);
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
DefineMethod('RotatePXOrigin', 1, tkNone, nil, TransformRotatePXOriginProc);
|
|
|
|
DefineMethod('RotatePX', 1, tkNone, nil, TransformRotatePXProc);
|
|
|
|
DefineMethod('ScalePX', 1, tkNone, nil, TransformScalePXProc);
|
|
|
|
DefineMethod('FlipPXHoriz', 0, tkNone, nil, TransformFlipPXHorizProc);
|
|
|
|
DefineMethod('FlipHoriz', 0, tkNone, nil, TransformFlipHorizProc);
|
|
|
|
DefineMethod('FlipPXVert', 0, tkNone, nil, TransformFlipPXVertProc);
|
|
|
|
DefineMethod('FlipVert', 0, tkNone, nil, TransformFlipVertProc);
|
|
|
|
DefineMethod('SwapCoefs', 0, tkNone, nil, TransformSwapCoefsProc);
|
|
|
|
DefineMethod('ResetVariables', 0, tkNone, nil, TransformResetVariables);
|
|
|
|
|
|
|
|
DefineMethod('SetVariationOrder', 2, tkNone, nil, TransformMoveVarProc);
|
|
|
|
DefineMethod('SwapVariations', 2, tkNone, nil, TransformExchangeVarsProc);
|
|
|
|
DefineMethod('SortVariationsByName', 0, tkNone, nil, TransformSortVarsProc);
|
|
|
|
DefineMethod('SortVariationsByIndex', 0, tkNone, nil, TransformDefaultVarOrderProc);
|
|
|
|
DefineMethod('GetVariationOrder', 1, tkInteger, nil, TransformGetVarOrderProc);
|
|
|
|
DefineMethod('CopyVariationsOrder', 1, tkInteger, nil, TransformCopyVarOrderProc);
|
|
|
|
DefineMethod('PrintVariationsOrder', 0, tkNone, nil, TransformDisplayVarsProc);
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
DefineProp('a', tkFloat, GetTransformAProc, SetTransformAProc);
|
|
|
|
DefineProp('b', tkFloat, GetTransformBProc, SetTransformBProc);
|
|
|
|
DefineProp('c', tkFloat, GetTransformCProc, SetTransformCProc);
|
|
|
|
DefineProp('d', tkFloat, GetTransformDProc, SetTransformDProc);
|
|
|
|
DefineProp('e', tkFloat, GetTransformEProc, SetTransformEProc);
|
|
|
|
DefineProp('f', tkFloat, GetTransformFProc, SetTransformFProc);
|
|
|
|
DefineProp('Variation', tkFloat, GetTransformVarProc, SetTransformVarProc, nil, false, 1);
|
|
|
|
DefineProp('Variable', tkFloat, GetTransformVariProc, SetTransformVariProc, nil, false, 1);
|
|
|
|
DefineProp('Chaos', tkFloat, GetTransformChaosProc, SetTransformChaosProc, nil, false, 1);
|
|
|
|
DefineProp('PlotMode', tkInteger, GetTransformPlotModeProc, SetTransformPlotModeProc);
|
|
|
|
DefineProp('Opacity', tkFloat, GetTransformOpacityProc, SetTransformOpacityProc);
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
DefineProp('PostXformEnabled', tkInteger, GetTransformPostxformEnabledProc, SetTransformPostxformEnabledProc);
|
|
|
|
DefineProp('Name', tkString, GetTransformNameProc, SetTransformNameProc);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
Scripter.AddObject('Transform', Transform);
|
|
|
|
|
|
|
|
{ Options interface }
|
|
|
|
with Scripter.defineClass(TOptions) do
|
|
|
|
begin
|
|
|
|
DefineProp('JPEGQuality', tkInteger, GetJPEGQuality, SetJPEGQuality);
|
|
|
|
DefineProp('BatchSize', tkInteger, GetBatchSize, SetBatchSize);
|
|
|
|
DefineProp('ParameterFile', tkString, GetParameterFile, SetParameterFile);
|
|
|
|
DefineProp('SmoothPaletteFile', tkString, GetSmoothPaletteFile, SetSmoothPaletteFile);
|
|
|
|
DefineProp('NumTries', tkInteger, GetNumTries, SetNumTries);
|
|
|
|
DefineProp('TryLength', tkInteger, GetTryLength, SetTryLength);
|
|
|
|
DefineProp('ConfirmDelete', tkVariant, GetConfirmDelete, SetConfirmDelete);
|
|
|
|
DefineProp('Multithreading', tkInteger, GetMultithreading, SetMultithreading);
|
|
|
|
//DefineProp('FixedReference', tkVariant, GetFixedReference, SetFixedReference);
|
|
|
|
DefineProp('SampleDensity', tkFloat, GetSampleDensity, SetSampleDensity);
|
|
|
|
DefineProp('Gamma', tkFloat, GetGamma, SetGamma);
|
|
|
|
DefineProp('GammaThreshold', tkFloat, GetGammaThreshold, SetGammaThreshold);
|
|
|
|
DefineProp('Brightness', tkFloat, GetBrightness, SetBrightness);
|
|
|
|
DefineProp('Vibrancy', tkFloat, GetVibrancy, SetVibrancy);
|
|
|
|
DefineProp('Contrast', tkFloat, GetContrast, SetContrast); // AV
|
|
|
|
DefineProp('Oversample', tkInteger, GetOversample, SetOversample);
|
|
|
|
DefineProp('FilterRadius', tkFloat, GetFilterRadius, SetFilterRadius);
|
|
|
|
DefineProp('Transparency', tkInteger, GetTransparency, SetTransparency);
|
|
|
|
DefineProp('PreviewLowQuality', tkFloat, GetLowQuality, SetLowQuality);
|
|
|
|
DefineProp('PreviewMediumQuality', tkFloat, GetMediumQuality, SetMediumQuality);
|
|
|
|
DefineProp('PreviewHighQuality', tkFloat, GetHighQuality, SetHighQuality);
|
|
|
|
DefineProp('MinTransforms', tkInteger, GetMinTransforms, SetMinTransforms);
|
|
|
|
DefineProp('MaxTransforms', tkInteger, GetMaxTransforms, SetMaxTransforms);
|
|
|
|
DefineProp('MutateMinTransforms', tkInteger, GetMutateMinTransforms, SetMutateMinTransforms);
|
|
|
|
DefineProp('MutateMaxTransforms', tkInteger, GetMutateMaxTransforms, SetMutateMaxTransforms);
|
|
|
|
DefineProp('RandomPrefix', tkString, GetPrefix, SetPrefix);
|
|
|
|
DefineProp('KeepBackground', tkInteger, GetKeepBackground, SetKeepBackground);
|
|
|
|
DefineProp('SymmetryType', tkInteger, GetSymmetryType, SetSymmetryType);
|
|
|
|
DefineProp('SymmetryOrder', tkInteger, GetSymmetryOrder, SetSymmetryOrder);
|
|
|
|
DefineProp('Variations', tkVariant, GetVariations, SetVariations, nil, false, 1);
|
|
|
|
DefineProp('GradientOnRandom', tkInteger, GetRandomGradient, SetRandomGradient);
|
|
|
|
DefineProp('GradientFileOnRandom', tkString, GetRandomGradientFile, SetRandomGradientFile);
|
|
|
|
DefineProp('ColorBlending', tkInteger, GetGradientBlending, SetGradientBlending); // AV
|
|
|
|
DefineProp('MinNodes', tkInteger, GetMinNodes, SetMinNodes);
|
|
|
|
DefineProp('MaxNodes', tkInteger, GetMaxNodes, SetMaxNodes);
|
|
|
|
DefineProp('MinHue', tkInteger, GetMinHue, SetMinHue);
|
|
|
|
DefineProp('MaxHue', tkInteger, GetMaxHue, SetMaxHue);
|
|
|
|
DefineProp('MinSaturation', tkInteger, GetMinSat, SetMinSat);
|
|
|
|
DefineProp('MaxSaturation', tkInteger, GetMaxSat, SetMaxSat);
|
|
|
|
DefineProp('MinLuminance', tkInteger, GetMinLum, SetMinLum);
|
|
|
|
DefineProp('MaxLuminance', tkInteger, GetMaxLum, SetMaxLum);
|
|
|
|
DefineProp('UPRSampleDensity', tkInteger, GetUPRSampleDensity, SetUPRSampleDensity);
|
|
|
|
DefineProp('UPRFilterRadius', tkFloat, GetUPRFilterRadius, SetUPRFilterRadius);
|
|
|
|
DefineProp('UPROversample', tkInteger, GetUPROversample, SetUPROversample);
|
|
|
|
DefineProp('UPRAdjustDensity', tkVariant, GetUPRAdjustDensity, SetUPRAdjustDensity);
|
|
|
|
DefineProp('EvenGradientStripes', tkVariant, GetEqualGradient, SetEqualGradient);
|
|
|
|
DefineProp('UPRColoringIdent', tkString, GetUPRColoringIdent, SetUPRColoringIdent);
|
|
|
|
DefineProp('UPRColoringFile', tkString, GetUPRColoringFile, SetUPRColoringFile);
|
|
|
|
DefineProp('UPRFormulaFile', tkString, GetUPRFormulaFile, SetUPRFormulaFile);
|
|
|
|
DefineProp('UPRFormulaIdent', tkString, GetUPRFormulaIdent, SetUPRFormulaIdent);
|
|
|
|
DefineProp('UPRWidth', tkInteger, GetUPRWidth, SetUPRWidth);
|
|
|
|
DefineProp('UPRHeight', tkInteger, GetUPRHeight, SetUPRHeight);
|
|
|
|
DefineProp('ExportRenderer', tkInteger, GetExportPath, SetExportPath);
|
|
|
|
end;
|
|
|
|
Scripter.AddObject('Options', Options);
|
|
|
|
|
|
|
|
with Scripter.defineClass(TPivot) do
|
|
|
|
begin
|
|
|
|
DefineProp('Mode', tkInteger, GetPivotModeProc, SetPivotModeProc);
|
|
|
|
DefineProp('X', tkFloat, GetPivotXProc, SetPivotXProc);
|
|
|
|
DefineProp('Y', tkFloat, GetPivotYProc, SetPivotYProc);
|
|
|
|
DefineMethod('Set', 2, tkNone, nil, SetPivotProc);
|
|
|
|
DefineMethod('Reset', 0, tkNone, nil, ResetPivotProc);
|
|
|
|
end;
|
|
|
|
Scripter.AddObject('Pivot', Pivot);
|
|
|
|
|
|
|
|
Scripter.AddComponent(OpenDialog);
|
|
|
|
Scripter.AddLibrary(TOperationLibrary);
|
|
|
|
|
|
|
|
{ Variables and constants }
|
|
|
|
Scripter.AddConstant('PI', pi);
|
|
|
|
Scripter.AddConstant('NVARS', NRVAR);
|
|
|
|
Scripter.AddConstant('NumVariables', GetNrVariableNames);
|
|
|
|
Scripter.AddConstant('NXFORMS', NXFORMS);
|
|
|
|
Scripter.AddConstant('INSTALLPATH', ExtractFilePath(Application.exename));
|
|
|
|
Scripter.AddConstant('SYM_NONE', 0);
|
|
|
|
Scripter.AddConstant('SYM_BILATERAL', 1);
|
|
|
|
Scripter.AddConstant('SYM_ROTATIONAL', 2);
|
|
|
|
Scripter.AddConstant('SYM_DIHEDRAL', 3); // AV
|
|
|
|
Scripter.AddConstant('NMAPS', NRCMAPS); // AV
|
|
|
|
|
|
|
|
Scripter.AddConstant('mrOK', mrOK); // AV
|
|
|
|
Scripter.AddConstant('mrCancel', mrCancel); // AV
|
|
|
|
Scripter.AddConstant('mrNo', mrNo); // AV
|
|
|
|
Scripter.AddConstant('mrYes', mrYes); // AV
|
|
|
|
Scripter.AddConstant('mrRetry', mrRetry); // AV
|
|
|
|
Scripter.AddConstant('mrClose', mrClose); // AV
|
|
|
|
Scripter.AddConstant('mrAbort', mrAbort); // AV
|
|
|
|
|
|
|
|
Scripter.AddConstant('BLEND_RGB', 0); // AV
|
|
|
|
Scripter.AddConstant('BLEND_HSV', 1); // AV
|
|
|
|
Scripter.AddConstant('BLEND_NONE', 2); // AV
|
|
|
|
|
|
|
|
{ Variables }
|
|
|
|
// AV: they are already defined in TOperationLibrary
|
|
|
|
// Scripter.AddVariable('SelectedTransform', EditForm.SelectedTriangle);
|
|
|
|
// Scripter.AddVariable('ActiveTransform', ActiveTransform);
|
|
|
|
Scripter.AddVariable('UpdateFlame', UpdateIt);
|
|
|
|
Scripter.AddVariable('ResetLocation', ResetLocation);
|
|
|
|
Scripter.AddVariable('BatchIndex', RandomIndex);
|
|
|
|
Scripter.AddVariable('DateCode', RandomDate);
|
|
|
|
Scripter.AddVariable('Stopped', Stopped);
|
|
|
|
Scripter.AddVariable('ShowProgress', ShowProgress);
|
|
|
|
Scripter.AddVariable('LimitVibrancy', LimitVibrancy);
|
|
|
|
// Scripter.AddVariable('CurrentFile', OpenFile); // AV: added handlers
|
|
|
|
// Scripter.AddVariable('Compatibility', Compatibility); // obsolete
|
|
|
|
|
|
|
|
{ Variations }
|
|
|
|
Scripter.AddConstant('V_LINEAR', 0);
|
2022-06-23 06:22:32 -04:00
|
|
|
Scripter.AddConstant('V_RANDOM', vRandom);
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
// Scripter.AddLibrary(TatWindowsLibrary);
|
|
|
|
// Scripter.AddLibrary(TatFormsLibrary);
|
|
|
|
Scripter.AddLibrary(TatMathLibrary);
|
|
|
|
Scripter.AddLibrary(TatDialogsLibrary);
|
|
|
|
Scripter.AddLibrary(TatSysUtilsLibrary);
|
|
|
|
Scripter.AddLibrary(TatFileCtrlLibrary);
|
|
|
|
Scripter.AddLibrary(TatClassesLibrary);
|
2022-06-23 06:22:32 -04:00
|
|
|
{ Nonsense - it's the only way to get the last real library to work! }
|
2022-03-08 12:25:51 -05:00
|
|
|
Scripter.AddObject('Not_Any_Thing_Useful', Another);
|
|
|
|
Scripter.AddObject('IglooFunkyRubber', Another);
|
|
|
|
Scripter.AddObject('Scrumptious', Another);
|
|
|
|
// Scripter.AddObject('Darn it', Another);
|
|
|
|
Scripter.AddObject('Apophysis', Application); // AV :-)
|
|
|
|
|
|
|
|
// AV: user must not be able to use them!
|
|
|
|
Scripter.SystemLibrary.MethodByName('Scripter').Free;
|
|
|
|
Scripter.SystemLibrary.MethodByName('Machine').Free;
|
|
|
|
// AV: moved into main library to let user choose which CopyFile must be called
|
|
|
|
Scripter.SystemLibrary.DefineMethod('CopyFile', 3, tkVariant, nil, CopyFileProc, false, 1);
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
if FileExists(defLibrary) then // AV: add user's defined methods
|
|
|
|
begin
|
|
|
|
lib := TStringList.Create;
|
|
|
|
try
|
|
|
|
lib.LoadFromFile(defLibrary);
|
|
|
|
for s in lib do
|
|
|
|
if (pos('procedure', LowerCase(s)) > 0) or (pos('function', LowerCase(s)) > 0) then
|
|
|
|
Editor.SyntaxStyles.AutoCompletion.Add(Trim(s));
|
|
|
|
finally
|
|
|
|
lib.Free;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
// AV: to load external Delphi forms
|
|
|
|
RegisterClasses([TButton, TLabel, TEdit, TComboBox]);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
|
|
|
{ ************************* Buttons ***************************************** }
|
|
|
|
|
|
|
|
procedure TScriptEditor.btnNewClick(Sender: TObject);
|
|
|
|
var
|
|
|
|
c: boolean;
|
|
|
|
begin
|
|
|
|
if ConfirmClearScript then
|
|
|
|
begin
|
|
|
|
if Editor.LinesModified then // AV: if script changes not saved yet
|
2022-06-23 06:22:32 -04:00
|
|
|
c := (Application.MessageBox(PChar(TextByKey('script-confirmclear')), ApophysisSVN, 52) = IDYES)
|
2022-03-08 12:25:51 -05:00
|
|
|
else
|
|
|
|
c := True;
|
|
|
|
end
|
|
|
|
else c := True;
|
|
|
|
if c then begin
|
|
|
|
Editor.Lines.Clear;
|
|
|
|
Caption := TextByKey('script-title'); //'New Script';
|
|
|
|
Script := '';
|
|
|
|
if Scripter.Running then btnBreak.Click; // AV: stop the previous script
|
|
|
|
StatusBar.SimpleText := StatusBar.Hint; // AV
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.LoadScriptFile(filename:string);
|
|
|
|
var
|
|
|
|
s: string;
|
2022-06-23 06:22:32 -04:00
|
|
|
fn: string;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
Editor.Lines.LoadFromFile(filename);
|
|
|
|
s := ExtractFileName(filename);
|
|
|
|
s := Copy(s, 0, length(s) - Length(ExtractFileExt(s)));
|
|
|
|
MainForm.mnuRun.Caption := Format(TextByKey('main-menu-script-run2'), [s]);
|
|
|
|
Caption := s;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.OpenScript;
|
|
|
|
var
|
|
|
|
s: string;
|
2022-06-23 06:22:32 -04:00
|
|
|
fn: string;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
MainOpenDialog.InitialDir := ScriptPath;
|
|
|
|
MainOpenDialog.Filename := '';
|
2022-06-23 06:22:32 -04:00
|
|
|
if MainOpenDialog.execute then
|
|
|
|
begin
|
|
|
|
fn := MainOpenDialog.FileName; // AV
|
|
|
|
Script := fn;
|
|
|
|
Editor.Lines.LoadFromFile(fn);
|
|
|
|
s := ExtractFileName(fn);
|
2022-03-08 12:25:51 -05:00
|
|
|
s := Copy(s, 0, length(s) - Length(ExtractFileExt(s)));
|
|
|
|
MainForm.mnuRun.Caption := Format(TextByKey('main-menu-script-run2'), [s]);
|
|
|
|
Caption := s;
|
2022-06-23 06:22:32 -04:00
|
|
|
ScriptPath := ExtractFileDir(fn);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.btnOpenClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
OpenScript;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.btnPauseClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
if Scripter.Running then
|
|
|
|
Scripter.Paused := not Scripter.Paused
|
|
|
|
else Scripter.Paused := False;
|
|
|
|
btnPause.Down := Scripter.Paused;
|
|
|
|
if btnPause.Down then begin
|
|
|
|
StatusBar.SimpleText := TextByKey('script-status-paused');
|
|
|
|
PreviewForm.PreviewPause.Caption := TextbyKey('preview-resume');
|
|
|
|
end else begin
|
|
|
|
if Scripter.Running then
|
|
|
|
StatusBar.SimpleText := TextByKey('script-status-executing')
|
|
|
|
else
|
|
|
|
StatusBar.SimpleText := StatusBar.Hint;
|
|
|
|
PreviewForm.PreviewPause.Caption := TextbyKey('preview-pause');
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.btnSaveClick(Sender: TObject);
|
|
|
|
var fn : string;
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
if Script = '' then
|
|
|
|
MainSaveDialog.Filename := ''
|
|
|
|
else
|
|
|
|
MainSaveDialog.Filename := ChangeFileExt(ExtractFileName(Script), '.aposcript');
|
|
|
|
MainSaveDialog.InitialDir := ScriptPath;
|
|
|
|
if MainSaveDialog.Execute then
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
fn := MainSaveDialog.FileName; // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
Script := fn;
|
|
|
|
Editor.Lines.SaveToFile(fn);
|
|
|
|
Caption := ExtractFileName(fn);
|
|
|
|
ScriptPath := ExtractFileDir(fn);
|
|
|
|
if ScriptPath = AppPath + 'Scripts' then
|
|
|
|
MainForm.GetScripts; // AV: refreshing the menu
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.FillFileList;
|
|
|
|
var
|
|
|
|
i, p: integer;
|
|
|
|
ext, Title: string;
|
|
|
|
FStrings: TStringList;
|
|
|
|
begin
|
|
|
|
FStrings := TStringList.Create;
|
|
|
|
FStrings.LoadFromFile(ParamFile);
|
|
|
|
try
|
2022-06-23 06:22:32 -04:00
|
|
|
ScFileList.Clear;
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
ext := LowerCase(ExtractFileExt(ParamFile));
|
2022-06-23 06:22:32 -04:00
|
|
|
if (ext = '.fla') or (ext = '.apo') then // AV
|
|
|
|
begin // Get names from .undo or .apo file
|
2022-03-08 12:25:51 -05:00
|
|
|
if (Pos('{', FStrings.Text) <> 0) then
|
|
|
|
for i := 0 to FStrings.Count - 1 do
|
|
|
|
begin
|
|
|
|
p := Pos('{', FStrings[i]);
|
|
|
|
if (p <> 0) then
|
|
|
|
begin
|
|
|
|
Title := Trim(Copy(FStrings[i], 1, p - 1));
|
|
|
|
if Title <> '' then
|
|
|
|
begin { Otherwise bad format }
|
2022-06-23 06:22:32 -04:00
|
|
|
ScFileList.Add(Trim(Copy(FStrings[i], 1, p - 1)));
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end
|
|
|
|
else
|
2022-06-23 06:22:32 -04:00
|
|
|
begin
|
2022-03-08 12:25:51 -05:00
|
|
|
// Get names from .flame file
|
|
|
|
if (Pos('<flame ', Lowercase(FStrings.Text)) <> 0) then
|
|
|
|
begin
|
|
|
|
for i := 0 to FStrings.Count - 1 do
|
|
|
|
begin
|
|
|
|
p := Pos('<flame ', LowerCase(FStrings[i]));
|
|
|
|
if (p <> 0) then
|
|
|
|
begin
|
|
|
|
pname := '';
|
2022-06-23 06:22:32 -04:00
|
|
|
MainForm.ListXMLScanner.LoadFromBuffer(PAnsiChar(Utf8String(FStrings[i])));
|
2022-03-08 12:25:51 -05:00
|
|
|
MainForm.ListXMLScanner.Execute;
|
|
|
|
if Trim(pname) = '' then
|
|
|
|
Title := '*untitled ' + ptime
|
|
|
|
else
|
2022-06-23 06:22:32 -04:00
|
|
|
ScFileList.Add(pname);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
2022-06-23 06:22:32 -04:00
|
|
|
end;
|
2022-03-08 12:25:51 -05:00
|
|
|
finally
|
|
|
|
FStrings.Free;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.CopyFileProc(AMachine: TatVirtualMachine);
|
|
|
|
var
|
|
|
|
src, dest: string;
|
|
|
|
v: boolean; // AV
|
|
|
|
begin
|
|
|
|
// AV: original method doesn't work properly and conflicts with Windows.CopyFile
|
|
|
|
with AMachine do
|
|
|
|
begin
|
|
|
|
src := GetInputArgAsString(0);
|
|
|
|
dest := GetInputArgAsString(1);
|
|
|
|
if FileExists(src) and DirectoryExists(ExtractFilePath(dest)) then
|
|
|
|
try
|
|
|
|
case InputArgCount of
|
|
|
|
2: begin
|
|
|
|
v := Windows.CopyFile(PChar(src), PChar(dest), false); // rewrite
|
|
|
|
ReturnOutputArg(v);
|
|
|
|
end;
|
|
|
|
3: begin
|
|
|
|
v := GetInputArgAsBoolean(2);
|
|
|
|
v := Windows.CopyFile(PChar(src), PChar(dest), v);
|
|
|
|
ReturnOutputArg(v);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
except
|
|
|
|
LastError := 'CopyFile: ' + TextByKey('common-genericcopyfailure');
|
|
|
|
RuntimeError(LastError); // AV
|
|
|
|
Halt;
|
2022-06-23 06:22:32 -04:00
|
|
|
if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
end
|
|
|
|
else begin
|
|
|
|
if not FileExists(src) then
|
|
|
|
LastError := 'CopyFile: ' + TextByKey('common-noparamfile')
|
|
|
|
else
|
|
|
|
LastError := 'CopyFile: ' + TextByKey('render-status-pathdoesnotexist');
|
|
|
|
RuntimeError(LastError); // AV
|
|
|
|
Halt;
|
2022-06-23 06:22:32 -04:00
|
|
|
if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.FindReplaceClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
ScrMemoFindReplaceDialog1.Execute;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.RunScript;
|
|
|
|
var
|
|
|
|
lib: TStringList;
|
|
|
|
favs, defs: boolean; // current status of submenus
|
|
|
|
begin
|
|
|
|
btnRun.Enabled := False;
|
|
|
|
btnBreak.Enabled := True;
|
|
|
|
btnPause.Enabled := True;
|
|
|
|
MainForm.btnRunScript.Enabled := False;
|
|
|
|
MainForm.mnuRun.Enabled := False;
|
|
|
|
favs := (MainForm.FavouriteScripts1.Count > 0);
|
|
|
|
defs := (MainForm.Directory1.Count > 0);
|
|
|
|
MainForm.FavouriteScripts1.Enabled := False;
|
|
|
|
// MainForm.DisableFavorites;
|
|
|
|
MainForm.Directory1.Enabled := False;
|
|
|
|
|
|
|
|
ParamFile := OpenFile;
|
|
|
|
FillFileList;
|
|
|
|
{ Set defaults }
|
|
|
|
{ Set render defaults }
|
|
|
|
Renderer.Width := 320;
|
|
|
|
Renderer.Height := 240;
|
|
|
|
Renderer.EmbedParameters := False; // AV
|
|
|
|
Stopped := False;
|
|
|
|
UpdateIt := True;
|
|
|
|
ResetLocation := False;
|
|
|
|
Console.Clear;
|
|
|
|
LastError := '';
|
|
|
|
ActiveTransform := EditForm.SelectedTriangle;
|
|
|
|
NumTransforms := Transforms;
|
|
|
|
cp.copy(MainCp);
|
2022-06-23 06:22:32 -04:00
|
|
|
//cmap := MainCp.cmap; // <-- is used nowhere
|
2022-03-08 12:25:51 -05:00
|
|
|
Application.ProcessMessages;
|
|
|
|
Randomize;
|
|
|
|
StatusBar.SimpleText := TextByKey('script-status-executing');
|
|
|
|
// what in the sweet loving sake of jesus is this fuck?
|
|
|
|
// AV: this is really strange...
|
|
|
|
if Pos('stopped', Lowercase(Editor.Lines.text)) <> 0 then
|
|
|
|
begin
|
|
|
|
btnStop.Enabled := True;
|
|
|
|
MainForm.mnuStop.Enabled := True;
|
|
|
|
MainForm.btnStopScript.Enabled := True;
|
|
|
|
end;
|
2022-06-23 06:22:32 -04:00
|
|
|
|
2022-03-08 12:25:51 -05:00
|
|
|
with Scripter do
|
|
|
|
begin
|
|
|
|
SourceCode.Assign(Editor.Lines);
|
|
|
|
if FileExists(defLibrary) then
|
|
|
|
begin
|
|
|
|
lib := TStringList.Create;
|
|
|
|
try
|
|
|
|
Lib.LoadFromFile(defLibrary);
|
|
|
|
with Scripts.Add do
|
|
|
|
begin
|
|
|
|
SourceCode := lib;
|
|
|
|
SelfRegisterAsLibrary('Functions');
|
|
|
|
end;
|
|
|
|
finally
|
|
|
|
lib.free;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
//Compile;
|
|
|
|
Execute;
|
|
|
|
end;
|
2022-06-23 06:22:32 -04:00
|
|
|
|
2022-03-08 12:25:51 -05:00
|
|
|
if (NumTransforms < 1) and UpdateIt then
|
2022-06-23 06:22:32 -04:00
|
|
|
Console.Lines.Add(TextByKey('script-status-notransforms'))
|
|
|
|
else if (LastError = '') and UpdateIt then
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
MainForm.UpdateUndo;
|
|
|
|
MainCp.Copy(cp);
|
|
|
|
UpdateFlame;
|
|
|
|
if ResetLocation then MainForm.ResetLocation;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
Console.Lines.Add(LastError);
|
|
|
|
|
|
|
|
if ScriptRenderForm.Visible then ScriptRenderForm.Close;
|
2022-03-08 12:25:51 -05:00
|
|
|
btnRun.Enabled := True;
|
|
|
|
btnStop.Enabled := False;
|
|
|
|
MainForm.btnRunScript.Enabled := True;
|
|
|
|
MainForm.btnStopScript.Enabled := False;
|
|
|
|
MainForm.mnuRun.Enabled := True;
|
|
|
|
MainForm.mnuStop.Enabled := False;
|
|
|
|
btnBreak.Enabled := False;
|
2022-06-23 06:22:32 -04:00
|
|
|
btnPause.Enabled := False;
|
|
|
|
// AV: restore the status of submenus to continue work with these scripts
|
2022-03-08 12:25:51 -05:00
|
|
|
MainForm.FavouriteScripts1.Enabled := favs;
|
|
|
|
MainForm.Directory1.Enabled := defs;
|
2022-06-23 06:22:32 -04:00
|
|
|
StatusBar.SimpleText := StatusBar.Hint;
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.btnRunClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
RunScript;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ ****************************** Update flame ******************************* }
|
|
|
|
|
|
|
|
procedure TScriptEditor.UpdateFlame;
|
|
|
|
begin
|
|
|
|
MainForm.StopThread;
|
|
|
|
MainForm.UpdateUndo;
|
|
|
|
MainCp.Copy(cp);
|
|
|
|
// MainCp.name := FlameName;
|
|
|
|
Transforms := MainCp.TrianglesFromCP(MainTriangles);
|
|
|
|
MainCp.AdjustScale(MainForm.Image.Width, MainForm.Image.Height);
|
|
|
|
if ResetLocation then MainCp.CalcBoundBox else
|
|
|
|
begin;
|
|
|
|
MainCp.Zoom := cp.zoom;
|
|
|
|
MainCp.center[0] := cp.center[0];
|
|
|
|
MainCp.center[1] := cp.center[1];
|
|
|
|
end;
|
|
|
|
MainCp.cmap := cp.cmap;
|
|
|
|
MainForm.RedrawTimer.enabled := true;
|
|
|
|
if EditForm.Visible then EditForm.UpdateDisplay;
|
|
|
|
if AdjustForm.Visible then AdjustForm.UpdateDisplay;
|
|
|
|
if MutateForm.Visible then MutateForm.UpdateDisplay;
|
|
|
|
end;
|
|
|
|
|
|
|
|
(*
|
|
|
|
procedure copyxform(var dest: Txform; const source: TXform);
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
begin
|
|
|
|
dest.c[0, 0] := source.c[0, 0];
|
|
|
|
dest.c[0, 1] := source.c[0, 1];
|
|
|
|
dest.c[1, 0] := source.c[1, 0];
|
|
|
|
dest.c[1, 1] := source.c[1, 1];
|
|
|
|
dest.c[2, 0] := source.c[2, 0];
|
|
|
|
dest.c[2, 1] := source.c[2, 1];
|
|
|
|
dest.color := source.color;
|
|
|
|
// hmm, why no symmetry here? // dest.symmetry := source.symmetry;
|
|
|
|
dest.density := source.density;
|
|
|
|
for i := 0 to NRVAR - 1 do
|
|
|
|
dest.SetVariation(i, source.GetVariation(i));
|
|
|
|
end;
|
|
|
|
*)
|
|
|
|
|
|
|
|
{ ************************ Editor Popup menu ********************************* }
|
|
|
|
|
|
|
|
procedure TScriptEditor.mnuCutClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
if Editor.CanCut then Editor.CutToClipboard;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.mnuDeleteBlockClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
with ScrCodeList1 do
|
|
|
|
if ItemIndex >= 0 then
|
|
|
|
CodeBlocks.Delete(ItemIndex);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.mnuCopyClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
if Editor.CanCopy then Editor.CopyToClipboard;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.mnuPasteClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
if Editor.CanPaste then Editor.PasteFromClipboard;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.mnuRedoClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
if Editor.CanRedo then Editor.Redo;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.mnuUndoClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
if Editor.CanUndo then Editor.Undo;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.EditCaption1Click(Sender: TObject);
|
|
|
|
var
|
|
|
|
scap: string; // empty string by default
|
|
|
|
begin
|
|
|
|
if ScrCodeList1.ItemIndex < 0 then exit;
|
|
|
|
scap := ScrCodeList1.CodeBlocks[ScrCodeList1.ItemIndex].Caption;
|
|
|
|
if not InputQuery(TextByKey('script-codeblock'),
|
|
|
|
TextByKey('script-codeblockrename'), scap) then exit;
|
|
|
|
ScrCodeList1.CodeBlocks[ScrCodeList1.ItemIndex].Caption := scap;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.EditorChange(Sender: TObject);
|
|
|
|
begin
|
|
|
|
// Editor.activeLine := -1; // <<== AV: it's the source of bugs...
|
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := false;
|
|
|
|
{if not Editor.CanUndo then mnuUndo.Enabled := false
|
|
|
|
else mnuUndo.Enabled := true; }
|
|
|
|
// AV: optimized
|
|
|
|
mnuUndo.Enabled := Editor.CanUndo;
|
|
|
|
mnuRedo.Enabled := Editor.CanRedo;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{********** AV: let's make it more interactive! ************ }
|
|
|
|
|
|
|
|
procedure TScriptEditor.EditorDragDrop(Sender, Source: TObject; X, Y: Integer);
|
|
|
|
begin
|
|
|
|
if (source is TScrCodeList) then
|
|
|
|
Editor.DropText(X, Y, ScrCodeList1.CodeBlocks[ScrCodeList1.itemindex].Code.Text);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.EditorDragOver(Sender, Source: TObject; X, Y: Integer;
|
|
|
|
State: TDragState; var Accept: Boolean);
|
|
|
|
begin
|
|
|
|
Accept := true; // AV: so you can drag and drop any text inside the Scripter!
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.EditorGetAutoCompletionList(Sender: TObject;
|
|
|
|
AToken: string; AList: TStringList); // AV: so the scripter will resemble a real IDE
|
|
|
|
var i: integer;
|
|
|
|
begin
|
|
|
|
if (LowerCase(AToken) = 'transform.') then
|
|
|
|
begin
|
|
|
|
ALIst.AddObject('property coefs[][]: array of double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property post[][]: array of double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property A: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property B: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property C: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property D: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property E: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property F: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Color: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property VarColor: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Opacity: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property PlotMode: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Weight: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Symmetry: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ColorSpeed: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Chaos[]: array of double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Name: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('procedure Clear', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method Rotate(Degrees: double)', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method RotatePXOrigin(Degrees: double)', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method RotatePX(Degrees: double)', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method ScalePX(Factor: double)', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method FlipHoriz', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method FlipPXHoriz', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method FlipVert', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method FlipPXVert', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method Scale(Factor: double)', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method RotateOrigin(Degrees: double)', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('property Variation[]: array of double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Variable[]: array of double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property postXformEnabled: boolean', TObject(ttProp));
|
|
|
|
ALIst.AddObject('method SwapCoefs', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method ResetVariables', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method SwapVariations(var1_name, var2_name: string)', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method SortVariationsByName', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method SortVariationsByIndex', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method PrintVariationsOrder', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method SetVariationOrder(var_name, index: integer)', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method CopyVariationsOrder(transform_index: integer)', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('function GetVariationOrder(var_name: string): integer', TObject(ttMethod));
|
|
|
|
|
|
|
|
for i:= 0 to NRVAR - 1 do
|
|
|
|
ALIst.AddObject('property ' + varnames(i) + ': double', TObject(ttProp));
|
|
|
|
for i:= 0 to GetNrVariableNames - 1 do begin
|
|
|
|
ALIst.AddObject('property ' + GetVariableNameAt(i) + ': double', TObject(ttProp));
|
|
|
|
end;
|
2022-06-23 06:22:32 -04:00
|
|
|
end
|
|
|
|
else if (LowerCase(AToken) = 'flame.') then
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
ALIst.AddObject('property Gamma: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property GammaThreshold: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Brightness: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Vibrancy: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Contrast: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Scale: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Width: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Weight: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property PreviewWidth: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property PreviewHeight: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Zoom: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Angle: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Pitch: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Yaw: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Roll: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Perspective: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Z: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property X: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Y: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property DOF: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Name: string', TObject(ttProp));
|
2022-06-23 06:22:32 -04:00
|
|
|
ALIst.AddObject('property Comment: string', TObject(ttProp));
|
2022-03-08 12:25:51 -05:00
|
|
|
ALIst.AddObject('property SampleDensity: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Quality: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Time: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Hue: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Oversample: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property FilterRadius: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property FinalXformEnabled: boolean', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Background[]: array of integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Gradient[][]: array of integer', TObject(ttProp));
|
2022-06-23 06:22:32 -04:00
|
|
|
end
|
|
|
|
else if (LowerCase(AToken) = 'pivot.') then
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
ALIst.AddObject('property X: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Y: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Mode: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('procedure Set( X: double, Y: double)', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('procedure Reset', TObject(ttMethod));
|
2022-06-23 06:22:32 -04:00
|
|
|
end
|
|
|
|
else if (LowerCase(AToken) = 'renderer.') then
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
ALIst.AddObject('property Filename: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Width: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Height: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MaxMemory: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property EmbedParameters: boolean', TObject(ttProp));
|
2022-06-23 06:22:32 -04:00
|
|
|
end
|
|
|
|
else if (LowerCase(AToken) = 'options.') then
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
ALIst.AddObject('property JPEGQuality: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property BatchSize: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ParameterFile: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property SmoothPaletteFile: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property NumTries: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property TryLength: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ConfirmDelete: boolean', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Transparency: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Multithreading: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Gamma: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property GammaThreshold: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Brightness: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Vibrancy: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Contrast: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property PreviewLowQuality: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property PreviewMediumQuality: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property PreviewHighQuality: double', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Variations[]: array of boolean', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MinTransforms: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MutateMinTransforms: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MaxTransforms: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MutateMaxTransforms: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property RandomPrefix: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property KeepBackground: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property SymmetryType: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property SymmetryOrder: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MinNodes: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MaxNodes: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MaxSaturation: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MinSaturation: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MaxLuminance: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MinLuminance: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property GradientOnRandom: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property GradientFileOnRandom: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ColorBlending: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property EvenGradientStripes: boolean', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ExportRenderer: string', TObject(ttProp));
|
2022-06-23 06:22:32 -04:00
|
|
|
end
|
|
|
|
else if pos('tstringlist', LowerCase(AToken))> 0 then
|
|
|
|
ALIst.AddObject('constructor Create', TObject(ttMethod))
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
// AV: easter eggs ;-)
|
2022-06-23 06:22:32 -04:00
|
|
|
else if (((pos('apo', LowerCase(AToken))> 0) and (LowerCase(AToken) <> 'apophysis.'))
|
|
|
|
or (pos('ifs', LowerCase(AToken))> 0)) then
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
//AList.Clear;
|
2022-03-08 12:25:51 -05:00
|
|
|
ALIst.AddObject('procedure LoadFromFile(full_filename: string)', TObject(ttProc));
|
|
|
|
ALIst.AddObject('procedure SaveToFile(full_filename: string)', TObject(ttProc));
|
|
|
|
ALIst.AddObject('function Add(text: string): integer', TObject(ttFunc));
|
|
|
|
ALIst.AddObject('function AddPair(Name, Value: string): TStrings', TObject(ttFunc));
|
|
|
|
ALIst.AddObject('function IndexOfName(Name: string): integer', TObject(ttFunc));
|
|
|
|
ALIst.AddObject('property KeyNames[index: integer]: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Names[index: integer]: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Values[Name: string]: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ValueFromIndex[index: integer]: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('function IndexOf(text_str: string): integer', TObject(ttFunc));
|
|
|
|
ALIst.AddObject('property Count: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('procedure Insert(index: integer, str: string)', TObject(ttProc));
|
|
|
|
ALIst.AddObject('procedure Delete(str_index: integer)', TObject(ttProc));
|
|
|
|
ALIst.AddObject('procedure Move(CurIndex, NewIndex: integer)', TObject(ttProc));
|
|
|
|
ALIst.AddObject('property Strings[]: array of string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property NameValueSeparator: char', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property CommaText: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Text: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('destructor Free', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('procedure Clear', TObject(ttProc));
|
|
|
|
ALIst.AddObject('procedure Sort', TObject(ttProc));
|
|
|
|
ALIst.AddObject('property Sorted: boolean', TObject(ttProp));
|
|
|
|
ALIst.AddObject('procedure Assign(sourse: TStrings)', TObject(ttProc));
|
|
|
|
ALIst.AddObject('procedure AddStrings(strings: TStrings)', TObject(ttProc));
|
2022-06-23 06:22:32 -04:00
|
|
|
end
|
|
|
|
else
|
2022-03-08 12:25:51 -05:00
|
|
|
if (LowerCase(AToken) = 'apophysis.') or (LowerCase(AToken) = 'application.') then
|
|
|
|
begin
|
|
|
|
ALIst.AddObject('function MessageBox(Promt, Caption: string, DlgStyle: integer = 0): integer;',
|
|
|
|
TObject(ttFunc));
|
|
|
|
ALIst.AddObject('property Icon', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Title', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ExeName', TObject(ttProp));
|
|
|
|
ALIst.AddObject('procedure ProcessMessages', TObject(ttMethod));
|
2022-06-23 06:22:32 -04:00
|
|
|
end
|
|
|
|
else
|
|
|
|
if (LowerCase(AToken) = 'ttaskdialog.') then
|
|
|
|
ALIst.AddObject('constructor Create(nil)', TObject(ttMethod))
|
|
|
|
else
|
2022-03-08 12:25:51 -05:00
|
|
|
if (pos('tdlg', LowerCase(AToken))> 0) then
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
//AList.Clear;
|
2022-03-08 12:25:51 -05:00
|
|
|
ALIst.AddObject('destructor Destroy', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('property Title: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Caption: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MainIcon', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property CustomMainIcon', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ExpandedText: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ExpandButtonCaption: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Text: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property VerificationText: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property CommonButtons: [set]', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property DefaultButton', TObject(ttProp));
|
|
|
|
ALIst.AddObject('method Execute', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('property ModalResult: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Buttons', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property RadioButtons', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Button', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property RadioButton', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Flags: [set]', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property FooterText: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property FooterIcon', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property CustomFooterIcon', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ProgressBar', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property OnVerificationClicked: procedure', TObject(ttProp));
|
|
|
|
end;
|
|
|
|
if (pos('buttons.', LowerCase(AToken))> 0) then
|
|
|
|
begin
|
|
|
|
AList.Clear;
|
|
|
|
ALIst.AddObject('method Add', TObject(ttMethod));
|
|
|
|
ALIst.AddObject('method Delete(i)', TObject(ttMethod));
|
|
|
|
if (pos('radiobuttons.', LowerCase(AToken))> 0) then
|
|
|
|
ALIst.AddObject('property Items[i]', TObject(ttProp));
|
|
|
|
end;
|
|
|
|
if (pos('radiobutton.', LowerCase(AToken))> 0) then
|
|
|
|
begin
|
|
|
|
AList.Clear;
|
|
|
|
ALIst.AddObject('property ID: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Index: integer', TObject(ttProp));
|
|
|
|
end;
|
|
|
|
if (pos('btn', LowerCase(AToken))> 0) or (pos('.button.', LowerCase(AToken))> 0) then
|
|
|
|
begin
|
|
|
|
AList.Clear;
|
|
|
|
ALIst.AddObject('property Caption: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property CommandLinkHint: string', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property ModalResult: integer', TObject(ttProp));
|
|
|
|
end;
|
|
|
|
if (pos('progressbar.', LowerCase(AToken))> 0) then
|
|
|
|
begin
|
|
|
|
AList.Clear;
|
|
|
|
ALIst.AddObject('property Min: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Max: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property Position: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property MarqueeSpeed: integer', TObject(ttProp));
|
|
|
|
ALIst.AddObject('property State: integer', TObject(ttProp));
|
|
|
|
end;
|
|
|
|
|
|
|
|
if (AList.Count > 1) then AList.Sorted := True;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.ExpandBlocksClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
Editor.ExpandAllNodes;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ ****************************** }
|
|
|
|
|
|
|
|
procedure TScriptEditor.ScrCodeList1BlockDblClick(Sender: TObject;
|
|
|
|
ACodeBlock: TCodeBlock);
|
|
|
|
begin
|
|
|
|
with Editor do
|
|
|
|
DropText(CurX, CurY, ScrCodeList1.CodeBlocks[ScrCodeList1.itemindex].Code.Text);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.ScrCodeList1BlockRightClick(Sender: TObject;
|
|
|
|
ACodeBlock: TCodeBlock);
|
|
|
|
begin
|
|
|
|
ScrCodeList1.ItemIndex := ACodeBlock.Index;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.ScrCodeList1ContextPopup(Sender: TObject;
|
|
|
|
MousePos: TPoint; var Handled: Boolean);
|
|
|
|
begin
|
|
|
|
if (ScrCodeList1.Items.Count > 1) then
|
|
|
|
mnuDeleteBlock.Enabled := True
|
|
|
|
else
|
|
|
|
mnuDeleteBlock.Enabled := False;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.ScrCodeList1DragDrop(Sender, Source: TObject; X,
|
|
|
|
Y: Integer);
|
|
|
|
begin
|
|
|
|
ScrCodeList1.CodeBlocks.Add(Editor.Selection);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.ScrCodeList1DragOver(Sender, Source: TObject; X,
|
|
|
|
Y: Integer; State: TDragState; var Accept: Boolean);
|
|
|
|
begin
|
|
|
|
Accept := (source is TScrMemo);
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.ScripterCompileError(Sender: TObject;
|
|
|
|
var msg: string; row, col: Integer; var ShowException: Boolean);
|
2022-06-23 06:22:32 -04:00
|
|
|
var ps, n: integer;
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
btnRun.Enabled := True;
|
|
|
|
btnStop.Enabled := False;
|
|
|
|
btnBreak.Enabled := False;
|
|
|
|
btnPause.Enabled := False;
|
|
|
|
MainForm.btnRunScript.Enabled := True;
|
|
|
|
MainForm.btnStopScript.Enabled := False;
|
|
|
|
MainForm.mnuRun.Enabled := True;
|
|
|
|
MainForm.mnuStop.Enabled := False;
|
|
|
|
{ AV: in previous Apo versions,
|
|
|
|
user cannot load a Script
|
|
|
|
after simple syntax error - it's not normally... }
|
|
|
|
if (MainForm.FavouriteScripts1.Count > 0) then
|
|
|
|
MainForm.FavouriteScripts1.Enabled := True; // AV
|
|
|
|
if (MainForm.Directory1.Count > 0) then
|
|
|
|
MainForm.Directory1.Enabled := True; // AV
|
|
|
|
|
|
|
|
StatusBar.SimpleText := TextByKey('script-status-compileerror'); // AV
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
n := min(row, Editor.Lines.Count) - 1; // AV
|
|
|
|
Editor.ActiveLine := n;
|
2022-03-08 12:25:51 -05:00
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := True;
|
|
|
|
if LanguageFile <> '' then // AV: if we need to translate from/to English
|
|
|
|
begin
|
|
|
|
if pos('Unknown ident', msg) > 0 then
|
|
|
|
msg := StringReplace(msg, 'Unknown identifier or variable is not declared',
|
|
|
|
TextByKey('script-status-noidentifier'), [])
|
|
|
|
else if pos('Syntax err', msg) > 0 then
|
|
|
|
msg := StringReplace(msg, 'Syntax error',
|
|
|
|
TextByKey('script-status-syntaxerror'), [])
|
|
|
|
else if pos('Unknown member id', msg) > 0 then
|
|
|
|
msg := StringReplace(msg, 'Unknown member identifier',
|
|
|
|
TextByKey('script-status-noclassmember'), [])
|
|
|
|
else if pos('Unknown method or rout', msg) > 0 then
|
|
|
|
msg := StringReplace(msg, 'Unknown method or routine',
|
|
|
|
TextByKey('script-status-unknownmethod'), [])
|
|
|
|
else if pos('value to const', msg) > 0 then
|
|
|
|
msg := StringReplace(msg, 'Cannot assign a value to constant',
|
|
|
|
TextByKey('script-status-constassign'), [])
|
|
|
|
else if pos('Too many param', msg) > 0 then
|
|
|
|
begin
|
|
|
|
msg := StringReplace(msg, 'Too many parameters for method',
|
|
|
|
TextByKey('script-status-toomanyparams'), []);
|
|
|
|
ps := pos('#', TextByKey('script-status-expectparams'));
|
|
|
|
if (ps <> 0) then begin
|
|
|
|
msg := StringReplace(msg, 'Expected ', Copy(TextByKey('script-status-expectparams'), 1, ps - 1), []);
|
|
|
|
msg := StringReplace(msg, ' parameters', Copy(TextByKey('script-status-expectparams'), ps + 1,
|
|
|
|
length(TextByKey('script-status-expectparams')) - ps), []);
|
|
|
|
end;
|
|
|
|
end
|
|
|
|
else if pos('Not enough act', msg) > 0 then
|
|
|
|
begin
|
|
|
|
msg := StringReplace(msg, 'Not enough actual parameters for method',
|
|
|
|
TextByKey('script-status-notenoughparams'), []);
|
|
|
|
ps := pos('#', TextByKey('script-status-expectparams'));
|
|
|
|
if (ps <> 0) then begin
|
|
|
|
msg := StringReplace(msg, 'Expected ', Copy(TextByKey('script-status-expectparams'), 1, ps - 1), []);
|
|
|
|
msg := StringReplace(msg, ' parameters', Copy(TextByKey('script-status-expectparams'), ps + 1,
|
|
|
|
length(TextByKey('script-status-expectparams')) - ps), []);
|
|
|
|
end;
|
|
|
|
end
|
|
|
|
else if (pos('Method ', msg) > 0) and (pos('expects vari', msg) > 0) then
|
|
|
|
begin
|
|
|
|
ps := pos('#', TextByKey('script-status-expectvar'));
|
|
|
|
if (ps <> 0) then begin
|
|
|
|
msg := StringReplace(msg, 'Method ', Copy(TextByKey('script-status-expectvar'), 1, ps - 1), []);
|
|
|
|
msg := StringReplace(msg, ' expects variable reference', Copy(TextByKey('script-status-expectvar'), ps + 1,
|
|
|
|
length(TextByKey('script-status-expectvar')) - ps), []);
|
|
|
|
end;
|
|
|
|
end
|
|
|
|
else if pos('Assign to meth', msg) > 0 then
|
|
|
|
begin
|
|
|
|
ps := pos('#', TextByKey('script-status-notassign'));
|
|
|
|
if (ps <> 0) then begin
|
|
|
|
msg := StringReplace(msg, 'Assign to method ', Copy(TextByKey('script-status-notassign'), 1, ps - 1), []);
|
|
|
|
msg := StringReplace(msg, ' is not allowed', Copy(TextByKey('script-status-notassign'), ps + 1,
|
|
|
|
length(TextByKey('script-status-notassign')) - ps), []);
|
|
|
|
end;
|
|
|
|
end
|
|
|
|
else if pos('called as a me', msg) > 0 then
|
|
|
|
begin
|
|
|
|
ps := pos('#', TextByKey('script-status-propnotfunc'));
|
|
|
|
if (ps <> 0) then begin
|
|
|
|
msg := StringReplace(msg, 'Property ', Copy(TextByKey('script-status-propnotfunc'), 1, ps - 1), []);
|
|
|
|
msg := StringReplace(msg, ' cannot be called as a method', Copy(TextByKey('script-status-propnotfunc'), ps + 1,
|
|
|
|
length(TextByKey('script-status-propnotfunc')) - ps), []);
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
2022-06-23 06:22:32 -04:00
|
|
|
Console.Lines.Add(TextByKey('script-line') + #32 + IntToStr(n+1) + ' : '+ msg);
|
2022-03-08 12:25:51 -05:00
|
|
|
LoadForm.Output.Text := LoadForm.Output.Text + DTError + TextByKey('script-line') + ': '#39 +
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.Lines[n] + #39', '+ TextByKey('script-position') +
|
2022-03-08 12:25:51 -05:00
|
|
|
': '+ IntToStr(col) + #13#10 + msg + #13#10; // AV
|
|
|
|
ScriptRenderForm.Close;
|
|
|
|
ShowException := true;
|
|
|
|
Application.ProcessMessages;
|
|
|
|
if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.ScripterRuntimeError(Sender: TObject; var msg: string;
|
|
|
|
row, col: Integer; var ShowException: Boolean); // AV
|
|
|
|
begin
|
|
|
|
btnRun.Enabled := True;
|
|
|
|
btnStop.Enabled := False;
|
|
|
|
btnBreak.Enabled := False;
|
|
|
|
btnPause.Enabled := False;
|
|
|
|
MainForm.btnRunScript.Enabled := True;
|
|
|
|
MainForm.btnStopScript.Enabled := False;
|
|
|
|
MainForm.mnuRun.Enabled := True;
|
|
|
|
MainForm.mnuStop.Enabled := False;
|
|
|
|
StatusBar.SimpleText := TextByKey('script-status-runtimeerror'); // AV
|
|
|
|
{ AV: in previous Apo versions,
|
|
|
|
user cannot continue work in Script editor
|
|
|
|
after runtime error - it's not normally... }
|
|
|
|
if (MainForm.FavouriteScripts1.Count > 0) then
|
|
|
|
MainForm.FavouriteScripts1.Enabled := True; // AV
|
|
|
|
if (MainForm.Directory1.Count > 0) then
|
|
|
|
MainForm.Directory1.Enabled := True; // AV
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.ActiveLine := min(row, Editor.Lines.Count) - 1; // AV
|
2022-03-08 12:25:51 -05:00
|
|
|
Editor.ActiveLineSettings.ShowActiveLine := True;
|
|
|
|
if LanguageFile <> '' then
|
|
|
|
{ AV: We don't need to translate from-to English }
|
|
|
|
begin
|
|
|
|
if pos('not an array', msg) > 0 then
|
|
|
|
msg := StringReplace(msg, 'Variable is not an array',
|
|
|
|
TextByKey('script-status-varnotarray'), [])
|
|
|
|
else if pos('find form f', msg) > 0 then
|
|
|
|
msg := StringReplace(msg, 'Cannot find form file',
|
|
|
|
TextByKey('script-status-noformfile'), []);
|
|
|
|
end;
|
|
|
|
LoadForm.Output.Text := LoadForm.Output.Text + RTError + TextByKey('script-line') + ': '#39 +
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.Lines[Editor.ActiveLine] + #39', '+ TextByKey('script-position') +
|
2022-03-08 12:25:51 -05:00
|
|
|
': '+ IntToStr(col) + #13#10 + msg + #13#10;
|
|
|
|
ScriptRenderForm.Close;
|
|
|
|
ShowException := true;
|
|
|
|
Application.ProcessMessages;
|
|
|
|
if LoadForm.CheckBox1.Checked then LoadForm.Show; // AV
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.btnStopClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
Console.Lines.Add(TextByKey('script-status-stopped')); // AV
|
|
|
|
if btnPause.Down then btnPause.Click; // AV
|
|
|
|
Stopped := True;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.AddFromClipboardClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
AddFromClipboard.Checked := not AddFromClipboard.Checked;
|
|
|
|
ScrCodeList1.ClipboardView := AddFromClipboard.Checked;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.AdjustScripterColors; // AV
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
BackColor: TColor;
|
|
|
|
begin
|
|
|
|
BackColor := Editor.BkColor;
|
|
|
|
with Styler do // default
|
|
|
|
begin
|
|
|
|
for i := 0 to AllStyles.Count-1 do
|
|
|
|
AllStyles[i].BGColor := BackColor;
|
|
|
|
CommentStyle.BkColor := BackColor;
|
|
|
|
NumberStyle.BkColor := BackColor;
|
|
|
|
NumberStyle.TextColor := clFuchsia;
|
|
|
|
end;
|
|
|
|
Editor.BlockColor := MidColor;
|
|
|
|
Editor.Gutter.GutterColor := BrightColor;
|
|
|
|
Editor.Gutter.GutterColorTo := MidColor;
|
|
|
|
Editor.Gutter.Font.Color := TextColor;
|
|
|
|
ScrCodeList1.Font.Color := Editor.Font.Color;
|
|
|
|
|
|
|
|
if IsDarkTheme then // AV: adaptating the scripter to dark themes
|
|
|
|
begin
|
|
|
|
with Styler do
|
|
|
|
begin
|
|
|
|
AllStyles[0].Font.Color := clLime;
|
|
|
|
AllStyles[4].Font.Color := clAqua;
|
|
|
|
CommentStyle.TextColor := clAqua;
|
|
|
|
end;
|
|
|
|
with Editor.AutoCompletion do begin
|
|
|
|
Font.Color := clWhite;
|
|
|
|
ColorFunc := $00C6C600; // turquoise
|
|
|
|
ColorProc := $00C6C600;
|
|
|
|
ColorMethod := $00C6C600;
|
|
|
|
ColorProp := $0020B9FB; // orange
|
|
|
|
ColorIdentifier := $00E901BA; // violet
|
|
|
|
ColorVar := clSkyBlue;
|
|
|
|
end;
|
|
|
|
end
|
|
|
|
else
|
|
|
|
begin
|
|
|
|
with Styler do // default
|
|
|
|
begin
|
|
|
|
AllStyles[0].Font.Color := clGreen;
|
|
|
|
AllStyles[4].Font.Color := clNavy;
|
|
|
|
CommentStyle.TextColor := clNavy;
|
|
|
|
|
|
|
|
if (CurrentStyle = 'Calypso SLE') or
|
|
|
|
(CurrentStyle = 'Emerald') or (CurrentStyle = 'Coral') then
|
|
|
|
NumberStyle.TextColor := $009F009F;
|
|
|
|
end;
|
|
|
|
with Editor.AutoCompletion do begin
|
|
|
|
Font.Color := TextColor;
|
|
|
|
ColorFunc := clNavy;
|
|
|
|
ColorProc := clNavy;
|
|
|
|
ColorMethod := clNavy;
|
|
|
|
ColorProp := clGreen;
|
|
|
|
ColorIdentifier := clTeal;
|
|
|
|
ColorVar := clBlue;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.btnBreakClick(Sender: TObject);
|
|
|
|
begin
|
|
|
|
LastError := TextByKey('script-status-break');
|
|
|
|
if btnPause.Down then btnPause.Click; // AV
|
|
|
|
Scripter.Halt;
|
|
|
|
btnPause.Enabled := False;
|
|
|
|
StatusBar.SimpleText := StatusBar.Hint;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.btnFavoriteClick(Sender: TObject);
|
|
|
|
// AV: rewrite and bring back to life a very old method
|
|
|
|
var
|
|
|
|
i: integer;
|
|
|
|
there: boolean;
|
|
|
|
begin
|
|
|
|
if Trim(Editor.Lines.Text)= '' then exit;
|
|
|
|
there := False;
|
|
|
|
for i := 0 to Favorites.Count - 1 do
|
|
|
|
if Lowercase(Script) = LowerCase(Favorites[i]) then begin
|
|
|
|
There := true;
|
|
|
|
break;
|
|
|
|
end;
|
|
|
|
if there then begin
|
|
|
|
Application.MessageBox(PChar(Format(TextByKey('common-favscriptexists'),
|
2022-06-23 06:22:32 -04:00
|
|
|
[ExtractFileName(Script)])), PChar(ApophysisSVN), MB_ICONWARNING);
|
2022-03-08 12:25:51 -05:00
|
|
|
exit;
|
|
|
|
end;
|
|
|
|
|
|
|
|
if (Script = '') or Editor.LinesModified then btnSave.Click;
|
|
|
|
if Script <> '' then begin
|
|
|
|
Favorites.Add(Script);
|
|
|
|
Favorites.SaveToFile(AppPath + scriptFavsFilename);
|
|
|
|
MainForm.GetScripts;
|
|
|
|
Application.MessageBox(PChar(Format(TextByKey('common-favscriptadded'),
|
2022-06-23 06:22:32 -04:00
|
|
|
[ExtractFileName(Script)])), ApophysisSVN, MB_ICONINFORMATION);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
{ // AV: now it's deprecated
|
|
|
|
procedure TScriptEditor.FormShortCut(var Msg: TWMKey; var Handled: Boolean);
|
|
|
|
begin
|
|
|
|
if GetKeyState(VK_CONTROL) >= 0 then
|
|
|
|
Exit;
|
|
|
|
|
|
|
|
if Msg.CharCode = Ord('C') then begin
|
|
|
|
Editor.CopyToClipBoard;
|
|
|
|
Handled := True;
|
|
|
|
end;
|
|
|
|
|
|
|
|
if Msg.CharCode = Ord('V') then begin
|
|
|
|
Editor.PasteFromClipBoard;
|
|
|
|
Handled := True;
|
|
|
|
end;
|
|
|
|
|
|
|
|
if Msg.CharCode = Ord('X') then begin
|
|
|
|
Editor.CutToClipBoard;
|
|
|
|
Handled := True;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
}
|
|
|
|
|
|
|
|
procedure TScriptEditor.F2SXMLContent(Sender: TObject; Content: string);
|
|
|
|
begin
|
|
|
|
// todo: palette
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.F2SXMLEmptyTag(Sender: TObject; TagName: string;
|
|
|
|
Attributes: TAttrList);
|
|
|
|
var
|
2022-06-23 06:22:32 -04:00
|
|
|
i, n: integer;
|
|
|
|
v, w: string; //TStringType;
|
2022-03-08 12:25:51 -05:00
|
|
|
d, floatcolor: double;
|
|
|
|
Tokens: TStringList;
|
|
|
|
begin
|
|
|
|
|
|
|
|
Tokens := TStringList.Create;
|
|
|
|
try
|
|
|
|
if (TagName = 'xform') or (TagName = 'finalxform') then
|
|
|
|
Editor.Lines.Add('');
|
|
|
|
if TagName = 'finalxform' then begin
|
|
|
|
Editor.Lines.Add('{ Final Transform }');
|
|
|
|
Editor.Lines.Add('Flame.FinalXformEnabled := True;');
|
|
|
|
Editor.Lines.Add('SetActiveTransform(transforms);');
|
|
|
|
end else begin
|
2022-06-23 06:22:32 -04:00
|
|
|
w := '{ Transform ' + IntToStr(AddedXForms + 1);
|
|
|
|
v := string(Attributes.Value('name'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if (v <> '') then w := w + ' (' + v + ')';
|
|
|
|
w := w + ' }';
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.Lines.Add(w);
|
2022-03-08 12:25:51 -05:00
|
|
|
Editor.Lines.Add('AddTransform;');
|
|
|
|
end;
|
|
|
|
Editor.Lines.Add('with Transform do begin');
|
|
|
|
//Editor.Lines.Add(' for i := 0 to NXFORMS do Chaos[i] := 1;');
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('var_order'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if v <> '' then begin
|
2022-06-23 06:22:32 -04:00
|
|
|
GetTokens(v, tokens);
|
2022-03-08 12:25:51 -05:00
|
|
|
n := -1;
|
|
|
|
for i := 0 to Tokens.Count-1 do
|
|
|
|
if (GetVariationIndex(Tokens[i]) >= 0) then begin
|
|
|
|
inc(n);
|
|
|
|
Editor.Lines.Add(Format(' SetVariationOrder(''%s'', %d);', [Tokens[i], n]));
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('linear')); // varnames(0)
|
|
|
|
if v = '' then
|
|
|
|
Editor.Lines.Add(' Variation[0] := 0; // linear');
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
for i := 0 to NRVAR - 1 do
|
|
|
|
begin
|
2022-06-23 06:22:32 -04:00
|
|
|
w := varnames(i);
|
|
|
|
v := string(Attributes.Value(Utf8String(w)));
|
2022-03-08 12:25:51 -05:00
|
|
|
if v <> '' then
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.Lines.Add(Format(' %s := %.6g;', [w, StrToFloat(v)]));
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
|
|
|
for i := 0 to GetNrVariableNames - 1 do begin
|
2022-06-23 06:22:32 -04:00
|
|
|
w := GetVariableNameAt(i);
|
|
|
|
v := string(Attributes.Value(Utf8String(w)));
|
2022-03-08 12:25:51 -05:00
|
|
|
if v <> '' then begin
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.Lines.Add(' ' + w + ' := ' + v + ';');
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('weight'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if (v <> '') and (TagName = 'xform') then
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.Lines.Add(Format(' Weight := %.6g;', [StrToFloat(v)]));
|
|
|
|
v := string(Attributes.Value('color'));
|
|
|
|
if (v <> '') then Editor.Lines.Add(' Color := ' + v+ ';');
|
|
|
|
v := string(Attributes.Value('var_color'));
|
|
|
|
if (v <> '') then Editor.Lines.Add(' VarColor := ' + v + ';');
|
|
|
|
// AV: fixed - final xforms can have ColorSpeed <> 1
|
|
|
|
v := string(Attributes.Value('symmetry'));
|
|
|
|
if (v <> '') then Editor.Lines.Add(' Symmetry := ' + v + ';');
|
|
|
|
v := string(Attributes.Value('opacity'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if v <> '' then begin
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.Lines.Add(' Opacity := ' + v + ';');
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('coefs'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if (v <> '') then begin
|
2022-06-23 06:22:32 -04:00
|
|
|
GetTokens(v, tokens);
|
2022-03-08 12:25:51 -05:00
|
|
|
Editor.Lines.Add(Format(' coefs[0,0] := %.6g; // a', [StrToFloat(Tokens[0])]));
|
|
|
|
Editor.Lines.Add(Format(' coefs[1,0] := %.6g; // b', [StrToFloat(Tokens[2]) * (-1)]));
|
|
|
|
Editor.Lines.Add(Format(' coefs[0,1] := %.6g; // c', [StrToFloat(Tokens[1]) * (-1)]));
|
|
|
|
Editor.Lines.Add(Format(' coefs[1,1] := %.6g; // d', [StrToFloat(Tokens[3])]));
|
|
|
|
Editor.Lines.Add(Format(' coefs[2,0] := %.6g; // e', [StrToFloat(Tokens[4])]));
|
|
|
|
Editor.Lines.Add(Format(' coefs[2,1] := %.6g; // f', [StrToFloat(Tokens[5]) * (-1)]));
|
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('post'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if v <> '' then begin
|
2022-06-23 06:22:32 -04:00
|
|
|
GetTokens(v, tokens);
|
2022-03-08 12:25:51 -05:00
|
|
|
Editor.Lines.Add(Format(' post[0,0] := %.6g;', [StrToFloat(Tokens[0])]));
|
|
|
|
Editor.Lines.Add(Format(' post[0,1] := %.6g;', [StrToFloat(Tokens[1]) * (-1)]));
|
|
|
|
Editor.Lines.Add(Format(' post[1,0] := %.6g;', [StrToFloat(Tokens[2]) * (-1)]));
|
|
|
|
Editor.Lines.Add(Format(' post[1,1] := %.6g;', [StrToFloat(Tokens[3])]));
|
|
|
|
Editor.Lines.Add(Format(' post[2,0] := %.6g;', [StrToFloat(Tokens[4])]));
|
|
|
|
Editor.Lines.Add(Format(' post[2,1] := %.6g;', [StrToFloat(Tokens[5]) * (-1)]));
|
|
|
|
end;
|
|
|
|
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('chaos'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if v <> '' then begin
|
|
|
|
chaosLines.Add('');
|
|
|
|
chaosLines.Add('{ Weight modifiers for transform ' + IntToStr(AddedXForms + 1) + ' }');
|
|
|
|
chaosLines.Add('SetActiveTransform(' + IntToStr(AddedXForms) + ');');
|
|
|
|
chaosLines.Add('with Transform do begin');
|
2022-06-23 06:22:32 -04:00
|
|
|
GetTokens(v, tokens);
|
2022-03-08 12:25:51 -05:00
|
|
|
for i := 0 to Tokens.Count-1 do
|
|
|
|
chaosLines.Add(' chaos[' + IntToStr(i) + '] := ' + Tokens[i] + ';') ;
|
|
|
|
chaosLines.Add('end;');
|
|
|
|
end;
|
|
|
|
|
|
|
|
Editor.Lines.Add('end;');
|
|
|
|
AddedXForms := AddedXForms + 1;
|
|
|
|
finally
|
|
|
|
Tokens.free;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
|
|
|
procedure TScriptEditor.F2SXMLStartTag(Sender: TObject; TagName: string;
|
|
|
|
Attributes: TAttrList);
|
|
|
|
var
|
|
|
|
Tokens: TStringList;
|
2022-06-23 06:22:32 -04:00
|
|
|
v: string; //TStringType;
|
2022-03-08 12:25:51 -05:00
|
|
|
f, b: double;
|
|
|
|
begin
|
|
|
|
Tokens := TStringList.Create;
|
|
|
|
try
|
|
|
|
|
|
|
|
if TagName='flame' then
|
|
|
|
begin
|
|
|
|
AddedXForms := 0;
|
|
|
|
Editor.Lines.Add('{ Flame }');
|
|
|
|
Editor.Lines.Add('Clear;');
|
|
|
|
// Editor.Lines.Add('if (pos(''7x'', LowerCase(ProgramVersionString)) > 0) then');
|
|
|
|
// Editor.Lines.Add(' AngleTransform := 180 / PI else AngleTransform := 1;');
|
|
|
|
Editor.Lines.Add('with Flame do begin');
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('size'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if (v <> '') then begin
|
2022-06-23 06:22:32 -04:00
|
|
|
GetTokens(v, tokens);
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
Editor.Lines.Add(' Width := ' + Tokens[0] + ';');
|
|
|
|
Editor.Lines.Add(' Height := ' + Tokens[1] + ';');
|
|
|
|
|
|
|
|
f := 100 / StrToFloat(Tokens[0]);
|
|
|
|
end else f := 0;
|
2022-06-23 06:22:32 -04:00
|
|
|
|
|
|
|
b := 0;
|
|
|
|
v := string(Attributes.Value('brightness'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if (v <> '') then begin
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.Lines.Add(' Brightness := ' + v + ';');
|
|
|
|
b := StrToFloat(v);
|
2022-03-08 12:25:51 -05:00
|
|
|
end;
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('gamma'));
|
|
|
|
if (v <> '') then Editor.Lines.Add(' Gamma := ' + v + ';');
|
|
|
|
v := string(Attributes.Value('vibrancy'));
|
|
|
|
if (v <> '') then Editor.Lines.Add(' Vibrancy := ' + v + ';');
|
|
|
|
v := string(Attributes.Value('contrast'));
|
|
|
|
if (v <> '') then Editor.Lines.Add(' Contrast := ' + v + ';');
|
|
|
|
v := string(Attributes.Value('gamma_threshold'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if (v <> '') then begin
|
2022-06-23 06:22:32 -04:00
|
|
|
if b <> 0 then b := StrToFloat(v) / b;
|
2022-03-08 12:25:51 -05:00
|
|
|
Editor.Lines.Add(' GammaThreshold := ' + FloatToStr(b) + ';');
|
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('zoom'));
|
|
|
|
if (v <> '') then Editor.Lines.Add(' Zoom := ' + v + ';');
|
|
|
|
v := string(Attributes.Value('scale'));
|
|
|
|
if (v <> '') then
|
|
|
|
Editor.Lines.Add(Format(' Scale := %.6g;', [StrToFloat(v) * f]));
|
|
|
|
v := string(Attributes.Value('angle'));
|
|
|
|
if (v <> '') then
|
2022-03-08 12:25:51 -05:00
|
|
|
// Editor.Lines.Add(' Angle := ' + FloatToStr(StrToFloat(String(v))* 180 / PI) + '; ');
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.Lines.Add(Format(' Angle := %.6g; // Flame rotation', [StrToFloat(v) * 180 / PI]));
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
// 3d
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('cam_pitch'));
|
|
|
|
if (v <> '') then
|
|
|
|
Editor.Lines.Add(Format(' Pitch := %.6g;', [StrToFloat(v) * 180 / PI]));
|
|
|
|
v := string(Attributes.Value('cam_roll')); // AV
|
|
|
|
if (v <> '') then
|
|
|
|
Editor.Lines.Add(Format(' Roll := %.6g;', [StrToFloat(v) * 180 / PI]));
|
|
|
|
v := string(Attributes.Value('cam_yaw'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if (v <> '') then
|
2022-06-23 06:22:32 -04:00
|
|
|
Editor.Lines.Add(Format(' Yaw := %.6g;', [StrToFloat(v) * 180 / PI]));
|
|
|
|
v :=string( Attributes.Value('cam_perspective'));
|
|
|
|
if (v <> '') then Editor.Lines.Add(' Perspective := ' + v + ';');
|
|
|
|
v := string(Attributes.Value('cam_zpos'));
|
|
|
|
if (v <> '') then Editor.Lines.Add(' Z := ' + v + ';');
|
|
|
|
v := string(Attributes.Value('cam_dof'));
|
|
|
|
if (v <> '') then Editor.Lines.Add(' DOF := ' + v + ';');
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
try
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('center'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if (v <> '') then begin
|
2022-06-23 06:22:32 -04:00
|
|
|
GetTokens(v, tokens);
|
2022-03-08 12:25:51 -05:00
|
|
|
Editor.Lines.Add(' X := ' + Tokens[0] + ';');
|
|
|
|
Editor.Lines.Add(' Y := ' + Tokens[1] + ';');
|
|
|
|
end;
|
|
|
|
except
|
|
|
|
Editor.Lines.Add(' X := 0;');
|
|
|
|
Editor.Lines.Add(' Y := 0;');
|
|
|
|
end;
|
|
|
|
|
|
|
|
try
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('background'));
|
2022-03-08 12:25:51 -05:00
|
|
|
if (v <> '') then begin
|
2022-06-23 06:22:32 -04:00
|
|
|
GetTokens(v, tokens);
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
Editor.Lines.Add(Format(' Background[0] := %g; // red component', [Int(StrToFloat(Tokens[0]) * 255)]));
|
|
|
|
Editor.Lines.Add(Format(' Background[1] := %g; // green component', [Int(StrToFloat(Tokens[1]) * 255)]));
|
|
|
|
Editor.Lines.Add(Format(' Background[2] := %g; // blue component', [Int(StrToFloat(Tokens[2]) * 255)]));
|
|
|
|
|
|
|
|
end;
|
|
|
|
except
|
|
|
|
Editor.Lines.Add(' Background[0] := 0; // red component');
|
|
|
|
Editor.Lines.Add(' Background[1] := 0; // green component');
|
|
|
|
Editor.Lines.Add(' Background[2] := 0; // blue component');
|
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
v := string(Attributes.Value('soloxform'));
|
|
|
|
if (v <> '') then Editor.Lines.Add('SoloXform := ' + v + ';');
|
2022-03-08 12:25:51 -05:00
|
|
|
|
|
|
|
Editor.Lines.Add('end;');
|
|
|
|
end;
|
|
|
|
finally
|
|
|
|
Tokens.free;
|
|
|
|
end;
|
|
|
|
end;
|
|
|
|
|
2022-06-23 06:22:32 -04:00
|
|
|
procedure TScriptEditor.LoadRunAndClear(scriptFile: string);
|
2022-03-08 12:25:51 -05:00
|
|
|
begin
|
|
|
|
LoadScriptFile(scriptFile);
|
|
|
|
RunScript;
|
|
|
|
btnNewClick(btnNew);
|
|
|
|
end;
|
|
|
|
|
|
|
|
end.
|
|
|
|
|
|
|
|
|