Ви не можете вибрати більше 25 тем Теми мають розпочинатися з літери або цифри, можуть містити дефіси (-) і не повинні перевищувати 35 символів.

159 рядки
5.6 KiB

  1. unit uengShaderFile;
  2. { Package: SpaceEngine
  3. Prefix: eng - ENGine
  4. Beschreibung: stellt Klassen zum laden von Shader-Datein zur Verfügung
  5. beim laden des Codes wird gleichzeitig die Präprozessor-Sprache ausgewertet }
  6. {$mode objfpc}{$H+}
  7. {$I uengShaderFile.inc}
  8. interface
  9. uses
  10. Classes, sysutils,
  11. uengShaderPart, uengShaderCodeGenerator, uengShaderFileParser, uengShaderFileTypes
  12. {$IFDEF USE_BITSPACE_UTILS}
  13. , uutlSerialization
  14. {$ENDIF}
  15. ;
  16. type
  17. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  18. TengShaderFile = class(TengShaderCodeGenerator)
  19. { Code Loading & Storage }
  20. private
  21. fFilename: String;
  22. fFileReader: IutlFileReader;
  23. fFileWriter: IutlFileWriter;
  24. protected { virtual getter }
  25. function GetFilename: String; override;
  26. function GetFileReader: IengShaderFileReader; override;
  27. function GetFileWriter: IengShaderFileWriter; override;
  28. { General }
  29. protected
  30. procedure FindIntern(aFlags: TengShaderFileSearchFlags; aDepth: Integer; aTypes: array of CengShaderPart; const aList: TSearchList); override;
  31. public
  32. procedure LoadFromFile(const aFilename: String; const aFlags: TengShaderFileLoadFlags = []; const aFileReader: IengShaderFileReader = nil);
  33. procedure SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter = nil);
  34. destructor Destroy; override;
  35. end;
  36. implementation
  37. uses
  38. uengShaderPartInclude;
  39. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. //TengShaderFile////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  41. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  42. function TengShaderFile.GetFilename: String;
  43. begin
  44. result := fFilename;
  45. end;
  46. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. function TengShaderFile.GetFileReader: IengShaderFileReader;
  48. begin
  49. result := fFileReader;
  50. if not Assigned(result) and Assigned(Parent) then
  51. result := Parent.FileReader;
  52. end;
  53. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  54. function TengShaderFile.GetFileWriter: IengShaderFileWriter;
  55. begin
  56. result := fFileWriter;
  57. if not Assigned(result) and Assigned(Parent) then
  58. result := Parent.FileWriter;
  59. end;
  60. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  61. procedure TengShaderFile.FindIntern(aFlags: TengShaderFileSearchFlags; aDepth: Integer; aTypes: array of CengShaderPart; const aList: TSearchList);
  62. begin
  63. if (sfCurrentFileOnly in aFlags) then
  64. exclude(aFlags, sfSearchParents);
  65. inherited FindIntern(aFlags, aDepth, aTypes, aList);
  66. end;
  67. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  68. procedure TengShaderFile.LoadFromFile(const aFilename: String; const aFlags: TengShaderFileLoadFlags;
  69. const aFileReader: IengShaderFileReader);
  70. var
  71. args: TengParseArgs;
  72. token: String;
  73. ms: TMemoryStream;
  74. begin
  75. fFileReader := aFileReader;
  76. if not Assigned(fFileReader) then
  77. fFileReader := GetFileReader;
  78. if not Assigned(fFileReader) then
  79. fFileReader := TengShaderFileReader.Create;
  80. ms := TMemoryStream.Create;
  81. try
  82. Clear;
  83. if not fFileReader.LoadStream(aFilename, ms) then
  84. raise EengShaderPart.Create('unable to open file: ' + aFilename, Line, Col, Filename);
  85. ms.Position := 0;
  86. fFilename := aFilename;
  87. args := TengParseArgs.Create(ms, Filename);
  88. try
  89. args.Flags := aFlags;
  90. token := ParseText(args);
  91. if (token <> '') then with args do
  92. raise EengShaderPart.Create('unknown token ''' + token + '''', Line, Col, Filename);
  93. finally
  94. FreeAndNil(args);
  95. end;
  96. finally
  97. if not (lfLazyInclude in aFlags) then
  98. fFileReader := nil;
  99. end;
  100. end;
  101. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  102. procedure TengShaderFile.SaveToFile(const aFilename: String; const aFileWriter: IengShaderFileWriter);
  103. var
  104. l: TengShaderPart.TSearchList;
  105. i: Integer;
  106. sl: TStringList;
  107. ms: TMemoryStream;
  108. begin
  109. fFileWriter := aFileWriter;
  110. if not Assigned(fFileWriter) then
  111. fFileWriter := FileWriter;
  112. if not Assigned(fFileWriter) then
  113. fFileWriter := TengShaderFileWriter.Create;
  114. l := TengShaderPart.TSearchList.Create;
  115. sl := TStringList.Create;
  116. ms := TMemoryStream.Create;
  117. try
  118. FindAll([sfSearchChildren, sfCurrentFileOnly], [TengShaderPartInclude], l);
  119. for i := 0 to l.Count-1 do
  120. (l[i] as TengShaderPartInclude).SaveToFile(aFilename, aFileWriter);
  121. sl.Text := Text;
  122. sl.SaveToStream(ms);
  123. ms.Position := 0;
  124. fFileWriter.SaveStream(aFilename, ms);
  125. finally
  126. FreeAndNil(l);
  127. FreeAndNil(sl);
  128. FreeAndNil(ms);
  129. fFileWriter := nil;
  130. end;
  131. end;
  132. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  133. destructor TengShaderFile.Destroy;
  134. begin
  135. fFileReader := nil;
  136. fFileWriter := nil;
  137. inherited Destroy;
  138. end;
  139. end.