Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/dynamicpaint.c
| Show First 20 Lines • Show All 647 Lines • ▼ Show 20 Lines | |||||
| { | { | ||||
| PaintBakeData *bData = userdata; | PaintBakeData *bData = userdata; | ||||
| Bounds3D *grid_bound = tls->userdata_chunk; | Bounds3D *grid_bound = tls->userdata_chunk; | ||||
| boundInsert(grid_bound, bData->realCoord[bData->s_pos[i]].v); | boundInsert(grid_bound, bData->realCoord[bData->s_pos[i]].v); | ||||
| } | } | ||||
| static void grid_bound_insert_finalize(void *__restrict userdata, void *__restrict userdata_chunk) | static void grid_bound_insert_reduce(const void *__restrict UNUSED(userdata), | ||||
| void *__restrict chunk_join, | |||||
| void *__restrict chunk) | |||||
| { | { | ||||
| PaintBakeData *bData = userdata; | Bounds3D *join = chunk_join; | ||||
| VolumeGrid *grid = bData->grid; | Bounds3D *grid_bound = chunk; | ||||
| Bounds3D *grid_bound = userdata_chunk; | |||||
| boundInsert(&grid->grid_bounds, grid_bound->min); | boundInsert(join, grid_bound->min); | ||||
| boundInsert(&grid->grid_bounds, grid_bound->max); | boundInsert(join, grid_bound->max); | ||||
| } | } | ||||
| static void grid_cell_points_cb_ex(void *__restrict userdata, | static void grid_cell_points_cb_ex(void *__restrict userdata, | ||||
| const int i, | const int i, | ||||
| const TaskParallelTLS *__restrict tls) | const TaskParallelTLS *__restrict tls) | ||||
| { | { | ||||
| PaintBakeData *bData = userdata; | PaintBakeData *bData = userdata; | ||||
| VolumeGrid *grid = bData->grid; | VolumeGrid *grid = bData->grid; | ||||
| int *temp_t_index = grid->temp_t_index; | int *temp_t_index = grid->temp_t_index; | ||||
| int *s_num = tls->userdata_chunk; | int *s_num = tls->userdata_chunk; | ||||
| int co[3]; | int co[3]; | ||||
| for (int j = 3; j--;) { | for (int j = 3; j--;) { | ||||
| co[j] = (int)floorf((bData->realCoord[bData->s_pos[i]].v[j] - grid->grid_bounds.min[j]) / | co[j] = (int)floorf((bData->realCoord[bData->s_pos[i]].v[j] - grid->grid_bounds.min[j]) / | ||||
| bData->dim[j] * grid->dim[j]); | bData->dim[j] * grid->dim[j]); | ||||
| CLAMP(co[j], 0, grid->dim[j] - 1); | CLAMP(co[j], 0, grid->dim[j] - 1); | ||||
| } | } | ||||
| temp_t_index[i] = co[0] + co[1] * grid->dim[0] + co[2] * grid->dim[0] * grid->dim[1]; | temp_t_index[i] = co[0] + co[1] * grid->dim[0] + co[2] * grid->dim[0] * grid->dim[1]; | ||||
| s_num[temp_t_index[i]]++; | s_num[temp_t_index[i]]++; | ||||
| } | } | ||||
| static void grid_cell_points_finalize(void *__restrict userdata, void *__restrict userdata_chunk) | static void grid_cell_points_reduce(const void *__restrict userdata, | ||||
| void *__restrict chunk_join, | |||||
| void *__restrict chunk) | |||||
| { | { | ||||
| PaintBakeData *bData = userdata; | const PaintBakeData *bData = userdata; | ||||
| VolumeGrid *grid = bData->grid; | const VolumeGrid *grid = bData->grid; | ||||
| const int grid_cells = grid->dim[0] * grid->dim[1] * grid->dim[2]; | const int grid_cells = grid->dim[0] * grid->dim[1] * grid->dim[2]; | ||||
| int *s_num = userdata_chunk; | int *join_s_num = chunk_join; | ||||
| int *s_num = chunk; | |||||
| /* calculate grid indexes */ | /* calculate grid indexes */ | ||||
| for (int i = 0; i < grid_cells; i++) { | for (int i = 0; i < grid_cells; i++) { | ||||
| grid->s_num[i] += s_num[i]; | join_s_num[i] += s_num[i]; | ||||
| } | } | ||||
| } | } | ||||
| static void grid_cell_bounds_cb(void *__restrict userdata, | static void grid_cell_bounds_cb(void *__restrict userdata, | ||||
| const int x, | const int x, | ||||
| const TaskParallelTLS *__restrict UNUSED(tls)) | const TaskParallelTLS *__restrict UNUSED(tls)) | ||||
| { | { | ||||
| PaintBakeData *bData = userdata; | PaintBakeData *bData = userdata; | ||||
| ▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | grid = bData->grid; | ||||
| /* Important to init correctly our ref grid_bound... */ | /* Important to init correctly our ref grid_bound... */ | ||||
| boundInsert(&grid->grid_bounds, bData->realCoord[bData->s_pos[0]].v); | boundInsert(&grid->grid_bounds, bData->realCoord[bData->s_pos[0]].v); | ||||
| { | { | ||||
| TaskParallelSettings settings; | TaskParallelSettings settings; | ||||
| BLI_parallel_range_settings_defaults(&settings); | BLI_parallel_range_settings_defaults(&settings); | ||||
| settings.use_threading = (sData->total_points > 1000); | settings.use_threading = (sData->total_points > 1000); | ||||
| settings.userdata_chunk = &grid->grid_bounds; | settings.userdata_chunk = &grid->grid_bounds; | ||||
| settings.userdata_chunk_size = sizeof(grid->grid_bounds); | settings.userdata_chunk_size = sizeof(grid->grid_bounds); | ||||
| settings.func_finalize = grid_bound_insert_finalize; | settings.func_reduce = grid_bound_insert_reduce; | ||||
| BLI_task_parallel_range(0, sData->total_points, bData, grid_bound_insert_cb_ex, &settings); | BLI_task_parallel_range(0, sData->total_points, bData, grid_bound_insert_cb_ex, &settings); | ||||
| } | } | ||||
| /* get dimensions */ | /* get dimensions */ | ||||
| sub_v3_v3v3(dim, grid->grid_bounds.max, grid->grid_bounds.min); | sub_v3_v3v3(dim, grid->grid_bounds.max, grid->grid_bounds.min); | ||||
| copy_v3_v3(td, dim); | copy_v3_v3(td, dim); | ||||
| copy_v3_v3(bData->dim, dim); | copy_v3_v3(bData->dim, dim); | ||||
| min_dim = max_fff(td[0], td[1], td[2]) / 1000.f; | min_dim = max_fff(td[0], td[1], td[2]) / 1000.f; | ||||
| ▲ Show 20 Lines • Show All 44 Lines • ▼ Show 20 Lines | grid = bData->grid; | ||||
| if (!error) { | if (!error) { | ||||
| /* calculate number of points within each cell */ | /* calculate number of points within each cell */ | ||||
| { | { | ||||
| TaskParallelSettings settings; | TaskParallelSettings settings; | ||||
| BLI_parallel_range_settings_defaults(&settings); | BLI_parallel_range_settings_defaults(&settings); | ||||
| settings.use_threading = (sData->total_points > 1000); | settings.use_threading = (sData->total_points > 1000); | ||||
| settings.userdata_chunk = grid->s_num; | settings.userdata_chunk = grid->s_num; | ||||
| settings.userdata_chunk_size = sizeof(*grid->s_num) * grid_cells; | settings.userdata_chunk_size = sizeof(*grid->s_num) * grid_cells; | ||||
| settings.func_finalize = grid_cell_points_finalize; | settings.func_reduce = grid_cell_points_reduce; | ||||
| BLI_task_parallel_range(0, sData->total_points, bData, grid_cell_points_cb_ex, &settings); | BLI_task_parallel_range(0, sData->total_points, bData, grid_cell_points_cb_ex, &settings); | ||||
| } | } | ||||
| /* calculate grid indexes (not needed for first cell, which is zero). */ | /* calculate grid indexes (not needed for first cell, which is zero). */ | ||||
| for (i = 1; i < grid_cells; i++) { | for (i = 1; i < grid_cells; i++) { | ||||
| grid->s_pos[i] = grid->s_pos[i - 1] + grid->s_num[i - 1]; | grid->s_pos[i] = grid->s_pos[i - 1] + grid->s_num[i - 1]; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 4,049 Lines • ▼ Show 20 Lines | static void dynamicPaint_prepareAdjacencyData(DynamicPaintSurface *surface, const bool force_init) | ||||
| TaskParallelSettings settings; | TaskParallelSettings settings; | ||||
| BLI_parallel_range_settings_defaults(&settings); | BLI_parallel_range_settings_defaults(&settings); | ||||
| settings.use_threading = (sData->total_points > 1000); | settings.use_threading = (sData->total_points > 1000); | ||||
| BLI_task_parallel_range( | BLI_task_parallel_range( | ||||
| 0, sData->total_points, sData, dynamic_paint_prepare_adjacency_cb, &settings); | 0, sData->total_points, sData, dynamic_paint_prepare_adjacency_cb, &settings); | ||||
| /* calculate average values (single thread). | /* calculate average values (single thread). | ||||
| * Note: tried to put this in threaded callback (using _finalize feature), | * Note: tried to put this in threaded callback (using _reduce feature), | ||||
| * but gave ~30% slower result! */ | * but gave ~30% slower result! */ | ||||
| bData->average_dist = 0.0; | bData->average_dist = 0.0; | ||||
| for (index = 0; index < sData->total_points; index++) { | for (index = 0; index < sData->total_points; index++) { | ||||
| int numOfNeighs = adj_data->n_num[index]; | int numOfNeighs = adj_data->n_num[index]; | ||||
| for (int i = 0; i < numOfNeighs; i++) { | for (int i = 0; i < numOfNeighs; i++) { | ||||
| bData->average_dist += (double)bNeighs[adj_data->n_index[index] + i].dist; | bData->average_dist += (double)bNeighs[adj_data->n_index[index] + i].dist; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 1,521 Lines • Show Last 20 Lines | |||||