[Bf-blender-cvs] SVN commit: /data/svn/bf-blender [28376] trunk/blender/source/blender: Mesh Deform Modifier: compress static binding weights better, threshold
Brecht Van Lommel
brecht at blender.org
Fri Apr 23 13:19:08 CEST 2010
Revision: 28376
http://projects.blender.org/plugins/scmsvn/viewcvs.php?view=rev&root=bf-blender&revision=28376
Author: blendix
Date: 2010-04-23 13:19:06 +0200 (Fri, 23 Apr 2010)
Log Message:
-----------
Mesh Deform Modifier: compress static binding weights better, threshold
is still set very low so in many cases it could be even smaller, but being
a bit conservative here to try to avoid breaking rigs.
This is not forward-compatible, i.e. loading new files in older blender
versions will loose the binding.
Modified Paths:
--------------
trunk/blender/source/blender/blenkernel/BKE_modifier.h
trunk/blender/source/blender/blenloader/intern/readfile.c
trunk/blender/source/blender/editors/armature/meshlaplacian.c
trunk/blender/source/blender/makesdna/DNA_modifier_types.h
trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
Modified: trunk/blender/source/blender/blenkernel/BKE_modifier.h
===================================================================
--- trunk/blender/source/blender/blenkernel/BKE_modifier.h 2010-04-23 10:47:57 UTC (rev 28375)
+++ trunk/blender/source/blender/blenkernel/BKE_modifier.h 2010-04-23 11:19:06 UTC (rev 28376)
@@ -321,5 +321,8 @@
int required_mode);
struct ModifierData *modifiers_getVirtualModifierList(struct Object *ob);
+/* here for do_versions */
+void modifier_mdef_compact_influences(struct ModifierData *md);
+
#endif
Modified: trunk/blender/source/blender/blenloader/intern/readfile.c
===================================================================
--- trunk/blender/source/blender/blenloader/intern/readfile.c 2010-04-23 10:47:57 UTC (rev 28375)
+++ trunk/blender/source/blender/blenloader/intern/readfile.c 2010-04-23 11:19:06 UTC (rev 28376)
@@ -3852,24 +3852,35 @@
else if (md->type==eModifierType_MeshDeform) {
MeshDeformModifierData *mmd = (MeshDeformModifierData*) md;
- mmd->bindweights= newdataadr(fd, mmd->bindweights);
- mmd->bindcos= newdataadr(fd, mmd->bindcos);
+ mmd->bindinfluences= newdataadr(fd, mmd->bindinfluences);
+ mmd->bindoffsets= newdataadr(fd, mmd->bindoffsets);
+ mmd->bindcagecos= newdataadr(fd, mmd->bindcagecos);
mmd->dyngrid= newdataadr(fd, mmd->dyngrid);
mmd->dyninfluences= newdataadr(fd, mmd->dyninfluences);
mmd->dynverts= newdataadr(fd, mmd->dynverts);
+ mmd->bindweights= newdataadr(fd, mmd->bindweights);
+ mmd->bindcos= newdataadr(fd, mmd->bindcos);
+
if(fd->flags & FD_FLAGS_SWITCH_ENDIAN) {
int a;
+ if(mmd->bindoffsets)
+ for(a=0; a<mmd->totvert+1; a++)
+ SWITCH_INT(mmd->bindoffsets[a])
+ if(mmd->bindcagecos)
+ for(a=0; a<mmd->totcagevert*3; a++)
+ SWITCH_INT(mmd->bindcagecos[a])
+ if(mmd->dynverts)
+ for(a=0; a<mmd->totvert; a++)
+ SWITCH_INT(mmd->dynverts[a])
+
if(mmd->bindweights)
for(a=0; a<mmd->totcagevert*mmd->totvert; a++)
SWITCH_INT(mmd->bindweights[a])
if(mmd->bindcos)
for(a=0; a<mmd->totcagevert*3; a++)
SWITCH_INT(mmd->bindcos[a])
- if(mmd->dynverts)
- for(a=0; a<mmd->totvert; a++)
- SWITCH_INT(mmd->dynverts[a])
}
}
}
@@ -5169,7 +5180,7 @@
/*comma expressions, (e.g. expr1, expr2, expr3) evalutate each expression,
from left to right. the right-most expression sets the result of the comma
expression as a whole*/
- for(cl= sconsole->history.first; cl && (clnext=cl->next), cl; cl= clnext) {
+ for(cl= sconsole->history.first; cl && (clnext=cl->next); cl= clnext) {
cl->line= newdataadr(fd, cl->line);
if (!cl->line) {
BLI_remlink(&sconsole->history, cl);
@@ -6451,6 +6462,30 @@
}
}
+static void do_version_mdef_250(FileData *fd, Library *lib, Main *main)
+{
+ Object *ob;
+ ModifierData *md;
+ MeshDeformModifierData *mmd;
+
+ for(ob= main->object.first; ob; ob=ob->id.next) {
+ for(md=ob->modifiers.first; md; md=md->next) {
+ if(md->type == eModifierType_MeshDeform) {
+ mmd= (MeshDeformModifierData*)md;
+
+ if(mmd->bindcos) {
+ /* make bindcos NULL in order to trick older versions
+ into thinking that the mesh was not bound yet */
+ mmd->bindcagecos= mmd->bindcos;
+ mmd->bindcos= NULL;
+
+ modifier_mdef_compact_influences(md);
+ }
+ }
+ }
+ }
+}
+
static void do_version_constraints_radians_degrees_250(ListBase *lb)
{
bConstraint *con;
@@ -10780,7 +10815,7 @@
/* put 2.50 compatibility code here until next subversion bump */
{
-
+ do_version_mdef_250(fd, lib, main);
}
/* WATCH IT!!!: pointers from libdata have not been converted yet here! */
@@ -12219,16 +12254,17 @@
printf(" absolute lib: %s\n", mainptr->curlib->filename);
printf(" relative lib: %s\n", mainptr->curlib->name);
printf(" enter a new path:\n");
- scanf("%s", newlib_path);
- strcpy(mainptr->curlib->name, newlib_path);
- strcpy(mainptr->curlib->filename, newlib_path);
- cleanup_path(G.sce, mainptr->curlib->filename);
-
- fd= blo_openblenderfile(mainptr->curlib->filename, basefd->reports);
+ if(scanf("%s", newlib_path) > 0) {
+ strcpy(mainptr->curlib->name, newlib_path);
+ strcpy(mainptr->curlib->filename, newlib_path);
+ cleanup_path(G.sce, mainptr->curlib->filename);
+
+ fd= blo_openblenderfile(mainptr->curlib->filename, basefd->reports);
- if(fd) {
- printf("found: '%s', party on macuno!\n", mainptr->curlib->filename);
+ if(fd) {
+ printf("found: '%s', party on macuno!\n", mainptr->curlib->filename);
+ }
}
}
}
Modified: trunk/blender/source/blender/editors/armature/meshlaplacian.c
===================================================================
--- trunk/blender/source/blender/editors/armature/meshlaplacian.c 2010-04-23 10:47:57 UTC (rev 28375)
+++ trunk/blender/source/blender/editors/armature/meshlaplacian.c 2010-04-23 11:19:06 UTC (rev 28376)
@@ -44,6 +44,7 @@
#include "BLI_memarena.h"
#include "BKE_DerivedMesh.h"
+#include "BKE_modifier.h"
#include "BKE_utildefines.h"
#ifdef RIGID_DEFORM
@@ -1991,19 +1992,22 @@
#endif
/* assign bind variables */
- mmd->bindcos= (float*)mdb.cagecos;
+ mmd->bindcagecos= (float*)mdb.cagecos;
mmd->totvert= mdb.totvert;
mmd->totcagevert= mdb.totcagevert;
copy_m4_m4(mmd->bindmat, mmd->object->obmat);
- /* transform bindcos to world space */
+ /* transform bindcagecos to world space */
for(a=0; a<mdb.totcagevert; a++)
- mul_m4_v3(mmd->object->obmat, mmd->bindcos+a*3);
+ mul_m4_v3(mmd->object->obmat, mmd->bindcagecos+a*3);
/* free */
mdb.cagedm->release(mdb.cagedm);
MEM_freeN(mdb.vertexcos);
+ /* compact weights */
+ modifier_mdef_compact_influences((ModifierData*)mmd);
+
end_progress_bar();
waitcursor(0);
}
Modified: trunk/blender/source/blender/makesdna/DNA_modifier_types.h
===================================================================
--- trunk/blender/source/blender/makesdna/DNA_modifier_types.h 2010-04-23 10:47:57 UTC (rev 28375)
+++ trunk/blender/source/blender/makesdna/DNA_modifier_types.h 2010-04-23 11:19:06 UTC (rev 28376)
@@ -516,9 +516,13 @@
short gridsize, flag, mode, pad;
- /* variables filled in when bound */
- float *bindweights, *bindcos; /* computed binding weights */
+ /* result of static binding */
+ MDefInfluence *bindinfluences; /* influences */
+ int *bindoffsets; /* offsets into influences array */
+ float *bindcagecos; /* coordinates that cage was bound with */
int totvert, totcagevert; /* total vertices in mesh and cage */
+
+ /* result of dynamic binding */
MDefCell *dyngrid; /* grid with dynamic binding cell points */
MDefInfluence *dyninfluences; /* dynamic binding vertex influences */
int *dynverts, *pad2; /* is this vertex bound or not? */
@@ -528,6 +532,10 @@
float dyncellwidth; /* width of dynamic bind cell */
float bindmat[4][4]; /* matrix of cage at binding time */
+ /* deprecated storage */
+ float *bindweights; /* deprecated inefficient storage */
+ float *bindcos; /* deprecated storage of cage coords */
+
/* runtime */
void (*bindfunc)(struct Scene *scene, struct DerivedMesh *dm,
struct MeshDeformModifierData *mmd,
Modified: trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c
===================================================================
--- trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c 2010-04-23 10:47:57 UTC (rev 28375)
+++ trunk/blender/source/blender/modifiers/intern/MOD_meshdeform.c 2010-04-23 11:19:06 UTC (rev 28376)
@@ -352,7 +352,69 @@
dm->release(dm);
}
+#define MESHDEFORM_MIN_INFLUENCE 0.00001
+void modifier_mdef_compact_influences(ModifierData *md)
+{
+ MeshDeformModifierData *mmd= (MeshDeformModifierData*)md;
+ float weight, *weights, totweight;
+ int totinfluence, totvert, totcagevert, a, b;
+
+ weights= mmd->bindweights;
+ if(!weights)
+ return;
+
+ totvert= mmd->totvert;
+ totcagevert= mmd->totcagevert;
+
+ /* count number of influences above threshold */
+ for(b=0; b<totvert; b++) {
+ for(a=0; a<totcagevert; a++) {
+ weight= weights[a + b*totcagevert];
+
+ if(weight > MESHDEFORM_MIN_INFLUENCE)
+ mmd->totinfluence++;
+ }
+ }
+
+ /* allocate bind influences */
+ mmd->bindinfluences= MEM_callocN(sizeof(MDefInfluence)*mmd->totinfluence, "MDefBindInfluence");
+ mmd->bindoffsets= MEM_callocN(sizeof(int)*(totvert+1), "MDefBindOffset");
+
+ /* write influences */
+ totinfluence= 0;
+
+ for(b=0; b<totvert; b++) {
+ mmd->bindoffsets[b]= totinfluence;
+ totweight= 0.0f;
+
+ /* sum total weight */
+ for(a=0; a<totcagevert; a++) {
+ weight= weights[a + b*totcagevert];
+
+ if(weight > MESHDEFORM_MIN_INFLUENCE)
+ totweight += weight;
+ }
+
+ /* assign weights normalized */
+ for(a=0; a<totcagevert; a++) {
+ weight= weights[a + b*totcagevert];
+
+ if(weight > MESHDEFORM_MIN_INFLUENCE) {
+ mmd->bindinfluences[totinfluence].weight= weight/totweight;
+ mmd->bindinfluences[totinfluence].vertex= a;
+ totinfluence++;
+ }
+ }
+ }
+
+ mmd->bindoffsets[b]= totinfluence;
+
+ /* free */
+ MEM_freeN(mmd->bindweights);
+ mmd->bindweights= NULL;
+}
+
ModifierTypeInfo modifierType_MeshDeform = {
/* name */ "MeshDeform",
/* structName */ "MeshDeformModifierData",
More information about the Bf-blender-cvs
mailing list