Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

191 linhas
6.3 KiB

  1. unit uengShaderPartCntr;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartCntr = class(TengShaderCodePart)
  11. { Code Loading & Storage }
  12. private
  13. fChildren: TengShaderCodePartList;
  14. function HandleToken(const aToken: String; const aArgs: TengParseArgs): String;
  15. protected { virtual getter }
  16. function GetCount: Integer; override;
  17. function GetChild(const aIndex: Integer): TengShaderPart; override;
  18. function GetText: String; override;
  19. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  20. public
  21. procedure AddChild(const aChild: TengShaderCodePart; const aPrepend: Boolean = false);
  22. { Code Generation }
  23. public
  24. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  25. { General }
  26. public
  27. procedure Clear; virtual;
  28. constructor Create(const aParent: TengShaderPart); override;
  29. destructor Destroy; override;
  30. end;
  31. implementation
  32. uses
  33. uengShaderPartKeyValuePair, uengShaderPartClass, uengShaderPartMessage, uengShaderPartMeta,
  34. uengShaderPartCall, uengShaderPartProc, uengShaderPartText, uengShaderPartEcho, uengShaderPartIf,
  35. uengShaderPartInclude, uengShaderPartParameter, uengShaderPartComment, uengShaderFileConstants
  36. {$IFDEF SHADER_FILE_DEBUG}
  37. , uengShaderFileTypes
  38. {$ENDIF}
  39. ;
  40. const
  41. TOKEN_CLASSES: array[0..22] of CengShaderCodePart = (
  42. TengShaderPartCall,
  43. TengShaderPartClass,
  44. TengShaderPartConst,
  45. TengShaderPartStatic,
  46. TengShaderPartLineBreak,
  47. TengShaderPartCommandEnd,
  48. TengShaderPartComment,
  49. TengShaderPartEcho,
  50. TengShaderPartError,
  51. TengShaderPartMain,
  52. TengShaderPartIf,
  53. TengShaderPartInclude,
  54. TengShaderPartInherited,
  55. TengShaderPartFunc,
  56. TengShaderPartInfo,
  57. TengShaderPartMeta,
  58. TengShaderPartProc,
  59. TengShaderPartProperty,
  60. TengShaderPartThrow,
  61. TengShaderPartUniform,
  62. TengShaderPartVar,
  63. TengShaderPartVarying,
  64. TengShaderPartWarning
  65. );
  66. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  67. //TengShaderPartCntr////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  69. function TengShaderPartCntr.HandleToken(const aToken: String; const aArgs: TengParseArgs): String;
  70. var
  71. p: TengShaderCodePart;
  72. c: CengShaderCodePart;
  73. begin
  74. p := nil;
  75. for c in TOKEN_CLASSES do begin
  76. if c.CheckToken(aToken) then begin
  77. c.Validate(aArgs, self);
  78. p := c.Create(self);
  79. AddChild(p);
  80. break;
  81. end;
  82. end;
  83. if Assigned(p)
  84. then result := p.ParseText(aArgs)
  85. else result := aToken;
  86. end;
  87. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. function TengShaderPartCntr.GetCount: Integer;
  89. begin
  90. result := fChildren.Count;
  91. end;
  92. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. function TengShaderPartCntr.GetChild(const aIndex: Integer): TengShaderPart;
  94. begin
  95. result := fChildren[aIndex];
  96. end;
  97. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. function TengShaderPartCntr.GetText: String;
  99. var
  100. p: TengShaderPart;
  101. begin
  102. result := '';
  103. for p in self do
  104. result := result + p.Text;
  105. end;
  106. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  107. function TengShaderPartCntr.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  108. var
  109. TextObj: TengShaderPartText;
  110. begin
  111. result := '';
  112. fChildren.Clear;
  113. while not aArgs.EndOfFile and (result = '') do begin
  114. TextObj := TengShaderPartText.Create(self);
  115. try
  116. result := TextObj.ParseText(aArgs);
  117. if not TextObj.IsEmpty
  118. then AddChild(TextObj)
  119. else FreeAndNil(TextObj);
  120. except
  121. FreeAndNil(TextObj);
  122. raise;
  123. end;
  124. if (result <> '') then
  125. result := HandleToken(result, aArgs);
  126. end;
  127. end;
  128. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  129. procedure TengShaderPartCntr.AddChild(const aChild: TengShaderCodePart; const aPrepend: Boolean);
  130. begin
  131. if aPrepend
  132. then fChildren.PushFirst(aChild)
  133. else fChildren.PushLast(aChild);
  134. end;
  135. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  136. procedure TengShaderPartCntr.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  137. var
  138. p: TengShaderCodePart;
  139. s: String;
  140. begin
  141. s := GetTokenName;
  142. if (s = '') then
  143. s := ClassName;
  144. aArgs.AddToken(s);
  145. try
  146. for p in fChildren do
  147. p.GenerateCodeIntern(aArgs);
  148. finally
  149. aArgs.AddToken(TOKEN_END);
  150. end;
  151. end;
  152. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  153. procedure TengShaderPartCntr.Clear;
  154. begin
  155. fChildren.Clear;
  156. end;
  157. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  158. constructor TengShaderPartCntr.Create(const aParent: TengShaderPart);
  159. begin
  160. inherited Create(aParent);
  161. fChildren := TengShaderCodePartList.Create(true);
  162. end;
  163. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  164. destructor TengShaderPartCntr.Destroy;
  165. begin
  166. FreeAndNil(fChildren);
  167. inherited Destroy;
  168. end;
  169. end.