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.

137 lines
5.5 KiB

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