{"record":{"id":"7641a039c4451b94","repo":"ppy/osu","slug":"nameof-vectorscale-must-be-finite-but-is-valu-7641a0","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/DrawableStoryboardVideo.cs","lineNumber":121,"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            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 DrawableVideo(Stream stream, bool startAtCurrentTime = true)\r\n                : base(stream, startAtCurrentTime)\r\n            {\r\n            }\r\n        }\r\n    }\r\n}\r","sourceCodeStart":103,"sourceCodeEnd":139,"githubUrl":"https://github.com/ppy/osu/blob/d9c73e12adff2feaae4a3e158d36fe5883faf6ca/osu.Game/Storyboards/Drawables/DrawableStoryboardVideo.cs#L103-L139","documentation":"Thrown by the VectorScale setter on DrawableStoryboardVideo (inner DrawableVideo type) when Validation.IsFinite(value) is false. Same finite-scale invariant as the sprite/animation variants but applied to video storyboards.","triggerScenarios":"Assigning a Vector2 with NaN or Infinity to a video's VectorScale, typically from a corrupt storyboard command or computed scale.","commonSituations":"Malformed storyboard file with invalid scale for a video layer; runtime scale computation yielding NaN; import of a hand-edited storyboard.","solutions":["Guard the assignment: only set finite values, default to Vector2.One otherwise.","Fix upstream storyboard command parsing to filter non-finite values.","Check for zero-division in any scale transform math."],"exampleFix":"// before\nvideo.VectorScale = parsed;\n\n// after\nvideo.VectorScale = Validation.IsFinite(parsed) ? parsed : 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":["Guard VectorScale assignments with IsFinite.","Sanitize storyboard video scale parameters at decode.","Audit runtime scale math for non-finite results."],"tags":["storyboard","video","validation","math","finite"],"backgroundTag":null,"analyzedSha":"d9c73e12adff2feaae4a3e158d36fe5883faf6ca","analyzedAt":"2026-08-13T14:12:54.015Z","schemaVersion":2},"datasetVersion":"2026-08-13T19:17:28.613Z"}