Blender V4.3
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
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
26/* -------------------------------------------------------------------- */
31{
32 using namespace blender::ed;
33 TransData *td;
34
35 Scene *scene = t->scene;
36 if (!BKE_id_is_editable(CTX_data_main(C), &scene->id)) {
37 BKE_report(t->reports, RPT_ERROR, "Linked data can't text-space transform");
38 return;
39 }
40
43 SculptSession &ss = *ob.sculpt;
44
45 /* Avoid editing locked shapes. */
46 if (t->mode != TFM_DUMMY && sculpt_paint::report_if_shape_key_is_locked(ob, t->reports)) {
47 return;
48 }
49
50 {
53 tc->data_len = 1;
54 tc->is_active = true;
55 td = tc->data = MEM_cnew<TransData>(__func__);
56 td->ext = tc->data_ext = MEM_cnew<TransDataExtension>(__func__);
57 }
58
59 td->flag = TD_SELECTED;
60 copy_v3_v3(td->center, ss.pivot_pos);
61 mul_m4_v3(ob.object_to_world().ptr(), td->center);
62 td->ob = &ob;
63
64 td->loc = ss.pivot_pos;
65 copy_v3_v3(td->iloc, ss.pivot_pos);
66
67 if (is_zero_v4(ss.pivot_rot)) {
68 ss.pivot_rot[3] = 1.0f;
69 }
70
71 float obmat_inv[3][3];
72 copy_m3_m4(obmat_inv, ob.object_to_world().ptr());
73 invert_m3(obmat_inv);
74
75 td->ext->rot = nullptr;
76 td->ext->rotAxis = nullptr;
77 td->ext->rotAngle = nullptr;
78 td->ext->quat = ss.pivot_rot;
79 copy_m4_m4(td->ext->obmat, ob.object_to_world().ptr());
80 copy_m3_m3(td->ext->l_smtx, obmat_inv);
81 copy_m3_m4(td->ext->r_mtx, ob.object_to_world().ptr());
82 copy_m3_m3(td->ext->r_smtx, obmat_inv);
83
84 copy_qt_qt(td->ext->iquat, ss.pivot_rot);
86
87 ss.pivot_scale[0] = 1.0f;
88 ss.pivot_scale[1] = 1.0f;
89 ss.pivot_scale[2] = 1.0f;
90 td->ext->size = ss.pivot_scale;
93
94 copy_m3_m3(td->smtx, obmat_inv);
95 copy_m3_m4(td->mtx, ob.object_to_world().ptr());
96 copy_m3_m4(td->axismtx, ob.object_to_world().ptr());
98
100 sculpt_paint::init_transform(C, ob, t->mval, t->undo_name);
101}
102
105/* -------------------------------------------------------------------- */
110{
111 using namespace blender::ed;
114 sculpt_paint::update_modal_transform(t->context, *ob);
115}
116
118{
119 using namespace blender::ed;
120 Scene *scene = t->scene;
121 if (!BKE_id_is_editable(CTX_data_main(C), &scene->id)) {
122 /* `sculpt_paint::init_transform` was not called in this case. */
123 return;
124 }
125
129 sculpt_paint::end_transform(C, *ob);
130}
131
135 /*flags*/ 0,
136 /*create_trans_data*/ createTransSculpt,
137 /*recalc_data*/ recalcData_sculpt,
138 /*special_aftertrans_update*/ special_aftertrans_update__sculpt,
139};
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:2456
void BKE_report(ReportList *reports, eReportType type, const char *message)
Definition report.cc:125
#define BLI_assert(a)
Definition BLI_assert.h:50
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
@ TFM_DUMMY
Read Guarded memory(de)allocation.
struct SculptSession * sculpt
blender::float4 pivot_rot
Definition BKE_paint.hh:463
blender::float3 pivot_pos
Definition BKE_paint.hh:462
blender::float3 pivot_scale
Definition BKE_paint.hh:464
blender::float3 init_pivot_scale
Definition BKE_paint.hh:468
TransData * data
Definition transform.hh:445
TransDataExtension * data_ext
Definition transform.hh:447
float smtx[3][3]
float axismtx[3][3]
float mtx[3][3]
TransDataExtension * ext
eTfmMode mode
Definition transform.hh:517
const char * undo_name
Definition transform.hh:679
ReportList * reports
Definition transform.hh:661
Scene * scene
Definition transform.hh:654
ViewLayer * view_layer
Definition transform.hh:655
int data_container_len
Definition transform.hh:506
TransDataContainer * data_container
Definition transform.hh:505
bContext * context
Definition transform.hh:649
blender::float2 mval
Definition transform.hh:663
eTContext options
Definition transform.hh:521
@ CTX_PAINT_CURVE
Definition transform.hh:72
conversion and adaptation of different datablocks to a common struct.
static void recalcData_sculpt(TransInfo *t)
static void createTransSculpt(bContext *C, TransInfo *t)
static void special_aftertrans_update__sculpt(bContext *C, TransInfo *t)
TransConvertTypeInfo TransConvertType_Sculpt
@ TD_SELECTED