a7c8f1612eb792a3c18dfacd4b1fe7baf1cdf98d
[blender.git] / source / blender / bmesh / intern / bmesh_operator_api_inline.c
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.c
24  *  \ingroup bmesh
25  *
26  * BMesh inline operator functions.
27  */
28
29 #ifndef __BMESH_OPERATOR_API_INLINE_C__
30 #define __BMESH_OPERATOR_API_INLINE_C__
31
32 #include "bmesh.h"
33
34
35 /* tool flag API. never, ever ever should tool code put junk in
36  * header flags (element->head.flag), nor should they use
37  * element->head.eflag1/eflag2.  instead, use this api to set
38  * flags.
39  *
40  * if you need to store a value per element, use a
41  * ghash or a mapping slot to do it. */
42
43 /* flags 15 and 16 (1 << 14 and 1 << 15) are reserved for bmesh api use */
44 BM_INLINE short _bmo_elem_flag_test(BMesh *bm, BMFlagLayer *oflags, const short oflag)
45 {
46     return oflags[bm->stackdepth - 1].f & oflag;
47 }
48
49 BM_INLINE void _bmo_elem_flag_enable(BMesh *bm, BMFlagLayer *oflags, const short oflag)
50 {
51         oflags[bm->stackdepth - 1].f |= oflag;
52 }
53
54 BM_INLINE void _bmo_elem_flag_disable(BMesh *bm, BMFlagLayer *oflags, const short oflag)
55 {
56         oflags[bm->stackdepth - 1].f &= ~oflag;
57 }
58
59 BM_INLINE void _bmo_elem_flag_set(BMesh *bm, BMFlagLayer *oflags, const short oflag, int val)
60 {
61         if (val) oflags[bm->stackdepth - 1].f |= oflag;
62         else     oflags[bm->stackdepth - 1].f &= ~oflag;
63 }
64
65 BM_INLINE void _bmo_elem_flag_toggle(BMesh *bm, BMFlagLayer *oflags, const short oflag)
66 {
67         oflags[bm->stackdepth - 1].f ^= oflag;
68 }
69
70 BM_INLINE void BMO_slot_map_int_insert(BMesh *bm, BMOperator *op, const char *slotname,
71                                        void *element, int val)
72 {
73         BMO_slot_map_insert(bm, op, slotname, element, &val, sizeof(int));
74 }
75
76 BM_INLINE void BMO_slot_map_float_insert(BMesh *bm, BMOperator *op, const char *slotname,
77                                          void *element, float val)
78 {
79         BMO_slot_map_insert(bm, op, slotname, element, &val, sizeof(float));
80 }
81
82
83 /* pointer versions of BMO_slot_map_float_get and BMO_slot_map_float_insert.
84  *
85  * do NOT use these for non-operator-api-allocated memory! instead
86  * use BMO_slot_map_data_get and BMO_slot_map_insert, which copies the data. */
87
88 BM_INLINE void BMO_slot_map_ptr_insert(BMesh *bm, BMOperator *op, const char *slotname,
89                                        void *element, void *val)
90 {
91         BMO_slot_map_insert(bm, op, slotname, element, &val, sizeof(void *));
92 }
93
94 BM_INLINE int BMO_slot_map_contains(BMesh *UNUSED(bm), BMOperator *op, const char *slotname, void *element)
95 {
96         BMOpSlot *slot = BMO_slot_get(op, slotname);
97
98         /*sanity check*/
99         if (slot->slottype != BMO_OP_SLOT_MAPPING) {
100 #ifdef DEBUG
101                 printf("%s: invalid type %d\n", __func__, slot->slottype);
102 #endif
103                 return 0;
104         }
105         if (!slot->data.ghash) return 0;
106
107         return BLI_ghash_haskey(slot->data.ghash, element);
108 }
109
110 BM_INLINE void *BMO_slot_map_data_get(BMesh *UNUSED(bm), BMOperator *op, const char *slotname,
111                                       void *element)
112 {
113         BMOElemMapping *mapping;
114         BMOpSlot *slot = BMO_slot_get(op, slotname);
115
116         /*sanity check*/
117         if (slot->slottype != BMO_OP_SLOT_MAPPING) {
118 #ifdef DEBUG
119                 printf("%s: invalid type %d\n", __func__, slot->slottype);
120 #endif
121                 return NULL;
122         }
123         if (!slot->data.ghash) return NULL;
124
125         mapping = (BMOElemMapping *)BLI_ghash_lookup(slot->data.ghash, element);
126
127         if (!mapping) return NULL;
128
129         return mapping + 1;
130 }
131
132 BM_INLINE float BMO_slot_map_float_get(BMesh *bm, BMOperator *op, const char *slotname,
133                                        void *element)
134 {
135         float *val = (float*) BMO_slot_map_data_get(bm, op, slotname, element);
136         if (val) return *val;
137
138         return 0.0f;
139 }
140
141 BM_INLINE int BMO_slot_map_int_get(BMesh *bm, BMOperator *op, const char *slotname,
142                                    void *element)
143 {
144         int *val = (int*) BMO_slot_map_data_get(bm, op, slotname, element);
145         if (val) return *val;
146
147         return 0;
148 }
149
150 BM_INLINE void *BMO_slot_map_ptr_get(BMesh *bm, BMOperator *op, const char *slotname,
151                                      void *element)
152 {
153         void **val = (void **) BMO_slot_map_data_get(bm, op, slotname, element);
154         if (val) return *val;
155
156         return NULL;
157 }
158
159 #endif /* __BMESH_OPERATOR_API_INLINE_C__ */