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
diff options
context:
space:
mode:
authorDaniel Dunbar <daniel@zuster.org>2005-07-19 06:36:21 +0400
committerDaniel Dunbar <daniel@zuster.org>2005-07-19 06:36:21 +0400
commit09b527263951781290af8461476dcd9ed5394c37 (patch)
tree85435546528e215ebf92fb3e2053ee2280fca217 /source/blender/blenkernel/intern/lattice.c
parent8962195f21bc7bb1b7ea70290fff93176c03eb9f (diff)
- split mesh_deform off from object_deform
- changed mesh_modifier, sbObjectStep, object_deform to take vertexCo argument instead of operating on mesh - fixed bug where a derived mesh would not be returned in editmode - removed object_wave, replaced by init_wave_deform and calc_wave_deform - moved cached DerivedMesh to Object, not Mesh... fixes heisenbugs with linked objects
Diffstat (limited to 'source/blender/blenkernel/intern/lattice.c')
-rw-r--r--source/blender/blenkernel/intern/lattice.c124
1 files changed, 54 insertions, 70 deletions
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 12a86dcc651..eff9d813afd 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -516,70 +516,79 @@ static void calc_curve_deform(Object *par, float *co, short axis, CurveDeform *c
}
-/* Mesh now applies on mesh itself, others do displist */
-int object_deform(Object *ob)
+int mesh_deform(Object *ob, float (*vertexCos)[3])
{
- Mesh *me;
- Curve *cu;
- DispList *dl;
- MVert *mvert;
- float *fp;
- int a, tot, flag;
+ Mesh *me = ob->data;
+ int a;
- if(ob->parent==NULL) return 0;
+ if(ob->parent==NULL || ob->type!=OB_MESH || !me->totvert) return 0;
- /* always try to do the entire deform in this function: apply! */
-
- if(ob->parent->type==OB_CURVE) {
+ if(ob->parent->type==OB_CURVE && ob->partype==PARSKEL) {
+ Curve *cu = ob->parent->data;
+ int flag = cu->flag;
CurveDeform cd;
- if (ob->partype != PARSKEL){
- return 0;
- }
- cu= ob->parent->data;
- flag= cu->flag;
cu->flag |= (CU_PATH|CU_FOLLOW); // needed for path & bevlist
-
- if(ob->type==OB_MESH) {
-
- me= ob->data;
- if(me->totvert==0) return 0;
-
- /* init deform */
- init_curve_deform(ob->parent, ob, &cd);
+
+ init_curve_deform(ob->parent, ob, &cd);
/* transformation to curve space, and min max*/
- INIT_MINMAX(cd.dmin, cd.dmax);
+ INIT_MINMAX(cd.dmin, cd.dmax);
- for(a=0, mvert=me->mvert; a<me->totvert; a++, mvert++) {
- Mat4MulVecfl(cd.curvespace, mvert->co);
- DO_MINMAX(mvert->co, cd.dmin, cd.dmax);
- }
+ for(a=0; a<me->totvert; a++) {
+ Mat4MulVecfl(cd.curvespace, vertexCos[a]);
+ DO_MINMAX(vertexCos[a], cd.dmin, cd.dmax);
+ }
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- calc_curve_deform(ob->parent, mvert->co, ob->trackflag, &cd);
- /* move coord back to objectspace */
- Mat4MulVecfl(cd.objectspace, mvert->co);
- }
+ for(a=0; a<me->totvert; a++) {
+ calc_curve_deform(ob->parent, vertexCos[a], ob->trackflag, &cd);
+ Mat4MulVecfl(cd.objectspace, vertexCos[a]); /* move coord back to objectspace */
}
- /* restore */
+
cu->flag = flag;
+
return 1;
}
else if(ob->parent->type==OB_LATTICE) {
-
init_latt_deform(ob->parent, ob);
-
if(ob->type==OB_MESH) {
- me= ob->data;
-
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- calc_latt_deform(mvert->co);
+ for(a=0; a<me->totvert; a++) {
+ calc_latt_deform(vertexCos[a]);
}
}
- else if(ob->type==OB_MBALL) {
+ end_latt_deform();
+
+ return 1;
+ }
+ else if(ob->parent->type==OB_ARMATURE && ob->partype==PARSKEL) {
+ if (ob->parent==G.obedit) // misleading making displists... very bad
+ return 1;
+
+ init_armature_deform (ob->parent, ob);
+
+ for(a=0; a<me->totvert; a++) {
+ calc_armature_deform(ob->parent, vertexCos[a], a);
+ }
+
+ return 1;
+ }
+
+ return 0;
+}
+
+int object_deform(Object *ob)
+{
+ Curve *cu;
+ DispList *dl;
+ float *fp;
+ int a, tot;
+
+ if(ob->parent==NULL) return 0;
+
+ if(ob->parent->type==OB_LATTICE) {
+ init_latt_deform(ob->parent, ob);
+
+ if(ob->type==OB_MBALL) {
dl=ob->disp.first;
while(dl) {
fp = dl->verts;
@@ -609,31 +618,6 @@ int object_deform(Object *ob)
end_latt_deform();
return 1;
}
- else if(ob->parent->type==OB_ARMATURE) {
- if (ob->partype != PARSKEL)
- return 0;
-
- if (ob->parent==G.obedit) // misleading making displists... very bad
- return 1;
-
- init_armature_deform (ob->parent, ob);
-
- switch (ob->type){
- case OB_MESH:
- me= ob->data;
-
- mvert= me->mvert;
- for(a=0; a<me->totvert; a++, mvert++) {
- calc_armature_deform(ob->parent, mvert->co, a);
- }
- break;
- case OB_CURVE:
- case OB_SURF:
- break;
- }
-
- return 1;
- }
return 0;