{"record":{"id":"bfa6e87f06837708","repo":"bevyengine/bevy","slug":"range-provided-to-render-range-is-out-of-bou","errorCode":null,"errorMessage":"`Range` provided to `render_range()` is out of bounds","messagePattern":"`Range` provided to `render_range\\(\\)` is out of bounds","errorType":"panic","errorClass":null,"httpStatus":null,"severity":"critical","filePath":"crates/bevy_render/src/render_phase/mod.rs","lineNumber":1990,"sourceCode":"        render_pass: &mut TrackedRenderPass<'w>,\n        world: &'w World,\n        view: Entity,\n    ) -> Result<(), DrawError> {\n        self.render_range(render_pass, world, view, ..)\n    }\n\n    /// Renders all [`PhaseItem`]s in the provided `range` (based on their index in `self.items`) using their corresponding draw functions.\n    pub fn render_range<'w>(\n        &self,\n        render_pass: &mut TrackedRenderPass<'w>,\n        world: &'w World,\n        view: Entity,\n        range: impl RangeBounds<usize>,\n    ) -> Result<(), DrawError> {\n        let items = self\n            .items\n            .get_range(range)\n            .expect(\"`Range` provided to `render_range()` is out of bounds\");\n\n        let draw_functions = world.resource::<DrawFunctions<I>>();\n        let mut draw_functions = draw_functions.write();\n        draw_functions.prepare(world);\n\n        let mut index = 0;\n        while index < items.len() {\n            let item = &items[index];\n            let batch_range = item.batch_range();\n            if batch_range.is_empty() {\n                index += 1;\n            } else {\n                let draw_function = draw_functions.get_mut(item.draw_function()).unwrap();\n                draw_function.draw(world, render_pass, view, item)?;\n                index += batch_range.len();\n            }\n        }\n        Ok(())","sourceCodeStart":1972,"sourceCodeEnd":2008,"githubUrl":"https://github.com/bevyengine/bevy/blob/221e52ae323febfd399bd7d067918fc43648cfb3/crates/bevy_render/src/render_phase/mod.rs#L1972-L2008","documentation":"RenderPhase::render_range (mod.rs:1991) panics when the supplied range cannot index self.items: items.get_range(range) returned None because the range is out of bounds for the current item count. It is a hard precondition - the caller must pass a range that fits within 0..items.len() for the phase as it exists right now.","triggerScenarios":"Calling render_range(pass, world, view, 0..n) with n greater than phase.items.len() - typically a count cached from before the phase was sorted, compacted, or cleared, or chunk-splitting arithmetic that overshoots.","commonSituations":"Custom render nodes splitting a phase into chunks (stereo/XR per-eye slices); lengths captured across frames while the phase was rebuilt; off-by-one errors after filtering items out of the phase.","solutions":["Clamp the range to the current length before calling: 0..n.min(phase.items.len()).","Recompute any cached item counts after sorting/filtering/clearing the phase.","Use RenderPhase::render() instead when you do not need sub-ranges."],"exampleFix":"// before\nlet end = cached_item_count; // may be stale after the phase was rebuilt\nrender_phase.render_range(&mut pass, &world, view, 0..end)?;\n\n// after\nlet end = cached_item_count.min(render_phase.items.len());\nrender_phase.render_range(&mut pass, &world, view, 0..end)?;","handlingStrategy":"validation","validationCode":"// Clamp before calling render_range:\nlet end = requested_end.min(render_phase.items.len());\nlet start = requested_start.min(end);\nrender_phase.render_range(&mut pass, &world, view, start..end)?;","typeGuard":null,"tryCatchPattern":null,"preventionTips":["Never reuse an item count captured before sorting, filtering, or clearing the phase.","Compute chunk ranges from the phase's current items.len() each frame.","Prefer render() over render_range() when full-phase rendering suffices."],"tags":["bevy","render-phase","range","panic","out-of-bounds"],"backgroundTag":"index-out-of-bounds","analyzedSha":"221e52ae323febfd399bd7d067918fc43648cfb3","analyzedAt":"2026-08-20T16:12:39.808Z","contentChangedAt":"2026-08-20T16:12:39.808Z","schemaVersion":2},"datasetVersion":"2026-09-09T06:17:21.866Z"}