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.

202 lines
8.3 KiB

  1. unit uengShaderPartKeyValuePair;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils, variants,
  7. uengShaderPart, uengShaderCodePart, uengShaderFileParser
  8. {$IFDEF SHADER_FILE_USE_BITSPACE_UTILS}
  9. , uutlGenerics
  10. {$ELSE}
  11. , uengShaderFileGenerics
  12. {$ENDIF}
  13. ;
  14. type
  15. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  16. TengShaderPartStatic = class;
  17. TengShaderPartKeyValuePair = class(TengShaderCodePart)
  18. { Code Loading & Storage }
  19. private
  20. fName: String;
  21. fValueName: String;
  22. fDefaultValue: Variant;
  23. protected
  24. fValue: Variant;
  25. function GetText: String; override;
  26. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  27. { General }
  28. public
  29. property Name: String read fName;
  30. property ValueName: String read fValueName;
  31. property Value: Variant read fValue;
  32. property DefaultValue: Variant read fDefaultValue;
  33. constructor Create(const aParent: TengShaderPart; const aName: String; const aValue: Variant); overload;
  34. end;
  35. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. TengShaderPartProperty = class(TengShaderPartKeyValuePair)
  37. { General }
  38. public
  39. property Value: Variant read fValue write fValue;
  40. { Class Methods }
  41. public
  42. class function GetTokenName: String; override;
  43. end;
  44. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  45. TengShaderPartPropertyList = class(specialize TutlList<TengShaderPartProperty>)
  46. private
  47. fValue: Variant;
  48. fDefaultValue: Variant;
  49. public
  50. property Value: Variant read fValue write fValue;
  51. property DefaultValue: Variant read fDefaultValue write fDefaultValue;
  52. procedure ApplyValue;
  53. constructor Create;
  54. end;
  55. TengShaderPartPropertyMap = class(specialize TutlMap<string, TengShaderPartPropertyList>)
  56. public
  57. procedure ApplyValues;
  58. end;
  59. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. TengShaderPartStatic = class(TengShaderPartKeyValuePair)
  61. { Class Methods }
  62. public
  63. class function GetTokenName: String; override;
  64. end;
  65. implementation
  66. uses
  67. uengShaderFile, uengShaderPartScope, uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper;
  68. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  69. //TengShaderPartPropertyList/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  70. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  71. procedure TengShaderPartPropertyList.ApplyValue;
  72. var
  73. p: TengShaderPartProperty;
  74. begin
  75. for p in self do
  76. p.Value := fValue;
  77. end;
  78. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. constructor TengShaderPartPropertyList.Create;
  80. begin
  81. inherited Create(false);
  82. end;
  83. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. //TengShaderPartPropertyMap/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. procedure TengShaderPartPropertyMap.ApplyValues;
  87. var
  88. l: TengShaderPartPropertyList;
  89. begin
  90. for l in self do
  91. l.ApplyValue;
  92. end;
  93. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. //TengShaderPartKeyValuePair////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  95. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. function TengShaderPartKeyValuePair.GetText: String;
  97. begin
  98. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + fName;
  99. if (fValueName <> '') then
  100. result := result + ' ' + fValueName
  101. else if (fValue <> Unassigned) then
  102. result := result + ' ' + TOKEN_CHAR_QUOTE + String(fValue) + TOKEN_CHAR_QUOTE;
  103. result := result + TOKEN_CHAR_END;
  104. end;
  105. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  106. function TengShaderPartKeyValuePair.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  107. var
  108. sr: TengSearchResults;
  109. walker: TengKeyValuePairSearchWalker;
  110. begin
  111. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  112. raise EengInvalidToken.Create(ClassName, GetTokenName, Line, Col, Filename, self);
  113. if (aParams.Count < 2) or (aParams.Count > 3) then
  114. raise EengInvalidParamterCount.Create(GetTokenName, 2, 3, self);
  115. result := '';
  116. fName := aParams[1].Name;
  117. if not IsValidIdentifier(fName) then with aParams[1] do
  118. raise EengInvalidIdentifier.Create(fName, Line, Col, Filename, self);
  119. if (aParams.Count >= 3) then
  120. if aParams[2].Quoted then begin
  121. fDefaultValue := aParams[2].Name;
  122. fValue := fDefaultValue;
  123. fValueName := '';
  124. end else begin
  125. fValueName := aParams[2].Name;
  126. sr := TengSearchResults.Create;
  127. walker := TengKeyValuePairSearchWalker.Create(sr);
  128. try
  129. walker.Name := fValueName;
  130. walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartStatic);
  131. walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope);
  132. walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile);
  133. walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderFile);
  134. walker.SearchFlags := [
  135. sfSearchChildrenLazy,
  136. sfSearchParents
  137. ];
  138. walker.Run(self);
  139. fDefaultValue := (ExtractSearchResult(self, fValueName, sr) as TengShaderPartStatic).Value;
  140. fValue := fDefaultValue;
  141. finally
  142. FreeAndNil(walker);
  143. FreeAndNil(sr);
  144. end;
  145. end
  146. else begin
  147. fValue := Unassigned;
  148. fValueName := '';
  149. end;
  150. end;
  151. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  152. constructor TengShaderPartKeyValuePair.Create(const aParent: TengShaderPart; const aName: String; const aValue: Variant);
  153. begin
  154. inherited Create(aParent);
  155. fName := aName;
  156. fValueName := '';
  157. fValue := aValue;
  158. fDefaultValue := aValue;
  159. end;
  160. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  161. //TengShaderPartProperty////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  162. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  163. class function TengShaderPartProperty.GetTokenName: String;
  164. begin
  165. result := TOKEN_PROPERTY;
  166. end;
  167. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  168. //TengShaderPartStatic//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  169. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  170. class function TengShaderPartStatic.GetTokenName: String;
  171. begin
  172. result := TOKEN_STATIC;
  173. end;
  174. end.