Changeset View
Changeset View
Standalone View
Standalone View
source/blender/editors/sculpt_paint/sculpt_pose.c
| Show First 20 Lines • Show All 257 Lines • ▼ Show 20 Lines | SculptThreadedTaskData data = { | ||||
| .sd = sd, | .sd = sd, | ||||
| .ob = ob, | .ob = ob, | ||||
| .nodes = nodes, | .nodes = nodes, | ||||
| .totnode = totnode, | .totnode = totnode, | ||||
| .pose_factor = pose_factor, | .pose_factor = pose_factor, | ||||
| }; | }; | ||||
| data.pose_initial_co = pose_target; | data.pose_initial_co = pose_target; | ||||
| PBVHParallelSettings settings; | TaskParallelSettings settings; | ||||
| PoseGrowFactorTLSData gftd; | PoseGrowFactorTLSData gftd; | ||||
| gftd.pos_count = 0; | gftd.pos_count = 0; | ||||
| zero_v3(gftd.pos_avg); | zero_v3(gftd.pos_avg); | ||||
| BKE_pbvh_parallel_range_settings(&settings, (sd->flags & SCULPT_USE_OPENMP), totnode); | BKE_pbvh_parallel_range_settings(&settings, (sd->flags & SCULPT_USE_OPENMP), totnode); | ||||
| settings.func_reduce = pose_brush_grow_factor_reduce; | settings.func_reduce = pose_brush_grow_factor_reduce; | ||||
| settings.userdata_chunk = &gftd; | settings.userdata_chunk = &gftd; | ||||
| settings.userdata_chunk_size = sizeof(PoseGrowFactorTLSData); | settings.userdata_chunk_size = sizeof(PoseGrowFactorTLSData); | ||||
| bool grow_next_iteration = true; | bool grow_next_iteration = true; | ||||
| float prev_len = FLT_MAX; | float prev_len = FLT_MAX; | ||||
| data.prev_mask = MEM_mallocN(SCULPT_vertex_count_get(ss) * sizeof(float), "prev mask"); | data.prev_mask = MEM_mallocN(SCULPT_vertex_count_get(ss) * sizeof(float), "prev mask"); | ||||
| while (grow_next_iteration) { | while (grow_next_iteration) { | ||||
| zero_v3(gftd.pos_avg); | zero_v3(gftd.pos_avg); | ||||
| gftd.pos_count = 0; | gftd.pos_count = 0; | ||||
| memcpy(data.prev_mask, pose_factor, SCULPT_vertex_count_get(ss) * sizeof(float)); | memcpy(data.prev_mask, pose_factor, SCULPT_vertex_count_get(ss) * sizeof(float)); | ||||
| BKE_pbvh_parallel_range(0, totnode, &data, pose_brush_grow_factor_task_cb_ex, &settings); | BLI_task_parallel_range(0, totnode, &data, pose_brush_grow_factor_task_cb_ex, &settings); | ||||
| if (gftd.pos_count != 0) { | if (gftd.pos_count != 0) { | ||||
| mul_v3_fl(gftd.pos_avg, 1.0f / (float)gftd.pos_count); | mul_v3_fl(gftd.pos_avg, 1.0f / (float)gftd.pos_count); | ||||
| if (pose_origin) { | if (pose_origin) { | ||||
| /* Test with pose origin. Used when growing the factors to compensate the Origin Offset. */ | /* Test with pose origin. Used when growing the factors to compensate the Origin Offset. */ | ||||
| /* Stop when the factor's avg_pos starts moving away from the origin instead of getting | /* Stop when the factor's avg_pos starts moving away from the origin instead of getting | ||||
| * closer to it. */ | * closer to it. */ | ||||
| float len = len_v3v3(gftd.pos_avg, pose_origin); | float len = len_v3v3(gftd.pos_avg, pose_origin); | ||||
| ▲ Show 20 Lines • Show All 497 Lines • ▼ Show 20 Lines | void SCULPT_pose_brush_init(Sculpt *sd, Object *ob, SculptSession *ss, Brush *br) | ||||
| /* Init the IK chain that is going to be used to deform the vertices. */ | /* Init the IK chain that is going to be used to deform the vertices. */ | ||||
| ss->cache->pose_ik_chain = SCULPT_pose_ik_chain_init( | ss->cache->pose_ik_chain = SCULPT_pose_ik_chain_init( | ||||
| sd, ob, ss, br, ss->cache->true_location, ss->cache->radius); | sd, ob, ss, br, ss->cache->true_location, ss->cache->radius); | ||||
| /* Smooth the weights of each segment for cleaner deformation. */ | /* Smooth the weights of each segment for cleaner deformation. */ | ||||
| for (int ik = 0; ik < ss->cache->pose_ik_chain->tot_segments; ik++) { | for (int ik = 0; ik < ss->cache->pose_ik_chain->tot_segments; ik++) { | ||||
| data.pose_factor = ss->cache->pose_ik_chain->segments[ik].weights; | data.pose_factor = ss->cache->pose_ik_chain->segments[ik].weights; | ||||
| for (int i = 0; i < br->pose_smooth_iterations; i++) { | for (int i = 0; i < br->pose_smooth_iterations; i++) { | ||||
| PBVHParallelSettings settings; | TaskParallelSettings settings; | ||||
| BKE_pbvh_parallel_range_settings(&settings, (sd->flags & SCULPT_USE_OPENMP), totnode); | BKE_pbvh_parallel_range_settings(&settings, (sd->flags & SCULPT_USE_OPENMP), totnode); | ||||
| BKE_pbvh_parallel_range(0, totnode, &data, pose_brush_init_task_cb_ex, &settings); | BLI_task_parallel_range(0, totnode, &data, pose_brush_init_task_cb_ex, &settings); | ||||
| } | } | ||||
| } | } | ||||
| MEM_SAFE_FREE(nodes); | MEM_SAFE_FREE(nodes); | ||||
| } | } | ||||
| /* Main Brush Function. */ | /* Main Brush Function. */ | ||||
| void SCULPT_do_pose_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode) | void SCULPT_do_pose_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode) | ||||
| ▲ Show 20 Lines • Show All 73 Lines • ▼ Show 20 Lines | void SCULPT_do_pose_brush(Sculpt *sd, Object *ob, PBVHNode **nodes, int totnode) | ||||
| SculptThreadedTaskData data = { | SculptThreadedTaskData data = { | ||||
| .sd = sd, | .sd = sd, | ||||
| .ob = ob, | .ob = ob, | ||||
| .brush = brush, | .brush = brush, | ||||
| .nodes = nodes, | .nodes = nodes, | ||||
| .grab_delta = grab_delta, | .grab_delta = grab_delta, | ||||
| }; | }; | ||||
| PBVHParallelSettings settings; | TaskParallelSettings settings; | ||||
| BKE_pbvh_parallel_range_settings(&settings, (sd->flags & SCULPT_USE_OPENMP), totnode); | BKE_pbvh_parallel_range_settings(&settings, (sd->flags & SCULPT_USE_OPENMP), totnode); | ||||
| BKE_pbvh_parallel_range(0, totnode, &data, do_pose_brush_task_cb_ex, &settings); | BLI_task_parallel_range(0, totnode, &data, do_pose_brush_task_cb_ex, &settings); | ||||
| } | } | ||||
| void SCULPT_pose_ik_chain_free(SculptPoseIKChain *ik_chain) | void SCULPT_pose_ik_chain_free(SculptPoseIKChain *ik_chain) | ||||
| { | { | ||||
| for (int i = 0; i < ik_chain->tot_segments; i++) { | for (int i = 0; i < ik_chain->tot_segments; i++) { | ||||
| MEM_SAFE_FREE(ik_chain->segments[i].weights); | MEM_SAFE_FREE(ik_chain->segments[i].weights); | ||||
| } | } | ||||
| MEM_SAFE_FREE(ik_chain->segments); | MEM_SAFE_FREE(ik_chain->segments); | ||||
| MEM_SAFE_FREE(ik_chain); | MEM_SAFE_FREE(ik_chain); | ||||
| } | } | ||||