Cleanup: Use `ED_view3d_win_to_ray_ex` to get the ray and remove unused parameter.
[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 Depsgraph;
33 struct ListBase;
34 struct Scene;
35 struct ViewLayer;
36 struct Main;
37 struct Object;
38 struct ARegion;
39 struct View3D;
40 struct bContext;
41
42 /* transform_snap_object.c */
43
44 /* ED_transform_snap_object_*** API */
45
46 typedef enum eSnapSelect {
47         SNAP_ALL = 0,
48         SNAP_NOT_SELECTED = 1,
49         SNAP_NOT_ACTIVE = 2,
50 } eSnapSelect;
51
52 /** used for storing multiple hits */
53 struct SnapObjectHitDepth {
54         struct SnapObjectHitDepth *next, *prev;
55
56         float depth;
57         float co[3];
58         float no[3];
59         int index;
60
61         struct Object *ob;
62         float obmat[4][4];
63
64         /* needed to tell which ray-cast this was part of,
65          * the same object may be part of many ray-casts when dupli's are used. */
66         unsigned int ob_uuid;
67 };
68
69 /** parameters that define which objects will be used to snap. */
70 struct SnapObjectParams {
71         /* special context sensitive handling for the active or selected object */
72         char snap_select;
73         /* use editmode cage */
74         unsigned int use_object_edit_cage : 1;
75         /* snap to the closest element, use when using more than one snap type */
76         unsigned int use_occlusion_test   : 1;
77
78 };
79
80 typedef struct SnapObjectContext SnapObjectContext;
81 SnapObjectContext *ED_transform_snap_object_context_create(
82         struct Main *bmain, struct Scene *scene, struct Depsgraph *depsgraph, int flag);
83 SnapObjectContext *ED_transform_snap_object_context_create_view3d(
84         struct Main *bmain, struct Scene *scene, struct Depsgraph *depsgraph, int flag,
85         /* extra args for view3d */
86         const struct ARegion *ar, const struct View3D *v3d);
87 void ED_transform_snap_object_context_destroy(SnapObjectContext *sctx);
88
89 /* callbacks to filter how snap works */
90 void ED_transform_snap_object_context_set_editmesh_callbacks(
91         SnapObjectContext *sctx,
92         bool (*test_vert_fn)(struct BMVert *, void *user_data),
93         bool (*test_edge_fn)(struct BMEdge *, void *user_data),
94         bool (*test_face_fn)(struct BMFace *, void *user_data),
95         void *user_data);
96
97 bool ED_transform_snap_object_project_ray_ex(
98         struct SnapObjectContext *sctx,
99         const struct SnapObjectParams *params,
100         const float ray_start[3], const float ray_normal[3], float *ray_depth,
101         /* return args */
102         float r_loc[3], float r_no[3], int *r_index,
103         struct Object **r_ob, float r_obmat[4][4]);
104 bool ED_transform_snap_object_project_ray(
105         SnapObjectContext *sctx,
106         const struct SnapObjectParams *params,
107         const float ray_origin[3], const float ray_direction[3], float *ray_depth,
108         float r_co[3], float r_no[3]);
109
110 bool ED_transform_snap_object_project_ray_all(
111         SnapObjectContext *sctx,
112         const struct SnapObjectParams *params,
113         const float ray_start[3], const float ray_normal[3],
114         float ray_depth, bool sort,
115         struct ListBase *r_hit_list);
116
117 bool ED_transform_snap_object_project_view3d_ex(
118         struct SnapObjectContext *sctx,
119         const unsigned short snap_to,
120         const struct SnapObjectParams *params,
121         const float mval[2], float *dist_px,
122         float r_loc[3], float r_no[3], int *r_index,
123         struct Object **r_ob, float r_obmat[4][4]);
124 bool ED_transform_snap_object_project_view3d(
125         struct SnapObjectContext *sctx,
126         const unsigned short snap_to,
127         const struct SnapObjectParams *params,
128         const float mval[2], float *dist_px,
129         /* return args */
130         float r_loc[3], float r_no[3]);
131 bool ED_transform_snap_object_project_view3d_mixed(
132         SnapObjectContext *sctx,
133         const unsigned short snap_to_flag,
134         const struct SnapObjectParams *params,
135         const float mval_fl[2], float *dist_px,
136         float r_co[3], float r_no[3]);
137
138 bool ED_transform_snap_object_project_all_view3d_ex(
139         SnapObjectContext *sctx,
140         const struct SnapObjectParams *params,
141         const float mval[2],
142         float ray_depth, bool sort,
143         ListBase *r_hit_list);
144
145 #endif  /* __ED_TRANSFORM_SNAP_OBJECT_CONTEXT_H__ */