111 const bool is_editmode,
112 const bool is_paint_mode,
114 const bool do_uvedit,
124 for (
const IBOType request : ibo_requests) {
125 if (!
buffers.ibos.contains(request)) {
126 ibos_to_create.
append(request);
131 for (
const VBOType request : vbo_requests) {
132 if (!
buffers.vbos.contains(request)) {
133 vbos_to_create.
append(request);
160 if (lines_index != -1 || loose_lines_index != -1) {
162 lines_index == -1 ?
nullptr : &created_ibos[lines_index],
163 loose_lines_index == -1 ?
nullptr : &created_ibos[loose_lines_index],
169 switch (ibos_to_create[i]) {
171 created_ibos[i] = extract_tris(mr, mesh_render_data_faces_sorted_ensure(mr, mbc));
174 case IBOType::LinesLoose:
177 case IBOType::Points:
178 created_ibos[i] = extract_points(mr);
180 case IBOType::FaceDots:
181 created_ibos[i] = extract_face_dots(mr);
183 case IBOType::LinesPaintMask:
184 created_ibos[i] = extract_lines_paint_mask(mr);
186 case IBOType::LinesAdjacency:
187 created_ibos[i] = extract_lines_adjacency(mr, cache.is_manifold);
189 case IBOType::UVTris:
190 created_ibos[i] = extract_edituv_tris(mr, false);
192 case IBOType::EditUVTris:
193 created_ibos[i] = extract_edituv_tris(mr, true);
195 case IBOType::AllUVLines:
196 created_ibos[i] = extract_edituv_lines(mr, UvExtractionMode::All);
198 case IBOType::UVLines:
199 created_ibos[i] = extract_edituv_lines(mr, UvExtractionMode::Selection);
201 case IBOType::EditUVLines:
202 created_ibos[i] = extract_edituv_lines(mr, UvExtractionMode::Edit);
204 case IBOType::EditUVPoints:
205 created_ibos[i] = extract_edituv_points(mr);
207 case IBOType::EditUVFaceDots:
208 created_ibos[i] = extract_edituv_face_dots(mr);
219 switch (vbos_to_create[i]) {
220 case VBOType::Position:
221 created_vbos[i] = extract_positions(mr);
223 case VBOType::CornerNormal:
224 created_vbos[i] = extract_normals(mr, do_hq_normals);
226 case VBOType::EdgeFactor:
227 created_vbos[i] = extract_edge_factor(mr);
229 case VBOType::VertexGroupWeight:
230 created_vbos[i] = extract_weights(mr, cache);
233 created_vbos[i] = extract_uv_maps(mr, cache);
235 case VBOType::Tangents:
236 created_vbos[i] = extract_tangents(mr, cache, do_hq_normals);
238 case VBOType::SculptData:
239 created_vbos[i] = extract_sculpt_data(mr);
242 created_vbos[i] = extract_orco(mr);
244 case VBOType::EditData:
245 created_vbos[i] = extract_edit_data(mr);
247 case VBOType::EditUVData:
248 created_vbos[i] = extract_edituv_data(mr);
250 case VBOType::EditUVStretchArea:
251 created_vbos[i] = extract_edituv_stretch_area(mr, cache.tot_area, cache.tot_uv_area);
253 case VBOType::EditUVStretchAngle:
254 created_vbos[i] = extract_edituv_stretch_angle(mr);
256 case VBOType::MeshAnalysis:
257 created_vbos[i] = extract_mesh_analysis(mr, object.object_to_world());
259 case VBOType::FaceDotPosition:
260 created_vbos[i] = extract_face_dots_position(mr);
262 case VBOType::FaceDotNormal:
263 created_vbos[i] = extract_face_dot_normals(mr, do_hq_normals);
265 case VBOType::FaceDotUV:
266 created_vbos[i] = extract_face_dots_uv(mr);
268 case VBOType::FaceDotEditUVData:
269 created_vbos[i] = extract_face_dots_edituv_data(mr);
271 case VBOType::SkinRoots:
272 created_vbos[i] = extract_skin_roots(mr);
274 case VBOType::IndexVert:
275 created_vbos[i] = extract_vert_index(mr);
277 case VBOType::IndexEdge:
278 created_vbos[i] = extract_edge_index(mr);
280 case VBOType::IndexFace:
281 created_vbos[i] = extract_face_index(mr);
283 case VBOType::IndexFaceDot:
284 created_vbos[i] = extract_face_dot_index(mr);
295 case VBOType::Attr10:
296 case VBOType::Attr11:
297 case VBOType::Attr12:
298 case VBOType::Attr13:
299 case VBOType::Attr14:
300 case VBOType::Attr15: {
301 const int8_t attr_index = int8_t(vbos_to_create[i]) - int8_t(VBOType::Attr0);
302 created_vbos[i] = extract_attribute(mr, cache.attr_used[attr_index]);
305 case VBOType::AttrViewer:
306 created_vbos[i] = extract_attr_viewer(mr);
308 case VBOType::VertexNormal:
309 created_vbos[i] = extract_vert_normals(mr);
314 for (
const int i : ibos_to_create.index_range()) {
315 buffers.ibos.add_new(ibos_to_create[i], std::move(created_ibos[i]));
317 for (
const int i : vbos_to_create.index_range()) {
318 buffers.vbos.add_new(vbos_to_create[i], std::move(created_vbos[i]));
345 for (
const IBOType request : ibo_requests) {
346 if (!
buffers.ibos.contains(request)) {
347 ibos_to_create.
add_new(request);
352 for (
const VBOType request : vbo_requests) {
353 if (!
buffers.vbos.contains(request)) {
354 vbos_to_create.
add_new(request);
362 if (vbos_to_create.
contains(VBOType::Position) || vbos_to_create.
contains(VBOType::Orco)) {
370 subdiv_cache, mr, vbos_to_create.
contains(VBOType::Orco) ? &orco_vbo :
nullptr));
372 buffers.vbos.add_new(VBOType::Orco, std::move(orco_vbo));
375 if (vbos_to_create.
contains(VBOType::CornerNormal)) {
378 VBOType::CornerNormal,
381 if (vbos_to_create.
contains(VBOType::EdgeFactor)) {
386 if (ibos_to_create.
contains(IBOType::Lines) || ibos_to_create.
contains(IBOType::LinesLoose)) {
391 ibos_to_create.
contains(IBOType::Lines) ? &lines_ibo :
nullptr,
392 ibos_to_create.
contains(IBOType::LinesLoose) ? &lines_loose_ibo :
nullptr,
395 buffers.ibos.add_new(IBOType::Lines, std::move(lines_ibo));
397 if (lines_loose_ibo) {
398 buffers.ibos.add_new(IBOType::LinesLoose, std::move(lines_loose_ibo));
401 if (ibos_to_create.
contains(IBOType::Tris)) {
404 if (ibos_to_create.
contains(IBOType::Points)) {
407 if (vbos_to_create.
contains(VBOType::EditData)) {
410 if (vbos_to_create.
contains(VBOType::Tangents)) {
413 if (vbos_to_create.
contains(VBOType::IndexVert)) {
416 if (vbos_to_create.
contains(VBOType::IndexEdge)) {
419 if (vbos_to_create.
contains(VBOType::IndexFace)) {
422 if (vbos_to_create.
contains(VBOType::VertexGroupWeight)) {
423 buffers.vbos.add_new(VBOType::VertexGroupWeight,
426 if (vbos_to_create.
contains(VBOType::FaceDotNormal) ||
427 vbos_to_create.
contains(VBOType::FaceDotPosition) ||
428 ibos_to_create.
contains(IBOType::FaceDots))
437 face_dot_position_vbo,
438 vbos_to_create.
contains(VBOType::FaceDotNormal) ? &face_dot_normal_vbo :
nullptr,
440 buffers.vbos.add_new(VBOType::FaceDotPosition, std::move(face_dot_position_vbo));
441 if (face_dot_normal_vbo) {
442 buffers.vbos.add_new(VBOType::FaceDotNormal, std::move(face_dot_normal_vbo));
444 buffers.ibos.add_new(IBOType::FaceDots, std::move(face_dot_ibo));
446 if (ibos_to_create.
contains(IBOType::LinesPaintMask)) {
447 buffers.ibos.add_new(IBOType::LinesPaintMask,
450 if (ibos_to_create.
contains(IBOType::LinesAdjacency)) {
451 buffers.ibos.add_new(IBOType::LinesAdjacency,
454 if (vbos_to_create.
contains(VBOType::SculptData)) {
457 if (vbos_to_create.
contains(VBOType::UVs)) {
461 if (ibos_to_create.
contains(IBOType::AllUVLines)) {
462 buffers.ibos.add_new(IBOType::AllUVLines,
465 if (ibos_to_create.
contains(IBOType::UVLines)) {
470 if (vbos_to_create.
contains(VBOType::EditUVStretchArea)) {
472 VBOType::EditUVStretchArea,
475 if (vbos_to_create.
contains(VBOType::EditUVStretchAngle)) {
476 buffers.vbos.add_new(VBOType::EditUVStretchAngle,
479 if (vbos_to_create.
contains(VBOType::EditUVData)) {
482 if (ibos_to_create.
contains(IBOType::EditUVTris)) {
485 if (ibos_to_create.
contains(IBOType::EditUVLines)) {
486 buffers.ibos.add_new(IBOType::EditUVLines,
489 if (ibos_to_create.
contains(IBOType::EditUVPoints)) {
494 if (vbos_to_create.
contains(request)) {