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:
authorBen Batt <benbatt@gmail.com>2006-08-28 05:12:36 +0400
committerBen Batt <benbatt@gmail.com>2006-08-28 05:12:36 +0400
commit433f6c7043c06d8d0330fa69f63d475549b48e91 (patch)
treed147f943e4cfcc2f0df50818e18f983772a52c22 /source/blender/blenkernel/intern/lattice.c
parent5dbc4c5f8fda61da055a2186a5080feec96828c0 (diff)
Integration of the Google Summer of Code Modifier Stack Upgrade project. The
main features are: * Modifiers can now be in any order in the modifier stack * DerivedMesh now has a standard framework for custom element data to be passed through the stack with mesh data (being copied and interpolated as appropriate), so modifiers can access whatever data they need * The modifier stack code has been refactored and a number of bugs have been removed * The EdgeSplit modifier has been added: http://mediawiki.blender.org/index.php/BlenderDev/EdgeSplitModifier * The DerivedMesh modifier has been added: http://mediawiki.blender.org/index.php/BlenderDev/DisplaceModifier * The UVProject modifier has been added: http://mediawiki.blender.org/index.php/BlenderDev/UVProjectModifier For more info, see: http://mediawiki.blender.org/index.php/User:Artificer/ModifierStackUpgrade (currently undergoing reorganisation)
Diffstat (limited to 'source/blender/blenkernel/intern/lattice.c')
-rw-r--r--source/blender/blenkernel/intern/lattice.c133
1 files changed, 92 insertions, 41 deletions
diff --git a/source/blender/blenkernel/intern/lattice.c b/source/blender/blenkernel/intern/lattice.c
index 81f7eb7a0eb..768fedd86ea 100644
--- a/source/blender/blenkernel/intern/lattice.c
+++ b/source/blender/blenkernel/intern/lattice.c
@@ -56,6 +56,8 @@
#include "BKE_anim.h"
#include "BKE_armature.h"
#include "BKE_curve.h"
+#include "BKE_cdderivedmesh.h"
+#include "BKE_DerivedMesh.h"
#include "BKE_deform.h"
#include "BKE_displist.h"
#include "BKE_global.h"
@@ -161,7 +163,7 @@ void resizelattice(Lattice *lt, int uNew, int vNew, int wNew, Object *ltOb)
Mat4CpyMat4(mat, ltOb->obmat);
Mat4One(ltOb->obmat);
- lattice_deform_verts(ltOb, NULL, vertexCos, uNew*vNew*wNew, NULL);
+ lattice_deform_verts(ltOb, NULL, NULL, vertexCos, uNew*vNew*wNew, NULL);
Mat4CpyMat4(ltOb->obmat, mat);
lt->typeu = typeu;
@@ -556,52 +558,85 @@ static void calc_curve_deform(Object *par, float *co, short axis, CurveDeform *c
}
-void curve_deform_verts(Object *cuOb, Object *target, float (*vertexCos)[3], int numVerts, char *vgroup)
+void curve_deform_verts(Object *cuOb, Object *target, DerivedMesh *dm, float (*vertexCos)[3], int numVerts, char *vgroup)
{
Curve *cu = cuOb->data;
int a, flag = cu->flag;
CurveDeform cd;
+ int use_vgroups;
cu->flag |= (CU_PATH|CU_FOLLOW); // needed for path & bevlist
init_curve_deform(cuOb, target, &cd);
- INIT_MINMAX(cd.dmin, cd.dmax);
-
- for(a=0; a<numVerts; a++) {
- Mat4MulVecfl(cd.curvespace, vertexCos[a]);
- DO_MINMAX(vertexCos[a], cd.dmin, cd.dmax);
- }
-
- if(vgroup && vgroup[0] && target->type==OB_MESH) {
+ /* check whether to use vertex groups (only possible if target is a Mesh)
+ * we want either a Mesh with no derived data, or derived data with
+ * deformverts
+ */
+ if(target && target->type==OB_MESH) {
+ /* if there's derived data without deformverts, don't use vgroups */
+ if(dm && !dm->getVertData(dm, 0, LAYERTYPE_MDEFORMVERT))
+ use_vgroups = 0;
+ else
+ use_vgroups = 1;
+ } else
+ use_vgroups = 0;
+
+ if(vgroup && vgroup[0] && use_vgroups) {
bDeformGroup *curdef;
Mesh *me= target->data;
- int index= 0;
+ int index;
/* find the group (weak loop-in-loop) */
- for (curdef = target->defbase.first; curdef; curdef=curdef->next, index++)
+ for(index = 0, curdef = target->defbase.first; curdef;
+ curdef = curdef->next, index++)
if (!strcmp(curdef->name, vgroup))
break;
- /* check for numVerts because old files can have modifier over subsurf still */
- if(curdef && me->dvert && numVerts==me->totvert) {
- MDeformVert *dvert= me->dvert;
+
+ if(curdef && (me->dvert || dm)) {
+ MDeformVert *dvert = me->dvert;
float vec[3];
int j;
-
- for(a=0; a<numVerts; a++, dvert++) {
- for(j=0; j<dvert->totweight; j++) {
- if (dvert->dw[j].def_nr == index) {
+
+ INIT_MINMAX(cd.dmin, cd.dmax);
+
+ for(a = 0; a < numVerts; a++, dvert++) {
+ if(dm) dvert = dm->getVertData(dm, a, LAYERTYPE_MDEFORMVERT);
+
+ for(j = 0; j < dvert->totweight; j++) {
+ if(dvert->dw[j].def_nr == index) {
+ Mat4MulVecfl(cd.curvespace, vertexCos[a]);
+ DO_MINMAX(vertexCos[a], cd.dmin, cd.dmax);
+ break;
+ }
+ }
+ }
+
+ dvert = me->dvert;
+ for(a = 0; a < numVerts; a++, dvert++) {
+ if(dm) dvert = dm->getVertData(dm, a, LAYERTYPE_MDEFORMVERT);
+
+ for(j = 0; j < dvert->totweight; j++) {
+ if(dvert->dw[j].def_nr == index) {
VECCOPY(vec, vertexCos[a]);
calc_curve_deform(cuOb, vec, target->trackflag, &cd);
- VecLerpf(vertexCos[a], vertexCos[a], vec, dvert->dw[j].weight);
+ VecLerpf(vertexCos[a], vertexCos[a], vec,
+ dvert->dw[j].weight);
Mat4MulVecfl(cd.objectspace, vertexCos[a]);
+ break;
}
}
}
}
- }
- else {
- for(a=0; a<numVerts; a++) {
+ } else {
+ INIT_MINMAX(cd.dmin, cd.dmax);
+
+ for(a = 0; a < numVerts; a++) {
+ Mat4MulVecfl(cd.curvespace, vertexCos[a]);
+ DO_MINMAX(vertexCos[a], cd.dmin, cd.dmax);
+ }
+
+ for(a = 0; a < numVerts; a++) {
calc_curve_deform(cuOb, vertexCos[a], target->trackflag, &cd);
Mat4MulVecfl(cd.objectspace, vertexCos[a]);
}
@@ -609,37 +644,52 @@ void curve_deform_verts(Object *cuOb, Object *target, float (*vertexCos)[3], int
cu->flag = flag;
}
-void lattice_deform_verts(Object *laOb, Object *target, float (*vertexCos)[3], int numVerts, char *vgroup)
+void lattice_deform_verts(Object *laOb, Object *target, DerivedMesh *dm,
+ float (*vertexCos)[3], int numVerts, char *vgroup)
{
int a;
+ int use_vgroups;
init_latt_deform(laOb, target);
-
- if(vgroup && vgroup[0] && target->type==OB_MESH) {
+
+ /* check whether to use vertex groups (only possible if target is a Mesh)
+ * we want either a Mesh with no derived data, or derived data with
+ * deformverts
+ */
+ if(target && target->type==OB_MESH) {
+ /* if there's derived data without deformverts, don't use vgroups */
+ if(dm && !dm->getVertData(dm, 0, LAYERTYPE_MDEFORMVERT))
+ use_vgroups = 0;
+ else
+ use_vgroups = 1;
+ } else
+ use_vgroups = 0;
+
+ if(vgroup && vgroup[0] && use_vgroups) {
bDeformGroup *curdef;
- Mesh *me= target->data;
- int index= 0;
+ Mesh *me = target->data;
+ int index = 0;
/* find the group (weak loop-in-loop) */
- for (curdef = target->defbase.first; curdef; curdef=curdef->next, index++)
- if (!strcmp(curdef->name, vgroup))
- break;
- /* check for numVerts because old files can have modifier over subsurf still */
- if(curdef && me->dvert && numVerts==me->totvert) {
- MDeformVert *dvert= me->dvert;
+ for(curdef = target->defbase.first; curdef;
+ curdef = curdef->next, index++)
+ if(!strcmp(curdef->name, vgroup)) break;
+
+ if(curdef && (me->dvert || dm)) {
+ MDeformVert *dvert = me->dvert;
int j;
- for(a=0; a<numVerts; a++, dvert++) {
- for(j=0; j<dvert->totweight; j++) {
+ for(a = 0; a < numVerts; a++, dvert++) {
+ if(dm) dvert = dm->getVertData(dm, a, LAYERTYPE_MDEFORMVERT);
+ for(j = 0; j < dvert->totweight; j++) {
if (dvert->dw[j].def_nr == index) {
calc_latt_deform(vertexCos[a], dvert->dw[j].weight);
}
}
}
}
- }
- else {
- for(a=0; a<numVerts; a++) {
+ } else {
+ for(a = 0; a < numVerts; a++) {
calc_latt_deform(vertexCos[a], 1.0f);
}
}
@@ -652,7 +702,8 @@ int object_deform_mball(Object *ob)
DispList *dl;
for (dl=ob->disp.first; dl; dl=dl->next) {
- lattice_deform_verts(ob->parent, ob, (float(*)[3]) dl->verts, dl->nr, NULL);
+ lattice_deform_verts(ob->parent, ob, NULL,
+ (float(*)[3]) dl->verts, dl->nr, NULL);
}
return 1;
@@ -765,7 +816,7 @@ void lattice_calc_modifiers(Object *ob)
for (; md; md=md->next) {
ModifierTypeInfo *mti = modifierType_getInfo(md->type);
- if (!(md->mode&(1<<0))) continue;
+ if (!(md->mode&eModifierMode_Realtime)) continue;
if (editmode && !(md->mode&eModifierMode_Editmode)) continue;
if (mti->isDisabled && mti->isDisabled(md)) continue;
if (mti->type!=eModifierTypeType_OnlyDeform) continue;