Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_cache_extract_mesh.c
| Show First 20 Lines • Show All 2,004 Lines • ▼ Show 20 Lines | else { | ||||
| for (int v = 0; v < mr->vert_len; v++, mvert++) { | for (int v = 0; v < mr->vert_len; v++, mvert++) { | ||||
| copy_v3_v3(orco[v], mvert->co); | copy_v3_v3(orco[v], mvert->co); | ||||
| } | } | ||||
| } | } | ||||
| BKE_mesh_orco_verts_transform(mr->me, orco, mr->vert_len, 0); | BKE_mesh_orco_verts_transform(mr->me, orco, mr->vert_len, 0); | ||||
| } | } | ||||
| /* Start Fresh */ | /* Start Fresh */ | ||||
| CustomData_free_layers(cd_ldata, CD_TANGENT, mr->loop_len); | CustomData loop_data; | ||||
| CustomData_reset(&loop_data); | |||||
| CustomData *ldata = cd_ldata; | |||||
| if (tan_len != 0 || use_orco_tan) { | if (tan_len != 0 || use_orco_tan) { | ||||
| short tangent_mask = 0; | short tangent_mask = 0; | ||||
| bool calc_active_tangent = false; | bool calc_active_tangent = false; | ||||
| if (mr->extract_type == MR_EXTRACT_BMESH) { | if (mr->extract_type == MR_EXTRACT_BMESH) { | ||||
| BKE_editmesh_loop_tangent_calc(mr->edit_bmesh, | BKE_editmesh_loop_tangent_calc(mr->edit_bmesh, | ||||
| calc_active_tangent, | calc_active_tangent, | ||||
| tangent_names, | tangent_names, | ||||
| tan_len, | tan_len, | ||||
| Show All 13 Lines | else { | ||||
| mr->tri_len, | mr->tri_len, | ||||
| cd_ldata, | cd_ldata, | ||||
| calc_active_tangent, | calc_active_tangent, | ||||
| tangent_names, | tangent_names, | ||||
| tan_len, | tan_len, | ||||
| mr->poly_normals, | mr->poly_normals, | ||||
| mr->loop_normals, | mr->loop_normals, | ||||
| orco, | orco, | ||||
| cd_ldata, | &loop_data, | ||||
| mr->loop_len, | mr->loop_len, | ||||
| &tangent_mask); | &tangent_mask); | ||||
| ldata = &loop_data; | |||||
| } | } | ||||
| } | } | ||||
| if (use_orco_tan) { | if (use_orco_tan) { | ||||
| char attr_name[32], attr_safe_name[GPU_MAX_SAFE_ATTR_NAME]; | char attr_name[32], attr_safe_name[GPU_MAX_SAFE_ATTR_NAME]; | ||||
| const char *layer_name = CustomData_get_layer_name(cd_ldata, CD_TANGENT, 0); | const char *layer_name = CustomData_get_layer_name(cd_ldata, CD_TANGENT, 0); | ||||
| GPU_vertformat_safe_attr_name(layer_name, attr_safe_name, GPU_MAX_SAFE_ATTR_NAME); | GPU_vertformat_safe_attr_name(layer_name, attr_safe_name, GPU_MAX_SAFE_ATTR_NAME); | ||||
| BLI_snprintf(attr_name, sizeof(*attr_name), "t%s", attr_safe_name); | BLI_snprintf(attr_name, sizeof(*attr_name), "t%s", attr_safe_name); | ||||
| Show All 15 Lines | static void extract_tan_ex(const MeshRenderData *mr, GPUVertBuf *vbo, const bool do_hq) | ||||
| GPU_vertbuf_init_with_format(vbo, &format); | GPU_vertbuf_init_with_format(vbo, &format); | ||||
| GPU_vertbuf_data_alloc(vbo, v_len); | GPU_vertbuf_data_alloc(vbo, v_len); | ||||
| if (do_hq) { | if (do_hq) { | ||||
| short(*tan_data)[4] = (short(*)[4])vbo->data; | short(*tan_data)[4] = (short(*)[4])vbo->data; | ||||
| for (int i = 0; i < tan_len; i++) { | for (int i = 0; i < tan_len; i++) { | ||||
| const char *name = tangent_names[i]; | const char *name = tangent_names[i]; | ||||
| float(*layer_data)[4] = (float(*)[4])CustomData_get_layer_named(cd_ldata, CD_TANGENT, name); | float(*layer_data)[4] = (float(*)[4])CustomData_get_layer_named(ldata, CD_TANGENT, name); | ||||
| for (int l = 0; l < mr->loop_len; l++) { | for (int l = 0; l < mr->loop_len; l++) { | ||||
| normal_float_to_short_v3(*tan_data, layer_data[l]); | normal_float_to_short_v3(*tan_data, layer_data[l]); | ||||
| (*tan_data)[3] = (layer_data[l][3] > 0.0f) ? SHRT_MAX : SHRT_MIN; | (*tan_data)[3] = (layer_data[l][3] > 0.0f) ? SHRT_MAX : SHRT_MIN; | ||||
| tan_data++; | tan_data++; | ||||
| } | } | ||||
| } | } | ||||
| if (use_orco_tan) { | if (use_orco_tan) { | ||||
| float(*layer_data)[4] = (float(*)[4])CustomData_get_layer_n(cd_ldata, CD_TANGENT, 0); | float(*layer_data)[4] = (float(*)[4])CustomData_get_layer_n(ldata, CD_TANGENT, 0); | ||||
| for (int l = 0; l < mr->loop_len; l++) { | for (int l = 0; l < mr->loop_len; l++) { | ||||
| normal_float_to_short_v3(*tan_data, layer_data[l]); | normal_float_to_short_v3(*tan_data, layer_data[l]); | ||||
| (*tan_data)[3] = (layer_data[l][3] > 0.0f) ? SHRT_MAX : SHRT_MIN; | (*tan_data)[3] = (layer_data[l][3] > 0.0f) ? SHRT_MAX : SHRT_MIN; | ||||
| tan_data++; | tan_data++; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| GPUPackedNormal *tan_data = (GPUPackedNormal *)vbo->data; | GPUPackedNormal *tan_data = (GPUPackedNormal *)vbo->data; | ||||
| for (int i = 0; i < tan_len; i++) { | for (int i = 0; i < tan_len; i++) { | ||||
| const char *name = tangent_names[i]; | const char *name = tangent_names[i]; | ||||
| float(*layer_data)[4] = (float(*)[4])CustomData_get_layer_named(cd_ldata, CD_TANGENT, name); | float(*layer_data)[4] = (float(*)[4])CustomData_get_layer_named(ldata, CD_TANGENT, name); | ||||
| for (int l = 0; l < mr->loop_len; l++) { | for (int l = 0; l < mr->loop_len; l++) { | ||||
| *tan_data = GPU_normal_convert_i10_v3(layer_data[l]); | *tan_data = GPU_normal_convert_i10_v3(layer_data[l]); | ||||
| tan_data->w = (layer_data[l][3] > 0.0f) ? 1 : -2; | tan_data->w = (layer_data[l][3] > 0.0f) ? 1 : -2; | ||||
| tan_data++; | tan_data++; | ||||
| } | } | ||||
| } | } | ||||
| if (use_orco_tan) { | if (use_orco_tan) { | ||||
| float(*layer_data)[4] = (float(*)[4])CustomData_get_layer_n(cd_ldata, CD_TANGENT, 0); | float(*layer_data)[4] = (float(*)[4])CustomData_get_layer_n(ldata, CD_TANGENT, 0); | ||||
| for (int l = 0; l < mr->loop_len; l++) { | for (int l = 0; l < mr->loop_len; l++) { | ||||
| *tan_data = GPU_normal_convert_i10_v3(layer_data[l]); | *tan_data = GPU_normal_convert_i10_v3(layer_data[l]); | ||||
| tan_data->w = (layer_data[l][3] > 0.0f) ? 1 : -2; | tan_data->w = (layer_data[l][3] > 0.0f) ? 1 : -2; | ||||
| tan_data++; | tan_data++; | ||||
| } | } | ||||
| } | } | ||||
| } | } | ||||
| CustomData_free_layers(cd_ldata, CD_TANGENT, mr->loop_len); | CustomData_free(&loop_data, mr->loop_len); | ||||
| } | } | ||||
| static void *extract_tan_init(const MeshRenderData *mr, void *buf) | static void *extract_tan_init(const MeshRenderData *mr, void *buf) | ||||
| { | { | ||||
| extract_tan_ex(mr, buf, false); | extract_tan_ex(mr, buf, false); | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| ▲ Show 20 Lines • Show All 3,081 Lines • Show Last 20 Lines | |||||