Blender  V3.3
primitive3d_gizmo.c
Go to the documentation of this file.
1 /* SPDX-License-Identifier: GPL-2.0-or-later */
2 
14 #include "MEM_guardedalloc.h"
15 
16 #include "BLI_math.h"
17 
18 #include "DNA_view3d_types.h"
19 
20 #include "BKE_context.h"
21 
22 #include "GPU_immediate.h"
23 #include "GPU_matrix.h"
24 #include "GPU_select.h"
25 #include "GPU_state.h"
26 
27 #include "RNA_access.h"
28 #include "RNA_define.h"
29 
30 #include "WM_api.h"
31 #include "WM_types.h"
32 
33 #include "ED_gizmo_library.h"
34 
35 /* own includes */
36 #include "../gizmo_library_intern.h"
37 
38 static float verts_plane[4][3] = {
39  {-1, -1, 0},
40  {1, -1, 0},
41  {1, 1, 0},
42  {-1, 1, 0},
43 };
44 
45 /* -------------------------------------------------------------------- */
46 
47 static void gizmo_primitive_draw_geom(const float col_inner[4],
48  const float col_outer[4],
49  const int draw_style)
50 {
51  float(*verts)[3];
52  uint vert_count = 0;
53 
54  if (draw_style == ED_GIZMO_PRIMITIVE_STYLE_PLANE) {
56  vert_count = ARRAY_SIZE(verts_plane);
57  }
58 
59  if (vert_count > 0) {
62  wm_gizmo_vec_draw(col_inner, verts, vert_count, pos, GPU_PRIM_TRI_FAN);
63  wm_gizmo_vec_draw(col_outer, verts, vert_count, pos, GPU_PRIM_LINE_LOOP);
65  }
66 }
67 
69  const bool UNUSED(select),
70  const bool highlight)
71 {
72  float color_inner[4], color_outer[4];
73  float matrix_final[4][4];
74  const int draw_style = RNA_enum_get(gz->ptr, "draw_style");
75 
76  gizmo_color_get(gz, highlight, color_outer);
77  copy_v4_v4(color_inner, color_outer);
78  color_inner[3] *= 0.5f;
79 
80  WM_gizmo_calc_matrix_final(gz, matrix_final);
81 
83  GPU_matrix_mul(matrix_final);
84 
86  gizmo_primitive_draw_geom(color_inner, color_outer, draw_style);
88 
90 
91  if (gz->interaction_data) {
93 
94  copy_v4_fl(color_inner, 0.5f);
95  copy_v3_fl(color_outer, 0.5f);
96  color_outer[3] = 0.8f;
97 
100 
102  gizmo_primitive_draw_geom(color_inner, color_outer, draw_style);
104 
105  GPU_matrix_pop();
106  }
107 }
108 
109 static void gizmo_primitive_draw_select(const bContext *UNUSED(C), wmGizmo *gz, int select_id)
110 {
111  GPU_select_load_id(select_id);
112  gizmo_primitive_draw_intern(gz, true, false);
113 }
114 
115 static void gizmo_primitive_draw(const bContext *UNUSED(C), wmGizmo *gz)
116 {
118 }
119 
121 {
122  gz->flag |= WM_GIZMO_DRAW_MODAL;
123 }
124 
125 static int gizmo_primitive_invoke(bContext *UNUSED(C), wmGizmo *gz, const wmEvent *UNUSED(event))
126 {
127  GizmoInteraction *inter = MEM_callocN(sizeof(GizmoInteraction), __func__);
128 
130 
131  gz->interaction_data = inter;
132 
133  return OPERATOR_RUNNING_MODAL;
134 }
135 
136 /* -------------------------------------------------------------------- */
141 {
142  /* identifiers */
143  gzt->idname = "GIZMO_GT_primitive_3d";
144 
145  /* api callbacks */
146  gzt->draw = gizmo_primitive_draw;
150 
151  gzt->struct_size = sizeof(wmGizmo);
152 
153  static EnumPropertyItem rna_enum_draw_style[] = {
154  {ED_GIZMO_PRIMITIVE_STYLE_PLANE, "PLANE", 0, "Plane", ""},
155  {0, NULL, 0, NULL, NULL},
156  };
157  RNA_def_enum(gzt->srna,
158  "draw_style",
159  rna_enum_draw_style,
161  "Draw Style",
162  "");
163 }
164 
166 {
168 }
169 
typedef float(TangentPoint)[2]
MINLINE void copy_v4_v4(float r[4], const float a[4])
MINLINE void copy_v3_fl(float r[3], float f)
MINLINE void copy_v4_fl(float r[4], float f)
unsigned int uint
Definition: BLI_sys_types.h:67
#define ARRAY_SIZE(arr)
#define UNUSED(x)
@ OPERATOR_RUNNING_MODAL
@ ED_GIZMO_PRIMITIVE_STYLE_PLANE
void immUnbindProgram(void)
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
GPUVertFormat * immVertexFormat(void)
void GPU_matrix_pop(void)
Definition: gpu_matrix.cc:126
#define GPU_matrix_mul(x)
Definition: GPU_matrix.h:224
void GPU_matrix_push(void)
Definition: gpu_matrix.cc:119
@ GPU_PRIM_TRI_FAN
Definition: GPU_primitive.h:25
@ GPU_PRIM_LINE_LOOP
Definition: GPU_primitive.h:23
bool GPU_select_load_id(unsigned int id)
Definition: gpu_select.c:117
@ GPU_SHADER_3D_UNIFORM_COLOR
Definition: GPU_shader.h:230
@ GPU_BLEND_NONE
Definition: GPU_state.h:60
@ GPU_BLEND_ALPHA
Definition: GPU_state.h:62
void GPU_blend(eGPUBlend blend)
Definition: gpu_state.cc:39
@ GPU_FETCH_FLOAT
uint GPU_vertformat_attr_add(GPUVertFormat *, const char *name, GPUVertCompType, uint comp_len, GPUVertFetchMode)
@ GPU_COMP_F32
Read Guarded memory(de)allocation.
#define C
Definition: RandGen.cpp:25
struct wmGizmo wmGizmo
Definition: WM_api.h:68
@ WM_GIZMO_DRAW_MODAL
@ WM_GIZMO_STATE_HIGHLIGHT
__forceinline const avxb select(const avxb &m, const avxb &t, const avxb &f)
Definition: avxb.h:154
static float verts[][3]
void wm_gizmo_vec_draw(const float color[4], const float(*verts)[3], uint vert_count, uint pos, uint primitive_type)
void gizmo_color_get(const struct wmGizmo *gz, bool highlight, float r_color[4])
uint pos
void *(* MEM_callocN)(size_t len, const char *str)
Definition: mallocn.c:31
void ED_gizmotypes_primitive_3d(void)
static void gizmo_primitive_draw(const bContext *UNUSED(C), wmGizmo *gz)
static void gizmo_primitive_setup(wmGizmo *gz)
static void gizmo_primitive_draw_intern(wmGizmo *gz, const bool UNUSED(select), const bool highlight)
static float verts_plane[4][3]
static int gizmo_primitive_invoke(bContext *UNUSED(C), wmGizmo *gz, const wmEvent *UNUSED(event))
static void gizmo_primitive_draw_select(const bContext *UNUSED(C), wmGizmo *gz, int select_id)
static void GIZMO_GT_primitive_3d(wmGizmoType *gzt)
static void gizmo_primitive_draw_geom(const float col_inner[4], const float col_outer[4], const int draw_style)
int RNA_enum_get(PointerRNA *ptr, const char *name)
Definition: rna_access.c:5004
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, int default_value, const char *ui_name, const char *ui_description)
Definition: rna_define.c:3783
float init_matrix_final[4][4]
wmGizmoFnDraw draw
wmGizmoFnSetup setup
const char * idname
struct StructRNA * srna
wmGizmoFnInvoke invoke
wmGizmoFnDrawSelect draw_select
void * interaction_data
eWM_GizmoFlagState state
struct PointerRNA * ptr
eWM_GizmoFlag flag
void WM_gizmo_calc_matrix_final(const wmGizmo *gz, float r_mat[4][4])
Definition: wm_gizmo.c:554
void WM_gizmotype_append(void(*gtfunc)(struct wmGizmoType *))
Definition: wm_gizmo_type.c:93