Blender V5.0
editlattice.cc
Go to the documentation of this file.
1/* SPDX-FileCopyrightText: 2023 Blender Authors
2 *
3 * SPDX-License-Identifier: GPL-2.0-or-later */
4
8
9#include "MEM_guardedalloc.h"
10
11#include "DNA_curve_types.h"
12#include "DNA_key_types.h"
13#include "DNA_lattice_types.h"
14#include "DNA_meshdata_types.h"
15#include "DNA_object_types.h"
16
17#include "BLI_listbase.h"
18#include "BLI_math_vector.h"
19
20#include "BKE_deform.hh"
21#include "BKE_key.hh"
22
23#include "BKE_editlattice.h" /* own include */
24
26{
27 Lattice *lt = static_cast<Lattice *>(ob->data);
28
29 if (lt->editlatt) {
30 Lattice *editlt = lt->editlatt->latt;
31
32 if (editlt->def) {
33 MEM_freeN(editlt->def);
34 }
35 if (editlt->dvert) {
36 BKE_defvert_array_free(editlt->dvert, editlt->pntsu * editlt->pntsv * editlt->pntsw);
37 }
38 MEM_freeN(editlt);
40
41 lt->editlatt = nullptr;
42 }
43}
44
46{
47 Lattice *lt = static_cast<Lattice *>(obedit->data);
48 KeyBlock *actkey;
49
51
52 actkey = BKE_keyblock_from_object(obedit);
53 if (actkey) {
55 }
56 lt->editlatt = MEM_callocN<EditLatt>("editlatt");
57 lt->editlatt->latt = static_cast<Lattice *>(MEM_dupallocN(lt));
58 lt->editlatt->latt->def = static_cast<BPoint *>(MEM_dupallocN(lt->def));
59
60 if (lt->dvert) {
61 int tot = lt->pntsu * lt->pntsv * lt->pntsw;
62 lt->editlatt->latt->dvert = MEM_malloc_arrayN<MDeformVert>(size_t(tot), "Lattice MDeformVert");
64 }
65
66 if (lt->key) {
67 lt->editlatt->shapenr = obedit->shapenr;
68 }
69}
70
72{
73 Lattice *lt, *editlt;
74 KeyBlock *actkey;
75 BPoint *bp;
76 float *fp;
77 int tot;
78
79 lt = static_cast<Lattice *>(obedit->data);
80 editlt = lt->editlatt->latt;
81
82 MEM_freeN(lt->def);
83
84 lt->def = static_cast<BPoint *>(MEM_dupallocN(editlt->def));
85
86 lt->flag = editlt->flag;
87
88 lt->pntsu = editlt->pntsu;
89 lt->pntsv = editlt->pntsv;
90 lt->pntsw = editlt->pntsw;
91
92 lt->typeu = editlt->typeu;
93 lt->typev = editlt->typev;
94 lt->typew = editlt->typew;
95 lt->actbp = editlt->actbp;
96
97 lt->fu = editlt->fu;
98 lt->fv = editlt->fv;
99 lt->fw = editlt->fw;
100 lt->du = editlt->du;
101 lt->dv = editlt->dv;
102 lt->dw = editlt->dw;
103
104 if (lt->editlatt->shapenr) {
105 actkey = static_cast<KeyBlock *>(BLI_findlink(&lt->key->block, lt->editlatt->shapenr - 1));
106
107 /* active key: vertices */
108 tot = editlt->pntsu * editlt->pntsv * editlt->pntsw;
109
110 if (actkey->data) {
111 MEM_freeN(actkey->data);
112 }
113
114 fp = static_cast<float *>(
115 actkey->data = MEM_calloc_arrayN(tot, size_t(lt->key->elemsize), "actkey->data"));
116 actkey->totelem = tot;
117
118 bp = editlt->def;
119 while (tot--) {
120 copy_v3_v3(fp, bp->vec);
121 fp += 3;
122 bp++;
123 }
124 }
125
126 if (lt->dvert) {
127 BKE_defvert_array_free(lt->dvert, lt->pntsu * lt->pntsv * lt->pntsw);
128 lt->dvert = nullptr;
129 }
130
131 if (editlt->dvert) {
132 tot = lt->pntsu * lt->pntsv * lt->pntsw;
133
134 lt->dvert = MEM_malloc_arrayN<MDeformVert>(size_t(tot), "Lattice MDeformVert");
135 BKE_defvert_array_copy(lt->dvert, editlt->dvert, tot);
136 }
137}
support for deformation groups and hooks.
void BKE_defvert_array_free(MDeformVert *dvert, int totvert)
Definition deform.cc:1074
void BKE_defvert_array_copy(MDeformVert *dst, const MDeformVert *src, int totvert)
Definition deform.cc:1038
KeyBlock * BKE_keyblock_from_object(Object *ob)
Definition key.cc:1889
void BKE_keyblock_convert_to_lattice(const KeyBlock *kb, Lattice *lt)
Definition key.cc:2002
void * BLI_findlink(const ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
Definition listbase.cc:534
MINLINE void copy_v3_v3(float r[3], const float a[3])
Object is a sort of wrapper for general info.
Read Guarded memory(de)allocation.
void BKE_editlattice_make(Object *obedit)
void BKE_editlattice_free(Object *ob)
void BKE_editlattice_load(Object *obedit)
void * MEM_calloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:123
void * MEM_callocN(size_t len, const char *str)
Definition mallocn.cc:118
void * MEM_malloc_arrayN(size_t len, size_t size, const char *str)
Definition mallocn.cc:133
void * MEM_dupallocN(const void *vmemh)
Definition mallocn.cc:143
void MEM_freeN(void *vmemh)
Definition mallocn.cc:113
float vec[4]
struct Lattice * latt
void * data
int elemsize
ListBase block
struct Key * key
struct MDeformVert * dvert
struct EditLatt * editlatt
struct BPoint * def