{"record":{"id":"95990c36a74baab7","repo":"bevyengine/bevy","slug":"the-mesh-vertex-index-data-has-been-extracted-to-t","errorCode":null,"errorMessage":"The mesh vertex/index data has been extracted to the RenderWorld (via `Mesh::asset_usage`)","messagePattern":"The mesh vertex/index data has been extracted to the RenderWorld \\(via `Mesh::asset_usage`\\)","errorType":"exception","errorClass":"MeshAccessError","httpStatus":null,"severity":"error","filePath":"crates/bevy_mesh/src/mesh.rs","lineNumber":40,"sourceCode":"};\nuse bevy_platform::collections::{hash_map, HashMap};\nuse bevy_reflect::{std_traits::ReflectDefault, Reflect};\nuse bytemuck::cast_slice;\nuse core::hash::{Hash, Hasher};\nuse core::ptr;\n#[cfg(feature = \"serialize\")]\nuse serde::{Deserialize, Serialize};\nuse thiserror::Error;\nuse tracing::warn;\nuse wgpu_types::{VertexAttribute, VertexFormat, VertexStepMode, WriteOnly};\n\npub const INDEX_BUFFER_ASSET_INDEX: u64 = 0;\npub const VERTEX_ATTRIBUTE_BUFFER_ID: u64 = 10;\n\n/// Error from accessing mesh vertex attributes or indices\n#[derive(Error, Debug, Clone)]\npub enum MeshAccessError {\n    #[error(\"The mesh vertex/index data has been extracted to the RenderWorld (via `Mesh::asset_usage`)\")]\n    ExtractedToRenderWorld,\n    #[error(\"The requested mesh data wasn't found in this mesh\")]\n    NotFound,\n}\n\nconst MESH_EXTRACTED_ERROR: &str = \"Mesh has been extracted to RenderWorld. To access vertex attributes, the mesh `asset_usage` must include `MAIN_WORLD`\";\n\n// storage for extractable data with access methods which return errors if the\n// contents have already been extracted\n#[derive(Debug, Clone, PartialEq, Reflect, Default)]\nenum MeshExtractableData<T> {\n    Data(T),\n    #[default]\n    NoData,\n    ExtractedToRenderWorld,\n}\n\nimpl<T> MeshExtractableData<T> {","sourceCodeStart":22,"sourceCodeEnd":58,"githubUrl":"https://github.com/bevyengine/bevy/blob/396ca727080776bd313bb892423b7d94e03b81b4/crates/bevy_mesh/src/mesh.rs#L22-L58","documentation":"When a Mesh asset is used for rendering and its asset_usage omits MAIN_WORLD, Bevy extracts (moves) the vertex/index data to the RenderWorld and drops the CPU copy. Any later CPU-side access through the MeshExtractableData accessors returns MeshAccessError::ExtractedToRenderWorld. The companion hint constant MESH_EXTRACTED_ERROR explains that asset_usage must include MAIN_WORLD for CPU access.","triggerScenarios":"Calling mesh.attributes(), mesh.indices_mut(), mesh.try_insert_attribute(), mesh.triangles_mut() or similar accessors after the mesh was rendered with asset_usage = RenderAssetUsages::RENDER_WORLD only.","commonSituations":"Optimizing memory by dropping MAIN_WORLD, then a runtime system (physics, picking, mesh editing, serialization) still needs CPU access; hot-reload code that mutates already-uploaded meshes.","solutions":["Keep MAIN_WORLD in asset_usage: mesh.asset_usage = RenderAssetUsages::MAIN_WORLD | RenderAssetUsages::RENDER_WORLD","Finish all CPU-side reads/edits before the mesh is added to Assets<Mesh> and rendered","Store a separate CPU-side copy (e.g. raw Vecs or a clone before extraction) for systems that need the data later"],"exampleFix":"// before\nlet mut mesh = Mesh::from(shape::Cube::default());\nmesh.asset_usage = RenderAssetUsages::RENDER_WORLD;\n// ... later, after render extraction:\nmesh.insert_attribute(Mesh::ATTRIBUTE_NORMAL, normals); // Err(ExtractedToRenderWorld)\n\n// after\nlet mut mesh = Mesh::from(shape::Cube::default());\nmesh.asset_usage = RenderAssetUsages::MAIN_WORLD | RenderAssetUsages::RENDER_WORLD;\nmesh.insert_attribute(Mesh::ATTRIBUTE_NORMAL, normals); // Ok","handlingStrategy":"validation","validationCode":"fn mesh_usable_on_cpu(mesh: &Mesh) -> bool {\n    mesh.asset_usage.contains(RenderAssetUsages::MAIN_WORLD)\n}\n\nif mesh_usable_on_cpu(&mesh) {\n    let values = mesh.try_attributes()?;\n}","typeGuard":null,"tryCatchPattern":"match mesh.try_attributes() {\n    Ok(attributes) => { /* read attributes */ }\n    Err(MeshAccessError::ExtractedToRenderWorld) => {\n        // data lives only in the RenderWorld: fix asset_usage or use a CPU copy\n    }\n    Err(MeshAccessError::NotFound) => { /* mesh has no attributes at all */ }\n}","preventionTips":["Only drop MAIN_WORLD from asset_usage for meshes no CPU system will touch again","Finish mesh edits before inserting the asset into Assets<Mesh>","Keep raw geometry alongside render assets for procedural or inspected meshes"],"tags":["bevy","bevy-mesh","rust","mesh","asset-usage","render-world","data-access"],"backgroundTag":"mesh-data-extracted","analyzedSha":"396ca727080776bd313bb892423b7d94e03b81b4","analyzedAt":"2026-08-20T16:12:39.808Z","contentChangedAt":"2026-08-20T16:12:39.808Z","schemaVersion":2},"datasetVersion":"2026-09-08T10:18:20.063Z"}