doxygen: add newline after \file
[blender.git] / source / blender / editors / gizmo_library / gizmo_library_presets.c
1 /*
2  * This program is free software; you can redistribute it and/or
3  * modify it under the terms of the GNU General Public License
4  * as published by the Free Software Foundation; either version 2
5  * of the License, or (at your option) any later version.
6  *
7  * This program is distributed in the hope that it will be useful,
8  * but WITHOUT ANY WARRANTY; without even the implied warranty of
9  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
10  * GNU General Public License for more details.
11  *
12  * You should have received a copy of the GNU General Public License
13  * along with this program; if not, write to the Free Software Foundation,
14  * Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
15  */
16
17 /** \file
18  * \ingroup edgizmolib
19  *
20  * \name Gizmo Lib Presets
21  *
22  * \brief Preset shapes that can be drawn from any gizmo type.
23  */
24
25 #include "MEM_guardedalloc.h"
26
27 #include "BLI_math.h"
28
29 #include "DNA_view3d_types.h"
30 #include "DNA_object_types.h"
31
32 #include "BKE_context.h"
33
34 #include "GPU_draw.h"
35 #include "GPU_immediate.h"
36 #include "GPU_immediate_util.h"
37 #include "GPU_matrix.h"
38 #include "GPU_select.h"
39
40 #include "DEG_depsgraph.h"
41
42 #include "RNA_access.h"
43
44 #include "WM_types.h"
45 #include "WM_api.h"
46
47 #include "ED_view3d.h"
48 #include "ED_screen.h"
49
50 /* own includes */
51 #include "ED_gizmo_library.h"  /* own include */
52 #include "gizmo_library_intern.h"  /* own include */
53
54 /* TODO, this is to be used by RNA. might move to ED_gizmo_library */
55
56 /**
57  * Given a single axis, orient the matrix to a different direction.
58  */
59 static void single_axis_convert(
60         int src_axis, float src_mat[4][4],
61         int dst_axis, float dst_mat[4][4])
62 {
63         copy_m4_m4(dst_mat, src_mat);
64         if (src_axis == dst_axis) {
65                 return;
66         }
67
68         float rotmat[3][3];
69         mat3_from_axis_conversion_single(src_axis, dst_axis, rotmat);
70         transpose_m3(rotmat);
71         mul_m4_m4m3(dst_mat, src_mat, rotmat);
72 }
73
74 /**
75  * Use for all geometry.
76  */
77 static void ed_gizmo_draw_preset_geometry(
78         const struct wmGizmo *gz, float mat[4][4], int select_id,
79         const GizmoGeomInfo *info)
80 {
81         const bool is_select = (select_id != -1);
82         const bool is_highlight = is_select && (gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0;
83
84         float color[4];
85         gizmo_color_get(gz, is_highlight, color);
86
87         if (is_select) {
88                 GPU_select_load_id(select_id);
89         }
90
91         GPU_matrix_push();
92         GPU_matrix_mul(mat);
93         wm_gizmo_geometryinfo_draw(info, is_select, color);
94         GPU_matrix_pop();
95
96         if (is_select) {
97                 GPU_select_load_id(-1);
98         }
99 }
100
101 void ED_gizmo_draw_preset_box(
102         const struct wmGizmo *gz, float mat[4][4], int select_id)
103 {
104         ed_gizmo_draw_preset_geometry(gz, mat, select_id, &wm_gizmo_geom_data_cube);
105 }
106
107 void ED_gizmo_draw_preset_arrow(
108         const struct wmGizmo *gz, float mat[4][4], int axis, int select_id)
109 {
110         float mat_rotate[4][4];
111         single_axis_convert(OB_POSZ, mat, axis, mat_rotate);
112         ed_gizmo_draw_preset_geometry(gz, mat_rotate, select_id, &wm_gizmo_geom_data_arrow);
113 }
114
115 void ED_gizmo_draw_preset_circle(
116         const struct wmGizmo *gz, float mat[4][4], int axis, int select_id)
117 {
118         float mat_rotate[4][4];
119         single_axis_convert(OB_POSZ, mat, axis, mat_rotate);
120         ed_gizmo_draw_preset_geometry(gz, mat_rotate, select_id, &wm_gizmo_geom_data_dial);
121 }
122
123 void ED_gizmo_draw_preset_facemap(
124         const bContext *C, const struct wmGizmo *gz, Object *ob, const int facemap, int select_id)
125 {
126         const bool is_select = (select_id != -1);
127         const bool is_highlight = is_select && (gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0;
128
129         float color[4];
130         gizmo_color_get(gz, is_highlight, color);
131
132         if (is_select) {
133                 GPU_select_load_id(select_id);
134         }
135
136         GPU_matrix_push();
137         GPU_matrix_mul(ob->obmat);
138         ED_draw_object_facemap(CTX_data_depsgraph(C), ob, color, facemap);
139         GPU_matrix_pop();
140
141         if (is_select) {
142                 GPU_select_load_id(-1);
143         }
144 }