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.

123 line
5.0 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(TengShaderCodePart)
  11. { Code Loading & Storage }
  12. private
  13. fShaderFile: TengShaderFile;
  14. fIncludeFile: String;
  15. fAbsoluteFile: String;
  16. procedure LoadShaderFile;
  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. public
  24. property IncludeFile: String read fIncludeFile;
  25. property ShaderFile: TengShaderFile read fShaderFile;
  26. procedure SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter = nil);
  27. constructor Create(const aParent: TengShaderPart); override;
  28. destructor Destroy; override;
  29. { Class Methods }
  30. public
  31. class function GetTokenName: String; override;
  32. end;
  33. implementation
  34. uses
  35. FileUtil,
  36. uengShaderFileConstants;
  37. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  38. //TengShaderPartInclude/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  39. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. procedure TengShaderPartInclude.LoadShaderFile;
  41. begin
  42. if not Assigned(fShaderFile) then
  43. fShaderFile := TengShaderFile.Create(self);
  44. if (fShaderFile.Filename <> fAbsoluteFile) then
  45. fShaderFile.LoadFromFile(fAbsoluteFile);
  46. end;
  47. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  48. function TengShaderPartInclude.GetCount: Integer;
  49. begin
  50. if Assigned(fShaderFile)
  51. then result := 1
  52. else result := 0;
  53. end;
  54. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. function TengShaderPartInclude.GetChild(const aIndex: Integer): TengShaderPart;
  56. begin
  57. if Assigned(fShaderFile) and (aIndex = 0)
  58. then result := fShaderFile
  59. else raise EengOutOfRange.Create(0, Count-1, aIndex, self);
  60. end;
  61. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  62. function TengShaderPartInclude.GetText: String;
  63. begin
  64. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ''' + fIncludeFile + '''' + TOKEN_CHAR_END;
  65. end;
  66. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  67. function TengShaderPartInclude.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  68. begin
  69. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  70. raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename, self);
  71. if (aParams.Count <> 2) then
  72. raise EengInvalidParamterCount.Create(GetTokenName, 2, self);
  73. fIncludeFile := aParams[1].Name;
  74. fAbsoluteFile := CreateAbsolutePath(fIncludeFile, ExtractFilePath(Filename));
  75. result := '';
  76. LoadShaderFile;
  77. end;
  78. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. procedure TengShaderPartInclude.SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter);
  80. begin
  81. LoadShaderFile;
  82. fIncludeFile := Format('%p_', [Pointer(fShaderFile)]) + ExtractFileName(fIncludeFile);
  83. fAbsoluteFile := CreateAbsolutePath(fIncludeFile, ExtractFilePath(aFilename));
  84. fShaderFile.SaveToFile(fAbsoluteFile, aFileWriter);
  85. end;
  86. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  87. constructor TengShaderPartInclude.Create(const aParent: TengShaderPart);
  88. begin
  89. inherited Create(aParent);
  90. fShaderFile := nil;
  91. end;
  92. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  93. destructor TengShaderPartInclude.Destroy;
  94. begin
  95. FreeAndNil(fShaderFile);
  96. inherited Destroy;
  97. end;
  98. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  99. class function TengShaderPartInclude.GetTokenName: String;
  100. begin
  101. result := TOKEN_INCLUDE;
  102. end;
  103. end.