|
- unit uengShaderPartCall;
-
- {$mode objfpc}{$H+}
- {$I uengShaderFile.inc}
-
- interface
-
- uses
- Classes, SysUtils,
- uengShaderPart, uengShaderFileParser;
-
- type
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderPartCall = class(TengShaderPart)
- { Code Loading & Storage }
- private { member }
- fName: String;
- fParameters: TStringList;
- protected { virtual getter }
- function GetText: String; override;
- function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
-
- { General }
- private
- function GetParameters: TStrings;
- public
- property Name: String read fName;
- property Parameters: TStrings read GetParameters;
-
- constructor Create(const aParent: TengShaderPart); override;
- destructor Destroy; override;
-
- { Class Methods }
- public
- class function GetTokenName: String; override;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderPartInherited = class(TengShaderPartCall)
- { Class Methods }
- protected
- function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
- public
- class function GetTokenName: String; override;
- class procedure Validate(const aArgs: TengParseArgs; const aParent: TengShaderPart); override;
- end;
-
- implementation
-
- uses
- uengShaderPartProc, uengShaderPartClass, uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderPartCall////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartCall.GetText: String;
- var
- i: Integer;
- begin
- result := TOKEN_CHAR_BEGIN + GetTokenName;
- if (fName <> '') then
- result := result + ' ' + fName;
- for i := 0 to fParameters.Count-1 do begin
- if (PtrInt(fParameters.Objects[i]) <> 0)
- then result := result + ' ' + TOKEN_CHAR_QUOTE + fParameters[i] + TOKEN_CHAR_QUOTE
- else result := result + ' ' + fParameters[i];
- end;
- result := result + TOKEN_CHAR_END;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartCall.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
- var
- i: Integer;
- begin
- if (aParams[0].Name <> GetTokenName) then
- raise EengInvalidToken.Create(ClassName, aParams[0].Name, Line, Col, Filename);
- if (aParams.Count < 2) then
- raise EengInvalidParamterCount.Create(GetTokenName, 2, -1, Line, Col, Filename);
-
- result := '';
- fParameters.Clear;
- with aParams[1] do begin
- if not IsValidIdentifier(fName) then
- raise EengInvalidIdentifier.Create(Name, Line, Col, Filename);
- fName := Name;
- end;
- for i := 2 to aParams.Count-1 do
- fParameters.AddObject(aParams[i].Name, TObject(PtrInt(aParams[i].Quoted)));
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartCall.GetParameters: TStrings;
- begin
- result := fParameters;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- constructor TengShaderPartCall.Create(const aParent: TengShaderPart);
- begin
- inherited Create(aParent);
- fParameters := TStringList.Create;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- destructor TengShaderPartCall.Destroy;
- begin
- FreeAndNil(fParameters);
- inherited Destroy;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class function TengShaderPartCall.GetTokenName: String;
- begin
- result := TOKEN_CALL;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderPartInherited///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderPartInherited.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
- var
- i: Integer;
- begin
- if (aParams[0].Name <> GetTokenName) then with aParams[0] do
- raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename);
-
- fName := '';
- fParameters.Clear;
- if (aParams.Count >= 2) then begin
- if not IsValidIdentifier(aParams[1].Name) and (aParams[1].Name <> TOKEN_MAIN) then
- with aParams[1] do
- raise EengInvalidIdentifier.Create(Name, Line, Col, Filename);
- fName := aParams[1].Name;
- for i := 2 to aParams.Count-1 do
- fParameters.AddObject(aParams[i].Name, TObject(PtrInt(aParams[i].Quoted)));
- end;
- result := '';
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class function TengShaderPartInherited.GetTokenName: String;
- begin
- result := TOKEN_INHERITED;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- class procedure TengShaderPartInherited.Validate(const aArgs: TengParseArgs; const aParent: TengShaderPart);
- begin
- inherited Validate(aArgs, aParent);
- if not aParent.HasParent(TengShaderPartProc, true) or
- not aParent.HasParent(TengShaderPartClass, true) then
- raise EengShaderPart.Create(GetTokenName + ' is not allowed outside of ' +
- TOKEN_PROC + ', ' + TOKEN_FUNC + ', ' + TOKEN_MAIN + ' or ' + TOKEN_CLASS);
- end;
-
- end.
|