Blender V4.3
transform_convert_paintcurve.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 "DNA_brush_types.h"
10
11#include "MEM_guardedalloc.h"
12
13#include "BLI_math_matrix.h"
14#include "BLI_math_vector.h"
15
16#include "BKE_brush.hh"
17#include "BKE_paint.hh"
18
19#include "transform.hh"
20#include "transform_convert.hh"
21
23 PaintCurvePoint *pcp; /* Initial curve point. */
24 char id;
25};
26
27/* -------------------------------------------------------------------- */
31#define PC_IS_ANY_SEL(pc) (((pc)->bez.f1 | (pc)->bez.f2 | (pc)->bez.f3) & SELECT)
32
34 PaintCurvePoint *pcp, int id, TransData2D *td2d, TransDataPaintCurve *tdpc, TransData *td)
35{
36 BezTriple *bezt = &pcp->bez;
37 copy_v2_v2(td2d->loc, bezt->vec[id]);
38 td2d->loc[2] = 0.0f;
39 td2d->loc2d = bezt->vec[id];
40
41 td->flag = 0;
42 td->loc = td2d->loc;
43 copy_v3_v3(td->center, bezt->vec[1]);
44 copy_v3_v3(td->iloc, td->loc);
45
46 memset(td->axismtx, 0, sizeof(td->axismtx));
47 td->axismtx[2][2] = 1.0f;
48
49 td->ext = nullptr;
50 td->val = nullptr;
51 td->flag |= TD_SELECTED;
52 td->dist = 0.0;
53
54 unit_m3(td->mtx);
55 unit_m3(td->smtx);
56
57 tdpc->id = id;
58 tdpc->pcp = pcp;
59}
60
62 TransData *td,
63 TransData2D *td2d,
65{
66 BezTriple *bezt = &pcp->bez;
67
68 if (pcp->bez.f2 == SELECT) {
69 int i;
70 for (i = 0; i < 3; i++) {
71 copy_v2_v2(td2d->loc, bezt->vec[i]);
72 td2d->loc[2] = 0.0f;
73 td2d->loc2d = bezt->vec[i];
74
75 td->flag = 0;
76 td->loc = td2d->loc;
77 copy_v3_v3(td->center, bezt->vec[1]);
78 copy_v3_v3(td->iloc, td->loc);
79
80 memset(td->axismtx, 0, sizeof(td->axismtx));
81 td->axismtx[2][2] = 1.0f;
82
83 td->ext = nullptr;
84 td->val = nullptr;
85 td->flag |= TD_SELECTED;
86 td->dist = 0.0;
87
88 unit_m3(td->mtx);
89 unit_m3(td->smtx);
90
91 tdpc->id = i;
92 tdpc->pcp = pcp;
93
94 td++;
95 td2d++;
96 tdpc++;
97 }
98 }
99 else {
100 if (bezt->f3 & SELECT) {
101 PaintCurveConvertHandle(pcp, 2, td2d, tdpc, td);
102 td2d++;
103 tdpc++;
104 td++;
105 }
106
107 if (bezt->f1 & SELECT) {
108 PaintCurveConvertHandle(pcp, 0, td2d, tdpc, td);
109 }
110 }
111}
112
114{
116 Brush *br = (paint) ? BKE_paint_brush(paint) : nullptr;
117 PaintCurve *pc;
118 PaintCurvePoint *pcp;
119 TransData *td = nullptr;
120 TransData2D *td2d = nullptr;
121 TransDataPaintCurve *tdpc = nullptr;
122 int i;
123 int total = 0;
124
126
127 tc->data_len = 0;
128
129 if (!paint || !br) {
130 return;
131 }
132
133 pc = br->paint_curve;
134
135 for (pcp = pc->points, i = 0; i < pc->tot_points; i++, pcp++) {
136 if (PC_IS_ANY_SEL(pcp)) {
137 if (pcp->bez.f2 & SELECT) {
138 total += 3;
139 continue;
140 }
141 if (pcp->bez.f1 & SELECT) {
142 total++;
143 }
144 if (pcp->bez.f3 & SELECT) {
145 total++;
146 }
147 }
148 }
149
150 if (!total) {
151 return;
152 }
153
154 tc->data_len = total;
155 td2d = tc->data_2d = static_cast<TransData2D *>(
156 MEM_callocN(tc->data_len * sizeof(TransData2D), "TransData2D"));
157 td = tc->data = static_cast<TransData *>(
158 MEM_callocN(tc->data_len * sizeof(TransData), "TransData"));
159 tc->custom.type.data = tdpc = static_cast<TransDataPaintCurve *>(
160 MEM_callocN(tc->data_len * sizeof(TransDataPaintCurve), "TransDataPaintCurve"));
161 tc->custom.type.use_free = true;
162
163 for (pcp = pc->points, i = 0; i < pc->tot_points; i++, pcp++) {
164 if (PC_IS_ANY_SEL(pcp)) {
165 PaintCurvePointToTransData(pcp, td, td2d, tdpc);
166
167 if (pcp->bez.f2 & SELECT) {
168 td += 3;
169 td2d += 3;
170 tdpc += 3;
171 }
172 else {
173 if (pcp->bez.f1 & SELECT) {
174 td++;
175 td2d++;
176 tdpc++;
177 }
178 if (pcp->bez.f3 & SELECT) {
179 td++;
180 td2d++;
181 tdpc++;
182 }
183 }
184 }
185 }
186}
187
190/* -------------------------------------------------------------------- */
195{
196 int i;
197
199
200 TransData2D *td2d = tc->data_2d;
201 TransDataPaintCurve *tdpc = static_cast<TransDataPaintCurve *>(tc->custom.type.data);
202
203 for (i = 0; i < tc->data_len; i++, tdpc++, td2d++) {
204 PaintCurvePoint *pcp = tdpc->pcp;
205 copy_v2_v2(pcp->bez.vec[tdpc->id], td2d->loc);
206 }
207
208 if (t->context) {
210 Brush *br = (paint) ? BKE_paint_brush(paint) : nullptr;
212 }
213}
214
218 /*flags*/ (T_POINTS | T_2D_EDIT),
219 /*create_trans_data*/ createTransPaintCurveVerts,
220 /*recalc_data*/ flushTransPaintCurve,
221 /*special_aftertrans_update*/ nullptr,
222};
void BKE_brush_tag_unsaved_changes(Brush *brush)
Definition brush.cc:621
Paint * BKE_paint_get_active_from_context(const bContext *C)
Definition paint.cc:477
Brush * BKE_paint_brush(Paint *paint)
Definition paint.cc:649
void unit_m3(float m[3][3])
MINLINE void copy_v2_v2(float r[2], const float a[2])
MINLINE void copy_v3_v3(float r[3], const float a[3])
Read Guarded memory(de)allocation.
#define SELECT
void *(* MEM_callocN)(size_t len, const char *str)
Definition mallocn.cc:42
float vec[3][3]
struct PaintCurve * paint_curve
PaintCurvePoint * points
TransCustomData type
Definition transform.hh:425
unsigned int use_free
Definition transform.hh:410
TransCustomDataContainer custom
Definition transform.hh:501
TransData * data
Definition transform.hh:445
TransData2D * data_2d
Definition transform.hh:449
float smtx[3][3]
float axismtx[3][3]
float mtx[3][3]
TransDataExtension * ext
bContext * context
Definition transform.hh:649
@ T_2D_EDIT
Definition transform.hh:104
@ T_POINTS
Definition transform.hh:93
#define TRANS_DATA_CONTAINER_FIRST_SINGLE(t)
Definition transform.hh:851
conversion and adaptation of different datablocks to a common struct.
static void flushTransPaintCurve(TransInfo *t)
static void PaintCurvePointToTransData(PaintCurvePoint *pcp, TransData *td, TransData2D *td2d, TransDataPaintCurve *tdpc)
static void PaintCurveConvertHandle(PaintCurvePoint *pcp, int id, TransData2D *td2d, TransDataPaintCurve *tdpc, TransData *td)
static void createTransPaintCurveVerts(bContext *C, TransInfo *t)
TransConvertTypeInfo TransConvertType_PaintCurve
#define PC_IS_ANY_SEL(pc)
@ TD_SELECTED