|
- unit uengShaderFile;
-
- { Package: SpaceEngine
- Prefix: eng - ENGine
- Beschreibung: stellt Klassen zum laden von Shader-Datein zur Verfügung
- beim laden des Codes wird gleichzeitig die Präprozessor-Sprache ausgewertet }
-
- {$mode objfpc}{$H+}
- {$I uengShaderFile.inc}
-
- interface
-
- uses
- Classes, sysutils,
- uengShaderCodeGenerator, uengShaderFileParser, uengShaderFileTypes
-
- {$IFDEF USE_BITSPACE_UTILS}
- , uutlSerialization
- {$ENDIF}
- ;
-
- type
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- TengShaderFile = class(TengShaderCodeGenerator)
- { Code Loading & Storage }
- private
- fFilename: String;
- fFileReader: IutlFileReader;
- fFileWriter: IutlFileWriter;
- protected { virtual getter }
- function GetFilename: String; override;
- function GetFileReader: IengShaderFileReader; override;
- function GetFileWriter: IengShaderFileWriter; override;
- public { general methods }
- procedure LoadCode(const aFilename: String; const aFileReader: IengShaderFileReader = nil);
- end;
-
- implementation
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- //TengShaderFile////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderFile.GetFilename: String;
- begin
- result := fFilename;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderFile.GetFileReader: IengShaderFileReader;
- begin
- result := fFileReader;
- if not Assigned(result) and Assigned(Parent) then
- result := Parent.FileReader;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- function TengShaderFile.GetFileWriter: IengShaderFileWriter;
- begin
- result := fFileWriter;
- if not Assigned(result) and Assigned(Parent) then
- result := Parent.FileWriter;
- end;
-
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- procedure TengShaderFile.LoadCode(const aFilename: String; const aFileReader: IengShaderFileReader);
- var
- args: TengParseArgs;
- token: String;
- ms: TMemoryStream;
- begin
- fFileReader := aFileReader;
- if not Assigned(fFileReader) then
- fFileReader := GetFileReader;
- if not Assigned(fFileReader) then
- fFileReader := TengShaderFileReader.Create;
- ms := TMemoryStream.Create;
- try
- Clear;
- if not fFileReader.LoadStream(aFilename, ms) then
- raise EengShaderPart.Create('unable to open file: ' + aFilename, Line, Col, Filename);
- ms.Position := 0;
- args := TengParseArgs.Create(ms, Filename);
- try
- token := ParseText(args);
- if (token <> '') then with args do
- raise EengShaderPart.Create('unknown token ''' + token + '''', Line, Col, Filename);
- finally
- FreeAndNil(args);
- end;
- finally
- fFileReader := nil;
- end;
- end;
-
- end.
|