public static bool GetFallbackAnim(ref EncodedAnimId animId) { if (animId.IsBardInstrumentAnim()) { // There are no fallback animations for bard instruments. // Apparently there was a table, but no instrument had a fallback in there return(false); } if (animId.IsWeaponAnim()) { var leftHand = animId.GetWeaponLeftHand(); var rightHand = animId.GetWeaponRightHand(); // Possibly the weapons in either hand need to fallback together if (IsWeapon2hFallback(leftHand) || IsWeapon2hFallback(rightHand)) { var leftHandFallback = GetWeaponFallback(leftHand); var rightHandFallback = GetWeaponFallback(rightHand); if (leftHandFallback != leftHand && rightHandFallback != rightHand) { animId = new EncodedAnimId(animId.GetWeaponAnim(), leftHandFallback, rightHandFallback); return(true); } } else { var rightHandFallback = GetWeaponFallback(rightHand); if (rightHandFallback != rightHand) { animId = new EncodedAnimId(animId.GetWeaponAnim(), leftHand, rightHandFallback); return(true); } var leftHandFallback = GetWeaponFallback(leftHand); if (leftHandFallback != leftHand) { animId = new EncodedAnimId(animId.GetWeaponAnim(), leftHandFallback, rightHand); return(true); } } var weaponAnimFallback = GetWeaponAnimFallback(animId.GetWeaponAnim()); if (weaponAnimFallback == WeaponAnim.None) { return(false); } animId = new EncodedAnimId(weaponAnimFallback, leftHand, rightHand); return(true); } // Normal animations can fall back to weapon animations, so it's not just a lookup table here return(GetNormalAnimFallback(animId.GetNormalAnimType(), ref animId)); }
public static void SetAnimId(this GameObject obj, EncodedAnimId animId) { // Propagate animations to main/off hand equipment for critters if (obj.IsCritter()) { var mainHand = GameSystems.Critter.GetWornItem(obj, EquipSlot.WeaponPrimary); var offHand = GameSystems.Critter.GetWornItem(obj, EquipSlot.WeaponSecondary); if (offHand == null) { offHand = GameSystems.Critter.GetWornItem(obj, EquipSlot.Shield); } // Apparently certain anim IDs cause weapons to disappear, // possibly skill use/casting? int opacity = 0; if (animId.IsSpecialAnim()) { opacity = 255; } if (mainHand != null) { GameSystems.ObjFade.FadeTo(mainHand, opacity, 10, 16, 0); SetAnimId(mainHand, animId); } if (offHand != null) { GameSystems.ObjFade.FadeTo(offHand, opacity, 10, 16, 0); SetAnimId(offHand, animId); } } var model = obj.GetOrCreateAnimHandle(); model.SetAnimId(animId); }
// Originally @ 0x102641B0 public AasHandle CreateModelFromIds( int meshId, int skeletonId, EncodedAnimId idleAnimId, in AasAnimParams animParams
public override void Render(IGameViewport viewport, PartSysEmitter emitter) { var it = emitter.NewIterator(); var animParams = AnimatedModelParams.Default; animParams.rotation3d = true; // Lazily initialize render state if (!emitter.HasRenderState()) { // Resolve the mesh filename var baseName = ResolveBasename(emitter.GetSpec().GetMeshName()); var skmName = baseName + ".skm"; var skaName = baseName + ".ska"; try { var animId = new EncodedAnimId(NormalAnimType.ItemIdle); // This seems to be item_idle var model = _modelFactory.FromFilenames(skmName, skaName, animId, animParams); emitter.SetRenderState( new ModelEmitterRenderState(model) ); } catch (Exception e) { Logger.Error("Unable to load model {0} for particle system {1}: {2}", baseName, emitter.GetSpec().GetParent().GetName(), e); emitter.SetRenderState(new ModelEmitterRenderState(null)); } } var renderState = (ModelEmitterRenderState)emitter.GetRenderState(); if (renderState.Model == null) { return; // The loader above was unable to load the model for this emitter } var overrides = new MdfRenderOverrides { ignoreLighting = true, overrideDiffuse = true }; var yaw = emitter.GetParamState(PartSysParamId.part_yaw); var pitch = emitter.GetParamState(PartSysParamId.part_pitch); var roll = emitter.GetParamState(PartSysParamId.part_roll); while (it.HasNext()) { var particleIdx = it.Next(); var age = emitter.GetParticleAge(particleIdx); overrides.overrideColor = GeneralEmitterRenderState.GetParticleColor(emitter, particleIdx); // Yes, this is *actually* swapped for Y / Z var particleState = emitter.GetParticleState(); animParams.offsetX = particleState.GetState(ParticleStateField.PSF_POS_VAR_X, particleIdx); animParams.offsetY = particleState.GetState(ParticleStateField.PSF_POS_VAR_Z, particleIdx); animParams.offsetZ = particleState.GetState(ParticleStateField.PSF_POS_VAR_Y, particleIdx); if (yaw != null) { animParams.rotationYaw = Angles.ToRadians(yaw.GetValue(emitter, particleIdx, age)); } if (pitch != null) { animParams.rotationPitch = Angles.ToRadians(pitch.GetValue(emitter, particleIdx, age)); } if (roll != null) { animParams.rotationRoll = Angles.ToRadians(roll.GetValue(emitter, particleIdx, age)); } renderState.Model.SetTime(animParams, age); _modelRenderer.Render(viewport, renderState.Model, animParams, new List <Light3d>(), overrides); } }
public IAnimatedModel FromIds(int meshId, int skeletonId, EncodedAnimId idleAnimId, in AnimatedModelParams animParams,
private static bool GetNormalAnimFallback(NormalAnimType anim, ref EncodedAnimId animId) { switch (anim) { case NormalAnimType.ProneIdle: animId = new EncodedAnimId(NormalAnimType.DeadIdle); return(true); case NormalAnimType.ProneFidget: animId = new EncodedAnimId(NormalAnimType.ProneIdle); return(true); case NormalAnimType.Getup: animId = new EncodedAnimId(WeaponAnim.CombatFidget); return(true); case NormalAnimType.Magichands: animId = new EncodedAnimId(WeaponAnim.RightAttack); return(true); case NormalAnimType.Picklock: animId = new EncodedAnimId(NormalAnimType.Magichands); return(true); case NormalAnimType.PicklockConcentrated: animId = new EncodedAnimId(NormalAnimType.Picklock); return(true); case NormalAnimType.Examine: animId = new EncodedAnimId(NormalAnimType.Magichands); return(true); case NormalAnimType.Throw: animId = new EncodedAnimId(NormalAnimType.ItemIdle); return(true); case NormalAnimType.Death: animId = new EncodedAnimId(NormalAnimType.ItemIdle); return(true); case NormalAnimType.Death2: animId = new EncodedAnimId(NormalAnimType.Death); return(true); case NormalAnimType.Death3: animId = new EncodedAnimId(NormalAnimType.Death2); return(true); case NormalAnimType.DeadIdle: animId = new EncodedAnimId(NormalAnimType.ItemIdle); return(true); case NormalAnimType.DeadFidget: animId = new EncodedAnimId(NormalAnimType.DeadIdle); return(true); case NormalAnimType.DeathProneIdle: animId = new EncodedAnimId(NormalAnimType.DeadIdle); return(true); case NormalAnimType.DeathProneFidget: animId = new EncodedAnimId(NormalAnimType.DeathProneIdle); return(true); case NormalAnimType.AbjurationCasting: case NormalAnimType.AbjurationConjuring: animId = new EncodedAnimId(WeaponAnim.RightAttack); return(true); case NormalAnimType.ConjurationCasting: animId = new EncodedAnimId(NormalAnimType.AbjurationCasting); return(true); case NormalAnimType.ConjurationConjuring: animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring); return(true); case NormalAnimType.DivinationCasting: animId = new EncodedAnimId(NormalAnimType.AbjurationCasting); return(true); case NormalAnimType.DivinationConjuring: animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring); return(true); case NormalAnimType.EnchantmentCasting: animId = new EncodedAnimId(NormalAnimType.AbjurationCasting); return(true); case NormalAnimType.EnchantmentConjuring: animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring); return(true); case NormalAnimType.EvocationCasting: animId = new EncodedAnimId(NormalAnimType.AbjurationCasting); return(true); case NormalAnimType.EvocationConjuring: animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring); return(true); case NormalAnimType.IllusionCasting: animId = new EncodedAnimId(NormalAnimType.AbjurationCasting); return(true); case NormalAnimType.IllusionConjuring: animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring); return(true); case NormalAnimType.NecromancyCasting: animId = new EncodedAnimId(NormalAnimType.AbjurationCasting); return(true); case NormalAnimType.NecromancyConjuring: animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring); return(true); case NormalAnimType.TransmutationCasting: animId = new EncodedAnimId(NormalAnimType.AbjurationCasting); return(true); case NormalAnimType.TransmutationConjuring: animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring); return(true); case NormalAnimType.Conceal: animId = new EncodedAnimId(WeaponAnim.RightAttack); return(true); case NormalAnimType.ConcealIdle: animId = new EncodedAnimId(WeaponAnim.Idle); return(true); case NormalAnimType.Unconceal: animId = new EncodedAnimId(NormalAnimType.Getup); return(true); case NormalAnimType.ItemFidget: case NormalAnimType.Open: case NormalAnimType.Close: animId = new EncodedAnimId(NormalAnimType.ItemIdle); return(true); case NormalAnimType.SkillAnimalEmpathy: case NormalAnimType.SkillDisableDevice: case NormalAnimType.SkillHeal: animId = new EncodedAnimId(NormalAnimType.Magichands); return(true); case NormalAnimType.SkillHealConcentrated: animId = new EncodedAnimId(NormalAnimType.SkillHeal); return(true); case NormalAnimType.SkillHide: animId = new EncodedAnimId(NormalAnimType.ItemIdle); return(true); case NormalAnimType.SkillHideIdle: animId = new EncodedAnimId(WeaponAnim.Idle); return(true); case NormalAnimType.SkillHideFidget: animId = new EncodedAnimId(WeaponAnim.CombatFidget); return(true); case NormalAnimType.SkillUnhide: animId = new EncodedAnimId(NormalAnimType.ItemIdle); return(true); case NormalAnimType.SkillPickpocket: case NormalAnimType.SkillSearch: case NormalAnimType.SkillSpot: case NormalAnimType.FeatTrack: case NormalAnimType.Trip: case NormalAnimType.Bullrush: case NormalAnimType.Flurry: case NormalAnimType.Kistrike: case NormalAnimType.Tumble: animId = new EncodedAnimId(NormalAnimType.Magichands); return(true); case NormalAnimType.Special1: case NormalAnimType.Special2: case NormalAnimType.Special3: case NormalAnimType.Special4: case NormalAnimType.Throw2: animId = new EncodedAnimId(NormalAnimType.ItemIdle); return(true); case NormalAnimType.WandAbjurationCasting: animId = new EncodedAnimId(NormalAnimType.AbjurationCasting); return(true); case NormalAnimType.WandAbjurationConjuring: animId = new EncodedAnimId(NormalAnimType.AbjurationConjuring); return(true); case NormalAnimType.WandConjurationCasting: animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting); return(true); case NormalAnimType.WandConjurationConjuring: animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring); return(true); case NormalAnimType.WandDivinationCasting: animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting); return(true); case NormalAnimType.WandDivinationConjuring: animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring); return(true); case NormalAnimType.WandEnchantmentCasting: animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting); return(true); case NormalAnimType.WandEnchantmentConjuring: animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring); return(true); case NormalAnimType.WandEvocationCasting: animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting); return(true); case NormalAnimType.WandEvocationConjuring: animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring); return(true); case NormalAnimType.WandIllusionCasting: animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting); return(true); case NormalAnimType.WandIllusionConjuring: animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring); return(true); case NormalAnimType.WandNecromancyCasting: animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting); return(true); case NormalAnimType.WandNecromancyConjuring: animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring); return(true); case NormalAnimType.WandTransmutationCasting: animId = new EncodedAnimId(NormalAnimType.WandAbjurationCasting); return(true); case NormalAnimType.WandTransmutationConjuring: animId = new EncodedAnimId(NormalAnimType.WandAbjurationConjuring); return(true); case NormalAnimType.SkillBarbarianRage: animId = new EncodedAnimId(WeaponAnim.RightAttack); return(true); case NormalAnimType.OpenIdle: animId = new EncodedAnimId(NormalAnimType.ItemIdle); return(true); default: return(false); } }
/** * If this animation is a conjuration animation, returns the corresponding casting animation. */ public bool ToCastingAnim(out EncodedAnimId animId) { if (IsSpecialAnim()) { animId = default; return(false); } var normalAnim = GetNormalAnimType(); switch (normalAnim) { case NormalAnimType.AbjurationConjuring: normalAnim = NormalAnimType.AbjurationCasting; break; case NormalAnimType.ConjurationConjuring: normalAnim = NormalAnimType.ConjurationCasting; break; case NormalAnimType.DivinationConjuring: normalAnim = NormalAnimType.DivinationCasting; break; case NormalAnimType.EnchantmentConjuring: normalAnim = NormalAnimType.EnchantmentCasting; break; case NormalAnimType.EvocationConjuring: normalAnim = NormalAnimType.EvocationCasting; break; case NormalAnimType.IllusionConjuring: normalAnim = NormalAnimType.IllusionCasting; break; case NormalAnimType.NecromancyConjuring: normalAnim = NormalAnimType.NecromancyCasting; break; case NormalAnimType.TransmutationConjuring: normalAnim = NormalAnimType.TransmutationCasting; break; case NormalAnimType.WandAbjurationConjuring: normalAnim = NormalAnimType.WandAbjurationCasting; break; case NormalAnimType.WandConjurationConjuring: normalAnim = NormalAnimType.WandConjurationCasting; break; case NormalAnimType.WandDivinationConjuring: normalAnim = NormalAnimType.WandDivinationCasting; break; case NormalAnimType.WandEnchantmentConjuring: normalAnim = NormalAnimType.WandEnchantmentCasting; break; case NormalAnimType.WandEvocationConjuring: normalAnim = NormalAnimType.WandEvocationCasting; break; case NormalAnimType.WandIllusionConjuring: normalAnim = NormalAnimType.WandIllusionCasting; break; case NormalAnimType.WandNecromancyConjuring: normalAnim = NormalAnimType.WandNecromancyCasting; break; case NormalAnimType.WandTransmutationConjuring: normalAnim = NormalAnimType.WandTransmutationCasting; break; default: animId = default; return(false); } animId = new EncodedAnimId(normalAnim); return(true); }