BMesh: backport minor changes from 2.8
authorCampbell Barton <ideasman42@gmail.com>
Sat, 10 Nov 2018 08:54:49 +0000 (19:54 +1100)
committerCampbell Barton <ideasman42@gmail.com>
Sat, 10 Nov 2018 08:56:02 +0000 (19:56 +1100)
12 files changed:
source/blender/bmesh/bmesh.h
source/blender/bmesh/intern/bmesh_marking.c
source/blender/bmesh/intern/bmesh_mesh.c
source/blender/bmesh/intern/bmesh_mesh.h
source/blender/bmesh/intern/bmesh_mesh_conv.c
source/blender/bmesh/intern/bmesh_polygon.c
source/blender/bmesh/intern/bmesh_polygon.h
source/blender/bmesh/intern/bmesh_query.c
source/blender/bmesh/intern/bmesh_query.h
source/blender/bmesh/operators/bmo_bevel.c
source/blender/bmesh/tools/bmesh_bevel.c
source/blender/bmesh/tools/bmesh_wireframe.c

index 8b0b8a282f5e5a4cf603204482dd2cf8d2a131a6..266b31aaeb34d49ce031364d7486afa30dc1811d 100644 (file)
@@ -84,7 +84,7 @@
  * Edges and Vertices in BMesh are primitive structures.
  *
  * \note There can be more than one edge between two vertices in BMesh,
- * though the rest of Blender (e.g. DerivedMesh, CDDM, CCGSubSurf, etc) does not support this.
+ * though the rest of Blender (i.e. DerivedMesh, CDDM, CCGSubSurf, etc) does not support this.
  * So it should only occur temporarily during editing operations.
  *
  *
index 10a03050d4bbe666148f0ccf960679ccd4f38b7d..1e53180396e9cd1ca7e667c785fdfaec0cf882fe 100644 (file)
@@ -863,7 +863,7 @@ void BM_editselection_normal(BMEditSelection *ese, float r_normal[3])
 
 /* Calculate a plane that is rightangles to the edge/vert/faces normal
  * also make the plane run along an axis that is related to the geometry,
- * because this is used for the manipulators Y axis. */
+ * because this is used for the gizmos Y axis. */
 void BM_editselection_plane(BMEditSelection *ese, float r_plane[3])
 {
        if (ese->htype == BM_VERT) {
@@ -895,7 +895,7 @@ void BM_editselection_plane(BMEditSelection *ese, float r_plane[3])
                else {
                        /* the plane is simple, it runs along the edge
                         * however selecting different edges can swap the direction of the y axis.
-                        * this makes it less likely for the y axis of the manipulator
+                        * this makes it less likely for the y axis of the gizmo
                         * (running along the edge).. to flip less often.
                         * at least its more predictable */
                        if (eed->v2->co[1] > eed->v1->co[1]) {  /* check which to do first */
index 4568c3b7965f80bd29d86afc9e3892d4ba8d2918..6dc6fee3a187b252fc9cbff9edb50eef5af70a47 100644 (file)
@@ -894,7 +894,10 @@ static void bm_mesh_loops_calc_normals(
                                                                clnors_avg[0] /= clnors_nbr;
                                                                clnors_avg[1] /= clnors_nbr;
                                                                /* Fix/update all clnors of this fan with computed average value. */
-                                                               printf("Invalid clnors in this fan!\n");
+
+                                                               /* Prints continuously when merge custom normals, so commenting. */
+                                                               /* printf("Invalid clnors in this fan!\n"); */
+
                                                                while ((clnor = BLI_SMALLSTACK_POP(clnors))) {
                                                                        //print_v2("org clnor", clnor);
                                                                        clnor[0] = (short)clnors_avg[0];
@@ -1009,7 +1012,8 @@ void BM_mesh_loop_normals_update(
 void BM_loops_calc_normal_vcos(
         BMesh *bm, const float (*vcos)[3], const float (*vnos)[3], const float (*fnos)[3],
         const bool use_split_normals, const float split_angle, float (*r_lnos)[3],
-        MLoopNorSpaceArray *r_lnors_spacearr, short (*clnors_data)[2], const int cd_loop_clnors_offset)
+        MLoopNorSpaceArray *r_lnors_spacearr, short (*clnors_data)[2],
+        const int cd_loop_clnors_offset)
 {
        const bool has_clnors = clnors_data || (cd_loop_clnors_offset != -1);
 
@@ -1019,7 +1023,8 @@ void BM_loops_calc_normal_vcos(
                bm_mesh_edges_sharp_tag(bm, vnos, fnos, r_lnos, has_clnors ? (float)M_PI : split_angle, false);
 
                /* Finish computing lnos by accumulating face normals in each fan of faces defined by sharp edges. */
-               bm_mesh_loops_calc_normals(bm, vcos, fnos, r_lnos, r_lnors_spacearr, clnors_data, cd_loop_clnors_offset);
+               bm_mesh_loops_calc_normals(
+                       bm, vcos, fnos, r_lnos, r_lnors_spacearr, clnors_data, cd_loop_clnors_offset);
        }
        else {
                BLI_assert(!r_lnors_spacearr);
index 9d7866c280a3558e4d00e1198dfaf92be4605c2d..cc056e1fa19033e911cf0289b9d72aee4586c8fe 100644 (file)
@@ -48,9 +48,10 @@ void   BM_mesh_clear(BMesh *bm);
 void BM_mesh_normals_update(BMesh *bm);
 void BM_verts_calc_normal_vcos(BMesh *bm, const float (*fnos)[3], const float (*vcos)[3], float (*vnos)[3]);
 void BM_loops_calc_normal_vcos(
-        BMesh *bm, const float (*vcos)[3], const float (*vnos)[3], const float (*pnos)[3],
-        const bool use_split_normals, const float split_angle, float (*r_lnos)[3],
-        struct MLoopNorSpaceArray *r_lnors_spacearr, short (*clnors_data)[2], const int cd_loop_clnors_offset);
+        BMesh *bm, const float(*vcos)[3], const float(*vnos)[3], const float(*pnos)[3],
+        const bool use_split_normals, const float split_angle, float(*r_lnos)[3],
+        struct MLoopNorSpaceArray *r_lnors_spacearr, short (*clnors_data)[2],
+        const int cd_loop_clnors_offset);
 
 bool BM_loop_check_cyclic_smooth_fan(BMLoop *l_curr);
 
index 340b0b70772ebe14c403bcbad1bb7d78be6791df..2259a7dfe09be069f68c906d68f396dbb17abfb3 100644 (file)
@@ -592,7 +592,7 @@ BLI_INLINE void bmesh_quick_edgedraw_flag(MEdge *med, BMEdge *e)
 
 /**
  *
- * \param bmain May be NULL in case \a calc_object_remap parameter option is set.
+ * \param bmain May be NULL in case \a calc_object_remap parameter option is not set.
  */
 void BM_mesh_bm_to_me(
         Main *bmain, BMesh *bm, Mesh *me,
index 3137725d6e70f0cac85e112330178ee23c3c956d..5e3f5958a32e9cc68d6fb65a38a527be06bc7cc1 100644 (file)
@@ -239,6 +239,28 @@ float BM_face_calc_area(const BMFace *f)
        return len_v3(n) * 0.5f;
 }
 
+/**
+ * Get the area of the face in world space.
+ */
+float BM_face_calc_area_with_mat3(const BMFace *f, float mat3[3][3])
+{
+       /* inline 'area_poly_v3' logic, avoid creating a temp array */
+       const BMLoop *l_iter, *l_first;
+       float co[3];
+       float n[3];
+
+       zero_v3(n);
+       l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+       mul_v3_m3v3(co, mat3, l_iter->v->co);
+       do {
+               float co_next[3];
+               mul_v3_m3v3(co_next, mat3, l_iter->next->v->co);
+               add_newell_cross_v3_v3v3(n, co, co_next);
+               copy_v3_v3(co, co_next);
+       } while ((l_iter = l_iter->next) != l_first);
+       return len_v3(n) * 0.5f;
+}
+
 /**
  * compute the perimeter of an ngon
  */
@@ -255,6 +277,27 @@ float BM_face_calc_perimeter(const BMFace *f)
        return perimeter;
 }
 
+/**
+ * Calculate the perimeter of a ngon in world space.
+ */
+float BM_face_calc_perimeter_with_mat3(const BMFace *f, float mat3[3][3])
+{
+       const BMLoop *l_iter, *l_first;
+       float co[3];
+       float perimeter = 0.0f;
+
+       l_iter = l_first = BM_FACE_FIRST_LOOP(f);
+       mul_v3_m3v3(co, mat3, l_iter->v->co);
+       do {
+               float co_next[3];
+               mul_v3_m3v3(co_next, mat3, l_iter->next->v->co);
+               perimeter += len_v3v3(co, co_next);
+               copy_v3_v3(co, co_next);
+       } while ((l_iter = l_iter->next) != l_first);
+
+       return perimeter;
+}
+
 /**
  * Utility function to calculate the edge which is most different from the other two.
  *
@@ -487,7 +530,7 @@ void  BM_face_calc_tangent_vert_diagonal(const BMFace *f, float r_tangent[3])
 }
 
 /**
- * Compute a meaningful direction along the face (use for manipulator axis).
+ * Compute a meaningful direction along the face (use for gizmo axis).
  *
  * \note Callers shouldn't depend on the *exact* method used here.
  */
index a40da2bfbfae95c2c1a0890a2b5694d4b8678497..1d5fb2cc6204f4de4eb3504e71fc135ad8711ece 100644 (file)
@@ -44,7 +44,9 @@ float BM_face_calc_normal_vcos(
         float const (*vertexCos)[3]) ATTR_NONNULL();
 float BM_face_calc_normal_subset(const BMLoop *l_first, const BMLoop *l_last, float r_no[3]) ATTR_NONNULL();
 float BM_face_calc_area(const BMFace *f) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
+float BM_face_calc_area_with_mat3(const BMFace *f, float mat3[3][3]) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 float BM_face_calc_perimeter(const BMFace *f) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
+float BM_face_calc_perimeter_with_mat3(const BMFace *f, float mat3[3][3]) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 void  BM_face_calc_tangent_edge(const BMFace *f, float r_plane[3]) ATTR_NONNULL();
 void  BM_face_calc_tangent_edge_pair(const BMFace *f, float r_plane[3]) ATTR_NONNULL();
 void  BM_face_calc_tangent_edge_diagonal(const BMFace *f, float r_plane[3]) ATTR_NONNULL();
index 540888ac0b961ee669df21e5b5b43aab75c28158..6e69ba48bafb268ff5163c310ca78428a85813fa 100644 (file)
@@ -1677,6 +1677,40 @@ float BM_edge_calc_face_angle(const BMEdge *e)
        return BM_edge_calc_face_angle_ex(e, DEG2RADF(90.0f));
 }
 
+/**
+* \brief BMESH EDGE/FACE ANGLE
+*
+* Calculates the angle between two faces in world space.
+* Assumes the face normals are correct.
+*
+* \return angle in radians
+*/
+float BM_edge_calc_face_angle_with_imat3_ex(const BMEdge *e, float imat3[3][3], const float fallback)
+{
+       if (BM_edge_is_manifold(e)) {
+               const BMLoop *l1 = e->l;
+               const BMLoop *l2 = e->l->radial_next;
+               float no1[3], no2[3];
+               copy_v3_v3(no1, l1->f->no);
+               copy_v3_v3(no2, l2->f->no);
+
+               mul_transposed_m3_v3(imat3, no1);
+               mul_transposed_m3_v3(imat3, no2);
+
+               normalize_v3(no1);
+               normalize_v3(no2);
+
+               return angle_normalized_v3v3(no1, no2);
+       }
+       else {
+               return fallback;
+       }
+}
+float BM_edge_calc_face_angle_with_imat3(const BMEdge *e, float imat3[3][3])
+{
+       return BM_edge_calc_face_angle_with_imat3_ex(e, imat3, DEG2RADF(90.0f));
+}
+
 /**
  * \brief BMESH EDGE/FACE ANGLE
  *
index 51956761d8f4c537899b1d2f1584d3f8fb5dbaf5..fb625c9acc8e9f9648a4c92b0e47fae11712144d 100644 (file)
@@ -123,6 +123,8 @@ void    BM_loop_calc_face_tangent(const BMLoop *l, float r_tangent[3]);
 float   BM_edge_calc_face_angle_ex(const BMEdge *e, const float fallback) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 float   BM_edge_calc_face_angle(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 float   BM_edge_calc_face_angle_signed_ex(const BMEdge *e, const float fallback) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
+float   BM_edge_calc_face_angle_with_imat3_ex(const BMEdge *e, float imat3[3][3], const float fallback) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
+float   BM_edge_calc_face_angle_with_imat3(const BMEdge *e, float imat3[3][3]) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 float   BM_edge_calc_face_angle_signed(const BMEdge *e) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL();
 void    BM_edge_calc_face_tangent(const BMEdge *e, const BMLoop *e_loop, float r_tangent[3]) ATTR_NONNULL();
 
index 2ae87b64286efe2b17b8fc0c0dab84e5e29122bf..9247c64d3fb2d6d70668082baccfa3f888eff22d 100644 (file)
@@ -63,7 +63,9 @@ void bmo_bevel_exec(BMesh *bm, BMOperator *op)
                        }
                }
 
-               BM_mesh_bevel(bm, offset, offset_type, seg, profile, vonly, false, clamp_overlap, NULL, -1, material, loop_slide);
+               BM_mesh_bevel(
+                       bm, offset, offset_type, seg, profile, vonly, false, clamp_overlap, NULL, -1, material,
+                       loop_slide);
 
                BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "faces.out", BM_FACE, BM_ELEM_TAG);
                BMO_slot_buffer_from_enabled_hflag(bm, op, op->slots_out, "edges.out", BM_EDGE, BM_ELEM_TAG);
index 754db5415485232dabd9cb251aecc16636058b34..e55e11e0bdbe72a2ac91e53d89ad92be86d34183 100644 (file)
@@ -32,7 +32,6 @@
 
 #include "MEM_guardedalloc.h"
 
-#include "DNA_object_types.h"
 #include "DNA_meshdata_types.h"
 
 #include "BLI_array.h"
index c45e617dd39045d44a6801eae7dc7fa794a5cce8..57e0e0b44caf3c1341488f8cac361126e6f94d19 100644 (file)
@@ -28,7 +28,6 @@
 
 #include "MEM_guardedalloc.h"
 
-#include "DNA_object_types.h"
 #include "DNA_meshdata_types.h"
 
 #include "BLI_math.h"