Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

116 řádky
4.8 KiB

  1. unit uengShaderPartKeyValuePair;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils, variants,
  7. uengShaderPart, uengShaderFileParser;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartStatic = class;
  11. TengShaderPartKeyValuePair = class(TengShaderCodePart)
  12. { Code Loading & Storage }
  13. private
  14. fName: String;
  15. fValue: Variant;
  16. fValueName: String;
  17. protected
  18. function GetText: String; override;
  19. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  20. { General }
  21. public
  22. property Name: String read fName;
  23. property Value: Variant read fValue;
  24. property ValueName: String read fValueName;
  25. end;
  26. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  27. TengShaderPartProperty = class(TengShaderPartKeyValuePair)
  28. { Class Methods }
  29. public
  30. class function GetTokenName: String; override;
  31. end;
  32. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. TengShaderPartStatic = class(TengShaderPartKeyValuePair)
  34. { Class Methods }
  35. public
  36. class function GetTokenName: String; override;
  37. end;
  38. implementation
  39. uses
  40. uengShaderFileConstants, uengShaderFileTypes, uengShaderFileHelper;
  41. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42. //TengShaderPartKeyValuePair////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  43. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. function TengShaderPartKeyValuePair.GetText: String;
  45. begin
  46. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ' + fName;
  47. if (fValueName <> '') then
  48. result := result + ' ' + fValueName
  49. else if (fValue <> Unassigned) then
  50. result := result + ' ' + TOKEN_CHAR_QUOTE + String(fValue) + TOKEN_CHAR_QUOTE;
  51. result := result + TOKEN_CHAR_END;
  52. end;
  53. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  54. function TengShaderPartKeyValuePair.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  55. var
  56. sr: TengSearchResults;
  57. begin
  58. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  59. raise EengInvalidToken.Create(ClassName, GetTokenName, Line, Col, Filename, self);
  60. if (aParams.Count < 2) or (aParams.Count > 3) then
  61. raise EengInvalidParamterCount.Create(GetTokenName, 2, 3, self);
  62. result := '';
  63. fName := aParams[1].Name;
  64. if not IsValidIdentifier(fName) then with aParams[1] do
  65. raise EengInvalidIdentifier.Create(fName, Line, Col, Filename, self);
  66. if (aParams.Count >= 3) then
  67. if aParams[2].Quoted then begin
  68. fValue := aParams[2].Name;
  69. fValueName := '';
  70. end else begin
  71. fValueName := aParams[2].Name;
  72. sr := TkvpSearchResults.Create(fValueName, true, false);
  73. try
  74. Find(SEARCH_FLAG_CURRENT_SCOPE, sr);
  75. fValue := (ExtractSearchResult(self, fValueName, sr) as TengShaderPartStatic).Value;
  76. finally
  77. FreeAndNil(sr);
  78. end;
  79. end
  80. else begin
  81. fValue := Unassigned;
  82. fValueName := '';
  83. end;
  84. end;
  85. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  86. //TengShaderPartProperty////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. class function TengShaderPartProperty.GetTokenName: String;
  89. begin
  90. result := TOKEN_PROPERTY;
  91. end;
  92. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. //TengShaderPartStatic//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  95. class function TengShaderPartStatic.GetTokenName: String;
  96. begin
  97. result := TOKEN_STATIC;
  98. end;
  99. end.