44 const int ptex_face_index,
52 const PolyCornerIndex *poly_corner = &data->ptex_face_corner[ptex_face_index];
54 const int start_grid_index = face.
start() + poly_corner->
corner;
56 if (face.size() == 4) {
57 float corner_u, corner_v;
59 *r_mask_grid = &data->grid_paint_mask[start_grid_index + corner];
63 *r_mask_grid = &data->grid_paint_mask[start_grid_index];
73 if (mask_grid->
data ==
nullptr) {
77 const int x = roundf(grid_u * (grid_size - 1));
78 const int y = roundf(grid_v * (grid_size - 1));
79 return mask_grid->
data[y * grid_size +
x];
83 const int ptex_face_index,
105 int num_ptex_faces = 0;
107 for (
const int face_index : faces.index_range()) {
108 num_ptex_faces += (faces[face_index].size() == 4) ? 1 : faces[face_index].size();
110 return num_ptex_faces;
122 int ptex_face_index = 0;
124 for (
const int face_index : faces.index_range()) {
126 if (face.size() == 4) {
127 ptex_face_corner[ptex_face_index].
face_index = face_index;
128 ptex_face_corner[ptex_face_index].
corner = 0;
132 for (
int corner = 0; corner < face.size(); corner++) {
133 ptex_face_corner[ptex_face_index].
face_index = face_index;
134 ptex_face_corner[ptex_face_index].
corner = corner;
144 data->
faces = mesh->faces();
162 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.
ATTR_WARN_UNUSED_RESULT const BMVert * v
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)