unit uengShaderPartMeta; {$mode objfpc}{$H+} {$I uengShaderFile.inc} interface uses Classes, SysUtils, uengShaderPart, uengShaderFileParser; type //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengMetaType = ( metaUnknown, metaNormal, metaVersion, metaExtension, metaLayout); TengMetaData = class(TObject) private fMetaType: TengMetaType; fName: String; fValues: TStringList; function GetValues: TStrings; public property MetaType: TengMetaType read fMetaType; property Name: String read fName; property Values: TStrings read GetValues; constructor Create(const aName: String; const aType: TengMetaType); destructor Destroy; override; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartMeta = class(TengShaderCodePart) { Code Loading & Storage } private fData: TengMetaData; protected function GetText: String; override; function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override; { General } public property Data: TengMetaData read fData; constructor Create(const aParent: TengShaderPart); override; destructor Destroy; override; { Classs Methods } public class function GetTokenName: String; override; end; implementation uses uengShaderFileConstants, uengShaderFileTypes; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengMetaData////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengMetaData.GetValues: TStrings; begin result := fValues; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TengMetaData.Create(const aName: String; const aType: TengMetaType); begin inherited Create; fName := aName; fMetaType := aType; fValues := TStringList.Create; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TengMetaData.Destroy; begin FreeAndNil(fValues); inherited Destroy; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //TengShaderPartMeta//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartMeta.GetText: String; var i: Integer; begin result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + fData.Name; for i := 0 to fData.Values.Count-1 do begin if (PtrInt(fData.Values.Objects[i]) <> 0) then result := result + ' ' + TOKEN_CHAR_QUOTE + fData.Values[i] + TOKEN_CHAR_QUOTE else result := result + ' ' + fData.Values[i]; end; result := result + TOKEN_CHAR_END; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// function TengShaderPartMeta.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; var i: Integer; t: TengMetaType; n: String; 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, -1, self); result := ''; n := aParams[1].Name; {.$VERSION} if (n = TOKEN_VERSION) then begin t := metaVersion; if (aParams.Count = 3) then begin if (aParams[2].Name <> VERSION_EXTRA_COMPAT) and not TryStrToInt(aParams[2].Name, i) then with aParams[2] do raise EengInvalidParamter.Create('version must be an number or "' + VERSION_EXTRA_COMPAT + '"', Line, Col, Filename, self); end else if (aParams.Count = 4) then begin if (aParams[2].Name <> VERSION_EXTRA_COMPAT) and not TryStrToInt(aParams[2].Name, i) then with aParams[2] do raise EengInvalidParamter.Create('version must be an number or "' + VERSION_EXTRA_COMPAT + '"', Line, Col, Filename, self); if (aParams[3].Name <> VERSION_EXTRA_COMPAT) then with aParams[3] do raise EengInvalidParamter.Create('only "' + VERSION_EXTRA_COMPAT + '" is alowed as second parameter', Line, Col, Filename, self); end else raise EengInvalidParamterCount.Create(GetTokenName, 3, 4, self); {.$EXTENSION} end else if (n = TOKEN_EXTENSION) then begin t := metaExtension; if (aParams.Count <> 4) then raise EengInvalidParamterCount.Create(GetTokenName, 4, self); {.$LAYOUT} end else if (n = TOKEN_LAYOUT) then begin t := metaLayout; if (aParams.Count <> 3) then raise EengInvalidParamterCount.Create(GetTokenName, 3, self); {.VALUES} end else t := metaNormal; fData := TengMetaData.Create(n, t); try for i := 2 to aParams.Count-1 do fData.Values.AddObject(aParams[i].Name, TObject(PtrInt(aParams[i].Quoted))); except FreeAndNil(fData); end; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// constructor TengShaderPartMeta.Create(const aParent: TengShaderPart); begin inherited Create(aParent); fData := nil; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// destructor TengShaderPartMeta.Destroy; begin FreeAndNil(fData); inherited Destroy; end; //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// class function TengShaderPartMeta.GetTokenName: String; begin result := TOKEN_META; end; end.