Changeset View
Changeset View
Standalone View
Standalone View
source/blender/draw/intern/draw_cache_extract_mesh.c
| Show First 20 Lines • Show All 2,670 Lines • ▼ Show 20 Lines | |||||
| /* ---------------------------------------------------------------------- */ | /* ---------------------------------------------------------------------- */ | ||||
| /** \name Extract Edit UV area stretch | /** \name Extract Edit UV area stretch | ||||
| * \{ */ | * \{ */ | ||||
| static void *extract_stretch_area_init(const MeshRenderData *mr, void *buf) | static void *extract_stretch_area_init(const MeshRenderData *mr, void *buf) | ||||
| { | { | ||||
| static GPUVertFormat format = {0}; | static GPUVertFormat format = {0}; | ||||
| if (format.attr_len == 0) { | if (format.attr_len == 0) { | ||||
| GPU_vertformat_attr_add(&format, "stretch", GPU_COMP_U16, 1, GPU_FETCH_INT_TO_FLOAT_UNIT); | GPU_vertformat_attr_add(&format, "ratio", GPU_COMP_U16, 1, GPU_FETCH_INT_TO_FLOAT_UNIT); | ||||
| } | } | ||||
| GPUVertBuf *vbo = buf; | GPUVertBuf *vbo = buf; | ||||
| GPU_vertbuf_init_with_format(vbo, &format); | GPU_vertbuf_init_with_format(vbo, &format); | ||||
| GPU_vertbuf_data_alloc(vbo, mr->loop_len); | GPU_vertbuf_data_alloc(vbo, mr->loop_len); | ||||
| return NULL; | return NULL; | ||||
| } | } | ||||
| Show All 10 Lines | |||||
| BLI_INLINE float area_ratio_to_stretch(float ratio, float tot_ratio, float inv_tot_ratio) | BLI_INLINE float area_ratio_to_stretch(float ratio, float tot_ratio, float inv_tot_ratio) | ||||
| { | { | ||||
| ratio *= (ratio > 0.0f) ? tot_ratio : -inv_tot_ratio; | ratio *= (ratio > 0.0f) ? tot_ratio : -inv_tot_ratio; | ||||
| return (ratio > 1.0f) ? (1.0f / ratio) : ratio; | return (ratio > 1.0f) ? (1.0f / ratio) : ratio; | ||||
| } | } | ||||
| static void mesh_stretch_area_finish(const MeshRenderData *mr, void *buf, void *UNUSED(data)) | static void mesh_stretch_area_finish(const MeshRenderData *mr, void *buf, void *UNUSED(data)) | ||||
| { | { | ||||
| float totarea = 0, totuvarea = 0; | float tot_area = 0.0f, tot_uv_area = 0.0f; | ||||
| float *area_ratio = MEM_mallocN(sizeof(float) * mr->poly_len, __func__); | float *area_ratio = MEM_mallocN(sizeof(float) * mr->poly_len, __func__); | ||||
| 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_MLOOPUV); | ||||
| 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); | ||||
| totarea += area; | tot_area += area; | ||||
| totuvarea += uvarea; | tot_uv_area += uvarea; | ||||
| area_ratio[f] = area_ratio_get(area, uvarea); | area_ratio[f] = area_ratio_get(area, uvarea); | ||||
| } | } | ||||
| } | } | ||||
| else if (mr->extract_type == MR_EXTRACT_MAPPED) { | else if (mr->extract_type == MR_EXTRACT_MAPPED) { | ||||
| const MLoopUV *uv_data = CustomData_get_layer(&mr->me->ldata, CD_MLOOPUV); | const MLoopUV *uv_data = CustomData_get_layer(&mr->me->ldata, CD_MLOOPUV); | ||||
| const MPoly *mpoly = mr->mpoly; | const MPoly *mpoly = mr->mpoly; | ||||
| for (int p = 0; p < mr->poly_len; p++, mpoly++) { | for (int p = 0; p < mr->poly_len; p++, mpoly++) { | ||||
| float area = BKE_mesh_calc_poly_area(mpoly, &mr->mloop[mpoly->loopstart], mr->mvert); | float area = BKE_mesh_calc_poly_area(mpoly, &mr->mloop[mpoly->loopstart], mr->mvert); | ||||
| float uvarea = BKE_mesh_calc_poly_uv_area(mpoly, uv_data); | float uvarea = BKE_mesh_calc_poly_uv_area(mpoly, uv_data); | ||||
| totarea += area; | tot_area += area; | ||||
| totuvarea += uvarea; | tot_uv_area += uvarea; | ||||
| area_ratio[p] = area_ratio_get(area, uvarea); | area_ratio[p] = area_ratio_get(area, uvarea); | ||||
| } | } | ||||
| } | } | ||||
| else { | else { | ||||
| /* Should not happen. */ | /* Should not happen. */ | ||||
| BLI_assert(0); | BLI_assert(0); | ||||
| } | } | ||||
| float tot_ratio, inv_tot_ratio; | mr->cache->tot_area = tot_area; | ||||
| if (totarea < FLT_EPSILON || totuvarea < FLT_EPSILON) { | mr->cache->tot_uv_area = tot_uv_area; | ||||
| tot_ratio = 0.0f; | |||||
| inv_tot_ratio = 0.0f; | |||||
| } | |||||
| else { | |||||
| tot_ratio = totarea / totuvarea; | |||||
| inv_tot_ratio = totuvarea / totarea; | |||||
| } | |||||
| /* Convert in place to avoid an extra allocation */ | /* Convert in place to avoid an extra allocation */ | ||||
| uint16_t *poly_stretch = (uint16_t *)area_ratio; | uint16_t *poly_stretch = (uint16_t *)area_ratio; | ||||
| for (int p = 0; p < mr->poly_len; p++) { | for (int p = 0; p < mr->poly_len; p++) { | ||||
| float stretch = area_ratio_to_stretch(area_ratio[p], tot_ratio, inv_tot_ratio); | poly_stretch[p] = area_ratio[p] * 65534.0f; | ||||
| poly_stretch[p] = (1.0f - stretch) * 65534.0f; | |||||
| } | } | ||||
| /* Copy face data for each loop. */ | /* Copy face data for each loop. */ | ||||
| GPUVertBuf *vbo = buf; | GPUVertBuf *vbo = buf; | ||||
| uint16_t *loop_stretch = (uint16_t *)vbo->data; | uint16_t *loop_stretch = (uint16_t *)vbo->data; | ||||
| if (mr->extract_type == MR_EXTRACT_BMESH) { | if (mr->extract_type == MR_EXTRACT_BMESH) { | ||||
| BMFace *efa; | BMFace *efa; | ||||
| ▲ Show 20 Lines • Show All 1,649 Lines • Show Last 20 Lines | |||||