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.

184 lines
7.6 KiB

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