Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorChris Blackbourn <chrisbblend@gmail.com>2022-08-08 01:15:13 +0300
committerChris Blackbourn <chrisbblend@gmail.com>2022-08-08 01:39:43 +0300
commit64984126a2b688a4bdd64bea4bcac1091756adab (patch)
treedb512bbc8be89eaaa8b65f4814b6b16014cf79d1 /source
parent387e7e9e8d0163750e2b4d97369f76c14cc021fd (diff)
Cleanup: refactoring uvislands to prepare for python api
Rename buf -> storage. See also: D15598
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_mesh_mapping.h7
-rw-r--r--source/blender/editors/mesh/editmesh_utils.c64
-rw-r--r--source/blender/editors/sculpt_paint/sculpt_uv.c8
-rw-r--r--source/blender/editors/uvedit/uvedit_ops.c2
-rw-r--r--source/blender/editors/uvedit/uvedit_smart_stitch.c52
5 files changed, 62 insertions, 71 deletions
diff --git a/source/blender/blenkernel/BKE_mesh_mapping.h b/source/blender/blenkernel/BKE_mesh_mapping.h
index f9dda7f5737..0c1839f9ac8 100644
--- a/source/blender/blenkernel/BKE_mesh_mapping.h
+++ b/source/blender/blenkernel/BKE_mesh_mapping.h
@@ -17,11 +17,10 @@ struct MLoopUV;
struct MPoly;
struct MVert;
-/* map from uv vertex to face (for select linked, stitch, uv suburf) */
-
/* UvVertMap */
#define STD_UV_CONNECT_LIMIT 0.0001f
+/* Map from uv vertex to face. Used by select linked, uv subsurf and obj exporter. */
typedef struct UvVertMap {
struct UvMapVert **vert;
struct UvMapVert *buf;
@@ -64,8 +63,8 @@ typedef struct UvElement {
typedef struct UvElementMap {
/* address UvElements by their vertex */
struct UvElement **vert;
- /* UvElement Store */
- struct UvElement *buf;
+ /** UvElement Storage. */
+ struct UvElement *storage;
/** Total number of UVs. */
int total_uvs;
/** Total number of unique UVs. */
diff --git a/source/blender/editors/mesh/editmesh_utils.c b/source/blender/editors/mesh/editmesh_utils.c
index fb7120b19ae..134532f0b21 100644
--- a/source/blender/editors/mesh/editmesh_utils.c
+++ b/source/blender/editors/mesh/editmesh_utils.c
@@ -603,7 +603,7 @@ static void bm_uv_assign_island(UvElementMap *element_map,
int islandbufsize)
{
element->island = nisland;
- map[element - element_map->buf] = islandbufsize;
+ map[element - element_map->storage] = islandbufsize;
/* Copy *element to islandbuf[islandbufsize]. */
islandbuf[islandbufsize].l = element->l;
@@ -625,11 +625,11 @@ static int bm_uv_edge_select_build_islands(UvElementMap *element_map,
/* For each UvElement, locate the "separate" UvElement that precedes it in the linked list. */
UvElement **head_table = MEM_mallocN(sizeof(*head_table) * total_uvs, "uv_island_head_table");
for (int i = 0; i < total_uvs; i++) {
- UvElement *head = element_map->buf + i;
+ UvElement *head = element_map->storage + i;
if (head->separate) {
UvElement *element = head;
while (element) {
- head_table[element - element_map->buf] = head;
+ head_table[element - element_map->storage] = head;
element = element->next;
if (element && element->separate) {
break;
@@ -646,7 +646,7 @@ static int bm_uv_edge_select_build_islands(UvElementMap *element_map,
"uv_island_element_stack");
int stacksize_uv = 0;
for (int i = 0; i < total_uvs; i++) {
- UvElement *element = element_map->buf + i;
+ UvElement *element = element_map->storage + i;
if (element->island != INVALID_ISLAND) {
/* Unique UV (element and all it's children) are already part of an island. */
continue;
@@ -676,7 +676,7 @@ static int bm_uv_edge_select_build_islands(UvElementMap *element_map,
if (!uv_selected || uvedit_edge_select_test(scene, element->l, cd_loop_uv_offset)) {
UvElement *next = BM_uv_element_get(element_map, element->l->next->f, element->l->next);
if (next->island == INVALID_ISLAND) {
- UvElement *tail = head_table[next - element_map->buf];
+ UvElement *tail = head_table[next - element_map->storage];
stack_uv[stacksize_uv++] = tail;
while (tail) {
bm_uv_assign_island(element_map, tail, nislands, map, islandbuf, islandbufsize++);
@@ -692,7 +692,7 @@ static int bm_uv_edge_select_build_islands(UvElementMap *element_map,
if (!uv_selected || uvedit_edge_select_test(scene, element->l->prev, cd_loop_uv_offset)) {
UvElement *prev = BM_uv_element_get(element_map, element->l->prev->f, element->l->prev);
if (prev->island == INVALID_ISLAND) {
- UvElement *tail = head_table[prev - element_map->buf];
+ UvElement *tail = head_table[prev - element_map->storage];
stack_uv[stacksize_uv++] = tail;
while (tail) {
bm_uv_assign_island(element_map, tail, nislands, map, islandbuf, islandbufsize++);
@@ -736,7 +736,6 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
BMIter iter, liter;
/* vars from original func */
UvElementMap *element_map;
- UvElement *buf;
bool *winding = NULL;
BLI_buffer_declare_static(vec2f, tf_uv_buf, BLI_BUFFER_NOP, BM_DEFAULT_NGON_STACK_SIZE);
@@ -781,13 +780,14 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
element_map->total_uvs = totuv;
element_map->vert = (UvElement **)MEM_callocN(sizeof(*element_map->vert) * totverts,
"UvElementVerts");
- buf = element_map->buf = (UvElement *)MEM_callocN(sizeof(*element_map->buf) * totuv,
- "UvElement");
+ element_map->storage = (UvElement *)MEM_callocN(sizeof(*element_map->storage) * totuv,
+ "UvElement");
if (use_winding) {
winding = MEM_callocN(sizeof(*winding) * totfaces, "winding");
}
+ UvElement *buf = element_map->storage;
BM_ITER_MESH_INDEX (efa, &iter, bm, BM_FACES_OF_MESH, j) {
if (BM_elem_flag_test(efa, BM_ELEM_HIDDEN)) {
@@ -882,7 +882,8 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
iterv = next;
}
- newvlist->separate = 1;
+ element_map->total_unique_uvs++;
+ newvlist->separate = true;
}
element_map->vert[i] = newvlist;
@@ -894,8 +895,6 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
if (do_islands) {
uint *map;
- BMFace **stack;
- int stacksize = 0;
UvElement *islandbuf;
/* island number for faces */
int *island_number = NULL;
@@ -904,7 +903,7 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
/* map holds the map from current vmap->buf to the new, sorted map */
map = MEM_mallocN(sizeof(*map) * totuv, "uvelement_remap");
- stack = MEM_mallocN(sizeof(*stack) * bm->totface, "uv_island_face_stack");
+ BMFace **stack = MEM_mallocN(sizeof(*stack) * bm->totface, "uv_island_face_stack");
islandbuf = MEM_callocN(sizeof(*islandbuf) * totuv, "uvelement_island_buffer");
island_number = MEM_mallocN(sizeof(*island_number) * totfaces, "uv_island_number_face");
copy_vn_i(island_number, totfaces, INVALID_ISLAND);
@@ -921,9 +920,10 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
/* at this point, every UvElement in vert points to a UvElement sharing the same vertex.
* Now we should sort uv's in islands. */
for (i = 0; i < totuv; i++) {
- if (element_map->buf[i].island == INVALID_ISLAND) {
- element_map->buf[i].island = nislands;
- stack[0] = element_map->buf[i].l->f;
+ if (element_map->storage[i].island == INVALID_ISLAND) {
+ int stacksize = 0;
+ element_map->storage[i].island = nislands;
+ stack[0] = element_map->storage[i].l->f;
island_number[BM_elem_index_get(stack[0])] = nislands;
stacksize = 1;
@@ -974,7 +974,7 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
for (i = 0; i < bm->totvert; i++) {
/* important since we may do selection only. Some of these may be NULL */
if (element_map->vert[i]) {
- element_map->vert[i] = &islandbuf[map[element_map->vert[i] - element_map->buf]];
+ element_map->vert[i] = &islandbuf[map[element_map->vert[i] - element_map->storage]];
}
}
@@ -982,12 +982,12 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
"UvElementMap_island_indices");
j = 0;
for (i = 0; i < totuv; i++) {
- UvElement *element = element_map->buf[i].next;
+ UvElement *element = element_map->storage[i].next;
if (element == NULL) {
islandbuf[map[i]].next = NULL;
}
else {
- islandbuf[map[i]].next = &islandbuf[map[element - element_map->buf]];
+ islandbuf[map[i]].next = &islandbuf[map[element - element_map->storage]];
}
if (islandbuf[i].island != j) {
@@ -996,19 +996,19 @@ UvElementMap *BM_uv_element_map_create(BMesh *bm,
}
}
- MEM_freeN(element_map->buf);
-
- element_map->buf = islandbuf;
+ MEM_SAFE_FREE(element_map->storage);
+ element_map->storage = islandbuf;
+ islandbuf = NULL;
element_map->totalIslands = nislands;
- MEM_freeN(stack);
- MEM_freeN(map);
+ MEM_SAFE_FREE(stack);
+ MEM_SAFE_FREE(map);
}
BLI_buffer_free(&tf_uv_buf);
element_map->total_unique_uvs = 0;
for (int i = 0; i < element_map->total_uvs; i++) {
- if (element_map->buf[i].separate) {
+ if (element_map->storage[i].separate) {
element_map->total_unique_uvs++;
}
}
@@ -1032,16 +1032,10 @@ void BM_uv_vert_map_free(UvVertMap *vmap)
void BM_uv_element_map_free(UvElementMap *element_map)
{
if (element_map) {
- if (element_map->vert) {
- MEM_freeN(element_map->vert);
- }
- if (element_map->buf) {
- MEM_freeN(element_map->buf);
- }
- if (element_map->islandIndices) {
- MEM_freeN(element_map->islandIndices);
- }
- MEM_freeN(element_map);
+ MEM_SAFE_FREE(element_map->vert);
+ MEM_SAFE_FREE(element_map->storage);
+ MEM_SAFE_FREE(element_map->islandIndices);
+ MEM_SAFE_FREE(element_map);
}
}
diff --git a/source/blender/editors/sculpt_paint/sculpt_uv.c b/source/blender/editors/sculpt_paint/sculpt_uv.c
index 8ff7965513b..a36b0fddeb6 100644
--- a/source/blender/editors/sculpt_paint/sculpt_uv.c
+++ b/source/blender/editors/sculpt_paint/sculpt_uv.c
@@ -434,7 +434,7 @@ static int uv_element_offset_from_face_get(
if (!element || (doIslands && element->island != island_index)) {
return -1;
}
- return element - map->buf;
+ return element - map->storage;
}
static uint uv_edge_hash(const void *key)
@@ -520,8 +520,8 @@ static UvSculptData *uv_sculpt_stroke_init(bContext *C, wmOperator *op, const wm
if (do_island_optimization) {
unique_uvs = 0;
for (int i = 0; i < data->elementMap->total_uvs; i++) {
- if (data->elementMap->buf[i].separate &&
- (data->elementMap->buf[i].island == island_index)) {
+ if (data->elementMap->storage[i].separate &&
+ (data->elementMap->storage[i].island == island_index)) {
unique_uvs++;
}
}
@@ -569,7 +569,7 @@ static UvSculptData *uv_sculpt_stroke_init(bContext *C, wmOperator *op, const wm
data->uv[counter].uv = luv->uv;
}
/* Pointer arithmetic to the rescue, as always :). */
- uniqueUv[element - data->elementMap->buf] = counter;
+ uniqueUv[element - data->elementMap->storage] = counter;
}
}
diff --git a/source/blender/editors/uvedit/uvedit_ops.c b/source/blender/editors/uvedit/uvedit_ops.c
index 67c80f5bdfd..092f0c49d8a 100644
--- a/source/blender/editors/uvedit/uvedit_ops.c
+++ b/source/blender/editors/uvedit/uvedit_ops.c
@@ -547,7 +547,7 @@ static bool uvedit_uv_straighten(Scene *scene, BMesh *bm, eUVWeldAlign tool)
for (int i = element_map->totalIslands - 1; i >= 0; --i) {
int j0 = element_map->islandIndices[i];
changed |= uvedit_uv_straighten_elements(
- element_map->buf + j0, j1 - j0, cd_loop_uv_offset, tool);
+ element_map->storage + j0, j1 - j0, cd_loop_uv_offset, tool);
j1 = j0;
}
diff --git a/source/blender/editors/uvedit/uvedit_smart_stitch.c b/source/blender/editors/uvedit/uvedit_smart_stitch.c
index fb552ffc805..854d3175979 100644
--- a/source/blender/editors/uvedit/uvedit_smart_stitch.c
+++ b/source/blender/editors/uvedit/uvedit_smart_stitch.c
@@ -465,7 +465,7 @@ static void stitch_calculate_island_snapping(StitchState *state,
angle_to_mat2(rotation_mat, rotation);
numOfIslandUVs = getNumOfIslandUvs(state->element_map, i);
- element = &state->element_map->buf[state->element_map->islandIndices[i]];
+ element = &state->element_map->storage[state->element_map->islandIndices[i]];
for (j = 0; j < numOfIslandUVs; j++, element++) {
/* stitchable uvs have already been processed, don't process */
if (!(element->flag & STITCH_PROCESSED)) {
@@ -527,8 +527,8 @@ static void stitch_island_calculate_edge_rotation(UvEdge *edge,
luv2 = CustomData_bmesh_get(&bm->ldata, element2->l->head.data, CD_MLOOPUV);
if (ssc->mode == STITCH_VERT) {
- index1 = uvfinal_map[element1 - state->element_map->buf];
- index2 = uvfinal_map[element2 - state->element_map->buf];
+ index1 = uvfinal_map[element1 - state->element_map->storage];
+ index2 = uvfinal_map[element2 - state->element_map->storage];
}
else {
index1 = edge->uv1;
@@ -569,7 +569,6 @@ static void stitch_island_calculate_vert_rotation(UvElement *element,
StitchState *state,
IslandStitchData *island_stitch_data)
{
- float edgecos = 1.0f, edgesin = 0.0f;
int index;
UvElement *element_iter;
float rotation = 0, rotation_neg = 0;
@@ -589,7 +588,6 @@ static void stitch_island_calculate_vert_rotation(UvElement *element,
for (; element_iter; element_iter = element_iter->next) {
if (element_iter->separate &&
stitch_check_uvs_state_stitchable(element, element_iter, ssc, state)) {
- int index_tmp1, index_tmp2;
float normal[2];
/* only calculate rotation against static island uv verts */
@@ -597,14 +595,14 @@ static void stitch_island_calculate_vert_rotation(UvElement *element,
continue;
}
- index_tmp1 = element_iter - state->element_map->buf;
+ int index_tmp1 = element_iter - state->element_map->storage;
index_tmp1 = state->map[index_tmp1];
- index_tmp2 = element - state->element_map->buf;
+ int index_tmp2 = element - state->element_map->storage;
index_tmp2 = state->map[index_tmp2];
negate_v2_v2(normal, state->normals + index_tmp2 * 2);
- edgecos = dot_v2v2(normal, state->normals + index_tmp1 * 2);
- edgesin = cross_v2v2(normal, state->normals + index_tmp1 * 2);
+ float edgecos = dot_v2v2(normal, state->normals + index_tmp1 * 2);
+ float edgesin = cross_v2v2(normal, state->normals + index_tmp1 * 2);
if (edgesin > 0.0f) {
rotation += acosf(max_ff(-1.0f, min_ff(1.0f, edgecos)));
rot_elem++;
@@ -679,10 +677,7 @@ static void stitch_uv_edge_generate_linked_edges(GHash *edge_hash, StitchState *
UvEdge *edges = state->edges;
const int *map = state->map;
UvElementMap *element_map = state->element_map;
- UvElement *first_element = element_map->buf;
- int i;
-
- for (i = 0; i < state->total_separate_edges; i++) {
+ for (int i = 0; i < state->total_separate_edges; i++) {
UvEdge *edge = edges + i;
if (edge->first) {
@@ -713,8 +708,8 @@ static void stitch_uv_edge_generate_linked_edges(GHash *edge_hash, StitchState *
}
if (iter2) {
- int index1 = map[iter1 - first_element];
- int index2 = map[iter2 - first_element];
+ int index1 = map[iter1 - element_map->storage];
+ int index2 = map[iter2 - element_map->storage];
UvEdge edgetmp;
UvEdge *edge2, *eiter;
bool valid = true;
@@ -1176,7 +1171,7 @@ static int stitch_process_data(StitchStateContainer *ssc,
int numOfIslandUVs = 0, j;
UvElement *element;
numOfIslandUVs = getNumOfIslandUvs(state->element_map, i);
- element = &state->element_map->buf[state->element_map->islandIndices[i]];
+ element = &state->element_map->storage[state->element_map->islandIndices[i]];
for (j = 0; j < numOfIslandUVs; j++, element++) {
stitch_set_face_preview_buffer_position(element->l->f, preview, preview_position);
}
@@ -1283,7 +1278,7 @@ static int stitch_process_data(StitchStateContainer *ssc,
l = element->l;
luv = CustomData_bmesh_get(&bm->ldata, l->head.data, CD_MLOOPUV);
- uvfinal_map[element - state->element_map->buf] = i;
+ uvfinal_map[element - state->element_map->storage] = i;
copy_v2_v2(final_position[i].uv, luv->uv);
final_position[i].count = 1;
@@ -1541,6 +1536,7 @@ static int stitch_process_data_all(StitchStateContainer *ssc, Scene *scene, int
static uint uv_edge_hash(const void *key)
{
const UvEdge *edge = key;
+ BLI_assert(edge->uv1 < edge->uv2);
return (BLI_ghashutil_uinthash(edge->uv2) + BLI_ghashutil_uinthash(edge->uv1));
}
@@ -1548,6 +1544,8 @@ static bool uv_edge_compare(const void *a, const void *b)
{
const UvEdge *edge1 = a;
const UvEdge *edge2 = b;
+ BLI_assert(edge1->uv1 < edge1->uv2);
+ BLI_assert(edge2->uv1 < edge2->uv2);
if ((edge1->uv1 == edge2->uv1) && (edge1->uv2 == edge2->uv2)) {
return 0;
@@ -1849,8 +1847,8 @@ static UvEdge *uv_edge_get(BMLoop *l, StitchState *state)
UvElement *element1 = BM_uv_element_get(state->element_map, l->f, l);
UvElement *element2 = BM_uv_element_get(state->element_map, l->f, l->next);
- int uv1 = state->map[element1 - state->element_map->buf];
- int uv2 = state->map[element2 - state->element_map->buf];
+ int uv1 = state->map[element1 - state->element_map->storage];
+ int uv2 = state->map[element2 - state->element_map->storage];
if (uv1 < uv2) {
tmp_edge.uv1 = uv1;
@@ -1943,7 +1941,7 @@ static StitchState *stitch_init(bContext *C,
state->uvs[counter] = element;
}
/* Pointer arithmetic to the rescue, as always :). */
- map[element - state->element_map->buf] = counter;
+ map[element - state->element_map->storage] = counter;
}
}
@@ -1957,13 +1955,13 @@ static StitchState *stitch_init(bContext *C,
BM_ITER_ELEM (l, &liter, efa, BM_LOOPS_OF_FACE) {
UvElement *element = BM_uv_element_get(state->element_map, efa, l);
- int offset1, itmp1 = element - state->element_map->buf;
- int offset2,
- itmp2 = BM_uv_element_get(state->element_map, efa, l->next) - state->element_map->buf;
+ int itmp1 = element - state->element_map->storage;
+ int itmp2 = BM_uv_element_get(state->element_map, efa, l->next) -
+ state->element_map->storage;
UvEdge *edge;
- offset1 = map[itmp1];
- offset2 = map[itmp2];
+ int offset1 = map[itmp1];
+ int offset2 = map[itmp2];
all_edges[counter].next = NULL;
all_edges[counter].first = NULL;
@@ -2083,13 +2081,13 @@ static StitchState *stitch_init(bContext *C,
efa = BM_face_at_index(em->bm, faceIndex);
element = BM_uv_element_get(
state->element_map, efa, BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, efa, elementIndex));
- uv1 = map[element - state->element_map->buf];
+ uv1 = map[element - state->element_map->storage];
element = BM_uv_element_get(
state->element_map,
efa,
BM_iter_at_index(NULL, BM_LOOPS_OF_FACE, efa, (elementIndex + 1) % efa->len));
- uv2 = map[element - state->element_map->buf];
+ uv2 = map[element - state->element_map->storage];
if (uv1 < uv2) {
tmp_edge.uv1 = uv1;