skip assigning vars for inline bmesh flag funcs, just cast.
[blender.git] / source / blender / bmesh / bmesh_queries.h
1 #ifndef BMESH_QUERIES_H
2 #define BMESH_QUERIES_H
3 #include <stdio.h>
4
5 /*Queries*/
6
7 /*get the area of face f*/
8 float BM_face_area(BMFace *f);
9
10 /*counts number of elements of type type are in the mesh.*/
11 int BM_Count_Element(struct BMesh *bm, int type);
12
13 /*returns true if v is in f*/
14 int BM_Vert_In_Face(struct BMFace *f, struct BMVert *v);
15
16 // int BM_Verts_In_Face(struct BMFace *f, struct BMVert **varr, int len);
17 int BM_Verts_In_Face(struct BMesh *bm, struct BMFace *f, struct BMVert **varr, int len);
18
19 int BM_Edge_In_Face(struct BMFace *f, struct BMEdge *e);
20
21 int BM_Vert_In_Edge(struct BMEdge *e, struct BMVert *v);
22
23 /*get opposing vert from v in edge e.*/
24 struct BMVert *BM_OtherEdgeVert(struct BMEdge *e, struct BMVert *v);
25
26 /*finds other loop that shares v with e's loop in f.*/
27 struct BMLoop *BM_OtherFaceLoop(BMEdge *e, BMFace *f, BMVert *v);
28
29 //#define BM_OtherEdgeVert(e, v) (v==e->v1?e->v2:e->v1)
30
31 /*returns the edge existing between v1 and v2, or NULL if there isn't one.*/
32 struct BMEdge *BM_Edge_Exist(struct BMVert *v1, struct BMVert *v2);
33
34
35 /*returns number of edges aroudn a vert*/
36 int BM_Vert_EdgeCount(struct BMVert *v);
37
38 /*returns number of faces around an edge*/
39 int BM_Edge_FaceCount(struct BMEdge *e);
40
41 /*returns number of faces around a vert.*/
42 int BM_Vert_FaceCount(struct BMVert *v);
43
44
45 /*returns true if v is a wire vert*/
46 int BM_Wire_Vert(struct BMesh *bm, struct BMVert *v);
47
48 /*returns true if e is a wire edge*/
49 int BM_Wire_Edge(struct BMesh *bm, struct BMEdge *e);
50
51 /*returns true if v is part of a non-manifold edge in the mesh,
52   I believe this includes if it's part of both a wire edge and
53   a face.*/
54 int BM_Nonmanifold_Vert(struct BMesh *bm, struct BMVert *v);
55
56 /*returns true if e is shared by more then two faces.*/
57 int BM_Nonmanifold_Edge(struct BMesh *bm, struct BMEdge *e);
58
59 /*returns true if e is a boundary edge, e.g. has only 1 face bordering it.*/
60 int BM_Boundary_Edge(struct BMEdge *e);
61
62
63 /*returns angle of two faces surrounding an edge.  note there must be
64   exactly two faces sharing the edge.*/
65 float BM_Face_Angle(struct BMesh *bm, struct BMEdge *e);
66
67 /*checks overlapping of existing faces with the verts in varr.*/
68 int BM_Exist_Face_Overlaps(struct BMesh *bm, struct BMVert **varr, int len, struct BMFace **existface);
69
70 /*checks if a face defined by varr already exists.*/
71 int BM_Face_Exists(BMesh *bm, BMVert **varr, int len, BMFace **existface);
72
73
74 /*returns number of edges f1 and f2 share.*/
75 int BM_Face_Sharededges(struct BMFace *f1, struct BMFace *f2);
76
77 /*returns number of faces e1 and e2 share.*/
78 int BM_Edge_Share_Faces(struct BMEdge *e1, struct BMEdge *e2);
79
80 /*checks if a face is valid in the data structure*/
81 int BM_Validate_Face(BMesh *bm, BMFace *face, FILE *err);
82
83 /*each pair of loops defines a new edge, a split.  this function goes
84   through and sets pairs that are geometrically invalid to null.  a
85   split is invalid, if it forms a concave angle or it intersects other
86   edges in the face.*/
87 void BM_LegalSplits(BMesh *bm, BMFace *f, BMLoop *(*loops)[2], int len);
88
89 #endif