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.