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.

136 rivejä
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. fIncludeFile := Format('%p_', [Pointer(fShaderFile)]) + ExtractFileName(fIncludeFile);
  94. fAbsoluteFile := ExtractFilePath(aFilename) + fIncludeFile;
  95. fShaderFile.SaveToFile(fAbsoluteFile, aFileWriter);
  96. end;
  97. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  98. constructor TengShaderPartInclude.Create(const aParent: TengShaderPart);
  99. begin
  100. inherited Create(aParent);
  101. fShaderFile := nil;
  102. end;
  103. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  104. destructor TengShaderPartInclude.Destroy;
  105. begin
  106. FreeAndNil(fShaderFile);
  107. inherited Destroy;
  108. end;
  109. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  110. class function TengShaderPartInclude.GetTokenName: String;
  111. begin
  112. result := TOKEN_INCLUDE;
  113. end;
  114. end.