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.

198 lines
8.2 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. public
  49. property Value: Variant read fValue write fValue;
  50. procedure ApplyValue;
  51. constructor Create;
  52. end;
  53. TengShaderPartPropertyMap = class(specialize TutlMap<string, TengShaderPartPropertyList>)
  54. public
  55. procedure ApplyValues;
  56. end;
  57. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  58. TengShaderPartStatic = class(TengShaderPartKeyValuePair)
  59. { Class Methods }
  60. public
  61. class function GetTokenName: String; override;
  62. end;
  63. implementation
  64. uses
  65. uengShaderFile, uengShaderPartScope, uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper;
  66. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  67. //TengShaderPartPropertyList/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  69. procedure TengShaderPartPropertyList.ApplyValue;
  70. var
  71. p: TengShaderPartProperty;
  72. begin
  73. for p in self do
  74. p.Value := fValue;
  75. end;
  76. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  77. constructor TengShaderPartPropertyList.Create;
  78. begin
  79. inherited Create(false);
  80. end;
  81. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  82. //TengShaderPartPropertyMap/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  83. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  84. procedure TengShaderPartPropertyMap.ApplyValues;
  85. var
  86. l: TengShaderPartPropertyList;
  87. begin
  88. for l in self do
  89. l.ApplyValue;
  90. end;
  91. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  92. //TengShaderPartKeyValuePair////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. function TengShaderPartKeyValuePair.GetText: String;
  95. begin
  96. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + fName;
  97. if (fValueName <> '') then
  98. result := result + ' ' + fValueName
  99. else if (fValue <> Unassigned) then
  100. result := result + ' ' + TOKEN_CHAR_QUOTE + String(fValue) + TOKEN_CHAR_QUOTE;
  101. result := result + TOKEN_CHAR_END;
  102. end;
  103. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  104. function TengShaderPartKeyValuePair.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  105. var
  106. sr: TengSearchResults;
  107. walker: TengKeyValuePairSearchWalker;
  108. begin
  109. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  110. raise EengInvalidToken.Create(ClassName, GetTokenName, Line, Col, Filename, self);
  111. if (aParams.Count < 2) or (aParams.Count > 3) then
  112. raise EengInvalidParamterCount.Create(GetTokenName, 2, 3, self);
  113. result := '';
  114. fName := aParams[1].Name;
  115. if not IsValidIdentifier(fName) then with aParams[1] do
  116. raise EengInvalidIdentifier.Create(fName, Line, Col, Filename, self);
  117. if (aParams.Count >= 3) then
  118. if aParams[2].Quoted then begin
  119. fDefaultValue := aParams[2].Name;
  120. fValue := fDefaultValue;
  121. fValueName := '';
  122. end else begin
  123. fValueName := aParams[2].Name;
  124. sr := TengSearchResults.Create;
  125. walker := TengKeyValuePairSearchWalker.Create(sr);
  126. try
  127. walker.Name := fValueName;
  128. walker.ResultTypes := CengShaderPartArr.Create(TengShaderPartStatic);
  129. walker.ChildrenDoNotLeave := CengShaderPartArr.Create(TengShaderPartScope);
  130. walker.ChildrenForceLeave := CengShaderPartArr.Create(TengShaderFile);
  131. walker.ParentsDoNotLeave := CengShaderPartArr.Create(TengShaderFile);
  132. walker.SearchFlags := [
  133. sfSearchChildrenLazy,
  134. sfSearchParents
  135. ];
  136. walker.Run(self);
  137. fDefaultValue := (ExtractSearchResult(self, fValueName, sr) as TengShaderPartStatic).Value;
  138. fValue := fDefaultValue;
  139. finally
  140. FreeAndNil(walker);
  141. FreeAndNil(sr);
  142. end;
  143. end
  144. else begin
  145. fValue := Unassigned;
  146. fValueName := '';
  147. end;
  148. end;
  149. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  150. constructor TengShaderPartKeyValuePair.Create(const aParent: TengShaderPart; const aName: String; const aValue: Variant);
  151. begin
  152. inherited Create(aParent);
  153. fName := aName;
  154. fValueName := '';
  155. fValue := aValue;
  156. fDefaultValue := aValue;
  157. end;
  158. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  159. //TengShaderPartProperty////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  160. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  161. class function TengShaderPartProperty.GetTokenName: String;
  162. begin
  163. result := TOKEN_PROPERTY;
  164. end;
  165. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  166. //TengShaderPartStatic//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  167. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  168. class function TengShaderPartStatic.GetTokenName: String;
  169. begin
  170. result := TOKEN_STATIC;
  171. end;
  172. end.