Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
path: root/source
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2005-08-15 14:30:53 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-08-15 14:30:53 +0400
commit2abd79b491c024eee8ad460815486fc051aefbf4 (patch)
treeb9579c776265c21f3fd8486f9a830dc6a26cf82a /source
parent91cd2d8138fee78dbc1ea4ef05ce7517cc4a5909 (diff)
- readded DL_VERTS type to store lattice deformed verts
- new feature, twiddled with lattice resizing to try to maintain existing vertex changes... much nicer than just resetting the lattice if you decide you need more detail in the lattice. - modifiers work with lattices now. yes, that does mean you can make a chain of lattices effecting each other 8 miles long. - some cleanup of softbody code, was rather splintered and call path was twisted and confusing. reworked main object step routine to do things in a more obvious and consistent manner and without duplicate code - added ob->softflag OB_SB_RESET instead of sbObjectReset call - modifier changes reset softbody now - moved curve_getVertexCos/curve_applyVertexCos into curve.c - update curve modifier eval to work with virtual modifiers - update modifier apply to work with curves/surfs - update make parent to also recalc object data NOTE: Although you can turn SB on for curve/font objects at the moment it doesn't really work because they call deform in multiple steps and this confuses SB. Not sure how to deal with atm.
Diffstat (limited to 'source')
-rw-r--r--source/blender/blenkernel/BKE_curve.h3
-rw-r--r--source/blender/blenkernel/BKE_displist.h1
-rw-r--r--source/blender/blenkernel/BKE_lattice.h6
-rw-r--r--source/blender/blenkernel/BKE_softbody.h24
-rw-r--r--source/blender/blenkernel/intern/curve.c54
-rw-r--r--source/blender/blenkernel/intern/displist.c70
-rw-r--r--source/blender/blenkernel/intern/lattice.c281
-rw-r--r--source/blender/blenkernel/intern/modifier.c2
-rw-r--r--source/blender/blenkernel/intern/object.c3
-rw-r--r--source/blender/blenkernel/intern/softbody.c408
-rw-r--r--source/blender/blenloader/intern/readfile.c14
-rw-r--r--source/blender/include/butspace.h1
-rw-r--r--source/blender/makesdna/DNA_lattice_types.h4
-rw-r--r--source/blender/makesdna/DNA_object_force.h1
-rw-r--r--source/blender/python/api2_2x/Lattice.c5
-rw-r--r--source/blender/src/buttons_editing.c94
-rw-r--r--source/blender/src/buttons_object.c6
-rw-r--r--source/blender/src/drawobject.c176
-rw-r--r--source/blender/src/editmesh_loop.c2
-rw-r--r--source/blender/src/editobject.c7
-rwxr-xr-xsource/blender/src/transform_conversions.c2
21 files changed, 547 insertions, 617 deletions
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 4effdb6af8a..03a7cfe0096 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -86,5 +86,8 @@ void sethandlesNurb(short code);
void swapdata(void *adr1, void *adr2, int len);
void switchdirectionNurb( struct Nurb *nu);
+float (*curve_getVertexCos(struct Curve *cu, struct ListBase *lb, int *numVerts_r))[3];
+void curve_applyVertexCos(struct Curve *cu, struct ListBase *lb, float (*vertexCos)[3]);
+
#endif
diff --git a/source/blender/blenkernel/BKE_displist.h b/source/blender/blenkernel/BKE_displist.h
index 434f9fb1ef9..021b584036f 100644
--- a/source/blender/blenkernel/BKE_displist.h
+++ b/source/blender/blenkernel/BKE_displist.h
@@ -42,6 +42,7 @@
#define DL_INDEX3 4
#define DL_INDEX4 5
#define DL_VERTCOL 6
+#define DL_VERTS 7
/* dl->flag */
#define DL_CYCL_U 1
diff --git a/source/blender/blenkernel/BKE_lattice.h b/source/blender/blenkernel/BKE_lattice.h
index 48e8f9fb8b3..073810fd37b 100644
--- a/source/blender/blenkernel/BKE_lattice.h
+++ b/source/blender/blenkernel/BKE_lattice.h
@@ -41,7 +41,7 @@ struct BPoint;
extern struct Lattice *editLatt;
-void resizelattice(struct Lattice *lt);
+void resizelattice(struct Lattice *lt, int u, int v, int w, struct Object *ltOb);
struct Lattice *add_lattice(void);
struct Lattice *copy_lattice(struct Lattice *lt);
void free_lattice(struct Lattice *lt);
@@ -51,11 +51,13 @@ void init_latt_deform(struct Object *oblatt, struct Object *ob);
void calc_latt_deform(float *co);
void end_latt_deform(void);
int object_deform_mball(struct Object *ob);
-struct BPoint *latt_bp(struct Lattice *lt, int u, int v, int w);
void outside_lattice(struct Lattice *lt);
void curve_deform_verts(struct Object *cuOb, struct Object *target, float (*vertexCos)[3], int numVerts);
void lattice_deform_verts(struct Object *laOb, struct Object *target, float (*vertexCos)[3], int numVerts);
void armature_deform_verts(struct Object *armOb, struct Object *target, float (*vertexCos)[3], int numVerts);
+float (*lattice_getVertexCos(struct Object *ob, int *numVerts_r))[3];
+void lattice_applyVertexCos(struct Object *ob, float (*vertexCos)[3]);
+void lattice_calc_modifiers(struct Object *ob);
#endif
diff --git a/source/blender/blenkernel/BKE_softbody.h b/source/blender/blenkernel/BKE_softbody.h
index f47cb1b51e3..3ead7445c03 100644
--- a/source/blender/blenkernel/BKE_softbody.h
+++ b/source/blender/blenkernel/BKE_softbody.h
@@ -34,19 +34,6 @@
#ifndef BKE_SOFTBODY_H
#define BKE_SOFTBODY_H
-typedef struct BodyPoint {
- float origS[3], origE[3], origT[3], pos[3], vec[3], force[3];
- float weight, goal;
- float prevpos[3], prevvec[3], prevdx[3], prevdv[3]; /* used for Heun integration */
- int nofsprings; int *springs;
- float contactfrict;
-} BodyPoint;
-
-typedef struct BodySpring {
- int v1, v2;
- float len, strength;
-} BodySpring;
-
struct Object;
struct SoftBody;
@@ -56,16 +43,11 @@ extern struct SoftBody *sbNew(void);
/* frees internal data and softbody itself */
extern void sbFree(struct SoftBody *sb);
-/* go one step in simulation, copy result in vertexCos for meshes, or
- * directly for lattices.
- */
-extern void sbObjectStep(struct Object *ob, float framnr, float (*vertexCos)[3]);
+/* do one simul step, reading and writing vertex locs from given array */
+extern void sbObjectStep(struct Object *ob, float framnr, float (*vertexCos)[3], int numVerts);
/* makes totally fresh start situation, resets time */
-extern void sbObjectToSoftbody(struct Object *ob, float (*vertexCos)[3]);
-
-/* resets all motion and time */
-extern void sbObjectReset(struct Object *ob, float (*vertexCos)[3]);
+extern void sbObjectToSoftbody(struct Object *ob);
#endif
diff --git a/source/blender/blenkernel/intern/curve.c b/source/blender/blenkernel/intern/curve.c
index 150f5eddd41..b1f8fcca6bf 100644
--- a/source/blender/blenkernel/intern/curve.c
+++ b/source/blender/blenkernel/intern/curve.c
@@ -2411,3 +2411,57 @@ void switchdirectionNurb(Nurb *nu)
}
}
}
+
+
+float (*curve_getVertexCos(Curve *cu, ListBase *lb, int *numVerts_r))[3]
+{
+ int i, numVerts = *numVerts_r = count_curveverts(lb);
+ float *co, (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "cu_vcos");
+ Nurb *nu;
+
+ co = cos[0];
+ for (nu=lb->first; nu; nu=nu->next) {
+ if ((nu->type & 7)==CU_BEZIER) {
+ BezTriple *bezt = nu->bezt;
+
+ for (i=0; i<nu->pntsu; i++,bezt++) {
+ VECCOPY(co, bezt->vec[0]); co+=3;
+ VECCOPY(co, bezt->vec[1]); co+=3;
+ VECCOPY(co, bezt->vec[2]); co+=3;
+ }
+ } else {
+ BPoint *bp = nu->bp;
+
+ for (i=0; i<nu->pntsu*nu->pntsv; i++,bp++) {
+ VECCOPY(co, bp->vec); co+=3;
+ }
+ }
+ }
+
+ return cos;
+}
+
+void curve_applyVertexCos(Curve *cu, ListBase *lb, float (*vertexCos)[3])
+{
+ float *co = vertexCos[0];
+ Nurb *nu;
+ int i;
+
+ for (nu=lb->first; nu; nu=nu->next) {
+ if ((nu->type & 7)==CU_BEZIER) {
+ BezTriple *bezt = nu->bezt;
+
+ for (i=0; i<nu->pntsu; i++,bezt++) {
+ VECCOPY(bezt->vec[0], co); co+=3;
+ VECCOPY(bezt->vec[1], co); co+=3;
+ VECCOPY(bezt->vec[2], co); co+=3;
+ }
+ } else {
+ BPoint *bp = nu->bp;
+
+ for (i=0; i<nu->pntsu*nu->pntsv; i++,bp++) {
+ VECCOPY(bp->vec, co); co+=3;
+ }
+ }
+ }
+}
diff --git a/source/blender/blenkernel/intern/displist.c b/source/blender/blenkernel/intern/displist.c
index e9c0a1ee252..4ee8fc2640f 100644
--- a/source/blender/blenkernel/intern/displist.c
+++ b/source/blender/blenkernel/intern/displist.c
@@ -1417,65 +1417,13 @@ void makeDispListMBall(Object *ob)
boundbox_displist(ob);
}
-float (*curve_getVertexCos(Curve *cu, ListBase *lb, int *numVerts_r))[3]
-{
- int i, numVerts = *numVerts_r = count_curveverts(lb);
- float *co, (*cos)[3] = MEM_mallocN(sizeof(*cos)*numVerts, "cu_vcos");
- Nurb *nu;
-
- co = cos[0];
- for (nu=lb->first; nu; nu=nu->next) {
- if ((nu->type & 7)==CU_BEZIER) {
- BezTriple *bezt = nu->bezt;
-
- for (i=0; i<nu->pntsu; i++,bezt++) {
- VECCOPY(co, bezt->vec[0]); co+=3;
- VECCOPY(co, bezt->vec[1]); co+=3;
- VECCOPY(co, bezt->vec[2]); co+=3;
- }
- } else {
- BPoint *bp = nu->bp;
-
- for (i=0; i<nu->pntsu*nu->pntsv; i++,bp++) {
- VECCOPY(co, bp->vec); co+=3;
- }
- }
- }
-
- return cos;
-}
-
-void curve_applyVertexCos(Curve *cu, ListBase *lb, float (*vertexCos)[3])
-{
- float *co = vertexCos[0];
- Nurb *nu;
- int i;
-
- for (nu=lb->first; nu; nu=nu->next) {
- if ((nu->type & 7)==CU_BEZIER) {
- BezTriple *bezt = nu->bezt;
-
- for (i=0; i<nu->pntsu; i++,bezt++) {
- VECCOPY(bezt->vec[0], co); co+=3;
- VECCOPY(bezt->vec[1], co); co+=3;
- VECCOPY(bezt->vec[2], co); co+=3;
- }
- } else {
- BPoint *bp = nu->bp;
-
- for (i=0; i<nu->pntsu*nu->pntsv; i++,bp++) {
- VECCOPY(bp->vec, co); co+=3;
- }
- }
- }
-}
-
static ModifierData *curve_get_tesselate_point(Object *ob, int forRender, int editmode)
{
- ModifierData *md, *preTesselatePoint;
+ ModifierData *md = modifiers_getVirtualModifierList(ob);
+ ModifierData *preTesselatePoint;
preTesselatePoint = NULL;
- for (md=ob->modifiers.first; md; md=md->next) {
+ for (; md; md=md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
if (!(md->mode&(1<<forRender))) continue;
@@ -1493,13 +1441,14 @@ static ModifierData *curve_get_tesselate_point(Object *ob, int forRender, int ed
void curve_calc_modifiers_pre(Object *ob, ListBase *nurb, int forRender, float (**originalVerts_r)[3], float (**deformedVerts_r)[3], int *numVerts_r)
{
int editmode = (!forRender && ob==G.obedit);
- ModifierData *md, *preTesselatePoint = curve_get_tesselate_point(ob, forRender, editmode);
+ ModifierData *md = modifiers_getVirtualModifierList(ob);
+ ModifierData *preTesselatePoint = curve_get_tesselate_point(ob, forRender, editmode);
int numVerts = 0;
float (*originalVerts)[3] = NULL;
float (*deformedVerts)[3] = NULL;
if (preTesselatePoint) {
- for (md=ob->modifiers.first; md; md=md->next) {
+ for (; md; md=md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
if (!(md->mode&(1<<forRender))) continue;
@@ -1516,8 +1465,6 @@ void curve_calc_modifiers_pre(Object *ob, ListBase *nurb, int forRender, float (
if (md==preTesselatePoint)
break;
}
- } else {
- md = ob->modifiers.first;
}
if (deformedVerts) {
@@ -1532,13 +1479,12 @@ void curve_calc_modifiers_pre(Object *ob, ListBase *nurb, int forRender, float (
void curve_calc_modifiers_post(Object *ob, ListBase *nurb, ListBase *dispbase, int forRender, float (*originalVerts)[3], float (*deformedVerts)[3])
{
int editmode = (!forRender && ob==G.obedit);
- ModifierData *md, *preTesselatePoint = curve_get_tesselate_point(ob, forRender, editmode);
+ ModifierData *md = modifiers_getVirtualModifierList(ob);
+ ModifierData *preTesselatePoint = curve_get_tesselate_point(ob, forRender, editmode);
DispList *dl;
if (preTesselatePoint) {
md = preTesselatePoint->next;
- } else {
- md = ob->modifiers.first;
}
for (; md; md=md->next) {
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 8f463886b3f..df0f9e7d8f8 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -46,6 +46,7 @@
#include "DNA_armature_types.h"
#include "DNA_mesh_types.h"
#include "DNA_meshdata_types.h"
+#include "DNA_modifier_types.h"
#include "DNA_object_types.h"
#include "DNA_scene_types.h"
#include "DNA_lattice_types.h"
@@ -62,6 +63,7 @@
#include "BKE_lattice.h"
#include "BKE_library.h"
#include "BKE_main.h"
+#include "BKE_modifier.h"
#include "BKE_object.h"
#include "BKE_screen.h"
#include "BKE_utildefines.h"
@@ -74,45 +76,120 @@
#include "blendef.h"
-Lattice *editLatt=0, *deformLatt=0;
+Lattice *editLatt=0;
+static Lattice *deformLatt=0;
-float *latticedata=0, latmat[4][4];
+static float *latticedata=0, latmat[4][4];
-void resizelattice(Lattice *lt)
+void calc_lat_fudu(int flag, int res, float *fu, float *du)
+{
+ if(res==1) {
+ *fu= 0.0;
+ *du= 0.0;
+ }
+ else if(flag & LT_GRID) {
+ *fu= -0.5f*(res-1);
+ *du= 1.0f;
+ }
+ else {
+ *fu= -1.0f;
+ *du= 2.0f/(res-1);
+ }
+}
+
+void resizelattice(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb)
{
BPoint *bp;
- int u, v, w;
- float vec[3], fu, fv, fw, du=0.0, dv=0.0, dw=0.0;
+ int i, u, v, w;
+ float fu, fv, fw, uc, vc, wc, du=0.0, dv=0.0, dw=0.0;
+ float *co, (*vertexCos)[3] = NULL;
+
+ while(uNew*vNew*wNew > 32000) {
+ if( uNew>=vNew && uNew>=wNew) uNew--;
+ else if( vNew>=uNew && vNew>=wNew) vNew--;
+ else wNew--;
+ }
+
+ vertexCos = MEM_mallocN(sizeof(*vertexCos)*uNew*vNew*wNew, "tmp_vcos");
+
+ calc_lat_fudu(lt->flag, uNew, &fu, &du);
+ calc_lat_fudu(lt->flag, vNew, &fv, &dv);
+ calc_lat_fudu(lt->flag, wNew, &fw, &dw);
+
+ /* If old size is different then resolution changed in interface,
+ * try to do clever reinit of points. Pretty simply idea, we just
+ * deform new verts by old lattice, but scaling them to match old
+ * size first.
+ */
+ if (ltOb) {
+ if (uNew!=1 && lt->pntsu!=1) {
+ fu = lt->fu;
+ du = (lt->pntsu-1)*lt->du/(uNew-1);
+ }
+
+ if (vNew!=1 && lt->pntsv!=1) {
+ fv = lt->fv;
+ dv = (lt->pntsv-1)*lt->dv/(vNew-1);
+ }
+
+ if (wNew!=1 && lt->pntsw!=1) {
+ fw = lt->fw;
+ dw = (lt->pntsw-1)*lt->dw/(wNew-1);
+ }
+ }
+
+ co = vertexCos[0];
+ for(w=0,wc=fw; w<wNew; w++,wc+=dw) {
+ for(v=0,vc=fv; v<vNew; v++,vc+=dv) {
+ for(u=0,uc=fu; u<uNew; u++,co+=3,uc+=du) {
+ co[0] = uc;
+ co[1] = vc;
+ co[2] = wc;
+ }
+ }
+ }
+ if (ltOb) {
+ float mat[4][4];
+ int typeu = lt->typeu, typev = lt->typev, typew = lt->typew;
+
+ /* works best if we force to linear type (endpoints match) */
+ lt->typeu = lt->typev = lt->typew = KEY_LINEAR;
+
+ /* prevent using deformed locations */
+ freedisplist(&ltOb->disp);
+
+ Mat4CpyMat4(mat, ltOb->obmat);
+ Mat4One(ltOb->obmat);
+ lattice_deform_verts(ltOb, NULL, vertexCos, uNew*vNew*wNew);
+ Mat4CpyMat4(ltOb->obmat, mat);
+
+ lt->typeu = typeu;
+ lt->typev = typev;
+ lt->typew = typew;
+ }
+
+ lt->fu = fu;
+ lt->fv = fv;
+ lt->fw = fw;
+ lt->du = du;
+ lt->dv = dv;
+ lt->dw = dw;
+
+ lt->pntsu = uNew;
+ lt->pntsv = vNew;
+ lt->pntsw = wNew;
MEM_freeN(lt->def);
lt->def= MEM_callocN(lt->pntsu*lt->pntsv*lt->pntsw*sizeof(BPoint), "lattice bp");
bp= lt->def;
- while(lt->pntsu*lt->pntsv*lt->pntsw > 32000) {
- if( lt->pntsu>=lt->pntsv && lt->pntsu>=lt->pntsw) lt->pntsu--;
- else if( lt->pntsv>=lt->pntsu && lt->pntsv>=lt->pntsw) lt->pntsv--;
- else lt->pntsw--;
- }
-
- calc_lat_fudu(lt->flag, lt->pntsu, &fu, &du);
- calc_lat_fudu(lt->flag, lt->pntsv, &fv, &dv);
- calc_lat_fudu(lt->flag, lt->pntsw, &fw, &dw);
-
- vec[2]= fw;
- for(w=0; w<lt->pntsw; w++) {
- vec[1]= fv;
- for(v=0; v<lt->pntsv; v++) {
- vec[0]= fu;
- for(u=0; u<lt->pntsu; u++, bp++) {
- VECCOPY(bp->vec, vec);
- vec[0]+= du;
- }
- vec[1]+= dv;
- }
- vec[2]+= dw;
+ for (i=0; i<lt->pntsu*lt->pntsv*lt->pntsw; i++,bp++) {
+ VECCOPY(bp->vec, vertexCos[i]);
}
+
+ MEM_freeN(vertexCos);
}
Lattice *add_lattice()
@@ -121,15 +198,12 @@ Lattice *add_lattice()
lt= alloc_libblock(&G.main->latt, ID_LT, "Lattice");
- lt->pntsu=lt->pntsv=lt->pntsw= 2;
lt->flag= LT_GRID;
lt->typeu= lt->typev= lt->typew= KEY_BSPLINE;
- /* temporally */
- lt->def= MEM_callocN(sizeof(BPoint), "lattvert");
-
- resizelattice(lt); /* creates a uniform lattice */
+ lt->def= MEM_callocN(sizeof(BPoint), "lattvert"); /* temporary */
+ resizelattice(lt, 2, 2, 2, NULL); /* creates a uniform lattice */
return lt;
}
@@ -207,45 +281,20 @@ void make_local_lattice(Lattice *lt)
}
}
-
-
-void calc_lat_fudu(int flag, int res, float *fu, float *du)
-{
-
- if(res==1) {
- *fu= 0.0;
- *du= 0.0;
- }
- else if(flag & LT_GRID) {
- *fu= -0.5f*(res-1);
- *du= 1.0f;
- }
- else {
- *fu= -1.0f;
- *du= 2.0f/(res-1);
- }
-
-}
-
void init_latt_deform(Object *oblatt, Object *ob)
{
- /* we make an array with all differences */
- BPoint *bp;
+ /* we make an array with all differences */
+ Lattice *lt = deformLatt = (oblatt==G.obedit)?editLatt:oblatt->data;
+ BPoint *bp = lt->def;
+ DispList *dl = find_displist(&oblatt->disp, DL_VERTS);
+ float *co = dl?dl->verts:NULL;
float *fp, imat[4][4];
- float vec[3], fu, fv, fw, du=0.0, dv=0.0, dw=0.0;
+ float fu, fv, fw;
int u, v, w;
-
- if(oblatt==G.obedit) deformLatt= editLatt;
- else deformLatt= oblatt->data;
-
+
fp= latticedata= MEM_mallocN(sizeof(float)*3*deformLatt->pntsu*deformLatt->pntsv*deformLatt->pntsw, "latticedata");
- do_latt_key(oblatt->data);
- bp= deformLatt->def;
-
- //if(ob) where_is_object(ob); causes lag here, but why! (ton)
-
- /* for example with a particle system: ob==0 */
+ /* for example with a particle system: ob==0 */
if(ob==0) {
/* in deformspace, calc matrix */
Mat4Invert(latmat, oblatt->obmat);
@@ -261,35 +310,30 @@ void init_latt_deform(Object *oblatt, Object *ob)
/* back: put in deform array */
Mat4Invert(imat, latmat);
}
- calc_lat_fudu(deformLatt->flag, deformLatt->pntsu, &fu, &du);
- calc_lat_fudu(deformLatt->flag, deformLatt->pntsv, &fv, &dv);
- calc_lat_fudu(deformLatt->flag, deformLatt->pntsw, &fw, &dw);
-
- /* we keep calculating the u v w lattice coordinates, not enough reason to store that */
- vec[2]= fw;
- for(w=0; w<deformLatt->pntsw; w++) {
- vec[1]= fv;
- for(v=0; v<deformLatt->pntsv; v++) {
- vec[0]= fu;
- for(u=0; u<deformLatt->pntsu; u++, bp++) {
-
- VecSubf(fp, bp->vec, vec);
+ for(w=0,fw=lt->fw; w<lt->pntsw; w++,fw+=lt->dw) {
+ for(v=0,fv=lt->fv; v<lt->pntsv; v++, fv+=lt->dv) {
+ for(u=0,fu=lt->fu; u<lt->pntsu; u++, bp++, co+=3, fp+=3, fu+=lt->du) {
+ if (dl) {
+ fp[0] = co[0] - fu;
+ fp[1] = co[1] - fv;
+ fp[2] = co[2] - fw;
+ } else {
+ fp[0] = bp->vec[0] - fu;
+ fp[1] = bp->vec[1] - fv;
+ fp[2] = bp->vec[2] - fw;
+ }
+
Mat4Mul3Vecfl(imat, fp);
-
- vec[0]+= du;
- fp+= 3;
}
- vec[1]+= dv;
}
- vec[2]+= dw;
}
}
void calc_latt_deform(float *co)
{
Lattice *lt;
- float fu, du, u, v, w, tu[4], tv[4], tw[4];
+ float u, v, w, tu[4], tv[4], tw[4];
float *fpw, *fpv, *fpu, vec[3];
int ui, vi, wi, uu, vv, ww;
@@ -305,8 +349,7 @@ void calc_latt_deform(float *co)
/* u v w coords */
if(lt->pntsu>1) {
- calc_lat_fudu(lt->flag, lt->pntsu, &fu, &du);
- u= (vec[0]-fu)/du;
+ u= (vec[0]-lt->fu)/lt->du;
ui= (int)floor(u);
u -= ui;
set_four_ipo(u, tu, lt->typeu);
@@ -317,8 +360,7 @@ void calc_latt_deform(float *co)
}
if(lt->pntsv>1) {
- calc_lat_fudu(lt->flag, lt->pntsv, &fu, &du);
- v= (vec[1]-fu)/du;
+ v= (vec[1]-lt->fv)/lt->dv;
vi= (int)floor(v);
v -= vi;
set_four_ipo(v, tv, lt->typev);
@@ -329,8 +371,7 @@ void calc_latt_deform(float *co)
}
if(lt->pntsw>1) {
- calc_lat_fudu(lt->flag, lt->pntsw, &fu, &du);
- w= (vec[2]-fu)/du;
+ w= (vec[2]-lt->fw)/lt->dw;
wi= (int)floor(w);
w -= wi;
set_four_ipo(w, tw, lt->typew);
@@ -568,7 +609,7 @@ int object_deform_mball(Object *ob)
}
}
-BPoint *latt_bp(Lattice *lt, int u, int v, int w)
+static BPoint *latt_bp(Lattice *lt, int u, int v, int w)
{
return lt->def+ u + v*lt->pntsu + w*lt->pntsu*lt->pntsv;
}
@@ -633,3 +674,61 @@ void outside_lattice(Lattice *lt)
}
}
+
+float (*lattice_getVertexCos(struct Object *ob, int *numVerts_r))[3]
+{
+ Lattice *lt = (G.obedit==ob)?editLatt:ob->data;
+ int i, numVerts = *numVerts_r = lt->pntsu*lt->pntsv*lt->pntsw;
+ float (*vertexCos)[3] = MEM_mallocN(sizeof(*vertexCos)*numVerts,"lt_vcos");
+
+ for (i=0; i<numVerts; i++) {
+ VECCOPY(vertexCos[i], lt->def[i].vec);
+ }
+
+ return vertexCos;
+}
+
+void lattice_applyVertexCos(struct Object *ob, float (*vertexCos)[3])
+{
+ Lattice *lt = ob->data;
+ int i, numVerts = lt->pntsu*lt->pntsv*lt->pntsw;
+
+ for (i=0; i<numVerts; i++) {
+ VECCOPY(lt->def[i].vec, vertexCos[i]);
+ }
+}
+
+void lattice_calc_modifiers(Object *ob)
+{
+ float (*vertexCos)[3] = NULL;
+ ModifierData *md = modifiers_getVirtualModifierList(ob);
+ int numVerts, editmode = G.obedit==ob;
+
+ freedisplist(&ob->disp);
+
+ if (!editmode) {
+ do_latt_key(ob->data);
+ }
+
+ for (; md; md=md->next) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+
+ if (!(md->mode&(1<<0))) continue;
+ if (editmode && !(md->mode&eModifierMode_Editmode)) continue;
+ if (mti->isDisabled && mti->isDisabled(md)) continue;
+ if (mti->type!=eModifierTypeType_OnlyDeform) continue;
+
+ if (!vertexCos) vertexCos = lattice_getVertexCos(ob, &numVerts);
+ mti->deformVerts(md, ob, NULL, vertexCos, numVerts);
+ }
+
+ if (vertexCos) {
+ DispList *dl = MEM_callocN(sizeof(*dl), "lt_dl");
+ dl->type = DL_VERTS;
+ dl->parts = 1;
+ dl->nr = numVerts;
+ dl->verts = (float*) vertexCos;
+
+ BLI_addtail(&ob->disp, dl);
+ }
+}
diff --git a/source/blender/blenkernel/intern/modifier.c b/source/blender/blenkernel/intern/modifier.c
index 8c5354b47e8..55f62446bfd 100644
--- a/source/blender/blenkernel/intern/modifier.c
+++ b/source/blender/blenkernel/intern/modifier.c
@@ -1172,7 +1172,7 @@ static void softbodyModifier_deformVerts(ModifierData *md, Object *ob, void *der
{
SoftbodyModifierData *hmd = (SoftbodyModifierData*) md;
- sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos);
+ sbObjectStep(ob, (float)G.scene->r.cfra, vertexCos, numVerts);
}
/***/
diff --git a/source/blender/blenkernel/intern/object.c b/source/blender/blenkernel/intern/object.c
index a43ae4e2978..68f75234c3d 100644
--- a/source/blender/blenkernel/intern/object.c
+++ b/source/blender/blenkernel/intern/object.c
@@ -1762,6 +1762,9 @@ void object_handle_update(Object *ob)
else if(ELEM3(ob->type, OB_CURVE, OB_SURF, OB_FONT)) {
makeDispListCurveTypes(ob, 0);
}
+ else if(ob->type==OB_LATTICE) {
+ lattice_calc_modifiers(ob);
+ }
else if(ob->type==OB_ARMATURE) {
/* this actually only happens for reading old files... */
if(ob->pose==NULL || (ob->pose->flag & POSE_RECALC))
diff --git a/source/blender/blenkernel/intern/softbody.c b/source/blender/blenkernel/intern/softbody.c
index 86ec2cc0705..7833f968c76 100644
--- a/source/blender/blenkernel/intern/softbody.c
+++ b/source/blender/blenkernel/intern/softbody.c
@@ -85,6 +85,21 @@ extern int get_defgroup_num (Object *ob, bDeformGroup *dg);
/* ********** soft body engine ******* */
+
+typedef struct BodyPoint {
+ float origS[3], origE[3], origT[3], pos[3], vec[3], force[3];
+ float weight, goal;
+ float prevpos[3], prevvec[3], prevdx[3], prevdv[3]; /* used for Heun integration */
+ int nofsprings; int *springs;
+ float contactfrict;
+} BodyPoint;
+
+typedef struct BodySpring {
+ int v1, v2;
+ float len, strength;
+} BodySpring;
+
+
#define SOFTGOALSNAP 0.999f
// if bp-> goal is above make it a *forced follow original* and skip all ODE stuff for this bp
// removes *unnecessary* stiffnes from ODE system
@@ -179,12 +194,10 @@ static void add_mesh_quad_diag_springs(Object *ob)
bs->v1= mface->v1;
bs->v2= mface->v3;
bs->strength= 1.0;
- bs->len= VecLenf( (bp+bs->v1)->origS, (bp+bs->v2)->origS);
bs++;
bs->v1= mface->v2;
bs->v2= mface->v4;
bs->strength= 1.0;
- bs->len= VecLenf( (bp+bs->v1)->origS, (bp+bs->v2)->origS);
bs++;
}
@@ -245,10 +258,10 @@ static void build_bps_springlist(Object *ob)
/* creates new softbody if didn't exist yet, makes new points and springs arrays */
-/* called in mesh_to_softbody */
static void renew_softbody(Object *ob, int totpoint, int totspring)
{
SoftBody *sb;
+ int i;
if(ob->soft==NULL) ob->soft= sbNew();
else free_softbody_intern(ob->soft);
@@ -261,6 +274,24 @@ static void renew_softbody(Object *ob, int totpoint, int totspring)
sb->bpoint= MEM_mallocN( totpoint*sizeof(BodyPoint), "bodypoint");
if(totspring)
sb->bspring= MEM_mallocN( totspring*sizeof(BodySpring), "bodyspring");
+
+ /* initialise BodyPoint array */
+ for (i=0; i<totpoint; i++) {
+ BodyPoint *bp = &sb->bpoint[i];
+
+ bp->weight= 1.0;
+ if(ob->softflag & OB_SB_GOAL) {
+ bp->goal= ob->soft->defgoal;
+ }
+ else {
+ bp->goal= 0.0f;
+ /* so this will definily be below SOFTGOALSNAP */
+ }
+
+ bp->nofsprings= 0;
+ bp->springs= NULL;
+ bp->contactfrict = 0.0f;
+ }
}
}
@@ -723,94 +754,9 @@ static void interpolate_exciter(Object *ob, int timescale, int time)
/* ************ convertors ********** */
/* for each object type we need;
- - xxxx_to_softbody(Object *ob) : a full (new) copy
- - xxxx_update_softbody(Object *ob) : update refreshes current positions
- - softbody_to_xxxx(Object *ob) : after simulation, copy vertex locations back
+ - xxxx_to_softbody(Object *ob) : a full (new) copy, creates SB geometry
*/
-/* helper call */
-static int object_has_edges(Object *ob)
-{
- if(ob->type==OB_MESH) {
- Mesh *me= ob->data;
- if(me->medge) return 1;
- }
- else if(ob->type==OB_LATTICE) {
- ;
- }
-
- return 0;
-}
-
-/* helper call */
-static void set_body_point(Object *ob, BodyPoint *bp, float *vec)
-{
- VECCOPY(bp->pos, vec);
- Mat4MulVecfl(ob->obmat, bp->pos); // yep, sofbody is global coords
- VECCOPY(bp->origS, bp->pos);
- VECCOPY(bp->origE, bp->pos);
- VECCOPY(bp->origT, bp->pos);
-
- bp->vec[0]= bp->vec[1]= bp->vec[2]= 0.0;
- bp->weight= 1.0;
- if(ob->softflag & OB_SB_GOAL) {
- bp->goal= ob->soft->defgoal;
- }
- else {
- bp->goal= 0.0f;
- /* so this will definily be below SOFTGOALSNAP */
- }
-
- bp->nofsprings= 0;
- bp->springs= NULL;
- bp->contactfrict = 0.0f;
-}
-
-
-/* copy original (new) situation in softbody, as result of matrices or deform */
-/* is assumed to enter function with ob->soft, but can be without points */
-static void mesh_update_softbody(Object *ob, float (*vertexCos)[3])
-{
- Mesh *me= ob->data;
- BodyPoint *bp;
- int a;
-
- /* possible after a file read... */
- if(ob->soft->bpoint==NULL) sbObjectToSoftbody(ob, NULL);
-
- if(me->totvert) {
- bp= ob->soft->bpoint;
- for(a=0; a<me->totvert; a++, bp++) {
- VECCOPY(bp->origS, bp->origE);
- if (vertexCos) {
- VECCOPY(bp->origE, vertexCos[a]);
- } else {
- VECCOPY(bp->origE, me->mvert[a].co);
- }
- Mat4MulVecfl(ob->obmat, bp->origE);
- VECCOPY(bp->origT, bp->origE);
- }
-
- if(ob->softflag & OB_SB_EDGES) {
-
- /* happens when in UI edges was set */
- if(ob->soft->bspring==NULL)
- if(object_has_edges(ob)) sbObjectToSoftbody(ob, NULL);
-
- /* hrms .. do springs alter their lenght ? (yes, mesh keys would (ton))
- if(medge) {
- bs= ob->soft->bspring;
- bp= ob->soft->bpoint;
- for(a=0; (a<me->totedge && a < ob->soft->totspring ); a++, medge++, bs++) {
- bs->len= VecLenf( (bp+bs->v1)->origE, (bp+bs->v2)->origE);
- }
- }
- */
- }
- }
-}
-
-
static void get_scalar_from_vertexgroup(Object *ob, int vertID, short groupindex, float *target)
/* result 0 on success, else indicates error number
-- kind of *inverse* result defintion,
@@ -837,7 +783,7 @@ static void get_scalar_from_vertexgroup(Object *ob, int vertID, short groupindex
}
/* makes totally fresh start situation */
-static void mesh_to_softbody(Object *ob, float (*vertexCos)[3])
+static void mesh_to_softbody(Object *ob)
{
SoftBody *sb;
Mesh *me= ob->data;
@@ -859,12 +805,6 @@ static void mesh_to_softbody(Object *ob, float (*vertexCos)[3])
goalfac= ABS(sb->maxgoal - sb->mingoal);
for(a=0; a<me->totvert; a++, bp++) {
- if (vertexCos) {
- set_body_point(ob, bp, vertexCos[a]);
- } else {
- set_body_point(ob, bp, me->mvert[a].co);
- }
-
/* get scalar values needed *per vertex* from vertex group functions,
so we can *paint* them nicly ..
they are normalized [0.0..1.0] so may be we need amplitude for scale
@@ -891,12 +831,10 @@ static void mesh_to_softbody(Object *ob, float (*vertexCos)[3])
if (ob->softflag & OB_SB_EDGES) {
if(medge) {
bs= sb->bspring;
- bp= sb->bpoint;
for(a=me->totedge; a>0; a--, medge++, bs++) {
bs->v1= medge->v1;
bs->v2= medge->v2;
bs->strength= 1.0;
- bs->len= VecLenf( (bp+bs->v1)->origS, (bp+bs->v2)->origS);
}
@@ -911,19 +849,6 @@ static void mesh_to_softbody(Object *ob, float (*vertexCos)[3])
}
-/* copies current sofbody position in mesh, so do this within modifier stacks! */
-static void softbody_to_mesh(Object *ob, float (*vertexCos)[3])
-{
- Mesh *me= ob->data;
- BodyPoint *bp= ob->soft->bpoint;
- int a;
-
- for(a=me->totvert; a>0; a--, bp++, vertexCos++) {
- VECCOPY(vertexCos[0], bp->pos);
- Mat4MulVecfl(ob->imat, vertexCos[0]); // softbody is in global coords
- }
-}
-
static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff)
{
@@ -1021,23 +946,17 @@ static void makelatticesprings(Lattice *lt, BodySpring *bs, int dostiff)
/* makes totally fresh start situation */
static void lattice_to_softbody(Object *ob)
{
- SoftBody *sb;
- BodySpring *bs;
Lattice *lt= ob->data;
- BodyPoint *bop;
- BPoint *bp;
- int a, totvert, totspring = 0;
+ int totvert, totspring = 0;
totvert= lt->pntsu*lt->pntsv*lt->pntsw;
if (ob->softflag & OB_SB_EDGES){
-
totspring = ((lt->pntsu -1) * lt->pntsv
+ (lt->pntsv -1) * lt->pntsu) * lt->pntsw
+lt->pntsu*lt->pntsv*(lt->pntsw -1);
if (ob->softflag & OB_SB_QUADS){
- totspring += 4*(lt->pntsu -1) * (lt->pntsv -1) * (lt->pntsw-1);
-
+ totspring += 4*(lt->pntsu -1) * (lt->pntsv -1) * (lt->pntsw-1);
}
}
@@ -1045,110 +964,31 @@ static void lattice_to_softbody(Object *ob)
/* renew ends with ob->soft with points and edges, also checks & makes ob->soft */
renew_softbody(ob, totvert, totspring);
- /* we always make body points */
- sb= ob->soft;
-
- for(a= totvert, bp= lt->def, bop= sb->bpoint; a>0; a--, bp++, bop++) {
- set_body_point(ob, bop, bp->vec);
- }
-
/* create some helper edges to enable SB lattice to be usefull at all */
if (ob->softflag & OB_SB_EDGES){
- bs = sb->bspring;
- makelatticesprings(lt,bs,ob->softflag & OB_SB_QUADS);
+ makelatticesprings(lt,ob->soft->bspring,ob->softflag & OB_SB_QUADS);
build_bps_springlist(ob); /* link bps to springs */
-
- /* recalculate lenght since BPoint and Bodypoint obviously can differ */
- bs= ob->soft->bspring;
- bop= ob->soft->bpoint;
- for(a=0; a < totspring ; a++, bs++) {
- bs->len= VecLenf( (bop+bs->v1)->origE, (bop+bs->v2)->origE);
- }
-
- }
-
-}
-
-/* copies current sofbody position */
-static void softbody_to_lattice(Object *ob)
-{
- SoftBody *sb;
- Lattice *lt= ob->data;
- BodyPoint *bop;
- BPoint *bp;
- int a, totvert;
-
- totvert= lt->pntsu*lt->pntsv*lt->pntsw;
- sb= ob->soft;
-
- for(a= totvert, bp= lt->def, bop= sb->bpoint; a>0; a--, bp++, bop++) {
- VECCOPY(bp->vec, bop->pos);
- Mat4MulVecfl(ob->imat, bp->vec); // softbody is in global coords
}
}
-/* copy original (new) situation in softbody, as result of matrices or deform */
-/* is assumed to enter function with ob->soft, but can be without points */
-static void lattice_update_softbody(Object *ob)
-{
- Lattice *lt= ob->data;
- BodyPoint *bop;
- BPoint *bp;
- int a, totvert;
-
- totvert= lt->pntsu*lt->pntsv*lt->pntsw;
-
- /* possible after a file read... */
- if(ob->soft->bpoint==NULL) sbObjectToSoftbody(ob, NULL);
-
- for(a= totvert, bp= lt->def, bop= ob->soft->bpoint; a>0; a--, bp++, bop++) {
- VECCOPY(bop->origS, bop->origE);
- VECCOPY(bop->origE, bp->vec);
- Mat4MulVecfl(ob->obmat, bop->origE);
- VECCOPY(bop->origT, bop->origE);
- }
-}
-
/* copies softbody result back in object */
-/* only used in sbObjectStep() */
-static void softbody_to_object(Object *ob, float (*vertexCos)[3])
+static void softbody_to_object(Object *ob, float (*vertexCos)[3], int numVerts)
{
-
- if(ob->soft==NULL) return;
-
+ BodyPoint *bp= ob->soft->bpoint;
+ int a;
+
/* inverse matrix is not uptodate... */
Mat4Invert(ob->imat, ob->obmat);
- switch(ob->type) {
- case OB_MESH:
- softbody_to_mesh(ob, vertexCos);
- break;
- case OB_LATTICE:
- softbody_to_lattice(ob);
- break;
- }
-}
-
-/* copy original (new) situation in softbody, as result of matrices or deform */
-/* used in sbObjectStep() and sbObjectReset() */
-/* assumes to have ob->soft, but can be entered without points */
-static void object_update_softbody(Object *ob, float (*vertexCos)[3])
-{
-
- switch(ob->type) {
- case OB_MESH:
- mesh_update_softbody(ob, vertexCos);
- break;
- case OB_LATTICE:
- lattice_update_softbody(ob);
- break;
+ for(a=0; a<numVerts; a++, bp++) {
+ VECCOPY(vertexCos[a], bp->pos);
+ Mat4MulVecfl(ob->imat, vertexCos[a]); // softbody is in global coords
}
-
}
/* return 1 if succesfully baked and applied step */
-static int softbody_baked_step(Object *ob, float framenr, float (*vertexCos)[3])
+static int softbody_baked_step(Object *ob, float framenr, float (*vertexCos)[3], int numVerts)
{
SoftBody *sb= ob->soft;
SBVertex *key0, *key1, *key2, *key3;
@@ -1200,7 +1040,7 @@ static int softbody_baked_step(Object *ob, float framenr, float (*vertexCos)[3])
bp->pos[2]= data[0]*key0->vec[2] + data[1]*key1->vec[2] + data[2]*key2->vec[2] + data[3]*key3->vec[2];
}
- softbody_to_object(ob, vertexCos);
+ softbody_to_object(ob, vertexCos, numVerts);
return 1;
}
@@ -1293,79 +1133,68 @@ void sbFree(SoftBody *sb)
/* makes totally fresh start situation */
-void sbObjectToSoftbody(Object *ob, float (*vertexCos)[3])
+void sbObjectToSoftbody(Object *ob)
{
+ ob->softflag |= OB_SB_REDO;
+}
+static void convert_object_to_sb(Object *ob, int numVerts)
+{
switch(ob->type) {
case OB_MESH:
- mesh_to_softbody(ob, vertexCos);
+ mesh_to_softbody(ob);
break;
case OB_LATTICE:
lattice_to_softbody(ob);
break;
+ default:
+ renew_softbody(ob, numVerts, 0);
+ break;
}
- if(ob->soft) ob->soft->ctime= bsystem_time(ob, NULL, (float)G.scene->r.cfra, 0.0);
ob->softflag &= ~OB_SB_REDO;
+
+ /* still need to update to correct vertex locations, happens on next step */
+ ob->softflag |= OB_SB_RESET;
}
-/* reset all motion */
-void sbObjectReset(Object *ob, float (*vertexCos)[3])
+static int object_has_edges(Object *ob)
{
- SoftBody *sb= ob->soft;
- BodyPoint *bp;
- int a;
-
- if(sb==NULL) return;
- if(sb->keys && sb->totkey) return; // only as cpu time saver
-
- sb->ctime= bsystem_time(ob, NULL, (float)G.scene->r.cfra, 0.0);
-
- object_update_softbody(ob, vertexCos);
-
- for(a=sb->totpoint, bp= sb->bpoint; a>0; a--, bp++) {
- // origS is previous timestep
- VECCOPY(bp->origS, bp->origE);
- VECCOPY(bp->pos, bp->origE);
- VECCOPY(bp->origT, bp->origE);
- bp->vec[0]= bp->vec[1]= bp->vec[2]= 0.0f;
-
- // no idea about the Heun stuff! (ton)
- VECCOPY(bp->prevpos, bp->pos);
- VECCOPY(bp->prevvec, bp->vec);
- VECCOPY(bp->prevdx, bp->vec);
- VECCOPY(bp->prevdv, bp->vec);
+ if(ob->type==OB_MESH) {
+ Mesh *me= ob->data;
+ return (me->medge && me->totedge);
+ }
+ else if(ob->type==OB_LATTICE) {
+ return 1;
+ }
+ else {
+ return 0;
}
}
-
/* simulates one step. framenr is in frames */
-/* copies result back to object, displist */
-void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3])
+void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3], int numVerts)
{
SoftBody *sb;
Base *base;
+ BodyPoint *bp;
float dtime;
- int timescale,t;
+ int a,timescale,t;
float ctime, forcetime;
float err;
-
- /* this variable is set while transform(). with lattices also having a softbody,
- it calls lattice_modifier() all the time... has no displist yet. Is temporal
- hack which should be resolved with proper depgraph usage + storage of deformed
- vertices in lattice (ton) */
- if(G.moving) return;
/* baking works with global time */
if(!(ob->softflag & OB_SB_BAKEDO) )
- if(softbody_baked_step(ob, framenr, vertexCos) ) return;
-
- /* remake softbody if: */
- if( (ob->softflag & OB_SB_REDO) || // signal after weightpainting
- (ob->soft==NULL) || // just to be nice we allow full init
- (ob->soft->bpoint==NULL) ) // after reading new file, or acceptable as signal to refresh
- sbObjectToSoftbody(ob, vertexCos);
+ if(softbody_baked_step(ob, framenr, vertexCos, numVerts) ) return;
+ /* remake softbody if: */
+ if( (ob->softflag & OB_SB_REDO) || // signal after weightpainting
+ (ob->soft==NULL) || // just to be nice we allow full init
+ (ob->soft->bpoint==NULL) || // after reading new file, or acceptable as signal to refresh
+ (numVerts!=ob->soft->totpoint) || // should never happen, just to be safe
+ ((ob->softflag & OB_SB_EDGES) && !ob->soft->bspring && object_has_edges(ob))) // happens when in UI edges was set
+ convert_object_to_sb(ob, numVerts);
+
sb= ob->soft;
/* still no points? go away */
@@ -1377,23 +1206,53 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3])
}
/* checking time: */
+
ctime= bsystem_time(ob, NULL, framenr, 0.0);
- dtime= ctime - sb->ctime;
- // bail out for negative or for large steps
- if(dtime<0.0 || dtime >= 9.9*G.scene->r.framelen) { // G.scene->r.framelen corrects for frame-mapping, so this is actually 10 frames for UI
- sbObjectReset(ob, vertexCos);
- return;
+
+ if (ob->softflag&OB_SB_RESET) {
+ dtime = 0.0;
+ } else {
+ dtime= ctime - sb->ctime;
}
-
+
/* the simulator */
-
- if(dtime > 0.0) { // note: what does this mean now? (ton)
- //answer (BM) :
- //dtime is still in [frames]
- //we made sure dtime is >= 0.0
- //but still need to handle dtime == 0.0 -> just return sb as is, just to be nice
- object_update_softbody(ob, vertexCos);
-
+
+ /* update the vertex locations */
+ if (dtime!=0.0) {
+ for(a=0,bp=sb->bpoint; a<numVerts; a++, bp++) {
+ VECCOPY(bp->origS, bp->origE);
+ VECCOPY(bp->origE, vertexCos[a]);
+ Mat4MulVecfl(ob->obmat, bp->origE);
+ VECCOPY(bp->origT, bp->origE);
+ }
+ }
+
+ // G.scene->r.framelen corrects for frame-mapping, so this is actually 10 frames for UI
+ if((ob->softflag&OB_SB_RESET) || dtime<0.0 || dtime>=9.9*G.scene->r.framelen) {
+ for(a=0,bp=sb->bpoint; a<numVerts; a++, bp++) {
+ VECCOPY(bp->pos, vertexCos[a]);
+ Mat4MulVecfl(ob->obmat, bp->pos); // yep, sofbody is global coords
+ VECCOPY(bp->origS, bp->pos);
+ VECCOPY(bp->origE, bp->pos);
+ VECCOPY(bp->origT, bp->pos);
+ bp->vec[0]= bp->vec[1]= bp->vec[2]= 0.0f;
+
+ // no idea about the Heun stuff! (ton)
+ VECCOPY(bp->prevpos, bp->pos);
+ VECCOPY(bp->prevvec, bp->vec);
+ VECCOPY(bp->prevdx, bp->vec);
+ VECCOPY(bp->prevdv, bp->vec);
+ }
+
+ for(a=0; a<sb->totspring; a++) {
+ BodySpring *bs = &sb->bspring[a];
+
+ bs->len= VecLenf(sb->bpoint[bs->v1].origS, sb->bpoint[bs->v2].origS);
+ }
+
+ ob->softflag &= ~OB_SB_RESET;
+ }
+ else if(dtime>0.0) {
if (TRUE) { // RSOL1 always true now (ton)
/* special case of 2nd order Runge-Kutta type AKA Heun */
float timedone =0.0; // how far did we get without violating error condition
@@ -1486,20 +1345,11 @@ void sbObjectStep(Object *ob, float framenr, float (*vertexCos)[3])
}
}
}
-
- /* and apply to vertices */
- softbody_to_object(ob, vertexCos);
-
- sb->ctime= ctime;
- } // if(ABS(dtime) > 0.0)
- else {
- // rule : you have asked for the current state of the softobject
- // since dtime= ctime - ob->soft->ctime== 0.0;
- // and we were not notifified about any other time changes
- // so here it is !
- softbody_to_object(ob, vertexCos);
}
+ softbody_to_object(ob, vertexCos, numVerts);
+ sb->ctime= ctime;
+
/* reset deflector cache */
for(base= G.scene->base.first; base; base= base->next) {
if(base->object->sumohandle) {
diff --git a/source/blender/blenloader/intern/readfile.c b/source/blender/blenloader/intern/readfile.c
index 7a6928dadb4..8075cdc9dc1 100644
--- a/source/blender/blenloader/intern/readfile.c
+++ b/source/blender/blenloader/intern/readfile.c
@@ -119,6 +119,7 @@
#include "BKE_effect.h" // for give_parteff
#include "BKE_global.h" // for G
#include "BKE_property.h" // for get_property
+#include "BKE_lattice.h"
#include "BKE_library.h" // for wich_libbase
#include "BKE_main.h" // for Main
#include "BKE_mesh.h" // for ME_ defines (patching)
@@ -4863,7 +4864,18 @@ static void do_versions(FileData *fd, Library *lib, Main *main)
}
}
}
- }
+ }
+ if(main->versionfile <= 238) {
+ Lattice *lt;
+
+ for (lt=main->latt.first; lt; lt=lt->id.next) {
+ if (lt->fu==0.0 && lt->fv==0.0 && lt->fw==0.0) {
+ calc_lat_fudu(lt->flag, lt->pntsu, &lt->fu, &lt->du);
+ calc_lat_fudu(lt->flag, lt->pntsv, &lt->fv, &lt->dv);
+ calc_lat_fudu(lt->flag, lt->pntsw, &lt->fw, &lt->dw);
+ }
+ }
+ }
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
/* WATCH IT 2!: Userdef struct init has to be in src/usiblender.c! */
diff --git a/source/blender/include/butspace.h b/source/blender/include/butspace.h
index e849cdbf114..66914c07ed0 100644
--- a/source/blender/include/butspace.h
+++ b/source/blender/include/butspace.h
@@ -422,6 +422,7 @@ enum {
#define B_RESIZELAT 2601
#define B_DRAWLAT 2602
#define B_LATTCHANGED 2603
+#define B_REGULARLAT 2604
/* *********************** */
#define B_GAMEBUTS 2800
diff --git a/source/blender/makesdna/DNA_lattice_types.h b/source/blender/makesdna/DNA_lattice_types.h
index fc71982fb0e..3d77e7feb02 100644
--- a/source/blender/makesdna/DNA_lattice_types.h
+++ b/source/blender/makesdna/DNA_lattice_types.h
@@ -42,14 +42,16 @@ typedef struct Lattice {
ID id;
short pntsu, pntsv, pntsw, flag;
+ short opntsu, opntsv, opntsw, pad2;
char typeu, typev, typew, type;
int pad;
+ float fu, fv, fw, du, dv, dw;
+
struct BPoint *def;
struct Ipo *ipo;
struct Key *key;
-
} Lattice;
/* ***************** LATTICE ********************* */
diff --git a/source/blender/makesdna/DNA_object_force.h b/source/blender/makesdna/DNA_object_force.h
index 334d4b44aa6..3396c59a53a 100644
--- a/source/blender/makesdna/DNA_object_force.h
+++ b/source/blender/makesdna/DNA_object_force.h
@@ -118,6 +118,7 @@ typedef struct SoftBody {
#define OB_SB_REDO 32
#define OB_SB_BAKESET 64
#define OB_SB_BAKEDO 128
+#define OB_SB_RESET 256
#ifdef __cplusplus
}
diff --git a/source/blender/python/api2_2x/Lattice.c b/source/blender/python/api2_2x/Lattice.c
index 87e0c3ae168..7110944fd31 100644
--- a/source/blender/python/api2_2x/Lattice.c
+++ b/source/blender/python/api2_2x/Lattice.c
@@ -423,10 +423,7 @@ static PyObject *Lattice_setPartitions( BPy_Lattice * self, PyObject * args )
return ( EXPP_ReturnPyObjError( PyExc_RuntimeError,
"partition values must be 2 or greater" ) );
- bl_Lattice->pntsu = ( short ) x;
- bl_Lattice->pntsv = ( short ) y;
- bl_Lattice->pntsw = ( short ) z;
- resizelattice( bl_Lattice );
+ resizelattice(bl_Lattice, x, y, z, NULL);
Py_INCREF( Py_None );
return Py_None;
diff --git a/source/blender/src/buttons_editing.c b/source/blender/src/buttons_editing.c
index 9f9515d5202..6f805a89a7e 100644
--- a/source/blender/src/buttons_editing.c
+++ b/source/blender/src/buttons_editing.c
@@ -75,6 +75,7 @@
#include "BKE_depsgraph.h"
#include "BKE_global.h"
+#include "BKE_curve.h"
#include "BKE_library.h"
#include "BKE_main.h"
#include "BKE_modifier.h"
@@ -511,6 +512,7 @@ void do_modifier_panels(unsigned short event)
break;
case B_MODIFIER_RECALC:
+ ob->softflag |= OB_SB_RESET;
allqueue(REDRAWBUTSEDIT, 0);
allqueue(REDRAWVIEW3D, 0);
allqueue(REDRAWOOPS, 0);
@@ -700,8 +702,8 @@ static void modifiers_applyModifier(void *obv, void *mdv)
if (G.obedit) {
error("Modifiers cannot be applied in editmode");
return;
- } else if (me->id.us>1) {
- error("Modifiers cannot be applied to a multi-user mesh");
+ } else if (((ID*) ob->data)->us>1) {
+ error("Modifiers cannot be applied to multi-user data");
return;
}
@@ -710,29 +712,54 @@ static void modifiers_applyModifier(void *obv, void *mdv)
return;
}
- // XXX, only for mesh
-
- dm = mesh_create_derived_for_modifier(ob, md);
- if (!dm) {
- error("Modifier is disabled or returned error, skipping apply");
- return;
- }
+ if (ob->type==OB_MESH) {
+ dm = mesh_create_derived_for_modifier(ob, md);
+ if (!dm) {
+ error("Modifier is disabled or returned error, skipping apply");
+ return;
+ }
- dlm= dm->convertToDispListMesh(dm, 0);
+ dlm= dm->convertToDispListMesh(dm, 0);
- if ((!me->tface || dlm->tface) || okee("Applying will delete mesh UVs and vertex colors")) {
- if ((!me->mcol || dlm->mcol) || okee("Applying will delete mesh vertex colors")) {
- if (dlm->totvert==me->totvert || okee("Applying will delete mesh sticky, keys, and vertex groups")) {
- displistmesh_to_mesh(dlm, me);
- converted = 1;
+ if ((!me->tface || dlm->tface) || okee("Applying will delete mesh UVs and vertex colors")) {
+ if ((!me->mcol || dlm->mcol) || okee("Applying will delete mesh vertex colors")) {
+ if (dlm->totvert==me->totvert || okee("Applying will delete mesh sticky, keys, and vertex groups")) {
+ displistmesh_to_mesh(dlm, me);
+ converted = 1;
+ }
}
}
- }
- if (!converted) {
- displistmesh_free(dlm);
+ if (!converted) {
+ displistmesh_free(dlm);
+ }
+ dm->release(dm);
+ }
+ else if (ELEM(ob->type, OB_CURVE, OB_SURF)) {
+ ModifierTypeInfo *mti = modifierType_getInfo(md->type);
+ Curve *cu = ob->data;
+ int numVerts;
+ float (*vertexCos)[3];
+
+ if (!okee("Apply will only change CV points, not tesselated/bevel vertices"))
+ return;
+
+ if (!(md->mode&eModifierMode_Realtime) || (mti->isDisabled && mti->isDisabled(md))) {
+ error("Modifier is disabled, skipping apply");
+ return;
+ }
+
+ vertexCos = curve_getVertexCos(cu, &cu->nurb, &numVerts);
+ mti->deformVerts(md, ob, NULL, vertexCos, numVerts);
+ curve_applyVertexCos(cu, &cu->nurb, vertexCos);
+ MEM_freeN(vertexCos);
+
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ }
+ else {
+ error("Cannot apply modifier for this object type");
+ return;
}
- dm->release(dm);
BLI_remlink(&ob->modifiers, md);
modifier_free(md);
@@ -1972,13 +1999,23 @@ void do_latticebuts(unsigned short event)
if(ob->type!=OB_LATTICE) return;
switch(event) {
+ case B_REGULARLAT:
+ if(ob) {
+ lt = ob->data;
+ if(ob==G.obedit) resizelattice(editLatt, lt->opntsu, lt->opntsv, lt->opntsw, NULL);
+ else resizelattice(ob->data, lt->opntsu, lt->opntsv, lt->opntsw, NULL);
+ ob->softflag |= OB_SB_REDO;
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
+ }
case B_RESIZELAT:
if(ob) {
- if(ob==G.obedit) resizelattice(editLatt);
- else resizelattice(ob->data);
+ lt = ob->data;
+ resizelattice(ob->data, lt->opntsu, lt->opntsv, lt->opntsw, ob);
ob->softflag |= OB_SB_REDO;
+ DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
+ allqueue(REDRAWVIEW3D, 0);
}
- allqueue(REDRAWVIEW3D, 0);
break;
case B_DRAWLAT:
allqueue(REDRAWVIEW3D, 0);
@@ -2009,24 +2046,28 @@ static void editing_panel_lattice_type(Object *ob, Lattice *lt)
uiBlockBeginAlign(block);
- uiDefButS(block, NUM, B_RESIZELAT, "U:", 469, 178,100,19, &lt->pntsu, 1.0, 64.0, 0, 0, "Points in U direction");
+ lt->opntsu = lt->pntsu;
+ lt->opntsv = lt->pntsv;
+ lt->opntsw = lt->pntsw;
+
+ uiDefButS(block, NUM, B_RESIZELAT, "U:", 469, 178,100,19, &lt->opntsu, 1.0, 64.0, 0, 0, "Points in U direction");
uiDefButC(block, ROW, B_LATTCHANGED, "Lin", 572, 178, 40, 19, &lt->typeu, 1.0, (float)KEY_LINEAR, 0, 0, "Set Linear interpolation");
uiDefButC(block, ROW, B_LATTCHANGED, "Card", 613, 178, 40, 19, &lt->typeu, 1.0, (float)KEY_CARDINAL, 0, 0, "Set Cardinal interpolation");
uiDefButC(block, ROW, B_LATTCHANGED, "B", 652, 178, 40, 19, &lt->typeu, 1.0, (float)KEY_BSPLINE, 0, 0, "Set B-spline interpolation");
- uiDefButS(block, NUM, B_RESIZELAT, "V:", 469, 156,100,19, &lt->pntsv, 1.0, 64.0, 0, 0, "Points in V direction");
+ uiDefButS(block, NUM, B_RESIZELAT, "V:", 469, 156,100,19, &lt->opntsv, 1.0, 64.0, 0, 0, "Points in V direction");
uiDefButC(block, ROW, B_LATTCHANGED, "Lin", 572, 156, 40, 19, &lt->typev, 2.0, (float)KEY_LINEAR, 0, 0, "Set Linear interpolation");
uiDefButC(block, ROW, B_LATTCHANGED, "Card", 613, 156, 40, 19, &lt->typev, 2.0, (float)KEY_CARDINAL, 0, 0, "Set Cardinal interpolation");
uiDefButC(block, ROW, B_LATTCHANGED, "B", 652, 156, 40, 19, &lt->typev, 2.0, (float)KEY_BSPLINE, 0, 0, "Set B-spline interpolation");
- uiDefButS(block, NUM, B_RESIZELAT, "W:", 469, 134,100,19, &lt->pntsw, 1.0, 64.0, 0, 0, "Points in W direction");
+ uiDefButS(block, NUM, B_RESIZELAT, "W:", 469, 134,100,19, &lt->opntsw, 1.0, 64.0, 0, 0, "Points in W direction");
uiDefButC(block, ROW, B_LATTCHANGED, "Lin", 572, 134, 40, 19, &lt->typew, 3.0, (float)KEY_LINEAR, 0, 0, "Set Linear interpolation");
uiDefButC(block, ROW, B_LATTCHANGED, "Card", 613, 134, 40, 19, &lt->typew, 3.0, (float)KEY_CARDINAL, 0, 0, "Set Cardinal interpolation");
uiDefButC(block, ROW, B_LATTCHANGED, "B", 652, 134, 40, 19, &lt->typew, 3.0, (float)KEY_BSPLINE, 0, 0, "Set B-spline interpolation");
uiBlockEndAlign(block);
- uiDefBut(block, BUT, B_RESIZELAT, "Make Regular", 469,98,102,31, 0, 0, 0, 0, 0, "Make Lattice regular");
+ uiDefBut(block, BUT, B_REGULARLAT, "Make Regular", 469,98,102,31, 0, 0, 0, 0, 0, "Make Lattice regular");
uiClearButLock();
uiDefButBitS(block, TOG, LT_OUTSIDE, B_LATTCHANGED, "Outside", 571,98,122,31, &lt->flag, 0, 0, 0, 0, "Only draw, and take into account, the outer vertices");
@@ -3229,6 +3270,7 @@ void editing_panels()
lt= ob->data;
editing_panel_links(ob); // no editmode!
editing_panel_lattice_type(ob, lt);
+ editing_panel_modifiers(ob);
break;
case OB_LAMP:
diff --git a/source/blender/src/buttons_object.c b/source/blender/src/buttons_object.c
index 608867efa9b..a057da29531 100644
--- a/source/blender/src/buttons_object.c
+++ b/source/blender/src/buttons_object.c
@@ -1044,7 +1044,7 @@ static void softbody_bake(Object *ob)
G.scene->r.framelen= 1.0; // baking has to be in uncorrected time
CFRA= sb->sfra;
update_for_newframe_muted(); // put everything on this frame
- sbObjectToSoftbody(ob, NULL); // put softbody in restposition
+ sbObjectToSoftbody(ob); // put softbody in restposition
ob->softflag |= OB_SB_BAKEDO;
curarea->win_swap= 0; // clean swapbuffers
@@ -1069,7 +1069,7 @@ static void softbody_bake(Object *ob)
if(event==ESCKEY) break;
}
- if(event==ESCKEY) sbObjectToSoftbody(ob, NULL); // clears all
+ if(event==ESCKEY) sbObjectToSoftbody(ob); // clears all
/* restore */
waitcursor(0);
@@ -1157,7 +1157,7 @@ void do_object_panels(unsigned short event)
break;
case B_SOFTBODY_BAKE_FREE:
ob= OBACT;
- if(ob && ob->soft) sbObjectToSoftbody(ob, NULL);
+ if(ob && ob->soft) sbObjectToSoftbody(ob);
allqueue(REDRAWBUTSOBJECT, 0);
allqueue(REDRAWVIEW3D, 0);
break;
diff --git a/source/blender/src/drawobject.c b/source/blender/src/drawobject.c
index 41881e0a296..ab68351f997 100644
--- a/source/blender/src/drawobject.c
+++ b/source/blender/src/drawobject.c
@@ -786,51 +786,32 @@ void drawcamera(Object *ob)
}
}
-static void tekenvertslatt(short sel)
+static void lattice_draw_verts(Lattice *lt, DispList *dl, short sel)
{
- Lattice *lt;
- BPoint *bp;
- float size;
- int a, u, v, w;
-
- size= BIF_GetThemeValuef(TH_VERTEX_SIZE);
- glPointSize(size);
-
- if(sel) BIF_ThemeColor(TH_VERTEX_SELECT);
- else BIF_ThemeColor(TH_VERTEX);
+ BPoint *bp = lt->def;
+ float *co = dl?dl->verts:NULL;
+ int u, v, w;
+ BIF_ThemeColor(sel?TH_VERTEX_SELECT:TH_VERTEX);
+ glPointSize(BIF_GetThemeValuef(TH_VERTEX_SIZE));
bglBegin(GL_POINTS);
- bp= editLatt->def;
- lt= editLatt;
-
- if(lt->flag & LT_OUTSIDE) {
-
- for(w=0; w<lt->pntsw; w++) {
- int wxt = (w==0 || w==lt->pntsw-1);
- for(v=0; v<lt->pntsv; v++) {
- int vxt = (v==0 || v==lt->pntsv-1);
- for(u=0; u<lt->pntsu; u++, bp++) {
- int uxt = (u==0 || u==lt->pntsu-1);
- if(uxt || vxt || wxt) {
- if(bp->hide==0) {
- if((bp->f1 & 1)==sel) bglVertex3fv(bp->vec);
+ for(w=0; w<lt->pntsw; w++) {
+ int wxt = (w==0 || w==lt->pntsw-1);
+ for(v=0; v<lt->pntsv; v++) {
+ int vxt = (v==0 || v==lt->pntsv-1);
+ for(u=0; u<lt->pntsu; u++, bp++, co+=3) {
+ int uxt = (u==0 || u==lt->pntsu-1);
+ if(!(lt->flag & LT_OUTSIDE) || uxt || vxt || wxt) {
+ if(bp->hide==0) {
+ if((bp->f1 & 1)==sel) {
+ bglVertex3fv(dl?co:bp->vec);
}
}
}
}
}
}
- else {
-
- a= editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
- while(a--) {
- if(bp->hide==0) {
- if((bp->f1 & 1)==sel) bglVertex3fv(bp->vec);
- }
- bp++;
- }
- }
glPointSize(1.0);
bglEnd();
@@ -839,119 +820,74 @@ static void tekenvertslatt(short sel)
void lattice_foreachScreenVert(void (*func)(void *userData, BPoint *bp, int x, int y), void *userData)
{
int i, N = editLatt->pntsu*editLatt->pntsv*editLatt->pntsw;
+ DispList *dl = find_displist(&G.obedit->disp, DL_VERTS);
+ float *co = dl?dl->verts:NULL;
+ BPoint *bp = editLatt->def;
float mat[4][4];
short s[2];
view3d_get_object_project_mat(curarea, G.obedit, mat);
- for (i=0; i<N; i++) {
- BPoint *bp = &editLatt->def[i];
-
+ for (i=0; i<N; i++, bp++, co+=3) {
if (bp->hide==0) {
- view3d_project_short(curarea, bp->vec, s, mat);
+ view3d_project_short(curarea, dl?co:bp->vec, s, mat);
func(userData, bp, s[0], s[1]);
}
}
}
+static void drawlattice__point(Lattice *lt, DispList *dl, int u, int v, int w)
+{
+ int index = ((w*lt->pntsv + v)*lt->pntsu) + u;
+ if (dl) {
+ glVertex3fv(&dl->verts[index*3]);
+ } else {
+ glVertex3fv(lt->def[index].vec);
+ }
+}
static void drawlattice(Object *ob)
{
Lattice *lt;
- BPoint *bp, *bpu;
- int u, v, w, dv, dw, uxt, vxt, wxt;
+ DispList *dl;
+ int u, v, w;
- lt= ob->data;
+ lt= (ob==G.obedit)?editLatt:ob->data;
+ dl= find_displist(&ob->disp, DL_VERTS);
if(ob==G.obedit) {
- bp= editLatt->def;
-
cpack(0x004000);
}
- else {
- do_latt_key(lt);
- bp= lt->def;
- }
-
- dv= lt->pntsu;
- dw= dv*lt->pntsv;
- if(lt->flag & LT_OUTSIDE) {
-
- for(w=0; w<lt->pntsw; w++) {
-
- if(w==0 || w==lt->pntsw-1) wxt= 1; else wxt= 0;
-
- for(v=0; v<lt->pntsv; v++) {
-
- if(v==0 || v==lt->pntsv-1) vxt= 1; else vxt= 0;
-
- for(u=0, bpu=0; u<lt->pntsu; u++, bp++) {
-
- if(u==0 || u==lt->pntsu-1) uxt= 1; else uxt= 0;
-
- if(uxt || vxt || wxt) {
-
- if(w && (uxt || vxt)) {
-
- glBegin(GL_LINE_STRIP);
- glVertex3fv( (bp-dw)->vec ); glVertex3fv(bp->vec);
- glEnd();
- }
- if(v && (uxt || wxt)) {
-
- glBegin(GL_LINES);
- glVertex3fv( (bp-dv)->vec ); glVertex3fv(bp->vec);
- glEnd();
- }
- if(u && (vxt || wxt)) {
-
- glBegin(GL_LINES);
- glVertex3fv(bpu->vec); glVertex3fv(bp->vec);
- glEnd();
- }
- }
-
- bpu= bp;
+ glBegin(GL_LINES);
+ for(w=0; w<lt->pntsw; w++) {
+ int wxt = (w==0 || w==lt->pntsw-1);
+ for(v=0; v<lt->pntsv; v++) {
+ int vxt = (v==0 || v==lt->pntsv-1);
+ for(u=0; u<lt->pntsu; u++) {
+ int uxt = (u==0 || u==lt->pntsu-1);
+
+ if(w && ((uxt || vxt) || !(lt->flag & LT_OUTSIDE))) {
+ drawlattice__point(lt, dl, u, v, w-1);
+ drawlattice__point(lt, dl, u, v, w);
}
- }
- }
- }
- else {
- for(w=0; w<lt->pntsw; w++) {
-
- for(v=0; v<lt->pntsv; v++) {
-
- for(u=0, bpu=0; u<lt->pntsu; u++, bp++) {
-
- if(w) {
-
- glBegin(GL_LINES);
- glVertex3fv( (bp-dw)->vec ); glVertex3fv(bp->vec);
- glEnd();
- }
- if(v) {
-
- glBegin(GL_LINES);
- glVertex3fv( (bp-dv)->vec ); glVertex3fv(bp->vec);
- glEnd();
- }
- if(u) {
-
- glBegin(GL_LINES);
- glVertex3fv(bpu->vec); glVertex3fv(bp->vec);
- glEnd();
- }
- bpu= bp;
+ if(v && ((uxt || wxt) || !(lt->flag & LT_OUTSIDE))) {
+ drawlattice__point(lt, dl, u, v-1, w);
+ drawlattice__point(lt, dl, u, v, w);
+ }
+ if(u && ((vxt || wxt) || !(lt->flag & LT_OUTSIDE))) {
+ drawlattice__point(lt, dl, u-1, v, w);
+ drawlattice__point(lt, dl, u, v, w);
}
}
}
- }
+ }
+ glEnd();
if(ob==G.obedit) {
if(G.vd->zbuf) glDisable(GL_DEPTH_TEST);
- tekenvertslatt(0);
- tekenvertslatt(1);
+ lattice_draw_verts(lt, dl, 0);
+ lattice_draw_verts(lt, dl, 1);
if(G.vd->zbuf) glEnable(GL_DEPTH_TEST);
}
diff --git a/source/blender/src/editmesh_loop.c b/source/blender/src/editmesh_loop.c
index 2191cc94afd..a7d90639414 100644
--- a/source/blender/src/editmesh_loop.c
+++ b/source/blender/src/editmesh_loop.c
@@ -607,7 +607,7 @@ static CutCurve *get_mouse_trail(int *len, char mode)
*/
/* prototype */
-short seg_intersect(struct EditEdge * e, CutCurve *c, int len);
+static short seg_intersect(struct EditEdge * e, CutCurve *c, int len);
void KnifeSubdivide(char mode)
{
diff --git a/source/blender/src/editobject.c b/source/blender/src/editobject.c
index 38b795326c4..aee687b1ca6 100644
--- a/source/blender/src/editobject.c
+++ b/source/blender/src/editobject.c
@@ -1311,7 +1311,7 @@ void make_parent(void)
}
else {
- base->object->recalc |= OB_RECALC_OB;
+ base->object->recalc |= OB_RECALC_OB|OB_RECALC_DATA;
/* the ifs below are horrible code (ton) */
@@ -1363,7 +1363,6 @@ void make_parent(void)
if(par->type==OB_ARMATURE && mode == PARSKEL){
verify_defgroups(base->object);
- base->object->recalc |= OB_RECALC_DATA;
}
}
}
@@ -1523,9 +1522,9 @@ void exit_editmode(int freedata) /* freedata==0 at render, 1= freedata, 2= do un
if(sb->keys) {
if( okee("Erase Baked SoftBody") )
- sbObjectToSoftbody(ob, NULL);
+ sbObjectToSoftbody(ob);
}
- else sbObjectToSoftbody(ob, NULL);
+ else sbObjectToSoftbody(ob);
}
DAG_object_flush_update(G.scene, ob, OB_RECALC_DATA);
diff --git a/source/blender/src/transform_conversions.c b/source/blender/src/transform_conversions.c
index 8d709db03f8..149a9fe6d7f 100755
--- a/source/blender/src/transform_conversions.c
+++ b/source/blender/src/transform_conversions.c
@@ -1417,7 +1417,7 @@ void special_aftertrans_update(short cancelled)
ob= base->object;
- if(modifiers_isSoftbodyEnabled(ob)) sbObjectReset(ob, NULL);
+ if(modifiers_isSoftbodyEnabled(ob)) ob->softflag |= OB_SB_RESET;
/* Set autokey if necessary */
if ((G.flags & G_RECORDKEYS) && (!cancelled) && (base->flag & SELECT)){