diff options
author | Campbell Barton <ideasman42@gmail.com> | 2010-02-09 21:06:57 +0300 |
---|---|---|
committer | Campbell Barton <ideasman42@gmail.com> | 2010-02-09 21:06:57 +0300 |
commit | 82825d5c93e8f3dc601b2b8dc6225936f009784e (patch) | |
tree | 25ec08fe18b70a9e0bff8f0da6d5138f7b3a7823 /source/blender | |
parent | 4520bc6eddbb7bd0f793ba44499418e672cdb831 (diff) |
[#21067] Weight painting doesn't work with mirror modifier enabled.
Diffstat (limited to 'source/blender')
-rw-r--r-- | source/blender/blenkernel/intern/DerivedMesh.c | 20 | ||||
-rw-r--r-- | source/blender/blenkernel/intern/cdderivedmesh.c | 2 |
2 files changed, 19 insertions, 3 deletions
diff --git a/source/blender/blenkernel/intern/DerivedMesh.c b/source/blender/blenkernel/intern/DerivedMesh.c index decea8c4127..b13f914e2e7 100644 --- a/source/blender/blenkernel/intern/DerivedMesh.c +++ b/source/blender/blenkernel/intern/DerivedMesh.c @@ -1771,6 +1771,22 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT)) add_weight_mcol_dm(ob, dm); + + /* constructive modifiers need to have an origindex + * otherwise they wont have anywhere to copy the data from */ + if(needMapping) { + int *index, i; + DM_add_vert_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL); + DM_add_edge_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL); + DM_add_face_layer(dm, CD_ORIGINDEX, CD_CALLOC, NULL); + + index = DM_get_vert_data_layer(dm, CD_ORIGINDEX); + for(i=0; i<dm->numVertData; i++) *index++= i; + index = DM_get_edge_data_layer(dm, CD_ORIGINDEX); + for(i=0; i<dm->numEdgeData; i++) *index++= i; + index = DM_get_face_data_layer(dm, CD_ORIGINDEX); + for(i=0; i<dm->numFaceData; i++) *index++= i; + } } /* create an orco derivedmesh in parallel */ @@ -2109,9 +2125,9 @@ static void mesh_build_data(Scene *scene, Object *ob, CustomDataMask dataMask) Object *obact = scene->basact?scene->basact->object:NULL; int editing = paint_facesel_test(ob); /* weight paint and face select need original indicies because of selection buffer drawing */ - int needMapping = (ob==obact) && (editing || (ob->mode & OB_MODE_WEIGHT_PAINT) || paint_facesel_test(ob)); + int needMapping = (ob==obact) && (editing || (ob->mode & OB_MODE_WEIGHT_PAINT) || editing); float min[3], max[3]; - + clear_mesh_caches(ob); mesh_calc_modifiers(scene, ob, NULL, &ob->derivedDeform, diff --git a/source/blender/blenkernel/intern/cdderivedmesh.c b/source/blender/blenkernel/intern/cdderivedmesh.c index 51c5ca4bc9b..c091a7b251f 100644 --- a/source/blender/blenkernel/intern/cdderivedmesh.c +++ b/source/blender/blenkernel/intern/cdderivedmesh.c @@ -1021,7 +1021,7 @@ static void cdDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, vo char *varray = 0; int numdata = 0, elementsize = 0, offset; int start = 0, numfaces = 0, prevdraw = 0, curface = 0; - GPUAttrib datatypes[32]; + GPUAttrib datatypes[GPU_MAX_ATTRIB]; /* TODO, messing up when switching materials many times - [#21056]*/ memset(&attribs, 0, sizeof(attribs)); GPU_vertex_setup(dm); |