2
0

GXS.DWSObjects.pas 6.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258
  1. //
  2. // Graphic Scene Engine, http://glscene.org
  3. //
  4. {
  5. Base classes and logic for DelphiWebScript enabled objects
  6. }
  7. unit GXS.DwsObjects;
  8. interface
  9. uses
  10. System.Classes,
  11. System.SysUtils,
  12. DwsComp,
  13. DwsExprs,
  14. DwsSymbols,
  15. GXS.Scene,
  16. GXS.GXS.XCollection,
  17. GXS.ScriptDws,
  18. GXS.BaseClasses,
  19. Stage.Manager;
  20. type
  21. { A DelphiWebScript enabled behaviour. This behaviour also calls
  22. on the OnProgress and OnBeginProgram procedures in the script if
  23. they are found. Once compiled and executed the program remains
  24. active until killed, deactivated or the script is invalidated. }
  25. TgxDwsActiveBehaviour = class (TgxBehaviour)
  26. private
  27. FActive : Boolean;
  28. FScript : TStringList;
  29. FDwsProgram : TProgram;
  30. FCompiler : TgxDelphiWebScriptII;
  31. FCompilerName : String;
  32. procedure SetActive(const Value : Boolean);
  33. procedure SetScript(const Value : TStringList);
  34. procedure SetCompiler(const Value : TgxDelphiWebScript);
  35. procedure CompileProgram;
  36. procedure BeginProgram;
  37. procedure EndProgram;
  38. procedure KillProgram;
  39. protected
  40. procedure WriteToFiler(writer : TWriter); override;
  41. procedure ReadFromFiler(reader : TReader); override;
  42. procedure Loaded; override;
  43. public
  44. constructor Create(AOwner : TXCollection); override;
  45. destructor Destroy; override;
  46. class function FriendlyName : String; override;
  47. procedure DoProgress(const ProgressTimes : TgxProgressTimes); override;
  48. procedure InvalidateScript;
  49. property DwsProgram : TProgram read FDwsProgram;
  50. published
  51. property Active : Boolean read FActive write SetActive;
  52. property Script : TStringList read FScript write SetScript;
  53. property Compiler : TgxDelphiWebScriptII read FCompiler write SetCompiler;
  54. end;
  55. procedure Register;
  56. // --------------------------------------------------
  57. implementation
  58. // --------------------------------------------------
  59. // ----------
  60. // ---------- Miscellaneous ----------
  61. // ----------
  62. procedure Register;
  63. begin
  64. RegisterClasses([TgxDwsActiveBehaviour]);
  65. end;
  66. // ----------
  67. // ---------- TgxDwsActiveBehaviour ----------
  68. // ----------
  69. constructor TgxDwsActiveBehaviour.Create(AOwner: TXCollection);
  70. begin
  71. inherited;
  72. FScript:=TStringList.Create;
  73. end;
  74. destructor TgxDwsActiveBehaviour.Destroy;
  75. begin
  76. KillProgram;
  77. FScript.Free;
  78. inherited;
  79. end;
  80. class function TgxDwsActiveBehaviour.FriendlyName: String;
  81. begin
  82. Result:='DWS Active Script';
  83. end;
  84. procedure TgxDwsActiveBehaviour.DoProgress(const ProgressTimes: TgxProgressTimes);
  85. var
  86. Symbol : TSymbol;
  87. begin
  88. inherited;
  89. if Assigned(FDwsProgram) then begin
  90. if FDwsProgram.ProgramState = psRunning then begin
  91. Symbol:=DwsProgram.Table.FindSymbol('OnProgress');
  92. if Assigned(Symbol) then
  93. if Symbol is TFuncSymbol then
  94. DwsProgram.Info.Func['OnProgress'].Call([ProgressTimes.newTime, ProgressTimes.deltaTime]);
  95. end;
  96. end;
  97. end;
  98. procedure TgxDwsActiveBehaviour.Loaded;
  99. var
  100. temp : TComponent;
  101. begin
  102. inherited;
  103. if FCompilerName<>'' then begin
  104. temp:=FindManager(TgxDelphiWebScript, FCompilerName);
  105. if Assigned(temp) then
  106. Compiler:=TgxDelphiWebScript(temp);
  107. FCompilerName:='';
  108. CompileProgram;
  109. if Active then BeginProgram;
  110. end;
  111. end;
  112. procedure TgxDwsActiveBehaviour.ReadFromFiler(reader: TReader);
  113. begin
  114. inherited;
  115. with reader do begin
  116. Assert(ReadInteger = 0); // Archive version
  117. Active:=ReadBoolean;
  118. FCompilerName:=ReadString;
  119. Script.Text:=ReadString;
  120. end;
  121. end;
  122. procedure TgxDwsActiveBehaviour.WriteToFiler(writer: TWriter);
  123. begin
  124. inherited;
  125. with writer do begin
  126. WriteInteger(0); // Archive version
  127. WriteBoolean(FActive);
  128. if Assigned(FCompiler) then
  129. WriteString(FCompiler.GetNamePath)
  130. else WriteString('');
  131. WriteString(Script.Text);
  132. end;
  133. end;
  134. procedure TgxDwsActiveBehaviour.CompileProgram;
  135. begin
  136. if Assigned(Compiler) then begin
  137. KillProgram;
  138. FDwsProgram:=Compiler.Compile(Script.Text);
  139. if Active then
  140. BeginProgram;
  141. end;
  142. end;
  143. procedure TgxDwsActiveBehaviour.BeginProgram;
  144. var
  145. Symbol : TSymbol;
  146. ObjectID : Variant;
  147. Obj : TgxBaseSceneObject;
  148. begin
  149. if Assigned(DwsProgram) then begin
  150. if DwsProgram.ProgramState = psReadyToRun then begin
  151. DwsProgram.BeginProgram;
  152. if FDwsProgram.ProgramState = psRunning then begin
  153. Symbol:=DwsProgram.Table.FindSymbol('OnBeginProgram');
  154. if Assigned(Symbol) then
  155. if Symbol is TFuncSymbol then begin
  156. Obj:=OwnerBaseSceneObject;
  157. if Assigned(Obj) then begin
  158. ObjectID:=DwsProgram.Info.RegisterExternalObject(Obj, False, False);
  159. DwsProgram.Info.Func['OnBeginProgram'].Call([ObjectID]);
  160. end;
  161. end;
  162. end;
  163. end;
  164. end;
  165. end;
  166. procedure TgxDwsActiveBehaviour.EndProgram;
  167. begin
  168. if Assigned(DwsProgram) then begin
  169. if DwsProgram.ProgramState = psRunning then
  170. DwsProgram.EndProgram;
  171. end;
  172. end;
  173. procedure TgxDwsActiveBehaviour.KillProgram;
  174. begin
  175. if Assigned(DwsProgram) then begin
  176. EndProgram;
  177. FreeAndNil(FDwsProgram);
  178. end;
  179. end;
  180. procedure TgxDwsActiveBehaviour.InvalidateScript;
  181. begin
  182. KillProgram;
  183. CompileProgram;
  184. end;
  185. procedure TgxDwsActiveBehaviour.SetActive(const Value: Boolean);
  186. begin
  187. if Value<>FActive then begin
  188. EndProgram;
  189. FActive:=Value;
  190. if Active then
  191. BeginProgram;
  192. end;
  193. end;
  194. procedure TgxDwsActiveBehaviour.SetScript(const Value: TStringList);
  195. begin
  196. if Assigned(Value) then begin
  197. KillProgram;
  198. FScript.Assign(Value);
  199. if Assigned(Compiler) then begin
  200. CompileProgram;
  201. if Active then BeginProgram;
  202. end;
  203. end;
  204. end;
  205. procedure TgxDwsActiveBehaviour.SetCompiler(const Value: TgxDelphiWebScriptII);
  206. begin
  207. if Value<>FCompiler then begin
  208. if Assigned(FCompiler) then
  209. KillProgram;
  210. FCompiler:=Value;
  211. if Assigned(FCompiler) then begin
  212. RegisterManager(FCompiler);
  213. CompileProgram;
  214. if Active then BeginProgram;
  215. end;
  216. end;
  217. end;
  218. // --------------------------------------------------
  219. initialization
  220. // --------------------------------------------------
  221. RegisterXCollectionItemClass(TgxDwsActiveBehaviour);
  222. // --------------------------------------------------
  223. finalization
  224. // --------------------------------------------------
  225. UnregisterXCollectionItemClass(TgxDwsActiveBehaviour);
  226. end.