2
0

Formatx.VRML.pas 21 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921
  1. //
  2. // The unit is part of the GLScene Engine, http://glscene.org
  3. //
  4. unit Formatx.VRML;
  5. (* VRML file format parser. *)
  6. interface
  7. {$I Stage.Defines.inc}
  8. uses
  9. System.Classes,
  10. System.SysUtils,
  11. System.Types,
  12. Stage.VectorGeometry,
  13. Stage.VectorTypes,
  14. GXS.VectorLists,
  15. Stage.Utils;
  16. type
  17. TVRMLNode = class
  18. private
  19. FNodes: TList;
  20. FParent: TVRMLNode;
  21. FName, FDefName: String;
  22. function GetNode(index: Integer): TVRMLNode;
  23. public
  24. constructor Create; virtual;
  25. constructor CreateOwned(AParent: TVRMLNode);
  26. destructor Destroy; override;
  27. function Count: Integer;
  28. procedure Clear;
  29. procedure Add(node: TVRMLNode);
  30. procedure Remove(node: TVRMLNode);
  31. procedure Delete(index: Integer);
  32. property Nodes[index: Integer]: TVRMLNode read GetNode; default;
  33. property Parent: TVRMLNode read FParent;
  34. property Name: String read FName write FName;
  35. property DefName: String read FDefName write FDefName;
  36. end;
  37. TVRMLSingleArray = class(TVRMLNode)
  38. private
  39. FValues: TgxSingleList;
  40. public
  41. constructor Create; override;
  42. destructor Destroy; override;
  43. property Values: TgxSingleList read FValues;
  44. end;
  45. TVRMLIntegerArray = class(TVRMLNode)
  46. private
  47. FValues: TgxIntegerList;
  48. public
  49. constructor Create; override;
  50. destructor Destroy; override;
  51. property Values: TgxIntegerList read FValues;
  52. end;
  53. TVRMLMaterial = class(TVRMLNode)
  54. private
  55. FDiffuseColor, FAmbientColor, FSpecularColor, FEmissiveColor: TVector3f;
  56. FTransparency, FShininess: Single;
  57. FHasDiffuse, FHasAmbient, FHasSpecular, FHasEmissive, FHasTransparency,
  58. FHasShininess: Boolean;
  59. public
  60. constructor Create; override;
  61. property DiffuseColor: TVector3f read FDiffuseColor write FDiffuseColor;
  62. property AmbientColor: TVector3f read FAmbientColor write FAmbientColor;
  63. property SpecularColor: TVector3f read FSpecularColor write FSpecularColor;
  64. property EmissiveColor: TVector3f read FEmissiveColor write FEmissiveColor;
  65. property Transparency: Single read FTransparency write FTransparency;
  66. property Shininess: Single read FShininess write FShininess;
  67. property HasDiffuse: Boolean read FHasDiffuse write FHasDiffuse;
  68. property HasAmbient: Boolean read FHasAmbient write FHasAmbient;
  69. property HasSpecular: Boolean read FHasSpecular write FHasSpecular;
  70. property HasEmissive: Boolean read FHasEmissive write FHasEmissive;
  71. property HasTransparency: Boolean read FHasTransparency
  72. write FHasTransparency;
  73. property HasShininess: Boolean read FHasShininess write FHasShininess;
  74. end;
  75. TVRMLUse = class(TVRMLNode)
  76. private
  77. FValue: String;
  78. public
  79. property Value: String read FValue write FValue;
  80. end;
  81. TVRMLShapeHints = class(TVRMLNode)
  82. private
  83. FCreaseAngle: Single;
  84. public
  85. property CreaseAngle: Single read FCreaseAngle write FCreaseAngle;
  86. end;
  87. TVRMLTransform = class(TVRMLNode)
  88. private
  89. FCenter: TVector3f;
  90. FRotation: TVector4f;
  91. FScaleFactor: TVector3f;
  92. public
  93. constructor Create; override;
  94. property Center: TVector3f read FCenter write FCenter;
  95. property Rotation: TVector4f read FRotation write FRotation;
  96. property ScaleFactor: TVector3f read FScaleFactor write FScaleFactor;
  97. end;
  98. TVRMLParser = class
  99. private
  100. FCursor: Integer;
  101. FTokens: TStringList;
  102. FRootNode: TVRMLNode;
  103. FCurrentNode: TVRMLNode;
  104. FAllowUnknownNodes: Boolean;
  105. FDefines: TList;
  106. protected
  107. function ReadToken: String;
  108. function ReadSingle: Single;
  109. function ReadVector3f: TVector3f;
  110. function ReadVector4f: TVector4f;
  111. procedure ReadUnknownArray(DefName: String = '');
  112. procedure ReadUnknownHeirachy(DefName: String = '');
  113. procedure ReadUnknown(unknown_token: String; DefName: String = '');
  114. procedure ReadPointArray(DefName: String = '');
  115. procedure ReadCoordIndexArray(DefName: String = '');
  116. procedure ReadNormalIndexArray(DefName: String = '');
  117. procedure ReadTextureCoordIndexArray(DefName: String = '');
  118. procedure ReadCoordinate3(DefName: String = '');
  119. procedure ReadNormal(DefName: String = '');
  120. procedure ReadTextureCoordinate2(DefName: String = '');
  121. procedure ReadMaterial(DefName: String = '');
  122. procedure ReadIndexedFaceSet(DefName: String = '');
  123. procedure ReadTransform(DefName: String = '');
  124. procedure ReadShapeHints(DefName: String = '');
  125. procedure ReadSeparator(DefName: String = '');
  126. procedure ReadGroup(DefName: String = '');
  127. procedure ReadDef;
  128. procedure ReadUse;
  129. public
  130. constructor Create;
  131. destructor Destroy; override;
  132. procedure Parse(Text: String);
  133. property RootNode: TVRMLNode read FRootNode;
  134. property AllowUnknownNodes: Boolean read FAllowUnknownNodes
  135. write FAllowUnknownNodes;
  136. end;
  137. implementation // ------------------------------------------------------------
  138. function CreateVRMLTokenList(Text: String): TStringList;
  139. const
  140. cSymbols: array [0 .. 3] of char = ('{', '}', '[', ']');
  141. var
  142. i, j, p: Integer;
  143. str, token: String;
  144. begin
  145. Result := TStringList.Create;
  146. Result.Text := Text;
  147. for i := 0 to Result.Count - 1 do
  148. begin
  149. p := Pos('#', Result[i]);
  150. if p > 0 then
  151. Result[i] := Copy(Result[i], 1, p - 1);
  152. end;
  153. Result.CommaText := Result.Text;
  154. for j := 0 to Length(cSymbols) - 1 do
  155. begin
  156. i := 0;
  157. repeat
  158. token := Result[i];
  159. p := Pos(cSymbols[j], token);
  160. if (p > 0) and (token <> cSymbols[j]) then
  161. begin
  162. str := Copy(token, p + 1, Length(token) - p);
  163. if (p = 1) then
  164. begin
  165. Result.Delete(i);
  166. Result.Insert(i, trim(str));
  167. Result.Insert(i, cSymbols[j]);
  168. end
  169. else
  170. begin
  171. Result.Delete(i);
  172. if Length(str) > 0 then
  173. Result.Insert(i, trim(str));
  174. Result.Insert(i, cSymbols[j]);
  175. Result.Insert(i, trim(Copy(token, 1, p - 1)));
  176. end;
  177. end;
  178. Inc(i);
  179. until i >= Result.Count - 1;
  180. end;
  181. end;
  182. // ---------------
  183. // --------------- TVRMLNode ---------------
  184. // ---------------
  185. constructor TVRMLNode.Create;
  186. begin
  187. FNodes := TList.Create;
  188. end;
  189. constructor TVRMLNode.CreateOwned(AParent: TVRMLNode);
  190. begin
  191. Create;
  192. if Assigned(AParent) then
  193. AParent.Add(Self);
  194. end;
  195. destructor TVRMLNode.Destroy;
  196. begin
  197. Clear;
  198. FNodes.Free;
  199. inherited;
  200. end;
  201. function TVRMLNode.GetNode(index: Integer): TVRMLNode;
  202. begin
  203. Result := TVRMLNode(FNodes[index]);
  204. end;
  205. function TVRMLNode.Count: Integer;
  206. begin
  207. Result := FNodes.Count;
  208. end;
  209. procedure TVRMLNode.Clear;
  210. begin
  211. while FNodes.Count > 0 do
  212. Delete(0);
  213. end;
  214. procedure TVRMLNode.Add(node: TVRMLNode);
  215. begin
  216. if not Assigned(node) then
  217. exit;
  218. if Assigned(node.Parent) then
  219. node.Parent.FNodes.Remove(node);
  220. FNodes.Add(node);
  221. node.FParent := Self;
  222. end;
  223. procedure TVRMLNode.Remove(node: TVRMLNode);
  224. begin
  225. if not Assigned(node) then
  226. exit;
  227. FNodes.Remove(node);
  228. node.Free;
  229. end;
  230. procedure TVRMLNode.Delete(index: Integer);
  231. begin
  232. if (index < 0) or (index >= Count) then
  233. exit;
  234. Nodes[index].Free;
  235. FNodes.Delete(index);
  236. end;
  237. // ---------------
  238. // --------------- TVRMLSingleArray ---------------
  239. // ---------------
  240. constructor TVRMLSingleArray.Create;
  241. begin
  242. inherited;
  243. FValues := TgxSingleList.Create;
  244. end;
  245. destructor TVRMLSingleArray.Destroy;
  246. begin
  247. FValues.Free;
  248. inherited;
  249. end;
  250. // ---------------
  251. // --------------- TVRMLIntegerArray ---------------
  252. // ---------------
  253. constructor TVRMLIntegerArray.Create;
  254. begin
  255. inherited;
  256. FValues := TgxIntegerList.Create;
  257. end;
  258. destructor TVRMLIntegerArray.Destroy;
  259. begin
  260. FValues.Free;
  261. inherited;
  262. end;
  263. // ---------------
  264. // --------------- TVRMLMaterial ---------------
  265. // ---------------
  266. constructor TVRMLMaterial.Create;
  267. begin
  268. inherited;
  269. // Default shininess value
  270. FHasDiffuse := False;
  271. FHasAmbient := False;
  272. FHasSpecular := False;
  273. FHasEmissive := False;
  274. FHasTransparency := False;
  275. FHasShininess := False;
  276. end;
  277. // ---------------
  278. // --------------- TVRMLTransform ---------------
  279. // ---------------
  280. constructor TVRMLTransform.Create;
  281. begin
  282. inherited;
  283. FScaleFactor.X := 1;
  284. FScaleFactor.Y := 1;
  285. FScaleFactor.Z := 1;
  286. end;
  287. // ---------------
  288. // --------------- TVRMLParser ---------------
  289. // ---------------
  290. constructor TVRMLParser.Create;
  291. begin
  292. FDefines := TList.Create;
  293. FRootNode := TVRMLNode.Create;
  294. FRootNode.Name := 'Root';
  295. FAllowUnknownNodes := False;
  296. end;
  297. destructor TVRMLParser.Destroy;
  298. begin
  299. FDefines.Free;
  300. FRootNode.Free;
  301. inherited;
  302. end;
  303. function TVRMLParser.ReadToken: String;
  304. begin
  305. if FCursor < FTokens.Count then
  306. begin
  307. Result := LowerCase(FTokens[FCursor]);
  308. Inc(FCursor);
  309. end
  310. else
  311. Result := '';
  312. end;
  313. procedure TVRMLParser.ReadUnknownArray(DefName: String);
  314. var
  315. token: String;
  316. begin
  317. if AllowUnknownNodes then
  318. begin
  319. FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
  320. FCurrentNode.Name := 'Unknown array';
  321. end;
  322. repeat
  323. token := ReadToken;
  324. if token = '' then
  325. exit;
  326. until token = ']';
  327. if AllowUnknownNodes then
  328. FCurrentNode := FCurrentNode.Parent;
  329. end;
  330. procedure TVRMLParser.ReadUnknownHeirachy(DefName: String);
  331. var
  332. token: String;
  333. begin
  334. if AllowUnknownNodes then
  335. begin
  336. FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
  337. FCurrentNode.Name := 'Unknown hierarchy';
  338. end;
  339. repeat
  340. token := ReadToken;
  341. if token = '' then
  342. exit
  343. else
  344. ReadUnknown(token);
  345. until token = '}';
  346. if AllowUnknownNodes then
  347. FCurrentNode := FCurrentNode.Parent;
  348. end;
  349. procedure TVRMLParser.ReadUnknown(unknown_token: String; DefName: String);
  350. begin
  351. if unknown_token = '{' then
  352. ReadUnknownHeirachy
  353. else if unknown_token = '[' then
  354. ReadUnknownArray
  355. else if (unknown_token <> '}') and (unknown_token <> ']') and AllowUnknownNodes
  356. then
  357. begin
  358. TVRMLNode.CreateOwned(FCurrentNode).Name := 'UNKNOWN[' +
  359. unknown_token + ']';
  360. end;
  361. end;
  362. function TVRMLParser.ReadSingle: Single;
  363. begin
  364. Result := GLStrToFloatDef(ReadToken, 0);
  365. end;
  366. function TVRMLParser.ReadVector3f: TVector3f;
  367. begin
  368. Result.X := ReadSingle;
  369. Result.Y := ReadSingle;
  370. Result.Z := ReadSingle;
  371. end;
  372. function TVRMLParser.ReadVector4f: TVector4f;
  373. begin
  374. Result.X := ReadSingle;
  375. Result.Y := ReadSingle;
  376. Result.Z := ReadSingle;
  377. Result.W := ReadSingle;
  378. end;
  379. procedure TVRMLParser.ReadPointArray(DefName: String);
  380. var
  381. token: String;
  382. begin
  383. FCurrentNode := TVRMLSingleArray.CreateOwned(FCurrentNode);
  384. FCurrentNode.Name := 'PointArray';
  385. repeat
  386. token := ReadToken;
  387. if token = '' then
  388. exit;
  389. until token = '[';
  390. repeat
  391. token := ReadToken;
  392. if token = '' then
  393. exit
  394. else if token <> ']' then
  395. TVRMLSingleArray(FCurrentNode)
  396. .Values.Add(GLStrToFloatDef(token, 0));
  397. until token = ']';
  398. FCurrentNode := FCurrentNode.Parent;
  399. end;
  400. procedure TVRMLParser.ReadCoordIndexArray(DefName: String = '');
  401. var
  402. token: String;
  403. begin
  404. FCurrentNode := TVRMLIntegerArray.CreateOwned(FCurrentNode);
  405. FCurrentNode.Name := 'CoordIndexArray';
  406. FCurrentNode.DefName := DefName;
  407. repeat
  408. token := ReadToken;
  409. if token = '' then
  410. exit;
  411. until token = '[';
  412. repeat
  413. token := ReadToken;
  414. if token = '' then
  415. exit
  416. else if token <> ']' then
  417. TVRMLIntegerArray(FCurrentNode).Values.Add(StrToInt(token));
  418. until token = ']';
  419. FCurrentNode := FCurrentNode.Parent;
  420. end;
  421. procedure TVRMLParser.ReadNormalIndexArray(DefName: String = '');
  422. var
  423. token: String;
  424. begin
  425. FCurrentNode := TVRMLIntegerArray.CreateOwned(FCurrentNode);
  426. FCurrentNode.Name := 'NormalIndexArray';
  427. FCurrentNode.DefName := DefName;
  428. repeat
  429. token := ReadToken;
  430. if token = '' then
  431. exit;
  432. until token = '[';
  433. repeat
  434. token := ReadToken;
  435. if token = '' then
  436. exit
  437. else if token <> ']' then
  438. TVRMLIntegerArray(FCurrentNode).Values.Add(StrToInt(token));
  439. until token = ']';
  440. FCurrentNode := FCurrentNode.Parent;
  441. end;
  442. procedure TVRMLParser.ReadTextureCoordIndexArray(DefName: String = '');
  443. var
  444. token: String;
  445. begin
  446. FCurrentNode := TVRMLIntegerArray.CreateOwned(FCurrentNode);
  447. FCurrentNode.Name := 'TextureCoordIndexArray';
  448. FCurrentNode.DefName := DefName;
  449. repeat
  450. token := ReadToken;
  451. if token = '' then
  452. exit;
  453. until token = '[';
  454. repeat
  455. token := ReadToken;
  456. if token = '' then
  457. exit
  458. else if token <> ']' then
  459. TVRMLIntegerArray(FCurrentNode).Values.Add(StrToInt(token));
  460. until token = ']';
  461. FCurrentNode := FCurrentNode.Parent;
  462. end;
  463. procedure TVRMLParser.ReadMaterial(DefName: String);
  464. var
  465. token: String;
  466. begin
  467. FCurrentNode := TVRMLMaterial.CreateOwned(FCurrentNode);
  468. FCurrentNode.Name := 'Material';
  469. FCurrentNode.DefName := DefName;
  470. repeat
  471. token := ReadToken;
  472. if token = '' then
  473. exit;
  474. until token = '{';
  475. with TVRMLMaterial(FCurrentNode) do
  476. begin
  477. repeat
  478. token := ReadToken;
  479. if token = '' then
  480. exit
  481. else if token = 'diffusecolor' then
  482. begin
  483. DiffuseColor := ReadVector3f;
  484. HasDiffuse := True;
  485. end
  486. else if token = 'ambientcolor' then
  487. begin
  488. AmbientColor := ReadVector3f;
  489. HasAmbient := True;
  490. end
  491. else if token = 'specularcolor' then
  492. begin
  493. SpecularColor := ReadVector3f;
  494. HasSpecular := True;
  495. end
  496. else if token = 'emissivecolor' then
  497. begin
  498. EmissiveColor := ReadVector3f;
  499. HasEmissive := True;
  500. end
  501. else if token = 'transparency' then
  502. begin
  503. Transparency := ReadSingle;
  504. HasTransparency := True;
  505. end
  506. else if token = 'shininess' then
  507. begin
  508. Shininess := ReadSingle;
  509. HasShininess := True;
  510. end
  511. else if token <> '}' then
  512. ReadUnknown(token);
  513. until token = '}';
  514. end;
  515. FCurrentNode := FCurrentNode.Parent;
  516. end;
  517. procedure TVRMLParser.ReadCoordinate3(DefName: String = '');
  518. var
  519. token: String;
  520. begin
  521. FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
  522. FCurrentNode.Name := 'Coordinate3';
  523. FCurrentNode.DefName := DefName;
  524. repeat
  525. token := ReadToken;
  526. if token = '' then
  527. exit;
  528. until token = '{';
  529. repeat
  530. token := ReadToken;
  531. if token = '' then
  532. exit
  533. else if token = 'point' then
  534. ReadPointArray
  535. else if token <> '}' then
  536. ReadUnknown(token);
  537. until token = '}';
  538. FCurrentNode := FCurrentNode.Parent;
  539. end;
  540. procedure TVRMLParser.ReadNormal(DefName: String = '');
  541. var
  542. token: String;
  543. begin
  544. FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
  545. FCurrentNode.Name := 'Normal';
  546. FCurrentNode.DefName := DefName;
  547. repeat
  548. token := ReadToken;
  549. if token = '' then
  550. exit;
  551. until token = '{';
  552. repeat
  553. token := ReadToken;
  554. if token = '' then
  555. exit
  556. else if token = 'vector' then
  557. ReadPointArray
  558. else if token <> '}' then
  559. ReadUnknown(token);
  560. until token = '}';
  561. FCurrentNode := FCurrentNode.Parent;
  562. end;
  563. procedure TVRMLParser.ReadTextureCoordinate2(DefName: String = '');
  564. var
  565. token: String;
  566. begin
  567. FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
  568. FCurrentNode.Name := 'TextureCoordinate2';
  569. FCurrentNode.DefName := DefName;
  570. repeat
  571. token := ReadToken;
  572. if token = '' then
  573. exit;
  574. until token = '{';
  575. repeat
  576. token := ReadToken;
  577. if token = '' then
  578. exit
  579. else if token = 'point' then
  580. ReadPointArray
  581. else if token <> '}' then
  582. ReadUnknown(token);
  583. until token = '}';
  584. FCurrentNode := FCurrentNode.Parent;
  585. end;
  586. procedure TVRMLParser.ReadIndexedFaceSet(DefName: String = '');
  587. var
  588. token: String;
  589. begin
  590. FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
  591. FCurrentNode.Name := 'IndexedFaceSet';
  592. FCurrentNode.DefName := DefName;
  593. repeat
  594. token := ReadToken;
  595. if token = '' then
  596. exit;
  597. until token = '{';
  598. repeat
  599. token := ReadToken;
  600. if token = '' then
  601. exit
  602. else if token = 'coordindex' then
  603. ReadCoordIndexArray
  604. else if token = 'normalindex' then
  605. ReadNormalIndexArray
  606. else if token = 'texturecoordindex' then
  607. ReadTextureCoordIndexArray
  608. else if token <> '}' then
  609. ReadUnknown(token);
  610. until token = '}';
  611. FCurrentNode := FCurrentNode.Parent;
  612. end;
  613. procedure TVRMLParser.ReadTransform(DefName: String);
  614. var
  615. token: String;
  616. begin
  617. FCurrentNode := TVRMLTransform.CreateOwned(FCurrentNode);
  618. FCurrentNode.Name := 'Transform';
  619. FCurrentNode.DefName := DefName;
  620. repeat
  621. token := ReadToken;
  622. if token = '' then
  623. exit;
  624. until token = '{';
  625. with TVRMLTransform(FCurrentNode) do
  626. begin
  627. repeat
  628. token := ReadToken;
  629. if token = '' then
  630. exit
  631. else if token = 'rotation' then
  632. Rotation := ReadVector4f
  633. else if token = 'center' then
  634. Center := ReadVector3f
  635. else if token = 'scalefactor' then
  636. ScaleFactor := ReadVector3f
  637. else if token <> '}' then
  638. ReadUnknown(token);
  639. until token = '}';
  640. end;
  641. FCurrentNode := FCurrentNode.Parent;
  642. end;
  643. procedure TVRMLParser.ReadShapeHints(DefName: String = '');
  644. var
  645. token: String;
  646. begin
  647. FCurrentNode := TVRMLShapeHints.CreateOwned(FCurrentNode);
  648. FCurrentNode.Name := 'ShapeHints';
  649. FCurrentNode.DefName := DefName;
  650. repeat
  651. token := ReadToken;
  652. if token = '' then
  653. exit;
  654. until token = '{';
  655. repeat
  656. token := ReadToken;
  657. if token = '' then
  658. exit
  659. else if token = 'creaseangle' then
  660. TVRMLShapeHints(FCurrentNode).CreaseAngle := ReadSingle
  661. else if token <> '}' then
  662. ReadUnknown(token);
  663. until token = '}';
  664. FCurrentNode := FCurrentNode.Parent;
  665. end;
  666. procedure TVRMLParser.ReadSeparator(DefName: String = '');
  667. var
  668. token: String;
  669. begin
  670. FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
  671. FCurrentNode.Name := 'Separator';
  672. FCurrentNode.DefName := DefName;
  673. repeat
  674. token := ReadToken;
  675. if token = '' then
  676. exit;
  677. until token = '{';
  678. repeat
  679. token := ReadToken;
  680. if token = '' then
  681. exit
  682. else if token = 'def' then
  683. ReadDef
  684. else if (token = 'group') or (token = 'switch') then
  685. ReadGroup
  686. else if token = 'separator' then
  687. ReadSeparator
  688. else if token = 'use' then
  689. ReadUse
  690. else if token = 'shapehints' then
  691. ReadShapeHints
  692. else if token = 'transform' then
  693. ReadTransform
  694. else if token = 'material' then
  695. ReadMaterial
  696. else if token = 'coordinate3' then
  697. ReadCoordinate3
  698. else if token = 'normal' then
  699. ReadNormal
  700. else if token = 'texturecoordinate2' then
  701. ReadTextureCoordinate2
  702. else if token = 'indexedfaceset' then
  703. ReadIndexedFaceSet
  704. else if token <> '}' then
  705. ReadUnknown(token);
  706. until token = '}';
  707. FCurrentNode := FCurrentNode.Parent;
  708. end;
  709. procedure TVRMLParser.ReadGroup(DefName: String = '');
  710. var
  711. token: String;
  712. begin
  713. FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
  714. FCurrentNode.Name := 'Group';
  715. FCurrentNode.DefName := DefName;
  716. repeat
  717. token := ReadToken;
  718. if token = '' then
  719. exit;
  720. until token = '{';
  721. repeat
  722. token := ReadToken;
  723. if token = '' then
  724. exit
  725. else if token = 'def' then
  726. ReadDef
  727. else if (token = 'group') or (token = 'switch') then
  728. ReadGroup
  729. else if token = 'separator' then
  730. ReadSeparator
  731. else if token = 'use' then
  732. ReadUse
  733. else if token = 'shapehints' then
  734. ReadShapeHints
  735. else if token = 'transform' then
  736. ReadTransform
  737. else if token = 'material' then
  738. ReadMaterial
  739. else if token = 'coordinate3' then
  740. ReadCoordinate3
  741. else if token = 'indexedfaceset' then
  742. ReadIndexedFaceSet
  743. else if token <> '}' then
  744. ReadUnknown(token);
  745. until token = '}';
  746. FCurrentNode := FCurrentNode.Parent;
  747. end;
  748. procedure TVRMLParser.ReadDef;
  749. var
  750. DefName, token: String;
  751. begin
  752. DefName := ReadToken;
  753. token := ReadToken;
  754. if (token = 'group') or (token = 'switch') then
  755. ReadGroup(DefName)
  756. else if token = 'separator' then
  757. ReadSeparator(DefName)
  758. else if token = 'transform' then
  759. ReadTransform(DefName)
  760. else if token = 'material' then
  761. ReadMaterial(DefName)
  762. else if token = 'coordinate3' then
  763. ReadCoordinate3(DefName)
  764. else if token = 'indexedfaceset' then
  765. ReadIndexedFaceSet(DefName)
  766. else
  767. ReadUnknown(token);
  768. end;
  769. procedure TVRMLParser.ReadUse;
  770. begin
  771. with TVRMLUse.CreateOwned(FCurrentNode) do
  772. begin
  773. name := 'Use';
  774. Value := ReadToken;
  775. end;
  776. end;
  777. procedure TVRMLParser.Parse(Text: String);
  778. var
  779. token: String;
  780. begin
  781. FTokens := CreateVRMLTokenList(Text);
  782. FCursor := 0;
  783. FCurrentNode := FRootNode;
  784. try
  785. repeat
  786. token := ReadToken;
  787. if token = 'def' then
  788. ReadDef
  789. else if (token = 'group') or (token = 'switch') then
  790. ReadGroup
  791. else if token = 'separator' then
  792. ReadSeparator
  793. else if token = 'use' then
  794. ReadUse
  795. else if token = 'shapehints' then
  796. ReadShapeHints
  797. else if token = 'transform' then
  798. ReadTransform
  799. else if token = 'material' then
  800. ReadMaterial
  801. else if token = 'coordinate3' then
  802. ReadCoordinate3
  803. else if token = 'indexedfaceset' then
  804. ReadIndexedFaceSet
  805. else
  806. ReadUnknown(token);
  807. until FCursor >= FTokens.Count;
  808. finally
  809. FTokens.Free;
  810. end;
  811. end;
  812. end.