unit uengShaderPartKeyValuePair; {$mode objfpc}{$H+} {$I uengShaderFile.inc} interface uses Classes, SysUtils, variants, uengShaderPart, uengShaderCodePart, uengShaderFileParser {$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} , uutlGenerics {$ELSE} , uengShaderFileGenerics {$ENDIF} ; type //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartStatic = class; TengShaderPartKeyValuePair = class(TengShaderCodePart) { Code Loading & Storage } private fName: String; fValueName: String; fDefaultValue: Variant; protected fValue: Variant; function GetText: String; override; function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; { General } public property Name: String read fName; property ValueName: String read fValueName; property Value: Variant read fValue; property DefaultValue: Variant read fDefaultValue; constructor Create(const aParent: TengShaderPart; const aName: String; const aValue: Variant); overload; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartProperty = class(TengShaderPartKeyValuePair) { General } public property Value: Variant read fValue write fValue; { Class Methods } public class function GetTokenName: String; override; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartPropertyList = class(specialize TutlList) private fValue: Variant; fDefaultValue: Variant; public property Value: Variant read fValue write fValue; property DefaultValue: Variant read fDefaultValue write fDefaultValue; procedure ApplyValue; constructor Create; end; TengShaderPartPropertyMap = class(specialize TutlMap) public procedure ApplyValues; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartStatic = class(TengShaderPartKeyValuePair) { Class Methods } public class function GetTokenName: String; override; end; implementation uses uengShaderFile, uengShaderPartScope, uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartPropertyList///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TengShaderPartPropertyList.ApplyValue; var p: TengShaderPartProperty; begin for p in self do p.Value := fValue; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TengShaderPartPropertyList.Create; begin inherited Create(false); end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartPropertyMap///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// procedure TengShaderPartPropertyMap.ApplyValues; var l: TengShaderPartPropertyList; begin for l in self do l.ApplyValue; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartKeyValuePair//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartKeyValuePair.GetText: String; begin result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + fName; if (fValueName <> '') then result := result + ' ' + fValueName else if (fValue <> Unassigned) then result := result + ' ' + TOKEN_CHAR_QUOTE + String(fValue) + TOKEN_CHAR_QUOTE; result := result + TOKEN_CHAR_END; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartKeyValuePair.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, GetTokenName, Line, Col, Filename, self); if (aParams.Count < 2) or (aParams.Count > 3) then raise EengInvalidParamterCount.Create(GetTokenName, 2, 3, self); result := ''; fName := aParams[1].Name; if not IsValidIdentifier(fName) then with aParams[1] do raise EengInvalidIdentifier.Create(fName, Line, Col, Filename, self); if (aParams.Count >= 3) then if aParams[2].Quoted then begin fDefaultValue := aParams[2].Name; fValue := fDefaultValue; fValueName := ''; end else begin fValueName := aParams[2].Name; sr := TengSearchResults.Create; walker := TengKeyValuePairSearchWalker.Create(sr); try walker.Name := fValueName; walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartStatic); walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope); walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile); walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderFile); walker.SearchFlags := [ sfSearchChildrenLazy, sfSearchParents ]; walker.Run(self); fDefaultValue := (ExtractSearchResult(self, fValueName, sr) as TengShaderPartStatic).Value; fValue := fDefaultValue; finally FreeAndNil(walker); FreeAndNil(sr); end; end else begin fValue := Unassigned; fValueName := ''; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TengShaderPartKeyValuePair.Create(const aParent: TengShaderPart; const aName: String; const aValue: Variant); begin inherited Create(aParent); fName := aName; fValueName := ''; fValue := aValue; fDefaultValue := aValue; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartProperty//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class function TengShaderPartProperty.GetTokenName: String; begin result := TOKEN_PROPERTY; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartStatic////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class function TengShaderPartStatic.GetTokenName: String; begin result := TOKEN_STATIC; end; end.