Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/subdiv_ccg.c
| Show First 20 Lines • Show All 764 Lines • ▼ Show 20 Lines | static void subdiv_ccg_recalc_inner_normal_task(void *__restrict userdata_v, | ||||
| const TaskParallelTLS *__restrict tls_v) | const TaskParallelTLS *__restrict tls_v) | ||||
| { | { | ||||
| RecalcInnerNormalsData *data = userdata_v; | RecalcInnerNormalsData *data = userdata_v; | ||||
| RecalcInnerNormalsTLSData *tls = tls_v->userdata_chunk; | RecalcInnerNormalsTLSData *tls = tls_v->userdata_chunk; | ||||
| subdiv_ccg_recalc_inner_face_normals(data->subdiv_ccg, data->key, tls, grid_index); | subdiv_ccg_recalc_inner_face_normals(data->subdiv_ccg, data->key, tls, grid_index); | ||||
| subdiv_ccg_average_inner_face_normals(data->subdiv_ccg, data->key, tls, grid_index); | subdiv_ccg_average_inner_face_normals(data->subdiv_ccg, data->key, tls, grid_index); | ||||
| } | } | ||||
| static void subdiv_ccg_recalc_inner_normal_finalize(void *__restrict UNUSED(userdata), | static void subdiv_ccg_recalc_inner_normal_free(const void *__restrict UNUSED(userdata), | ||||
| void *__restrict tls_v) | void *__restrict tls_v) | ||||
| { | { | ||||
| RecalcInnerNormalsTLSData *tls = tls_v; | RecalcInnerNormalsTLSData *tls = tls_v; | ||||
| MEM_SAFE_FREE(tls->face_normals); | MEM_SAFE_FREE(tls->face_normals); | ||||
| } | } | ||||
| /* Recalculate normals which corresponds to non-boundaries elements of grids. */ | /* Recalculate normals which corresponds to non-boundaries elements of grids. */ | ||||
| static void subdiv_ccg_recalc_inner_grid_normals(SubdivCCG *subdiv_ccg) | static void subdiv_ccg_recalc_inner_grid_normals(SubdivCCG *subdiv_ccg) | ||||
| { | { | ||||
| CCGKey key; | CCGKey key; | ||||
| BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg); | BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg); | ||||
| RecalcInnerNormalsData data = { | RecalcInnerNormalsData data = { | ||||
| .subdiv_ccg = subdiv_ccg, | .subdiv_ccg = subdiv_ccg, | ||||
| .key = &key, | .key = &key, | ||||
| }; | }; | ||||
| RecalcInnerNormalsTLSData tls_data = {NULL}; | RecalcInnerNormalsTLSData tls_data = {NULL}; | ||||
| TaskParallelSettings parallel_range_settings; | TaskParallelSettings parallel_range_settings; | ||||
| BLI_parallel_range_settings_defaults(¶llel_range_settings); | BLI_parallel_range_settings_defaults(¶llel_range_settings); | ||||
| parallel_range_settings.userdata_chunk = &tls_data; | parallel_range_settings.userdata_chunk = &tls_data; | ||||
| parallel_range_settings.userdata_chunk_size = sizeof(tls_data); | parallel_range_settings.userdata_chunk_size = sizeof(tls_data); | ||||
| parallel_range_settings.func_finalize = subdiv_ccg_recalc_inner_normal_finalize; | parallel_range_settings.func_free = subdiv_ccg_recalc_inner_normal_free; | ||||
| BLI_task_parallel_range(0, | BLI_task_parallel_range(0, | ||||
| subdiv_ccg->num_grids, | subdiv_ccg->num_grids, | ||||
| &data, | &data, | ||||
| subdiv_ccg_recalc_inner_normal_task, | subdiv_ccg_recalc_inner_normal_task, | ||||
| ¶llel_range_settings); | ¶llel_range_settings); | ||||
| } | } | ||||
| void BKE_subdiv_ccg_recalc_normals(SubdivCCG *subdiv_ccg) | void BKE_subdiv_ccg_recalc_normals(SubdivCCG *subdiv_ccg) | ||||
| Show All 26 Lines | static void subdiv_ccg_recalc_modified_inner_normal_task(void *__restrict userdata_v, | ||||
| for (int i = 0; i < num_face_grids; i++) { | for (int i = 0; i < num_face_grids; i++) { | ||||
| const int grid_index = face->start_grid_index + i; | const int grid_index = face->start_grid_index + i; | ||||
| subdiv_ccg_recalc_inner_face_normals(data->subdiv_ccg, data->key, tls, grid_index); | subdiv_ccg_recalc_inner_face_normals(data->subdiv_ccg, data->key, tls, grid_index); | ||||
| subdiv_ccg_average_inner_face_normals(data->subdiv_ccg, data->key, tls, grid_index); | subdiv_ccg_average_inner_face_normals(data->subdiv_ccg, data->key, tls, grid_index); | ||||
| } | } | ||||
| subdiv_ccg_average_inner_face_grids(subdiv_ccg, key, face); | subdiv_ccg_average_inner_face_grids(subdiv_ccg, key, face); | ||||
| } | } | ||||
| static void subdiv_ccg_recalc_modified_inner_normal_finalize(void *__restrict UNUSED(userdata), | static void subdiv_ccg_recalc_modified_inner_normal_free(const void *__restrict UNUSED(userdata), | ||||
| void *__restrict tls_v) | void *__restrict tls_v) | ||||
| { | { | ||||
| RecalcInnerNormalsTLSData *tls = tls_v; | RecalcInnerNormalsTLSData *tls = tls_v; | ||||
| MEM_SAFE_FREE(tls->face_normals); | MEM_SAFE_FREE(tls->face_normals); | ||||
| } | } | ||||
| static void subdiv_ccg_recalc_modified_inner_grid_normals(SubdivCCG *subdiv_ccg, | static void subdiv_ccg_recalc_modified_inner_grid_normals(SubdivCCG *subdiv_ccg, | ||||
| struct CCGFace **effected_faces, | struct CCGFace **effected_faces, | ||||
| int num_effected_faces) | int num_effected_faces) | ||||
| { | { | ||||
| CCGKey key; | CCGKey key; | ||||
| BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg); | BKE_subdiv_ccg_key_top_level(&key, subdiv_ccg); | ||||
| RecalcModifiedInnerNormalsData data = { | RecalcModifiedInnerNormalsData data = { | ||||
| .subdiv_ccg = subdiv_ccg, | .subdiv_ccg = subdiv_ccg, | ||||
| .key = &key, | .key = &key, | ||||
| .effected_ccg_faces = (SubdivCCGFace **)effected_faces, | .effected_ccg_faces = (SubdivCCGFace **)effected_faces, | ||||
| }; | }; | ||||
| RecalcInnerNormalsTLSData tls_data = {NULL}; | RecalcInnerNormalsTLSData tls_data = {NULL}; | ||||
| TaskParallelSettings parallel_range_settings; | TaskParallelSettings parallel_range_settings; | ||||
| BLI_parallel_range_settings_defaults(¶llel_range_settings); | BLI_parallel_range_settings_defaults(¶llel_range_settings); | ||||
| parallel_range_settings.userdata_chunk = &tls_data; | parallel_range_settings.userdata_chunk = &tls_data; | ||||
| parallel_range_settings.userdata_chunk_size = sizeof(tls_data); | parallel_range_settings.userdata_chunk_size = sizeof(tls_data); | ||||
| parallel_range_settings.func_finalize = subdiv_ccg_recalc_modified_inner_normal_finalize; | parallel_range_settings.func_free = subdiv_ccg_recalc_modified_inner_normal_free; | ||||
| BLI_task_parallel_range(0, | BLI_task_parallel_range(0, | ||||
| num_effected_faces, | num_effected_faces, | ||||
| &data, | &data, | ||||
| subdiv_ccg_recalc_modified_inner_normal_task, | subdiv_ccg_recalc_modified_inner_normal_task, | ||||
| ¶llel_range_settings); | ¶llel_range_settings); | ||||
| } | } | ||||
| void BKE_subdiv_ccg_update_normals(SubdivCCG *subdiv_ccg, | void BKE_subdiv_ccg_update_normals(SubdivCCG *subdiv_ccg, | ||||
| ▲ Show 20 Lines • Show All 203 Lines • ▼ Show 20 Lines | static void subdiv_ccg_average_grids_boundaries_task(void *__restrict userdata_v, | ||||
| AverageGridsBoundariesData *data = userdata_v; | AverageGridsBoundariesData *data = userdata_v; | ||||
| AverageGridsBoundariesTLSData *tls = tls_v->userdata_chunk; | AverageGridsBoundariesTLSData *tls = tls_v->userdata_chunk; | ||||
| SubdivCCG *subdiv_ccg = data->subdiv_ccg; | SubdivCCG *subdiv_ccg = data->subdiv_ccg; | ||||
| CCGKey *key = data->key; | CCGKey *key = data->key; | ||||
| SubdivCCGAdjacentEdge *adjacent_edge = &subdiv_ccg->adjacent_edges[adjacent_edge_index]; | SubdivCCGAdjacentEdge *adjacent_edge = &subdiv_ccg->adjacent_edges[adjacent_edge_index]; | ||||
| subdiv_ccg_average_grids_boundary(subdiv_ccg, key, adjacent_edge, tls); | subdiv_ccg_average_grids_boundary(subdiv_ccg, key, adjacent_edge, tls); | ||||
| } | } | ||||
| static void subdiv_ccg_average_grids_boundaries_finalize(void *__restrict UNUSED(userdata), | static void subdiv_ccg_average_grids_boundaries_free(const void *__restrict UNUSED(userdata), | ||||
| void *__restrict tls_v) | void *__restrict tls_v) | ||||
| { | { | ||||
| AverageGridsBoundariesTLSData *tls = tls_v; | AverageGridsBoundariesTLSData *tls = tls_v; | ||||
| MEM_SAFE_FREE(tls->accumulators); | MEM_SAFE_FREE(tls->accumulators); | ||||
| } | } | ||||
| typedef struct AverageGridsCornerData { | typedef struct AverageGridsCornerData { | ||||
| SubdivCCG *subdiv_ccg; | SubdivCCG *subdiv_ccg; | ||||
| CCGKey *key; | CCGKey *key; | ||||
| ▲ Show 20 Lines • Show All 41 Lines • ▼ Show 20 Lines | static void subdiv_ccg_average_all_boundaries(SubdivCCG *subdiv_ccg, CCGKey *key) | ||||
| BLI_parallel_range_settings_defaults(¶llel_range_settings); | BLI_parallel_range_settings_defaults(¶llel_range_settings); | ||||
| AverageGridsBoundariesData boundaries_data = { | AverageGridsBoundariesData boundaries_data = { | ||||
| .subdiv_ccg = subdiv_ccg, | .subdiv_ccg = subdiv_ccg, | ||||
| .key = key, | .key = key, | ||||
| }; | }; | ||||
| AverageGridsBoundariesTLSData tls_data = {NULL}; | AverageGridsBoundariesTLSData tls_data = {NULL}; | ||||
| parallel_range_settings.userdata_chunk = &tls_data; | parallel_range_settings.userdata_chunk = &tls_data; | ||||
| parallel_range_settings.userdata_chunk_size = sizeof(tls_data); | parallel_range_settings.userdata_chunk_size = sizeof(tls_data); | ||||
| parallel_range_settings.func_finalize = subdiv_ccg_average_grids_boundaries_finalize; | parallel_range_settings.func_free = subdiv_ccg_average_grids_boundaries_free; | ||||
| BLI_task_parallel_range(0, | BLI_task_parallel_range(0, | ||||
| subdiv_ccg->num_adjacent_edges, | subdiv_ccg->num_adjacent_edges, | ||||
| &boundaries_data, | &boundaries_data, | ||||
| subdiv_ccg_average_grids_boundaries_task, | subdiv_ccg_average_grids_boundaries_task, | ||||
| ¶llel_range_settings); | ¶llel_range_settings); | ||||
| } | } | ||||
| static void subdiv_ccg_average_all_corners(SubdivCCG *subdiv_ccg, CCGKey *key) | static void subdiv_ccg_average_all_corners(SubdivCCG *subdiv_ccg, CCGKey *key) | ||||
| ▲ Show 20 Lines • Show All 646 Lines • Show Last 20 Lines | |||||