FileVRMLParser.pas 22 KB

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