Nevar pievienot vairāk kā 25 tēmas Tēmai ir jāsākas ar burtu vai ciparu, tā var saturēt domu zīmes ('-') un var būt līdz 35 simboliem gara.

141 rinda
5.2 KiB

  1. unit uengShaderPartMeta;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs, uengShaderFileTypes;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartMeta = class(TengShaderCodePart)
  11. { Code Loading & Storage }
  12. private
  13. fData: TengMetaData;
  14. protected
  15. function GetText: String; override;
  16. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  17. { Code Generation }
  18. public
  19. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  20. { General }
  21. public
  22. property Data: TengMetaData read fData;
  23. constructor Create(const aParent: TengShaderPart); override;
  24. destructor Destroy; override;
  25. { Classs Methods }
  26. public
  27. class function GetTokenName: String; override;
  28. end;
  29. implementation
  30. uses
  31. uengShaderFileConstants;
  32. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. //TengShaderPartMeta////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  35. function TengShaderPartMeta.GetText: String;
  36. var
  37. i: Integer;
  38. begin
  39. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + fData.Name;
  40. for i := 0 to fData.Values.Count-1 do begin
  41. if (PtrInt(fData.Values.Objects[i]) <> 0)
  42. then result := result + ' ' + TOKEN_CHAR_QUOTE + fData.Values[i] + TOKEN_CHAR_QUOTE
  43. else result := result + ' ' + fData.Values[i];
  44. end;
  45. result := result + TOKEN_CHAR_END;
  46. end;
  47. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. function TengShaderPartMeta.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  49. var
  50. i: Integer;
  51. t: TengMetaType;
  52. n: String;
  53. begin
  54. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  55. raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self);
  56. if (aParams.Count < 2) then
  57. raise EengInvalidParamterCount.Create(GetTokenName, 2, -1, self);
  58. result := '';
  59. n := aParams[1].Name;
  60. {.$VERSION}
  61. if (n = TOKEN_VERSION) then begin
  62. t := metaVersion;
  63. if (aParams.Count = 3) then begin
  64. if (aParams[2].Name <> VERSION_EXTRA_COMPAT) and not TryStrToInt(aParams[2].Name, i) then with aParams[2] do
  65. raise EengInvalidParamter.Create('version must be an number or "' + VERSION_EXTRA_COMPAT + '"', Line, Col, Filename, self);
  66. end else if (aParams.Count = 4) then begin
  67. if (aParams[2].Name <> VERSION_EXTRA_COMPAT) and not TryStrToInt(aParams[2].Name, i) then with aParams[2] do
  68. raise EengInvalidParamter.Create('version must be an number or "' + VERSION_EXTRA_COMPAT + '"', Line, Col, Filename, self);
  69. if (aParams[3].Name <> VERSION_EXTRA_COMPAT) then with aParams[3] do
  70. raise EengInvalidParamter.Create('only "' + VERSION_EXTRA_COMPAT + '" is alowed as second parameter', Line, Col, Filename, self);
  71. end else
  72. raise EengInvalidParamterCount.Create(GetTokenName, 3, 4, self);
  73. {.$EXTENSION}
  74. end else if (n = TOKEN_EXTENSION) then begin
  75. t := metaExtension;
  76. if (aParams.Count <> 4) then
  77. raise EengInvalidParamterCount.Create(GetTokenName, 4, self);
  78. {.$LAYOUT}
  79. end else if (n = TOKEN_LAYOUT) then begin
  80. t := metaLayout;
  81. if (aParams.Count <> 3) then
  82. raise EengInvalidParamterCount.Create(GetTokenName, 3, self);
  83. {.VALUES}
  84. end else
  85. t := metaNormal;
  86. fData := TengMetaData.Create(n, t);
  87. try
  88. for i := 2 to aParams.Count-1 do
  89. fData.Values.AddObject(aParams[i].Name, TObject(PtrInt(aParams[i].Quoted)));
  90. except
  91. FreeAndNil(fData);
  92. end;
  93. end;
  94. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  95. procedure TengShaderPartMeta.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  96. begin
  97. inherited GenerateCodeIntern(aArgs);
  98. aArgs.AddMeta(fData);
  99. end;
  100. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  101. constructor TengShaderPartMeta.Create(const aParent: TengShaderPart);
  102. begin
  103. inherited Create(aParent);
  104. fData := nil;
  105. end;
  106. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  107. destructor TengShaderPartMeta.Destroy;
  108. begin
  109. FreeAndNil(fData);
  110. inherited Destroy;
  111. end;
  112. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  113. class function TengShaderPartMeta.GetTokenName: String;
  114. begin
  115. result := TOKEN_META;
  116. end;
  117. end.