Nelze vybrat více než 25 témat Téma musí začínat písmenem nebo číslem, může obsahovat pomlčky („-“) a může být dlouhé až 35 znaků.

97 řádky
3.4 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. 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. public { general methods }
  29. procedure LoadCode(const aFilename: String; const aFileReader: IengShaderFileReader = nil);
  30. end;
  31. implementation
  32. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  33. //TengShaderFile////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  35. function TengShaderFile.GetFilename: String;
  36. begin
  37. result := fFilename;
  38. end;
  39. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  40. function TengShaderFile.GetFileReader: IengShaderFileReader;
  41. begin
  42. result := fFileReader;
  43. if not Assigned(result) and Assigned(Parent) then
  44. result := Parent.FileReader;
  45. end;
  46. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  47. function TengShaderFile.GetFileWriter: IengShaderFileWriter;
  48. begin
  49. result := fFileWriter;
  50. if not Assigned(result) and Assigned(Parent) then
  51. result := Parent.FileWriter;
  52. end;
  53. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  54. procedure TengShaderFile.LoadCode(const aFilename: String; const aFileReader: IengShaderFileReader);
  55. var
  56. args: TengParseArgs;
  57. token: String;
  58. ms: TMemoryStream;
  59. begin
  60. fFileReader := aFileReader;
  61. if not Assigned(fFileReader) then
  62. fFileReader := GetFileReader;
  63. if not Assigned(fFileReader) then
  64. fFileReader := TengShaderFileReader.Create;
  65. ms := TMemoryStream.Create;
  66. try
  67. Clear;
  68. if not fFileReader.LoadStream(aFilename, ms) then
  69. raise EengShaderPart.Create('unable to open file: ' + aFilename, Line, Col, Filename);
  70. ms.Position := 0;
  71. args := TengParseArgs.Create(ms, Filename);
  72. try
  73. token := ParseText(args);
  74. if (token <> '') then with args do
  75. raise EengShaderPart.Create('unknown token ''' + token + '''', Line, Col, Filename);
  76. finally
  77. FreeAndNil(args);
  78. end;
  79. finally
  80. fFileReader := nil;
  81. end;
  82. end;
  83. end.