Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSergey Sharybin <sergey.vfx@gmail.com>2018-09-21 14:58:49 +0300
committerSergey Sharybin <sergey.vfx@gmail.com>2018-09-21 16:31:43 +0300
commitb32832a7e8f6a12eee658ff1eb1be7e18d2e6eef (patch)
tree305a9a0b8efa8b5480414d1533416bc948fb693b /source/blender/blenkernel/intern/subdiv_ccg.c
parentda800621ed2e65fdf5b6ad665a96b360a51e83fc (diff)
Subdiv: CCG, initialize grid mask from paint mask
Diffstat (limited to 'source/blender/blenkernel/intern/subdiv_ccg.c')
-rw-r--r--source/blender/blenkernel/intern/subdiv_ccg.c29
1 files changed, 25 insertions, 4 deletions
diff --git a/source/blender/blenkernel/intern/subdiv_ccg.c b/source/blender/blenkernel/intern/subdiv_ccg.c
index 29327a465b3..5ec675494f5 100644
--- a/source/blender/blenkernel/intern/subdiv_ccg.c
+++ b/source/blender/blenkernel/intern/subdiv_ccg.c
@@ -183,6 +183,7 @@ typedef struct CCGEvalGridsData {
SubdivCCG *subdiv_ccg;
Subdiv *subdiv;
int *face_ptex_offset;
+ SubdivCCGMask *mask_evaluator;
} CCGEvalGridsData;
static void subdiv_ccg_eval_grid_element(
@@ -207,6 +208,16 @@ static void subdiv_ccg_eval_grid_element(
BKE_subdiv_eval_limit_point(
subdiv, ptex_face_index, u, v, (float *)element);
}
+ if (subdiv_ccg->has_mask) {
+ float *mask_value_ptr = (float *)(element + subdiv_ccg->mask_offset);
+ if (data->mask_evaluator != NULL) {
+ *mask_value_ptr = data->mask_evaluator->eval_mask(
+ data->mask_evaluator, ptex_face_index, u, v);
+ }
+ else {
+ *mask_value_ptr = 0;
+ }
+ }
}
BLI_INLINE void rotate_corner_to_quad(
@@ -320,7 +331,8 @@ static void subdiv_ccg_eval_grids_task(
static bool subdiv_ccg_evaluate_grids(
SubdivCCG *subdiv_ccg,
- Subdiv *subdiv)
+ Subdiv *subdiv,
+ SubdivCCGMask *mask_evaluator)
{
OpenSubdiv_TopologyRefiner *topology_refiner = subdiv->topology_refiner;
const int num_faces = topology_refiner->getNumFaces(topology_refiner);
@@ -329,6 +341,7 @@ static bool subdiv_ccg_evaluate_grids(
data.subdiv_ccg = subdiv_ccg;
data.subdiv = subdiv;
data.face_ptex_offset = BKE_subdiv_face_ptex_offset_get(subdiv);
+ data.mask_evaluator = mask_evaluator;
/* Threaded grids evaluation. */
ParallelRangeSettings parallel_range_settings;
BLI_parallel_range_settings_defaults(&parallel_range_settings);
@@ -626,7 +639,8 @@ static void subdiv_ccg_init_faces_neighborhood(SubdivCCG *subdiv_ccg)
SubdivCCG *BKE_subdiv_to_ccg(
Subdiv *subdiv,
- const SubdivToCCGSettings *settings)
+ const SubdivToCCGSettings *settings,
+ SubdivCCGMask *mask_evaluator)
{
BKE_subdiv_stats_begin(&subdiv->stats, SUBDIV_STATS_SUBDIV_TO_CCG);
SubdivCCG *subdiv_ccg = MEM_callocN(sizeof(SubdivCCG), "subdiv ccg");
@@ -638,7 +652,7 @@ SubdivCCG *BKE_subdiv_to_ccg(
subdiv_ccg_alloc_elements(subdiv_ccg, subdiv);
subdiv_ccg_init_faces(subdiv_ccg);
subdiv_ccg_init_faces_neighborhood(subdiv_ccg);
- if (!subdiv_ccg_evaluate_grids(subdiv_ccg, subdiv)) {
+ if (!subdiv_ccg_evaluate_grids(subdiv_ccg, subdiv, mask_evaluator)) {
BKE_subdiv_ccg_destroy(subdiv_ccg);
BKE_subdiv_stats_end(&subdiv->stats, SUBDIV_STATS_SUBDIV_TO_CCG);
return NULL;
@@ -660,7 +674,14 @@ Mesh *BKE_subdiv_to_ccg_mesh(
}
}
BKE_subdiv_stats_end(&subdiv->stats, SUBDIV_STATS_SUBDIV_TO_CCG);
- SubdivCCG *subdiv_ccg = BKE_subdiv_to_ccg(subdiv, settings);
+ SubdivCCGMask mask_evaluator;
+ bool has_mask = BKE_subdiv_ccg_mask_init_from_paint(
+ &mask_evaluator, coarse_mesh);
+ SubdivCCG *subdiv_ccg = BKE_subdiv_to_ccg(
+ subdiv, settings, has_mask ? &mask_evaluator : NULL);
+ if (has_mask) {
+ mask_evaluator.free(&mask_evaluator);
+ }
if (subdiv_ccg == NULL) {
return NULL;
}