123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921 |
- //
- // The unit is part of the GLScene Engine, http://glscene.org
- //
- unit Formats.VRML;
- (* VRML file format parser. *)
- interface
- {$I Stage.Defines.inc}
- uses
- System.Classes,
- System.SysUtils,
- System.Types,
- Stage.VectorGeometry,
- Stage.VectorTypes,
- GLS.VectorLists,
- Stage.Utils;
- type
- TVRMLNode = class
- private
- FNodes: TList;
- FParent: TVRMLNode;
- FName, FDefName: String;
- function GetNode(index: Integer): TVRMLNode;
- public
- constructor Create; virtual;
- constructor CreateOwned(AParent: TVRMLNode);
- destructor Destroy; override;
- function Count: Integer;
- procedure Clear;
- procedure Add(node: TVRMLNode);
- procedure Remove(node: TVRMLNode);
- procedure Delete(index: Integer);
- property Nodes[index: Integer]: TVRMLNode read GetNode; default;
- property Parent: TVRMLNode read FParent;
- property Name: String read FName write FName;
- property DefName: String read FDefName write FDefName;
- end;
- TVRMLSingleArray = class(TVRMLNode)
- private
- FValues: TGLSingleList;
- public
- constructor Create; override;
- destructor Destroy; override;
- property Values: TGLSingleList read FValues;
- end;
- TVRMLIntegerArray = class(TVRMLNode)
- private
- FValues: TGLIntegerList;
- public
- constructor Create; override;
- destructor Destroy; override;
- property Values: TGLIntegerList read FValues;
- end;
- TVRMLMaterial = class(TVRMLNode)
- private
- FDiffuseColor, FAmbientColor, FSpecularColor, FEmissiveColor: TVector3f;
- FTransparency, FShininess: Single;
- FHasDiffuse, FHasAmbient, FHasSpecular, FHasEmissive, FHasTransparency,
- FHasShininess: Boolean;
- public
- constructor Create; override;
- property DiffuseColor: TVector3f read FDiffuseColor write FDiffuseColor;
- property AmbientColor: TVector3f read FAmbientColor write FAmbientColor;
- property SpecularColor: TVector3f read FSpecularColor write FSpecularColor;
- property EmissiveColor: TVector3f read FEmissiveColor write FEmissiveColor;
- property Transparency: Single read FTransparency write FTransparency;
- property Shininess: Single read FShininess write FShininess;
- property HasDiffuse: Boolean read FHasDiffuse write FHasDiffuse;
- property HasAmbient: Boolean read FHasAmbient write FHasAmbient;
- property HasSpecular: Boolean read FHasSpecular write FHasSpecular;
- property HasEmissive: Boolean read FHasEmissive write FHasEmissive;
- property HasTransparency: Boolean read FHasTransparency
- write FHasTransparency;
- property HasShininess: Boolean read FHasShininess write FHasShininess;
- end;
- TVRMLUse = class(TVRMLNode)
- private
- FValue: String;
- public
- property Value: String read FValue write FValue;
- end;
- TVRMLShapeHints = class(TVRMLNode)
- private
- FCreaseAngle: Single;
- public
- property CreaseAngle: Single read FCreaseAngle write FCreaseAngle;
- end;
- TVRMLTransform = class(TVRMLNode)
- private
- FCenter: TVector3f;
- FRotation: TVector4f;
- FScaleFactor: TVector3f;
- public
- constructor Create; override;
- property Center: TVector3f read FCenter write FCenter;
- property Rotation: TVector4f read FRotation write FRotation;
- property ScaleFactor: TVector3f read FScaleFactor write FScaleFactor;
- end;
- TVRMLParser = class
- private
- FCursor: Integer;
- FTokens: TStringList;
- FRootNode: TVRMLNode;
- FCurrentNode: TVRMLNode;
- FAllowUnknownNodes: Boolean;
- FDefines: TList;
- protected
- function ReadToken: String;
- function ReadSingle: Single;
- function ReadVector3f: TVector3f;
- function ReadVector4f: TVector4f;
- procedure ReadUnknownArray(DefName: String = '');
- procedure ReadUnknownHeirachy(DefName: String = '');
- procedure ReadUnknown(unknown_token: String; DefName: String = '');
- procedure ReadPointArray(DefName: String = '');
- procedure ReadCoordIndexArray(DefName: String = '');
- procedure ReadNormalIndexArray(DefName: String = '');
- procedure ReadTextureCoordIndexArray(DefName: String = '');
- procedure ReadCoordinate3(DefName: String = '');
- procedure ReadNormal(DefName: String = '');
- procedure ReadTextureCoordinate2(DefName: String = '');
- procedure ReadMaterial(DefName: String = '');
- procedure ReadIndexedFaceSet(DefName: String = '');
- procedure ReadTransform(DefName: String = '');
- procedure ReadShapeHints(DefName: String = '');
- procedure ReadSeparator(DefName: String = '');
- procedure ReadGroup(DefName: String = '');
- procedure ReadDef;
- procedure ReadUse;
- public
- constructor Create;
- destructor Destroy; override;
- procedure Parse(Text: String);
- property RootNode: TVRMLNode read FRootNode;
- property AllowUnknownNodes: Boolean read FAllowUnknownNodes
- write FAllowUnknownNodes;
- end;
- implementation // ------------------------------------------------------------
- function CreateVRMLTokenList(Text: String): TStringList;
- const
- cSymbols: array [0 .. 3] of char = ('{', '}', '[', ']');
- var
- i, j, p: Integer;
- str, token: String;
- begin
- Result := TStringList.Create;
- Result.Text := Text;
- for i := 0 to Result.Count - 1 do
- begin
- p := Pos('#', Result[i]);
- if p > 0 then
- Result[i] := Copy(Result[i], 1, p - 1);
- end;
- Result.CommaText := Result.Text;
- for j := 0 to Length(cSymbols) - 1 do
- begin
- i := 0;
- repeat
- token := Result[i];
- p := Pos(cSymbols[j], token);
- if (p > 0) and (token <> cSymbols[j]) then
- begin
- str := Copy(token, p + 1, Length(token) - p);
- if (p = 1) then
- begin
- Result.Delete(i);
- Result.Insert(i, trim(str));
- Result.Insert(i, cSymbols[j]);
- end
- else
- begin
- Result.Delete(i);
- if Length(str) > 0 then
- Result.Insert(i, trim(str));
- Result.Insert(i, cSymbols[j]);
- Result.Insert(i, trim(Copy(token, 1, p - 1)));
- end;
- end;
- Inc(i);
- until i >= Result.Count - 1;
- end;
- end;
- // ---------------
- // --------------- TVRMLNode ---------------
- // ---------------
- constructor TVRMLNode.Create;
- begin
- FNodes := TList.Create;
- end;
- constructor TVRMLNode.CreateOwned(AParent: TVRMLNode);
- begin
- Create;
- if Assigned(AParent) then
- AParent.Add(Self);
- end;
- destructor TVRMLNode.Destroy;
- begin
- Clear;
- FNodes.Free;
- inherited;
- end;
- function TVRMLNode.GetNode(index: Integer): TVRMLNode;
- begin
- Result := TVRMLNode(FNodes[index]);
- end;
- function TVRMLNode.Count: Integer;
- begin
- Result := FNodes.Count;
- end;
- procedure TVRMLNode.Clear;
- begin
- while FNodes.Count > 0 do
- Delete(0);
- end;
- procedure TVRMLNode.Add(node: TVRMLNode);
- begin
- if not Assigned(node) then
- exit;
- if Assigned(node.Parent) then
- node.Parent.FNodes.Remove(node);
- FNodes.Add(node);
- node.FParent := Self;
- end;
- procedure TVRMLNode.Remove(node: TVRMLNode);
- begin
- if not Assigned(node) then
- exit;
- FNodes.Remove(node);
- node.Free;
- end;
- procedure TVRMLNode.Delete(index: Integer);
- begin
- if (index < 0) or (index >= Count) then
- exit;
- Nodes[index].Free;
- FNodes.Delete(index);
- end;
- // ---------------
- // --------------- TVRMLSingleArray ---------------
- // ---------------
- constructor TVRMLSingleArray.Create;
- begin
- inherited;
- FValues := TGLSingleList.Create;
- end;
- destructor TVRMLSingleArray.Destroy;
- begin
- FValues.Free;
- inherited;
- end;
- // ---------------
- // --------------- TVRMLIntegerArray ---------------
- // ---------------
- constructor TVRMLIntegerArray.Create;
- begin
- inherited;
- FValues := TGLIntegerList.Create;
- end;
- destructor TVRMLIntegerArray.Destroy;
- begin
- FValues.Free;
- inherited;
- end;
- // ---------------
- // --------------- TVRMLMaterial ---------------
- // ---------------
- constructor TVRMLMaterial.Create;
- begin
- inherited;
- // Default shininess value
- FHasDiffuse := False;
- FHasAmbient := False;
- FHasSpecular := False;
- FHasEmissive := False;
- FHasTransparency := False;
- FHasShininess := False;
- end;
- // ---------------
- // --------------- TVRMLTransform ---------------
- // ---------------
- constructor TVRMLTransform.Create;
- begin
- inherited;
- FScaleFactor.X := 1;
- FScaleFactor.Y := 1;
- FScaleFactor.Z := 1;
- end;
- // ---------------
- // --------------- TVRMLParser ---------------
- // ---------------
- constructor TVRMLParser.Create;
- begin
- FDefines := TList.Create;
- FRootNode := TVRMLNode.Create;
- FRootNode.Name := 'Root';
- FAllowUnknownNodes := False;
- end;
- destructor TVRMLParser.Destroy;
- begin
- FDefines.Free;
- FRootNode.Free;
- inherited;
- end;
- function TVRMLParser.ReadToken: String;
- begin
- if FCursor < FTokens.Count then
- begin
- Result := LowerCase(FTokens[FCursor]);
- Inc(FCursor);
- end
- else
- Result := '';
- end;
- procedure TVRMLParser.ReadUnknownArray(DefName: String);
- var
- token: String;
- begin
- if AllowUnknownNodes then
- begin
- FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'Unknown array';
- end;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = ']';
- if AllowUnknownNodes then
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadUnknownHeirachy(DefName: String);
- var
- token: String;
- begin
- if AllowUnknownNodes then
- begin
- FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'Unknown hierarchy';
- end;
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else
- ReadUnknown(token);
- until token = '}';
- if AllowUnknownNodes then
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadUnknown(unknown_token: String; DefName: String);
- begin
- if unknown_token = '{' then
- ReadUnknownHeirachy
- else if unknown_token = '[' then
- ReadUnknownArray
- else if (unknown_token <> '}') and (unknown_token <> ']') and AllowUnknownNodes
- then
- begin
- TVRMLNode.CreateOwned(FCurrentNode).Name := 'UNKNOWN[' +
- unknown_token + ']';
- end;
- end;
- function TVRMLParser.ReadSingle: Single;
- begin
- Result := GLStrToFloatDef(ReadToken, 0);
- end;
- function TVRMLParser.ReadVector3f: TVector3f;
- begin
- Result.X := ReadSingle;
- Result.Y := ReadSingle;
- Result.Z := ReadSingle;
- end;
- function TVRMLParser.ReadVector4f: TVector4f;
- begin
- Result.X := ReadSingle;
- Result.Y := ReadSingle;
- Result.Z := ReadSingle;
- Result.W := ReadSingle;
- end;
- procedure TVRMLParser.ReadPointArray(DefName: String);
- var
- token: String;
- begin
- FCurrentNode := TVRMLSingleArray.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'PointArray';
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '[';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token <> ']' then
- TVRMLSingleArray(FCurrentNode)
- .Values.Add(GLStrToFloatDef(token, 0));
- until token = ']';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadCoordIndexArray(DefName: String = '');
- var
- token: String;
- begin
- FCurrentNode := TVRMLIntegerArray.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'CoordIndexArray';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '[';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token <> ']' then
- TVRMLIntegerArray(FCurrentNode).Values.Add(StrToInt(token));
- until token = ']';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadNormalIndexArray(DefName: String = '');
- var
- token: String;
- begin
- FCurrentNode := TVRMLIntegerArray.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'NormalIndexArray';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '[';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token <> ']' then
- TVRMLIntegerArray(FCurrentNode).Values.Add(StrToInt(token));
- until token = ']';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadTextureCoordIndexArray(DefName: String = '');
- var
- token: String;
- begin
- FCurrentNode := TVRMLIntegerArray.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'TextureCoordIndexArray';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '[';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token <> ']' then
- TVRMLIntegerArray(FCurrentNode).Values.Add(StrToInt(token));
- until token = ']';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadMaterial(DefName: String);
- var
- token: String;
- begin
- FCurrentNode := TVRMLMaterial.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'Material';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '{';
- with TVRMLMaterial(FCurrentNode) do
- begin
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token = 'diffusecolor' then
- begin
- DiffuseColor := ReadVector3f;
- HasDiffuse := True;
- end
- else if token = 'ambientcolor' then
- begin
- AmbientColor := ReadVector3f;
- HasAmbient := True;
- end
- else if token = 'specularcolor' then
- begin
- SpecularColor := ReadVector3f;
- HasSpecular := True;
- end
- else if token = 'emissivecolor' then
- begin
- EmissiveColor := ReadVector3f;
- HasEmissive := True;
- end
- else if token = 'transparency' then
- begin
- Transparency := ReadSingle;
- HasTransparency := True;
- end
- else if token = 'shininess' then
- begin
- Shininess := ReadSingle;
- HasShininess := True;
- end
- else if token <> '}' then
- ReadUnknown(token);
- until token = '}';
- end;
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadCoordinate3(DefName: String = '');
- var
- token: String;
- begin
- FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'Coordinate3';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '{';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token = 'point' then
- ReadPointArray
- else if token <> '}' then
- ReadUnknown(token);
- until token = '}';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadNormal(DefName: String = '');
- var
- token: String;
- begin
- FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'Normal';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '{';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token = 'vector' then
- ReadPointArray
- else if token <> '}' then
- ReadUnknown(token);
- until token = '}';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadTextureCoordinate2(DefName: String = '');
- var
- token: String;
- begin
- FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'TextureCoordinate2';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '{';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token = 'point' then
- ReadPointArray
- else if token <> '}' then
- ReadUnknown(token);
- until token = '}';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadIndexedFaceSet(DefName: String = '');
- var
- token: String;
- begin
- FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'IndexedFaceSet';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '{';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token = 'coordindex' then
- ReadCoordIndexArray
- else if token = 'normalindex' then
- ReadNormalIndexArray
- else if token = 'texturecoordindex' then
- ReadTextureCoordIndexArray
- else if token <> '}' then
- ReadUnknown(token);
- until token = '}';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadTransform(DefName: String);
- var
- token: String;
- begin
- FCurrentNode := TVRMLTransform.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'Transform';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '{';
- with TVRMLTransform(FCurrentNode) do
- begin
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token = 'rotation' then
- Rotation := ReadVector4f
- else if token = 'center' then
- Center := ReadVector3f
- else if token = 'scalefactor' then
- ScaleFactor := ReadVector3f
- else if token <> '}' then
- ReadUnknown(token);
- until token = '}';
- end;
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadShapeHints(DefName: String = '');
- var
- token: String;
- begin
- FCurrentNode := TVRMLShapeHints.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'ShapeHints';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '{';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token = 'creaseangle' then
- TVRMLShapeHints(FCurrentNode).CreaseAngle := ReadSingle
- else if token <> '}' then
- ReadUnknown(token);
- until token = '}';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadSeparator(DefName: String = '');
- var
- token: String;
- begin
- FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'Separator';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '{';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token = 'def' then
- ReadDef
- else if (token = 'group') or (token = 'switch') then
- ReadGroup
- else if token = 'separator' then
- ReadSeparator
- else if token = 'use' then
- ReadUse
- else if token = 'shapehints' then
- ReadShapeHints
- else if token = 'transform' then
- ReadTransform
- else if token = 'material' then
- ReadMaterial
- else if token = 'coordinate3' then
- ReadCoordinate3
- else if token = 'normal' then
- ReadNormal
- else if token = 'texturecoordinate2' then
- ReadTextureCoordinate2
- else if token = 'indexedfaceset' then
- ReadIndexedFaceSet
- else if token <> '}' then
- ReadUnknown(token);
- until token = '}';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadGroup(DefName: String = '');
- var
- token: String;
- begin
- FCurrentNode := TVRMLNode.CreateOwned(FCurrentNode);
- FCurrentNode.Name := 'Group';
- FCurrentNode.DefName := DefName;
- repeat
- token := ReadToken;
- if token = '' then
- exit;
- until token = '{';
- repeat
- token := ReadToken;
- if token = '' then
- exit
- else if token = 'def' then
- ReadDef
- else if (token = 'group') or (token = 'switch') then
- ReadGroup
- else if token = 'separator' then
- ReadSeparator
- else if token = 'use' then
- ReadUse
- else if token = 'shapehints' then
- ReadShapeHints
- else if token = 'transform' then
- ReadTransform
- else if token = 'material' then
- ReadMaterial
- else if token = 'coordinate3' then
- ReadCoordinate3
- else if token = 'indexedfaceset' then
- ReadIndexedFaceSet
- else if token <> '}' then
- ReadUnknown(token);
- until token = '}';
- FCurrentNode := FCurrentNode.Parent;
- end;
- procedure TVRMLParser.ReadDef;
- var
- DefName, token: String;
- begin
- DefName := ReadToken;
- token := ReadToken;
- if (token = 'group') or (token = 'switch') then
- ReadGroup(DefName)
- else if token = 'separator' then
- ReadSeparator(DefName)
- else if token = 'transform' then
- ReadTransform(DefName)
- else if token = 'material' then
- ReadMaterial(DefName)
- else if token = 'coordinate3' then
- ReadCoordinate3(DefName)
- else if token = 'indexedfaceset' then
- ReadIndexedFaceSet(DefName)
- else
- ReadUnknown(token);
- end;
- procedure TVRMLParser.ReadUse;
- begin
- with TVRMLUse.CreateOwned(FCurrentNode) do
- begin
- name := 'Use';
- Value := ReadToken;
- end;
- end;
- procedure TVRMLParser.Parse(Text: String);
- var
- token: String;
- begin
- FTokens := CreateVRMLTokenList(Text);
- FCursor := 0;
- FCurrentNode := FRootNode;
- try
- repeat
- token := ReadToken;
- if token = 'def' then
- ReadDef
- else if (token = 'group') or (token = 'switch') then
- ReadGroup
- else if token = 'separator' then
- ReadSeparator
- else if token = 'use' then
- ReadUse
- else if token = 'shapehints' then
- ReadShapeHints
- else if token = 'transform' then
- ReadTransform
- else if token = 'material' then
- ReadMaterial
- else if token = 'coordinate3' then
- ReadCoordinate3
- else if token = 'indexedfaceset' then
- ReadIndexedFaceSet
- else
- ReadUnknown(token);
- until FCursor >= FTokens.Count;
- finally
- FTokens.Free;
- end;
- end;
- end.
|