Blender V5.0
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
8
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
22namespace blender::ed::transform {
23
25 PaintCurvePoint *pcp; /* Initial curve point. */
26 char id;
27};
28
29/* -------------------------------------------------------------------- */
32
33#define PC_IS_ANY_SEL(pc) (((pc)->bez.f1 | (pc)->bez.f2 | (pc)->bez.f3) & SELECT)
34
36 PaintCurvePoint *pcp, int id, TransData2D *td2d, TransDataPaintCurve *tdpc, TransData *td)
37{
38 BezTriple *bezt = &pcp->bez;
39 copy_v2_v2(td2d->loc, bezt->vec[id]);
40 td2d->loc[2] = 0.0f;
41 td2d->loc2d = bezt->vec[id];
42
43 td->flag = 0;
44 td->loc = td2d->loc;
45 copy_v3_v3(td->center, bezt->vec[1]);
46 copy_v3_v3(td->iloc, td->loc);
47
48 memset(td->axismtx, 0, sizeof(td->axismtx));
49 td->axismtx[2][2] = 1.0f;
50
51 td->val = nullptr;
52 td->flag |= TD_SELECTED;
53 td->dist = 0.0;
54
55 unit_m3(td->mtx);
56 unit_m3(td->smtx);
57
58 tdpc->id = id;
59 tdpc->pcp = pcp;
60}
61
63 TransData *td,
64 TransData2D *td2d,
66{
67 BezTriple *bezt = &pcp->bez;
68
69 if (pcp->bez.f2 == SELECT) {
70 int i;
71 for (i = 0; i < 3; i++) {
72 copy_v2_v2(td2d->loc, bezt->vec[i]);
73 td2d->loc[2] = 0.0f;
74 td2d->loc2d = bezt->vec[i];
75
76 td->flag = 0;
77 td->loc = td2d->loc;
78 copy_v3_v3(td->center, bezt->vec[1]);
79 copy_v3_v3(td->iloc, td->loc);
80
81 memset(td->axismtx, 0, sizeof(td->axismtx));
82 td->axismtx[2][2] = 1.0f;
83
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 = MEM_calloc_arrayN<TransData2D>(tc->data_len, "TransData2D");
156 td = tc->data = MEM_calloc_arrayN<TransData>(tc->data_len, "TransData");
158 "TransDataPaintCurve");
159 tc->custom.type.use_free = true;
160
161 for (pcp = pc->points, i = 0; i < pc->tot_points; i++, pcp++) {
162 if (PC_IS_ANY_SEL(pcp)) {
163 PaintCurvePointToTransData(pcp, td, td2d, tdpc);
164
165 if (pcp->bez.f2 & SELECT) {
166 td += 3;
167 td2d += 3;
168 tdpc += 3;
169 }
170 else {
171 if (pcp->bez.f1 & SELECT) {
172 td++;
173 td2d++;
174 tdpc++;
175 }
176 if (pcp->bez.f3 & SELECT) {
177 td++;
178 td2d++;
179 tdpc++;
180 }
181 }
182 }
183 }
184}
185
187
188/* -------------------------------------------------------------------- */
191
193{
194 int i;
195
197
198 TransData2D *td2d = tc->data_2d;
199 TransDataPaintCurve *tdpc = static_cast<TransDataPaintCurve *>(tc->custom.type.data);
200
201 for (i = 0; i < tc->data_len; i++, tdpc++, td2d++) {
202 PaintCurvePoint *pcp = tdpc->pcp;
203 copy_v2_v2(pcp->bez.vec[tdpc->id], td2d->loc);
204 }
205
206 if (t->context) {
208 Brush *br = (paint) ? BKE_paint_brush(paint) : nullptr;
210 }
211}
212
214
216 /*flags*/ (T_POINTS | T_2D_EDIT),
217 /*create_trans_data*/ createTransPaintCurveVerts,
218 /*recalc_data*/ flushTransPaintCurve,
219 /*special_aftertrans_update*/ nullptr,
220};
221
222} // namespace blender::ed::transform
void BKE_brush_tag_unsaved_changes(Brush *brush)
Definition brush.cc:764
Paint * BKE_paint_get_active_from_context(const bContext *C)
Definition paint.cc:476
Brush * BKE_paint_brush(Paint *paint)
Definition paint.cc:645
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 C
Definition RandGen.cpp:29
#define SELECT
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:123
static void PaintCurvePointToTransData(PaintCurvePoint *pcp, TransData *td, TransData2D *td2d, TransDataPaintCurve *tdpc)
static void createTransPaintCurveVerts(bContext *C, TransInfo *t)
static void flushTransPaintCurve(TransInfo *t)
TransConvertTypeInfo TransConvertType_PaintCurve
static void PaintCurveConvertHandle(PaintCurvePoint *pcp, int id, TransData2D *td2d, TransDataPaintCurve *tdpc, TransData *td)
float vec[3][3]
struct PaintCurve * paint_curve
PaintCurvePoint * points
i
Definition text_draw.cc:230
#define TRANS_DATA_CONTAINER_FIRST_SINGLE(t)
Definition transform.hh:39
conversion and adaptation of different datablocks to a common struct.
#define PC_IS_ANY_SEL(pc)