24 if (area >= FLT_EPSILON && uvarea >= FLT_EPSILON) {
33 return (ratio > 1.0f) ? (1.0f / ratio) : ratio;
50 for (const int face_index : range) {
51 const BMFace &face = *BM_face_at_index(&const_cast<BMesh &>(bm), face_index);
52 const float area = BM_face_calc_area(&face);
53 const float uvarea = BM_face_calc_area_uv(&face, uv_offset);
54 info.tot_area += area;
55 info.tot_uv_area += uvarea;
56 r_area_ratio[face_index] = area_ratio_get(area, uvarea);
67 const Span<int> corner_verts = mr.corner_verts;
68 const Mesh &mesh = *mr.mesh;
78 for (const int face_index : range) {
79 const IndexRange face = faces[face_index];
80 const float area = bke::mesh::face_area_calc(positions, corner_verts.slice(face));
81 float uvarea = area_poly_v2(reinterpret_cast<const float(*)[2]>(&uv_map[face.start()]),
83 info.tot_area += area;
84 info.tot_uv_area += uvarea;
85 r_area_ratio[face_index] = area_ratio_get(area, uvarea);
89 [](
const AreaInfo &a,
const AreaInfo &
b) {
90 return AreaInfo{a.tot_area +
b.tot_area, a.tot_uv_area +
b.tot_uv_area};
105 if (
format.attr_len == 0) {
113 threading::memory_bandwidth_bound_task(bytes, [&]() {
115 const BMesh &bm = *mr.bm;
116 threading::parallel_for(IndexRange(bm.totface), 2048, [&](const IndexRange range) {
117 for (const int face_index : range) {
118 const BMFace &face = *BM_face_at_index(&const_cast<BMesh &>(bm), face_index);
119 const IndexRange face_range(BM_elem_index_get(BM_FACE_FIRST_LOOP(&face)), face.len);
120 vbo_data.slice(face_range).fill(area_ratio[face_index]);
127 threading::parallel_for(faces.index_range(), 2048, [&](
const IndexRange range) {
128 for (const int face : range) {
129 vbo_data.slice(faces[face]).fill(area_ratio[face]);
143 if (
format.attr_len == 0) {
153 tot_area = info.tot_area;
154 tot_uv_area = info.tot_uv_area;
int CustomData_get_offset(const CustomData *data, eCustomDataType type)
const char * CustomData_get_active_layer_name(const CustomData *data, eCustomDataType type)
void GPU_vertbuf_init_build_on_device(blender::gpu::VertBuf &verts, const GPUVertFormat &format, uint v_len)
#define GPU_vertbuf_init_with_format(verts, format)
blender::gpu::VertBuf * GPU_vertbuf_calloc()
void GPU_vertbuf_data_alloc(blender::gpu::VertBuf &verts, uint v_len)
void GPU_vertbuf_discard(blender::gpu::VertBuf *)
Read Guarded memory(de)allocation.
ATTR_WARN_UNUSED_RESULT BMesh * bm
Span< T > as_span() const
constexpr int64_t size_in_bytes() const
local_group_size(16, 16) .push_constant(Type b
void extract_edituv_stretch_area_subdiv(const MeshRenderData &mr, const DRWSubdivCache &subdiv_cache, gpu::VertBuf &vbo, float &tot_area, float &tot_uv_area)
BLI_INLINE float area_ratio_to_stretch(float ratio, float tot_ratio)
void draw_subdiv_build_edituv_stretch_area_buffer(const DRWSubdivCache &cache, gpu::VertBuf *coarse_data, gpu::VertBuf *subdiv_data)
static AreaInfo compute_area_ratio(const MeshRenderData &mr, MutableSpan< float > r_area_ratio)
BLI_INLINE float area_ratio_get(float area, float uvarea)
void extract_edituv_stretch_area(const MeshRenderData &mr, gpu::VertBuf &vbo, float &tot_area, float &tot_uv_area)
Value parallel_reduce(IndexRange range, int64_t grain_size, const Value &identity, const Function &function, const Reduction &reduction)
eMRExtractType extract_type
OffsetIndices< int > faces