public void Read(string file) { Clear(); FileInfo fi = new FileInfo(file); _Tokenizer = new FileTokenizer(file); bool eof = false; bool havetoken = false; while (!eof) { try { if (!havetoken) { eof = _Tokenizer.GetToken(); } havetoken = false; switch (_Tokenizer.Token.ToLower()) { #region " Attachment " case CommandAttachment.Command: CommandAttachment attach = new CommandAttachment(); _Tokenizer.GetToken(); attach.Name = _Tokenizer.Token; _Tokenizer.GetToken(); attach.Bone = _Tokenizer.Token; _Tokenizer.GetToken(); attach.Position.X = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); attach.Position.Y = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); attach.Position.Z = Convert.ToSingle(_Tokenizer.Token); _AttachmentCollection.Add(attach); break; #endregion #region " BBox " case CommandBBox.Command: _BBox = new CommandBBox(); _Tokenizer.GetToken(); _BBox.Min.X = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); _BBox.Min.Y = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); _BBox.Min.Z = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); _BBox.Max.X = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); _BBox.Max.Y = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); _BBox.Max.Z = Convert.ToSingle(_Tokenizer.Token); break; #endregion #region " Body " case CommandBody.Command: CommandBody body = new CommandBody(); _Tokenizer.GetToken(); body.Name = _Tokenizer.Token; _Tokenizer.GetToken(); body.File = _Tokenizer.Token; StaticMethods.SmdFile = fi.DirectoryName + "\\" + body.File + ".smd"; _BodyCollection.Add(body); break; #endregion #region " Body Group " case CommandBodyGroup.Command: CommandBodyGroup bodygroup = new CommandBodyGroup(); _Tokenizer.GetToken(); bodygroup.Name = _Tokenizer.Token; _Tokenizer.GetToken(); if (_Tokenizer.Token == "{") { while (true) { _Tokenizer.GetToken(); if (_Tokenizer.Token != "}") { if (_Tokenizer.Token.ToLower() != "blank") { BodyGroupItem bgi = new BodyGroupItem(); bgi.Name = _Tokenizer.Token; _Tokenizer.GetToken(); bgi.File = _Tokenizer.Token; StaticMethods.SmdFile = fi.DirectoryName + "\\" + bgi.File + ".smd"; bodygroup.BodyCollection.Add(bgi); } else { BodyGroupItem bgi = new BodyGroupItem(); bgi.Name = _Tokenizer.Token; bodygroup.BodyCollection.Add(bgi); } } else { break; } } } _BodyGroupCollection.Add(bodygroup); break; #endregion #region " CBox " case CommandCBox.Command: _CBox = new CommandCBox(); _Tokenizer.GetToken(); _CBox.Min.X = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); _CBox.Min.Y = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); _CBox.Min.Z = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); _CBox.Max.X = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); _CBox.Max.Y = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); _CBox.Max.Z = Convert.ToSingle(_Tokenizer.Token); break; #endregion #region " Cd " case CommandCd.Command: _Tokenizer.GetToken(); _Cd = new CommandCd(_Tokenizer.Token); break; #endregion #region " Cd Texture " case CommandCdTexture.Command: _Tokenizer.GetToken(); _CdTexture = new CommandCdTexture(_Tokenizer.Token); break; #endregion #region " Clip To Textures " case CommandClipToTextures.Command: _ClipToTextures = new CommandClipToTextures(); break; #endregion #region " Controller " case CommandController.Command: CommandController controller = new CommandController(); _Tokenizer.GetToken(); if (_Tokenizer.Token == "mouth") { controller.Index = 4; } else { controller.Index = Convert.ToInt32(_Tokenizer.Token); } _Tokenizer.GetToken(); controller.Bone = _Tokenizer.Token; _Tokenizer.GetToken(); controller.Type = Enumerators.ToMotionFlags(_Tokenizer.Token); _Tokenizer.GetToken(); controller.Start = Convert.ToInt32(_Tokenizer.Token); _Tokenizer.GetToken(); controller.End = Convert.ToInt32(_Tokenizer.Token); _ControllerCollection.Add(controller); break; #endregion #region " External Textures " case CommandExternalTextures.Command: _ExternalTextures = new CommandExternalTextures(); break; #endregion #region " Eye Position " case CommandEyePosition.Command: CommandEyePosition eyeposition = new CommandEyePosition(); _Tokenizer.GetToken(); eyeposition.Value.X = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); eyeposition.Value.Y = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); eyeposition.Value.Z = Convert.ToSingle(_Tokenizer.Token); _EyePosition = eyeposition; break; #endregion #region " Flags " case CommandFlags.Command: _Tokenizer.GetToken(); _Flags = new CommandFlags((TypeFlag)Convert.ToInt32(_Tokenizer.Token)); break; #endregion #region " Gamma " case CommandGamma.Command: _Tokenizer.GetToken(); _Gamma = new CommandGamma(Convert.ToSingle(_Tokenizer.Token)); break; #endregion #region " HBox " case CommandHBox.Command: CommandHBox hbox = new CommandHBox(); _Tokenizer.GetToken(); hbox.Group = Convert.ToInt32(_Tokenizer.Token); _Tokenizer.GetToken(); hbox.Bone = _Tokenizer.Token; _Tokenizer.GetToken(); hbox.Min.X = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); hbox.Min.Y = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); hbox.Min.Z = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); hbox.Max.X = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); hbox.Max.Y = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); hbox.Max.Z = Convert.ToSingle(_Tokenizer.Token); _HBoxCollection.Add(hbox); break; #endregion #region " Mirror Bone " case CommandMirrorBone.Command: _Tokenizer.GetToken(); _MirrorBone = new CommandMirrorBone(_Tokenizer.Token); break; #endregion #region " Model Name " case CommandModelName.Command: _Tokenizer.GetToken(); _ModelName = new CommandModelName(_Tokenizer.Token); break; #endregion #region " Origin " case CommandOrigin.Command: CommandOrigin origin = new CommandOrigin(); _Tokenizer.GetToken(); origin.Value.X = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); origin.Value.Y = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); origin.Value.Z = Convert.ToSingle(_Tokenizer.Token); _Origin = origin; break; #endregion #region " Pivot " case CommandPivot.Command: CommandPivot pivot = new CommandPivot(); _Tokenizer.GetToken(); pivot.Index = Convert.ToInt32(_Tokenizer.Token); _Tokenizer.GetToken(); pivot.Bone = _Tokenizer.Token; _Pivot = pivot; break; #endregion #region " Rename Bone " case CommandRenameBone.Command: CommandRenameBone renamebone = new CommandRenameBone(); _Tokenizer.GetToken(); renamebone.OldName = _Tokenizer.Token; _Tokenizer.GetToken(); renamebone.NewName = _Tokenizer.Token; break; #endregion #region " Root " case CommandRoot.Command: _Tokenizer.GetToken(); _Root = new CommandRoot(_Tokenizer.Token); break; #endregion #region " Scale " case CommandScale.Command: _Tokenizer.GetToken(); _Scale = new CommandScale(Convert.ToSingle(_Tokenizer.Token)); break; #endregion #region " Sequence " case CommandSequenceV10.Command: CommandSequenceV10 sequence = new CommandSequenceV10(); _Tokenizer.GetToken(); sequence.Name = _Tokenizer.Token; int seqdepth = 0; while (!_Tokenizer.GetToken()) { // Ran into another command, get out. if (_Tokenizer.Token.StartsWith("$")) { havetoken = true; break; } switch (_Tokenizer.Token.ToLower()) { #region " Depth " case "{": seqdepth++; break; case "}": seqdepth--; break; #endregion #region " Animation " case OptionAnimation.Option: _Tokenizer.GetToken(); sequence.Animation = new OptionAnimation(_Tokenizer.Token); break; #endregion #region " Blend " case OptionBlend.Option: OptionBlend blend = new OptionBlend(); _Tokenizer.GetToken(); blend.Type = Enumerators.ToMotionFlags(_Tokenizer.Token); _Tokenizer.GetToken(); blend.Start = Convert.ToSingle(_Tokenizer.Token); _Tokenizer.GetToken(); blend.End = Convert.ToSingle(_Tokenizer.Token); sequence.BlendCollection.Add(blend); break; #endregion #region " Event " case OptionEvent.Option: OptionEvent @event = new OptionEvent(); _Tokenizer.GetToken(); @event.EventValue = Convert.ToInt32(_Tokenizer.Token); _Tokenizer.GetToken(); @event.Frame = Convert.ToInt32(_Tokenizer.Token); _Tokenizer.GetToken(); @event.Options = _Tokenizer.Token; sequence.EventCollection.Add(@event); break; #endregion #region " Fps " case OptionFps.Option: _Tokenizer.GetToken(); sequence.Fps = new OptionFps(Convert.ToSingle(_Tokenizer.Token)); break; #endregion #region " Frame " case OptionFrame.Option: OptionFrame frame = new OptionFrame(); _Tokenizer.GetToken(); frame.Start = Convert.ToInt32(_Tokenizer.Token); _Tokenizer.GetToken(); frame.End = Convert.ToInt32(_Tokenizer.Token); sequence.Frame = frame; break; #endregion #region " Loop " case OptionLoop.Option: sequence.Loop = new OptionLoop(true); break; #endregion #region " Node " case OptionNodeV10.Option: _Tokenizer.GetToken(); sequence.Node = new OptionNodeV10(Convert.ToSByte(_Tokenizer.Token)); break; #endregion #region " Pivot " case OptionPivot.Option: OptionPivot pivot2 = new OptionPivot(); _Tokenizer.GetToken(); pivot2.Index = Convert.ToInt32(_Tokenizer.Token); _Tokenizer.GetToken(); pivot2.Start = Convert.ToInt32(_Tokenizer.Token); _Tokenizer.GetToken(); pivot2.End = Convert.ToInt32(_Tokenizer.Token); sequence.PivotCollection.Add(pivot2); break; #endregion #region " Rotate " case OptionRotate.Option: _Tokenizer.GetToken(); sequence.Rotate = new OptionRotate(Convert.ToInt32(_Tokenizer.Token)); break; #endregion #region " RTransition " case OptionRTransition.Option: OptionRTransition rtransition = new OptionRTransition(); _Tokenizer.GetToken(); rtransition.EntryBone = Convert.ToInt32(_Tokenizer.Token); _Tokenizer.GetToken(); rtransition.ExitBone = Convert.ToInt32(_Tokenizer.Token); sequence.RTransition = rtransition; break; #endregion #region " Scale " case OptionScale.Option: _Tokenizer.GetToken(); sequence.Scale = new OptionScale(Convert.ToSingle(_Tokenizer.Token)); break; #endregion #region " Transition " case OptionTransition.Option: OptionTransition transition = new OptionTransition(); _Tokenizer.GetToken(); transition.EntryBone = Convert.ToInt32(_Tokenizer.Token); _Tokenizer.GetToken(); transition.ExitBone = Convert.ToInt32(_Tokenizer.Token); sequence.Transition = transition; break; #endregion #region " Control, Activity, and SMD " default: MotionFlags controltemp = Enumerators.ToMotionFlags(_Tokenizer.Token); ActivityV10 activitytemp; try { activitytemp = (ActivityV10)Enum.Parse(typeof(ActivityV10), _Tokenizer.Token); } catch (ArgumentException) { activitytemp = ActivityV10.ACT_INVALID; } if (controltemp != MotionFlags.Invalid) { sequence.Control.Flags |= controltemp; } else if (activitytemp != ActivityV10.ACT_INVALID) { OptionActivityV10 activity = new OptionActivityV10(); activity.Activity = activitytemp; _Tokenizer.GetToken(); activity.ActivityWeight = Convert.ToSingle(_Tokenizer.Token); sequence.Activity = activity; } else { StaticMethods.SmdFile = fi.DirectoryName + "\\" + _Tokenizer.Token + ".smd"; sequence.FileCollection.Add(_Tokenizer.Token); } break; #endregion } } _SequenceCollection.Add(sequence); break; #endregion #region " Texture Group " case CommandTextureGroup.Command: CommandTextureGroup texturegroup = new CommandTextureGroup(); _Tokenizer.GetToken(); texturegroup.Name = _Tokenizer.Token; int depth = 0; List <string> references = new List <string>(); while (!_Tokenizer.GetToken()) { if (_Tokenizer.Token == "{") { depth++; } else if (_Tokenizer.Token == "}") { depth--; if (depth == 0) { break; } texturegroup.SkinCollection.Add(references); references = new List <string>(); } else if (depth == 2) { references.Add(_Tokenizer.Token); } } break; #endregion #region " Default " default: if (_Tokenizer.Token.StartsWith("$")) { _OmittedCommands.Add(new OmittedCommand(_Tokenizer.Line, _Tokenizer.Token)); } break; #endregion } } catch (Exception e) { Messages.ThrowException("Qc.QcFileV10.Read(string)", e.Message + " (" + Messages.LINE + _Tokenizer.Line + ", " + Messages.TOKEN + _Tokenizer.Token + ")"); } } }