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.

101 lines
3.9 KiB

  1. unit uengShaderPartInclude;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils,
  7. uengShaderPart, uengShaderFile, uengShaderFileParser;
  8. type
  9. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  10. TengShaderPartInclude = class(TengShaderPart)
  11. { Code Loading & Storage }
  12. private
  13. fShaderFile: TengShaderFile;
  14. fIncludeFile: String;
  15. fAbsoluteFile: String;
  16. protected
  17. function GetCount: Integer; override;
  18. function GetChild(const aIndex: Integer): TengShaderPart; override;
  19. function GetText: String; override;
  20. function ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String; override;
  21. { General }
  22. public
  23. property IncludeFile: String read fIncludeFile;
  24. constructor Create(const aParent: TengShaderPart); override;
  25. destructor Destroy; override;
  26. { Class Methods }
  27. public
  28. class function GetTokenName: String; override;
  29. end;
  30. implementation
  31. uses
  32. FileUtil,
  33. uengShaderFileTypes, uengShaderFileConstants;
  34. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  35. //TengShaderPartInclude/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  36. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  37. function TengShaderPartInclude.GetCount: Integer;
  38. begin
  39. if Assigned(fShaderFile)
  40. then result := 1
  41. else result := 0;
  42. end;
  43. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  44. function TengShaderPartInclude.GetChild(const aIndex: Integer): TengShaderPart;
  45. begin
  46. if Assigned(fShaderFile) and (aIndex = 0)
  47. then result := fShaderFile
  48. else raise EengOutOfRange.Create(0, Count-1, aIndex, Line, Col, Filename);
  49. end;
  50. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  51. function TengShaderPartInclude.GetText: String;
  52. begin
  53. result := TOKEN_CHAR_BEGIN + GetTokenName + ' ''' + fIncludeFile + '''' + TOKEN_CHAR_END;
  54. end;
  55. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  56. function TengShaderPartInclude.ParseIntern(const aArgs: TengParseArgs; const aParams: TengTokenParameterList): String;
  57. begin
  58. if (aParams[0].Name <> GetTokenName) then with aParams[0] do
  59. raise EengInvalidToken.Create(ClassName, Name, Line, Col, Filename);
  60. if (aParams.Count <> 2) then
  61. raise EengInvalidParamterCount.Create(GetTokenName, 2, Line, Col, Filename);
  62. fIncludeFile := aParams[1].Name;
  63. fAbsoluteFile := CreateAbsolutePath(fIncludeFile, ExtractFilePath(Filename));
  64. result := '';
  65. end;
  66. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  67. constructor TengShaderPartInclude.Create(const aParent: TengShaderPart);
  68. begin
  69. inherited Create(aParent);
  70. fShaderFile := nil;
  71. end;
  72. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  73. destructor TengShaderPartInclude.Destroy;
  74. begin
  75. FreeAndNil(fShaderFile);
  76. inherited Destroy;
  77. end;
  78. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  79. class function TengShaderPartInclude.GetTokenName: String;
  80. begin
  81. result := TOKEN_INCLUDE;
  82. end;
  83. end.