|
- unit uengShaderPartEcho;
-
- {$mode objfpc}{$H+}
- {$I uengShaderFile.inc}
-
- interface
-
- uses
- Classes, SysUtils,
- uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderPartKeyValuePair, uengShaderGeneratorArgs;
-
- type
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderPartEcho = class(TengShaderCodePart)
- { Code Loading & Storage }
- private
- fName: String;
- fValue: TengShaderPartKeyValuePair;
- 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
- class function GetTokenName: String; override;
- end;
-
- implementation
-
- uses
- uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper, uengShaderPartScope, uengShaderFile;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderPartEcho////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartEcho.GetText: String;
- begin
- result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + fName + TOKEN_CHAR_END;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartEcho.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
- var
- sr: TengSearchResults;
- walker: TengKeyValuePairSearchWalker;
- begin
- if (aParams[0].Name <> GetTokenName) then with aParams[0] do
- raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self);
- if (aParams.Count <> 2) then
- raise EengInvalidParamterCount.Create(GetTokenName, 2, self);
- result := '';
- with aParams[1] do begin
- if not IsValidIdentifier(Name) then
- raise EengInvalidIdentifier.Create(Name, self);
- fName := Name;
- end;
- sr := TengSearchResults.Create;
- walker := TengKeyValuePairSearchWalker.Create(sr);
- try
- walker.Name := fName;
- walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartProperty, TengShaderPartStatic);
- walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope);
- walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile);
- walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderFile);
- walker.SearchFlags := [
- sfSearchChildrenLazy,
- sfSearchParents
- ];
- walker.Run(self);
- fValue := (ExtractSearchResult(self, fName, sr) as TengShaderPartKeyValuePair);
- finally
- FreeAndNil(walker);
- FreeAndNil(sr);
- end;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TengShaderPartEcho.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
- begin
- inherited GenerateCodeIntern(aArgs);
- aArgs.AddText(fValue.Value);
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class function TengShaderPartEcho.GetTokenName: String;
- begin
- result := TOKEN_ECHO;
- end;
-
- end.
|