{"record":{"id":"663bbb18c352ca6c","repo":"stride3d/stride","slug":"need-at-least-1-meshdrawdata","errorCode":null,"errorMessage":"Need at least 1 MeshDrawData.","messagePattern":"Need at least 1 MeshDrawData\\.","errorType":"exception","errorClass":"ArgumentException","httpStatus":null,"severity":"error","filePath":"sources/engine/Stride.Rendering/Extensions/MergeExtensions.cs","lineNumber":24,"sourceCode":"using System.Runtime.InteropServices;\nusing Stride.Core;\nusing Stride.Graphics;\nusing Stride.Graphics.Data;\nusing Stride.Rendering;\n\nnamespace Stride.Extensions\n{\n    public static class MergeExtensions\n    {\n        /// <summary>\n        /// Transform a vertex buffer positions, normals, tangents and bitangents using the given matrix.\n        /// </summary>\n        /// <param name=\"meshDrawDatas\">The mesh draw datas.</param>\n        /// <param name=\"can32BitIndex\">A flag stating if 32 bit index buffers.</param>\n        public static unsafe MeshDraw MergeDrawData(IList<MeshDraw> meshDrawDatas, bool can32BitIndex)\n        {\n            if (meshDrawDatas.Count == 0)\n                throw new ArgumentException(\"Need at least 1 MeshDrawData.\", \"meshDrawDatas\");\n\n            if (meshDrawDatas.Count == 1)\n                return meshDrawDatas[0];\n\n            // Check that vertex buffer declarations are matching\n            var firstMeshDrawData = meshDrawDatas[0];\n            if (!firstMeshDrawData.IsSimple())\n                throw new InvalidOperationException(\"Can only merge simple MeshDrawData.\");\n\n            var firstVertexBuffer = firstMeshDrawData.VertexBuffers[0];\n            var hasIndexBuffer = IsIndexed(meshDrawDatas);\n            int totalVertexCount = 0;\n            int totalIndexCount = 0;\n\n            //TODO: extend to non-simple vertex declarations, fill with default values it missing declarations etc. ?\n\n            for (int i = 0; i < meshDrawDatas.Count; i++)\n            {","sourceCodeStart":6,"sourceCodeEnd":42,"githubUrl":"https://github.com/stride3d/stride/blob/96fad776d210c221682aac1ccdf4c79dc046fc38/sources/engine/Stride.Rendering/Extensions/MergeExtensions.cs#L6-L42","documentation":"MeshDraw.MergeDrawData combines multiple MeshDraw instances into one, which is meaningless for an empty list, so it throws ArgumentException ('meshDrawDatas') when Count == 0. At least one MeshDrawData is required for the merge to produce output.","triggerScenarios":"Passing an empty IList<MeshDraw> to MergeDrawData, typically via GroupDrawData with a group that produced no meshes.","commonSituations":"Mesh grouping/culling pipelines where a material or draw group ends up with zero entries due to filtering, then is merged unconditionally.","solutions":["Check meshDrawDatas.Count > 0 before calling MergeDrawData","Skip the merge/GroupDrawData path for empty groups","Fix upstream filtering that produced an empty mesh list"],"exampleFix":"// before\nvar merged = MeshDraw.MergeDrawData(meshDraws, can32BitIndex);\n// after\nif (meshDraws.Count == 0) return null;\nvar merged = MeshDraw.MergeDrawData(meshDraws, can32BitIndex);","handlingStrategy":"validation","validationCode":"if (meshDrawDatas == null || meshDrawDatas.Count == 0) return null;\nvar merged = MeshDraw.MergeDrawData(meshDrawDatas, can32BitIndex);","typeGuard":"static bool Mergeable(IList<MeshDraw> list) => list != null && list.Count > 0;","tryCatchPattern":"try { var merged = MeshDraw.MergeDrawData(meshDrawDatas, can32BitIndex); } catch (ArgumentException) { /* empty input list */ }","preventionTips":["Early-return from group/batching code when no meshes were collected","Assert non-empty collections at group boundaries"],"tags":["rendering","mesh-merge","empty-collection"],"backgroundTag":"empty-required-field","analyzedSha":"96fad776d210c221682aac1ccdf4c79dc046fc38","analyzedAt":"2026-09-14T02:59:31.279Z","contentChangedAt":"2026-09-14T02:59:31.279Z","schemaVersion":2},"datasetVersion":"2026-09-16T04:17:20.429Z"}