66
63
#include "BKE_deform.h"
68
//XXX #include "BIF_editdeform.h"
70
void calc_lat_fudu(int flag, int res, float *fu, float *du)
66
void calc_lat_fudu(int flag, int res, float *r_fu, float *r_du)
76
72
else if (flag & LT_GRID) {
73
*r_fu = -0.5f * (res - 1);
78
*r_du = 2.0f / (res - 1);
86
void resizelattice(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb)
82
void BKE_lattice_resize(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb)
90
float fu, fv, fw, uc, vc, wc, du=0.0, dv=0.0, dw=0.0;
86
float fu, fv, fw, uc, vc, wc, du = 0.0, dv = 0.0, dw = 0.0;
91
87
float *co, (*vertexCos)[3] = NULL;
93
89
/* vertex weight groups are just freed all for now */
95
free_dverts(lt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
91
BKE_defvert_array_free(lt->dvert, lt->pntsu * lt->pntsv * lt->pntsw);
99
while (uNew*vNew*wNew > 32000) {
100
if ( uNew>=vNew && uNew>=wNew) uNew--;
101
else if ( vNew>=uNew && vNew>=wNew) vNew--;
95
while (uNew * vNew * wNew > 32000) {
96
if (uNew >= vNew && uNew >= wNew) uNew--;
97
else if (vNew >= uNew && vNew >= wNew) vNew--;
105
vertexCos = MEM_mallocN(sizeof(*vertexCos)*uNew*vNew*wNew, "tmp_vcos");
101
vertexCos = MEM_mallocN(sizeof(*vertexCos) * uNew * vNew * wNew, "tmp_vcos");
107
103
calc_lat_fudu(lt->flag, uNew, &fu, &du);
108
104
calc_lat_fudu(lt->flag, vNew, &fv, &dv);
109
105
calc_lat_fudu(lt->flag, wNew, &fw, &dw);
111
/* If old size is different then resolution changed in interface,
112
* try to do clever reinit of points. Pretty simply idea, we just
113
* deform new verts by old lattice, but scaling them to match old
107
/* If old size is different then resolution changed in interface,
108
* try to do clever reinit of points. Pretty simply idea, we just
109
* deform new verts by old lattice, but scaling them to match old
117
if (uNew!=1 && lt->pntsu!=1) {
113
if (uNew != 1 && lt->pntsu != 1) {
119
du = (lt->pntsu-1)*lt->du/(uNew-1);
115
du = (lt->pntsu - 1) * lt->du / (uNew - 1);
122
if (vNew!=1 && lt->pntsv!=1) {
118
if (vNew != 1 && lt->pntsv != 1) {
124
dv = (lt->pntsv-1)*lt->dv/(vNew-1);
120
dv = (lt->pntsv - 1) * lt->dv / (vNew - 1);
127
if (wNew!=1 && lt->pntsw!=1) {
123
if (wNew != 1 && lt->pntsw != 1) {
129
dw = (lt->pntsw-1)*lt->dw/(wNew-1);
125
dw = (lt->pntsw - 1) * lt->dw / (wNew - 1);
133
129
co = vertexCos[0];
134
for (w=0,wc=fw; w<wNew; w++,wc+=dw) {
135
for (v=0,vc=fv; v<vNew; v++,vc+=dv) {
136
for (u=0,uc=fu; u<uNew; u++,co+=3,uc+=du) {
130
for (w = 0, wc = fw; w < wNew; w++, wc += dw) {
131
for (v = 0, vc = fv; v < vNew; v++, vc += dv) {
132
for (u = 0, uc = fu; u < uNew; u++, co += 3, uc += du) {
146
142
int typeu = lt->typeu, typev = lt->typev, typew = lt->typew;
148
/* works best if we force to linear type (endpoints match) */
144
/* works best if we force to linear type (endpoints match) */
149
145
lt->typeu = lt->typev = lt->typew = KEY_LINEAR;
151
/* prevent using deformed locations */
152
freedisplist(<Ob->disp);
147
/* prevent using deformed locations */
148
BKE_displist_free(<Ob->disp);
154
150
copy_m4_m4(mat, ltOb->obmat);
155
151
unit_m4(ltOb->obmat);
156
lattice_deform_verts(ltOb, NULL, NULL, vertexCos, uNew*vNew*wNew, NULL, 1.0f);
152
lattice_deform_verts(ltOb, NULL, NULL, vertexCos, uNew * vNew * wNew, NULL, 1.0f);
157
153
copy_m4_m4(ltOb->obmat, mat);
159
155
lt->typeu = typeu;
173
169
lt->pntsw = wNew;
175
171
MEM_freeN(lt->def);
176
lt->def= MEM_callocN(lt->pntsu*lt->pntsv*lt->pntsw*sizeof(BPoint), "lattice bp");
180
for (i=0; i<lt->pntsu*lt->pntsv*lt->pntsw; i++,bp++) {
172
lt->def = MEM_callocN(lt->pntsu * lt->pntsv * lt->pntsw * sizeof(BPoint), "lattice bp");
176
for (i = 0; i < lt->pntsu * lt->pntsv * lt->pntsw; i++, bp++) {
181
177
copy_v3_v3(bp->vec, vertexCos[i]);
184
180
MEM_freeN(vertexCos);
187
Lattice *add_lattice(const char *name)
183
Lattice *BKE_lattice_add(Main *bmain, const char *name)
191
lt= alloc_libblock(&G.main->latt, ID_LT, name);
195
lt->typeu= lt->typev= lt->typew= KEY_BSPLINE;
197
lt->def= MEM_callocN(sizeof(BPoint), "lattvert"); /* temporary */
198
resizelattice(lt, 2, 2, 2, NULL); /* creates a uniform lattice */
187
lt = BKE_libblock_alloc(&bmain->latt, ID_LT, name);
191
lt->typeu = lt->typev = lt->typew = KEY_BSPLINE;
193
lt->def = MEM_callocN(sizeof(BPoint), "lattvert"); /* temporary */
194
BKE_lattice_resize(lt, 2, 2, 2, NULL); /* creates a uniform lattice */
203
Lattice *copy_lattice(Lattice *lt)
199
Lattice *BKE_lattice_copy(Lattice *lt)
207
ltn= copy_libblock(<->id);
208
ltn->def= MEM_dupallocN(lt->def);
203
ltn = BKE_libblock_copy(<->id);
204
ltn->def = MEM_dupallocN(lt->def);
210
ltn->key= copy_key(ltn->key);
211
if (ltn->key) ltn->key->from= (ID *)ltn;
206
ltn->key = BKE_key_copy(ltn->key);
207
if (ltn->key) ltn->key->from = (ID *)ltn;
214
int tot= lt->pntsu*lt->pntsv*lt->pntsw;
215
ltn->dvert = MEM_mallocN (sizeof (MDeformVert)*tot, "Lattice MDeformVert");
216
copy_dverts(ltn->dvert, lt->dvert, tot);
210
int tot = lt->pntsu * lt->pntsv * lt->pntsw;
211
ltn->dvert = MEM_mallocN(sizeof(MDeformVert) * tot, "Lattice MDeformVert");
212
BKE_defvert_array_copy(ltn->dvert, lt->dvert, tot);
215
ltn->editlatt = NULL;
224
void free_lattice(Lattice *lt)
220
void BKE_lattice_free(Lattice *lt)
226
222
if (lt->def) MEM_freeN(lt->def);
227
if (lt->dvert) free_dverts(lt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
223
if (lt->dvert) BKE_defvert_array_free(lt->dvert, lt->pntsu * lt->pntsv * lt->pntsw);
228
224
if (lt->editlatt) {
229
Lattice *editlt= lt->editlatt->latt;
225
Lattice *editlt = lt->editlatt->latt;
231
227
if (editlt->def) MEM_freeN(editlt->def);
232
if (editlt->dvert) free_dverts(editlt->dvert, lt->pntsu*lt->pntsv*lt->pntsw);
228
if (editlt->dvert) BKE_defvert_array_free(editlt->dvert, lt->pntsu * lt->pntsv * lt->pntsw);
234
230
MEM_freeN(editlt);
235
231
MEM_freeN(lt->editlatt);
238
234
/* free animation data */
240
236
BKE_free_animdata(<->id);
246
void make_local_lattice(Lattice *lt)
242
void BKE_lattice_make_local(Lattice *lt)
244
Main *bmain = G.main;
250
int is_local= FALSE, is_lib= FALSE;
246
int is_local = FALSE, is_lib = FALSE;
252
248
/* - only lib users: do nothing
253
249
* - only local users: set flag
254
250
* - mixed: make copy
257
if (lt->id.lib==NULL) return;
253
if (lt->id.lib == NULL) return;
254
if (lt->id.us == 1) {
259
255
id_clear_lib_data(bmain, <->id);
263
for (ob= bmain->object.first; ob && ELEM(FALSE, is_lib, is_local); ob= ob->id.next) {
265
if (ob->id.lib) is_lib= TRUE;
259
for (ob = bmain->object.first; ob && ELEM(FALSE, is_lib, is_local); ob = ob->id.next) {
260
if (ob->data == lt) {
261
if (ob->id.lib) is_lib = TRUE;
262
else is_local = TRUE;
270
if (is_local && is_lib==FALSE) {
266
if (is_local && is_lib == FALSE) {
271
267
id_clear_lib_data(bmain, <->id);
273
269
else if (is_local && is_lib) {
274
Lattice *lt_new= copy_lattice(lt);
270
Lattice *lt_new = BKE_lattice_copy(lt);
277
273
/* Remap paths of new ID using old library as base. */
278
274
BKE_id_lib_local_paths(bmain, lt->id.lib, <_new->id);
280
for (ob= bmain->object.first; ob; ob= ob->id.next) {
282
if (ob->id.lib==NULL) {
276
for (ob = bmain->object.first; ob; ob = ob->id.next) {
277
if (ob->data == lt) {
278
if (ob->id.lib == NULL) {
292
288
void init_latt_deform(Object *oblatt, Object *ob)
294
/* we make an array with all differences */
295
Lattice *lt= oblatt->data;
290
/* we make an array with all differences */
291
Lattice *lt = oblatt->data;
297
DispList *dl = find_displist(&oblatt->disp, DL_VERTS);
298
float *co = dl?dl->verts:NULL;
293
DispList *dl = BKE_displist_find(&oblatt->disp, DL_VERTS);
294
float *co = dl ? dl->verts : NULL;
299
295
float *fp, imat[4][4];
300
296
float fu, fv, fw;
303
if (lt->editlatt) lt= lt->editlatt->latt;
299
if (lt->editlatt) lt = lt->editlatt->latt;
306
fp= lt->latticedata= MEM_mallocN(sizeof(float)*3*lt->pntsu*lt->pntsv*lt->pntsw, "latticedata");
302
fp = lt->latticedata = MEM_mallocN(sizeof(float) * 3 * lt->pntsu * lt->pntsv * lt->pntsw, "latticedata");
308
/* for example with a particle system: ob==0 */
304
/* for example with a particle system: (ob == NULL) */
310
306
/* in deformspace, calc matrix */
311
307
invert_m4_m4(lt->latmat, oblatt->obmat);
345
void calc_latt_deform(Object *ob, float *co, float weight)
341
void calc_latt_deform(Object *ob, float co[3], float weight)
347
Lattice *lt= ob->data;
343
Lattice *lt = ob->data;
348
344
float u, v, w, tu[4], tv[4], tw[4];
350
346
int idx_w, idx_v, idx_u;
351
347
int ui, vi, wi, uu, vv, ww;
353
349
/* vgroup influence */
355
float co_prev[3], weight_blend= 0.0f;
356
MDeformVert *dvert= lattice_get_deform_verts(ob);
359
if (lt->editlatt) lt= lt->editlatt->latt;
360
if (lt->latticedata==NULL) return;
350
int defgrp_index = -1;
351
float co_prev[3], weight_blend = 0.0f;
352
MDeformVert *dvert = BKE_lattice_deform_verts_get(ob);
355
if (lt->editlatt) lt = lt->editlatt->latt;
356
if (lt->latticedata == NULL) return;
362
358
if (lt->vgroup[0] && dvert) {
363
defgroup_nr= defgroup_name_index(ob, lt->vgroup);
359
defgrp_index = defgroup_name_index(ob, lt->vgroup);
364
360
copy_v3_v3(co_prev, co);
370
366
/* u v w coords */
373
u= (vec[0]-lt->fu)/lt->du;
369
u = (vec[0] - lt->fu) / lt->du;
376
372
key_curve_position_weights(u, tu, lt->typeu);
379
tu[0]= tu[2]= tu[3]= 0.0; tu[1]= 1.0;
375
tu[0] = tu[2] = tu[3] = 0.0; tu[1] = 1.0;
384
v= (vec[1]-lt->fv)/lt->dv;
380
v = (vec[1] - lt->fv) / lt->dv;
387
383
key_curve_position_weights(v, tv, lt->typev);
390
tv[0]= tv[2]= tv[3]= 0.0; tv[1]= 1.0;
386
tv[0] = tv[2] = tv[3] = 0.0; tv[1] = 1.0;
395
w= (vec[2]-lt->fw)/lt->dw;
391
w = (vec[2] - lt->fw) / lt->dw;
398
394
key_curve_position_weights(w, tw, lt->typew);
401
tw[0]= tw[2]= tw[3]= 0.0; tw[1]= 1.0;
397
tw[0] = tw[2] = tw[3] = 0.0; tw[1] = 1.0;
405
for (ww= wi-1; ww<=wi+2; ww++) {
401
for (ww = wi - 1; ww <= wi + 2; ww++) {
410
if (ww<lt->pntsw) idx_w= ww*lt->pntsu*lt->pntsv;
411
else idx_w= (lt->pntsw-1)*lt->pntsu*lt->pntsv;
406
if (ww < lt->pntsw) idx_w = ww * lt->pntsu * lt->pntsv;
407
else idx_w = (lt->pntsw - 1) * lt->pntsu * lt->pntsv;
415
for (vv= vi-1; vv<=vi+2; vv++) {
411
for (vv = vi - 1; vv <= vi + 2; vv++) {
412
v = w * tv[vv - vi + 1];
420
if (vv<lt->pntsv) idx_v= idx_w + vv*lt->pntsu;
421
else idx_v= idx_w + (lt->pntsv-1)*lt->pntsu;
416
if (vv < lt->pntsv) idx_v = idx_w + vv * lt->pntsu;
417
else idx_v = idx_w + (lt->pntsv - 1) * lt->pntsu;
425
for (uu= ui-1; uu<=ui+2; uu++) {
426
u= weight*v*tu[uu-ui+1];
421
for (uu = ui - 1; uu <= ui + 2; uu++) {
422
u = weight * v * tu[uu - ui + 1];
430
if (uu<lt->pntsu) idx_u= idx_v + uu;
431
else idx_u= idx_v + (lt->pntsu-1);
426
if (uu < lt->pntsu) idx_u = idx_v + uu;
427
else idx_u = idx_v + (lt->pntsu - 1);
435
431
madd_v3_v3fl(co, <->latticedata[idx_u * 3], u);
437
if (defgroup_nr != -1)
438
weight_blend += (u * defvert_find_weight(dvert + idx_u, defgroup_nr));
433
if (defgrp_index != -1)
434
weight_blend += (u * defvert_find_weight(dvert + idx_u, defgrp_index));
484
480
static int where_on_path_deform(Object *ob, float ctime, float vec[4], float dir[3], float quat[4], float *radius)
482
Curve *cu = ob->data;
491
487
/* test for cyclic */
493
489
if (!bl->nr) return 0;
494
if (bl && bl->poly> -1) cycl= 1;
490
if (bl->poly > -1) cycl = 1;
497
ctime1= CLAMPIS(ctime, 0.0f, 1.0f);
493
ctime1 = CLAMPIS(ctime, 0.0f, 1.0f);
501
497
/* vec needs 4 items */
502
498
if (where_on_path(ob, ctime1, vec, dir, quat, radius, NULL)) {
505
Path *path= cu->path;
501
Path *path = cu->path;
508
504
if (ctime < 0.0f) {
509
505
sub_v3_v3v3(dvec, path->data[1].vec, path->data[0].vec);
510
mul_v3_fl(dvec, ctime*(float)path->len);
506
mul_v3_fl(dvec, ctime * (float)path->len);
511
507
add_v3_v3(vec, dvec);
512
508
if (quat) copy_qt_qt(quat, path->data[0].quat);
513
if (radius) *radius= path->data[0].radius;
509
if (radius) *radius = path->data[0].radius;
515
511
else if (ctime > 1.0f) {
516
sub_v3_v3v3(dvec, path->data[path->len-1].vec, path->data[path->len-2].vec);
517
mul_v3_fl(dvec, (ctime-1.0f)*(float)path->len);
512
sub_v3_v3v3(dvec, path->data[path->len - 1].vec, path->data[path->len - 2].vec);
513
mul_v3_fl(dvec, (ctime - 1.0f) * (float)path->len);
518
514
add_v3_v3(vec, dvec);
519
if (quat) copy_qt_qt(quat, path->data[path->len-1].quat);
520
if (radius) *radius= path->data[path->len-1].radius;
515
if (quat) copy_qt_qt(quat, path->data[path->len - 1].quat);
516
if (radius) *radius = path->data[path->len - 1].radius;
521
517
/* weight - not used but could be added */
534
530
static int calc_curve_deform(Scene *scene, Object *par, float co[3],
535
531
const short axis, CurveDeform *cd, float quat_r[4])
537
Curve *cu= par->data;
533
Curve *cu = par->data;
538
534
float fac, loc[4], dir[3], new_quat[4], radius;
540
536
const int is_neg_axis = (axis > 2);
542
538
/* to be sure, mostly after file load */
543
if (cu->path==NULL) {
544
makeDispListCurveTypes(scene, par, 0);
545
if (cu->path==NULL) return 0; // happens on append...
539
if (cu->path == NULL) {
540
BKE_displist_make_curveTypes(scene, par, 0);
541
if (cu->path == NULL) return 0; // happens on append...
549
545
if (is_neg_axis) {
550
546
index = axis - 3;
551
547
if (cu->flag & CU_STRETCH)
552
fac= (-co[index]-cd->dmax[index])/(cd->dmax[index] - cd->dmin[index]);
548
fac = (-co[index] - cd->dmax[index]) / (cd->dmax[index] - cd->dmin[index]);
554
fac= - (co[index]-cd->dmax[index])/(cu->path->totdist);
550
fac = -(co[index] - cd->dmax[index]) / (cu->path->totdist);
558
554
if (cu->flag & CU_STRETCH)
559
fac= (co[index]-cd->dmin[index])/(cd->dmax[index] - cd->dmin[index]);
555
fac = (co[index] - cd->dmin[index]) / (cd->dmax[index] - cd->dmin[index]);
561
fac= + (co[index]-cd->dmin[index])/(cu->path->totdist);
557
fac = +(co[index] - cd->dmin[index]) / (cu->path->totdist);
564
if ( where_on_path_deform(par, fac, loc, dir, new_quat, &radius)) { /* returns OK */
560
if (where_on_path_deform(par, fac, loc, dir, new_quat, &radius)) { /* returns OK */
565
561
float quat[4], cent[3];
567
if (cd->no_rot_axis) { /* set by caller */
563
if (cd->no_rot_axis) { /* set by caller */
569
565
/* this is not exactly the same as 2.4x, since the axis is having rotation removed rather than
570
566
* changing the axis before calculating the tilt but serves much the same purpose */
571
float dir_flat[3]={0,0,0}, q[4];
567
float dir_flat[3] = {0, 0, 0}, q[4];
572
568
copy_v3_v3(dir_flat, dir);
573
dir_flat[cd->no_rot_axis-1]= 0.0f;
569
dir_flat[cd->no_rot_axis - 1] = 0.0f;
575
571
normalize_v3(dir);
576
572
normalize_v3(dir_flat);
640
cu->flag |= (CU_PATH|CU_FOLLOW); // needed for path & bevlist
636
cu->flag |= (CU_PATH | CU_FOLLOW); // needed for path & bevlist
642
638
init_curve_deform(cuOb, target, &cd);
644
640
/* dummy bounds, keep if CU_DEFORM_BOUNDS_OFF is set */
645
641
if (is_neg_axis == FALSE) {
646
cd.dmin[0]= cd.dmin[1]= cd.dmin[2]= 0.0f;
647
cd.dmax[0]= cd.dmax[1]= cd.dmax[2]= 1.0f;
642
cd.dmin[0] = cd.dmin[1] = cd.dmin[2] = 0.0f;
643
cd.dmax[0] = cd.dmax[1] = cd.dmax[2] = 1.0f;
650
646
/* negative, these bounds give a good rest position */
651
cd.dmin[0]= cd.dmin[1]= cd.dmin[2]= -1.0f;
652
cd.dmax[0]= cd.dmax[1]= cd.dmax[2]= 0.0f;
647
cd.dmin[0] = cd.dmin[1] = cd.dmin[2] = -1.0f;
648
cd.dmax[0] = cd.dmax[1] = cd.dmax[2] = 0.0f;
655
651
/* check whether to use vertex groups (only possible if target is a Mesh)
656
652
* we want either a Mesh with no derived data, or derived data with
659
if (target && target->type==OB_MESH) {
655
if (target && target->type == OB_MESH) {
660
656
/* if there's derived data without deformverts, don't use vgroups */
661
if (dm && !dm->getVertData(dm, 0, CD_MDEFORMVERT))
658
use_vgroups = (dm->getVertData(dm, 0, CD_MDEFORMVERT) != NULL);
661
Mesh *me = target->data;
662
use_vgroups = (me->dvert != NULL);
670
669
if (vgroup && vgroup[0] && use_vgroups) {
671
Mesh *me= target->data;
672
int index= defgroup_name_index(target, vgroup);
670
Mesh *me = target->data;
671
const int defgrp_index = defgroup_name_index(target, vgroup);
674
if (index != -1 && (me->dvert || dm)) {
673
if (defgrp_index != -1 && (me->dvert || dm)) {
675
674
MDeformVert *dvert = me->dvert;
799
798
* we want either a Mesh with no derived data, or derived data with
802
if (target && target->type==OB_MESH) {
801
if (target && target->type == OB_MESH) {
803
802
/* if there's derived data without deformverts, don't use vgroups */
804
if (dm && !dm->getVertData(dm, 0, CD_MDEFORMVERT))
804
use_vgroups = (dm->getVertData(dm, 0, CD_MDEFORMVERT) != NULL);
807
Mesh *me = target->data;
808
use_vgroups = (me->dvert != NULL);
813
815
if (vgroup && vgroup[0] && use_vgroups) {
814
816
Mesh *me = target->data;
815
int index = defgroup_name_index(target, vgroup);
817
const int defgrp_index = defgroup_name_index(target, vgroup);
818
if (index >= 0 && (me->dvert || dm)) {
820
if (defgrp_index >= 0 && (me->dvert || dm)) {
819
821
MDeformVert *dvert = me->dvert;
821
823
for (a = 0; a < numVerts; a++, dvert++) {
822
824
if (dm) dvert = dm->getVertData(dm, a, CD_MDEFORMVERT);
824
weight= defvert_find_weight(dvert, index);
826
weight = defvert_find_weight(dvert, defgrp_index);
826
828
if (weight > 0.0f)
827
829
calc_latt_deform(laOb, vertexCos[a], weight * fac);
863
865
BPoint *bp, *bp1, *bp2;
865
float fac1, du=0.0, dv=0.0, dw=0.0;
867
float fac1, du = 0.0, dv = 0.0, dw = 0.0;
867
869
if (lt->flag & LT_OUTSIDE) {
870
if (lt->pntsu>1) du= 1.0f/((float)lt->pntsu-1);
871
if (lt->pntsv>1) dv= 1.0f/((float)lt->pntsv-1);
872
if (lt->pntsw>1) dw= 1.0f/((float)lt->pntsw-1);
874
for (w=0; w<lt->pntsw; w++) {
876
for (v=0; v<lt->pntsv; v++) {
878
for (u=0; u<lt->pntsu; u++, bp++) {
879
if (u==0 || v==0 || w==0 || u==lt->pntsu-1 || v==lt->pntsv-1 || w==lt->pntsw-1);
872
if (lt->pntsu > 1) du = 1.0f / ((float)lt->pntsu - 1);
873
if (lt->pntsv > 1) dv = 1.0f / ((float)lt->pntsv - 1);
874
if (lt->pntsw > 1) dw = 1.0f / ((float)lt->pntsw - 1);
876
for (w = 0; w < lt->pntsw; w++) {
878
for (v = 0; v < lt->pntsv; v++) {
880
for (u = 0; u < lt->pntsu; u++, bp++) {
881
if (u == 0 || v == 0 || w == 0 || u == lt->pntsu - 1 || v == lt->pntsv - 1 || w == lt->pntsw - 1) {
883
886
bp->f1 &= ~SELECT;
886
bp1= latt_bp(lt, 0, v, w);
887
bp2= latt_bp(lt, lt->pntsu-1, v, w);
889
bp1 = latt_bp(lt, 0, v, w);
890
bp2 = latt_bp(lt, lt->pntsu - 1, v, w);
890
bp->vec[0]= (1.0f-fac1)*bp1->vec[0] + fac1*bp2->vec[0];
891
bp->vec[1]= (1.0f-fac1)*bp1->vec[1] + fac1*bp2->vec[1];
892
bp->vec[2]= (1.0f-fac1)*bp1->vec[2] + fac1*bp2->vec[2];
893
bp->vec[0] = (1.0f - fac1) * bp1->vec[0] + fac1 * bp2->vec[0];
894
bp->vec[1] = (1.0f - fac1) * bp1->vec[1] + fac1 * bp2->vec[1];
895
bp->vec[2] = (1.0f - fac1) * bp1->vec[2] + fac1 * bp2->vec[2];
895
bp1= latt_bp(lt, u, 0, w);
896
bp2= latt_bp(lt, u, lt->pntsv-1, w);
898
bp1 = latt_bp(lt, u, 0, w);
899
bp2 = latt_bp(lt, u, lt->pntsv - 1, w);
899
bp->vec[0]+= (1.0f-fac1)*bp1->vec[0] + fac1*bp2->vec[0];
900
bp->vec[1]+= (1.0f-fac1)*bp1->vec[1] + fac1*bp2->vec[1];
901
bp->vec[2]+= (1.0f-fac1)*bp1->vec[2] + fac1*bp2->vec[2];
902
bp->vec[0] += (1.0f - fac1) * bp1->vec[0] + fac1 * bp2->vec[0];
903
bp->vec[1] += (1.0f - fac1) * bp1->vec[1] + fac1 * bp2->vec[1];
904
bp->vec[2] += (1.0f - fac1) * bp1->vec[2] + fac1 * bp2->vec[2];
904
bp1= latt_bp(lt, u, v, 0);
905
bp2= latt_bp(lt, u, v, lt->pntsw-1);
908
bp->vec[0]+= (1.0f-fac1)*bp1->vec[0] + fac1*bp2->vec[0];
909
bp->vec[1]+= (1.0f-fac1)*bp1->vec[1] + fac1*bp2->vec[1];
910
bp->vec[2]+= (1.0f-fac1)*bp1->vec[2] + fac1*bp2->vec[2];
912
mul_v3_fl(bp->vec, 0.3333333f);
907
bp1 = latt_bp(lt, u, v, 0);
908
bp2 = latt_bp(lt, u, v, lt->pntsw - 1);
911
bp->vec[0] += (1.0f - fac1) * bp1->vec[0] + fac1 * bp2->vec[0];
912
bp->vec[1] += (1.0f - fac1) * bp1->vec[1] + fac1 * bp2->vec[1];
913
bp->vec[2] += (1.0f - fac1) * bp1->vec[2] + fac1 * bp2->vec[2];
915
mul_v3_fl(bp->vec, 1.0f / 3.0f);
924
for (w=0; w<lt->pntsw; w++)
925
for (v=0; v<lt->pntsv; v++)
926
for (u=0; u<lt->pntsu; u++, bp++)
927
for (w = 0; w < lt->pntsw; w++)
928
for (v = 0; v < lt->pntsv; v++)
929
for (u = 0; u < lt->pntsu; u++, bp++)
931
float (*lattice_getVertexCos(struct Object *ob, int *numVerts_r))[3]
934
float (*BKE_lattice_vertexcos_get(struct Object *ob, int *numVerts_r))[3]
933
936
Lattice *lt = ob->data;
935
938
float (*vertexCos)[3];
937
if (lt->editlatt) lt= lt->editlatt->latt;
938
numVerts = *numVerts_r = lt->pntsu*lt->pntsv*lt->pntsw;
940
vertexCos = MEM_mallocN(sizeof(*vertexCos)*numVerts,"lt_vcos");
942
for (i=0; i<numVerts; i++) {
940
if (lt->editlatt) lt = lt->editlatt->latt;
941
numVerts = *numVerts_r = lt->pntsu * lt->pntsv * lt->pntsw;
943
vertexCos = MEM_mallocN(sizeof(*vertexCos) * numVerts, "lt_vcos");
945
for (i = 0; i < numVerts; i++) {
943
946
copy_v3_v3(vertexCos[i], lt->def[i].vec);
946
949
return vertexCos;
949
void lattice_applyVertexCos(struct Object *ob, float (*vertexCos)[3])
952
void BKE_lattice_vertexcos_apply(struct Object *ob, float (*vertexCos)[3])
951
954
Lattice *lt = ob->data;
952
int i, numVerts = lt->pntsu*lt->pntsv*lt->pntsw;
955
int i, numVerts = lt->pntsu * lt->pntsv * lt->pntsw;
954
for (i=0; i<numVerts; i++) {
957
for (i = 0; i < numVerts; i++) {
955
958
copy_v3_v3(lt->def[i].vec, vertexCos[i]);
959
void lattice_calc_modifiers(Scene *scene, Object *ob)
962
void BKE_lattice_modifiers_calc(Scene *scene, Object *ob)
961
Lattice *lt= ob->data;
964
Lattice *lt = ob->data;
962
965
ModifierData *md = modifiers_getVirtualModifierList(ob);
963
966
float (*vertexCos)[3] = NULL;
964
int numVerts, editmode = (lt->editlatt!=NULL);
966
freedisplist(&ob->disp);
968
for (; md; md=md->next) {
967
int numVerts, editmode = (lt->editlatt != NULL);
969
BKE_displist_free(&ob->disp);
971
for (; md; md = md->next) {
969
972
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
973
if (!(md->mode&eModifierMode_Realtime)) continue;
974
if (editmode && !(md->mode&eModifierMode_Editmode)) continue;
976
if (!(md->mode & eModifierMode_Realtime)) continue;
977
if (editmode && !(md->mode & eModifierMode_Editmode)) continue;
975
978
if (mti->isDisabled && mti->isDisabled(md, 0)) continue;
976
if (mti->type!=eModifierTypeType_OnlyDeform) continue;
979
if (mti->type != eModifierTypeType_OnlyDeform) continue;
978
if (!vertexCos) vertexCos = lattice_getVertexCos(ob, &numVerts);
979
mti->deformVerts(md, ob, NULL, vertexCos, numVerts, 0, 0);
981
if (!vertexCos) vertexCos = BKE_lattice_vertexcos_get(ob, &numVerts);
982
mti->deformVerts(md, ob, NULL, vertexCos, numVerts, 0);
982
985
/* always displist to make this work like derivedmesh */
983
if (!vertexCos) vertexCos = lattice_getVertexCos(ob, &numVerts);
986
if (!vertexCos) vertexCos = BKE_lattice_vertexcos_get(ob, &numVerts);
986
989
DispList *dl = MEM_callocN(sizeof(*dl), "lt_dl");
987
990
dl->type = DL_VERTS;
989
992
dl->nr = numVerts;
990
dl->verts = (float*) vertexCos;
993
dl->verts = (float *) vertexCos;
992
995
BLI_addtail(&ob->disp, dl);
996
struct MDeformVert* lattice_get_deform_verts(struct Object *oblatt)
999
struct MDeformVert *BKE_lattice_deform_verts_get(struct Object *oblatt)
998
Lattice *lt = (Lattice*)oblatt->data;
1001
Lattice *lt = (Lattice *)oblatt->data;
999
1002
BLI_assert(oblatt->type == OB_LATTICE);
1000
if (lt->editlatt) lt= lt->editlatt->latt;
1003
if (lt->editlatt) lt = lt->editlatt->latt;
1001
1004
return lt->dvert;
1007
void BKE_lattice_center_median(struct Lattice *lt, float cent[3])
1011
if (lt->editlatt) lt = lt->editlatt->latt;
1012
numVerts = lt->pntsu * lt->pntsv * lt->pntsw;
1016
for (i = 0; i < numVerts; i++)
1017
add_v3_v3(cent, lt->def[i].vec);
1019
mul_v3_fl(cent, 1.0f / (float)numVerts);
1022
void BKE_lattice_minmax(struct Lattice *lt, float min[3], float max[3])
1026
if (lt->editlatt) lt = lt->editlatt->latt;
1027
numVerts = lt->pntsu * lt->pntsv * lt->pntsw;
1029
for (i = 0; i < numVerts; i++)
1030
minmax_v3v3_v3(min, max, lt->def[i].vec);
1033
void BKE_lattice_center_bounds(struct Lattice *lt, float cent[3])
1035
float min[3], max[3];
1037
INIT_MINMAX(min, max);
1039
BKE_lattice_minmax(lt, min, max);
1040
mid_v3_v3v3(cent, min, max);
1043
void BKE_lattice_translate(Lattice *lt, float offset[3], int do_keys)
1047
numVerts = lt->pntsu * lt->pntsv * lt->pntsw;
1050
for (i = 0; i < numVerts; i++)
1051
add_v3_v3(lt->def[i].vec, offset);
1054
for (i = 0; i < numVerts; i++)
1055
add_v3_v3(lt->editlatt->latt->def[i].vec, offset);
1057
if (do_keys && lt->key) {
1060
for (kb = lt->key->block.first; kb; kb = kb->next) {
1061
float *fp = kb->data;
1062
for (i = kb->totelem; i--; fp += 3) {
1063
add_v3_v3(fp, offset);