Merged changes in the trunk up to revision 45133.
[blender.git] / source / blender / bmesh / intern / bmesh_operator_api_inline.h
1 /*
2  * ***** BEGIN GPL LICENSE BLOCK *****
3  *
4  * This program is free software; you can redistribute it and/or
5  * modify it under the terms of the GNU General Public License
6  * as published by the Free Software Foundation; either version 2
7  * of the License, or (at your option) any later version.
8  *
9  * This program is distributed in the hope that it will be useful,
10  * but WITHOUT ANY WARRANTY; without even the implied warranty of
11  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
12  * GNU General Public License for more details.
13  *
14  * You should have received a copy of the GNU General Public License
15  * along with this program; if not, write to the Free Software Foundation,
16  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
17  *
18  * Contributor(s): Joseph Eagar, Geoffrey Bantle, Campbell Barton
19  *
20  * ***** END GPL LICENSE BLOCK *****
21  */
22
23 /** \file blender/bmesh/intern/bmesh_operator_api_inline.h
24  *  \ingroup bmesh
25  *
26  * BMesh inline operator functions.
27  */
28
29 #ifndef __BMESH_OPERATOR_API_INLINE_H__
30 #define __BMESH_OPERATOR_API_INLINE_H__
31
32 /* tool flag API. never, ever ever should tool code put junk in
33  * header flags (element->head.flag), nor should they use
34  * element->head.eflag1/eflag2.  instead, use this api to set
35  * flags.
36  *
37  * if you need to store a value per element, use a
38  * ghash or a mapping slot to do it. */
39
40 /* flags 15 and 16 (1 << 14 and 1 << 15) are reserved for bmesh api use */
41 BLI_INLINE short _bmo_elem_flag_test(BMesh *bm, BMFlagLayer *oflags, const short oflag)
42 {
43     return oflags[bm->stackdepth - 1].f & oflag;
44 }
45
46 BLI_INLINE void _bmo_elem_flag_enable(BMesh *bm, BMFlagLayer *oflags, const short oflag)
47 {
48         oflags[bm->stackdepth - 1].f |= oflag;
49 }
50
51 BLI_INLINE void _bmo_elem_flag_disable(BMesh *bm, BMFlagLayer *oflags, const short oflag)
52 {
53         oflags[bm->stackdepth - 1].f &= ~oflag;
54 }
55
56 BLI_INLINE void _bmo_elem_flag_set(BMesh *bm, BMFlagLayer *oflags, const short oflag, int val)
57 {
58         if (val) oflags[bm->stackdepth - 1].f |= oflag;
59         else     oflags[bm->stackdepth - 1].f &= ~oflag;
60 }
61
62 BLI_INLINE void _bmo_elem_flag_toggle(BMesh *bm, BMFlagLayer *oflags, const short oflag)
63 {
64         oflags[bm->stackdepth - 1].f ^= oflag;
65 }
66
67 BLI_INLINE void BMO_slot_map_int_insert(BMesh *bm, BMOperator *op, const char *slotname,
68                                        void *element, int val)
69 {
70         BMO_slot_map_insert(bm, op, slotname, element, &val, sizeof(int));
71 }
72
73 BLI_INLINE void BMO_slot_map_float_insert(BMesh *bm, BMOperator *op, const char *slotname,
74                                          void *element, float val)
75 {
76         BMO_slot_map_insert(bm, op, slotname, element, &val, sizeof(float));
77 }
78
79
80 /* pointer versions of BMO_slot_map_float_get and BMO_slot_map_float_insert.
81  *
82  * do NOT use these for non-operator-api-allocated memory! instead
83  * use BMO_slot_map_data_get and BMO_slot_map_insert, which copies the data. */
84
85 BLI_INLINE void BMO_slot_map_ptr_insert(BMesh *bm, BMOperator *op, const char *slotname,
86                                        void *element, void *val)
87 {
88         BMO_slot_map_insert(bm, op, slotname, element, &val, sizeof(void *));
89 }
90
91 BLI_INLINE int BMO_slot_map_contains(BMesh *UNUSED(bm), BMOperator *op, const char *slotname, void *element)
92 {
93         BMOpSlot *slot = BMO_slot_get(op, slotname);
94         BLI_assert(slot->slottype == BMO_OP_SLOT_MAPPING);
95
96         /* sanity check */
97         if (!slot->data.ghash) return 0;
98
99         return BLI_ghash_haskey(slot->data.ghash, element);
100 }
101
102 BLI_INLINE void *BMO_slot_map_data_get(BMesh *UNUSED(bm), BMOperator *op, const char *slotname,
103                                       void *element)
104 {
105         BMOElemMapping *mapping;
106         BMOpSlot *slot = BMO_slot_get(op, slotname);
107         BLI_assert(slot->slottype == BMO_OP_SLOT_MAPPING);
108
109         /* sanity check */
110         if (!slot->data.ghash) return NULL;
111
112         mapping = (BMOElemMapping *)BLI_ghash_lookup(slot->data.ghash, element);
113
114         if (!mapping) return NULL;
115
116         return mapping + 1;
117 }
118
119 BLI_INLINE float BMO_slot_map_float_get(BMesh *bm, BMOperator *op, const char *slotname,
120                                        void *element)
121 {
122         float *val = (float *) BMO_slot_map_data_get(bm, op, slotname, element);
123         if (val) return *val;
124
125         return 0.0f;
126 }
127
128 BLI_INLINE int BMO_slot_map_int_get(BMesh *bm, BMOperator *op, const char *slotname,
129                                    void *element)
130 {
131         int *val = (int *) BMO_slot_map_data_get(bm, op, slotname, element);
132         if (val) return *val;
133
134         return 0;
135 }
136
137 BLI_INLINE void *BMO_slot_map_ptr_get(BMesh *bm, BMOperator *op, const char *slotname,
138                                      void *element)
139 {
140         void **val = (void **) BMO_slot_map_data_get(bm, op, slotname, element);
141         if (val) return *val;
142
143         return NULL;
144 }
145
146 #endif /* __BMESH_OPERATOR_API_INLINE_H__ */