{"record":{"id":"725650900de23ff0","repo":"ppy/osu","slug":"nameof-vectorscale-must-be-finite-but-is-valu","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/DrawableStoryboardAnimation.cs","lineNumber":63,"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        public DrawableStoryboardAnimation(StoryboardAnimation animation)\r\n        {\r","sourceCodeStart":45,"sourceCodeEnd":81,"githubUrl":"https://github.com/ppy/osu/blob/d9c73e12adff2feaae4a3e158d36fe5883faf6ca/osu.Game/Storyboards/Drawables/DrawableStoryboardAnimation.cs#L45-L81","documentation":"Thrown by the VectorScale setter on DrawableStoryboardAnimation when Validation.IsFinite(value) is false — i.e. one or both components are NaN or Infinity. A non-finite scale would corrupt layout/rendering math, so it is rejected before assignment.","triggerScenarios":"Setting VectorScale to a Vector2 containing NaN or Infinity (e.g. result of 0/0, division by zero in scale computation, or a storyboard command decoding to an invalid float).","commonSituations":"Storyboard command (S command) with malformed parameters producing NaN; division-based scale calculation with zero denominator; importing a storyboard authored with bad scale values.","solutions":["Sanitize scale values before assignment: replace NaN/Infinity with sane defaults (Vector2.One).","Trace the storyboard command source to fix the bad parameter at decode time.","Add a float.IsFinite check in the storyboard command decoder."],"exampleFix":"// before\nanim.VectorScale = computed; // computed may be NaN\n\n// after\nanim.VectorScale = Validation.IsFinite(computed) ? computed : 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":["Sanitize scale values before assignment.","Guard storyboard command decoders against non-finite parameters.","Audit scale math for zero-division."],"tags":["storyboard","animation","validation","math","finite"],"backgroundTag":null,"analyzedSha":"d9c73e12adff2feaae4a3e158d36fe5883faf6ca","analyzedAt":"2026-08-13T14:12:54.015Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}