Changeset View
Changeset View
Standalone View
Standalone View
source/blender/blenkernel/intern/mesh_tangent.c
| Show First 20 Lines • Show All 446 Lines • ▼ Show 20 Lines | #endif | ||||
| float *pRes; | float *pRes; | ||||
| finally: | finally: | ||||
| pRes = pMesh->tangent[loop_index]; | pRes = pMesh->tangent[loop_index]; | ||||
| copy_v3_v3(pRes, fvTangent); | copy_v3_v3(pRes, fvTangent); | ||||
| pRes[3] = fSign; | pRes[3] = fSign; | ||||
| } | } | ||||
| static void DM_calc_loop_tangents_thread(TaskPool *__restrict UNUSED(pool), | static void DM_calc_loop_tangents_thread(TaskPool *__restrict UNUSED(pool), void *taskdata) | ||||
| void *taskdata, | |||||
| int UNUSED(threadid)) | |||||
| { | { | ||||
| struct SGLSLMeshToTangent *mesh2tangent = taskdata; | struct SGLSLMeshToTangent *mesh2tangent = taskdata; | ||||
| /* new computation method */ | /* new computation method */ | ||||
| { | { | ||||
| SMikkTSpaceContext sContext = {NULL}; | SMikkTSpaceContext sContext = {NULL}; | ||||
| SMikkTSpaceInterface sInterface = {NULL}; | SMikkTSpaceInterface sInterface = {NULL}; | ||||
| sContext.m_pUserData = mesh2tangent; | sContext.m_pUserData = mesh2tangent; | ||||
| ▲ Show 20 Lines • Show All 187 Lines • ▼ Show 20 Lines | #ifdef USE_LOOPTRI_DETECT_QUADS | ||||
| } | } | ||||
| else { | else { | ||||
| num_face_as_quad_map = (int)looptri_len; | num_face_as_quad_map = (int)looptri_len; | ||||
| } | } | ||||
| #endif | #endif | ||||
| /* Calculation */ | /* Calculation */ | ||||
| if (looptri_len != 0) { | if (looptri_len != 0) { | ||||
| TaskScheduler *scheduler = BLI_task_scheduler_get(); | TaskScheduler *scheduler = BLI_task_scheduler_legacy_get(); | ||||
| TaskPool *task_pool; | TaskPool *task_pool; | ||||
| task_pool = BLI_task_pool_create(scheduler, NULL, TASK_PRIORITY_LOW); | task_pool = BLI_task_pool_tbb_create(scheduler, NULL, TASK_PRIORITY_LOW); | ||||
| tangent_mask_curr = 0; | tangent_mask_curr = 0; | ||||
| /* Calculate tangent layers */ | /* Calculate tangent layers */ | ||||
| SGLSLMeshToTangent data_array[MAX_MTFACE]; | SGLSLMeshToTangent data_array[MAX_MTFACE]; | ||||
| const int tangent_layer_num = CustomData_number_of_layers(loopdata_out, CD_TANGENT); | const int tangent_layer_num = CustomData_number_of_layers(loopdata_out, CD_TANGENT); | ||||
| for (int n = 0; n < tangent_layer_num; n++) { | for (int n = 0; n < tangent_layer_num; n++) { | ||||
| int index = CustomData_get_layer_index_n(loopdata_out, CD_TANGENT, n); | int index = CustomData_get_layer_index_n(loopdata_out, CD_TANGENT, n); | ||||
| BLI_assert(n < MAX_MTFACE); | BLI_assert(n < MAX_MTFACE); | ||||
| Show All 30 Lines | #endif | ||||
| loopdata, CD_MLOOPUV, loopdata_out->layers[index].name); | loopdata, CD_MLOOPUV, loopdata_out->layers[index].name); | ||||
| int uv_start = CustomData_get_layer_index(loopdata, CD_MLOOPUV); | int uv_start = CustomData_get_layer_index(loopdata, CD_MLOOPUV); | ||||
| BLI_assert(uv_ind != -1 && uv_start != -1); | BLI_assert(uv_ind != -1 && uv_start != -1); | ||||
| BLI_assert(uv_ind - uv_start < MAX_MTFACE); | BLI_assert(uv_ind - uv_start < MAX_MTFACE); | ||||
| tangent_mask_curr |= (short)(1 << (uv_ind - uv_start)); | tangent_mask_curr |= (short)(1 << (uv_ind - uv_start)); | ||||
| } | } | ||||
| mesh2tangent->tangent = loopdata_out->layers[index].data; | mesh2tangent->tangent = loopdata_out->layers[index].data; | ||||
| BLI_task_pool_push(task_pool, DM_calc_loop_tangents_thread, mesh2tangent, false, NULL); | BLI_task_pool_tbb_push( | ||||
| task_pool, DM_calc_loop_tangents_thread, mesh2tangent, false, NULL); | |||||
| } | } | ||||
| BLI_assert(tangent_mask_curr == tangent_mask); | BLI_assert(tangent_mask_curr == tangent_mask); | ||||
| BLI_task_pool_work_and_wait(task_pool); | BLI_task_pool_tbb_work_and_wait(task_pool); | ||||
| BLI_task_pool_free(task_pool); | BLI_task_pool_tbb_free(task_pool); | ||||
| } | } | ||||
| else { | else { | ||||
| tangent_mask_curr = tangent_mask; | tangent_mask_curr = tangent_mask; | ||||
| } | } | ||||
| #ifdef USE_LOOPTRI_DETECT_QUADS | #ifdef USE_LOOPTRI_DETECT_QUADS | ||||
| if (face_as_quad_map) { | if (face_as_quad_map) { | ||||
| MEM_freeN(face_as_quad_map); | MEM_freeN(face_as_quad_map); | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 53 Lines • Show Last 20 Lines | |||||