Vous ne pouvez pas sélectionner plus de 25 sujets Les noms de sujets doivent commencer par une lettre ou un nombre, peuvent contenir des tirets ('-') et peuvent comporter jusqu'à 35 caractères.

234 lignes
9.0 KiB

  1. unit uengShaderPart;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderFileParser, uengShaderFileTypes
  8. {$IFDEF USE_BITSPACE_UTILS}
  9. , uutlGenerics;
  10. {$ELSE}
  11. , fgl;
  12. {$ENDIF}
  13. type
  14. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  15. CengShaderPart = class of TengShaderPart;
  16. TengShaderPart = class(TIntfObjNoRefCount)
  17. { Nested Types }
  18. public type
  19. TEnumerator = class(TObject)
  20. private
  21. fOwner: TengShaderPart;
  22. fPosition: Integer;
  23. function GetCurrent: TengShaderPart;
  24. public
  25. property Current: TengShaderPart read GetCurrent;
  26. function MoveNext: Boolean;
  27. constructor Create(const aOwner: TengShaderPart);
  28. end;
  29. { Code Loading & Storage }
  30. private { members }
  31. fRoot: TengShaderPart;
  32. fParent: TengShaderPart;
  33. fLine: Integer;
  34. fCol: Integer;
  35. protected { virtual getter }
  36. function GetCount: Integer; virtual;
  37. function GetChild(const aIndex: Integer): TengShaderPart; virtual;
  38. function GetText: String; virtual;
  39. function GetFilename: String; virtual;
  40. function GetFileReader: IengShaderFileReader; virtual;
  41. function GetFileWriter: IengShaderFileWriter; virtual;
  42. protected { parse methodes }
  43. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; virtual;
  44. public
  45. function ParseText(const aArgs: TengParseArgs): String;
  46. { General }
  47. public { general methods }
  48. property Root: TengShaderPart read fRoot;
  49. property Parent: TengShaderPart read fParent;
  50. property Line: Integer read fLine;
  51. property Col: Integer read fCol;
  52. property Filename: String read GetFilename;
  53. property Text: String read GetText;
  54. property Count: Integer read GetCount;
  55. property FileReader: IengShaderFileReader read GetFileReader;
  56. property FileWriter: IengShaderFileWriter read GetFileWriter;
  57. property Children[const aIndex: Integer]: TengShaderPart read GetChild; default;
  58. function HasParent(const aType: CengShaderPart; const aIncludeSelf: Boolean = false): Boolean;
  59. function GetParent(const aType: CengShaderPart; out aPart): Boolean;
  60. function GetEnumerator: TEnumerator;
  61. constructor Create(const aParent: TengShaderPart); virtual;
  62. { Class Methods }
  63. public
  64. class function GetTokenName: String; virtual;
  65. class function CheckToken(const aToken: String): Boolean; virtual;
  66. class procedure Validate(const aArgs: TengParseArgs; const aParent: TengShaderPart); virtual;
  67. end;
  68. TengShaderPartList = specialize TutlSimpleList<TengShaderPart>;
  69. implementation
  70. uses
  71. uengShaderFileConstants;
  72. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  73. //TengShaderPart.TEnumerator////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  74. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  75. function TengShaderPart.TEnumerator.GetCurrent: TengShaderPart;
  76. begin
  77. result := fOwner[fPosition];
  78. end;
  79. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  80. function TengShaderPart.TEnumerator.MoveNext: Boolean;
  81. begin
  82. inc(fPosition);
  83. result := (fPosition < fOwner.Count);
  84. end;
  85. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. constructor TengShaderPart.TEnumerator.Create(const aOwner: TengShaderPart);
  87. begin
  88. inherited Create;
  89. fOwner := aOwner;
  90. fPosition := -1;
  91. end;
  92. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. //TengShaderPart////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  95. function TengShaderPart.GetCount: Integer;
  96. begin
  97. result := 0;
  98. end;
  99. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  100. function TengShaderPart.{%H-}GetChild(const aIndex: Integer): TengShaderPart;
  101. begin
  102. EengShaderPartInternal.Create('this part does not have any children');
  103. end;
  104. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  105. function TengShaderPart.GetText: String;
  106. begin
  107. result := ''; //DUMMY
  108. end;
  109. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  110. function TengShaderPart.GetFilename: String;
  111. begin
  112. if Assigned(fParent)
  113. then result := fParent.Filename
  114. else result := UNKNOWN_FILENAME;
  115. end;
  116. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  117. function TengShaderPart.GetFileReader: IengShaderFileReader;
  118. begin
  119. if Assigned(fParent)
  120. then result := fParent.GetFileReader
  121. else result := nil;
  122. end;
  123. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  124. function TengShaderPart.GetFileWriter: IengShaderFileWriter;
  125. begin
  126. if Assigned(fParent)
  127. then result := fParent.GetFileWriter
  128. else result := nil;
  129. end;
  130. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  131. function TengShaderPart.ParseText(const aArgs: TengParseArgs): String;
  132. var
  133. params: TengTokenParameterList;
  134. begin
  135. params := TengTokenParameterList.Create(Filename);
  136. try
  137. fCol := aArgs.Col;
  138. fLine := aArgs.Line;
  139. if (GetTokenName <> '') then
  140. aArgs.ExtractToken(params);
  141. result := ParseIntern(aArgs, params);
  142. finally
  143. FreeAndNil(params);
  144. end;
  145. end;
  146. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  147. function TengShaderPart.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  148. begin
  149. result := ''; // DUMMY
  150. end;
  151. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  152. function TengShaderPart.HasParent(const aType: CengShaderPart; const aIncludeSelf: Boolean): Boolean;
  153. var
  154. p: TengShaderPart;
  155. begin
  156. result := (aIncludeSelf and (self is aType)) or GetParent(aType, p);
  157. end;
  158. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  159. function TengShaderPart.GetParent(const aType: CengShaderPart; out aPart): Boolean;
  160. begin
  161. result := true;
  162. if (fParent is aType) then
  163. TengShaderPart(aPart) := fParent
  164. else if Assigned(fParent) then
  165. result := fParent.GetParent(aType, aPart)
  166. else
  167. result := false;
  168. end;
  169. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  170. function TengShaderPart.GetEnumerator: TEnumerator;
  171. begin
  172. result := TEnumerator.Create(self);
  173. end;
  174. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  175. constructor TengShaderPart.Create(const aParent: TengShaderPart);
  176. begin
  177. inherited Create;
  178. fParent := aParent;
  179. if Assigned(fParent)
  180. then fRoot := fParent.Root
  181. else fRoot := nil;
  182. end;
  183. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  184. class function TengShaderPart.GetTokenName: String;
  185. begin
  186. result := ''; // DUMMY
  187. end;
  188. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  189. class function TengShaderPart.CheckToken(const aToken: String): Boolean;
  190. begin
  191. result := (aToken = GetTokenName);
  192. end;
  193. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  194. class procedure TengShaderPart.Validate(const aArgs: TengParseArgs; const aParent: TengShaderPart);
  195. begin
  196. // DUMMY
  197. end;
  198. end.