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.

176 line
6.5 KiB

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