6eaae49912cc1a44a4b59be8db3c3a9954939197
[blender.git] / source / blender / editors / include / ED_transform_snap_object_context.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  * ***** END GPL LICENSE BLOCK *****
19  */
20
21 /** \file ED_transform_snap_object_context.h
22  *  \ingroup editors
23  */
24
25 #ifndef __ED_TRANSFORM_SNAP_OBJECT_CONTEXT_H__
26 #define __ED_TRANSFORM_SNAP_OBJECT_CONTEXT_H__
27
28 struct BMVert;
29 struct BMEdge;
30 struct BMFace;
31
32 struct ListBase;
33 struct Scene;
34 struct Main;
35 struct Object;
36 struct ARegion;
37 struct View3D;
38
39 /* transform_snap_object.c */
40
41 /* ED_transform_snap_object_*** API */
42
43 /** used for storing multiple hits */
44 struct SnapObjectHitDepth {
45         struct SnapObjectHitDepth *next, *prev;
46
47         float depth;
48         float co[3];
49         float no[3];
50         int index;
51
52         struct Object *ob;
53         float obmat[4][4];
54
55         /* needed to tell which ray-cast this was part of,
56          * the same object may be part of many ray-casts when dupli's are used. */
57         unsigned int ob_uuid;
58 };
59
60 /** parameters that define which objects will be used to snap. */
61 struct SnapObjectParams {
62         /* special context sensitive handling for the active or selected object */
63         char snap_select;
64         /* use editmode cage */
65         unsigned int use_object_edit_cage : 1;
66 };
67
68 typedef struct SnapObjectContext SnapObjectContext;
69 SnapObjectContext *ED_transform_snap_object_context_create(
70         struct Main *bmain, struct Scene *scene, int flag);
71 SnapObjectContext *ED_transform_snap_object_context_create_view3d(
72         struct Main *bmain, struct Scene *scene, int flag,
73         /* extra args for view3d */
74         const struct ARegion *ar, const struct View3D *v3d);
75 void ED_transform_snap_object_context_destroy(SnapObjectContext *sctx);
76
77 /* callbacks to filter how snap works */
78 void ED_transform_snap_object_context_set_editmesh_callbacks(
79         SnapObjectContext *sctx,
80         bool (*test_vert_fn)(struct BMVert *, void *user_data),
81         bool (*test_edge_fn)(struct BMEdge *, void *user_data),
82         bool (*test_face_fn)(struct BMFace *, void *user_data),
83         void *user_data);
84
85 bool ED_transform_snap_object_project_ray_ex(
86         struct SnapObjectContext *sctx,
87         const unsigned short snap_to,
88         const struct SnapObjectParams *params,
89         const float ray_start[3], const float ray_normal[3], float *ray_depth,
90         /* return args */
91         float r_loc[3], float r_no[3], int *r_index,
92         struct Object **r_ob, float r_obmat[4][4]);
93 bool ED_transform_snap_object_project_ray(
94         SnapObjectContext *sctx,
95         const struct SnapObjectParams *params,
96         const float ray_origin[3], const float ray_direction[3], float *ray_depth,
97         float r_co[3], float r_no[3]);
98
99 bool ED_transform_snap_object_project_ray_all(
100         SnapObjectContext *sctx,
101         const unsigned short snap_to,
102         const struct SnapObjectParams *params,
103         const float ray_start[3], const float ray_normal[3],
104         float ray_depth, bool sort,
105         struct ListBase *r_hit_list);
106
107 bool ED_transform_snap_object_project_view3d_ex(
108         struct SnapObjectContext *sctx,
109         const unsigned short snap_to,
110         const struct SnapObjectParams *params,
111         const float mval[2], float *dist_px,
112         float *ray_depth,
113         float r_loc[3], float r_no[3], int *r_index);
114 bool ED_transform_snap_object_project_view3d(
115         struct SnapObjectContext *sctx,
116         const unsigned short snap_to,
117         const struct SnapObjectParams *params,
118         const float mval[2], float *dist_px,
119         float *ray_depth,
120         /* return args */
121         float r_loc[3], float r_no[3]);
122 bool ED_transform_snap_object_project_view3d_mixed(
123         SnapObjectContext *sctx,
124         const unsigned short snap_to_flag,
125         const struct SnapObjectParams *params,
126         const float mval_fl[2], float *dist_px,
127         bool use_depth,
128         float r_co[3], float r_no[3]);
129
130 bool ED_transform_snap_object_project_all_view3d_ex(
131         SnapObjectContext *sctx,
132         const struct SnapObjectParams *params,
133         const float mval[2],
134         float ray_depth, bool sort,
135         ListBase *r_hit_list);
136
137 #endif  /* __ED_TRANSFORM_SNAP_OBJECT_CONTEXT_H__ */