internal Bone(ModelDefinition definition, int index, byte[] buffer, ref int offset) { this.Definition = definition; this.Index = index; this.Name = definition.BoneNames[index]; this.Unknown1 = buffer.ToStructure<Vector4>(ref offset); this.Unknown2 = buffer.ToStructure<Vector4>(ref offset); }
public ModelDefinition GetModelDefinition() { ModelDefinition def; if (_DefinitionCache != null && _DefinitionCache.TryGetTarget(out def)) return def; def = new ModelDefinition(this); if (_DefinitionCache == null) _DefinitionCache = new WeakReference<ModelDefinition>(def); else _DefinitionCache.SetTarget(def); return def; }
internal MaterialDefinition(ModelDefinition definition, int index) { this.Definition = definition; this.Index = index; _Packs = definition.File.Pack.Collection; if (_Packs.FileExists(Name)) { _DefaultPath = Name; _VariantsAvailable = false; _StainedPathFormat = _PathFormat = null; } else { if (!TryExpand(Name, out _PathFormat, out _StainedPathFormat, out _VariantsAvailable)) throw new NotSupportedException(); if (VariantsAvailable) _DefaultPath = string.Format(_PathFormat, 0); else _DefaultPath = _PathFormat; } }
public ModelAttribute(ModelDefinition definition, int index) { this.Definition = definition; this.Index = index; this.Name = definition.AttributeNames[index]; if (MaskMap.ContainsKey(Name)) AttributeMask = MaskMap[Name]; else AttributeMask = 0; }
public TransformedModel(ModelDefinition model, Vector3 translation, Vector3 rotation, Vector3 scale) { this.Model = model; this.Translation = translation; this.Rotation = rotation; this.Scale = scale; }
private bool TryGetModel(out Skeleton skeleton, out ModelDefinition model, out ImcVariant variant, out int m, out int b) { model = null; skeleton = null; variant = ImcVariant.Default; m = 0; b = 0; var asVariant = SelectedEntry as Models.ModelCharaVariant; if (asVariant == null) return false; int v = asVariant.Value; b = asVariant.Parent.Value; m = asVariant.Parent.Parent.Value; var imcPath = string.Format(ImcPathFormat, m, b); var mdlPath = string.Format(ModelPathFormat, m, b); var sklPath = string.Format(SkeletonPathFormat, m, 1);// b); SaintCoinach.IO.File imcFileBase; SaintCoinach.IO.File mdlFileBase; if (!Parent.Realm.Packs.TryGetFile(imcPath, out imcFileBase) || !Parent.Realm.Packs.TryGetFile(mdlPath, out mdlFileBase) || !(mdlFileBase is ModelFile)) { System.Windows.MessageBox.Show(string.Format("Unable to find files for {0}.", asVariant), "File not found", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return false; } SaintCoinach.IO.File sklFileBase; if(!Parent.Realm.Packs.TryGetFile(sklPath, out sklFileBase)) { System.Windows.MessageBox.Show(string.Format("Unable to find skeleton for {0}.", asVariant), "File not found", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return false; } skeleton = new Skeleton(new SklbFile(sklFileBase)); try { var imcFile = new ImcFile(imcFileBase); model = ((ModelFile)mdlFileBase).GetModelDefinition(); variant = imcFile.GetVariant(v); return true; } catch (Exception e) { System.Windows.MessageBox.Show(string.Format("Unable to load model for {0}:{1}{2}", asVariant, Environment.NewLine, e), "Failure to load", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return false; } }
private IComponent CreateModel(Engine engine, Skeleton skeleton, ModelDefinition model, ImcVariant variant, int m, int b) { const string PapPathFormat = "chara/monster/m{0:D4}/animation/a0001/bt_common/resident/monster.pap"; var component = new AnimatedModel(engine, skeleton, variant, model, ModelQuality.High) { }; var papPath = string.Format(PapPathFormat, m, b); SaintCoinach.IO.File papFileBase; if (Parent.Realm.Packs.TryGetFile(papPath, out papFileBase)) { var anim = new AnimationContainer(skeleton, new PapFile(papFileBase)); var hasAnim = false; for(var i = 0; i < DefaultAnimationNames.Length && !hasAnim; ++i) { var n = DefaultAnimationNames[i]; if (anim.AnimationNames.Contains(n)) { component.AnimationPlayer.Animation = anim.Get(n); hasAnim = true; } } if (!hasAnim) component.AnimationPlayer.Animation = anim.Get(0); } return component; }
private bool TryGetModel(out ModelDefinition model, out ModelVariantIdentifier variant) { model = null; variant = default(ModelVariantIdentifier); if (SelectedEquipment == null) return false; var charType = RaceCharacterTypes[SelectedEquipment.RacesEquippableBy.First().Key]; if (!SelectedEquipment.EquippableByMale) charType += 100; try { model = SelectedEquipment.GetModel(charType, out variant.ImcVariant); if (SelectedEquipment.IsDyeable && SelectedStain != null) variant.StainKey = SelectedStain.Key; var result = (model != null); if (!result) System.Windows.MessageBox.Show(string.Format("Unable to find model for {0} (c{1:D4}).", SelectedEquipment.Name, charType), "Model not found", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return result; } catch (Exception e) { System.Windows.MessageBox.Show(string.Format("Failed to load model for {0} (c{1:D4}):{2}{3}", SelectedEquipment.Name, charType, Environment.NewLine, e), "Read failure", System.Windows.MessageBoxButton.OK, System.Windows.MessageBoxImage.Error); return false; } }