unit uengShaderPartCall; {$mode objfpc}{$H+} {$I uengShaderFile.inc} interface uses Classes, SysUtils, uengShaderPart, uengShaderFileParser; type //////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// TengShaderPartCall = class(TengShaderCodePart) { 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, self); if (aParams.Count < 2) then raise EengInvalidParamterCount.Create(GetTokenName, 2, -1, self); result := ''; fParameters.Clear; with aParams[1] do begin if not IsValidIdentifier(fName) then raise EengInvalidIdentifier.Create(Name, self); 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, self); 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, self); 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.