選択できるのは25トピックまでです。 トピックは、先頭が英数字で、英数字とダッシュ('-')を使用した35文字以内のものにしてください。

114 行
4.7 KiB

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