private BoneModifierData CombineModifiers(BoneModifierData baseModifier, IList <BoneModifierData> additionalModifiers) { var scale = baseModifier.ScaleModifier; var len = baseModifier.LengthModifier; var position = baseModifier.PositionModifier; var rotation = baseModifier.RotationModifier; for (var i = 0; i < additionalModifiers.Count; i++) { var additionalModifier = additionalModifiers[i]; scale = new Vector3( scale.x * additionalModifier.ScaleModifier.x, scale.y * additionalModifier.ScaleModifier.y, scale.z * additionalModifier.ScaleModifier.z); len *= additionalModifier.LengthModifier; position += additionalModifier.PositionModifier; rotation += additionalModifier.RotationModifier; } _combineModifiersCachedReturn.ScaleModifier = scale; _combineModifiersCachedReturn.LengthModifier = len; _combineModifiersCachedReturn.PositionModifier = position; _combineModifiersCachedReturn.RotationModifier = rotation; return(_combineModifiersCachedReturn); }
private static BoneModifierData CombineModifiers(BoneModifierData baseModifier, IEnumerable <BoneModifierData> additionalModifiers) { var scale = baseModifier.ScaleModifier; var len = baseModifier.LengthModifier; foreach (var additionalModifier in additionalModifiers) { scale = new Vector3( scale.x * additionalModifier.ScaleModifier.x, scale.y * additionalModifier.ScaleModifier.y, scale.z * additionalModifier.ScaleModifier.z); len *= additionalModifier.LengthModifier; } return(new BoneModifierData(scale, len)); }
private bool CanApply(BoneModifierData data) { if (!data.IsEmpty()) { _forceApply = true; return(true); } // The point is to let the boner run for 1 extra frame after it's disabled to properly reset stuff if (_forceApply) { _forceApply = false; _lenModForceUpdate = true; return(true); } if (_lenModForceUpdate) { return(true); } return(false); }
public static void Init() { Harmony.CreateAndPatchAll(typeof(Hooks), GUID); #if EC ExtendedSave.CardBeingImported += importedData => { if (importedData.TryGetValue(GUID, out var pluginData) && pluginData != null) { var modifiers = BoneController.ReadModifiers(pluginData); // Only 1st coord is used in EC so remove others foreach (var modifier in modifiers) { modifier.MakeNonCoordinateSpecific(); } importedData[GUID] = BoneController.SaveModifiers(modifiers); } }; #elif KKS ExtendedSave.CardBeingImported += (data, mapping) => { if (data.TryGetValue(ExtDataGUID, out var pluginData) && pluginData != null) { var modifiers = BoneController.ReadModifiers(pluginData); var coordCount = (int)mapping.Values.Max(x => x) + 1; foreach (var modifier in modifiers) { if (!modifier.IsCoordinateSpecific()) { continue; } var newArr = new BoneModifierData[coordCount]; foreach (var map in mapping) { // Discard unused if (map.Value == null) { continue; } if (map.Key < modifier.CoordinateModifiers.Length) { newArr[(int)map.Value] = modifier.CoordinateModifiers[map.Key]; } else { newArr[(int)map.Value] = new BoneModifierData(); } } modifier.CoordinateModifiers = newArr; } data[ExtDataGUID] = BoneController.SaveModifiers(modifiers); } }; #endif }