Cleanup: Use attribute API to access UV maps in a few places

This commit is contained in:
Hans Goudey
2025-07-01 11:39:18 -04:00
committed by Hans Goudey
parent e54fc0a78d
commit 22e6aa619b
3 changed files with 42 additions and 34 deletions

View File

@@ -1494,9 +1494,9 @@ struct DynamicPaintSetInitColorData {
const DynamicPaintSurface *surface;
blender::Span<int> corner_verts;
const float (*mloopuv)[2];
blender::Span<blender::float2> mloopuv;
blender::Span<int3> corner_tris;
const MLoopCol *mloopcol;
blender::Span<blender::ColorGeometry4b> mloopcol;
ImagePool *pool;
};
@@ -1511,7 +1511,7 @@ static void dynamic_paint_set_init_color_tex_to_vcol_cb(void *__restrict userdat
const blender::Span<int> corner_verts = data->corner_verts;
const blender::Span<int3> corner_tris = data->corner_tris;
const float(*mloopuv)[2] = data->mloopuv;
const blender::Span<blender::float2> mloopuv = data->mloopuv;
ImagePool *pool = data->pool;
Tex *tex = data->surface->init_texture;
@@ -1544,7 +1544,7 @@ static void dynamic_paint_set_init_color_tex_to_imseq_cb(void *__restrict userda
PaintPoint *pPoint = (PaintPoint *)sData->type_data;
const blender::Span<int3> corner_tris = data->corner_tris;
const float(*mloopuv)[2] = data->mloopuv;
const blender::Span<blender::float2> mloopuv = data->mloopuv;
Tex *tex = data->surface->init_texture;
ImgSeqFormatData *f_data = (ImgSeqFormatData *)sData->format_data;
const int samples = (data->surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
@@ -1581,7 +1581,7 @@ static void dynamic_paint_set_init_color_vcol_to_imseq_cb(
PaintPoint *pPoint = (PaintPoint *)sData->type_data;
const blender::Span<int3> corner_tris = data->corner_tris;
const MLoopCol *mloopcol = data->mloopcol;
const blender::Span<blender::ColorGeometry4b> mloopcol = data->mloopcol;
ImgSeqFormatData *f_data = (ImgSeqFormatData *)sData->format_data;
const int samples = (data->surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
@@ -1602,9 +1602,11 @@ static void dynamic_paint_set_init_color_vcol_to_imseq_cb(
static void dynamicPaint_setInitialColor(const Scene * /*scene*/, DynamicPaintSurface *surface)
{
using namespace blender;
PaintSurfaceData *sData = surface->data;
PaintPoint *pPoint = (PaintPoint *)sData->type_data;
Mesh *mesh = dynamicPaint_canvas_mesh_get(surface->canvas);
const bke::AttributeAccessor attributes = mesh->attributes();
if (surface->type != MOD_DPAINT_SURFACE_T_PAINT) {
return;
@@ -1637,10 +1639,9 @@ static void dynamicPaint_setInitialColor(const Scene * /*scene*/, DynamicPaintSu
/* get uv map */
CustomData_validate_layer_name(
&mesh->corner_data, CD_PROP_FLOAT2, surface->init_layername, uvname);
const float(*mloopuv)[2] = static_cast<const float(*)[2]>(
CustomData_get_layer_named(&mesh->corner_data, CD_PROP_FLOAT2, uvname));
const VArraySpan mloopuv = *attributes.lookup<float2>(uvname, bke::AttrDomain::Corner);
if (!mloopuv) {
if (mloopuv.is_empty()) {
return;
}
@@ -1682,9 +1683,9 @@ static void dynamicPaint_setInitialColor(const Scene * /*scene*/, DynamicPaintSu
/* For vertex surface, just copy colors from #MLoopCol. */
if (surface->format == MOD_DPAINT_SURFACE_F_VERTEX) {
const blender::Span<int> corner_verts = mesh->corner_verts();
const MLoopCol *col = static_cast<const MLoopCol *>(CustomData_get_layer_named(
&mesh->corner_data, CD_PROP_BYTE_COLOR, surface->init_layername));
if (!col) {
const VArraySpan col = *attributes.lookup<ColorGeometry4b>(surface->init_layername,
bke::AttrDomain::Corner);
if (col.is_empty()) {
return;
}
@@ -1694,9 +1695,9 @@ static void dynamicPaint_setInitialColor(const Scene * /*scene*/, DynamicPaintSu
}
else if (surface->format == MOD_DPAINT_SURFACE_F_IMAGESEQ) {
const blender::Span<int3> corner_tris = mesh->corner_tris();
const MLoopCol *col = static_cast<const MLoopCol *>(CustomData_get_layer_named(
&mesh->corner_data, CD_PROP_BYTE_COLOR, surface->init_layername));
if (!col) {
const VArraySpan col = *attributes.lookup<ColorGeometry4b>(surface->init_layername,
bke::AttrDomain::Corner);
if (col.is_empty()) {
return;
}
@@ -2204,7 +2205,7 @@ struct DynamicPaintCreateUVSurfaceData {
Vec3f *tempWeights;
blender::Span<int3> corner_tris;
const float (*mloopuv)[2];
blender::Span<blender::float2> mloopuv;
blender::Span<int> corner_verts;
const Bounds2D *faceBB;
@@ -2223,7 +2224,7 @@ static void dynamic_paint_create_uv_surface_direct_cb(void *__restrict userdata,
Vec3f *tempWeights = data->tempWeights;
const blender::Span<int3> corner_tris = data->corner_tris;
const float(*mloopuv)[2] = data->mloopuv;
const blender::Span<blender::float2> mloopuv = data->mloopuv;
const blender::Span<int> corner_verts = data->corner_verts;
const Bounds2D *faceBB = data->faceBB;
@@ -2320,7 +2321,7 @@ static void dynamic_paint_create_uv_surface_neighbor_cb(void *__restrict userdat
Vec3f *tempWeights = data->tempWeights;
const blender::Span<int3> corner_tris = data->corner_tris;
const float(*mloopuv)[2] = data->mloopuv;
const blender::Span<blender::float2> mloopuv = data->mloopuv;
const blender::Span<int> corner_verts = data->corner_verts;
uint32_t *active_points = data->active_points;
@@ -2407,7 +2408,7 @@ static void dynamic_paint_create_uv_surface_neighbor_cb(void *__restrict userdat
#undef JITTER_SAMPLES
static float dist_squared_to_corner_tris_uv_edges(const blender::Span<int3> corner_tris,
const float (*mloopuv)[2],
const blender::Span<blender::float2> mloopuv,
int tri_index,
const float point[2])
{
@@ -2529,7 +2530,7 @@ static void dynamic_paint_find_island_border(const DynamicPaintCreateUVSurfaceDa
{
const blender::Span<int> corner_verts = data->corner_verts;
const blender::Span<int3> corner_tris = data->corner_tris;
const float(*mloopuv)[2] = data->mloopuv;
const blender::Span<blender::float2> mloopuv = data->mloopuv;
const int3 loop_idx = corner_tris[tri_index];
@@ -2812,6 +2813,7 @@ int dynamicPaint_createUVSurface(Scene *scene,
float *progress,
bool *do_update)
{
using namespace blender;
/* Anti-alias jitter point relative coords. */
const int aa_samples = (surface->flags & MOD_DPAINT_ANTIALIAS) ? 5 : 1;
char uvname[MAX_CUSTOMDATA_LAYER_NAME];
@@ -2824,7 +2826,7 @@ int dynamicPaint_createUVSurface(Scene *scene,
PaintUVPoint *tempPoints = nullptr;
Vec3f *tempWeights = nullptr;
const float(*mloopuv)[2] = nullptr;
VArraySpan<float2> mloopuv;
Bounds2D *faceBB = nullptr;
int *final_index;
@@ -2846,12 +2848,12 @@ int dynamicPaint_createUVSurface(Scene *scene,
if (CustomData_has_layer(&mesh->corner_data, CD_PROP_FLOAT2)) {
CustomData_validate_layer_name(
&mesh->corner_data, CD_PROP_FLOAT2, surface->uvlayer_name, uvname);
mloopuv = static_cast<const float(*)[2]>(
CustomData_get_layer_named(&mesh->corner_data, CD_PROP_FLOAT2, uvname));
const bke::AttributeAccessor attributes = mesh->attributes();
mloopuv = *attributes.lookup<float2>(uvname, bke::AttrDomain::Corner);
}
/* Check for validity */
if (!mloopuv) {
if (mloopuv.is_empty()) {
return setError(canvas, N_("No UV data on canvas"));
}
if (surface->image_resolution < 16 || surface->image_resolution > 8192) {

View File

@@ -1794,7 +1794,7 @@ static void sample_mesh(FluidFlowSettings *ffs,
const blender::Span<blender::float3> vert_normals,
const int *corner_verts,
const blender::int3 *corner_tris,
const float (*mloopuv)[2],
blender::Span<blender::float2> mloopuv,
float *influence_map,
float *velocity_map,
int index,
@@ -1915,7 +1915,7 @@ static void sample_mesh(FluidFlowSettings *ffs,
tex_co[2] = ((z - flow_center[2]) / base_res[2] - ffs->texture_offset) /
ffs->texture_size;
}
else if (mloopuv) {
else if (!mloopuv.is_empty()) {
const float *uv[3];
uv[0] = mloopuv[corner_tris[tri_i][0]];
uv[1] = mloopuv[corner_tris[tri_i][1]];
@@ -1992,7 +1992,7 @@ struct EmitFromDMData {
blender::Span<blender::float3> vert_normals;
blender::Span<int> corner_verts;
blender::Span<blender::int3> corner_tris;
const float (*mloopuv)[2];
blender::Span<blender::float2> mloopuv;
const MDeformVert *dvert;
int defgrp_index;
@@ -2077,8 +2077,9 @@ static void emit_from_mesh(
const blender::Span<blender::int3> corner_tris = mesh->corner_tris();
const int numverts = mesh->verts_num;
const MDeformVert *dvert = mesh->deform_verts().data();
const float(*mloopuv)[2] = static_cast<const float(*)[2]>(
CustomData_get_layer_named(&mesh->corner_data, CD_PROP_FLOAT2, ffs->uvlayer_name));
const blender::bke::AttributeAccessor attributes = mesh->attributes();
const blender::VArraySpan uv_map = *attributes.lookup<blender::float2>(
ffs->uvlayer_name, blender::bke::AttrDomain::Corner);
if (ffs->flags & FLUID_FLOW_INITVELOCITY) {
vert_vel = MEM_calloc_arrayN<float>(3 * size_t(numverts), "manta_flow_velocity");
@@ -2145,7 +2146,7 @@ static void emit_from_mesh(
data.vert_normals = mesh->vert_normals();
data.corner_verts = corner_verts;
data.corner_tris = corner_tris;
data.mloopuv = mloopuv;
data.mloopuv = uv_map;
data.dvert = dvert;
data.defgrp_index = defgrp_index;
data.tree = &tree_data;

View File

@@ -23,6 +23,7 @@
#include "DNA_screen_types.h"
#include "BKE_action.hh" /* BKE_pose_channel_find_name */
#include "BKE_attribute.hh"
#include "BKE_customdata.hh"
#include "BKE_deform.hh"
#include "BKE_lib_query.hh"
@@ -82,7 +83,7 @@ static void matrix_from_obj_pchan(float mat[4][4], Object *ob, const char *bonen
struct UVWarpData {
blender::OffsetIndices<int> faces;
blender::Span<int> corner_verts;
float (*mloopuv)[2];
blender::MutableSpan<blender::float2> mloopuv;
const MDeformVert *dvert;
int defgrp_index;
@@ -99,7 +100,7 @@ static void uv_warp_compute(void *__restrict userdata,
const blender::IndexRange face = data->faces[i];
const blender::Span<int> face_verts = data->corner_verts.slice(face);
float(*mluv)[2] = &data->mloopuv[face.start()];
blender::float2 *mluv = &data->mloopuv[face.start()];
const MDeformVert *dvert = data->dvert;
const int defgrp_index = data->defgrp_index;
@@ -195,14 +196,16 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh
const blender::OffsetIndices faces = mesh->faces();
const blender::Span<int> corner_verts = mesh->corner_verts();
float(*mloopuv)[2] = static_cast<float(*)[2]>(CustomData_get_layer_named_for_write(
&mesh->corner_data, CD_PROP_FLOAT2, uvname, corner_verts.size()));
blender::bke::MutableAttributeAccessor attributes = mesh->attributes_for_write();
blender::bke::SpanAttributeWriter mloopuv =
attributes.lookup_or_add_for_write_span<blender::float2>(uvname,
blender::bke::AttrDomain::Corner);
MOD_get_vgroup(ctx->object, mesh, umd->vgroup_name, &dvert, &defgrp_index);
UVWarpData data{};
data.faces = faces;
data.corner_verts = corner_verts;
data.mloopuv = mloopuv;
data.mloopuv = mloopuv.span;
data.dvert = dvert;
data.defgrp_index = defgrp_index;
data.warp_mat = warp_mat;
@@ -215,6 +218,8 @@ static Mesh *modify_mesh(ModifierData *md, const ModifierEvalContext *ctx, Mesh
mesh->runtime->is_original_bmesh = false;
mloopuv.finish();
return mesh;
}