You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

159 rivejä
6.5 KiB

  1. unit uengShaderPartCall;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderPart, uengShaderFileParser;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartCall = class(TengShaderPart)
  11. { Code Loading & Storage }
  12. private { member }
  13. fName: String;
  14. fParameters: TStringList;
  15. protected { virtual getter }
  16. function GetText: String; override;
  17. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  18. { General }
  19. private
  20. function GetParameters: TStrings;
  21. public
  22. property Name: String read fName;
  23. property Parameters: TStrings read GetParameters;
  24. constructor Create(const aParent: TengShaderPart); override;
  25. destructor Destroy; override;
  26. { Class Methods }
  27. public
  28. class function GetTokenName: String; override;
  29. end;
  30. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  31. TengShaderPartInherited = class(TengShaderPartCall)
  32. { Class Methods }
  33. protected
  34. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  35. public
  36. class function GetTokenName: String; override;
  37. class procedure Validate(const aArgs: TengParseArgs; const aParent: TengShaderPart); override;
  38. end;
  39. implementation
  40. uses
  41. uengShaderPartProc, uengShaderPartClass, uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper;
  42. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  43. //TengShaderPartCall////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  45. function TengShaderPartCall.GetText: String;
  46. var
  47. i: Integer;
  48. begin
  49. result := TOKEN_CHAR_BEGIN + GetTokenName;
  50. if (fName <> '') then
  51. result := result + ' ' + fName;
  52. for i := 0 to fParameters.Count-1 do begin
  53. if (PtrInt(fParameters.Objects[i]) <> 0)
  54. then result := result + ' ' + TOKEN_CHAR_QUOTE + fParameters[i] + TOKEN_CHAR_QUOTE
  55. else result := result + ' ' + fParameters[i];
  56. end;
  57. result := result + TOKEN_CHAR_END;
  58. end;
  59. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. function TengShaderPartCall.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  61. var
  62. i: Integer;
  63. begin
  64. if (aParams[0].Name <> GetTokenName) then
  65. raise EengInvalidToken.Create(ClassName, aParams[0].Name, Line, Col, Filename);
  66. if (aParams.Count < 2) then
  67. raise EengInvalidParamterCount.Create(GetTokenName, 2, -1, Line, Col, Filename);
  68. result := '';
  69. fParameters.Clear;
  70. with aParams[1] do begin
  71. if not IsValidIdentifier(fName) then
  72. raise EengInvalidIdentifier.Create(Name, Line, Col, Filename);
  73. fName := Name;
  74. end;
  75. for i := 2 to aParams.Count-1 do
  76. fParameters.AddObject(aParams[i].Name, TObject(PtrInt(aParams[i].Quoted)));
  77. end;
  78. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. function TengShaderPartCall.GetParameters: TStrings;
  80. begin
  81. result := fParameters;
  82. end;
  83. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. constructor TengShaderPartCall.Create(const aParent: TengShaderPart);
  85. begin
  86. inherited Create(aParent);
  87. fParameters := TStringList.Create;
  88. end;
  89. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. destructor TengShaderPartCall.Destroy;
  91. begin
  92. FreeAndNil(fParameters);
  93. inherited Destroy;
  94. end;
  95. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. class function TengShaderPartCall.GetTokenName: String;
  97. begin
  98. result := TOKEN_CALL;
  99. end;
  100. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  101. //TengShaderPartInherited///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  103. function TengShaderPartInherited.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  104. var
  105. i: Integer;
  106. begin
  107. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  108. raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename);
  109. fName := '';
  110. fParameters.Clear;
  111. if (aParams.Count >= 2) then begin
  112. if not IsValidIdentifier(aParams[1].Name) and (aParams[1].Name <> TOKEN_MAIN) then
  113. with aParams[1] do
  114. raise EengInvalidIdentifier.Create(Name, Line, Col, Filename);
  115. fName := aParams[1].Name;
  116. for i := 2 to aParams.Count-1 do
  117. fParameters.AddObject(aParams[i].Name, TObject(PtrInt(aParams[i].Quoted)));
  118. end;
  119. result := '';
  120. end;
  121. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  122. class function TengShaderPartInherited.GetTokenName: String;
  123. begin
  124. result := TOKEN_INHERITED;
  125. end;
  126. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  127. class procedure TengShaderPartInherited.Validate(const aArgs: TengParseArgs; const aParent: TengShaderPart);
  128. begin
  129. inherited Validate(aArgs, aParent);
  130. if not aParent.HasParent(TengShaderPartProc, true) or
  131. not aParent.HasParent(TengShaderPartClass, true) then
  132. raise EengShaderPart.Create(GetTokenName + ' is not allowed outside of ' +
  133. TOKEN_PROC + ', ' + TOKEN_FUNC + ', ' + TOKEN_MAIN + ' or ' + TOKEN_CLASS);
  134. end;
  135. end.