Blender V4.3
primitive3d_gizmo.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
16#include "MEM_guardedalloc.h"
17
18#include "DNA_screen_types.h"
19#include "DNA_space_types.h"
20#include "DNA_view3d_types.h"
21
22#include "GPU_immediate.hh"
23#include "GPU_matrix.hh"
24#include "GPU_select.hh"
25#include "GPU_state.hh"
26
27#include "RNA_define.hh"
28
29#include "WM_api.hh"
30#include "WM_types.hh"
31
32#include "ED_gizmo_library.hh"
33
34/* own includes */
36
37static float verts_plane[4][3] = {
38 {-1, -1, 0},
39 {1, -1, 0},
40 {1, 1, 0},
41 {-1, 1, 0},
42};
43
51
52/* -------------------------------------------------------------------- */
60
66
68 PropertyRNA * /*prop*/,
69 int value)
70{
72 gz_prim->draw_style = value;
73}
74
80
82 PropertyRNA * /*prop*/,
83 float value)
84{
86 gz_prim->arc_inner_factor = value;
87}
88
94
96 PropertyRNA * /*prop*/,
97 bool value)
98{
100 gz_prim->draw_inner = value;
101}
102
103/* -------------------------------------------------------------------- */
104
106 const float col_inner[4],
107 const float col_outer[4],
108 const int nsegments,
109 const bool draw_inner)
110{
112 const bool use_polyline_shader = gz_prim->gizmo.line_width > 1.0f;
113
114 if (draw_inner || !use_polyline_shader) {
116 }
117
118 if (draw_inner) {
121 }
122 else {
123 immUniformColor4fv(col_inner);
125 imm_draw_circle_fill_3d(pos, 0.0f, 0.0f, 1.0f, nsegments);
126 }
127 else {
130 pos, 0.0f, 0.0f, 0.0f, gz_prim->arc_inner_factor, 1.0f, nsegments, 0.0f, 360.0f);
131 }
132 }
133 }
134
135 /* Draw outline. */
136
137 if (use_polyline_shader) {
138 if (draw_inner) {
140 }
142
143 float viewport[4];
144 GPU_viewport_size_get_f(viewport);
145 immUniform2fv("viewportSize", &viewport[2]);
146 immUniform1f("lineWidth", gz_prim->gizmo.line_width * U.pixelsize);
147 }
148
151 }
152 else {
153 immUniformColor4fv(col_outer);
155 imm_draw_circle_wire_3d(pos, 0.0f, 0.0f, 1.0f, nsegments);
156 }
157 else {
158 imm_draw_circle_wire_3d(pos, 0.0f, 0.0f, gz_prim->arc_inner_factor, nsegments);
159 imm_draw_circle_wire_3d(pos, 0.0f, 0.0f, 1.0f, nsegments);
160 }
161 }
163}
164
165static void gizmo_primitive_draw_intern(wmGizmo *gz, const bool select, const bool highlight)
166{
167 PrimitiveGizmo3D *gz_prim = (PrimitiveGizmo3D *)gz;
168
169 float color_inner[4], color_outer[4];
170 float matrix_final[4][4];
171
172 gizmo_color_get(gz, highlight, color_outer);
173 copy_v4_v4(color_inner, color_outer);
174 color_inner[3] *= 0.5f;
175
176 WM_gizmo_calc_matrix_final(gz, matrix_final);
177
180 GPU_matrix_mul(matrix_final);
181
183 color_inner,
184 color_outer,
185 select ? 24 : DIAL_RESOLUTION,
186 gz_prim->draw_inner || select);
187
189
190 if (gz->interaction_data) {
191 GizmoInteraction *inter = static_cast<GizmoInteraction *>(gz->interaction_data);
192
193 copy_v4_fl(color_inner, 0.5f);
194 copy_v3_fl(color_outer, 0.5f);
195 color_outer[3] = 0.8f;
196
199
201 gz_prim, color_inner, color_outer, DIAL_RESOLUTION, gz_prim->draw_inner);
202
204 }
206}
207
208static void gizmo_primitive_draw_select(const bContext * /*C*/, wmGizmo *gz, int select_id)
209{
210 GPU_select_load_id(select_id);
211 gizmo_primitive_draw_intern(gz, true, false);
212}
213
214static void gizmo_primitive_draw(const bContext * /*C*/, wmGizmo *gz)
215{
217}
218
220{
222
223 /* Default Values. */
224 PrimitiveGizmo3D *gz_prim = (PrimitiveGizmo3D *)gz;
226 gz_prim->arc_inner_factor = 1.0f;
227 gz_prim->draw_inner = true;
228}
229
230static int gizmo_primitive_invoke(bContext * /*C*/, wmGizmo *gz, const wmEvent * /*event*/)
231{
232 GizmoInteraction *inter = static_cast<GizmoInteraction *>(
233 MEM_callocN(sizeof(GizmoInteraction), __func__));
234
236
237 gz->interaction_data = inter;
238
240}
241
242/* -------------------------------------------------------------------- */
247{
248 /* identifiers */
249 gzt->idname = "GIZMO_GT_primitive_3d";
250
251 /* api callbacks */
256
257 gzt->struct_size = sizeof(PrimitiveGizmo3D);
258
259 static const EnumPropertyItem rna_enum_draw_style[] = {
260 {ED_GIZMO_PRIMITIVE_STYLE_PLANE, "PLANE", 0, "Plane", ""},
261 {ED_GIZMO_PRIMITIVE_STYLE_CIRCLE, "CIRCLE", 0, "Circle", ""},
262 {ED_GIZMO_PRIMITIVE_STYLE_ANNULUS, "ANNULUS", 0, "Annulus", ""},
263 {0, nullptr, 0, nullptr, nullptr},
264 };
265
266 PropertyRNA *prop;
267 prop = RNA_def_enum(gzt->srna,
268 "draw_style",
269 rna_enum_draw_style,
271 "Draw Style",
272 "");
276 nullptr);
277
279 gzt->srna, "arc_inner_factor", 0.0f, 0.0f, FLT_MAX, "Arc Inner Factor", "", 0.0f, 1.0f);
283 nullptr);
284
285 prop = RNA_def_boolean(gzt->srna, "draw_inner", true, "Draw Inner", "");
288}
289
294
#define BLI_assert(a)
Definition BLI_assert.h:50
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
#define ARRAY_SIZE(arr)
#define RGN_TYPE_ANY
#define SPACE_TYPE_ANY
@ OPERATOR_RUNNING_MODAL
@ ED_GIZMO_PRIMITIVE_STYLE_ANNULUS
@ ED_GIZMO_PRIMITIVE_STYLE_PLANE
@ ED_GIZMO_PRIMITIVE_STYLE_CIRCLE
void immUniform2fv(const char *name, const float data[2])
void immUnbindProgram()
void immBindBuiltinProgram(eGPUBuiltinShader shader_id)
void immUniform1f(const char *name, float x)
GPUVertFormat * immVertexFormat()
void immUniformColor4fv(const float rgba[4])
void imm_draw_disk_partial_fill_3d(uint pos, float x, float y, float z, float rad_inner, float rad_outer, int nsegments, float start, float sweep)
void imm_draw_circle_wire_3d(uint pos, float x, float y, float radius, int nsegments)
void imm_draw_circle_fill_3d(uint pos, float x, float y, float radius, int nsegments)
void GPU_matrix_push()
#define GPU_matrix_mul(x)
void GPU_matrix_pop()
@ GPU_PRIM_TRI_FAN
@ GPU_PRIM_LINE_LOOP
bool GPU_select_load_id(unsigned int id)
@ GPU_SHADER_3D_POLYLINE_UNIFORM_COLOR
@ GPU_SHADER_3D_UNIFORM_COLOR
@ GPU_BLEND_NONE
Definition GPU_state.hh:85
@ GPU_BLEND_ALPHA
Definition GPU_state.hh:87
void GPU_blend(eGPUBlend blend)
Definition gpu_state.cc:42
void GPU_viewport_size_get_f(float coords[4])
Definition gpu_state.cc:262
@ 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.
@ WM_GIZMO_DRAW_MODAL
@ WM_GIZMO_STATE_HIGHLIGHT
unsigned int U
Definition btGjkEpa3.h:78
void wm_gizmo_vec_draw(const float color[4], const float(*verts)[3], uint vert_count, uint pos, uint primitive_type)
wmGizmo * gizmo_find_from_properties(const IDProperty *properties, const int spacetype, const int regionid)
void gizmo_color_get(const wmGizmo *gz, bool highlight, float r_color[4])
#define DIAL_RESOLUTION
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
ccl_device_inline float4 select(const int4 mask, const float4 a, const float4 b)
static void gizmo_primitive_draw_select(const bContext *, wmGizmo *gz, int select_id)
static bool gizmo_primitive_rna__draw_inner_get_fn(PointerRNA *ptr, PropertyRNA *)
static void gizmo_primitive_draw_geom(PrimitiveGizmo3D *gz_prim, const float col_inner[4], const float col_outer[4], const int nsegments, const bool draw_inner)
void ED_gizmotypes_primitive_3d()
static PrimitiveGizmo3D * gizmo_primitive_rna_find_operator(PointerRNA *ptr)
static void gizmo_primitive_rna__draw_inner_set_fn(PointerRNA *ptr, PropertyRNA *, bool value)
static void gizmo_primitive_setup(wmGizmo *gz)
static void gizmo_primitive_rna__draw_style_set_fn(PointerRNA *ptr, PropertyRNA *, int value)
static float verts_plane[4][3]
static void gizmo_primitive_draw(const bContext *, wmGizmo *gz)
static int gizmo_primitive_invoke(bContext *, wmGizmo *gz, const wmEvent *)
static void gizmo_primitive_draw_intern(wmGizmo *gz, const bool select, const bool highlight)
static float gizmo_primitive_rna__arc_inner_factor_get_fn(PointerRNA *ptr, PropertyRNA *)
static void GIZMO_GT_primitive_3d(wmGizmoType *gzt)
static int gizmo_primitive_rna__draw_style_get_fn(PointerRNA *ptr, PropertyRNA *)
static void gizmo_primitive_rna__arc_inner_factor_set_fn(PointerRNA *ptr, PropertyRNA *, float value)
PropertyRNA * RNA_def_float_factor(StructOrFunctionRNA *cont_, const char *identifier, const float default_value, const float hardmin, const float hardmax, const char *ui_name, const char *ui_description, const float softmin, const float softmax)
void RNA_def_property_enum_funcs_runtime(PropertyRNA *prop, EnumPropertyGetFunc getfunc, EnumPropertySetFunc setfunc, EnumPropertyItemFunc itemfunc)
PropertyRNA * RNA_def_enum(StructOrFunctionRNA *cont_, const char *identifier, const EnumPropertyItem *items, const int default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_float_funcs_runtime(PropertyRNA *prop, FloatPropertyGetFunc getfunc, FloatPropertySetFunc setfunc, FloatPropertyRangeFunc rangefunc)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
void RNA_def_property_boolean_funcs_runtime(PropertyRNA *prop, BooleanPropertyGetFunc getfunc, BooleanPropertySetFunc setfunc)
#define FLT_MAX
Definition stdcycles.h:14
void * data
Definition RNA_types.hh:42
StructRNA * srna
wmGizmoFnDraw draw
wmGizmoFnSetup setup
const char * idname
wmGizmoFnInvoke invoke
wmGizmoFnDrawSelect draw_select
void * interaction_data
eWM_GizmoFlagState state
float line_width
eWM_GizmoFlag flag
PointerRNA * ptr
Definition wm_files.cc:4126
void WM_gizmo_calc_matrix_final(const wmGizmo *gz, float r_mat[4][4])
Definition wm_gizmo.cc:569
void WM_gizmotype_append(void(*gtfunc)(wmGizmoType *))