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

gizmo_library_presets.c « gizmo_library « editors « blender « source - git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: 1ac4ce0bcdfd2cd38c07aa0926873700fd592887 (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
/* SPDX-License-Identifier: GPL-2.0-or-later */

/** \file
 * \ingroup edgizmolib
 *
 * \name Gizmo Lib Presets
 *
 * \brief Preset shapes that can be drawn from any gizmo type.
 */

#include "BLI_math.h"

#include "DNA_object_types.h"

#include "BKE_context.h"

#include "GPU_matrix.h"
#include "GPU_select.h"

#include "DEG_depsgraph.h"

#include "WM_types.h"

#include "ED_view3d.h"

/* own includes */
#include "ED_gizmo_library.h"     /* own include */
#include "gizmo_library_intern.h" /* own include */

/* TODO: this is to be used by RNA. might move to ED_gizmo_library. */

/**
 * Given a single axis, orient the matrix to a different direction.
 */
static void single_axis_convert(int src_axis,
                                const float src_mat[4][4],
                                int dst_axis,
                                float dst_mat[4][4])
{
  copy_m4_m4(dst_mat, src_mat);
  if (src_axis == dst_axis) {
    return;
  }

  float rotmat[3][3];
  mat3_from_axis_conversion_single(src_axis, dst_axis, rotmat);
  transpose_m3(rotmat);
  mul_m4_m4m3(dst_mat, src_mat, rotmat);
}

/**
 * Use for all geometry.
 */
static void ed_gizmo_draw_preset_geometry(const struct wmGizmo *gz,
                                          const float mat[4][4],
                                          int select_id,
                                          const GizmoGeomInfo *info)
{
  const bool is_select = (select_id != -1);
  const bool is_highlight = is_select && (gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0;

  float color[4];
  gizmo_color_get(gz, is_highlight, color);

  if (is_select) {
    GPU_select_load_id(select_id);
  }

  GPU_matrix_push();
  GPU_matrix_mul(mat);
  wm_gizmo_geometryinfo_draw(info, is_select, color);
  GPU_matrix_pop();

  if (is_select) {
    GPU_select_load_id(-1);
  }
}

void ED_gizmo_draw_preset_box(const struct wmGizmo *gz, float mat[4][4], int select_id)
{
  ed_gizmo_draw_preset_geometry(gz, mat, select_id, &wm_gizmo_geom_data_cube);
}

void ED_gizmo_draw_preset_arrow(const struct wmGizmo *gz, float mat[4][4], int axis, int select_id)
{
  float mat_rotate[4][4];
  single_axis_convert(OB_POSZ, mat, axis, mat_rotate);
  ed_gizmo_draw_preset_geometry(gz, mat_rotate, select_id, &wm_gizmo_geom_data_arrow);
}

void ED_gizmo_draw_preset_circle(const struct wmGizmo *gz,
                                 float mat[4][4],
                                 int axis,
                                 int select_id)
{
  float mat_rotate[4][4];
  single_axis_convert(OB_POSZ, mat, axis, mat_rotate);
  ed_gizmo_draw_preset_geometry(gz, mat_rotate, select_id, &wm_gizmo_geom_data_dial);
}

void ED_gizmo_draw_preset_facemap(
    const bContext *C, const struct wmGizmo *gz, Object *ob, const int facemap, int select_id)
{
  /* Dependency graph is supposed to be evaluated prior to draw. */
  Depsgraph *depsgraph = CTX_data_expect_evaluated_depsgraph(C);
  const bool is_select = (select_id != -1);
  const bool is_highlight = is_select && (gz->state & WM_GIZMO_STATE_HIGHLIGHT) != 0;

  float color[4];
  gizmo_color_get(gz, is_highlight, color);

  if (is_select) {
    GPU_select_load_id(select_id);
  }

  GPU_matrix_push();
  GPU_matrix_mul(ob->obmat);
  ED_draw_object_facemap(depsgraph, ob, color, facemap);
  GPU_matrix_pop();

  if (is_select) {
    GPU_select_load_id(-1);
  }
}