25개 이상의 토픽을 선택하실 수 없습니다. Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

176 lines
7.0 KiB

  1. unit uengShaderPartText;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartText = class(TengShaderCodePart)
  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. { Code Generation }
  19. public
  20. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  21. { General }
  22. public
  23. property Text: String read fText;
  24. property IsEmpty: Boolean read GetIsEmpty;
  25. end;
  26. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  27. TengShaderPartLineBreak = class(TengShaderCodePart)
  28. { Code Loading & Storage }
  29. protected
  30. function GetText: String; override;
  31. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  32. { Code Generation }
  33. public
  34. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  35. { Class Methods }
  36. public
  37. class function GetTokenName: String; override;
  38. end;
  39. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. TengShaderPartCommandEnd = class(TengShaderCodePart)
  41. { Code Loading & Storage }
  42. private
  43. fToken: String;
  44. protected
  45. function GetText: String; override;
  46. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  47. { Code Generation }
  48. public
  49. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  50. { Class Methods }
  51. public
  52. class function CheckToken(const aToken: String): Boolean; override;
  53. end;
  54. implementation
  55. uses
  56. uengShaderFileConstants, uengShaderFileTypes;
  57. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. //TengShaderPartText////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  59. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. function TengShaderPartText.GetIsEmpty: Boolean;
  61. begin
  62. result := (fText = '');
  63. end;
  64. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. function TengShaderPartText.GetText: String;
  66. begin
  67. result := fText;
  68. end;
  69. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70. function TengShaderPartText.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  71. begin
  72. fText := '';
  73. result := '';
  74. while not aArgs.EndOfLine do begin
  75. if aArgs.GetTokenPreview(self, result) then begin
  76. exit;
  77. end else if (aArgs.CurrentChar in COMMAND_END_TOKENS) then begin
  78. result := aArgs.CurrentChar;
  79. exit;
  80. end else begin
  81. fText := fText + aArgs.CurrentChar;
  82. aArgs.NextCol;
  83. end;
  84. end;
  85. result := TOKEN_LINE_BREAK;
  86. end;
  87. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. procedure TengShaderPartText.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  89. begin
  90. aArgs.AddText(fText);
  91. end;
  92. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. //TengShaderPartLineBreak///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  95. function TengShaderPartLineBreak.GetText: String;
  96. begin
  97. result := TOKEN_LINE_BREAK;
  98. end;
  99. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100. function TengShaderPartLineBreak.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  101. begin
  102. if not aArgs.EndOfLine then
  103. raise EengInvalidToken.Create(ClassName, '[LineBreak]', self);
  104. aArgs.NextLine;
  105. result := '';
  106. end;
  107. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  108. procedure TengShaderPartLineBreak.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  109. begin
  110. aArgs.AddLineBreak;
  111. end;
  112. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  113. class function TengShaderPartLineBreak.GetTokenName: String;
  114. begin
  115. result := TOKEN_LINE_BREAK;
  116. end;
  117. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  118. //TengShaderPartCommandEnd//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  119. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  120. function TengShaderPartCommandEnd.GetText: String;
  121. begin
  122. result := fToken;
  123. end;
  124. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125. function TengShaderPartCommandEnd.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  126. begin
  127. result := '';
  128. fToken := aArgs.CurrentChar;
  129. aArgs.NextCol;
  130. end;
  131. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  132. procedure TengShaderPartCommandEnd.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  133. begin
  134. aArgs.AddCommandEnd(fToken);
  135. end;
  136. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  137. class function TengShaderPartCommandEnd.CheckToken(const aToken: String): Boolean;
  138. var
  139. s: String;
  140. begin
  141. result := true;
  142. for s in COMMAND_END_TOKENS do
  143. if (s = aToken) then
  144. exit;
  145. result := false;
  146. end;
  147. end.