|
|
@@ -10,6 +10,8 @@ uses |
|
|
|
|
|
|
|
{$IFDEF SHADER_FILE_USE_BITSPACE_UTILS} |
|
|
|
, uutlSerialization, uutlCommon, uutlGenerics |
|
|
|
{$ELSE} |
|
|
|
, uengShaderFileGenerics |
|
|
|
{$ENDIF} |
|
|
|
; |
|
|
|
|
|
|
@@ -21,6 +23,40 @@ type |
|
|
|
TengShaderFileReader = uutlSerialization.TutlSimpleFileReader; |
|
|
|
TengShaderFileWriter = uutlSerialization.TutlSimpleFileWriter; |
|
|
|
TIntfObjNoRefCount = uutlCommon.TutlInterfaceNoRefCount; |
|
|
|
{$ELSE} |
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
TIntfObjNoRefCount = class(TObject, IUnknown) |
|
|
|
protected |
|
|
|
fRefCount : longint; |
|
|
|
{ implement methods of IUnknown } |
|
|
|
function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; |
|
|
|
function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual; |
|
|
|
function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual; |
|
|
|
public |
|
|
|
property RefCount: LongInt read fRefCount; |
|
|
|
end; |
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
IengShaderFileReader = interface |
|
|
|
['{3A9C3AE3-CAEE-44C9-85BE-0BCAA5C1BE7A}'] |
|
|
|
function LoadStream(const aFilename: String; const aStream: TStream): Boolean; |
|
|
|
end; |
|
|
|
|
|
|
|
IengShaderFileWriter = interface |
|
|
|
['{3DF84644-9FC4-4A8A-88C2-73F13E72B1ED}'] |
|
|
|
procedure SaveStream(const aFilename: String; const aStream: TStream); |
|
|
|
end; |
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
TengShaderFileReader = class(TInterfacedObject, IengShaderFileReader) |
|
|
|
public |
|
|
|
function LoadStream(const aFilename: String; const aStream: TStream): Boolean; |
|
|
|
end; |
|
|
|
|
|
|
|
TengShaderFileWriter = class(TInterfacedObject, IengShaderFileWriter) |
|
|
|
public |
|
|
|
procedure SaveStream(const aFilename: String; const aStream: TStream); |
|
|
|
end; |
|
|
|
{$ENDIF} |
|
|
|
|
|
|
|
TengShaderPartLogLevel = ( |
|
|
@@ -186,6 +222,59 @@ implementation |
|
|
|
uses |
|
|
|
uengShaderPart; |
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
//TIntfObjNoRefCount////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
function TIntfObjNoRefCount.QueryInterface(constref iid: tguid; out obj): longint; stdcall; |
|
|
|
begin |
|
|
|
if getinterface(iid,obj) |
|
|
|
then result := S_OK |
|
|
|
else result := longint(E_NOINTERFACE); |
|
|
|
end; |
|
|
|
|
|
|
|
function TIntfObjNoRefCount._AddRef: longint; stdcall; |
|
|
|
begin |
|
|
|
result := InterLockedIncrement(fRefCount); |
|
|
|
end; |
|
|
|
|
|
|
|
function TIntfObjNoRefCount._Release: longint; stdcall; |
|
|
|
begin |
|
|
|
result := InterLockedDecrement(fRefCount); |
|
|
|
end; |
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
//TengShaderFileReader////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
function TengShaderFileReader.LoadStream(const aFilename: String; const aStream: TStream): Boolean; |
|
|
|
var |
|
|
|
fs: TFileStream; |
|
|
|
begin |
|
|
|
result := FileExists(aFilename); |
|
|
|
if result then begin |
|
|
|
fs := TFileStream.Create(aFilename, fmOpenRead); |
|
|
|
try |
|
|
|
aStream.CopyFrom(fs, fs.Size - fs.Position); |
|
|
|
finally |
|
|
|
FreeAndNil(fs); |
|
|
|
end; |
|
|
|
end; |
|
|
|
end; |
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
//TengShaderFileWriter////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
procedure TengShaderFileWriter.SaveStream(const aFilename: String; const aStream: TStream); |
|
|
|
var |
|
|
|
fs: TFileStream; |
|
|
|
begin |
|
|
|
fs := TFileStream.Create(aFilename, fmCreate); |
|
|
|
try |
|
|
|
fs.CopyFrom(aStream, aStream.Size - aStream.Position); |
|
|
|
finally |
|
|
|
FreeAndNil(fs); |
|
|
|
end; |
|
|
|
end; |
|
|
|
|
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
//TengMetaData////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////// |
|
|
|