unit uengShaderPartKeyValuePair; {$mode objfpc}{$H+} {$I uengShaderFile.inc} interface uses Classes, SysUtils, variants, uengShaderPart, uengShaderFileParser {$IFDEF USE_BITSPACE_UTILS} , uutlGenerics {$ENDIF} ; type //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartKeyValuePair = class(TengShaderCodePart) { Code Loading & Storage } private fName: String; fValue: Variant; fValueName: String; protected function GetText: String; override; function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; { General } public property Name: String read fName; property Value: Variant read fValue; property ValueName: String read fValueName; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartProperty = class(TengShaderPartKeyValuePair) { Class Methods } public class function GetTokenName: String; override; end; TengShaderPartPropertyMap = specialize TutlMap; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartDefine = class(TengShaderPartKeyValuePair) { Class Methods } public class function GetTokenName: String; override; end; implementation uses uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //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; 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 fValue := aParams[2].Name; fValueName := ''; end else begin // TODO resolve name and set value fValue := Unassigned; fValueName := aParams[2].Name; end else begin fValue := Unassigned; fValueName := ''; end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartProperty//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class function TengShaderPartProperty.GetTokenName: String; begin result := TOKEN_PROPERTY; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartDefine////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class function TengShaderPartDefine.GetTokenName: String; begin result := TOKEN_DEFINE; end; end.