Cleanup: Remove unnecessary Mesh C-API functions

Like mentioned in the docstrings, use the C++ API or access methods
in C++ code.
This commit is contained in:
Hans Goudey
2023-12-12 20:45:16 -05:00
parent 65274dc096
commit b52a071e7a
36 changed files with 169 additions and 146 deletions

View File

@@ -14,7 +14,6 @@
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
#include "BKE_customdata.hh"
struct BMesh;
struct BMeshCreateParams;
@@ -563,46 +562,6 @@ void BKE_mesh_debug_print(const struct Mesh *mesh) ATTR_NONNULL(1);
/** \name Inline Mesh Data Access
* \{ */
/**
* \return The material index for each face. May be null.
* \note In C++ code, prefer using the attribute API (#AttributeAccessor).
*/
BLI_INLINE const int *BKE_mesh_material_indices(const Mesh *mesh)
{
return (const int *)CustomData_get_layer_named(
&mesh->face_data, CD_PROP_INT32, "material_index");
}
/**
* \return The material index for each face. Create the layer if it doesn't exist.
* \note In C++ code, prefer using the attribute API (#MutableAttributeAccessor).
*/
BLI_INLINE int *BKE_mesh_material_indices_for_write(Mesh *mesh)
{
int *indices = (int *)CustomData_get_layer_named_for_write(
&mesh->face_data, CD_PROP_INT32, "material_index", mesh->faces_num);
if (indices) {
return indices;
}
return (int *)CustomData_add_layer_named(
&mesh->face_data, CD_PROP_INT32, CD_SET_DEFAULT, mesh->faces_num, "material_index");
}
BLI_INLINE const MDeformVert *BKE_mesh_deform_verts(const Mesh *mesh)
{
return (const MDeformVert *)CustomData_get_layer(&mesh->vert_data, CD_MDEFORMVERT);
}
BLI_INLINE MDeformVert *BKE_mesh_deform_verts_for_write(Mesh *mesh)
{
MDeformVert *dvert = (MDeformVert *)CustomData_get_layer_for_write(
&mesh->vert_data, CD_MDEFORMVERT, mesh->totvert);
if (dvert) {
return dvert;
}
return (MDeformVert *)CustomData_add_layer(
&mesh->vert_data, CD_MDEFORMVERT, CD_SET_DEFAULT, mesh->totvert);
}
#ifdef __cplusplus
}
#endif

View File

@@ -10,6 +10,7 @@
#include "BLI_index_mask.hh"
#include "BKE_customdata.hh"
#include "BKE_mesh.h"
#include "BKE_mesh_types.hh"
@@ -389,7 +390,8 @@ inline blender::MutableSpan<int> Mesh::corner_edges_for_write()
inline blender::Span<MDeformVert> Mesh::deform_verts() const
{
const MDeformVert *dverts = BKE_mesh_deform_verts(this);
const MDeformVert *dverts = static_cast<const MDeformVert *>(
CustomData_get_layer(&this->vert_data, CD_MDEFORMVERT));
if (!dverts) {
return {};
}
@@ -397,7 +399,14 @@ inline blender::Span<MDeformVert> Mesh::deform_verts() const
}
inline blender::MutableSpan<MDeformVert> Mesh::deform_verts_for_write()
{
return {BKE_mesh_deform_verts_for_write(this), this->totvert};
MDeformVert *dvert = static_cast<MDeformVert *>(
CustomData_get_layer_for_write(&this->vert_data, CD_MDEFORMVERT, this->totvert));
if (dvert) {
return {dvert, this->totvert};
}
return {static_cast<MDeformVert *>(CustomData_add_layer(
&this->vert_data, CD_MDEFORMVERT, CD_SET_DEFAULT, this->totvert)),
this->totvert};
}
/** \} */

View File

@@ -520,7 +520,7 @@ static void armature_deform_coords_impl(const Object *ob_arm,
target_data_id = me_target == nullptr ? (const ID *)ob_target->data : &me_target->id;
if (em_target == nullptr) {
const Mesh *mesh = (const Mesh *)target_data_id;
dverts = BKE_mesh_deform_verts(mesh);
dverts = mesh->deform_verts().data();
if (dverts) {
dverts_len = mesh->totvert;
}
@@ -555,7 +555,7 @@ static void armature_deform_coords_impl(const Object *ob_arm,
use_dverts = (cd_dvert_offset != -1);
}
else if (me_target) {
use_dverts = (BKE_mesh_deform_verts(me_target) != nullptr);
use_dverts = !me_target->deform_verts().is_empty();
}
else if (dverts) {
use_dverts = true;

View File

@@ -2085,7 +2085,7 @@ static void emit_from_mesh(
const blender::Span<int> corner_verts = mesh->corner_verts();
const blender::Span<MLoopTri> looptris = mesh->looptris();
const int numverts = mesh->totvert;
const MDeformVert *dvert = BKE_mesh_deform_verts(mesh);
const MDeformVert *dvert = mesh->deform_verts().data();
const float(*mloopuv)[2] = static_cast<const float(*)[2]>(
CustomData_get_layer_named(&mesh->loop_data, CD_PROP_FLOAT2, ffs->uvlayer_name));
@@ -3219,14 +3219,17 @@ static Mesh *create_liquid_geometry(FluidDomainSettings *fds,
Mesh *orgmesh,
Object *ob)
{
using namespace blender;
Mesh *mesh;
float min[3];
float max[3];
float size[3];
float cell_size_scaled[3];
const int *orig_material_indices = BKE_mesh_material_indices(orgmesh);
const short mp_mat_nr = orig_material_indices ? orig_material_indices[0] : 0;
const bke::AttributeAccessor orig_attributes = orgmesh->attributes();
const VArraySpan orig_material_indices = *orig_attributes.lookup<int>("material_index",
ATTR_DOMAIN_FACE);
const short mp_mat_nr = orig_material_indices.is_empty() ? 0 : orig_material_indices[0];
int i;
int num_verts, num_faces;
@@ -3341,12 +3344,14 @@ static Mesh *create_liquid_geometry(FluidDomainSettings *fds,
}
}
int *material_indices = BKE_mesh_material_indices_for_write(mesh);
bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
bke::SpanAttributeWriter material_indices = attributes.lookup_or_add_for_write_span<int>(
"material_index", ATTR_DOMAIN_FACE);
/* Loop for triangles. */
for (const int i : face_offsets.index_range().drop_back(1)) {
/* Initialize from existing face. */
material_indices[i] = mp_mat_nr;
material_indices.span[i] = mp_mat_nr;
face_offsets[i] = i * 3;
@@ -3362,6 +3367,8 @@ static Mesh *create_liquid_geometry(FluidDomainSettings *fds,
# endif
}
material_indices.finish();
BKE_mesh_calc_edges(mesh, false, false);
return mesh;

View File

@@ -1274,7 +1274,7 @@ static float *get_weights_array(Object *ob, char *vgroup, WeightsArrayCache *cac
/* gather dvert and totvert */
if (ob->type == OB_MESH) {
Mesh *mesh = static_cast<Mesh *>(ob->data);
dvert = BKE_mesh_deform_verts(mesh);
dvert = mesh->deform_verts().data();
totvert = mesh->totvert;
if (mesh->edit_mesh && mesh->edit_mesh->bm->totvert == totvert) {

View File

@@ -372,7 +372,7 @@ static void lattice_deform_coords_impl(const Object *ob_lattice,
dvert = ((Lattice *)ob_target->data)->dvert;
}
else {
dvert = BKE_mesh_deform_verts((Mesh *)ob_target->data);
dvert = ((Mesh *)ob_target->data)->deform_verts().data();
}
}
}

View File

@@ -447,7 +447,7 @@ Mesh *BKE_mesh_mirror_apply_mirror_on_axis_for_modifier(MirrorModifierData *mmd,
/* handle vgroup stuff */
if (BKE_object_supports_vertex_groups(ob)) {
if ((mmd->flag & MOD_MIR_VGROUP) && CustomData_has_layer(&result->vert_data, CD_MDEFORMVERT)) {
MDeformVert *dvert = BKE_mesh_deform_verts_for_write(result) + src_verts_num;
MDeformVert *dvert = result->deform_verts_for_write().data() + src_verts_num;
int flip_map_len = 0;
int *flip_map = BKE_object_defgroup_flip_map(ob, false, &flip_map_len);
if (flip_map) {

View File

@@ -112,7 +112,7 @@ bDeformGroup *BKE_object_defgroup_add(Object *ob)
MDeformVert *BKE_object_defgroup_data_create(ID *id)
{
if (GS(id->name) == ID_ME) {
return BKE_mesh_deform_verts_for_write((Mesh *)id);
return ((Mesh *)id)->deform_verts_for_write().data();
}
if (GS(id->name) == ID_LT) {
Lattice *lt = (Lattice *)id;
@@ -160,12 +160,12 @@ bool BKE_object_defgroup_clear(Object *ob, bDeformGroup *dg, const bool use_sele
}
}
else {
if (BKE_mesh_deform_verts(mesh)) {
if (!mesh->deform_verts().data()) {
const bool *select_vert = (const bool *)CustomData_get_layer_named(
&mesh->vert_data, CD_PROP_BOOL, ".select_vert");
int i;
dv = BKE_mesh_deform_verts_for_write(mesh);
dv = mesh->deform_verts_for_write().data();
for (i = 0; i < mesh->totvert; i++, dv++) {
if (dv->dw && (!use_selection || (select_vert && select_vert[i]))) {
@@ -496,7 +496,7 @@ bool BKE_object_defgroup_array_get(ID *id, MDeformVert **dvert_arr, int *dvert_t
switch (GS(id->name)) {
case ID_ME: {
Mesh *mesh = (Mesh *)id;
*dvert_arr = BKE_mesh_deform_verts_for_write(mesh);
*dvert_arr = mesh->deform_verts_for_write().data();
*dvert_tot = mesh->totvert;
return true;
}

View File

@@ -2575,7 +2575,7 @@ float *psys_cache_vgroup(Mesh *mesh, ParticleSystem *psys, int vgroup)
/* hair dynamics pinning vgroup */
}
else if (psys->vgroup[vgroup]) {
const MDeformVert *dvert = BKE_mesh_deform_verts(mesh);
const MDeformVert *dvert = mesh->deform_verts().data();
if (dvert) {
int totvert = mesh->totvert, i;
vg = static_cast<float *>(MEM_callocN(sizeof(float) * totvert, "vg_cache"));

View File

@@ -3352,7 +3352,7 @@ static void hair_create_input_mesh(ParticleSimulationData *sim,
}
blender::MutableSpan<blender::float3> positions = mesh->vert_positions_for_write();
blender::int2 *edge = mesh->edges_for_write().data();
dvert = BKE_mesh_deform_verts_for_write(mesh);
dvert = mesh->deform_verts_for_write().data();
if (psys->clmd->hairdata == nullptr) {
psys->clmd->hairdata = static_cast<ClothHairData *>(

View File

@@ -2701,7 +2701,7 @@ static void mesh_to_softbody(Object *ob)
sb = ob->soft;
bp = sb->bpoint;
const MDeformVert *dvert = BKE_mesh_deform_verts(mesh);
const MDeformVert *dvert = mesh->deform_verts().data();
defgroup_index = dvert ? (sb->vertgroup - 1) : -1;
defgroup_index_mass = dvert ? BKE_id_defgroup_name_index(&mesh->id, sb->namedVG_Mass) : -1;

View File

@@ -846,7 +846,7 @@ void blo_do_versions_290(FileData *fd, Library * /*lib*/, Main *bmain)
me->totloop,
me->face_offsets_for_write().data(),
me->faces_num,
BKE_mesh_deform_verts_for_write(me),
me->deform_verts_for_write().data(),
false,
true,
&changed);

View File

@@ -14,8 +14,9 @@
* \note It is currently work in progress and should replace the old global draw manager.
*/
#include "BLI_listbase_wrapper.hh"
#include "BLI_map.hh"
#include "BLI_sys_types.h"
#include "GPU_material.h"
#include "draw_resource.hh"

View File

@@ -40,12 +40,16 @@
* if any of these reference becomes invalid.
*/
#include "BKE_image.h"
#include "BLI_listbase_wrapper.hh"
#include "BLI_vector.hh"
#include "DRW_gpu_wrapper.hh"
#include "BKE_image.h"
#include "GPU_debug.h"
#include "GPU_material.h"
#include "DRW_gpu_wrapper.hh"
#include "draw_command.hh"
#include "draw_handle.hh"
#include "draw_manager.hh"

View File

@@ -23,6 +23,7 @@
#include "BLI_utildefines.h"
#include "BKE_DerivedMesh.hh"
#include "BKE_attribute.hh"
#include "BKE_blender.h"
#include "BKE_cdderivedmesh.h"
#include "BKE_context.hh"
@@ -114,6 +115,7 @@ struct MultiresBakeJob {
static bool multiresbake_check(bContext *C, wmOperator *op)
{
using namespace blender;
Scene *scene = CTX_data_scene(C);
Object *ob;
Mesh *mesh;
@@ -163,10 +165,13 @@ static bool multiresbake_check(bContext *C, wmOperator *op)
ok = false;
}
else {
const int *material_indices = BKE_mesh_material_indices(mesh);
const bke::AttributeAccessor attributes = mesh->attributes();
const VArraySpan material_indices = *attributes.lookup<int>("material_index",
ATTR_DOMAIN_FACE);
a = mesh->faces_num;
while (ok && a--) {
Image *ima = bake_object_image_get(ob, material_indices ? material_indices[a] : 0);
Image *ima = bake_object_image_get(ob,
material_indices.is_empty() ? 0 : material_indices[a]);
if (!ima) {
BKE_report(

View File

@@ -820,8 +820,7 @@ static int vert_select_ungrouped_exec(bContext *C, wmOperator *op)
Object *ob = CTX_data_active_object(C);
Mesh *mesh = static_cast<Mesh *>(ob->data);
if (BLI_listbase_is_empty(&mesh->vertex_group_names) || (BKE_mesh_deform_verts(mesh) == nullptr))
{
if (BLI_listbase_is_empty(&mesh->vertex_group_names) || mesh->deform_verts().is_empty()) {
BKE_report(op->reports, RPT_ERROR, "No weights/vertex groups on object");
return OPERATOR_CANCELLED;
}

View File

@@ -175,7 +175,7 @@ static int weight_sample_invoke(bContext *C, wmOperator *op, const wmEvent *even
ViewContext vc = ED_view3d_viewcontext_init(C, depsgraph);
mesh = BKE_mesh_from_object(vc.obact);
const MDeformVert *dvert = BKE_mesh_deform_verts(mesh);
const MDeformVert *dvert = mesh->deform_verts().data();
if (mesh && dvert && vc.v3d && vc.rv3d && (mesh->vertex_group_active_index != 0)) {
const bool use_vert_sel = (mesh->editflag & ME_EDIT_PAINT_VERT_SEL) != 0;
@@ -320,7 +320,7 @@ static int weight_sample_group_invoke(bContext *C, wmOperator *op, const wmEvent
BLI_assert(vc.v3d && vc.rv3d); /* Ensured by poll. */
Mesh *mesh = BKE_mesh_from_object(vc.obact);
const MDeformVert *dverts = BKE_mesh_deform_verts(mesh);
const MDeformVert *dverts = mesh->deform_verts().data();
if (BLI_listbase_is_empty(&mesh->vertex_group_names) || (dverts == nullptr)) {
BKE_report(op->reports, RPT_WARNING, "No vertex group data");
return OPERATOR_CANCELLED;
@@ -416,7 +416,7 @@ static bool weight_paint_set(Object *ob, float paintweight)
const blender::OffsetIndices faces = mesh->faces();
const blender::Span<int> corner_verts = mesh->corner_verts();
MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh);
MDeformVert *dvert = mesh->deform_verts_for_write().data();
if (mesh->faces_num == 0 || dvert == nullptr) {
return false;
@@ -722,7 +722,7 @@ static int paint_weight_gradient_modal(bContext *C, wmOperator *op, const wmEven
if (vert_cache != nullptr) {
Mesh *mesh = static_cast<Mesh *>(ob->data);
if (vert_cache->wpp.wpaint_prev) {
MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh);
MDeformVert *dvert = mesh->deform_verts_for_write().data();
BKE_defvert_array_free_elems(dvert, mesh->totvert);
BKE_defvert_array_copy(dvert, vert_cache->wpp.wpaint_prev, mesh->totvert);
wpaint_prev_destroy(&vert_cache->wpp);
@@ -750,7 +750,7 @@ static int paint_weight_gradient_exec(bContext *C, wmOperator *op)
Scene *scene = CTX_data_scene(C);
Object *ob = CTX_data_active_object(C);
Mesh *mesh = static_cast<Mesh *>(ob->data);
MDeformVert *dverts = BKE_mesh_deform_verts_for_write(mesh);
MDeformVert *dverts = mesh->deform_verts_for_write().data();
int x_start = RNA_int_get(op->ptr, "xstart");
int y_start = RNA_int_get(op->ptr, "ystart");
int x_end = RNA_int_get(op->ptr, "xend");

View File

@@ -60,7 +60,7 @@ bool ED_wpaint_ensure_data(bContext *C,
}
/* If nothing was added yet, we make deform-verts and a vertex deform group. */
if (BKE_mesh_deform_verts(mesh) == nullptr) {
if (mesh->deform_verts().is_empty()) {
BKE_object_defgroup_data_create(&mesh->id);
WM_event_add_notifier(C, NC_GEOM | ND_DATA, mesh);
}

View File

@@ -5357,7 +5357,7 @@ static void lineart_gpencil_generate(LineartCache *cache,
if (eval_ob && eval_ob->type == OB_MESH) {
int dindex = 0;
Mesh *mesh = BKE_object_get_evaluated_mesh(eval_ob);
MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh);
MDeformVert *dvert = mesh->deform_verts_for_write().data();
if (dvert) {
LISTBASE_FOREACH (bDeformGroup *, db, &mesh->vertex_group_names) {
if ((!source_vgname) || strstr(db->name, source_vgname) == db->name) {

View File

@@ -115,7 +115,7 @@ bool ArmatureExporter::add_instance_controller(Object *ob)
ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id));
Mesh *mesh = (Mesh *)ob->data;
if (BKE_mesh_deform_verts(mesh) == nullptr) {
if (mesh->deform_verts().is_empty()) {
return false;
}

View File

@@ -66,7 +66,7 @@ bool ControllerExporter::add_instance_controller(Object *ob)
ins.setUrl(COLLADASW::URI(COLLADABU::Utils::EMPTY_STRING, controller_id));
Mesh *mesh = (Mesh *)ob->data;
if (BKE_mesh_deform_verts(mesh) == nullptr) {
if (mesh->deform_verts().is_empty()) {
return false;
}
@@ -162,7 +162,7 @@ void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm)
bool use_instantiation = this->export_settings.get_use_object_instantiation();
Mesh *mesh;
if (BKE_mesh_deform_verts((Mesh *)ob->data) == nullptr) {
if (((Mesh *)ob->data)->deform_verts().is_empty()) {
return;
}
@@ -205,7 +205,7 @@ void ControllerExporter::export_skin_controller(Object *ob, Object *ob_arm)
}
}
const MDeformVert *dvert = BKE_mesh_deform_verts(mesh);
const MDeformVert *dvert = mesh->deform_verts().data();
int oob_counter = 0;
for (i = 0; i < mesh->totvert; i++) {
const MDeformVert *vert = &dvert[i];

View File

@@ -18,7 +18,7 @@
#include "MEM_guardedalloc.h"
#include "BKE_attribute.h"
#include "BKE_attribute.hh"
#include "BKE_customdata.hh"
#include "BKE_displist.h"
#include "BKE_global.h"
@@ -601,6 +601,7 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh,
Mesh *mesh,
blender::Vector<blender::float3> &loop_normals)
{
using namespace blender;
uint i;
allocate_poly_data(collada_mesh, mesh);
@@ -615,7 +616,10 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh,
MaterialIdPrimitiveArrayMap mat_prim_map;
int *material_indices = BKE_mesh_material_indices_for_write(mesh);
bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
bke::SpanAttributeWriter material_indices = attributes.lookup_or_add_for_write_span<int>(
"material_index", ATTR_DOMAIN_FACE);
bool *sharp_faces = static_cast<bool *>(CustomData_get_layer_named_for_write(
&mesh->face_data, CD_PROP_BOOL, "sharp_face", mesh->faces_num));
if (!sharp_faces) {
@@ -642,7 +646,7 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh,
/* Since we cannot set `poly->mat_nr` here, we store a portion of `mesh->mpoly` in Primitive.
*/
Primitive prim = {face_index, &material_indices[face_index], 0};
Primitive prim = {face_index, &material_indices.span[face_index], 0};
/* If MeshPrimitive is TRIANGLE_FANS we split it into triangles
* The first triangle-fan vertex will be the first vertex in every triangle
@@ -800,6 +804,7 @@ void MeshImporter::read_polys(COLLADAFW::Mesh *collada_mesh,
}
geom_uid_mat_mapping_map[collada_mesh->getUniqueId()] = mat_prim_map;
material_indices.finish();
}
void MeshImporter::get_vector(float v[3], COLLADAFW::MeshVertexData &arr, int i, int stride)

View File

@@ -10,7 +10,7 @@
#include "BLI_string.h"
#include "BLI_vector_set.hh"
#include "BKE_attribute.h"
#include "BKE_attribute.hh"
#include "BKE_material.h"
#include "BKE_mesh.hh"
#include "BKE_mesh_runtime.hh"
@@ -373,21 +373,20 @@ void MeshData::write_submeshes(const Mesh *mesh)
const Span<int> corner_verts = mesh->corner_verts();
const Span<MLoopTri> looptris = mesh->looptris();
const Span<int> looptri_faces = mesh->looptri_faces();
const std::pair<bke::MeshNormalDomain, Span<float3>> normals = get_mesh_normals(*mesh);
const bke::AttributeAccessor attributes = mesh->attributes();
const StringRef active_uv = CustomData_get_active_layer_name(&mesh->loop_data, CD_PROP_FLOAT2);
const VArraySpan uv_map = *attributes.lookup<float2>(active_uv, ATTR_DOMAIN_CORNER);
const VArraySpan material_indices = *attributes.lookup<int>("material_index", ATTR_DOMAIN_FACE);
const float2 *uv_map = static_cast<const float2 *>(
CustomData_get_layer(&mesh->loop_data, CD_PROP_FLOAT2));
const int *material_indices = BKE_mesh_material_indices(mesh);
if (!material_indices) {
if (material_indices.is_empty()) {
copy_submesh(*mesh,
vert_positions,
corner_verts,
looptris,
looptri_faces,
normals,
uv_map ? Span<float2>(uv_map, mesh->totloop) : Span<float2>(),
uv_map,
looptris.index_range(),
submeshes_.first());
return;
@@ -410,7 +409,7 @@ void MeshData::write_submeshes(const Mesh *mesh)
looptris,
looptri_faces,
normals,
uv_map ? Span<float2>(uv_map, mesh->totloop) : Span<float2>(),
uv_map,
triangles_by_material[i],
submeshes_[i]);
}

View File

@@ -55,6 +55,7 @@ static const EnumPropertyItem rna_enum_mesh_remesh_mode_items[] = {
# include "BLI_math_vector.h"
# include "BKE_attribute.hh"
# include "BKE_customdata.hh"
# include "BKE_main.hh"
# include "BKE_mesh.hh"
@@ -628,18 +629,23 @@ static void rna_MeshPolygon_select_set(PointerRNA *ptr, bool value)
static int rna_MeshPolygon_material_index_get(PointerRNA *ptr)
{
using namespace blender;
const Mesh *mesh = rna_mesh(ptr);
const int *material_indices = BKE_mesh_material_indices(mesh);
const int index = rna_MeshPolygon_index_get(ptr);
return material_indices == nullptr ? 0 : material_indices[index];
const bke::AttributeAccessor attributes = mesh->attributes();
const VArray material_index = *attributes.lookup_or_default<int>(
"material_index", ATTR_DOMAIN_FACE, 0);
return material_index[rna_MeshPolygon_index_get(ptr)];
}
static void rna_MeshPolygon_material_index_set(PointerRNA *ptr, int value)
{
using namespace blender;
Mesh *mesh = rna_mesh(ptr);
int *material_indices = BKE_mesh_material_indices_for_write(mesh);
const int index = rna_MeshPolygon_index_get(ptr);
material_indices[index] = max_ii(0, value);
bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
bke::AttributeWriter material_index = attributes.lookup_or_add_for_write<int>("material_index",
ATTR_DOMAIN_FACE);
material_index.varray.set(rna_MeshPolygon_index_get(ptr), max_ii(0, value));
material_index.finish();
}
static void rna_MeshPolygon_center_get(PointerRNA *ptr, float *values)
@@ -765,7 +771,7 @@ static void rna_Mesh_texspace_location_get(PointerRNA *ptr, float values[3])
static void rna_MeshVertex_groups_begin(CollectionPropertyIterator *iter, PointerRNA *ptr)
{
Mesh *mesh = rna_mesh(ptr);
MDeformVert *dverts = (MDeformVert *)BKE_mesh_deform_verts(mesh);
MDeformVert *dverts = mesh->deform_verts_for_write().data();
if (dverts) {
const int index = rna_MeshVertex_index_get(ptr);
MDeformVert *dvert = &dverts[index];
@@ -1384,10 +1390,12 @@ static bool rna_MeshEdge_is_loose_get(PointerRNA *ptr)
static int rna_MeshLoopTriangle_material_index_get(PointerRNA *ptr)
{
using namespace blender;
const Mesh *mesh = rna_mesh(ptr);
const int face_i = rna_MeshLoopTriangle_polygon_index_get(ptr);
const int *material_indices = BKE_mesh_material_indices(mesh);
return material_indices == nullptr ? 0 : material_indices[face_i];
const bke::AttributeAccessor attributes = mesh->attributes();
const VArray material_indices = *attributes.lookup_or_default<int>(
"material_index", ATTR_DOMAIN_FACE, 0);
return material_indices[rna_MeshLoopTriangle_polygon_index_get(ptr)];
}
static bool rna_MeshLoopTriangle_use_smooth_get(PointerRNA *ptr)
@@ -1405,7 +1413,7 @@ static char *rna_VertexGroupElement_path(const PointerRNA *ptr)
{
const Mesh *mesh = rna_mesh(ptr); /* XXX not always! */
const MDeformWeight *dw = (MDeformWeight *)ptr->data;
const MDeformVert *dvert = BKE_mesh_deform_verts(mesh);
const MDeformVert *dvert = mesh->deform_verts().data();
int a, b;
for (a = 0; a < mesh->totvert; a++, dvert++) {

View File

@@ -316,8 +316,8 @@ static void mesh_merge_transform(Mesh *result,
}
/* remap the vertex groups if necessary */
if (BKE_mesh_deform_verts(result) != nullptr) {
MDeformVert *dvert = BKE_mesh_deform_verts_for_write(result);
if (!result->deform_verts().is_empty()) {
MDeformVert *dvert = result->deform_verts_for_write().data();
BKE_object_defgroup_index_map_apply(&dvert[cap_verts_index], cap_nverts, remap, remap_len);
}

View File

@@ -128,7 +128,7 @@ static void createFacepa(ExplodeModifierData *emd, ParticleSystemModifierData *p
/* set protected verts */
if (emd->vgroup) {
const MDeformVert *dvert = BKE_mesh_deform_verts(mesh);
const MDeformVert *dvert = mesh->deform_verts().data();
if (dvert) {
const int defgrp_index = emd->vgroup - 1;
for (i = 0; i < totvert; i++, dvert++) {

View File

@@ -248,7 +248,7 @@ static void meshcache_do(MeshCacheModifierData *mcmd,
const float global_offset = (mcmd->flag & MOD_MESHCACHE_INVERT_VERTEX_GROUP) ?
mcmd->factor :
0.0f;
if (BKE_mesh_deform_verts(mesh) != nullptr) {
if (!mesh->deform_verts().is_empty()) {
for (int i = 0; i < verts_num; i++) {
/* For each vertex, compute its blending factor between the mesh cache (for `fac = 0`)
* and the former position of the vertex (for `fac = 1`). */

View File

@@ -836,8 +836,13 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh
/* more of an offset in this case */
edge_offset = totedge + (totvert * (step_tot - (close ? 0 : 1)));
const int *src_material_index = BKE_mesh_material_indices(mesh);
int *dst_material_index = BKE_mesh_material_indices_for_write(result);
const bke::AttributeAccessor src_attributes = mesh->attributes();
const VArraySpan src_material_index = *src_attributes.lookup<int>("material_index",
ATTR_DOMAIN_FACE);
bke::MutableAttributeAccessor dst_attributes = result->attributes_for_write();
bke::SpanAttributeWriter dst_material_index = dst_attributes.lookup_or_add_for_write_span<int>(
"material_index", ATTR_DOMAIN_FACE);
for (uint i = 0; i < totedge; i++, med_new_firstloop++) {
const uint step_last = step_tot - (close ? 1 : 2);
@@ -858,7 +863,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh
i2 = uint((*med_new_firstloop)[1]);
if (has_mpoly_orig) {
mat_nr = src_material_index == nullptr ? 0 : src_material_index[face_index_orig];
mat_nr = src_material_index.is_empty() ? 0 : src_material_index[face_index_orig];
}
else {
mat_nr = 0;
@@ -884,7 +889,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh
}
else {
origindex[face_index] = ORIGINDEX_NONE;
dst_material_index[face_index] = mat_nr;
dst_material_index.span[face_index] = mat_nr;
sharp_faces.span[face_index] = use_flat_shading;
}
face_offests_new[face_index] = face_index * 4;
@@ -1026,6 +1031,8 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh
ltmd->merge_dist);
}
dst_material_index.finish();
return result;
}

View File

@@ -906,7 +906,7 @@ static Mesh *subdivide_base(const Mesh *orig)
CustomData_get_layer(&orig->vert_data, CD_MVERT_SKIN));
const blender::Span<blender::float3> orig_vert_positions = orig->vert_positions();
const blender::Span<blender::int2> orig_edges = orig->edges();
const MDeformVert *origdvert = BKE_mesh_deform_verts(orig);
const MDeformVert *origdvert = orig->deform_verts().data();
int orig_vert_num = orig->totvert;
int orig_edge_num = orig->totedge;
@@ -932,7 +932,7 @@ static Mesh *subdivide_base(const Mesh *orig)
CustomData_get_layer_for_write(&result->vert_data, CD_MVERT_SKIN, result->totvert));
MDeformVert *outdvert = nullptr;
if (origdvert) {
outdvert = BKE_mesh_deform_verts_for_write(result);
outdvert = result->deform_verts_for_write().data();
}
/* Copy original vertex data */
@@ -1913,7 +1913,6 @@ static Mesh *base_skin(Mesh *origmesh, SkinModifierData *smd, eSkinErrorFlag *r_
BMesh *bm;
EMat *emat;
SkinNode *skin_nodes;
const MDeformVert *dvert;
bool has_valid_root = false;
const MVertSkin *nodes = static_cast<const MVertSkin *>(
@@ -1921,7 +1920,7 @@ static Mesh *base_skin(Mesh *origmesh, SkinModifierData *smd, eSkinErrorFlag *r_
const blender::Span<blender::float3> vert_positions = origmesh->vert_positions();
const blender::Span<blender::int2> edges = origmesh->edges();
dvert = BKE_mesh_deform_verts(origmesh);
const MDeformVert *dvert = origmesh->deform_verts().data();
const int verts_num = origmesh->totvert;
blender::Array<int> vert_to_edge_offsets;

View File

@@ -19,6 +19,7 @@
#include "MEM_guardedalloc.h"
#include "BKE_attribute.hh"
#include "BKE_deform.h"
#include "BKE_mesh.hh"
#include "BKE_particle.h"
@@ -144,6 +145,7 @@ static void mesh_calc_hq_normal(Mesh *mesh,
/* NOLINTNEXTLINE: readability-function-size */
Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh *mesh)
{
using namespace blender;
Mesh *result;
const SolidifyModifierData *smd = (SolidifyModifierData *)md;
@@ -415,7 +417,9 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex
} \
(void)0
int *dst_material_index = BKE_mesh_material_indices_for_write(result);
bke::MutableAttributeAccessor dst_attributes = mesh->attributes_for_write();
bke::SpanAttributeWriter dst_material_index = dst_attributes.lookup_or_add_for_write_span<int>(
"material_index", ATTR_DOMAIN_FACE);
/* flip normals */
@@ -451,8 +455,8 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex
#endif
if (mat_ofs) {
dst_material_index[faces_num + i] += mat_ofs;
CLAMP(dst_material_index[faces_num + i], 0, mat_nr_max);
dst_material_index.span[faces_num + i] += mat_ofs;
CLAMP(dst_material_index.span[faces_num + i], 0, mat_nr_max);
}
e = corner_edges[corner_2 + 0];
@@ -982,7 +986,7 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex
/* Add vertex weights for rim and shell vgroups. */
if (shell_defgrp_index != -1 || rim_defgrp_index != -1) {
MDeformVert *dst_dvert = BKE_mesh_deform_verts_for_write(result);
MDeformVert *dst_dvert = result->deform_verts_for_write().data();
/* Ultimate security check. */
if (dst_dvert != nullptr) {
@@ -1121,8 +1125,8 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex
/* use the next material index if option enabled */
if (mat_ofs_rim) {
dst_material_index[new_face_index] += mat_ofs_rim;
CLAMP(dst_material_index[new_face_index], 0, mat_nr_max);
dst_material_index.span[new_face_index] += mat_ofs_rim;
CLAMP(dst_material_index.span[new_face_index], 0, mat_nr_max);
}
if (crease_outer) {
/* crease += crease_outer; without wrapping */
@@ -1152,6 +1156,8 @@ Mesh *MOD_solidify_extrude_modifyMesh(ModifierData *md, const ModifierEvalContex
MEM_freeN(old_vert_arr);
}
dst_material_index.finish();
return result;
}

View File

@@ -2014,7 +2014,7 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md,
/* Checks that result has dvert data. */
MDeformVert *dst_dvert = nullptr;
if (shell_defgrp_index != -1 || rim_defgrp_index != -1) {
dst_dvert = BKE_mesh_deform_verts_for_write(result);
dst_dvert = result->deform_verts_for_write().data();
}
/* Get vertex crease layer and ensure edge creases are active if vertex creases are found, since
@@ -2148,9 +2148,12 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md,
}
}
#endif
const int *src_material_index = BKE_mesh_material_indices(mesh);
int *dst_material_index = BKE_mesh_material_indices_for_write(result);
const bke::AttributeAccessor src_attributes = mesh->attributes();
const VArraySpan src_material_index = *src_attributes.lookup<int>("material_index",
ATTR_DOMAIN_FACE);
bke::MutableAttributeAccessor dst_attributes = result->attributes_for_write();
bke::SpanAttributeWriter dst_material_index = dst_attributes.lookup_or_add_for_write_span<int>(
"material_index", ATTR_DOMAIN_FACE);
/* Make boundary edges/faces. */
{
@@ -2293,20 +2296,24 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md,
for (EdgeGroup *g3 = g2; g3->valid && k < j; g3++) {
if ((do_rim && !g3->is_orig_closed) || (do_shell && g3->split)) {
/* Check both far ends in terms of faces of an edge group. */
if ((src_material_index ? src_material_index[g3->edges[0]->faces[0]->index] :
0) == l) {
if ((!src_material_index.is_empty() ?
src_material_index[g3->edges[0]->faces[0]->index] :
0) == l) {
face = g3->edges[0]->faces[0]->index;
count++;
}
NewEdgeRef *le = g3->edges[g3->edges_len - 1];
if (le->faces[1] &&
(src_material_index ? src_material_index[le->faces[1]->index] : 0) == l) {
(!src_material_index.is_empty() ? src_material_index[le->faces[1]->index] :
0) == l)
{
face = le->faces[1]->index;
count++;
}
else if (!le->faces[1] &&
(src_material_index ? src_material_index[le->faces[0]->index] : 0) ==
l) {
else if (!le->faces[1] && (!src_material_index.is_empty() ?
src_material_index[le->faces[0]->index] :
0) == l)
{
face = le->faces[0]->index;
count++;
}
@@ -2325,9 +2332,10 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md,
origindex_face[face_index] = ORIGINDEX_NONE;
}
face_offsets[face_index] = int(loop_index);
dst_material_index[face_index] = most_mat_nr +
(g->is_orig_closed || !do_rim ? 0 : mat_ofs_rim);
CLAMP(dst_material_index[face_index], 0, mat_nr_max);
dst_material_index.span[face_index] = most_mat_nr + (g->is_orig_closed || !do_rim ?
0 :
mat_ofs_rim);
CLAMP(dst_material_index.span[face_index], 0, mat_nr_max);
face_index++;
for (uint k = 0; g2->valid && k < j; g2++) {
@@ -2401,9 +2409,11 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md,
int(face_index),
1);
face_offsets[face_index] = int(loop_index);
dst_material_index[face_index] =
(src_material_index ? src_material_index[orig_face_index] : 0) + mat_ofs_rim;
CLAMP(dst_material_index[face_index], 0, mat_nr_max);
dst_material_index.span[face_index] = (!src_material_index.is_empty() ?
src_material_index[orig_face_index] :
0) +
mat_ofs_rim;
CLAMP(dst_material_index.span[face_index], 0, mat_nr_max);
face_index++;
int loop1 = -1;
@@ -2593,10 +2603,11 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md,
CustomData_copy_data(
&mesh->face_data, &result->face_data, int(i / 2), int(face_index), 1);
face_offsets[face_index] = int(loop_index);
dst_material_index[face_index] = (src_material_index ? src_material_index[fr->index] :
0) +
(fr->reversed != do_flip ? mat_ofs : 0);
CLAMP(dst_material_index[face_index], 0, mat_nr_max);
dst_material_index.span[face_index] = (!src_material_index.is_empty() ?
src_material_index[fr->index] :
0) +
(fr->reversed != do_flip ? mat_ofs : 0);
CLAMP(dst_material_index.span[face_index], 0, mat_nr_max);
if (fr->reversed != do_flip) {
for (int l = int(k) - 1; l >= 0; l--) {
if (shell_defgrp_index != -1) {
@@ -2686,6 +2697,8 @@ Mesh *MOD_solidify_nonmanifold_modifyMesh(ModifierData *md,
#undef MOD_SOLIDIFY_EMPTY_TAG
dst_material_index.finish();
return result;
}

View File

@@ -170,7 +170,7 @@ void MOD_get_vgroup(const Object *ob,
if (mesh) {
*defgrp_index = BKE_id_defgroup_name_index(&mesh->id, name);
if (*defgrp_index != -1) {
*dvert = BKE_mesh_deform_verts(mesh);
*dvert = mesh->deform_verts().data();
}
else {
*dvert = nullptr;

View File

@@ -193,7 +193,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh
}
}
MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh);
MDeformVert *dvert = mesh->deform_verts_for_write().data();
/* Ultimate security check. */
if (!dvert) {

View File

@@ -257,7 +257,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh
}
}
MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh);
MDeformVert *dvert = mesh->deform_verts_for_write().data();
/* Ultimate security check. */
if (!dvert) {

View File

@@ -477,7 +477,7 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh
return mesh;
}
MDeformVert *dvert = BKE_mesh_deform_verts_for_write(mesh);
MDeformVert *dvert = mesh->deform_verts_for_write().data();
/* Ultimate security check. */
if (!dvert) {
return mesh;

View File

@@ -720,6 +720,7 @@ void RE_bake_pixels_populate(Mesh *mesh,
const BakeTargets *targets,
const char *uv_layer)
{
using namespace blender;
const float(*mloopuv)[2];
if ((uv_layer == nullptr) || (uv_layer[0] == '\0')) {
mloopuv = static_cast<const float(*)[2]>(
@@ -756,8 +757,9 @@ void RE_bake_pixels_populate(Mesh *mesh,
mesh->vert_positions(), mesh->faces(), mesh->corner_verts(), {looptri, tottri});
const blender::Span<int> looptri_faces = mesh->looptri_faces();
const bke::AttributeAccessor attributes = mesh->attributes();
const VArraySpan material_indices = *attributes.lookup<int>("material_index", ATTR_DOMAIN_FACE);
const int *material_indices = BKE_mesh_material_indices(mesh);
const int materials_num = targets->materials_num;
for (int i = 0; i < tottri; i++) {
@@ -767,7 +769,7 @@ void RE_bake_pixels_populate(Mesh *mesh,
bd.primitive_id = i;
/* Find images matching this material. */
const int material_index = (material_indices && materials_num) ?
const int material_index = (!material_indices.is_empty() && materials_num) ?
clamp_i(material_indices[face_i], 0, materials_num - 1) :
0;
Image *image = targets->material_to_image[material_index];