Nie możesz wybrać więcej, niż 25 tematów Tematy muszą się zaczynać od litery lub cyfry, mogą zawierać myślniki ('-') i mogą mieć do 35 znaków.

118 wiersze
4.2 KiB

  1. unit uengShaderPartClass;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderPart, uengShaderCodeGenerator, uengShaderFileParser;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartClass = class(TengShaderCodeGenerator)
  11. { Code Loading & Storage }
  12. private { member }
  13. fName: String;
  14. fExtends: TStringList;
  15. private { getter }
  16. function GetExtends: TStrings;
  17. protected { virtual getter }
  18. function GetText: String; override;
  19. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  20. { General }
  21. public
  22. property Name: String read fName;
  23. property Extends: TStrings read GetExtends;
  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. implementation
  31. uses
  32. uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper;
  33. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34. //TengShaderPartClass///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  35. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. function TengShaderPartClass.GetExtends: TStrings;
  37. begin
  38. result := fExtends;
  39. end;
  40. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41. function TengShaderPartClass.GetText: String;
  42. var
  43. s: String;
  44. begin
  45. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + fName;
  46. if (fExtends.Count > 0) then begin
  47. result := result + ' ' + TOKEN_EXTENDS;
  48. for s in fExtends do
  49. result := result + ' ' + s;
  50. end;
  51. result := result + TOKEN_CHAR_END +
  52. inherited GetText +
  53. TOKEN_CHAR_BEGIN + TOKEN_END + TOKEN_CHAR_END;
  54. end;
  55. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. function TengShaderPartClass.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  57. var
  58. i: Integer;
  59. begin
  60. if (aParams[0].Name <> GetTokenName) then
  61. raise EengInvalidToken.Create(ClassName, aParams[0].Name, Line, Col, Filename);
  62. if (aParams.Count < 2) then
  63. raise EengInvalidParamterCount.Create(GetTokenName, 2, -1, Line, Col, Filename);
  64. with aParams[1] do begin
  65. if not IsValidIdentifier(Name) then
  66. raise EengInvalidIdentifier.Create(Name, Line, Col, Filename);
  67. fName := Name;
  68. end;
  69. if (aParams.Count > 2) then begin
  70. if (aParams.Count < 4) then
  71. raise EengInvalidParamterCount.Create(GetTokenName, 4, -1, Line, Col, Filename);
  72. if (aParams[2].Name <> TOKEN_EXTENDS) then with aParams[2] do
  73. raise EengInvalidParamter.Create(aParams[2].Name, TOKEN_EXTENDS, Line, Col, Filename);
  74. fExtends.Clear;
  75. for i := 3 to aParams.Count-1 do
  76. fExtends.Add(aParams[i].Name);
  77. end;
  78. // TODO fRoot.AddClass ?
  79. result := inherited ParseIntern(aArgs, aParams);
  80. result := CheckEndToken(aArgs, self);
  81. end;
  82. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  83. constructor TengShaderPartClass.Create(const aParent: TengShaderPart);
  84. begin
  85. inherited Create(aParent);
  86. fExtends := TStringList.Create;
  87. end;
  88. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  89. destructor TengShaderPartClass.Destroy;
  90. begin
  91. FreeAndNil(fExtends);
  92. inherited Destroy;
  93. end;
  94. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  95. class function TengShaderPartClass.GetTokenName: String;
  96. begin
  97. result := TOKEN_CLASS;
  98. end;
  99. end.