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.

258 lines
11 KiB

  1. unit uengShaderPartParameter;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderPart, uengShaderCodePart, uengShaderFileParser, uengShaderGeneratorArgs;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartParameter = class(TengShaderCodePart)
  11. { Code Loading & Storage }
  12. private
  13. fName: String;
  14. fType: String;
  15. protected
  16. function GetText: String; override;
  17. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  18. { Code Generation }
  19. public
  20. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  21. { General }
  22. public
  23. property Name: String read fName;
  24. property Typ: String read fType;
  25. end;
  26. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  27. TengShaderPartVar = class(TengShaderPartParameter)
  28. { Code Loading & Storage }
  29. private
  30. fDefaultValue: String;
  31. protected
  32. function GetText: String; override;
  33. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  34. { Code Generation }
  35. public
  36. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  37. { General }
  38. public
  39. property DefaultValue: String read fDefaultValue;
  40. { Class Methods }
  41. public
  42. class function GetTokenName: String; override;
  43. end;
  44. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  45. TengShaderPartVarying = class(TengShaderPartParameter)
  46. { Code Generation }
  47. public
  48. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  49. { Class Methods }
  50. public
  51. class function GetTokenName: String; override;
  52. end;
  53. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  54. TengShaderPartUniform = class(TengShaderPartParameter)
  55. { Code Generation }
  56. public
  57. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  58. { Class Methods }
  59. public
  60. class function GetTokenName: String; override;
  61. end;
  62. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. TengShaderPartConst = class(TengShaderPartParameter)
  64. { Code Loading & Storage }
  65. private
  66. fValue: String;
  67. protected
  68. function GetText: String; override;
  69. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  70. { Code Generation }
  71. public
  72. procedure GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs); override;
  73. { General }
  74. public
  75. property Value: String read fValue;
  76. { Class Methods }
  77. public
  78. class function GetTokenName: String; override;
  79. end;
  80. implementation
  81. uses
  82. uengShaderFileConstants, uengShaderFileTypes;
  83. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. //TengShaderPartParameter///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. function TengShaderPartParameter.GetText: String;
  87. begin
  88. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' +
  89. TOKEN_CHAR_QUOTE + fType + TOKEN_CHAR_QUOTE + ' ' +
  90. TOKEN_CHAR_QUOTE + fName + TOKEN_CHAR_QUOTE +
  91. TOKEN_CHAR_END;
  92. end;
  93. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. function TengShaderPartParameter.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  95. begin
  96. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  97. raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self);
  98. if (aParams.Count <> 3) then
  99. raise EengInvalidParamterCount.Create(GetTokenName, 3, self);
  100. result := '';
  101. fType := aParams[1].Name;
  102. fName := aParams[2].Name;
  103. end;
  104. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  105. procedure TengShaderPartParameter.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  106. begin
  107. if (gfAddParameterItem in aArgs.Flags) then begin
  108. inherited GenerateCodeIntern(aArgs);
  109. aArgs.AddParameter(self);
  110. end;
  111. end;
  112. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  113. //TengShaderPartVar/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  114. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  115. function TengShaderPartVar.GetText: String;
  116. begin
  117. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' +
  118. TOKEN_CHAR_QUOTE + fType + TOKEN_CHAR_QUOTE + ' ' +
  119. TOKEN_CHAR_QUOTE + fName + TOKEN_CHAR_QUOTE;
  120. if (fDefaultValue <> '') then
  121. result := result + ' ' + TOKEN_CHAR_QUOTE + fDefaultValue + TOKEN_CHAR_QUOTE;
  122. result := result + TOKEN_CHAR_END;
  123. end;
  124. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  125. function TengShaderPartVar.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  126. begin
  127. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  128. raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self);
  129. if (aParams.Count < 3) or (aParams.Count > 4) then
  130. raise EengInvalidParamterCount.Create(GetTokenName, 3, 4, self);
  131. result := '';
  132. fType := aParams[1].Name;
  133. fName := aParams[2].Name;
  134. if (aParams.Count >= 4) then
  135. fDefaultValue := aParams[3].Name
  136. else
  137. fDefaultValue := '';
  138. end;
  139. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  140. procedure TengShaderPartVar.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  141. begin
  142. inherited GenerateCodeIntern(aArgs);
  143. if (gfGenerateParameterCode in aArgs.Flags) then begin
  144. aArgs.AddText(format('%-*s %s', [aArgs.MaxParameterLength, fType, fName]));
  145. if (fDefaultValue <> '') then
  146. aArgs.AddText(' = ' + fDefaultValue);
  147. aArgs.AddCommandEnd(';');
  148. end;
  149. end;
  150. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  151. class function TengShaderPartVar.GetTokenName: String;
  152. begin
  153. result := TOKEN_VAR;
  154. end;
  155. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  156. //TengShaderPartVarying/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  157. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  158. procedure TengShaderPartVarying.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  159. begin
  160. inherited GenerateCodeIntern(aArgs);
  161. if (gfGenerateParameterCode in aArgs.Flags) then
  162. aArgs.AddText(Format('varying %-*s %s;', [aArgs.MaxParameterLength, fType, fName]));
  163. end;
  164. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  165. class function TengShaderPartVarying.GetTokenName: String;
  166. begin
  167. result := TOKEN_VARYING;
  168. end;
  169. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  170. //TengShaderPartUniform/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  171. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  172. procedure TengShaderPartUniform.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  173. begin
  174. inherited GenerateCodeIntern(aArgs);
  175. if (gfGenerateParameterCode in aArgs.Flags) then
  176. aArgs.AddText(Format('uniform %-*s %s;', [aArgs.MaxParameterLength, fType, fName]));
  177. end;
  178. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  179. class function TengShaderPartUniform.GetTokenName: String;
  180. begin
  181. result := TOKEN_UNIFORM;
  182. end;
  183. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  184. //TengShaderPartConst///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  185. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  186. function TengShaderPartConst.GetText: String;
  187. begin
  188. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' +
  189. TOKEN_CHAR_QUOTE + fType + TOKEN_CHAR_QUOTE + ' ' +
  190. TOKEN_CHAR_QUOTE + fName + TOKEN_CHAR_QUOTE + ' ' +
  191. TOKEN_CHAR_QUOTE + fValue + TOKEN_CHAR_QUOTE +
  192. TOKEN_CHAR_END;
  193. end;
  194. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  195. function TengShaderPartConst.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  196. begin
  197. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  198. raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self);
  199. if (aParams.Count <> 4) then
  200. raise EengInvalidParamterCount.Create(GetTokenName, 4, self);
  201. result := '';
  202. fType := aParams[1].Name;
  203. fName := aParams[2].Name;
  204. fValue := aParams[3].Name
  205. end;
  206. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  207. procedure TengShaderPartConst.GenerateCodeIntern(const aArgs: TengShaderGeneratorArgs);
  208. begin
  209. inherited GenerateCodeIntern(aArgs);
  210. if (gfGenerateParameterCode in aArgs.Flags) then
  211. aArgs.AddText(Format('const %*s %s;', [aArgs.MaxParameterLength, fType, fName]));
  212. end;
  213. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  214. class function TengShaderPartConst.GetTokenName: String;
  215. begin
  216. result := TOKEN_CONST;
  217. end;
  218. end.