|
- unit uengShaderPartMeta;
-
- {$mode objfpc}{$H+}
- {$I uengShaderFile.inc}
-
- interface
-
- uses
- Classes, SysUtils,
- uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs, uengShaderFileTypes;
-
- type
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderPartMeta = class(TengShaderCodePart)
- { Code Loading & Storage }
- private
- fData: TengMetaData;
- 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
- 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;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //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;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TengShaderPartMeta.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
- begin
- inherited GenerateCodeIntern(aArgs);
- aArgs.AddMeta(fData);
- 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.
|