1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
|
/*
* ***** BEGIN GPL LICENSE BLOCK *****
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License
* as published by the Free Software Foundation; either version 2
* of the License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software Foundation,
* Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
*
* Contributor(s): none yet.
*
* ***** END GPL LICENSE BLOCK *****
*/
/** \file blender/windowmanager/manipulators/intern/wm_manipulator_intern.h
* \ingroup wm
*/
#ifndef __WM_MANIPULATOR_INTERN_H__
#define __WM_MANIPULATOR_INTERN_H__
struct wmKeyConfig;
struct wmManipulatorMap;
struct ManipulatorGeomInfo;
struct GHashIterator;
#include "wm_manipulator_fn.h"
/* -------------------------------------------------------------------- */
/* wmManipulator */
/* manipulators are set per region by registering them on manipulator-maps */
struct wmManipulator {
struct wmManipulator *next, *prev;
char idname[MAX_NAME + 4]; /* + 4 for unique '.001', '.002', etc suffix */
/* While we don't have a real type, use this to put type-like vars. */
const struct wmManipulatorType *type;
/* Overrides 'type->handler' when set. */
wmManipulatorFnHandler custom_handler;
void *custom_data;
/* pointer back to group this manipulator is in (just for quick access) */
struct wmManipulatorGroup *parent_mgroup;
int flag; /* flags that influence the behavior or how the manipulators are drawn */
short state; /* state flags (active, highlighted, selected) */
unsigned char highlighted_part;
/* center of manipulator in space, 2d or 3d */
float origin[3];
/* custom offset from origin */
float offset[3];
/* runtime property, set the scale while drawing on the viewport */
float scale;
/* user defined scale, in addition to the original one */
float user_scale;
/* user defined width for line drawing */
float line_width;
/* manipulator colors (uses default fallbacks if not defined) */
float col[4], col_hi[4];
/* data used during interaction */
void *interaction_data;
/* name of operator to spawn when activating the manipulator */
const char *opname;
/* operator properties if manipulator spawns and controls an operator,
* or owner pointer if manipulator spawns and controls a property */
PointerRNA opptr;
/* arrays of properties attached to various manipulator parameters. As
* the manipulator is interacted with, those properties get updated */
PointerRNA *ptr;
PropertyRNA **props;
};
/* wmManipulator.state */
enum {
WM_MANIPULATOR_HIGHLIGHT = (1 << 0), /* while hovered */
WM_MANIPULATOR_ACTIVE = (1 << 1), /* while dragging */
WM_MANIPULATOR_SELECTED = (1 << 2),
};
/**
* \brief Manipulator tweak flag.
* Bitflag passed to manipulator while tweaking.
*/
enum {
/* drag with extra precision (shift)
* NOTE: Manipulators are responsible for handling this (manipulator->handler callback)! */
WM_MANIPULATOR_TWEAK_PRECISE = (1 << 0),
};
bool wm_manipulator_deselect(struct wmManipulatorMap *mmap, struct wmManipulator *manipulator);
bool wm_manipulator_select(bContext *C, struct wmManipulatorMap *mmap, struct wmManipulator *manipulator);
void wm_manipulator_calculate_scale(struct wmManipulator *manipulator, const bContext *C);
void wm_manipulator_update(struct wmManipulator *manipulator, const bContext *C, const bool refresh_map);
bool wm_manipulator_is_visible(struct wmManipulator *manipulator);
void fix_linking_manipulator_arrow(void);
void fix_linking_manipulator_arrow2d(void);
void fix_linking_manipulator_cage(void);
void fix_linking_manipulator_dial(void);
void fix_linking_manipulator_facemap(void);
void fix_linking_manipulator_primitive(void);
/* -------------------------------------------------------------------- */
/* wmManipulatorGroup */
enum {
TWEAK_MODAL_CANCEL = 1,
TWEAK_MODAL_CONFIRM,
TWEAK_MODAL_PRECISION_ON,
TWEAK_MODAL_PRECISION_OFF,
};
struct wmManipulatorGroup *wm_manipulatorgroup_new_from_type(
struct wmManipulatorMap *mmap, struct wmManipulatorGroupType *mgrouptype);
void wm_manipulatorgroup_free(bContext *C, struct wmManipulatorGroup *mgroup);
void wm_manipulatorgroup_manipulator_register(struct wmManipulatorGroup *mgroup, struct wmManipulator *manipulator);
struct wmManipulator *wm_manipulatorgroup_find_intersected_mainpulator(
const struct wmManipulatorGroup *mgroup, struct bContext *C, const struct wmEvent *event,
unsigned char *part);
void wm_manipulatorgroup_intersectable_manipulators_to_list(
const struct wmManipulatorGroup *mgroup, struct ListBase *listbase);
void wm_manipulatorgroup_ensure_initialized(struct wmManipulatorGroup *mgroup, const struct bContext *C);
bool wm_manipulatorgroup_is_visible(const struct wmManipulatorGroup *mgroup, const struct bContext *C);
bool wm_manipulatorgroup_is_visible_in_drawstep(const struct wmManipulatorGroup *mgroup, const int drawstep);
void wm_manipulatorgrouptype_keymap_init(struct wmManipulatorGroupType *mgrouptype, struct wmKeyConfig *keyconf);
/* -------------------------------------------------------------------- */
/* wmManipulatorMap */
struct wmManipulatorMap {
struct wmManipulatorMap *next, *prev;
struct wmManipulatorMapType *type;
ListBase manipulator_groups;
char update_flag; /* private, update tagging */
/**
* \brief Manipulator map runtime context
*
* Contains information about this manipulator-map. Currently
* highlighted manipulator, currently selected manipulators, ...
*/
struct {
/* we redraw the manipulator-map when this changes */
struct wmManipulator *highlighted_manipulator;
/* user has clicked this manipulator and it gets all input */
struct wmManipulator *active_manipulator;
/* array for all selected manipulators
* TODO check on using BLI_array */
struct wmManipulator **selected_manipulator;
int tot_selected;
} mmap_context;
};
/**
* This is a container for all manipulator types that can be instantiated in a region.
* (similar to dropboxes).
*
* \note There is only ever one of these for every (area, region) combination.
*/
struct wmManipulatorMapType {
struct wmManipulatorMapType *next, *prev;
char idname[64];
short spaceid, regionid;
/* types of manipulator-groups for this manipulator-map type */
ListBase manipulator_grouptypes;
};
void wm_manipulatormap_selected_delete(struct wmManipulatorMap *mmap);
bool wm_manipulatormap_deselect_all(struct wmManipulatorMap *mmap, struct wmManipulator ***sel);
/* -------------------------------------------------------------------- */
/* Manipulator drawing */
void wm_manipulator_geometryinfo_draw(const struct ManipulatorGeomInfo *info, const bool select, const float color[4]);
void wm_manipulator_vec_draw(
const float color[4], const float (*verts)[3], unsigned int vert_count,
unsigned int pos, unsigned int primitive_type);
#endif /* __WM_MANIPULATOR_INTERN_H__ */
|