diff options
Diffstat (limited to 'source/blender/blenkernel/intern/cdderivedmesh.c')
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 89 |
1 files changed, 31 insertions, 58 deletions
diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index a2c78822aab..649778c71f5 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -392,12 +392,7 @@ static void cdDM_drawUVEdges(DerivedMesh *dm) static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdges) { CDDerivedMesh *cddm = (CDDerivedMesh *) dm; - MEdge *medge = cddm->medge; - int i; - int prevstart = 0; - int prevdraw = 1; - bool draw = true; - + GPUDrawObject *gdo; if (cddm->pbvh && cddm->pbvh_draw && BKE_pbvh_type(cddm->pbvh) == PBVH_BMESH) { @@ -407,58 +402,36 @@ static void cdDM_drawEdges(DerivedMesh *dm, bool drawLooseEdges, bool drawAllEdg } GPU_edge_setup(dm); - for (i = 0; i < dm->numEdgeData; i++, medge++) { - if ((drawAllEdges || (medge->flag & ME_EDGEDRAW)) && - (drawLooseEdges || !(medge->flag & ME_LOOSEEDGE))) - { - draw = true; + gdo = dm->drawObject; + if (gdo->edges && gdo->points) { + if (drawAllEdges && drawLooseEdges) { + GPU_buffer_draw_elements(gdo->edges, GL_LINES, 0, gdo->totedge * 2); } - else { - draw = false; + else if (drawAllEdges) { + GPU_buffer_draw_elements(gdo->edges, GL_LINES, 0, gdo->loose_edge_offset * 2); } - if (prevdraw != draw) { - if (prevdraw > 0 && (i - prevstart) > 0) { - GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2); - } - prevstart = i; + else { + GPU_buffer_draw_elements(gdo->edges, GL_LINES, 0, gdo->tot_edge_drawn * 2); + GPU_buffer_draw_elements(gdo->edges, GL_LINES, gdo->loose_edge_offset * 2, dm->drawObject->tot_loose_edge_drawn * 2); } - prevdraw = draw; - } - if (prevdraw > 0 && (i - prevstart) > 0) { - GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2); } GPU_buffer_unbind(); } static void cdDM_drawLooseEdges(DerivedMesh *dm) { - CDDerivedMesh *cddm = (CDDerivedMesh *) dm; - MEdge *medge = cddm->medge; - int i; - - int prevstart = 0; - int prevdraw = 1; - int draw = 1; - + int start; + int count; + GPU_edge_setup(dm); - for (i = 0; i < dm->numEdgeData; i++, medge++) { - if (medge->flag & ME_LOOSEEDGE) { - draw = 1; - } - else { - draw = 0; - } - if (prevdraw != draw) { - if (prevdraw > 0 && (i - prevstart) > 0) { - GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2); - } - prevstart = i; - } - prevdraw = draw; - } - if (prevdraw > 0 && (i - prevstart) > 0) { - GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, prevstart * 2, (i - prevstart) * 2); + + start = (dm->drawObject->loose_edge_offset * 2); + count = (dm->drawObject->totedge - dm->drawObject->loose_edge_offset) * 2; + + if (count) { + GPU_buffer_draw_elements(dm->drawObject->edges, GL_LINES, start, count); } + GPU_buffer_unbind(); } @@ -470,7 +443,7 @@ static void cdDM_drawFacesSolid(DerivedMesh *dm, int a; if (cddm->pbvh && cddm->pbvh_draw) { - if (dm->numTessFaceData) { + if (BKE_pbvh_has_faces(cddm->pbvh)) { float (*face_nors)[3] = CustomData_get_layer(&dm->faceData, CD_NORMAL); BKE_pbvh_draw(cddm->pbvh, partial_redraw_planes, face_nors, @@ -527,7 +500,7 @@ static void cdDM_drawFacesTex_common(DerivedMesh *dm, * (the same as it'll display without UV maps in textured view) */ if (cddm->pbvh && cddm->pbvh_draw && BKE_pbvh_type(cddm->pbvh) == PBVH_BMESH) { - if (dm->numTessFaceData) { + if (BKE_pbvh_has_faces(cddm->pbvh)) { GPU_set_tpage(NULL, false, false); BKE_pbvh_draw(cddm->pbvh, NULL, NULL, NULL, false); } @@ -786,14 +759,14 @@ static void cdDM_drawMappedFaces(DerivedMesh *dm, if (tottri == 0) { /* avoid buffer problems in following code */ } - if (setDrawOptions == NULL) { + else if (setDrawOptions == NULL) { /* just draw the entire face array */ glDrawArrays(GL_TRIANGLES, 0, (tottri) * 3); } else { /* we need to check if the next material changes */ int next_actualFace = dm->drawObject->triangle_to_mface[0]; - int prev_mat_nr = -1; + short prev_mat_nr = -1; for (i = 0; i < tottri; i++) { //int actualFace = dm->drawObject->triangle_to_mface[i]; @@ -912,7 +885,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, * works fine for matcap */ if (cddm->pbvh && cddm->pbvh_draw && BKE_pbvh_type(cddm->pbvh) == PBVH_BMESH) { - if (dm->numTessFaceData) { + if (BKE_pbvh_has_faces(cddm->pbvh)) { setMaterial(1, &gattribs); BKE_pbvh_draw(cddm->pbvh, NULL, NULL, NULL, false); } @@ -1246,7 +1219,7 @@ static void cdDM_drawMappedFacesMat(DerivedMesh *dm, * works fine for matcap */ if (cddm->pbvh && cddm->pbvh_draw && BKE_pbvh_type(cddm->pbvh) == PBVH_BMESH) { - if (dm->numTessFaceData) { + if (BKE_pbvh_has_faces(cddm->pbvh)) { setMaterial(userData, 1, &gattribs); BKE_pbvh_draw(cddm->pbvh, NULL, NULL, NULL, false); } @@ -2545,16 +2518,16 @@ DerivedMesh *CDDM_merge_verts(DerivedMesh *dm, const int *vtargetmap, const int const unsigned int v1 = (vtargetmap[med->v1] != -1) ? vtargetmap[med->v1] : med->v1; const unsigned int v2 = (vtargetmap[med->v2] != -1) ? vtargetmap[med->v2] : med->v2; if (LIKELY(v1 != v2)) { - void **eh_p = BLI_edgehash_lookup_p(ehash, v1, v2); + void **val_p; - if (eh_p) { - newe[i] = GET_INT_FROM_POINTER(*eh_p); + if (BLI_edgehash_ensure_p(ehash, v1, v2, &val_p)) { + newe[i] = GET_INT_FROM_POINTER(*val_p); } else { STACK_PUSH(olde, i); STACK_PUSH(medge, *med); newe[i] = c; - BLI_edgehash_insert(ehash, v1, v2, SET_INT_IN_POINTER(c)); + *val_p = SET_INT_IN_POINTER(c); c++; } } @@ -2569,7 +2542,7 @@ DerivedMesh *CDDM_merge_verts(DerivedMesh *dm, const int *vtargetmap, const int /* This poly equality check is rather complex. We use a BLI_ghash to speed it up with a first level check */ PolyKey *mpgh; poly_keys = MEM_mallocN(sizeof(PolyKey) * totpoly, __func__); - poly_gset = BLI_gset_new_ex(poly_gset_hash_fn, poly_gset_compare_fn, __func__, totpoly, false); + poly_gset = BLI_gset_new_ex(poly_gset_hash_fn, poly_gset_compare_fn, __func__, totpoly); /* Duplicates allowed because our compare function is not pure equality */ BLI_gset_flag_set(poly_gset, GHASH_FLAG_ALLOW_DUPES); |