Вы не можете выбрать более 25 тем Темы должны начинаться с буквы или цифры, могут содержать дефисы(-) и должны содержать не более 35 символов.

160 строки
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(TengShaderPart)
  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;
  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..20] of CengShaderPart = (
  33. TengShaderPartCall,
  34. TengShaderPartClass,
  35. TengShaderPartDefine,
  36. TengShaderPartLineBreak,
  37. TengShaderPartCommandEnd,
  38. TengShaderPartComment,
  39. TengShaderPartEcho,
  40. TengShaderPartError,
  41. TengShaderPartMain,
  42. TengShaderPartIf,
  43. TengShaderPartInclude,
  44. TengShaderPartInherited,
  45. TengShaderPartFunc,
  46. TengShaderPartMessage,
  47. TengShaderPartMeta,
  48. TengShaderPartProc,
  49. TengShaderPartProperty,
  50. TengShaderPartUniform,
  51. TengShaderPartVar,
  52. TengShaderPartVarying,
  53. TengShaderPartWarning
  54. );
  55. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. //TengShaderPartCntr////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  57. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. procedure TengShaderPartCntr.AddChild(const aChild: TengShaderPart; const aPrepend: Boolean);
  59. begin
  60. if aPrepend
  61. then fChildren.PushFirst(aChild)
  62. else fChildren.PushLast(aChild);
  63. end;
  64. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  65. function TengShaderPartCntr.HandleToken(const aToken: String; const aArgs: TengParseArgs): String;
  66. var
  67. p: TengShaderPart;
  68. c: CengShaderPart;
  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.Clear;
  126. begin
  127. fChildren.Clear;
  128. end;
  129. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  130. constructor TengShaderPartCntr.Create(const aParent: TengShaderPart);
  131. begin
  132. inherited Create(aParent);
  133. fChildren := TengShaderPartList.Create(true);
  134. end;
  135. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  136. destructor TengShaderPartCntr.Destroy;
  137. begin
  138. FreeAndNil(fChildren);
  139. inherited Destroy;
  140. end;
  141. end.