114 const bool is_editmode,
115 const bool is_paint_mode,
117 const bool do_uvedit,
127 for (
const IBOType request : ibo_requests) {
128 if (!
buffers.ibos.contains(request)) {
129 ibos_to_create.
append(request);
134 for (
const VBOType request : vbo_requests) {
135 if (!
buffers.vbos.contains(request)) {
136 vbos_to_create.
append(request);
149 object, mesh, is_editmode, is_paint_mode, do_final, do_uvedit, use_hide, scene.
toolsettings);
163 if (lines_index != -1 || loose_lines_index != -1) {
165 lines_index == -1 ?
nullptr : &created_ibos[lines_index],
166 loose_lines_index == -1 ?
nullptr : &created_ibos[loose_lines_index],
172 switch (ibos_to_create[i]) {
174 created_ibos[i] = extract_tris(mr, mesh_render_data_faces_sorted_ensure(mr, mbc));
177 case IBOType::LinesLoose:
180 case IBOType::Points:
181 created_ibos[i] = extract_points(mr);
183 case IBOType::FaceDots:
184 created_ibos[i] = extract_face_dots(mr);
186 case IBOType::LinesPaintMask:
187 created_ibos[i] = extract_lines_paint_mask(mr);
189 case IBOType::LinesAdjacency:
190 created_ibos[i] = extract_lines_adjacency(mr, cache.is_manifold);
192 case IBOType::UVTris:
193 created_ibos[i] = extract_edituv_tris(mr, false);
195 case IBOType::EditUVTris:
196 created_ibos[i] = extract_edituv_tris(mr, true);
198 case IBOType::AllUVLines:
199 created_ibos[i] = extract_edituv_lines(mr, UvExtractionMode::All);
201 case IBOType::UVLines:
202 created_ibos[i] = extract_edituv_lines(mr, UvExtractionMode::Selection);
204 case IBOType::EditUVLines:
205 created_ibos[i] = extract_edituv_lines(mr, UvExtractionMode::Edit);
207 case IBOType::EditUVPoints:
208 created_ibos[i] = extract_edituv_points(mr);
210 case IBOType::EditUVFaceDots:
211 created_ibos[i] = extract_edituv_face_dots(mr);
222 switch (vbos_to_create[i]) {
223 case VBOType::Position:
224 created_vbos[i] = extract_positions(mr);
226 case VBOType::CornerNormal:
227 created_vbos[i] = extract_normals(mr, do_hq_normals);
229 case VBOType::EdgeFactor:
230 created_vbos[i] = extract_edge_factor(mr);
232 case VBOType::VertexGroupWeight:
233 created_vbos[i] = extract_weights(mr, cache);
236 created_vbos[i] = extract_uv_maps(mr, cache);
238 case VBOType::Tangents:
239 created_vbos[i] = extract_tangents(mr, cache, do_hq_normals);
241 case VBOType::SculptData:
242 created_vbos[i] = extract_sculpt_data(mr);
245 created_vbos[i] = extract_orco(mr);
247 case VBOType::EditData:
248 created_vbos[i] = extract_edit_data(mr);
250 case VBOType::EditUVData:
251 created_vbos[i] = extract_edituv_data(mr);
253 case VBOType::EditUVStretchArea:
254 created_vbos[i] = extract_edituv_stretch_area(mr, cache.tot_area, cache.tot_uv_area);
256 case VBOType::EditUVStretchAngle:
257 created_vbos[i] = extract_edituv_stretch_angle(mr);
259 case VBOType::MeshAnalysis:
260 created_vbos[i] = extract_mesh_analysis(mr, object.object_to_world());
262 case VBOType::FaceDotPosition:
263 created_vbos[i] = extract_face_dots_position(mr);
265 case VBOType::FaceDotNormal:
266 created_vbos[i] = extract_face_dot_normals(mr, do_hq_normals);
268 case VBOType::FaceDotUV:
269 created_vbos[i] = extract_face_dots_uv(mr);
271 case VBOType::FaceDotEditUVData:
272 created_vbos[i] = extract_face_dots_edituv_data(mr);
274 case VBOType::SkinRoots:
275 created_vbos[i] = extract_skin_roots(mr);
277 case VBOType::IndexVert:
278 created_vbos[i] = extract_vert_index(mr);
280 case VBOType::IndexEdge:
281 created_vbos[i] = extract_edge_index(mr);
283 case VBOType::IndexFace:
284 created_vbos[i] = extract_face_index(mr);
286 case VBOType::IndexFaceDot:
287 created_vbos[i] = extract_face_dot_index(mr);
298 case VBOType::Attr10:
299 case VBOType::Attr11:
300 case VBOType::Attr12:
301 case VBOType::Attr13:
302 case VBOType::Attr14:
303 case VBOType::Attr15: {
304 const int8_t attr_index = int8_t(vbos_to_create[i]) - int8_t(VBOType::Attr0);
305 created_vbos[i] = extract_attribute(mr, cache.attr_used[attr_index]);
308 case VBOType::AttrViewer:
309 created_vbos[i] = extract_attr_viewer(mr);
311 case VBOType::VertexNormal:
312 created_vbos[i] = extract_vert_normals(mr);
314 case VBOType::PaintOverlayFlag:
315 created_vbos[i] = extract_paint_overlay_flags(mr);
320 for (
const int i : ibos_to_create.index_range()) {
321 buffers.ibos.add_new(ibos_to_create[
i], std::move(created_ibos[
i]));
323 for (
const int i : vbos_to_create.index_range()) {
324 buffers.vbos.add_new(vbos_to_create[
i], std::move(created_vbos[
i]));