|
- unit uengShaderPartKeyValuePair;
-
- {$mode objfpc}{$H+}
- {$I uengShaderFile.inc}
-
- interface
-
- uses
- Classes, SysUtils, variants,
- uengShaderCodePart, uengShaderFileParser
-
- {$IFDEF USE_BITSPACE_UTILS}
- , uutlGenerics
- {$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;
- 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 TutlSimpleList<TengShaderPartProperty>)
- private
- fValue: Variant;
- public
- property Value: Variant read fValue write fValue;
- procedure ApplyValue;
- constructor Create;
- end;
-
- TengShaderPartPropertyMap = class(specialize TutlMap<string, TengShaderPartPropertyList>)
- public
- procedure ApplyValues;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderPartStatic = class(TengShaderPartKeyValuePair)
- { Class Methods }
- public
- class function GetTokenName: String; override;
- end;
-
- implementation
-
- uses
- uengShaderPart, 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;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderPartProperty////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class function TengShaderPartProperty.GetTokenName: String;
- begin
- result := TOKEN_PROPERTY;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderPartStatic//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class function TengShaderPartStatic.GetTokenName: String;
- begin
- result := TOKEN_STATIC;
- end;
-
- end.
|