42 const int ptex_face_index,
52 const int start_grid_index = face.
start() + poly_corner->
corner;
54 if (face.
size() == 4) {
55 float corner_u, corner_v;
57 *r_mask_grid = &
data->grid_paint_mask[start_grid_index + corner];
61 *r_mask_grid = &
data->grid_paint_mask[start_grid_index];
71 if (mask_grid->
data ==
nullptr) {
75 const int x =
roundf(grid_u * (grid_size - 1));
76 const int y =
roundf(grid_v * (grid_size - 1));
77 return mask_grid->
data[
y * grid_size +
x];
81 const int ptex_face_index,
103 int num_ptex_faces = 0;
105 for (
const int face_index :
faces.index_range()) {
106 num_ptex_faces += (
faces[face_index].size() == 4) ? 1 :
faces[face_index].size();
108 return num_ptex_faces;
119 int ptex_face_index = 0;
121 for (
const int face_index :
faces.index_range()) {
123 if (face.
size() == 4) {
124 ptex_face_corner[ptex_face_index].
face_index = face_index;
125 ptex_face_corner[ptex_face_index].
corner = 0;
129 for (
int corner = 0; corner < face.
size(); corner++) {
130 ptex_face_corner[ptex_face_index].
face_index = face_index;
131 ptex_face_corner[ptex_face_index].
corner = corner;
159 mask_evaluator->
user_data = MEM_new<GridPaintMaskData>(
"mask from grid data");
CustomData interface, see also DNA_customdata_types.h.
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
Read Guarded memory(de)allocation.
BMesh const char void * data
ATTR_WARN_UNUSED_RESULT const BMVert * v
constexpr int64_t size() const
constexpr int64_t start() const
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
void MEM_freeN(void *vmemh)
BLI_INLINE void ptex_face_uv_to_grid_uv(float ptex_u, float ptex_v, float *r_grid_u, float *r_grid_v)
BLI_INLINE int grid_size_from_level(int level)
BLI_INLINE int rotate_quad_to_corner(float quad_u, float quad_v, float *r_corner_u, float *r_corner_v)
PolyCornerIndex * ptex_face_corner
blender::OffsetIndices< int > faces
const GridPaintMask * grid_paint_mask
float(* eval_mask)(SubdivCCGMaskEvaluator *mask_evaluator, int ptex_face_index, float u, float v)
void(* free)(SubdivCCGMaskEvaluator *mask_evaluator)
bool BKE_subdiv_ccg_mask_init_from_paint(SubdivCCGMaskEvaluator *mask_evaluator, const Mesh *mesh)
static float eval_mask(SubdivCCGMaskEvaluator *mask_evaluator, const int ptex_face_index, const float u, const float v)
static void mask_init_data(SubdivCCGMaskEvaluator *mask_evaluator, const Mesh *mesh)
static int mask_get_grid_and_coord(SubdivCCGMaskEvaluator *mask_evaluator, const int ptex_face_index, const float u, const float v, const GridPaintMask **r_mask_grid, float *grid_u, float *grid_v)
static void mask_data_init_mapping(SubdivCCGMaskEvaluator *mask_evaluator, const Mesh *mesh)
static void mask_init_functions(SubdivCCGMaskEvaluator *mask_evaluator)
static int count_num_ptex_faces(const Mesh *mesh)
BLI_INLINE float read_mask_grid(const GridPaintMask *mask_grid, const float grid_u, const float grid_v)
static void free_mask_data(SubdivCCGMaskEvaluator *mask_evaluator)