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.

137 regels
5.0 KiB

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