Você não pode selecionar mais de 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.

161 linhas
5.5 KiB

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