You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

96 lines
3.6 KiB

  1. unit uengShaderPartEcho;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderPartKeyValuePair, uengShaderGeneratorArgs;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartEcho = class(TengShaderCodePart)
  11. { Code Loading & Storage }
  12. private
  13. fName: String;
  14. fValue: TengShaderPartKeyValuePair;
  15. protected
  16. function GetText: String; override;
  17. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  18. { Code Generation }
  19. public
  20. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  21. { General }
  22. public
  23. class function GetTokenName: String; override;
  24. end;
  25. implementation
  26. uses
  27. uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper, uengShaderPartScope, uengShaderFile;
  28. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  29. //TengShaderPartEcho////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  30. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  31. function TengShaderPartEcho.GetText: String;
  32. begin
  33. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + fName + TOKEN_CHAR_END;
  34. end;
  35. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. function TengShaderPartEcho.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  37. var
  38. sr: TengSearchResults;
  39. walker: TengKeyValuePairSearchWalker;
  40. begin
  41. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  42. raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self);
  43. if (aParams.Count <> 2) then
  44. raise EengInvalidParamterCount.Create(GetTokenName, 2, self);
  45. result := '';
  46. with aParams[1] do begin
  47. if not IsValidIdentifier(Name) then
  48. raise EengInvalidIdentifier.Create(Name, self);
  49. fName := Name;
  50. end;
  51. sr := TengSearchResults.Create;
  52. walker := TengKeyValuePairSearchWalker.Create(sr);
  53. try
  54. walker.Name := fName;
  55. walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartProperty, TengShaderPartStatic);
  56. walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope);
  57. walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile);
  58. walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderFile);
  59. walker.SearchFlags := [
  60. sfSearchChildrenLazy,
  61. sfSearchParents
  62. ];
  63. walker.Run(self);
  64. fValue := (ExtractSearchResult(self, fName, sr) as TengShaderPartKeyValuePair);
  65. finally
  66. FreeAndNil(walker);
  67. FreeAndNil(sr);
  68. end;
  69. end;
  70. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  71. procedure TengShaderPartEcho.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  72. begin
  73. inherited GenerateCodeIntern(aArgs);
  74. aArgs.AddText(fValue.Value);
  75. end;
  76. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. class function TengShaderPartEcho.GetTokenName: String;
  78. begin
  79. result := TOKEN_ECHO;
  80. end;
  81. end.