Differential D14365 Diff 59272 source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_area.cc
Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/mesh_extractors/extract_mesh_vbo_edituv_stretch_area.cc
| /* SPDX-License-Identifier: GPL-2.0-or-later | /* SPDX-License-Identifier: GPL-2.0-or-later | ||||
| * Copyright 2021 Blender Foundation. All rights reserved. */ | * Copyright 2021 Blender Foundation. All rights reserved. */ | ||||
| /** \file | /** \file | ||||
| * \ingroup draw | * \ingroup draw | ||||
| */ | */ | ||||
| #include "BLI_math_vector_types.hh" | |||||
| #include "MEM_guardedalloc.h" | #include "MEM_guardedalloc.h" | ||||
| #include "BKE_mesh.h" | #include "BKE_mesh.h" | ||||
| #include "extract_mesh.hh" | #include "extract_mesh.hh" | ||||
| #include "draw_subdivision.h" | #include "draw_subdivision.h" | ||||
| Show All 36 Lines | static void compute_area_ratio(const MeshRenderData *mr, | ||||
| float *r_area_ratio, | float *r_area_ratio, | ||||
| float &r_tot_area, | float &r_tot_area, | ||||
| float &r_tot_uv_area) | float &r_tot_uv_area) | ||||
| { | { | ||||
| float tot_area = 0.0f, tot_uv_area = 0.0f; | float tot_area = 0.0f, tot_uv_area = 0.0f; | ||||
| if (mr->extract_type == MR_EXTRACT_BMESH) { | if (mr->extract_type == MR_EXTRACT_BMESH) { | ||||
| CustomData *cd_ldata = &mr->bm->ldata; | CustomData *cd_ldata = &mr->bm->ldata; | ||||
| int uv_ofs = CustomData_get_offset(cd_ldata, CD_MLOOPUV); | int uv_ofs = CustomData_get_offset(cd_ldata, CD_PROP_FLOAT2); | ||||
| BMFace *efa; | BMFace *efa; | ||||
| BMIter f_iter; | BMIter f_iter; | ||||
| int f; | int f; | ||||
| BM_ITER_MESH_INDEX (efa, &f_iter, mr->bm, BM_FACES_OF_MESH, f) { | BM_ITER_MESH_INDEX (efa, &f_iter, mr->bm, BM_FACES_OF_MESH, f) { | ||||
| float area = BM_face_calc_area(efa); | float area = BM_face_calc_area(efa); | ||||
| float uvarea = BM_face_calc_area_uv(efa, uv_ofs); | float uvarea = BM_face_calc_area_uv(efa, uv_ofs); | ||||
| tot_area += area; | tot_area += area; | ||||
| tot_uv_area += uvarea; | tot_uv_area += uvarea; | ||||
| r_area_ratio[f] = area_ratio_get(area, uvarea); | r_area_ratio[f] = area_ratio_get(area, uvarea); | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| BLI_assert(mr->extract_type == MR_EXTRACT_MESH); | BLI_assert(mr->extract_type == MR_EXTRACT_MESH); | ||||
| const MLoopUV *uv_data = (const MLoopUV *)CustomData_get_layer(&mr->me->ldata, CD_MLOOPUV); | const float2 *uv_data = (const float2 *)CustomData_get_layer(&mr->me->ldata, CD_PROP_FLOAT2); | ||||
| const MPoly *mp = mr->mpoly; | const MPoly *mp = mr->mpoly; | ||||
| for (int mp_index = 0; mp_index < mr->poly_len; mp_index++, mp++) { | for (int mp_index = 0; mp_index < mr->poly_len; mp_index++, mp++) { | ||||
| float area = BKE_mesh_calc_poly_area( | float area = BKE_mesh_calc_poly_area( | ||||
| mp, &mr->mloop[mp->loopstart], reinterpret_cast<const float(*)[3]>(mr->vert_positions)); | mp, &mr->mloop[mp->loopstart], reinterpret_cast<const float(*)[3]>(mr->vert_positions)); | ||||
| float uvarea = BKE_mesh_calc_poly_uv_area(mp, uv_data); | float uvarea = area_poly_v2(reinterpret_cast<const float(*)[2]>(&uv_data[mp->loopstart]), | ||||
| mp->totloop); | |||||
| tot_area += area; | tot_area += area; | ||||
| tot_uv_area += uvarea; | tot_uv_area += uvarea; | ||||
| r_area_ratio[mp_index] = area_ratio_get(area, uvarea); | r_area_ratio[mp_index] = area_ratio_get(area, uvarea); | ||||
| } | } | ||||
| } | } | ||||
| r_tot_area = tot_area; | r_tot_area = tot_area; | ||||
| r_tot_uv_area = tot_uv_area; | r_tot_uv_area = tot_uv_area; | ||||
| ▲ Show 20 Lines • Show All 90 Lines • Show Last 20 Lines | |||||