25'ten fazla konu seçemezsiniz Konular bir harf veya rakamla başlamalı, kısa çizgiler ('-') içerebilir ve en fazla 35 karakter uzunluğunda olabilir.

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