Blender V5.0
transform_convert_sculpt.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2001-2002 NaN Holding BV. All rights reserved.
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "MEM_guardedalloc.h"
10
11#include "BLI_math_matrix.h"
12#include "BLI_math_rotation.h"
13#include "BLI_math_vector.h"
14
15#include "BKE_context.hh"
16#include "BKE_layer.hh"
17#include "BKE_lib_id.hh"
18#include "BKE_paint.hh"
19#include "BKE_report.hh"
20
21#include "ED_sculpt.hh"
22
23#include "transform.hh"
24#include "transform_convert.hh"
25
26namespace blender::ed::transform {
27
28/* -------------------------------------------------------------------- */
31
33{
34 TransData *td;
35 TransDataExtension *td_ext;
36
37 Scene *scene = t->scene;
38 if (!BKE_id_is_editable(CTX_data_main(C), &scene->id)) {
39 BKE_report(t->reports, RPT_ERROR, "Cannot create transform on linked data");
40 return;
41 }
42
45 SculptSession &ss = *ob.sculpt;
46
47 /* Avoid editing locked shapes. */
49 return;
50 }
51
52 {
55 tc->data_len = 1;
56 tc->is_active = true;
57 td = tc->data = MEM_callocN<TransData>(__func__);
58 td_ext = tc->data_ext = MEM_callocN<TransDataExtension>(__func__);
59 }
60
61 td->flag = TD_SELECTED;
63 mul_m4_v3(ob.object_to_world().ptr(), td->center);
64
65 td->loc = ss.pivot_pos;
66 copy_v3_v3(td->iloc, ss.pivot_pos);
67
68 if (is_zero_v4(ss.pivot_rot)) {
69 ss.pivot_rot[3] = 1.0f;
70 }
71
72 float obmat_inv[3][3];
73 copy_m3_m4(obmat_inv, ob.object_to_world().ptr());
74 invert_m3(obmat_inv);
75
76 td_ext->rot = nullptr;
77 td_ext->rotAxis = nullptr;
78 td_ext->rotAngle = nullptr;
79 td_ext->quat = ss.pivot_rot;
80 copy_m4_m4(td_ext->obmat, ob.object_to_world().ptr());
81 copy_m3_m3(td_ext->l_smtx, obmat_inv);
82 copy_m3_m4(td_ext->r_mtx, ob.object_to_world().ptr());
83 copy_m3_m3(td_ext->r_smtx, obmat_inv);
84
85 copy_qt_qt(td_ext->iquat, ss.pivot_rot);
86 td_ext->rotOrder = ROT_MODE_QUAT;
87
88 ss.pivot_scale[0] = 1.0f;
89 ss.pivot_scale[1] = 1.0f;
90 ss.pivot_scale[2] = 1.0f;
91 td_ext->scale = ss.pivot_scale;
94
95 copy_m3_m3(td->smtx, obmat_inv);
96 copy_m3_m4(td->mtx, ob.object_to_world().ptr());
97 copy_m3_m4(td->axismtx, ob.object_to_world().ptr());
99
102}
103
105
106/* -------------------------------------------------------------------- */
109
122
124{
125 Scene *scene = t->scene;
126 if (!BKE_id_is_editable(CTX_data_main(C), &scene->id)) {
127 /* `sculpt_paint::init_transform` was not called in this case. */
128 return;
129 }
130
135}
136
138
140 /*flags*/ 0,
141 /*create_trans_data*/ createTransSculpt,
142 /*recalc_data*/ recalcData_sculpt,
143 /*special_aftertrans_update*/ special_aftertrans_update__sculpt,
144};
145
146} // namespace blender::ed::transform
Main * CTX_data_main(const bContext *C)
void BKE_view_layer_synced_ensure(const Scene *scene, ViewLayer *view_layer)
Object * BKE_view_layer_active_object_get(const ViewLayer *view_layer)
bool BKE_id_is_editable(const Main *bmain, const ID *id)
Definition lib_id.cc:2523
@ RPT_ERROR
Definition BKE_report.hh:39
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:153
#define BLI_assert(a)
Definition BLI_assert.h:46
void copy_m3_m3(float m1[3][3], const float m2[3][3])
void copy_m3_m4(float m1[3][3], const float m2[4][4])
void normalize_m3(float R[3][3]) ATTR_NONNULL()
void mul_m4_v3(const float M[4][4], float r[3])
void copy_m4_m4(float m1[4][4], const float m2[4][4])
bool invert_m3(float mat[3][3])
void copy_qt_qt(float q[4], const float a[4])
MINLINE bool is_zero_v4(const float v[4]) ATTR_WARN_UNUSED_RESULT
MINLINE void copy_v3_v3(float r[3], const float a[3])
@ ROT_MODE_QUAT
Read Guarded memory(de)allocation.
#define C
Definition RandGen.cpp:29
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void update_modal_transform(bContext *C, Object &ob)
void end_transform(bContext *C, Object &ob)
void init_transform(bContext *C, Object &ob, const float mval_fl[2], const char *undo_name)
bool report_if_shape_key_is_locked(const Object &ob, ReportList *reports)
Definition sculpt.cc:127
void cancel_modal_transform(bContext *C, Object &ob)
static void recalcData_sculpt(TransInfo *t)
static void createTransSculpt(bContext *C, TransInfo *t)
TransConvertTypeInfo TransConvertType_Sculpt
static void special_aftertrans_update__sculpt(bContext *C, TransInfo *t)
struct SculptSession * sculpt
blender::float4 pivot_rot
Definition BKE_paint.hh:467
blender::float3 pivot_pos
Definition BKE_paint.hh:466
blender::float3 pivot_scale
Definition BKE_paint.hh:468
blender::float3 init_pivot_scale
Definition BKE_paint.hh:472
TransDataContainer * data_container
Definition transform.hh:802
conversion and adaptation of different datablocks to a common struct.