Blender V4.3
transform_gizmo_3d_cage.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
13#include "BLI_math_matrix.h"
14#include "BLI_math_vector.h"
15
16#include "BKE_context.hh"
17#include "BKE_global.hh"
18#include "BKE_scene.hh"
19
20#include "ED_gizmo_library.hh"
21#include "ED_gizmo_utils.hh"
22#include "ED_screen.hh"
23#include "WM_api.hh"
24
25#include "RNA_access.hh"
26
27/* Local module include. */
28#include "transform.hh"
29#include "transform_gizmo.hh"
30
31/* -------------------------------------------------------------------- */
37 /* Only for view orientation. */
38 struct {
39 float viewinv_m3[3][3];
41};
42
44{
46 return false;
47 }
48 View3D *v3d = CTX_wm_view3d(C);
50 return false;
51 }
52 if (G.moving & (G_TRANSFORM_OBJ | G_TRANSFORM_EDIT)) {
53 return false;
54 }
55 return true;
56}
57
58static void WIDGETGROUP_xform_cage_setup(const bContext * /*C*/, wmGizmoGroup *gzgroup)
59{
60 XFormCageWidgetGroup *xgzgroup = static_cast<XFormCageWidgetGroup *>(
61 MEM_mallocN(sizeof(XFormCageWidgetGroup), __func__));
62 const wmGizmoType *gzt_cage = WM_gizmotype_find("GIZMO_GT_cage_3d", true);
63 xgzgroup->gizmo = WM_gizmo_new_ptr(gzt_cage, gzgroup, nullptr);
64 wmGizmo *gz = xgzgroup->gizmo;
65
68
69 gz->color[0] = 1;
70 gz->color_hi[0] = 1;
71
72 gzgroup->customdata = xgzgroup;
73
74 {
75 wmOperatorType *ot_resize = WM_operatortype_find("TRANSFORM_OT_resize", true);
77
78 /* Assign operator. */
79 PropertyRNA *prop_release_confirm = nullptr;
80 PropertyRNA *prop_constraint_axis = nullptr;
81
83 for (int x = 0; x < 3; x++) {
84 for (int y = 0; y < 3; y++) {
85 for (int z = 0; z < 3; z++) {
86 const bool constraint[3] = {x != 1, y != 1, z != 1};
87 ptr = WM_gizmo_operator_set(gz, i, ot_resize, nullptr);
88 if (prop_release_confirm == nullptr) {
89 prop_release_confirm = RNA_struct_find_property(ptr, "release_confirm");
90 prop_constraint_axis = RNA_struct_find_property(ptr, "constraint_axis");
91 }
92 RNA_property_boolean_set(ptr, prop_release_confirm, true);
93 RNA_property_boolean_set_array(ptr, prop_constraint_axis, constraint);
94 i++;
95 }
96 }
97 }
98 }
99}
100
102{
103 ARegion *region = CTX_wm_region(C);
104 RegionView3D *rv3d = static_cast<RegionView3D *>(region->regiondata);
105 Scene *scene = CTX_data_scene(C);
106
107 XFormCageWidgetGroup *xgzgroup = static_cast<XFormCageWidgetGroup *>(gzgroup->customdata);
108 wmGizmo *gz = xgzgroup->gizmo;
109
110 TransformBounds tbounds;
111
112 const int orient_index = BKE_scene_orientation_get_index_from_flag(scene, SCE_ORIENT_SCALE);
113
114 TransformCalcParams calc_params{};
115 calc_params.use_local_axis = true;
116 calc_params.orientation_index = orient_index + 1;
117 if ((ED_transform_calc_gizmo_stats(C, &calc_params, &tbounds, rv3d) == 0) ||
118 equals_v3v3(rv3d->tw_axis_min, rv3d->tw_axis_max))
119 {
121 }
122 else {
123 if (tbounds.use_matrix_space) {
125 }
126 else {
128 }
129
130 gizmo_prepare_mat(C, rv3d, &tbounds);
131
134
135 float dims[3];
136 sub_v3_v3v3(dims, rv3d->tw_axis_max, rv3d->tw_axis_min);
137 RNA_float_set_array(gz->ptr, "dimensions", dims);
138 mul_v3_fl(dims, 0.5f);
139
141 mid_v3_v3v3(gz->matrix_offset[3], rv3d->tw_axis_max, rv3d->tw_axis_min);
143
144 float matrix_offset_global[4][4];
145 mul_m4_m4m4(matrix_offset_global, gz->matrix_space, gz->matrix_offset);
146
147 PropertyRNA *prop_center_override = nullptr;
148 float center[3];
149 float center_global[3];
151 for (int x = 0; x < 3; x++) {
152 center[0] = float(1 - x) * dims[0];
153 for (int y = 0; y < 3; y++) {
154 center[1] = float(1 - y) * dims[1];
155 for (int z = 0; z < 3; z++) {
156 center[2] = float(1 - z) * dims[2];
158 if (prop_center_override == nullptr) {
159 prop_center_override = RNA_struct_find_property(&gzop->ptr, "center_override");
160 }
161 mul_v3_m4v3(center_global, matrix_offset_global, center);
162 RNA_property_float_set_array(&gzop->ptr, prop_center_override, center_global);
163 i++;
164 }
165 }
166 }
167 }
168
169 /* Needed to test view orientation changes. */
170 copy_m3_m4(xgzgroup->prev.viewinv_m3, rv3d->viewinv);
171}
172
174 wmGizmoGroup *gzgroup,
175 wmMsgBus *mbus)
176{
177 Scene *scene = CTX_data_scene(C);
178 bScreen *screen = CTX_wm_screen(C);
179 ScrArea *area = CTX_wm_area(C);
180 ARegion *region = CTX_wm_region(C);
181 gizmo_xform_message_subscribe(gzgroup, mbus, scene, screen, area, region, VIEW3D_GGT_xform_cage);
182}
183
185{
186 XFormCageWidgetGroup *xgzgroup = static_cast<XFormCageWidgetGroup *>(gzgroup->customdata);
187
189 {
190 Scene *scene = CTX_data_scene(C);
193 switch (orient_slot->type) {
194 case V3D_ORIENT_VIEW: {
195 float viewinv_m3[3][3];
196 copy_m3_m4(viewinv_m3, rv3d->viewinv);
197 if (!equals_m3m3(viewinv_m3, xgzgroup->prev.viewinv_m3)) {
198 /* Take care calling refresh from draw_prepare,
199 * this should be OK because it's only adjusting the cage orientation. */
201 }
202 break;
203 }
204 }
205 }
206}
207
226
bScreen * CTX_wm_screen(const bContext *C)
ScrArea * CTX_wm_area(const bContext *C)
Scene * CTX_data_scene(const bContext *C)
RegionView3D * CTX_wm_region_view3d(const bContext *C)
ARegion * CTX_wm_region(const bContext *C)
View3D * CTX_wm_view3d(const bContext *C)
@ G_TRANSFORM_OBJ
@ G_TRANSFORM_EDIT
TransformOrientationSlot * BKE_scene_orientation_slot_get(Scene *scene, int slot_index)
Definition scene.cc:2347
int BKE_scene_orientation_get_index_from_flag(Scene *scene, int flag)
Definition scene.cc:2392
void mul_m3_v3(const float M[3][3], float r[3])
void mul_m4_m4m4(float R[4][4], const float A[4][4], const float B[4][4])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void unit_m4(float m[4][4])
Definition rct.c:1127
void copy_m4_m3(float m1[4][4], const float m2[3][3])
bool equals_m3m3(const float mat1[3][3], const float mat2[3][3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
void mul_v3_m4v3(float r[3], const float mat[4][4], const float vec[3])
MINLINE bool equals_v3v3(const float v1[3], const float v2[3]) ATTR_WARN_UNUSED_RESULT
MINLINE void sub_v3_v3v3(float r[3], const float a[3], const float b[3])
MINLINE void mul_v3_fl(float r[3], float f)
void mid_v3_v3v3(float r[3], const float a[3], const float b[3])
@ SCE_ORIENT_SCALE
@ RGN_TYPE_WINDOW
@ SPACE_VIEW3D
@ V3D_GIZMO_HIDE_TOOL
@ V3D_GIZMO_HIDE
@ V3D_ORIENT_VIEW
@ ED_GIZMO_CAGE3D_PART_SCALE_MIN_X_MIN_Y_MIN_Z
@ ED_GIZMO_CAGE_XFORM_FLAG_SCALE
@ ED_GIZMO_CAGE_XFORM_FLAG_TRANSLATE
bool ED_gizmo_poll_or_unlink_delayed_from_tool(const bContext *C, wmGizmoGroupType *gzgt)
int ED_transform_calc_gizmo_stats(const bContext *C, const TransformCalcParams *params, TransformBounds *tbounds, RegionView3D *rv3d)
@ WM_GIZMO_HIDDEN
@ WM_GIZMO_MOVE_CURSOR
@ WM_GIZMOGROUPTYPE_DRAW_MODAL_EXCLUDE
@ WM_GIZMOGROUPTYPE_TOOL_FALLBACK_KEYMAP
@ WM_GIZMOGROUPTYPE_DELAY_REFRESH_FOR_TWEAK
@ WM_GIZMOGROUPTYPE_3D
SIMD_FORCE_INLINE const btScalar & z() const
Return the z value.
Definition btQuadWord.h:117
draw_view in_light_buf[] float
void *(* MEM_mallocN)(size_t len, const char *str)
Definition mallocn.cc:44
#define G(x, y, z)
PropertyRNA * RNA_struct_find_property(PointerRNA *ptr, const char *identifier)
void RNA_property_boolean_set(PointerRNA *ptr, PropertyRNA *prop, bool value)
void RNA_property_float_set_array(PointerRNA *ptr, PropertyRNA *prop, const float *values)
void RNA_enum_set(PointerRNA *ptr, const char *name, int value)
void RNA_float_set_array(PointerRNA *ptr, const char *name, const float *values)
void RNA_property_boolean_set_array(PointerRNA *ptr, PropertyRNA *prop, const bool *values)
float tw_axis_matrix[3][3]
float tw_axis_min[3]
float tw_axis_max[3]
float viewinv[4][4]
float matrix_space[4][4]
struct XFormCageWidgetGroup::@579 prev
wmGizmoGroupFnSetupKeymap setup_keymap
wmGizmoGroupFnMsgBusSubscribe message_subscribe
wmGizmoGroupFnRefresh refresh
wmGizmoGroupFnInit setup
const char * idname
wmGizmoMapType_Params gzmap_params
eWM_GizmoFlagGroupTypeFlag flag
wmGizmoGroupFnPoll poll
wmGizmoGroupFnDrawPrepare draw_prepare
float matrix_offset[4][4]
float color_hi[4]
float color[4]
PointerRNA * ptr
float matrix_space[4][4]
void gizmo_xform_message_subscribe(wmGizmoGroup *gzgroup, wmMsgBus *mbus, Scene *scene, bScreen *screen, ScrArea *area, ARegion *region, void(*type_fn)(wmGizmoGroupType *))
void gizmo_prepare_mat(const bContext *C, RegionView3D *rv3d, const TransformBounds *tbounds)
static void WIDGETGROUP_xform_cage_message_subscribe(const bContext *C, wmGizmoGroup *gzgroup, wmMsgBus *mbus)
static void WIDGETGROUP_xform_cage_refresh(const bContext *C, wmGizmoGroup *gzgroup)
static void WIDGETGROUP_xform_cage_setup(const bContext *, wmGizmoGroup *gzgroup)
static bool WIDGETGROUP_xform_cage_poll(const bContext *C, wmGizmoGroupType *gzgt)
static void WIDGETGROUP_xform_cage_draw_prepare(const bContext *C, wmGizmoGroup *gzgroup)
void VIEW3D_GGT_xform_cage(wmGizmoGroupType *gzgt)
PointerRNA * ptr
Definition wm_files.cc:4126
wmGizmoOpElem * WM_gizmo_operator_get(wmGizmo *gz, int part_index)
Definition wm_gizmo.cc:195
wmGizmo * WM_gizmo_new_ptr(const wmGizmoType *gzt, wmGizmoGroup *gzgroup, PointerRNA *properties)
Definition wm_gizmo.cc:81
void WM_gizmo_set_flag(wmGizmo *gz, const int flag, const bool enable)
Definition wm_gizmo.cc:303
PointerRNA * WM_gizmo_operator_set(wmGizmo *gz, int part_index, wmOperatorType *ot, IDProperty *properties)
Definition wm_gizmo.cc:203
wmKeyMap * WM_gizmogroup_setup_keymap_generic_maybe_drag(const wmGizmoGroupType *, wmKeyConfig *kc)
const wmGizmoType * WM_gizmotype_find(const char *idname, bool quiet)
wmOperatorType * WM_operatortype_find(const char *idname, bool quiet)