Cleanup: remove redundant doxygen \file argument
[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 \ingroup edgizmolib
18  *
19  * \name Gizmo Lib Presets
20  *
21  * \brief Preset shapes that can be drawn from any gizmo type.
22  */
23
24 #include "MEM_guardedalloc.h"
25
26 #include "BLI_math.h"
27
28 #include "DNA_view3d_types.h"
29 #include "DNA_object_types.h"
30
31 #include "BKE_context.h"
32
33 #include "GPU_draw.h"
34 #include "GPU_immediate.h"
35 #include "GPU_immediate_util.h"
36 #include "GPU_matrix.h"
37 #include "GPU_select.h"
38
39 #include "DEG_depsgraph.h"
40
41 #include "RNA_access.h"
42
43 #include "WM_types.h"
44 #include "WM_api.h"
45
46 #include "ED_view3d.h"
47 #include "ED_screen.h"
48
49 /* own includes */
50 #include "ED_gizmo_library.h"  /* own include */
51 #include "gizmo_library_intern.h"  /* own include */
52
53 /* TODO, this is to be used by RNA. might move to ED_gizmo_library */
54
55 /**
56  * Given a single axis, orient the matrix to a different direction.
57  */
58 static void single_axis_convert(
59         int src_axis, float src_mat[4][4],
60         int dst_axis, float dst_mat[4][4])
61 {
62         copy_m4_m4(dst_mat, src_mat);
63         if (src_axis == dst_axis) {
64                 return;
65         }
66
67         float rotmat[3][3];
68         mat3_from_axis_conversion_single(src_axis, dst_axis, rotmat);
69         transpose_m3(rotmat);
70         mul_m4_m4m3(dst_mat, src_mat, rotmat);
71 }
72
73 /**
74  * Use for all geometry.
75  */
76 static void ed_gizmo_draw_preset_geometry(
77         const struct wmGizmo *gz, float mat[4][4], int select_id,
78         const GizmoGeomInfo *info)
79 {
80         const bool is_select = (select_id != -1);
81         const bool is_highlight = is_select && (gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0;
82
83         float color[4];
84         gizmo_color_get(gz, is_highlight, color);
85
86         if (is_select) {
87                 GPU_select_load_id(select_id);
88         }
89
90         GPU_matrix_push();
91         GPU_matrix_mul(mat);
92         wm_gizmo_geometryinfo_draw(info, is_select, color);
93         GPU_matrix_pop();
94
95         if (is_select) {
96                 GPU_select_load_id(-1);
97         }
98 }
99
100 void ED_gizmo_draw_preset_box(
101         const struct wmGizmo *gz, float mat[4][4], int select_id)
102 {
103         ed_gizmo_draw_preset_geometry(gz, mat, select_id, &wm_gizmo_geom_data_cube);
104 }
105
106 void ED_gizmo_draw_preset_arrow(
107         const struct wmGizmo *gz, float mat[4][4], int axis, int select_id)
108 {
109         float mat_rotate[4][4];
110         single_axis_convert(OB_POSZ, mat, axis, mat_rotate);
111         ed_gizmo_draw_preset_geometry(gz, mat_rotate, select_id, &wm_gizmo_geom_data_arrow);
112 }
113
114 void ED_gizmo_draw_preset_circle(
115         const struct wmGizmo *gz, float mat[4][4], int axis, int select_id)
116 {
117         float mat_rotate[4][4];
118         single_axis_convert(OB_POSZ, mat, axis, mat_rotate);
119         ed_gizmo_draw_preset_geometry(gz, mat_rotate, select_id, &wm_gizmo_geom_data_dial);
120 }
121
122 void ED_gizmo_draw_preset_facemap(
123         const bContext *C, const struct wmGizmo *gz, Object *ob, const int facemap, int select_id)
124 {
125         const bool is_select = (select_id != -1);
126         const bool is_highlight = is_select && (gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0;
127
128         float color[4];
129         gizmo_color_get(gz, is_highlight, color);
130
131         if (is_select) {
132                 GPU_select_load_id(select_id);
133         }
134
135         GPU_matrix_push();
136         GPU_matrix_mul(ob->obmat);
137         ED_draw_object_facemap(CTX_data_depsgraph(C), ob, color, facemap);
138         GPU_matrix_pop();
139
140         if (is_select) {
141                 GPU_select_load_id(-1);
142         }
143 }