Blender V4.5
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->ext = nullptr;
52 td->val = nullptr;
53 td->flag |= TD_SELECTED;
54 td->dist = 0.0;
55
56 unit_m3(td->mtx);
57 unit_m3(td->smtx);
58
59 tdpc->id = id;
60 tdpc->pcp = pcp;
61}
62
64 TransData *td,
65 TransData2D *td2d,
67{
68 BezTriple *bezt = &pcp->bez;
69
70 if (pcp->bez.f2 == SELECT) {
71 int i;
72 for (i = 0; i < 3; i++) {
73 copy_v2_v2(td2d->loc, bezt->vec[i]);
74 td2d->loc[2] = 0.0f;
75 td2d->loc2d = bezt->vec[i];
76
77 td->flag = 0;
78 td->loc = td2d->loc;
79 copy_v3_v3(td->center, bezt->vec[1]);
80 copy_v3_v3(td->iloc, td->loc);
81
82 memset(td->axismtx, 0, sizeof(td->axismtx));
83 td->axismtx[2][2] = 1.0f;
84
85 td->ext = nullptr;
86 td->val = nullptr;
87 td->flag |= TD_SELECTED;
88 td->dist = 0.0;
89
90 unit_m3(td->mtx);
91 unit_m3(td->smtx);
92
93 tdpc->id = i;
94 tdpc->pcp = pcp;
95
96 td++;
97 td2d++;
98 tdpc++;
99 }
100 }
101 else {
102 if (bezt->f3 & SELECT) {
103 PaintCurveConvertHandle(pcp, 2, td2d, tdpc, td);
104 td2d++;
105 tdpc++;
106 td++;
107 }
108
109 if (bezt->f1 & SELECT) {
110 PaintCurveConvertHandle(pcp, 0, td2d, tdpc, td);
111 }
112 }
113}
114
116{
118 Brush *br = (paint) ? BKE_paint_brush(paint) : nullptr;
119 PaintCurve *pc;
120 PaintCurvePoint *pcp;
121 TransData *td = nullptr;
122 TransData2D *td2d = nullptr;
123 TransDataPaintCurve *tdpc = nullptr;
124 int i;
125 int total = 0;
126
128
129 tc->data_len = 0;
130
131 if (!paint || !br) {
132 return;
133 }
134
135 pc = br->paint_curve;
136
137 for (pcp = pc->points, i = 0; i < pc->tot_points; i++, pcp++) {
138 if (PC_IS_ANY_SEL(pcp)) {
139 if (pcp->bez.f2 & SELECT) {
140 total += 3;
141 continue;
142 }
143 if (pcp->bez.f1 & SELECT) {
144 total++;
145 }
146 if (pcp->bez.f3 & SELECT) {
147 total++;
148 }
149 }
150 }
151
152 if (!total) {
153 return;
154 }
155
156 tc->data_len = total;
157 td2d = tc->data_2d = MEM_calloc_arrayN<TransData2D>(tc->data_len, "TransData2D");
158 td = tc->data = MEM_calloc_arrayN<TransData>(tc->data_len, "TransData");
160 "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
189
190/* -------------------------------------------------------------------- */
193
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
216
218 /*flags*/ (T_POINTS | T_2D_EDIT),
219 /*create_trans_data*/ createTransPaintCurveVerts,
220 /*recalc_data*/ flushTransPaintCurve,
221 /*special_aftertrans_update*/ nullptr,
222};
223
224} // namespace blender::ed::transform
void BKE_brush_tag_unsaved_changes(Brush *brush)
Definition brush.cc:720
Paint * BKE_paint_get_active_from_context(const bContext *C)
Definition paint.cc:467
Brush * BKE_paint_brush(Paint *paint)
Definition paint.cc:636
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)