Esempio n. 1
0
        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;
            }
        }