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.

187 line
6.2 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. const
  37. TOKEN_CLASSES: array[0..22] of CengShaderCodePart = (
  38. TengShaderPartCall,
  39. TengShaderPartClass,
  40. TengShaderPartConst,
  41. TengShaderPartStatic,
  42. TengShaderPartLineBreak,
  43. TengShaderPartCommandEnd,
  44. TengShaderPartComment,
  45. TengShaderPartEcho,
  46. TengShaderPartError,
  47. TengShaderPartMain,
  48. TengShaderPartIf,
  49. TengShaderPartInclude,
  50. TengShaderPartInherited,
  51. TengShaderPartFunc,
  52. TengShaderPartInfo,
  53. TengShaderPartMeta,
  54. TengShaderPartProc,
  55. TengShaderPartProperty,
  56. TengShaderPartThrow,
  57. TengShaderPartUniform,
  58. TengShaderPartVar,
  59. TengShaderPartVarying,
  60. TengShaderPartWarning
  61. );
  62. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. //TengShaderPartCntr////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. function TengShaderPartCntr.HandleToken(const aToken: String; const aArgs: TengParseArgs): String;
  66. var
  67. p: TengShaderCodePart;
  68. c: CengShaderCodePart;
  69. begin
  70. p := nil;
  71. for c in TOKEN_CLASSES do begin
  72. if c.CheckToken(aToken) then begin
  73. c.Validate(aArgs, self);
  74. p := c.Create(self);
  75. AddChild(p);
  76. break;
  77. end;
  78. end;
  79. if Assigned(p)
  80. then result := p.ParseText(aArgs)
  81. else result := aToken;
  82. end;
  83. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. function TengShaderPartCntr.GetCount: Integer;
  85. begin
  86. result := fChildren.Count;
  87. end;
  88. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  89. function TengShaderPartCntr.GetChild(const aIndex: Integer): TengShaderPart;
  90. begin
  91. result := fChildren[aIndex];
  92. end;
  93. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. function TengShaderPartCntr.GetText: String;
  95. var
  96. p: TengShaderPart;
  97. begin
  98. result := '';
  99. for p in self do
  100. result := result + p.Text;
  101. end;
  102. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  103. function TengShaderPartCntr.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  104. var
  105. TextObj: TengShaderPartText;
  106. begin
  107. result := '';
  108. fChildren.Clear;
  109. while not aArgs.EndOfFile and (result = '') do begin
  110. TextObj := TengShaderPartText.Create(self);
  111. try
  112. result := TextObj.ParseText(aArgs);
  113. if not TextObj.IsEmpty
  114. then AddChild(TextObj)
  115. else FreeAndNil(TextObj);
  116. except
  117. FreeAndNil(TextObj);
  118. raise;
  119. end;
  120. if (result <> '') then
  121. result := HandleToken(result, aArgs);
  122. end;
  123. end;
  124. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125. procedure TengShaderPartCntr.AddChild(const aChild: TengShaderCodePart; const aPrepend: Boolean);
  126. begin
  127. if aPrepend
  128. then fChildren.PushFirst(aChild)
  129. else fChildren.PushLast(aChild);
  130. end;
  131. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  132. procedure TengShaderPartCntr.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  133. var
  134. p: TengShaderCodePart;
  135. s: String;
  136. begin
  137. s := GetTokenName;
  138. if (s = '') then
  139. s := ClassName;
  140. aArgs.AddToken(s);
  141. try
  142. for p in fChildren do
  143. p.GenerateCodeIntern(aArgs);
  144. finally
  145. aArgs.AddToken(TOKEN_END);
  146. end;
  147. end;
  148. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  149. procedure TengShaderPartCntr.Clear;
  150. begin
  151. fChildren.Clear;
  152. end;
  153. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  154. constructor TengShaderPartCntr.Create(const aParent: TengShaderPart);
  155. begin
  156. inherited Create(aParent);
  157. fChildren := TengShaderCodePartList.Create(true);
  158. end;
  159. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  160. destructor TengShaderPartCntr.Destroy;
  161. begin
  162. FreeAndNil(fChildren);
  163. inherited Destroy;
  164. end;
  165. end.