{"record":{"id":"cce9a4cee37782c3","repo":"ppy/osu","slug":"nameof-vectorscale-must-be-finite-but-is-valu-cce9a4","errorCode":null,"errorMessage":"{nameof(VectorScale)} must be finite, but is {value}.","messagePattern":"(.+?) must be finite, but is (.+?)\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"warning","filePath":"osu.Game/Storyboards/Drawables/DrawableStoryboardSprite.cs","lineNumber":60,"sourceCode":"                if (flipV == value)\r\n                    return;\r\n\r\n                flipV = value;\r\n                Invalidate(Invalidation.MiscGeometry);\r\n            }\r\n        }\r\n\r\n        private Vector2 vectorScale = Vector2.One;\r\n\r\n        public Vector2 VectorScale\r\n        {\r\n            get => vectorScale;\r\n            set\r\n            {\r\n                if (vectorScale == value)\r\n                    return;\r\n\r\n                if (!Validation.IsFinite(value)) throw new ArgumentException($@\"{nameof(VectorScale)} must be finite, but is {value}.\");\r\n\r\n                vectorScale = value;\r\n                Invalidate(Invalidation.MiscGeometry);\r\n            }\r\n        }\r\n\r\n        public override bool RemoveWhenNotAlive => false;\r\n\r\n        protected override Vector2 DrawScale\r\n            => new Vector2(FlipH ? -base.DrawScale.X : base.DrawScale.X, FlipV ? -base.DrawScale.Y : base.DrawScale.Y) * VectorScale;\r\n\r\n        public override Anchor Origin => StoryboardExtensions.AdjustOrigin(base.Origin, VectorScale, FlipH, FlipV);\r\n\r\n        public override bool IsPresent\r\n            => !float.IsNaN(DrawPosition.X) && !float.IsNaN(DrawPosition.Y) && base.IsPresent;\r\n\r\n        protected override void Update()\r\n        {\r","sourceCodeStart":42,"sourceCodeEnd":78,"githubUrl":"https://github.com/ppy/osu/blob/d9c73e12adff2feaae4a3e158d36fe5883faf6ca/osu.Game/Storyboards/Drawables/DrawableStoryboardSprite.cs#L42-L78","documentation":"Thrown by the VectorScale setter on DrawableStoryboardSprite when Validation.IsFinite(value) is false. Identical guard and rationale to DrawableStoryboardAnimation: NaN/Infinity scale components are rejected to protect geometry invalidation.","triggerScenarios":"Setting VectorScale with NaN or Infinity component(s) on a storyboard sprite, e.g. from a parsed scale command with corrupt data.","commonSituations":"Storyboard S-command with bad parameters; runtime scale math dividing by zero; imported storyboard with invalid scale keyframes.","solutions":["Validate the value with Validation.IsFinite before setting, falling back to Vector2.One.","Fix the storyboard command decoder to reject/sanitize non-finite parameters.","Audit scale-producing math for possible zero-division."],"exampleFix":"// before\nsprite.VectorScale = value;\n\n// after\nsprite.VectorScale = float.IsFinite(value.X) && float.IsFinite(value.Y) ? value : Vector2.One;","handlingStrategy":"validation","validationCode":"if (!Validation.IsFinite(value))\n    value = Vector2.One;","typeGuard":"static bool IsFiniteScale(Vector2 v) => Validation.IsFinite(v);","tryCatchPattern":null,"preventionTips":["Validate VectorScale before setting.","Fix storyboard command decoding for corrupt scale values.","Check scale computations for NaN sources."],"tags":["storyboard","sprite","validation","math","finite"],"backgroundTag":null,"analyzedSha":"d9c73e12adff2feaae4a3e158d36fe5883faf6ca","analyzedAt":"2026-08-13T14:12:54.015Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}