Não pode escolher mais do que 25 tópicos Os tópicos devem começar com uma letra ou um número, podem incluir traços ('-') e podem ter até 35 caracteres.

133 linhas
5.7 KiB

  1. unit uengShaderPartInclude;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderPart, uengShaderFile, uengShaderFileParser, uengShaderFileTypes;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartInclude = class(TengShaderPart)
  11. { Code Loading & Storage }
  12. private
  13. fShaderFile: TengShaderFile;
  14. fIncludeFile: String;
  15. fAbsoluteFile: String;
  16. procedure LoadShaderFile(const aFlags: TengShaderFileLoadFlags);
  17. protected
  18. function GetCount: Integer; override;
  19. function GetChild(const aIndex: Integer): TengShaderPart; override;
  20. function GetText: String; override;
  21. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  22. { General }
  23. protected
  24. procedure FindIntern(aFlags: TengShaderFileSearchFlags; aDepth: Integer; aTypes: array of CengShaderPart; const aList: TSearchList); override;
  25. public
  26. property IncludeFile: String read fIncludeFile;
  27. procedure SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter = nil);
  28. constructor Create(const aParent: TengShaderPart); override;
  29. destructor Destroy; override;
  30. { Class Methods }
  31. public
  32. class function GetTokenName: String; override;
  33. end;
  34. implementation
  35. uses
  36. FileUtil,
  37. uengShaderFileConstants;
  38. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. //TengShaderPartInclude/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41. procedure TengShaderPartInclude.LoadShaderFile(const aFlags: TengShaderFileLoadFlags);
  42. begin
  43. if not Assigned(fShaderFile) then
  44. fShaderFile := TengShaderFile.Create(self);
  45. if (fShaderFile.Filename <> fAbsoluteFile) then
  46. fShaderFile.LoadFromFile(fAbsoluteFile, aFlags);
  47. end;
  48. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  49. function TengShaderPartInclude.GetCount: Integer;
  50. begin
  51. if Assigned(fShaderFile)
  52. then result := 1
  53. else result := 0;
  54. end;
  55. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. function TengShaderPartInclude.GetChild(const aIndex: Integer): TengShaderPart;
  57. begin
  58. if Assigned(fShaderFile) and (aIndex = 0)
  59. then result := fShaderFile
  60. else raise EengOutOfRange.Create(0, Count-1, aIndex, Line, Col, Filename);
  61. end;
  62. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  63. function TengShaderPartInclude.GetText: String;
  64. begin
  65. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ''' + fIncludeFile + '''' + TOKEN_CHAR_END;
  66. end;
  67. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68. function TengShaderPartInclude.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  69. begin
  70. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  71. raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename);
  72. if (aParams.Count <> 2) then
  73. raise EengInvalidParamterCount.Create(GetTokenName, 2, Line, Col, Filename);
  74. fIncludeFile := aParams[1].Name;
  75. fAbsoluteFile := CreateAbsolutePath(fIncludeFile, ExtractFilePath(Filename));
  76. result := '';
  77. if not (lfLazyInclude in aArgs.Flags) then
  78. LoadShaderFile(aArgs.Flags);
  79. end;
  80. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  81. procedure TengShaderPartInclude.FindIntern(aFlags: TengShaderFileSearchFlags; aDepth: Integer; aTypes: array of CengShaderPart; const aList: TSearchList);
  82. begin
  83. if (sfCurrentFileOnly in aFlags) then
  84. exclude(aFlags, sfSearchChildren);
  85. inherited FindIntern(aFlags, aDepth, aTypes, aList);
  86. end;
  87. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. procedure TengShaderPartInclude.SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter);
  89. begin
  90. LoadShaderFile([]);
  91. fIncludeFile := Format('%p_', [Pointer(fShaderFile)]) + ExtractFileName(fIncludeFile);
  92. fAbsoluteFile := CreateAbsolutePath(fIncludeFile, ExtractFilePath(aFilename));
  93. fShaderFile.SaveToFile(fAbsoluteFile, aFileWriter);
  94. end;
  95. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  96. constructor TengShaderPartInclude.Create(const aParent: TengShaderPart);
  97. begin
  98. inherited Create(aParent);
  99. fShaderFile := nil;
  100. end;
  101. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. destructor TengShaderPartInclude.Destroy;
  103. begin
  104. FreeAndNil(fShaderFile);
  105. inherited Destroy;
  106. end;
  107. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  108. class function TengShaderPartInclude.GetTokenName: String;
  109. begin
  110. result := TOKEN_INCLUDE;
  111. end;
  112. end.