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.

648 lines
30 KiB

  1. unit uengShaderFileTypes;
  2. {$mode objfpc}{$H+}
  3. {$I uengShaderFile.inc}
  4. interface
  5. uses
  6. Classes, SysUtils
  7. {$IFDEF SHADER_FILE_USE_BITSPACE_UTILS}
  8. , uutlSerialization, uutlCommon, uutlGenerics
  9. {$ELSE}
  10. , uengShaderFileGenerics
  11. {$ENDIF}
  12. ;
  13. type
  14. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  15. {$IFDEF SHADER_FILE_USE_BITSPACE_UTILS}
  16. IengShaderFileWriter = uutlSerialization.IutlFileWriter;
  17. IengShaderFileReader = uutlSerialization.IutlFileReader;
  18. TengShaderFileReader = uutlSerialization.TutlSimpleFileReader;
  19. TengShaderFileWriter = uutlSerialization.TutlSimpleFileWriter;
  20. TIntfObjNoRefCount = uutlCommon.TutlInterfaceNoRefCount;
  21. {$ELSE}
  22. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  23. TIntfObjNoRefCount = class(TObject, IUnknown)
  24. protected
  25. fRefCount : longint;
  26. { implement methods of IUnknown }
  27. function QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  28. function _AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual;
  29. function _Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF}; virtual;
  30. public
  31. property RefCount: LongInt read fRefCount;
  32. end;
  33. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  34. IengShaderFileReader = interface
  35. ['{3A9C3AE3-CAEE-44C9-85BE-0BCAA5C1BE7A}']
  36. function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  37. end;
  38. IengShaderFileWriter = interface
  39. ['{3DF84644-9FC4-4A8A-88C2-73F13E72B1ED}']
  40. procedure SaveStream(const aFilename: String; const aStream: TStream);
  41. end;
  42. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  43. TengShaderFileReader = class(TInterfacedObject, IengShaderFileReader)
  44. public
  45. function LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  46. end;
  47. TengShaderFileWriter = class(TInterfacedObject, IengShaderFileWriter)
  48. public
  49. procedure SaveStream(const aFilename: String; const aStream: TStream);
  50. end;
  51. {$ENDIF}
  52. TengShaderPartLogLevel = (
  53. llDebug,
  54. llInfo,
  55. llWarning,
  56. llError,
  57. llThrow
  58. );
  59. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  60. TStringVariantMap = specialize TutlMap<string, variant>;
  61. TengShaderCode = class(TStringList)
  62. end;
  63. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  64. TengMetaType = (
  65. metaUnknown,
  66. metaNormal,
  67. metaVersion,
  68. metaExtension,
  69. metaLayout);
  70. TengMetaData = class(TObject)
  71. private
  72. fMetaType: TengMetaType;
  73. fName: String;
  74. fValues: TStringList;
  75. function GetCount: Integer;
  76. function GetValues: TStrings;
  77. public
  78. property MetaType: TengMetaType read fMetaType;
  79. property Name: String read fName;
  80. property Count: Integer read GetCount;
  81. property Values: TStrings read GetValues;
  82. procedure Assign(const aValues: TengMetaData);
  83. constructor Create(const aName: String; const aType: TengMetaType);
  84. destructor Destroy; override;
  85. end;
  86. TengMetaDataList = specialize TutlSimpleList<TengMetaData>;
  87. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  88. //Exceptions////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  89. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  90. EengShaderPart = class(Exception)
  91. protected
  92. function GenerateMessage: String; virtual;
  93. public
  94. Sender: TObject;
  95. Line: Integer;
  96. Col: Integer;
  97. Filename: String;
  98. procedure PrintTrace(const aLines: TStrings);
  99. function PrintTrace: String;
  100. constructor Create(const aSender: TObject); overload;
  101. constructor Create(const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  102. constructor Create(const aMsg: String; const aSender: TObject); overload;
  103. constructor Create(const aMsg: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  104. end;
  105. EengShaderPartInternal = class(EengShaderPart);
  106. EengExpression = class(EengShaderPart);
  107. EengExpressionInternal = class(EengExpression)
  108. ErrorCode: Integer;
  109. constructor Create(const aErrorCode: Integer; const aSender: TObject);
  110. end;
  111. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  112. EengInvalidToken = class(EengShaderPartInternal)
  113. protected
  114. function GenerateMessage: String; override;
  115. public
  116. SenderClassName: String;
  117. Token: String;
  118. constructor Create(const aSenderClassName: String; const aToken: String; const aSender: TObject); overload;
  119. constructor Create(const aSenderClassName: String; const aToken: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  120. end;
  121. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  122. EengUnexpectedToken = class(EengShaderPart)
  123. protected
  124. function GenerateMessage: String; override;
  125. public
  126. Token: String;
  127. Expected: String;
  128. constructor Create(const aToken, aExpected: String; const aSender: TObject); overload;
  129. constructor Create(const aToken, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  130. end;
  131. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  132. EengInvalidParamter = class(EengShaderPart)
  133. protected
  134. function GenerateMessage: String; override;
  135. public
  136. Param: String;
  137. Expected: String;
  138. constructor Create(const aParam, aExpected: String; const aSender: TObject); overload;
  139. constructor Create(const aParam, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  140. end;
  141. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  142. EengInvalidParamterCount = class(EengShaderPart)
  143. protected
  144. function GenerateMessage: String; override;
  145. public
  146. Token: String;
  147. ExpectedMin: Integer;
  148. ExpectedMax: Integer;
  149. constructor Create(const aToken: String; const aExpected: Integer; const aSender: TObject); overload;
  150. constructor Create(const aToken: String; const aExpectedMin, aExpectedMax: Integer; const aSender: TObject); overload;
  151. constructor Create(const aToken: String; const aExpected, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  152. constructor Create(const aToken: String; const aExpectedMin, aExpectedMax, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  153. end;
  154. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  155. EengInvalidIdentifier = class(EengShaderPart)
  156. protected
  157. function GenerateMessage: String; override;
  158. public
  159. Identifier: String;
  160. constructor Create(const aIdentifier: String; const aSender: TObject); overload;
  161. constructor Create(const aIdentifier: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  162. end;
  163. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  164. EengOutOfRange = class(EengShaderPartInternal)
  165. protected
  166. function GenerateMessage: String; override;
  167. public
  168. Min: Integer;
  169. Max: Integer;
  170. Index: Integer;
  171. constructor Create(const aMin, aMax, aIndex: Integer; const aSender: TObject); overload;
  172. constructor Create(const aMin, aMax, aIndex, aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  173. end;
  174. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  175. EengDuplicateIdentifier = class(EengShaderPart)
  176. protected
  177. function GenerateMessage: String; override;
  178. public
  179. Name: String;
  180. New: TObject;
  181. Old: TObject;
  182. constructor Create(const aName: String; const aNew, aOld, aSender: TObject); overload;
  183. constructor Create(const aName: String; const aNew, aOld: TObject; aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  184. end;
  185. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  186. EengUnknownIdentifier = class(EengShaderPart)
  187. protected
  188. function GenerateMessage: String; override;
  189. public
  190. Name: String;
  191. constructor Create(const aName: String; const aSender: TObject); overload;
  192. constructor Create(const aName: String; aLine, aCol: Integer; const aFilename: String; const aSender: TObject); overload;
  193. end;
  194. implementation
  195. uses
  196. uengShaderPart;
  197. {$IFNDEF SHADER_FILE_USE_BITSPACE_UTILS}
  198. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  199. //TIntfObjNoRefCount//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  200. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  201. function TIntfObjNoRefCount.QueryInterface({$IFDEF FPC_HAS_CONSTREF}constref{$ELSE}const{$ENDIF} iid : tguid;out obj) : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  202. begin
  203. if getinterface(iid,obj)
  204. then result := S_OK
  205. else result := longint(E_NOINTERFACE);
  206. end;
  207. function TIntfObjNoRefCount._AddRef : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  208. begin
  209. result := InterLockedIncrement(fRefCount);
  210. end;
  211. function TIntfObjNoRefCount._Release : longint;{$IFNDEF WINDOWS}cdecl{$ELSE}stdcall{$ENDIF};
  212. begin
  213. result := InterLockedDecrement(fRefCount);
  214. end;
  215. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  216. //TengShaderFileReader//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  217. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  218. function TengShaderFileReader.LoadStream(const aFilename: String; const aStream: TStream): Boolean;
  219. var
  220. fs: TFileStream;
  221. begin
  222. result := FileExists(aFilename);
  223. if result then begin
  224. fs := TFileStream.Create(aFilename, fmOpenRead);
  225. try
  226. aStream.CopyFrom(fs, fs.Size - fs.Position);
  227. finally
  228. FreeAndNil(fs);
  229. end;
  230. end;
  231. end;
  232. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  233. //TengShaderFileWriter//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  234. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  235. procedure TengShaderFileWriter.SaveStream(const aFilename: String; const aStream: TStream);
  236. var
  237. fs: TFileStream;
  238. begin
  239. fs := TFileStream.Create(aFilename, fmCreate);
  240. try
  241. fs.CopyFrom(aStream, aStream.Size - aStream.Position);
  242. finally
  243. FreeAndNil(fs);
  244. end;
  245. end;
  246. {$ENDIF}
  247. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  248. //TengMetaData//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  249. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  250. function TengMetaData.GetCount: Integer;
  251. begin
  252. result := fValues.Count;
  253. end;
  254. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  255. function TengMetaData.GetValues: TStrings;
  256. begin
  257. result := fValues;
  258. end;
  259. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  260. procedure TengMetaData.Assign(const aValues: TengMetaData);
  261. begin
  262. fName := aValues.Name;
  263. fMetaType := aValues.MetaType;
  264. fValues.Clear;
  265. fValues.AddStrings(aValues.Values);
  266. end;
  267. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  268. constructor TengMetaData.Create(const aName: String; const aType: TengMetaType);
  269. begin
  270. inherited Create;
  271. fName := aName;
  272. fMetaType := aType;
  273. fValues := TStringList.Create;
  274. end;
  275. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  276. destructor TengMetaData.Destroy;
  277. begin
  278. FreeAndNil(fValues);
  279. inherited Destroy;
  280. end;
  281. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  282. //EengExpressionInternal////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  283. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  284. constructor EengExpressionInternal.Create(const aErrorCode: Integer; const aSender: TObject);
  285. begin
  286. ErrorCode := aErrorCode;
  287. inherited Create('internal error: ' + IntToStr(ErrorCode), aSender);
  288. end;
  289. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  290. //EengShaderPart////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  291. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  292. function EengShaderPart.GenerateMessage: String;
  293. begin
  294. result := ''; // DUMMY
  295. end;
  296. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  297. procedure EengShaderPart.PrintTrace(const aLines: TStrings);
  298. function GetName(const aPart: TengShaderPart): String;
  299. begin
  300. result := aPart.GetTokenName;
  301. if (result = '')
  302. then result := aPart.ClassName
  303. else result := result + ' (' + aPart.ClassName + ')';
  304. end;
  305. begin
  306. if not Assigned(Sender) or not
  307. (Sender is TengShaderPart) then
  308. exit;
  309. aLines.Add(Message);
  310. (Sender as TengShaderPart).PrintTrace(' ', aLines);
  311. end;
  312. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  313. function EengShaderPart.PrintTrace: String;
  314. var
  315. sl: TStringList;
  316. begin
  317. sl := TStringList.Create;
  318. try
  319. PrintTrace(sl);
  320. result := sl.Text;
  321. finally
  322. FreeAndNil(sl);
  323. end;
  324. end;
  325. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  326. constructor EengShaderPart.Create(const aSender: TObject);
  327. begin
  328. Create(GenerateMessage, aSender);
  329. end;
  330. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  331. constructor EengShaderPart.Create(const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  332. begin
  333. Create(GenerateMessage, aLine, aCol, aFilename, aSender);
  334. end;
  335. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  336. constructor EengShaderPart.Create(const aMsg: String; const aSender: TObject);
  337. begin
  338. Sender := nil;
  339. if Assigned(aSender)
  340. then Create(
  341. aMsg,
  342. (aSender as TengShaderPart).Line,
  343. (aSender as TengShaderPart).Col,
  344. (aSender as TengShaderPart).Filename,
  345. aSender)
  346. else inherited Create(Format('%s: %s', [
  347. ClassName,
  348. aMsg]));
  349. end;
  350. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  351. constructor EengShaderPart.Create(const aMsg: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  352. begin
  353. Sender := aSender;
  354. Line := aLine;
  355. Col := aCol;
  356. Filename := aFilename;
  357. inherited Create(Format('%s (%s %d:%d): %s',[
  358. ClassName,
  359. ExtractFileName(Filename),
  360. Line+1,
  361. Col,
  362. aMsg]))
  363. end;
  364. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  365. //EengInvalidToken//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  366. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  367. function EengInvalidToken.GenerateMessage: String;
  368. begin
  369. result := 'invalid token: ' + SenderClassName + ' <> '+ Token;
  370. end;
  371. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  372. constructor EengInvalidToken.Create(const aSenderClassName: String; const aToken: String; const aSender: TObject);
  373. begin
  374. SenderClassName := aSenderClassName;
  375. Token := aToken;
  376. inherited Create(aSender);
  377. end;
  378. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  379. constructor EengInvalidToken.Create(const aSenderClassName: String; const aToken: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  380. begin
  381. SenderClassName := aSenderClassName;
  382. Token := aToken;
  383. inherited Create(aLine, aCol, aFilename, aSender);
  384. end;
  385. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  386. //EengUnexpectedToken///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  387. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  388. function EengUnexpectedToken.GenerateMessage: String;
  389. begin
  390. result := 'unexpected token: ' + Token;
  391. if (Expected <> '') then
  392. result := result + '(expected ' + Expected + ')';
  393. end;
  394. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  395. constructor EengUnexpectedToken.Create(const aToken, aExpected: String; const aSender: TObject);
  396. begin
  397. Token := aToken;
  398. Expected := aExpected;
  399. inherited Create(aSender);
  400. end;
  401. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  402. constructor EengUnexpectedToken.Create(const aToken, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  403. begin
  404. Token := aToken;
  405. Expected := aExpected;
  406. inherited Create(aLine, aCol, aFilename, aSender);
  407. end;
  408. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  409. //EengInvalidParamter///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  410. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  411. function EengInvalidParamter.GenerateMessage: String;
  412. begin
  413. result := 'invalid parameter: ' + Param;
  414. if (Expected <> '') then
  415. result := result + '(expected ' + Expected + ')';
  416. end;
  417. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  418. constructor EengInvalidParamter.Create(const aParam, aExpected: String; const aSender: TObject);
  419. begin
  420. Param := aParam;
  421. Expected := aExpected;
  422. inherited Create(aSender);
  423. end;
  424. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  425. constructor EengInvalidParamter.Create(const aParam, aExpected: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  426. begin
  427. Param := aParam;
  428. Expected := aExpected;
  429. inherited Create(aLine, aCol, aFilename, aSender);
  430. end;
  431. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  432. //EengInvalidParamterCount//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  433. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  434. function EengInvalidParamterCount.GenerateMessage: String;
  435. begin
  436. result := 'invalid parameter count in ' + Token + '(expected ';
  437. if (ExpectedMin = ExpectedMax) then
  438. result := result + IntToStr(ExpectedMin)
  439. else if (ExpectedMax < 0) then
  440. result := result + ' at least ' + IntToStr(ExpectedMin)
  441. else
  442. result := IntToStr(ExpectedMin) + ' to ' + IntToStr(ExpectedMax);
  443. result := result + 'parameter)';
  444. end;
  445. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  446. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpected: Integer; const aSender: TObject);
  447. begin
  448. Token := aToken;
  449. ExpectedMin := aExpected;
  450. ExpectedMax := aExpected;
  451. inherited Create(aSender);
  452. end;
  453. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  454. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpectedMin, aExpectedMax: Integer; const aSender: TObject);
  455. begin
  456. Token := aToken;
  457. ExpectedMin := aExpectedMin;
  458. ExpectedMax := aExpectedMax;
  459. inherited Create(aSender);
  460. end;
  461. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  462. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpected, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  463. begin
  464. Token := aToken;
  465. ExpectedMin := aExpected;
  466. ExpectedMax := aExpected;
  467. inherited Create(aLine, aCol, aFilename, aSender);
  468. end;
  469. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  470. constructor EengInvalidParamterCount.Create(const aToken: String; const aExpectedMin, aExpectedMax, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  471. begin
  472. Token := aToken;
  473. ExpectedMin := aExpectedMin;
  474. ExpectedMax := aExpectedMax;
  475. inherited Create(aLine, aCol, aFilename, aSender);
  476. end;
  477. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  478. //EengInvalidIdentifier/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  479. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  480. function EengInvalidIdentifier.GenerateMessage: String;
  481. begin
  482. result := 'invalid identifier: ' + Identifier;
  483. end;
  484. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  485. constructor EengInvalidIdentifier.Create(const aIdentifier: String; const aSender: TObject);
  486. begin
  487. Identifier := aIdentifier;
  488. inherited Create(aSender);
  489. end;
  490. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  491. constructor EengInvalidIdentifier.Create(const aIdentifier: String; const aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  492. begin
  493. Identifier := aIdentifier;
  494. inherited Create(aLine, aCol, aFilename, aSender);
  495. end;
  496. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  497. //EengOutOfRange////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  498. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  499. function EengOutOfRange.GenerateMessage: String;
  500. begin
  501. result := format('index (%d) out of range (%d:%d)', [Index, Min, Max])
  502. end;
  503. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  504. constructor EengOutOfRange.Create(const aMin, aMax, aIndex: Integer; const aSender: TObject);
  505. begin
  506. Min := aMin;
  507. Max := aMax;
  508. Index := aIndex;
  509. inherited Create(aSender);
  510. end;
  511. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  512. constructor EengOutOfRange.Create(const aMin, aMax, aIndex, aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  513. begin
  514. Min := aMin;
  515. Max := aMax;
  516. Index := aIndex;
  517. inherited Create(aLine, aCol, aFilename, aSender);
  518. end;
  519. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  520. //EengDuplicateIdentifier///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  521. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  522. function EengDuplicateIdentifier.GenerateMessage: String;
  523. begin
  524. result := 'duplicate identifier: ' + Name;
  525. if (New is TengShaderPart) then
  526. result := result + Format('(%s %d:%d)', [
  527. (New as TengShaderPart).Filename,
  528. (New as TengShaderPart).Line,
  529. (New as TengShaderPart).Col]);
  530. if (Old is TengShaderPart) then
  531. result := result + Format('(previously declared here %s %d:%d)', [
  532. (Old as TengShaderPart).Filename,
  533. (Old as TengShaderPart).Line,
  534. (Old as TengShaderPart).Col]);
  535. end;
  536. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  537. constructor EengDuplicateIdentifier.Create(const aName: String; const aNew, aOld, aSender: TObject);
  538. begin
  539. Name := aName;
  540. New := aNew;
  541. Old := aOld;
  542. inherited Create(aSender);
  543. end;
  544. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  545. constructor EengDuplicateIdentifier.Create(const aName: String; const aNew, aOld: TObject; aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  546. begin
  547. Name := aName;
  548. New := aNew;
  549. Old := aOld;
  550. inherited Create(aLine, aCol, aFilename, aSender);
  551. end;
  552. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  553. //EengUnknownIdentifier/////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  554. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  555. function EengUnknownIdentifier.GenerateMessage: String;
  556. begin
  557. result := 'unknown identifier: ' + Name;
  558. end;
  559. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  560. constructor EengUnknownIdentifier.Create(const aName: String; const aSender: TObject);
  561. begin
  562. Name := aName;
  563. inherited Create(aSender);
  564. end;
  565. ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
  566. constructor EengUnknownIdentifier.Create(const aName: String; aLine, aCol: Integer; const aFilename: String; const aSender: TObject);
  567. begin
  568. Name := aName;
  569. inherited Create(aLine, aCol, aFilename, aSender);
  570. end;
  571. end.