Blender V5.0
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
15
16#include "BLI_math_vector.h"
17
18#include "MEM_guardedalloc.h"
19
20#include "DNA_screen_types.h"
21#include "DNA_space_types.h"
22#include "DNA_userdef_types.h"
23
24#include "GPU_immediate.hh"
25#include "GPU_matrix.hh"
26#include "GPU_select.hh"
27#include "GPU_state.hh"
28
29#include "RNA_define.hh"
30
31#include "WM_api.hh"
32#include "WM_types.hh"
33
34#include "ED_gizmo_library.hh"
35
36/* own includes */
38
39static float verts_plane[4][3] = {
40 {-1, -1, 0},
41 {1, -1, 0},
42 {1, 1, 0},
43 {-1, 1, 0},
44};
45
53
54/* -------------------------------------------------------------------- */
56
62
68
70 PropertyRNA * /*prop*/,
71 int value)
72{
74 gz_prim->draw_style = value;
75}
76
82
84 PropertyRNA * /*prop*/,
85 float value)
86{
88 gz_prim->arc_inner_factor = value;
89}
90
96
98 PropertyRNA * /*prop*/,
99 bool value)
100{
102 gz_prim->draw_inner = value;
103}
104
105/* -------------------------------------------------------------------- */
106
108 const float col_inner[4],
109 const float col_outer[4],
110 const int nsegments,
111 const bool draw_inner,
112 const bool select)
113{
115 immVertexFormat(), "pos", blender::gpu::VertAttrType::SFLOAT_32_32_32);
116 const bool use_polyline_shader = gz_prim->gizmo.line_width > 1.0f;
117
118 if (draw_inner || !use_polyline_shader) {
120 }
121
122 if (draw_inner) {
125 }
126 else {
127 immUniformColor4fv(col_inner);
129 imm_draw_circle_fill_3d(pos, 0.0f, 0.0f, 1.0f, nsegments);
130 }
131 else {
134 pos, 0.0f, 0.0f, 0.0f, gz_prim->arc_inner_factor, 1.0f, nsegments, 0.0f, 360.0f);
135 }
136 }
137 }
138
139 /* Draw outline. */
140
141 if (use_polyline_shader) {
142 if (draw_inner) {
144 }
146
147 float viewport[4];
148 GPU_viewport_size_get_f(viewport);
149 immUniform2fv("viewportSize", &viewport[2]);
150 immUniform1f("lineWidth",
151 (gz_prim->gizmo.line_width * U.pixelsize) + WM_gizmo_select_bias(select));
152 }
153
156 }
157 else {
158 immUniformColor4fv(col_outer);
160 imm_draw_circle_wire_3d(pos, 0.0f, 0.0f, 1.0f, nsegments);
161 }
162 else {
163 imm_draw_circle_wire_3d(pos, 0.0f, 0.0f, gz_prim->arc_inner_factor, nsegments);
164 imm_draw_circle_wire_3d(pos, 0.0f, 0.0f, 1.0f, nsegments);
165 }
166 }
168}
169
170static void gizmo_primitive_draw_intern(wmGizmo *gz, const bool select, const bool highlight)
171{
172 PrimitiveGizmo3D *gz_prim = (PrimitiveGizmo3D *)gz;
173
174 float color_inner[4], color_outer[4];
175 float matrix_final[4][4];
176
177 gizmo_color_get(gz, highlight, color_outer);
178 copy_v4_v4(color_inner, color_outer);
179 color_inner[3] *= 0.5f;
180
181 WM_gizmo_calc_matrix_final(gz, matrix_final);
182
185 GPU_matrix_mul(matrix_final);
186
188 color_inner,
189 color_outer,
190 select ? 24 : DIAL_RESOLUTION,
191 gz_prim->draw_inner || select,
192 select);
193
195
196 if (gz->interaction_data) {
197 GizmoInteraction *inter = static_cast<GizmoInteraction *>(gz->interaction_data);
198
199 copy_v4_fl(color_inner, 0.5f);
200 copy_v3_fl(color_outer, 0.5f);
201 color_outer[3] = 0.8f;
202
205
207 gz_prim, color_inner, color_outer, DIAL_RESOLUTION, gz_prim->draw_inner, select);
208
210 }
212}
213
214static void gizmo_primitive_draw_select(const bContext * /*C*/, wmGizmo *gz, int select_id)
215{
216 GPU_select_load_id(select_id);
217 gizmo_primitive_draw_intern(gz, true, false);
218}
219
220static void gizmo_primitive_draw(const bContext * /*C*/, wmGizmo *gz)
221{
223}
224
226{
228
229 /* Default Values. */
230 PrimitiveGizmo3D *gz_prim = (PrimitiveGizmo3D *)gz;
232 gz_prim->arc_inner_factor = 1.0f;
233 gz_prim->draw_inner = true;
234}
235
237 wmGizmo *gz,
238 const wmEvent * /*event*/)
239{
241
243
244 gz->interaction_data = inter;
245
247}
248
249/* -------------------------------------------------------------------- */
252
254{
255 /* identifiers */
256 gzt->idname = "GIZMO_GT_primitive_3d";
257
258 /* API callbacks. */
263
264 gzt->struct_size = sizeof(PrimitiveGizmo3D);
265
266 static const EnumPropertyItem rna_enum_draw_style[] = {
267 {ED_GIZMO_PRIMITIVE_STYLE_PLANE, "PLANE", 0, "Plane", ""},
268 {ED_GIZMO_PRIMITIVE_STYLE_CIRCLE, "CIRCLE", 0, "Circle", ""},
269 {ED_GIZMO_PRIMITIVE_STYLE_ANNULUS, "ANNULUS", 0, "Annulus", ""},
270 {0, nullptr, 0, nullptr, nullptr},
271 };
272
273 PropertyRNA *prop;
274 prop = RNA_def_enum(gzt->srna,
275 "draw_style",
276 rna_enum_draw_style,
278 "Draw Style",
279 "");
283 nullptr,
284 nullptr,
285 nullptr);
286
288 gzt->srna, "arc_inner_factor", 0.0f, 0.0f, FLT_MAX, "Arc Inner Factor", "", 0.0f, 1.0f);
292 nullptr,
293 nullptr,
294 nullptr);
295
296 prop = RNA_def_boolean(gzt->srna, "draw_inner", true, "Draw Inner", "");
300 nullptr,
301 nullptr);
302}
303
308
#define BLI_assert(a)
Definition BLI_assert.h:46
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(GPUBuiltinShader 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(GPUBlend blend)
Definition gpu_state.cc:42
void GPU_viewport_size_get_f(float coords[4])
Definition gpu_state.cc:273
uint GPU_vertformat_attr_add(GPUVertFormat *format, blender::StringRef name, blender::gpu::VertAttrType type)
Read Guarded memory(de)allocation.
@ WM_GIZMO_DRAW_MODAL
@ WM_GIZMO_STATE_HIGHLIGHT
#define U
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
static float WM_gizmo_select_bias(bool select)
uint pos
#define select(A, B, C)
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
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 *)
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 wmOperatorStatus gizmo_primitive_invoke(bContext *, wmGizmo *gz, const wmEvent *)
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 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, const bool select)
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)
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_boolean_funcs_runtime(PropertyRNA *prop, BooleanPropertyGetFunc getfunc, BooleanPropertySetFunc setfunc, BooleanPropertyGetTransformFunc get_transform_fn, BooleanPropertySetTransformFunc set_transform_fn)
void RNA_def_property_enum_funcs_runtime(PropertyRNA *prop, EnumPropertyGetFunc getfunc, EnumPropertySetFunc setfunc, EnumPropertyItemFunc itemfunc, EnumPropertyGetTransformFunc get_transform_fn, EnumPropertySetTransformFunc set_transform_fn)
void RNA_def_property_float_funcs_runtime(PropertyRNA *prop, FloatPropertyGetFunc getfunc, FloatPropertySetFunc setfunc, FloatPropertyRangeFunc rangefunc, FloatPropertyGetTransformFunc get_transform_fn, FloatPropertySetTransformFunc set_transform_fn)
PropertyRNA * RNA_def_boolean(StructOrFunctionRNA *cont_, const char *identifier, const bool default_value, const char *ui_name, const char *ui_description)
#define FLT_MAX
Definition stdcycles.h:14
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:4238
void WM_gizmo_calc_matrix_final(const wmGizmo *gz, float r_mat[4][4])
Definition wm_gizmo.cc:572
void WM_gizmotype_append(void(*gtfunc)(wmGizmoType *))