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.

144 lines
5.7 KiB

  1. unit uengShaderPartText;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderPart, uengShaderFileParser;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartText = class(TengShaderPart)
  11. { Code Loading & Storage }
  12. private
  13. fText: String;
  14. function GetIsEmpty: Boolean;
  15. protected
  16. function GetText: String; override;
  17. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  18. public
  19. property Text: String read fText;
  20. property IsEmpty: Boolean read GetIsEmpty;
  21. end;
  22. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  23. TengShaderPartLineBreak = class(TengShaderPart)
  24. { Code Loading & Storage }
  25. protected
  26. function GetText: String; override;
  27. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  28. { Class Methods }
  29. public
  30. class function GetTokenName: String; override;
  31. end;
  32. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. TengShaderPartCommandEnd = class(TengShaderPart)
  34. { Code Loading & Storage }
  35. private
  36. fToken: String;
  37. protected
  38. function GetText: String; override;
  39. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  40. { Class Methods }
  41. public
  42. class function CheckToken(const aToken: String): Boolean; override;
  43. end;
  44. implementation
  45. uses
  46. uengShaderFileConstants, uengShaderFileTypes;
  47. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. //TengShaderPartText////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  50. function TengShaderPartText.GetIsEmpty: Boolean;
  51. begin
  52. result := (fText = '');
  53. end;
  54. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. function TengShaderPartText.GetText: String;
  56. begin
  57. result := fText;
  58. end;
  59. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. function TengShaderPartText.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  61. begin
  62. fText := '';
  63. result := '';
  64. while not aArgs.EndOfLine do begin
  65. if aArgs.GetTokenPreview(result) then begin
  66. exit;
  67. end else if (aArgs.CurrentChar in COMMAND_END_TOKENS) then begin
  68. result := aArgs.CurrentChar;
  69. exit;
  70. end else begin
  71. fText := fText + aArgs.CurrentChar;
  72. aArgs.NextCol;
  73. end;
  74. end;
  75. result := TOKEN_LINE_BREAK;
  76. end;
  77. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  78. //TengShaderPartLineBreak///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  80. function TengShaderPartLineBreak.GetText: String;
  81. begin
  82. result := TOKEN_LINE_BREAK;
  83. end;
  84. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. function TengShaderPartLineBreak.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  86. begin
  87. if not aArgs.EndOfLine then
  88. raise EengInvalidToken.Create(ClassName, '[LineBreak]', Line, Col, Filename);
  89. aArgs.NextLine;
  90. result := '';
  91. end;
  92. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. class function TengShaderPartLineBreak.GetTokenName: String;
  94. begin
  95. result := TOKEN_LINE_BREAK;
  96. end;
  97. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. //TengShaderPartCommandEnd//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  99. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100. function TengShaderPartCommandEnd.GetText: String;
  101. begin
  102. result := fToken;
  103. end;
  104. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  105. function TengShaderPartCommandEnd.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  106. begin
  107. result := '';
  108. fToken := aArgs.CurrentChar;
  109. aArgs.NextCol;
  110. end;
  111. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. class function TengShaderPartCommandEnd.CheckToken(const aToken: String): Boolean;
  113. var
  114. s: String;
  115. begin
  116. result := true;
  117. for s in COMMAND_END_TOKENS do
  118. if (s = aToken) then
  119. exit;
  120. result := false;
  121. end;
  122. end.