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.
 
 
 
 
 
 

639 lines
29 KiB

  1. unit ulibShaderFile;
  2. {$IFDEF fpc}
  3. {$mode objfpc}{$H+}
  4. {$ENDIF}
  5. interface
  6. uses
  7. Classes, SysUtils, Variants;
  8. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  9. type
  10. {$Z4}
  11. TlsfLogLevel = (
  12. llDebug = 0,
  13. llInfo = 1,
  14. llWarning = 2,
  15. llError = 3
  16. );
  17. {$Z4}
  18. TlsfErrorCode = (
  19. errUnknown = -1,
  20. errNone = $00000000,
  21. errNotInit = $00000001,
  22. errInvalidHandleShaderFile = $00000010,
  23. errInvalidHandleShaderGenerator = $00000011,
  24. errInvalidHandleStream = $00000012,
  25. errInvalidGeneratorName = $00000020,
  26. errInvalidPropertyIndex = $00000021,
  27. errInvalidPropertyName = $00000022,
  28. errGeneratorNotAssignedToFile = $00000023,
  29. errUnknownIdentfifier = $00001000,
  30. errDuplicateIdentifier = $00001001,
  31. errOutOfRange = $00001002,
  32. errInvalidIdentifier = $00001003,
  33. errInvalidParamterCount = $00001004,
  34. errInvalidParamter = $00001005,
  35. errUnexpectedToken = $00001006,
  36. errInvalidToken = $00001007,
  37. errExpressionInternal = $00001008,
  38. errExpression = $00001009,
  39. errShaderPartInternal = $0000100a,
  40. errShaderPart = $0000100b,
  41. errInvalidLibraryName = $00002000,
  42. errInvalidLibraryHandle = $00002001,
  43. errInvalidMethodName = $00002002
  44. );
  45. {$Z4}
  46. TlsfSeekOrigin = (
  47. soBeg = 0,
  48. soCur = 1,
  49. soEnd = 2
  50. );
  51. TlsfShaderFileHandle = Pointer;
  52. TlsfGeneratorHandle = Pointer;
  53. TlsfStreamHandle = Pointer;
  54. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  55. TlsfShaderFileLogEvent = procedure(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar; const aUserArgs: Pointer); stdcall;
  56. TlsfSaveDataCallback = procedure(const aFilename: PAnsiChar; const aHandle: TlsfStreamHandle; const aUserArgs: Pointer); stdcall;
  57. TlsfLoadDataCallback = function(const aFilename: PAnsiChar; const aHandle: TlsfStreamHandle; const aUserArgs: Pointer): Boolean; stdcall;
  58. Tlsf_ShaderFile_create = function: TlsfShaderFileHandle; stdcall;
  59. Tlsf_ShaderFile_setLogCallback = function(const aHandle: TlsfShaderFileHandle; const aCallback: TlsfShaderFileLogEvent; const aUserArgs: Pointer): TlsfErrorCode; stdcall;
  60. Tlsf_ShaderFile_loadFromFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall;
  61. Tlsf_ShaderFile_loadFromFunc = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar; const aCallback: TlsfLoadDataCallback; const aUserArgs: Pointer): TlsfErrorCode; stdcall;
  62. Tlsf_ShaderFile_saveToFile = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar): TlsfErrorCode; stdcall;
  63. Tlsf_ShaderFile_saveToFunc = function(const aHandle: TlsfShaderFileHandle; const aFilename: PAnsiChar; const aCallback: TlsfSaveDataCallback; const aUserArgs: Pointer): TlsfErrorCode; stdcall;
  64. Tlsf_ShaderFile_getGeneratorNames = function(const aHandle: TlsfShaderFileHandle): PAnsiChar; stdcall;
  65. Tlsf_ShaderFile_destroy = function(const aHandle: TlsfShaderFileHandle): TlsfErrorCode; stdcall;
  66. Tlsf_Generator_create = function(const aHandle: TlsfShaderFileHandle; const aName: PAnsiChar): TlsfGeneratorHandle; stdcall;
  67. Tlsf_Generator_getPropertyNames = function(const aHandle: TlsfGeneratorHandle): PAnsiChar; stdcall;
  68. Tlsf_Generator_getProperty = function(const aHandle: TlsfGeneratorHandle; const aIndex: Integer): PAnsiChar; stdcall;
  69. Tlsf_Generator_getPropertyByName = function(const aHandle: TlsfGeneratorHandle; const aName: PAnsiChar): PAnsiChar; stdcall;
  70. Tlsf_Generator_setProperty = function(const aHandle: TlsfGeneratorHandle; const aIndex: Integer; const aValue: PAnsiChar): TlsfErrorCode; stdcall;
  71. Tlsf_Generator_setPropertyByName = function(const aHandle: TlsfGeneratorHandle; const aName: PAnsiChar; const aValue: PAnsiChar): TlsfErrorCode; stdcall;
  72. Tlsf_Generator_generateCode = function(const aHandle: TlsfGeneratorHandle): PAnsiChar; stdcall;
  73. Tlsf_Generator_destroy = function(const aHandle: TlsfGeneratorHandle): TlsfErrorCode; stdcall;
  74. Tlsf_Stream_getSize = function(const aHandle: TlsfStreamHandle): Integer; stdcall;
  75. Tlsf_Stream_setSize = function(const aHandle: TlsfStreamHandle; const aSize: Integer): TlsfErrorCode; stdcall;
  76. Tlsf_Stream_seek = function(const aHandle: TlsfStreamHandle; const aOffset: Integer; const aOrigin: TlsfSeekOrigin): Integer; stdcall;
  77. Tlsf_Stream_read = function(const aHandle: TlsfStreamHandle; const aBuffer: Pointer; const aSize: Integer): Integer; stdcall;
  78. Tlsf_Stream_write = function(const aHandle: TlsfStreamHandle; const aBuffer: Pointer; const aSize: Integer): Integer; stdcall;
  79. Tlsf_init = function: TlsfErrorCode; stdcall;
  80. Tlsf_getLastErrorCode = function: TlsfErrorCode; stdcall;
  81. Tlsf_getLastErrorMsg = function: PAnsiChar; stdcall;
  82. Tlsf_getLastErrorTrace = function: PAnsiChar; stdcall;
  83. Tlsf_finish = function: TlsfErrorCode; stdcall;
  84. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  85. IlsfFileReader = interface
  86. ['{1820220E-0043-491A-B841-19A4B11C6090}']
  87. function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  88. end;
  89. IlsfFileWriter = interface
  90. ['{FEF0760E-402B-4627-9171-273AE215FADB}']
  91. procedure SaveStream(const aFilename: String; const aStream: TStream);
  92. end;
  93. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  94. TlsfShaderFile = class(TObject)
  95. private
  96. fHandle: TlsfShaderFileHandle;
  97. protected
  98. procedure LogMsg(const aLogLevel: TlsfLogLevel; const aMsg: String); virtual;
  99. public
  100. property Handle: TlsfShaderFileHandle read fHandle;
  101. procedure LoadFromFile(const aFilename: String);
  102. procedure LoadFromFunc(const aFilename: String; const aFileReader: IlsfFileReader);
  103. procedure SaveToFile(const aFilename: String);
  104. procedure SaveToFunc(const aFilename: String; const aFileWriter: IlsfFileWriter);
  105. constructor Create;
  106. destructor Destroy; override;
  107. end;
  108. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  109. TlsfGenerator = class(TObject)
  110. private
  111. fName: String;
  112. fHandle: TlsfGeneratorHandle;
  113. fShaderFile: TlsfShaderFile;
  114. fProperties: TStringList;
  115. function GetProperties: TStrings;
  116. public
  117. property Name: String read fName;
  118. property ShaderFile: TlsfShaderFile read fShaderFile;
  119. property Properties: TStrings read GetProperties;
  120. function GetProperty(const aName: String): Variant; overload;
  121. function GetProperty(const aIndex: Integer): Variant; overload;
  122. procedure SetProperty(const aName: String; const aValue: Variant); overload;
  123. procedure SetProperty(const aIndex: Integer; const aValue: Variant); overload;
  124. function GenerateCode: String;
  125. constructor Create(const aShaderFile: TlsfShaderFile; const aName: String);
  126. destructor Destroy; override;
  127. end;
  128. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  129. TlsfException = class(Exception)
  130. private
  131. fErrorCode: TlsfErrorCode;
  132. public
  133. property ErrorCode: TlsfErrorCode read fErrorCode;
  134. constructor Create(const aMsg: string; const aError: TlsfErrorCode = errNone);
  135. end;
  136. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  137. var
  138. lsf_ShaderFile_create: Tlsf_ShaderFile_create;
  139. lsf_ShaderFile_setLogCallback: Tlsf_ShaderFile_setLogCallback;
  140. lsf_ShaderFile_loadFromFile: Tlsf_ShaderFile_loadFromFile;
  141. lsf_ShaderFile_loadFromFunc: Tlsf_ShaderFile_loadFromFunc;
  142. lsf_ShaderFile_saveToFile: Tlsf_ShaderFile_saveToFile;
  143. lsf_ShaderFile_saveToFunc: Tlsf_ShaderFile_saveToFunc;
  144. lsf_ShaderFile_getGeneratorNames: Tlsf_ShaderFile_getGeneratorNames;
  145. lsf_ShaderFile_destroy: Tlsf_ShaderFile_destroy;
  146. lsf_Generator_create: Tlsf_Generator_create;
  147. lsf_Generator_getPropertyNames: Tlsf_Generator_getPropertyNames;
  148. lsf_Generator_getProperty: Tlsf_Generator_getProperty;
  149. lsf_Generator_getPropertyByName: Tlsf_Generator_getPropertyByName;
  150. lsf_Generator_setProperty: Tlsf_Generator_setProperty;
  151. lsf_Generator_setPropertyByName: Tlsf_Generator_setPropertyByName;
  152. lsf_Generator_generateCode: Tlsf_Generator_generateCode;
  153. lsf_Generator_destroy: Tlsf_Generator_destroy;
  154. lsf_Stream_getSize: Tlsf_Stream_getSize;
  155. lsf_Stream_setSize: Tlsf_Stream_setSize;
  156. lsf_Stream_seek: Tlsf_Stream_seek;
  157. lsf_Stream_read: Tlsf_Stream_read;
  158. lsf_Stream_write: Tlsf_Stream_write;
  159. lsf_getLastErrorCode: Tlsf_getLastErrorCode;
  160. lsf_getLastErrorMsg: Tlsf_getLastErrorMsg;
  161. lsf_getLastErrorTrace: Tlsf_getLastErrorTrace;
  162. procedure lsf_init(const aLibName: String);
  163. procedure lsf_finish;
  164. implementation
  165. {$IF DEFINED(WIN32) OR DEFINED(WIN64)}
  166. uses
  167. windows;
  168. type
  169. TLibHandle = HMODULE;
  170. const
  171. InvalidLibHandle: TLibHandle = 0;
  172. function LibOpen(const aLibName: String; out aError: String): TLibHandle;
  173. begin
  174. result := LoadLibraryA(PAnsiChar(AnsiString(aLibName)));
  175. if (result = 0)
  176. then aError := SysErrorMessage(GetLastError())
  177. else aError := '';
  178. end;
  179. function GetAddr(const aLibHandle: TLibHandle; const aName: String): Pointer;
  180. begin
  181. result := GetProcAddress(aLibHandle, PAnsiChar(AnsiString(aName)));
  182. end;
  183. procedure LibClose(const aLibHandle: TLibHandle);
  184. begin
  185. FreeLibrary(aLibHandle);
  186. end;
  187. {$ELSEIF DEFINED(LINUX)}
  188. uses
  189. dl;
  190. type
  191. TLibHandle = Pointer;
  192. const
  193. InvalidLibHandle: TLibHandle = nil;
  194. function LibOpen(const aLibName: String; out aError: String): TLibHandle;
  195. begin
  196. dlerror();
  197. result := dlopen(PChar(aLibName), RTLD_LAZY);
  198. if (result = InvalidLibHandle)
  199. then aError := dlerror()
  200. else aError := '';
  201. end;
  202. function GetAddr(const aLibHandle: TLibHandle; const aName: String): Pointer;
  203. begin
  204. result := dlsym(aLibHandle, PChar(aName));
  205. end;
  206. procedure LibClose(const aLibHandle: TLibHandle);
  207. begin
  208. dlclose(aLibHandle);
  209. end;
  210. {$ELSE}
  211. {$ERROR 'unknown operation system'}
  212. {$IFEND}
  213. var
  214. libHandle: TLibHandle;
  215. lsf_init_intern: Tlsf_init;
  216. lsf_finish_intern: Tlsf_finish;
  217. type
  218. TlsfStream = class(TStream)
  219. private
  220. fHandle: TlsfStreamHandle;
  221. protected
  222. function GetSize: Int64; override;
  223. procedure SetSize(NewSize: Longint); override; {$IFDEF FPC}overload;{$ENDIF}
  224. public
  225. function Seek(Offset: Longint; Origin: Word): Longint; override; {$IFDEF FPC}overload;{$ENDIF}
  226. function Read(var Buffer; Count: Longint): Longint; override;
  227. function Write(const Buffer; Count: Longint): Longint; override;
  228. constructor Create(const aHandle: TlsfStreamHandle);
  229. end;
  230. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  231. procedure lsf_init(const aLibName: String);
  232. function LoadProc(const aName: String): Pointer;
  233. begin
  234. result := GetAddr(libHandle, aName);
  235. if not Assigned(result) then
  236. raise Exception.CreateFmt('unable to load ''%s'' from ''%s''', [aName, aLibName]);
  237. end;
  238. var
  239. eMsg: String;
  240. err: TlsfErrorCode;
  241. begin
  242. libHandle := LibOpen(aLibName, eMsg);
  243. if (libHandle = InvalidLibHandle) then
  244. raise Exception.Create('unable to load library: ' + eMsg);
  245. lsf_ShaderFile_create := Tlsf_ShaderFile_create( LoadProc('lsf_ShaderFile_create'));
  246. lsf_ShaderFile_setLogCallback := Tlsf_ShaderFile_setLogCallback( LoadProc('lsf_ShaderFile_setLogCallback'));
  247. lsf_ShaderFile_loadFromFile := Tlsf_ShaderFile_loadFromFile( LoadProc('lsf_ShaderFile_loadFromFile'));
  248. lsf_ShaderFile_loadFromFunc := Tlsf_ShaderFile_loadFromFunc( LoadProc('lsf_ShaderFile_loadFromFunc'));
  249. lsf_ShaderFile_saveToFile := Tlsf_ShaderFile_saveToFile( LoadProc('lsf_ShaderFile_saveToFile'));
  250. lsf_ShaderFile_saveToFunc := Tlsf_ShaderFile_saveToFunc( LoadProc('lsf_ShaderFile_saveToFunc'));
  251. lsf_ShaderFile_getGeneratorNames := Tlsf_ShaderFile_getGeneratorNames( LoadProc('lsf_ShaderFile_getGeneratorNames'));
  252. lsf_ShaderFile_destroy := Tlsf_ShaderFile_destroy( LoadProc('lsf_ShaderFile_destroy'));
  253. lsf_Generator_create := Tlsf_Generator_create( LoadProc('lsf_Generator_create'));
  254. lsf_Generator_getPropertyNames := Tlsf_Generator_getPropertyNames( LoadProc('lsf_Generator_getPropertyNames'));
  255. lsf_Generator_getProperty := Tlsf_Generator_getProperty( LoadProc('lsf_Generator_getProperty'));
  256. lsf_Generator_getPropertyByName := Tlsf_Generator_getPropertyByName( LoadProc('lsf_Generator_getPropertyByName'));
  257. lsf_Generator_setProperty := Tlsf_Generator_setProperty( LoadProc('lsf_Generator_setProperty'));
  258. lsf_Generator_setPropertyByName := Tlsf_Generator_setPropertyByName( LoadProc('lsf_Generator_setPropertyByName'));
  259. lsf_Generator_generateCode := Tlsf_Generator_generateCode( LoadProc('lsf_Generator_generateCode'));
  260. lsf_Generator_destroy := Tlsf_Generator_destroy( LoadProc('lsf_Generator_destroy'));
  261. lsf_Stream_getSize := Tlsf_Stream_getSize( LoadProc('lsf_Stream_getSize'));
  262. lsf_Stream_setSize := Tlsf_Stream_setSize( LoadProc('lsf_Stream_setSize'));
  263. lsf_Stream_seek := Tlsf_Stream_seek( LoadProc('lsf_Stream_seek'));
  264. lsf_Stream_read := Tlsf_Stream_read( LoadProc('lsf_Stream_read'));
  265. lsf_Stream_write := Tlsf_Stream_write( LoadProc('lsf_Stream_write'));
  266. lsf_init_intern := Tlsf_init( LoadProc('lsf_init'));
  267. lsf_getLastErrorCode := Tlsf_getLastErrorCode( LoadProc('lsf_getLastErrorCode'));
  268. lsf_getLastErrorMsg := Tlsf_getLastErrorMsg( LoadProc('lsf_getLastErrorMsg'));
  269. lsf_getLastErrorTrace := Tlsf_getLastErrorTrace( LoadProc('lsf_getLastErrorTrace'));
  270. lsf_finish_intern := Tlsf_finish( LoadProc('lsf_finish'));
  271. err := lsf_init_intern();
  272. if (err <> errNone) then
  273. raise TlsfException.Create('error while initializing library: ' + lsf_getLastErrorMsg(), err);
  274. end;
  275. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  276. procedure lsf_finish;
  277. begin
  278. lsf_finish_intern();
  279. lsf_ShaderFile_create := nil;
  280. lsf_ShaderFile_setLogCallback := nil;
  281. lsf_ShaderFile_loadFromFile := nil;
  282. lsf_ShaderFile_loadFromFunc := nil;
  283. lsf_ShaderFile_saveToFile := nil;
  284. lsf_ShaderFile_saveToFunc := nil;
  285. lsf_ShaderFile_getGeneratorNames := nil;
  286. lsf_ShaderFile_destroy := nil;
  287. lsf_Generator_create := nil;
  288. lsf_Generator_getPropertyNames := nil;
  289. lsf_Generator_getProperty := nil;
  290. lsf_Generator_getPropertyByName := nil;
  291. lsf_Generator_setProperty := nil;
  292. lsf_Generator_setPropertyByName := nil;
  293. lsf_Generator_generateCode := nil;
  294. lsf_Generator_destroy := nil;
  295. lsf_Stream_getSize := nil;
  296. lsf_Stream_setSize := nil;
  297. lsf_Stream_seek := nil;
  298. lsf_Stream_read := nil;
  299. lsf_Stream_write := nil;
  300. lsf_init_intern := nil;
  301. lsf_getLastErrorCode := nil;
  302. lsf_getLastErrorMsg := nil;
  303. lsf_getLastErrorTrace := nil;
  304. lsf_finish_intern := nil;
  305. if (libHandle <> InvalidLibHandle) then begin
  306. LibClose(libHandle);
  307. libHandle := InvalidLibHandle;
  308. end;
  309. end;
  310. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  311. //Callbacks From Library////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  312. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  313. procedure LogCallback(const aLogLevel: TlsfLogLevel; const aMsg: PAnsiChar; const aUserArgs: Pointer); stdcall;
  314. begin
  315. TlsfShaderFile(aUserArgs).LogMsg(aLogLevel, String(aMsg));
  316. end;
  317. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  318. procedure SaveDataCallback(const aFilename: PAnsiChar; const aHandle: TlsfStreamHandle; const aUserArgs: Pointer); stdcall;
  319. var
  320. s: TlsfStream;
  321. begin
  322. s := TlsfStream.Create(aHandle);
  323. try
  324. IlsfFileWriter(aUserArgs).SaveStream(aFilename, s);
  325. finally
  326. FreeAndNil(s);
  327. end;
  328. end;
  329. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  330. function LoadDataCallback(const aFilename: PAnsiChar; const aHandle: TlsfStreamHandle; const aUserArgs: Pointer): Boolean; stdcall;
  331. var
  332. s: TlsfStream;
  333. begin
  334. s := TlsfStream.Create(aHandle);
  335. try
  336. result := IlsfFileReader(aUserArgs).LoadStream(aFilename, s);
  337. finally
  338. FreeAndNil(s);
  339. end;
  340. end;
  341. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  342. //TlsfStream////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  343. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  344. function TlsfStream.GetSize: Int64;
  345. begin
  346. result := lsf_Stream_getSize(fHandle);
  347. if (result < 0) then
  348. raise TlsfException.Create('error in TlsfStream.GetSize: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  349. end;
  350. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  351. procedure TlsfStream.SetSize(NewSize: Longint);
  352. var
  353. err: TlsfErrorCode;
  354. begin
  355. err := lsf_Stream_setSize(fHandle, NewSize);
  356. if (err <> errNone) then
  357. raise TlsfException.Create('error in TlsfStream.SetSize: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  358. end;
  359. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  360. function TlsfStream.Seek(Offset: Longint; Origin: Word): Longint;
  361. begin
  362. result := lsf_Stream_seek(fHandle, Offset, TlsfSeekOrigin(Origin));
  363. if (result < 0) then
  364. raise TlsfException.Create('error in TlsfStream.Seek: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  365. end;
  366. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  367. function TlsfStream.Read(var Buffer; Count: Longint): Longint;
  368. begin
  369. result := lsf_Stream_read(fHandle, @Buffer, Count);
  370. if (result < 0) then
  371. raise TlsfException.Create('error in TlsfStream.Read: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  372. end;
  373. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  374. function TlsfStream.Write(const Buffer; Count: Longint): Longint;
  375. begin
  376. result := lsf_Stream_write(fHandle, @Buffer, Count);
  377. if (result < 0) then
  378. raise TlsfException.Create('error in TlsfStream.Write: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  379. end;
  380. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  381. constructor TlsfStream.Create(const aHandle: TlsfStreamHandle);
  382. begin
  383. inherited Create;
  384. fHandle := aHandle;
  385. end;
  386. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  387. //TlsfShaderFile////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  388. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  389. procedure TlsfShaderFile.LogMsg(const aLogLevel: TlsfLogLevel; const aMsg: String);
  390. begin
  391. // DUMMY
  392. end;
  393. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  394. procedure TlsfShaderFile.LoadFromFile(const aFilename: String);
  395. var
  396. err: TlsfErrorCode;
  397. begin
  398. err := lsf_ShaderFile_loadFromFile(fHandle, PAnsiChar(AnsiString(aFilename)));
  399. if (err <> errNone) then
  400. raise TlsfException.Create('error while loading from file: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  401. end;
  402. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  403. procedure TlsfShaderFile.LoadFromFunc(const aFilename: String; const aFileReader: IlsfFileReader);
  404. var
  405. err: TlsfErrorCode;
  406. begin
  407. if not Assigned(aFileReader) then
  408. LoadFromFile(aFilename);
  409. err := lsf_ShaderFile_loadFromFunc(fHandle, PAnsiChar(AnsiString(aFilename)), @LoadDataCallback, Pointer(aFileReader));
  410. if (err <> errNone) then
  411. raise TlsfException.Create('error while loading from function: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  412. end;
  413. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  414. procedure TlsfShaderFile.SaveToFile(const aFilename: String);
  415. var
  416. err: TlsfErrorCode;
  417. begin
  418. err := lsf_ShaderFile_saveToFile(fHandle, PAnsiChar(AnsiString(aFilename)));
  419. if (err <> errNone) then
  420. raise TlsfException.Create('error while saving to file: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  421. end;
  422. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  423. procedure TlsfShaderFile.SaveToFunc(const aFilename: String; const aFileWriter: IlsfFileWriter);
  424. var
  425. err: TlsfErrorCode;
  426. begin
  427. if not Assigned(aFileWriter) then
  428. SaveToFile(aFilename);
  429. err := lsf_ShaderFile_saveToFunc(fHandle, PAnsiChar(AnsiString(aFilename)), @SaveDataCallback, Pointer(aFileWriter));
  430. if (err <> errNone) then
  431. raise TlsfException.Create('error while saving to function: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  432. end;
  433. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  434. constructor TlsfShaderFile.Create;
  435. var
  436. err: TlsfErrorCode;
  437. begin
  438. inherited Create;
  439. fHandle := lsf_ShaderFile_create();
  440. if not Assigned(fHandle) then
  441. raise TlsfException.Create('error while creating shader file: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  442. err := lsf_ShaderFile_setLogCallback(fHandle, @LogCallback, self);
  443. if (err <> errNone) then
  444. raise TlsfException.Create('error while settings log callback: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  445. end;
  446. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  447. destructor TlsfShaderFile.Destroy;
  448. begin
  449. if Assigned(fHandle) then begin
  450. lsf_ShaderFile_destroy(fHandle);
  451. fHandle := nil;
  452. end;
  453. inherited Destroy;
  454. end;
  455. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  456. //TlsfGenerator/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  457. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  458. function TlsfGenerator.GetProperties: TStrings;
  459. begin
  460. result := fProperties;
  461. end;
  462. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  463. function TlsfGenerator.GetProperty(const aName: String): Variant;
  464. var
  465. s: PAnsiChar;
  466. begin
  467. s := lsf_Generator_getPropertyByName(fHandle, PAnsiChar(AnsiString(aName)));
  468. if not Assigned(s) then
  469. raise TlsfException.Create('error while getting property by name: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  470. result := String(s);
  471. end;
  472. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  473. function TlsfGenerator.GetProperty(const aIndex: Integer): Variant;
  474. var
  475. s: PAnsiChar;
  476. begin
  477. s := lsf_Generator_getProperty(fHandle, aIndex);
  478. if not Assigned(s) then
  479. raise TlsfException.Create('error while getting property by index: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  480. result := String(s);
  481. end;
  482. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  483. procedure TlsfGenerator.SetProperty(const aName: String; const aValue: Variant);
  484. var
  485. err: TlsfErrorCode;
  486. s: AnsiString;
  487. begin
  488. s := AnsiString(aValue);
  489. err := lsf_Generator_setPropertyByName(fHandle, PAnsiChar(AnsiString(aName)), PAnsiChar(s));
  490. if (err <> errNone) then
  491. raise TlsfException.Create('error while settings property by name: ' + lsf_getLastErrorMsg(), err);
  492. end;
  493. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  494. procedure TlsfGenerator.SetProperty(const aIndex: Integer; const aValue: Variant);
  495. var
  496. err: TlsfErrorCode;
  497. s: AnsiString;
  498. begin
  499. s := AnsiString(aValue);
  500. err := lsf_Generator_setProperty(fHandle, aIndex, PAnsiChar(s));
  501. if (err <> errNone) then
  502. raise TlsfException.Create('error while settings property by name: ' + lsf_getLastErrorMsg(), err);
  503. end;
  504. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  505. function TlsfGenerator.GenerateCode: String;
  506. var
  507. s: PAnsiChar;
  508. begin
  509. s := lsf_Generator_generateCode(fHandle);
  510. if not Assigned(s) then
  511. raise TlsfException.Create('error while generating code: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  512. result := String(s);
  513. end;
  514. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  515. constructor TlsfGenerator.Create(const aShaderFile: TlsfShaderFile; const aName: String);
  516. var
  517. s: PAnsiChar;
  518. begin
  519. inherited Create;
  520. fProperties := TStringList.Create;
  521. fShaderFile := aShaderFile;
  522. fName := aName;
  523. fHandle := lsf_Generator_create(fShaderFile.Handle, PAnsiChar(AnsiString(aName)));
  524. if not Assigned(fHandle) then
  525. raise TlsfException.Create('error while opening generator: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  526. s := lsf_Generator_getPropertyNames(fHandle);
  527. if not Assigned(s) then
  528. raise TlsfException.Create('error while generating code: ' + lsf_getLastErrorMsg(), lsf_getLastErrorCode());
  529. fProperties.Text := string(s);
  530. end;
  531. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  532. destructor TlsfGenerator.Destroy;
  533. begin
  534. if Assigned(fHandle) then begin
  535. lsf_Generator_destroy(fHandle);
  536. fHandle := nil;
  537. end;
  538. FreeAndNil(fProperties);
  539. inherited Destroy;
  540. end;
  541. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  542. //TlsfException/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  543. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  544. constructor TlsfException.Create(const aMsg: string; const aError: TlsfErrorCode);
  545. begin
  546. inherited Create(aMsg);
  547. fErrorCode := aError;
  548. end;
  549. end.