unit uengShaderPartText; {$mode objfpc}{$H+} {$I uengShaderFile.inc} interface uses Classes, SysUtils, uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs; type //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartText = class(TengShaderCodePart) { Code Loading & Storage } private fText: String; function GetIsEmpty: Boolean; protected function GetText: String; override; function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; { Code Generation } public procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; { General } public property Text: String read fText; property IsEmpty: Boolean read GetIsEmpty; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartLineBreak = class(TengShaderCodePart) { Code Loading & Storage } protected function GetText: String; override; function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; { Code Generation } public procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; { Class Methods } public class function GetTokenName: String; override; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartCommandEnd = class(TengShaderCodePart) { Code Loading & Storage } private fToken: String; protected function GetText: String; override; function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; { Code Generation } public procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override; { Class Methods } public class function CheckToken(const aToken: String): Boolean; override; end; implementation uses uengShaderFileConstants, uengShaderFileTypes; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartText//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartText.GetIsEmpty: Boolean; begin result := (fText = ''); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartText.GetText: String; begin result := fText; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartText.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; begin fText := ''; result := ''; while not aArgs.EndOfLine do begin if aArgs.GetTokenPreview(self, result) then begin exit; end else if (aArgs.CurrentChar in COMMAND_END_TOKENS) then begin result := aArgs.CurrentChar; exit; end else begin fText := fText + aArgs.CurrentChar; aArgs.NextCol; end; end; result := TOKEN_LINE_BREAK; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TengShaderPartText.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); begin aArgs.AddText(fText); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartLineBreak/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartLineBreak.GetText: String; begin result := TOKEN_LINE_BREAK; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartLineBreak.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; begin if not aArgs.EndOfLine then raise EengInvalidToken.Create(ClassName, '[LineBreak]', self); aArgs.NextLine; result := ''; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TengShaderPartLineBreak.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); begin aArgs.AddLineBreak; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class function TengShaderPartLineBreak.GetTokenName: String; begin result := TOKEN_LINE_BREAK; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartCommandEnd////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartCommandEnd.GetText: String; begin result := fToken; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartCommandEnd.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; begin result := ''; fToken := aArgs.CurrentChar; aArgs.NextCol; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TengShaderPartCommandEnd.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); begin aArgs.AddCommandEnd(fToken); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class function TengShaderPartCommandEnd.CheckToken(const aToken: String): Boolean; var s: String; begin result := true; for s in COMMAND_END_TOKENS do if (s = aToken) then exit; result := false; end; end.