Welcome to mirror list, hosted at ThFree Co, Russian Federation.

wm_manipulator_intern.h « intern « manipulators « windowmanager « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: d435130927eb9a65a6bc8a66a2b8036cd6fc0464 (plain)
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
205
206
207
208
209
210
211
212
213
214
215
216
217
/*
 * ***** 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;

/* -------------------------------------------------------------------- */
/* 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 */
	/* pointer back to group this manipulator is in (just for quick access) */
	struct wmManipulatorGroup *mgroup;

	/* could become wmManipulatorType */
	/* draw manipulator */
	void (*draw)(const struct bContext *, struct wmManipulator *);

	/* determine if the mouse intersects with the manipulator. The calculation should be done in the callback itself */
	int  (*intersect)(struct bContext *, const struct wmEvent *, struct wmManipulator *);

	/* determines 3d intersection by rendering the manipulator in a selection routine. */
	void (*render_3d_intersection)(const struct bContext *, struct wmManipulator *, int);

	/* handler used by the manipulator. Usually handles interaction tied to a manipulator type */
	int  (*handler)(struct bContext *, const struct wmEvent *, struct wmManipulator *, const int);

	/* manipulator-specific handler to update manipulator attributes based on the property value */
	void (*prop_data_update)(struct wmManipulator *, int);

	/* returns the final position which may be different from the origin, depending on the manipulator.
	 * used in calculations of scale */
	void (*get_final_position)(struct wmManipulator *, float[]);

	/* activate a manipulator state when the user clicks on it */
	int (*invoke)(struct bContext *, const struct wmEvent *, struct wmManipulator *);

	/* called when manipulator tweaking is done - used to free data and reset property when cancelling */
	void (*exit)(struct bContext *, struct wmManipulator *, const bool );

	int (*get_cursor)(struct wmManipulator *);

	/* called when manipulator selection state changes */
	wmManipulatorSelectFunc select;

	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;

	/* maximum number of properties attached to the manipulator */
	int max_prop;
	/* 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),
};

void wm_manipulator_register(struct wmManipulatorGroup *mgroup, struct wmManipulator *manipulator, const char *name);

bool wm_manipulator_deselect(struct wmManipulatorMap *mmap, struct wmManipulator *manipulator);
bool wm_manipulator_select(struct bContext *C, struct wmManipulatorMap *mmap, struct wmManipulator *manipulator);

void wm_manipulator_calculate_scale(struct wmManipulator *manipulator, const struct bContext *C);
void wm_manipulator_update(struct wmManipulator *manipulator, const struct 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 wmManipulatorGroupType *mgrouptype);
void wm_manipulatorgroup_free(struct bContext *C, struct wmManipulatorMap *mmap, struct wmManipulatorGroup *mgroup);
void wm_manipulatorgroup_manipulator_register(struct wmManipulatorGroup *mgroup, wmManipulator *manipulator);
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(wmManipulatorMap *mmap);
bool wm_manipulatormap_deselect_all(struct wmManipulatorMap *mmap, wmManipulator ***sel);

#endif  /* __WM_MANIPULATOR_INTERN_H__ */