apophysis7x/Forms/ScriptForm.pas

4211 lines
128 KiB
ObjectPascal
Raw Normal View History

{
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
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,
ExtCtrls, StdCtrls, ControlPoint, Buttons, ComCtrls, ToolWin, Menus,
XFormMan, XForm, GradientHlpr, cmap,LibXmlParser, LibXmlComps, Math, Translation,
atScript, atPascal, AdvMemo, Advmps;
const
NCPS = 10;
scriptFavsFilename = 'scripts7X.fav';
type
TOptions = class
public
end;
TFlame = class
public
{ Byte sized properties, since
they're just place-holders }
Hue: double;
Time: byte;
Gamma: byte;
Brightness: byte;
Vibrancy: byte;
Zoom: byte;
SampleDensity: byte;
Oversample: byte;
FilterRadius: byte;
PixelsPerUnit: byte;
Width: byte;
Height: byte;
x: byte;
y: byte;
Gradient: byte;
Background: byte;
end;
TScriptRender = class
public
MaxMemory, Width, Height: integer;
Filename: string;
end;
TPivot = class
public
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: TAdvMemo;
Scripter: TatPascalScripter;
Splitter1: TSplitter;
Console: TMemo;
btnStop: TToolButton;
btnBreak: TToolButton;
OpenDialog: TOpenDialog;
SaveDialog: TSaveDialog;
Styler: TAdvPascalMemoStyler;
procedure F2SXMLStartTag(Sender: TObject; TagName: string;
Attributes: TAttrList);
procedure F2SXMLEndTag(Sender: TObject; TagName: string);
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);
public
cp: TControlPoint;
Stopped: boolean;
cmap: TColorMap;
Flame: TFlame;
Options: TOptions;
Pivot: TPivot;
Renderer: TScriptRender;
Another: TScriptRender;
AddedXForms : integer;
chaosLines : TStringList;
procedure LoadRunAndClear(scriptFile:string);
procedure LoadScriptFile(filename:string);
procedure ScriptFromFlame(flameXML:string);
procedure UpdateFlame;
procedure PrepareScripter;
procedure OpenScript;
procedure RunScript;
{ 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 GetFlameGammaTresholdProc(AMachine: TatVirtualMachine);
procedure SetFlameGammaTresholdProc(AMachine: TatVirtualMachine);
procedure GetFlameBrightnessProc(AMachine: TatVirtualMachine);
procedure SetFlameBrightnessProc(AMachine: TatVirtualMachine);
procedure GetFlameVibrancyProc(AMachine: TatVirtualMachine);
procedure SetFlameVibrancyProc(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);
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 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);
{ 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);
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);
{ 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 FillFileList;
{ Options interface }
procedure GetJPEGQuality(AMachine: TatVirtualMachine);
procedure SetJPEGQuality(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 GetBrightness(AMachine: TatVirtualMachine);
procedure SetBrightness(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);
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);
end;
TTransform = class
public
{ Transform class only serves as an
interface to active transform }
a: byte;
b: byte;
c: byte;
d: byte;
e: byte;
f: byte;
Color: byte;
Weight: byte;
Variation: byte;
VarColor: byte;
end;
TMatrix = array[0..2, 0..2] of double;
var
ScriptEditor: TScriptEditor;
LastParseError: string;
NumTransforms: integer; // Keeps track of number of xforms in flame.
ActiveTransform: integer; // Operations affect this transform.
LastError: string;
color: double;
cps: array[0..NCPS - 1] of TControlPoint;
Transform: TTransform;
Stopped, ResetLocation, UpdateIt: Boolean;
ParamFile: string;
FileList: TStringList;
function Mul33(M1, M2: TMatrix): TMatrix;
//procedure Normalize(var cp: TControlPoint);
implementation
{
[00 01 02]
[10 11 12]
[20 21 22]
[a b e ]
[c d f ]
[0 0 1 ]
}
uses Main, Editor, Adjust, Global, Mutate, Registry, Preview,
ScriptRender, ap_math, ap_classes, ap_sysutils, ap_Dialogs,
SavePreset, ap_windows, ap_FileCtrl(*, bmdll32*);
{$R *.DFM}
const
ErrorOutOfRange = 'Transform out of range!';
type
{ Library for math functions }
TMathLibrary = class(TatScripterLibrary)
protected
procedure CosProc(AMachine: TatVirtualMachine);
procedure SinProc(AMachine: TatVirtualMachine);
procedure Init; override;
end;
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);
procedure GetActiveTransformProc(AMachine: TatVirtualMachine);
procedure SetActiveTransformProc(AMachine: TatVirtualMachine);
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);
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 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 BM_OpenProc(AMachine: TatVirtualMachine);
// procedure BM_DllCFuncProc(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;
xml.OnEmptyTag := F2SXMLEmptyTag;
xml.OnEndTag := F2SXMLEndTag;
xml.OnStartTag := F2SXMLStartTag;
xml.LoadFromBuffer(PANSICHAR(AnsiString(flameXML)));
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);
begin
with AMachine do
defFlameFile := 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.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);
if (v >= 0.1) and (v <= 100) then defGamma := v;
end;
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.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.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;
{
vars := PackVariations;
if vars <> 0 then
VariationOptions := vars
else
VariationOptions := 1;
}
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 <= 3) then randGradient := v;
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.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('ActiveTransform', 0, tkInteger, nil, GetActiveTransformProc);
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);
Scripter.DefineMethod('Morph', 3, tkNone, nil, MorphProc);
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('SaveGradient', 2, tkNone, nil, SaveGradientProc);
Scripter.DefineMethod('Variation', 0, tkInteger, nil, GetVariation);
Scripter.DefineMethod('SetVariation', 1, tkInteger, nil, SetVariation);
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('StrToFloat', 1, tkFloat, nil, StrToFloatProc);
//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;
except on E: EMathError do
end;
end;
procedure TOperationLibrary.RandomGradientProc(AMachine: TatVirtualMachine);
begin
ScriptEditor.cp.cmap := GradientHelper.RandomGradient;
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.SetRenderBounds(AMachine: TatVirtualMachine);
begin
ScriptRenderForm.SetRenderBounds;
end;
procedure TOperationLibrary.GetFileName(AMachine: TatVirtualMachine);
begin
if ScriptEditor.OpenDialog.Execute then
with AMachine do
ReturnOutputArg(ScriptEditor.OpenDialog.Filename)
else
begin
LastError := 'Invalid file name.';
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 := 'Invalid file name.';
AMachine.Halt;
end;
end;
procedure TOperationLibrary.CopyFileProc(AMachine: TatVirtualMachine);
var
src, dest: string;
FileList: TStringList;
begin
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 := 'Cannot copy file';
AMachine.Halt;
end;
end
else
begin
LastError := 'Cannot copy file';
AMachine.Halt;
end;
finally
FileList.free;
end;
end;
(*procedure TOperationLibrary.BM_OpenProc(AMachine: TatVirtualMachine);
var
Name: string;
begin
Name := AMachine.GetInputArgAsString(0);
if @bmdll32.Open <> nil then begin
AMachine.ReturnOutputArg(bmdll32.Open(Pchar(Name)));
end else begin
LastError := 'bmdll32.dll not loaded';
AMachine.Halt;
end;
end; *)
(*procedure TOperationLibrary.BM_DllCFuncProc(AMachine: TatVirtualMachine);
var
var1, var2: Integer;
begin
var1 := AMachine.GetInputArgAsInteger(0);
var2 := AMachine.GetInputArgAsInteger(1);
if @bmdll32.DllCFunc <> nil then begin
AMachine.ReturnOutputArg(bmdll32.DllCFunc(var1, var2));
end else begin
LastError := 'bmdll32.dll not loaded';
AMachine.Halt;
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 := 'Parameter file does not exist.';
AMachine.Halt;
end;
end;
procedure TOperationLibrary.RotateProc(AMachine: TatVirtualMachine);
begin
try
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then raise EFormatInvalid.Create(ErrorOutOfRange);
with AMachine do
ScriptEditor.cp.xform[ActiveTransform].Rotate(GetInputArgAsFloat(0));
except on E: EFormatInvalid do
begin
ScriptEditor.Console.Lines.Add('Rotate: ' + E.message);
Application.ProcessMessages;
LastError := E.Message;
end;
end;
end;
procedure TOperationLibrary.MulProc(AMachine: TatVirtualMachine);
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));
except on E: EFormatInvalid do
begin
ScriptEditor.Console.Lines.Add('Multiply: ' + E.message);
Application.ProcessMessages;
LastError := E.Message;
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
filename: string;
begin
with AMachine do
begin
filename := GetInputArgAsString(0);
(*if (LowerCase(ExtractFileExt(filename)) = '.apo') or
(LowerCase(ExtractFileExt(filename)) = '.fla') then
MainForm.SaveFlame(ScriptEditor.cp, ScriptEditor.cp.name, filename)
else *)
MainForm.SaveXMLFlame(ScriptEditor.cp, ScriptEditor.cp.name, filename)
end;
end;
procedure TOperationLibrary.SaveGradientProc(AMachine: TatVirtualMachine);
var
gradstr: TStringList;
begin
gradstr := TStringList.Create;
try
gradstr.add(CleanIdentifier(AMachine.GetInputArgAsString(1)) + ' {');
gradstr.add(MainForm.GradientFromPalette(ScriptEditor.cp.cmap, AMachine.GetInputArgAsString(1)));
gradstr.add('}');
MainForm.SaveGradient(gradstr.text, AMachine.GetInputArgAsString(1), AMachine.GetInputArgAsString(0))
finally
gradstr.free
end;
end;
procedure TOperationLibrary.ListFileProc(AMachine: TatVirtualMachine);
var
flafile: string;
begin
flafile := AMachine.GetInputArgAsString(0);
if FileExists(flafile) then
begin
OpenFile := flafile;
MainForm.Caption := AppVersionString + ' - ' + OpenFile;
(*if (LowerCase(ExtractFileExt(flafile)) = '.apo') or
(LowerCase(ExtractFileExt(flafile)) = '.fla') then
begin
ListIFS(OpenFile, 1);
OpenFileType := ftFla
end
else
begin*)
ListXML(OpenFile, 1);
OpenFileType := ftXML;
//end;
MainForm.SetFocus;
end
else
begin
LastError := 'Cannot open file: ' + Flafile;
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
cps[v].copy(ScriptEditor.cp);
cps[v].cmap := ScriptEditor.cp.cmap;
end;
end;
procedure TOperationLibrary.GetFlameProc(AMachine: TatVirtualMachine);
var
i, v: integer;
begin
v := AMachine.GetInputArgAsInteger(0);
if (v >= 0) and (v < NCPS) then
begin
ScriptEditor.cp.copy(cps[v]);
ScriptEditor.cp.cmap := cps[v].cmap;
end;
for i := 0 to NXFORMS - 1 do
if ScriptEditor.cp.xform[i].density = 0 then break;
NumTransforms := i;
end;
(*
procedure ParseXML(var cp1: TControlPoint; const params: PCHAR);
var
i: integer;
h, s, v: real;
begin
nxform := 0;
FinalXformLoaded := false;
MainForm.XMLScanner.LoadFromBuffer(params);
MainForm.XMLScanner.Execute;
cp1.copy(ParseCp);
if Parsecp.cmapindex <> -1 then
begin
if cp1.cmapindex < NRCMAPS then
GetCMap(cp1.cmapindex, 1, cp1.cmap)
else
ShowMessage('Palette index too high');
end;
if (cp1.hue_rotation > 0) and (cp1.hue_rotation < 1) then
begin
for i := 0 to 255 do
begin
RGBToHSV(cp1.cmap[i][0], cp1.cmap[i][1], cp1.cmap[i][2], h, s, v);
h := Round(360 + h + (cp1.hue_rotation * 360)) mod 360;
HSVToRGB(h, s, v, cp1.cmap[i][0], cp1.cmap[i][1], cp1.cmap[i][2]);
end;
end;
if nxform < NXFORMS then
for i := nxform to NXFORMS - 1 do
cp1.xform[i].density := 0;
// Check for symmetry parameter
if cp1.symmetry <> 0 then
begin
add_symmetry_to_control_point(cp1, cp1.symmetry);
cp1.symmetry := 0;
end;
end;
*)
procedure LoadXMLFlame(index: integer);
var
FStrings: TStringList;
IFSStrings: TStringList;
EntryStrings, Tokens: TStringList;
i: integer;
begin
FStrings := TStringList.Create;
IFSStrings := TStringList.Create;
Tokens := TStringList.Create;
EntryStrings := TStringList.Create;
try
FStrings.LoadFromFile(ParamFile);
for i := 0 to FStrings.count - 1 do
begin
if Pos('<flame ', Trim(FStrings[i])) = 1 then
begin
MainForm.ListXMLScanner.LoadFromBuffer(PANSICHAR(AnsiString(FStrings[i])));
MainForm.ListXMLScanner.Execute;
if FileList[index] = (pname) then
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;
// FlameName := FileList[index];
finally
IFSStrings.Free;
FStrings.Free;
Tokens.free;
EntryStrings.free;
end;
end;
procedure LoadFlame(index: integer);
var
FStrings: TStringList;
IFSStrings: TStringList;
EntryStrings, Tokens: TStringList;
SavedPal: Boolean;
i, j: integer;
FlameString, s: string;
Palette: TcolorMap;
// x, y: double;
begin
SavedPal := false;
FStrings := TStringList.Create;
IFSStrings := TStringList.Create;
Tokens := TStringList.Create;
EntryStrings := TStringList.Create;
try
FStrings.LoadFromFile(ParamFile);
for i := 0 to FStrings.count - 1 do
if Pos(FileList[index] + ' ', Trim(FStrings[i])) = 1 then
break;
IFSStrings.Add(FStrings[i]);
repeat
inc(i);
IFSStrings.Add(FStrings[i]);
until Pos('}', FStrings[i]) <> 0;
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;
for i := 0 to FStrings.count - 1 do
begin
if Pos(Lowercase(FileList[index]) + ' ', Trim(Lowercase(FStrings[i]))) = 1 then
break;
end;
inc(i);
while (Pos('}', FStrings[i]) = 0) and (Pos('palette:', FStrings[i]) = 0) do
begin
EntryStrings.Add(FStrings[i]);
inc(i);
end;
if Pos('palette:', FStrings[i]) = 1 then
begin
SavedPal := True;
inc(i);
for j := 0 to 255 do begin
s := FStrings[i];
GetTokens(s, Tokens);
Palette[j][0] := StrToInt(Tokens[0]);
Palette[j][1] := StrToInt(Tokens[1]);
Palette[j][2] := StrToInt(Tokens[2]);
inc(i);
end;
end;
FlameString := EntryStrings.Text;
ScriptEditor.cp.ParseString(FlameString);
for i := 0 to NXFORMS - 1 do
if ScriptEditor.cp.xform[i].density = 0 then break;
NumTransforms := i;
if SavedPal then ScriptEditor.cp.cmap := Palette;
ScriptEditor.cp.name := FileList[index];
finally
IFSStrings.Free;
FStrings.Free;
Tokens.free;
EntryStrings.free;
end;
end;
procedure TOperationLibrary.LoadFlameProc(AMachine: TatVirtualMachine);
var
i: integer;
begin
i := AMachine.GetInputArgAsInteger(0);
if (i >= 0) and (i < FileList.count) then
begin
(*if (LowerCase(ExtractFileExt(ParamFile)) = '.fla') or
(LowerCase(ExtractFileExt(ParamFile)) = '.apo') then
LoadFlame(i)
else*)
LoadXMLFlame(i); ;
end;
end;
procedure TOperationLibrary.RotateFlameProc(AMachine: TatVirtualMachine);
var
Triangles: TTriangles;
i: integer;
r: double;
begin
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);
end;
procedure TOperationLibrary.AddSymmetryProc(AMachine: TatVirtualMachine);
var
i: integer;
begin
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;
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
if (ActiveTransform < 0) or (ActiveTransform >= ScriptEditor.cp.NumXForms) then raise EFormatInvalid.Create(ErrorOutOfRange);
with AMachine do
ScriptEditor.cp.xform[ActiveTransform].Scale(GetInputArgAsFloat(0));
except on E: EFormatInvalid do
begin
ScriptEditor.Console.Lines.Add('Scale: ' + E.message);
Application.ProcessMessages;
LastError := E.Message;
end;
end;
end;
procedure TOperationLibrary.GetActiveTransformProc(AMachine: TatVirtualMachine);
begin
with AMachine do
ReturnOutputArg(ActiveTransform);
end;
procedure TOperationLibrary.TransformsProc(AMachine: TatVirtualMachine);
begin
with AMachine do
ReturnOutputArg(NumTransforms);
end;
procedure TOperationLibrary.GetVariation(AMachine: TatVirtualMachine);
var
i: integer;
begin
with AMachine do
begin
i := integer(Variation);
if (i >= NRVAR) or (i < 0) then
i := -1;
ReturnOutputArg(i);
end
end;
procedure TOperationLibrary.SetVariation(AMachine: TatVirtualMachine);
var
i: integer;
begin
with AMachine do
begin
i := GetInputArgAsInteger(0);
if (i < 0) or (i >= NRVAR) then
i := NRVAR ;
Variation := TVariation(i);
if i = NRVAR then
MainForm.mnuVRandom.checked := True
else
MainForm.VarMenus[i].Checked := True;
end
end;
procedure TOperationLibrary.VariationIndexProc(AMachine: TatVirtualMachine);
var
i: integer;
str: string;
begin
with AMachine do begin
str := LowerCase(GetInputArgAsString(0));
i := NRVAR-1;
while (i >= 0) and (LowerCase(varnames(i)) <> str) do Dec(i);
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
str := LowerCase(GetInputArgAsString(0));
i := GetNrVariableNames-1;
while (i >= 0) and (LowerCase(GetVariableNameAt(i)) <> str) do Dec(i);
ReturnOutputArg(i);
end;
end;
procedure TOperationLibrary.VariableNameProc(AMachine: TatVirtualMachine);
var
i: integer;
str: string;
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
ReturnOutputArg(FileList.Count);
end;
procedure TOperationLibrary.ClearProc(AMachine: TatVirtualMachine);
var
i: integer;
begin
NumTransforms := 0;
ActiveTransform := -1;
{
for i := 0 to NXFORMS - 1 do
ScriptEditor.cp.xform[i].density := 0;
}
ScriptEditor.cp.Clear;
ScriptEditor.cp.xform[0].symmetry := 1;
end;
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
ScriptEditor.cp.InterpolateX(cps[a], cps[b], v);
for i := 0 to NXFORMS - 1 do
if ScriptEditor.cp.xform[i].density = 0 then break;
NumTransforms := i;
end;
end;
end;
procedure TOperationLibrary.PreviewProc(AMachine: TatVirtualMachine);
begin
if NumTransforms > 0 then
begin
AMachine.Paused := True;
PreviewForm.cp.Copy(ScriptEditor.cp);
PreviewForm.cp.AdjustScale(PreviewForm.Image.Width, PreviewForm.Image.Height);
PreviewForm.Show;
PreviewForm.DrawFlame;
AMachine.Paused := False;
Application.ProcessMessages;
end
else AMachine.Halt;
end;
procedure TOperationLibrary.RenderProc(AMachine: TatVirtualMachine);
begin
if NumTransforms > 0 then
begin
ScriptRenderForm.cp.Copy(ScriptEditor.cp);
//ScriptRenderForm.Caption := 'Rendering ' + ScriptEditor.Renderer.Filename; ;
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(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].c[0, 0] := 1;
ScriptEditor.cp.xform[ActiveTransform].c[0, 1] := 0;
ScriptEditor.cp.xform[ActiveTransform].c[1, 0] := 0;
ScriptEditor.cp.xform[ActiveTransform].c[1, 1] := 1;
ScriptEditor.cp.xform[ActiveTransform].c[2, 0] := 0;
ScriptEditor.cp.xform[ActiveTransform].c[2, 1] := 0;
ScriptEditor.cp.xform[ActiveTransform].color := 0;
ScriptEditor.cp.xform[ActiveTransform].density := 1 / NumTransforms;
ScriptEditor.cp.xform[ActiveTransform].vars[0] := 1;
for i := 1 to NRVAR - 1 do
ScriptEditor.cp.xform[ActiveTransform].vars[i] := 0;}
scriptEditor.cp.xform[ActiveTransform].Clear;
ScriptEditor.cp.xform[ActiveTransform].density := 0.5;
end
else raise EFormatInvalid.Create('Too many transforms.');
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
begin
Application.ProcessMessages;
LastError := 'Oops!';
Scripter.Halt;
end;
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('Too many transforms.');
except on E: EFormatInvalid do
begin
Application.ProcessMessages;
LastError := E.Message;
Scripter.Halt;
end;
end;
end;
procedure TOperationLibrary.TranslateProc(AMachine: TatVirtualMachine);
begin
try
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then // was: NXFORMS-1
raise EFormatInvalid.Create(ErrorOutOfRange);
with AMachine do
ScriptEditor.cp.xform[ActiveTransform].Translate(GetInputArgAsFloat(0), GetInputArgAsFloat(1));
except on E: EFormatInvalid do
begin
Application.ProcessMessages;
LastError := E.Message;
Scripter.Halt;
end;
end;
end;
procedure TOperationLibrary.NormalizeVars(AMachine: TatVirtualMachine);
begin
NormalizeVariations(ScriptEditor.cp);
end;
{ ******************************** Math Library ****************************** }
procedure TMathLibrary.Init;
begin
Scripter.DefineMethod('Cos', 1, tkfloat, nil, CosProc);
Scripter.DefineMethod('Sin', 1, tkfloat, nil, SinProc);
end;
procedure TMathLibrary.CosProc(AMachine: TatVirtualMachine);
begin
with AMachine do
ReturnOutputArg(cos(GetInputArgAsFloat(0)));
end;
procedure TMathLibrary.SinProc(AMachine: TatVirtualMachine);
begin
with AMachine do
ReturnOutputArg(sin(GetInputArgAsFloat(0)));
end;
{ **************************** Matrix functions ******************************* }
function Mul33(M1, M2: TMatrix): TMatrix;
begin
result[0, 0] := M1[0][0] * M2[0][0] + M1[0][1] * M2[1][0] + M1[0][2] * M2[2][0];
result[0, 1] := M1[0][0] * M2[0][1] + M1[0][1] * M2[1][1] + M1[0][2] * M2[2][1];
result[0, 2] := M1[0][0] * M2[0][2] + M1[0][1] * M2[1][2] + M1[0][2] * M2[2][2];
result[1, 0] := M1[1][0] * M2[0][0] + M1[1][1] * M2[1][0] + M1[1][2] * M2[2][0];
result[1, 1] := M1[1][0] * M2[0][1] + M1[1][1] * M2[1][1] + M1[1][2] * M2[2][1];
result[1, 2] := M1[1][0] * M2[0][2] + M1[1][1] * M2[1][2] + M1[1][2] * M2[2][2];
result[2, 0] := M1[2][0] * M2[0][0] + M1[2][1] * M2[1][0] + M1[2][2] * M2[2][0];
result[2, 0] := M1[2][0] * M2[0][1] + M1[2][1] * M2[1][1] + M1[2][2] * M2[2][1];
result[2, 0] := M1[2][0] * M2[0][2] + M1[2][1] * M2[1][2] + M1[2][2] * M2[2][2];
end;
function Identity: TMatrix;
var i, j: integer;
begin
for i := 0 to 2 do
for j := 0 to 2 do
Result[i, j] := 0;
Result[0][0] := 1;
Result[1][1] := 1;
Result[2][2] := 1;
end;
procedure init(var xform: Txform);
var
i: integer;
begin
xform.c[0, 0] := 1;
xform.c[0, 1] := 0;
xform.c[1, 0] := 0;
xform.c[1, 1] := 1;
xform.c[2, 0] := 0;
xform.c[2, 1] := 0;
xform.color := 0;
xform.density := 1 / NumTransforms;
xform.SetVariation(0, 1);
for i := 1 to NRVAR - 1 do
xform.SetVariation(i, 0);
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');
Transform := TTransform.create;
FileList := TStringList.Create;
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;
end;
procedure TScriptEditor.FormDestroy(Sender: TObject);
var
i: integer;
begin
FileList.Free;
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');
end;
Registry.CloseKey;
finally
Registry.Free;
end;
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);
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.GetFlameGammaTresholdProc(AMachine: TatVirtualMachine);
begin
with AMachine do
ReturnOutPutArg(cp.gammaThreshRelative);
end;
procedure TScriptEditor.SetFlameGammaTresholdProc(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);
if (v > 0) then cp.Gamma := v;
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 then cp.Brightness := v;
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 then cp.Vibrancy := v;
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.GetFlameZoomProc(AMachine: TatVirtualMachine);
begin
with AMachine do
ReturnOutPutArg(cp.Zoom);
end;
procedure TScriptEditor.SetFlameZoomProc(AMachine: TatVirtualMachine);
begin
with AMachine do
cp.Zoom := GetInputArgAsFloat(0);
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
ReturnOutPutArg(cp.cmap[Integer(GetArrayIndex(0)), Integer(GetArrayIndex(1))]);
end;
procedure TScriptEditor.SetFlamePaletteProc(AMachine: TatVirtualMachine);
var
i0, i1, v: integer;
begin
with AMachine do
begin
i0 := GetArrayIndex(0);
i1 := 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;
end;
end;
procedure TScriptEditor.GetFlameBackgroundProc(AMachine: TatVirtualMachine);
begin
with AMachine do
ReturnOutPutArg(cp.background[Integer(GetArrayIndex(0))]);
end;
procedure TScriptEditor.SetFlameBackgroundProc(AMachine: TatVirtualMachine);
var
i, v: integer;
begin
with AMachine do
begin
i := GetArrayIndex(0);
v := GetInputArgAsInteger(0);
if (i >= 0) and (i <= 2) and (v >= 0) and (v < 256) then
cp.Background[i] := v;
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;
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
v: double;
begin
v := AMachine.GetInputArgAsFloat(0);
if (v >= 0) and (v <= 1) then
cp.hue_rotation := v;
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);
begin
with AMachine do
ReturnOutPutArg(cp.FAngle);
end;
procedure TScriptEditor.SetFlameAngleProc(AMachine: TatVirtualMachine);
begin
with AMachine do
cp.FAngle := GetInputArgAsFloat(0);
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.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.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);
begin
with AMachine do
ReturnOutPutArg(cp.xform[ActiveTransform].c[1, 0]);
end;
procedure TScriptEditor.SetTransformBProc(AMachine: TatVirtualMachine);
begin
with AMachine do
cp.xform[ActiveTransform].c[1, 0] := GetInputArgAsFloat(0);
end;
procedure TScriptEditor.GetTransformCProc(AMachine: TatVirtualMachine);
begin
with AMachine do
ReturnOutPutArg(cp.xform[ActiveTransform].c[0, 1]);
end;
procedure TScriptEditor.SetTransformCProc(AMachine: TatVirtualMachine);
begin
with AMachine do
cp.xform[ActiveTransform].c[0, 1] := GetInputArgAsFloat(0);
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);
begin
with AMachine do
ReturnOutPutArg(cp.xform[ActiveTransform].c[2, 1]);
end;
procedure TScriptEditor.SetTransformFProc(AMachine: TatVirtualMachine);
begin
with AMachine do
cp.xform[ActiveTransform].c[2, 1] := GetInputArgAsFloat(0);
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;
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;
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 > 0) and (v <= MAX_WEIGHT) then
cp.xform[ActiveTransform].density := v;
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;
begin
with AMachine do
begin
v := GetInputArgAsFloat(0);
if (v >= -1) and (v <= 1) then
cp.xform[ActiveTransform].symmetry := v;
end;
end;
procedure TScriptEditor.GetTransformVarProc(AMachine: TatVirtualMachine);
begin
with AMachine do
ReturnOutPutArg(cp.xform[ActiveTransform].GetVariation(Integer(GetArrayIndex(0))));
end;
procedure TScriptEditor.SetTransformVarProc(AMachine: TatVirtualMachine);
var
v: double;
i: integer;
begin
with AMachine do
begin
v := GetInputArgAsFloat(0);
i := 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
cp.xform[ActiveTransform].GetVariable(GetVariableNameAt(Integer(GetArrayIndex(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 := 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 := GetArrayIndex(0);
if (i >= 0) and (i < NumTransforms) then
cp.xform[ActiveTransform].modWeights[i] := v;
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);
cp.xform[ActiveTransform].transOpacity := v;
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 := 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 := 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 := 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 := ErrorOutOfRange;
Scripter.Halt;
exit;
end;
with AMachine do
begin
v := GetInputArgAsFloat(0);
cp.xform[ActiveTransform].SetVariable(CurrentPropertyName, v);
end
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 := ErrorOutOfRange;
Scripter.Halt;
exit;
end;
with AMachine do begin
i := GetArrayIndex(0);
j := GetArrayIndex(1);
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 := ErrorOutOfRange;
Scripter.Halt;
exit;
end;
with AMachine do
begin
v := GetInputArgAsFloat(0);
i := GetArrayIndex(0);
j := GetArrayIndex(1);
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 := ErrorOutOfRange;
Scripter.Halt;
exit;
end;
with AMachine do begin
i := GetArrayIndex(0);
j := GetArrayIndex(1);
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 := ErrorOutOfRange;
Scripter.Halt;
exit;
end;
with AMachine do
begin
v := GetInputArgAsFloat(0);
i := GetArrayIndex(0);
j := GetArrayIndex(1);
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.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: double;
begin
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
LastError := ErrorOutOfRange;
Scripter.Halt;
exit;
end;
rad := AMachine.GetInputArgAsFloat(0) * pi / 180;
with EditForm.WorldPivot do
with cp.xform[ActiveTransform] do begin
tx := x + (c[2,0] - x) * cos(rad) - (-c[2,1] - y) * sin(rad);
ty := y + (c[2,0] - x) * sin(rad) + (-c[2,1] - y) * cos(rad);
c[2,0] := tx;
c[2,1] := -ty;
end;
end;
// -- pivot-aware rotating & scaling --
procedure TScriptEditor.TransformRotateProc(AMachine: TatVirtualMachine);
var
Triangles: TTriangles;
px, py: double;
tx: TXForm;
begin
if (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
LastError := 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 (ActiveTransform < 0) or (ActiveTransform > NXFORMS) then begin
ScriptEditor.Console.Lines.Add(ErrorOutOfRange);
LastError := 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;
{ *************************** Render interface ****************************** }
procedure TScriptEditor.GetRenderFilenameProc(AMachine: TatVirtualMachine);
begin
with AMachine do
ReturnOutPutArg(TScriptRender(CurrentObject).Filename);
end;
procedure TScriptEditor.SetRenderFilenameProc(AMachine: TatVirtualMachine);
begin
with AMachine do
TScriptRender(CurrentObject).Filename := GetInputArgAsString(0);
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).Height);
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
EditForm.btnResetPivotClick(nil);
end;
{ ********************************* Scripter ********************************* }
procedure TScriptEditor.PrepareScripter;
var
i: integer;
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);
end;
Scripter.AddObject('Renderer', Renderer);
{ Flame interface }
with Scripter.defineClass(TFlame) do
begin
DefineProp('Gamma', tkFloat, GetFlameGammaProc, SetFlameGammaProc);
DefineProp('GammaTreshold', tkFloat, GetFlameGammaTresholdProc, SetFlameGammaTresholdProc);
DefineProp('Brightness', tkFloat, GetFlameBrightnessProc, SetFlameBrightnessProc);
DefineProp('Vibrancy', tkFloat, GetFlameVibrancyProc, SetFlameVibrancyProc);
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);
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('Perspective', tkFloat, GetFlamePerspectiveProc, SetFlamePerspectiveProc);
DefineProp('Z', tkFloat, GetFlameCamZposProc, SetFlameCamZposProc);
DefineProp('DOF', tkFloat, GetFlameDOFProc, SetFlameDOFProc);
DefineProp('SoloXform', tkInteger, GetFlameSoloXformProc, SetFlameSoloXformProc);
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(Varnames(i));
end;
for i:= 0 to GetNrVariableNames - 1 do begin
DefineProp(GetVariableNameAt(i), tkFloat, GetTransformVariableProc, SetTransformVariableProc);
Editor.SyntaxStyles.AutoCompletion.Add(GetVariableNameAt(i));
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);
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);
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('FixedReference', tkVariant, GetFixedReference, SetFixedReference);
DefineProp('SampleDensity', tkFloat, GetSampleDensity, SetSampleDensity);
DefineProp('Gamma', tkFloat, GetGamma, SetGamma);
DefineProp('Brightness', tkFloat, GetBrightness, SetBrightness);
DefineProp('Vibrancy', tkFloat, GetVibrancy, SetVibrancy);
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('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('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);
Scripter.AddLibrary(TatClassesLibrary);
{ 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);
{ Variations }
Scripter.AddConstant('V_LINEAR', 0);
Scripter.AddConstant('V_SINUSOIDAL', 1);
Scripter.AddConstant('V_SPHERICAL', 2);
Scripter.AddConstant('V_SWIRL', 3);
Scripter.AddConstant('V_HORSESHOE', 4);
Scripter.AddConstant('V_POLAR', 5);
Scripter.AddConstant('V_HANDKERCHIEF', 6);
Scripter.AddConstant('V_HEART', 7);
Scripter.AddConstant('V_DISC', 8);
Scripter.AddConstant('V_SPIRAL', 9);
Scripter.AddConstant('V_HYPERBOLIC', 10);
Scripter.AddConstant('V_DIAMOND', 11);
Scripter.AddConstant('V_EX', 12);
Scripter.AddConstant('V_JULIA', 13);
Scripter.AddConstant('V_BENT', 14);
Scripter.AddConstant('V_WAVES', 15);
Scripter.AddConstant('V_FISHEYE', 16);
Scripter.AddConstant('V_POPCORN', 17);
Scripter.AddConstant('V_EXPONENTIAL', 18);
Scripter.AddConstant('V_POWER', 19);
Scripter.AddConstant('V_COSINE', 20);
Scripter.AddConstant('V_RINGS', 21);
Scripter.AddConstant('V_FAN', 22);
Scripter.AddConstant('V_EYEFISH', 23);
Scripter.AddConstant('V_BUBBLE', 24);
Scripter.AddConstant('V_CYLINDER', 25);
Scripter.AddConstant('V_NOISE', 26);
Scripter.AddConstant('V_BLUR', 27);
Scripter.AddConstant('V_GAUSSIANBLUR', 28);
Scripter.AddConstant('V_RADIALBLUR', 29);
Scripter.AddConstant('V_RINGS2', 30);
Scripter.AddConstant('V_FAN2', 31);
Scripter.AddConstant('V_BLOB', 32);
Scripter.AddConstant('V_PDJ', 33);
Scripter.AddConstant('V_PERSPECTIVE', 34);
Scripter.AddConstant('V_JULIAN', 35);
Scripter.AddConstant('V_JULIASCOPE', 36);
Scripter.AddConstant('V_CURL', 37);
Scripter.AddConstant('V_RANDOM', -1);
(*
{ Variation parameters }
Scripter.AddConstant('RADIALBLUR_ANGLE', 0);
Scripter.AddConstant('RINGS2_VAL', 1);
Scripter.AddConstant('FAN2_X', 2);
Scripter.AddConstant('FAN2_Y', 3);
Scripter.AddConstant('BLOB_LOW', 4);
Scripter.AddConstant('BLOB_HI', 5);
Scripter.AddConstant('BLOB_WAVES', 6);
Scripter.AddConstant('PDJ_A', 7);
Scripter.AddConstant('PDJ_B', 8);
Scripter.AddConstant('PDJ_C', 9);
Scripter.AddConstant('PDJ_D', 10);
Scripter.AddConstant('PERSPECTIVE_ANGLE', 11);
Scripter.AddConstant('PERSPECTIVE_DIST', 12);
Scripter.AddConstant('JULIAN_POWER', 13);
Scripter.AddConstant('JULIAN_DIST', 14);
Scripter.AddConstant('JULIASCOPE_POWER', 15);
Scripter.AddConstant('JULIASCOPE_DIST', 16);
Scripter.AddConstant('CURL_C1', 17);
Scripter.AddConstant('CURL_C2', 18);
*)
{ Variables }
Scripter.AddVariable('SelectedTransform', EditForm.SelectedTriangle);
Scripter.AddVariable('Compatibility', Compatibility); // obsolete
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('CurrentFile', OpenFile);
Scripter.AddVariable('LimitVibrancy', LimitVibrancy);
Scripter.AddLibrary(TMathLibrary);
Scripter.AddLibrary(TatMathLibrary);
// Scripter.AddLibrary(TatWindowsLibrary);
Scripter.AddLibrary(TatSysUtilsLibrary);
Scripter.AddLibrary(TatFileCtrlLibrary);
{ Nonsense - it's the only way to get the last real
library to work! }
Scripter.AddObject('Not_Any_Thing_Useful', Another);
Scripter.AddObject('IglooFunkyRubber', Another);
Scripter.AddObject('Darn it', Another);
Scripter.AddObject('Scrumptious', Another);
end;
{ ************************* Buttons ***************************************** }
procedure TScriptEditor.btnNewClick(Sender: TObject);
begin
Editor.Lines.Clear;
Caption := TextByKey('script-title'); //'New Script';
Script := '';
end;
procedure TScriptEditor.LoadScriptFile(filename:string);
var
s: string;
fn:string;
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;
fn:string;
begin
MainOpenDialog.InitialDir := ScriptPath;
MainOpenDialog.Filename := '';
MainOpenDialog.Filter := Format('%s|*.aposcript;*.asc|%s|*.*', [TextByKey('common-filter-script'), TextByKey('common-filter-allfiles')]);
if OpenSaveFileDialog(ScriptEditor, '.aposcript', MainOpenDialog.Filter, MainOpenDialog.InitialDir, TextByKey('common-browse'), fn, true, false, false, true) then
// if MainOpenDialog.execute then
begin
MainOpenDialog.FileName := fn;
Script := MainOpenDialog.Filename;
Editor.Lines.LoadFromFile(MainOpenDialog.Filename);
s := ExtractFileName(MainOpenDialog.Filename);
s := Copy(s, 0, length(s) - Length(ExtractFileExt(s)));
MainForm.mnuRun.Caption := Format(TextByKey('main-menu-script-run2'), [s]);
Caption := s;
ScriptPath := ExtractFileDir(MainOpenDialog.Filename);
end;
end;
procedure TScriptEditor.btnOpenClick(Sender: TObject);
begin
OpenScript;
end;
procedure TScriptEditor.btnSaveClick(Sender: TObject);
var fn : string;
begin
if Script = '' then fn := '' else fn := ChangeFileExt(ExtractFileName(Script), '.aposcript');
if OpenSaveFileDialog(ScriptEditor, '.aposcript',
Format('%s|*.aposcript;*.asc|%s|*.*',
[TextByKey('common-filter-script'),
TextByKey('common-filter-allfiles')]),
ScriptPath, TextByKey('common-browse'), fn,
false, true, false, false) then
//if MainSaveDialog.Execute then
begin
MainOpenDialog.FileName := fn;
Script := fn;
Editor.Lines.SaveToFile(fn);
Caption := ExtractFileName(fn);
ScriptPath := ExtractFileDir(fn);
end;
end;
procedure TScriptEditor.FillFileList;
var
i, p: integer;
ext, Title: string;
FStrings: TStringList;
begin
FStrings := TStringList.Create;
FStrings.LoadFromFile(ParamFile);
try
FileList.Clear;
ext := LowerCase(ExtractFileExt(ParamFile));
(*if (ext = '.fla') or (ext = '.apo') then
begin
// Get names from .fla or .apo file
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 }
FileList.Add(Trim(Copy(FStrings[i], 1, p - 1)));
end;
end;
end;
end
else
begin *)
// 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 := '';
MainForm.ListXMLScanner.LoadFromBuffer(PANSICHAR(AnsiString(FSTrings[i])));
MainForm.ListXMLScanner.Execute;
if Trim(pname) = '' then
Title := '*untitled ' + ptime
else
FileList.Add(pname);
end;
end;
end;
//end;
finally
FStrings.Free;
end;
end;
procedure TScriptEditor.RunScript;
var
lib: TStringList;
begin
btnRun.Enabled := False;
btnBreak.Enabled := True;
MainForm.btnRunScript.Enabled := False;
MainForm.mnuRun.Enabled := False;
MainForm.DisableFavorites;
ParamFile := OpenFile;
FillFileList;
{ Set defaults }
{ Set render defaults }
Renderer.Width := 320;
Renderer.Height := 240;
Stopped := False;
UpdateIt := True;
ResetLocation := False;
Console.Clear;
LastError := '';
ActiveTransform := EditForm.SelectedTriangle;
NumTransforms := Transforms;
cp.copy(MainCp);
cmap := MainCp.cmap;
Application.ProcessMessages;
Randomize;
// what in the sweet loving sake of jesus is this fuck?
if Pos('stopped', Lowercase(Editor.Lines.text)) <> 0 then
begin
btnStop.Enabled := True;
MainForm.mnuStop.Enabled := True;
MainForm.btnStopScript.Enabled := True;
end;
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;
if (NumTransforms < 1) and UpdateIt then
begin
Console.Lines.Add('Not enough transforms.');
ScriptRenderForm.Close;
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;
Exit;
end
else
if (LastError = '') and UpdateIt then
begin
MainForm.UpdateUndo;
MainCp.Copy(cp);
UpdateFlame;
if ResetLocation then MainForm.ResetLocation;
end
else
begin
Console.Lines.Add(LastError);
end;
ScriptRenderForm.Close;
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;
MainForm.EnableFavorites;
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;
{ ******************************* functions ********************************** }
{ ******************************* Parseing *********************************** }
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
Editor.CutToClipboard;
end;
procedure TScriptEditor.mnuCopyClick(Sender: TObject);
begin
Editor.CopyToClipboard;
end;
procedure TScriptEditor.mnuPasteClick(Sender: TObject);
begin
Editor.PasteFromClipboard;
end;
procedure TScriptEditor.mnuUndoClick(Sender: TObject);
begin
if Editor.CanUndo then Editor.Undo;
end;
procedure TScriptEditor.EditorChange(Sender: TObject);
begin
Editor.activeLine := -1;
if not Editor.CanUndo then mnuUndo.Enabled := false
else mnuUndo.Enabled := true;
end;
procedure TScriptEditor.ScripterCompileError(Sender: TObject;
var msg: string; row, col: Integer; var ShowException: Boolean);
begin
Editor.ActiveLine := row - 1;
Console.Lines.Add('Line '+IntToStr(row)+' : '+msg);
ScriptRenderForm.Close;
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;
ShowException := true;
Application.ProcessMessages;
end;
procedure TScriptEditor.btnStopClick(Sender: TObject);
begin
Stopped := True;
end;
procedure TScriptEditor.btnBreakClick(Sender: TObject);
begin
LastError := 'Execution stopped by user.';
Scripter.Halt;
end;
procedure TScriptEditor.btnFavoriteClick(Sender: TObject);
var
i: integer;
there: boolean;
begin
there := False;
for i := 0 to Favorites.Count - 1 do
if Lowercase(Script) = Favorites[i] then
There := true;
if there then exit;
Favorites.Add(Script);
Favorites.SaveToFile(GetEnvVarValue('APPDATA') + '\' + scriptFavsFilename);
end;
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
//
end;
procedure TScriptEditor.F2SXMLEmptyTag(Sender: TObject; TagName: string;
Attributes: TAttrList);
var
i: integer;
v,w: TStringType;
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
w := TStringType('{ Transform ' + IntToStr(AddedXForms + 1));
v := Attributes.Value('name');
if (v <> '') then w := w + ' (' + v + ')';
w := w + ' }';
Editor.Lines.Add(String(w));
Editor.Lines.Add('AddTransform;');
end;
Editor.Lines.Add('with Transform do begin');
//Editor.Lines.Add(' for i := 0 to NXFORMS do Chaos[i] := 1;');
Editor.Lines.Add(' for i := 0 to NVARS do Variation[i] := 0;');
v := Attributes.Value('weight');
if (v <> '') and (TagName = 'xform') then
Editor.Lines.Add(' Weight := ' + String(v) + ';');
v := Attributes.Value('color');
if (v <> '') then Editor.Lines.Add(' Color := ' + String(v) + ';');
v := Attributes.Value('var_color');
if (v <> '') then Editor.Lines.Add(' VarColor := ' + String(v) + ';');
v := Attributes.Value('symmetry');
if (v <> '') and (TagName = 'xform') then Editor.Lines.Add(' Symmetry := ' + String(v) + ';');
v := Attributes.Value('coefs');
if (v <> '') then begin
GetTokens(String(v), tokens);
Editor.Lines.Add(' a := ' + Tokens[0] + ';');
Editor.Lines.Add(' b := ' + Tokens[2] + ';');
Editor.Lines.Add(' c := ' + Tokens[1] + ';');
Editor.Lines.Add(' d := ' + Tokens[3] + ';');
Editor.Lines.Add(' e := ' + Tokens[4] + ';');
Editor.Lines.Add(' f := ' + Tokens[5] + ';');
end;
v := Attributes.Value('post');
if v <> '' then begin
GetTokens(String(v), tokens);
Editor.Lines.Add(' post[0,0] := ' + Tokens[0] + ';');
Editor.Lines.Add(' post[0,1] := (-1) * ' + Tokens[1] + ';');
Editor.Lines.Add(' post[1,0] := (-1) * ' + Tokens[2] + ';');
Editor.Lines.Add(' post[1,1] := ' + Tokens[3] + ';');
Editor.Lines.Add(' post[2,0] := ' + Tokens[4] + ';');
Editor.Lines.Add(' post[2,1] := (-1) * ' + Tokens[5] + ';');
end;
v := Attributes.Value('chaos');
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');
GetTokens(String(v), tokens);
for i := 0 to Tokens.Count-1 do
chaosLines.Add(' chaos[' + IntToStr(i) + '] := ' + Tokens[i]) ;
chaosLines.Add('end;');
end;
v := Attributes.Value('opacity');
if v <> '' then begin
Editor.Lines.Add(' Opacity := ' + String(v));
end;
for i := 0 to NRVAR - 1 do
begin
v := Attributes.Value(TStringType(varnames(i)));
if v <> '' then
Editor.Lines.Add(' ' + varnames(i) + ' := ' + String(v));
end;
for i := 0 to GetNrVariableNames - 1 do begin
v := Attributes.Value(TStringType(GetVariableNameAt(i)));
if v <> '' then begin
Editor.Lines.Add(' ' + GetVariableNameAt(i) + ' := ' + String(v));
end;
end;
Editor.Lines.Add('end;');
AddedXForms := AddedXForms + 1;
finally
Tokens.free;
end;
end;
procedure TScriptEditor.F2SXMLEndTag(Sender: TObject; TagName: string);
begin
//
end;
procedure TScriptEditor.F2SXMLStartTag(Sender: TObject; TagName: string;
Attributes: TAttrList);
var
Tokens: TStringList;
v: TStringType;
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');
v := Attributes.Value(TStringType('size'));
if (v <> '') then begin
GetTokens(String(v), tokens);
Editor.Lines.Add(' Width := ' + Tokens[0] + ';');
Editor.Lines.Add(' Height := ' + Tokens[1] + ';');
f := 100 / StrToFloat(Tokens[0]);
end else f := 0;
b := 0;
v := Attributes.Value(TStringType('brightness'));
if (v <> '') then begin
Editor.Lines.Add(' Brightness := ' + String(v) + ';');
b := StrToFloat(String(v));
end;
v := Attributes.Value(TStringType('gamma'));
if (v <> '') then Editor.Lines.Add(' Gamma := ' + String(v) + ';');
v := Attributes.Value(TStringType('vibrancy'));
if (v <> '') then Editor.Lines.Add(' Vibrancy := ' + String(v) + ';');
v := Attributes.Value(TStringType('gamma_threshold'));
if (v <> '') then begin
if b <> 0 then b := StrToFloat(String(v)) / b;
Editor.Lines.Add(' GammaTreshold := ' + FloatToStr(b) + ';');
end;
v := Attributes.Value(TStringType('zoom'));
if (v <> '') then Editor.Lines.Add(' Zoom := ' + String(v) + ';');
v := Attributes.Value(TStringType('scale'));
if (v <> '') then Editor.Lines.Add(' Scale := ' + FloatToStr(StrToFloat(String(v)) * f) + ';');
v := Attributes.Value(TStringType('angle'));
if (v <> '') then Editor.Lines.Add(' Angle := ' + String(v) + ';');
// 3d
v := Attributes.Value(TStringType('cam_pitch'));
if (v <> '') then Editor.Lines.Add(' Pitch := ' + String(v) + ' * AngleTransform;');
v := Attributes.Value(TStringType('cam_yaw'));
if (v <> '') then Editor.Lines.Add(' Yaw := ' + String(v) + ' * AngleTransform;');
v := Attributes.Value(TStringType('cam_perspective'));
if (v <> '') then Editor.Lines.Add(' Perspective := ' + String(v) + ';');
v := Attributes.Value(TStringType('cam_zpos'));
if (v <> '') then Editor.Lines.Add(' Z := ' + String(v) + ';');
v := Attributes.Value(TStringType('cam_dof'));
if (v <> '') then Editor.Lines.Add(' DOF := ' + String(v) + ';');
try
v := Attributes.Value(TStringType('center'));
if (v <> '') then begin
GetTokens(String(v), tokens);
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
v := Attributes.Value(TStringType('background'));
if (v <> '') then begin
GetTokens(String(v), tokens);
Editor.Lines.Add(' Background[0] := ' + FloatToStr(Floor(StrToFloat(Tokens[0]) * 255)) + ';');
Editor.Lines.Add(' Background[1] := ' + FloatToStr(Floor(StrToFloat(Tokens[1]) * 255)) + ';');
Editor.Lines.Add(' Background[2] := ' + FloatToStr(Floor(StrToFloat(Tokens[2]) * 255)) + ';');
end;
except
Editor.Lines.Add(' Background[0] := 0' + ';');
Editor.Lines.Add(' Background[1] := 0' + ';');
Editor.Lines.Add(' Background[2] := 0' + ';');
end;
v := Attributes.Value(TStringType('soloxform'));
if (v <> '') then Editor.Lines.Add('SoloXform := ' + String(v) + ';');
Editor.Lines.Add('end;');
end;
finally
Tokens.free;
end;
end;
procedure TScriptEditor.LoadRunAndClear(scriptFile:string);
begin
LoadScriptFile(scriptFile);
RunScript;
btnNewClick(btnNew);
end;
end.