=bmesh= fixed bunches of modifier stack bugs
This commit is contained in:
@@ -881,7 +881,7 @@ static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm)
|
|||||||
unsigned char *wtcol;
|
unsigned char *wtcol;
|
||||||
unsigned char(*wlcol)[4] = NULL;
|
unsigned char(*wlcol)[4] = NULL;
|
||||||
BLI_array_declare(wlcol);
|
BLI_array_declare(wlcol);
|
||||||
int i, totface=dm->getNumTessFaces(dm), totpoly=dm->getNumFaces, totloop;
|
int i, totface=dm->getNumTessFaces(dm), totloop;
|
||||||
int *origIndex = dm->getVertDataArray(dm, CD_ORIGINDEX);
|
int *origIndex = dm->getVertDataArray(dm, CD_ORIGINDEX);
|
||||||
|
|
||||||
wtcol = MEM_callocN (sizeof (unsigned char) * totface*4*4, "weightmap");
|
wtcol = MEM_callocN (sizeof (unsigned char) * totface*4*4, "weightmap");
|
||||||
@@ -889,11 +889,12 @@ static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm)
|
|||||||
/*first add colors to the tesselation faces*/
|
/*first add colors to the tesselation faces*/
|
||||||
memset(wtcol, 0x55, sizeof (unsigned char) * totface*4*4);
|
memset(wtcol, 0x55, sizeof (unsigned char) * totface*4*4);
|
||||||
for (i=0; i<totface; i++, mf++) {
|
for (i=0; i<totface; i++, mf++) {
|
||||||
calc_weightpaint_vert_color(ob, coba, mf->v1, &wtcol[(i*4 + 0)*4]);
|
/*origindex being NULL means we're operating on original mesh data*/
|
||||||
calc_weightpaint_vert_color(ob, coba, mf->v2, &wtcol[(i*4 + 1)*4]);
|
calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v1] : mf->v1, &wtcol[(i*4 + 0)*4]);
|
||||||
calc_weightpaint_vert_color(ob, coba, mf->v3, &wtcol[(i*4 + 2)*4]);
|
calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v2] : mf->v2, &wtcol[(i*4 + 1)*4]);
|
||||||
|
calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v3] : mf->v3, &wtcol[(i*4 + 2)*4]);
|
||||||
if (mf->v4)
|
if (mf->v4)
|
||||||
calc_weightpaint_vert_color(ob, coba, mf->v4, &wtcol[(i*4 + 3)*4]);
|
calc_weightpaint_vert_color(ob, coba, origIndex ? origIndex[mf->v4] : mf->v4, &wtcol[(i*4 + 3)*4]);
|
||||||
}
|
}
|
||||||
|
|
||||||
CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol, totface);
|
CustomData_add_layer(&dm->faceData, CD_WEIGHT_MCOL, CD_ASSIGN, wtcol, totface);
|
||||||
@@ -904,9 +905,12 @@ static void add_weight_mcol_dm(Object *ob, DerivedMesh *dm)
|
|||||||
for (; !dfiter->done; dfiter->step(dfiter)) {
|
for (; !dfiter->done; dfiter->step(dfiter)) {
|
||||||
dliter = dfiter->getLoopsIter(dfiter);
|
dliter = dfiter->getLoopsIter(dfiter);
|
||||||
for (; !dliter->done; dliter->step(dliter), totloop++) {
|
for (; !dliter->done; dliter->step(dliter), totloop++) {
|
||||||
|
int *oi = (int*)dliter->getVertCDData(dliter, CD_ORIGINDEX, -1);
|
||||||
|
|
||||||
BLI_array_growone(wlcol);
|
BLI_array_growone(wlcol);
|
||||||
calc_weightpaint_vert_color(ob, coba, dliter->vindex, (unsigned
|
|
||||||
char *)&wlcol[totloop]);
|
calc_weightpaint_vert_color(ob, coba, oi ? *oi : dliter->vindex,
|
||||||
|
(unsigned char *)&wlcol[totloop]);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1108,9 +1112,6 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
|||||||
CDDM_calc_normals(dm);
|
CDDM_calc_normals(dm);
|
||||||
}
|
}
|
||||||
|
|
||||||
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
|
/* Constructive modifiers need to have an origindex
|
||||||
* otherwise they wont have anywhere to copy the data from.
|
* otherwise they wont have anywhere to copy the data from.
|
||||||
*
|
*
|
||||||
@@ -1133,6 +1134,10 @@ static void mesh_calc_modifiers(Scene *scene, Object *ob, float (*inputVertexCos
|
|||||||
orig = DM_get_face_data_layer(dm, CD_ORIGINDEX);
|
orig = DM_get_face_data_layer(dm, CD_ORIGINDEX);
|
||||||
for(i=0; i<dm->numPolyData; i++) *orig++= i;
|
for(i=0; i<dm->numPolyData; i++) *orig++= i;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if((dataMask & CD_MASK_WEIGHT_MCOL) && (ob->mode & OB_MODE_WEIGHT_PAINT))
|
||||||
|
add_weight_mcol_dm(ob, dm);
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
@@ -1634,7 +1634,7 @@ DerivedMesh *CDDM_from_mesh(Mesh *mesh, Object *UNUSED(ob))
|
|||||||
return dm;
|
return dm;
|
||||||
}
|
}
|
||||||
|
|
||||||
DerivedMesh *CDDM_from_editmesh(EditMesh *em, Mesh *UNUSED(me))
|
DerivedMesh *disabled__CDDM_from_editmesh(EditMesh *em, Mesh *UNUSED(me))
|
||||||
{
|
{
|
||||||
DerivedMesh *dm = CDDM_new(BLI_countlist(&em->verts),
|
DerivedMesh *dm = CDDM_new(BLI_countlist(&em->verts),
|
||||||
BLI_countlist(&em->edges),
|
BLI_countlist(&em->edges),
|
||||||
@@ -2025,10 +2025,10 @@ void *cddm_loopiter_getvertcddata(void *self, int type, int layer)
|
|||||||
CDDM_LoopIter *iter = self;
|
CDDM_LoopIter *iter = self;
|
||||||
|
|
||||||
if (layer == -1) return CustomData_get(&iter->cddm->dm.vertData,
|
if (layer == -1) return CustomData_get(&iter->cddm->dm.vertData,
|
||||||
iter->cddm->mloop[iter->head.vindex].v,
|
iter->cddm->mloop[iter->head.index].v,
|
||||||
type);
|
type);
|
||||||
else return CustomData_get_n(&iter->cddm->dm.vertData, type,
|
else return CustomData_get_n(&iter->cddm->dm.vertData, type,
|
||||||
iter->cddm->mloop[iter->head.vindex].v, layer);
|
iter->cddm->mloop[iter->head.index].v, layer);
|
||||||
}
|
}
|
||||||
|
|
||||||
DMLoopIter *cddmiter_get_loopiter(void *self)
|
DMLoopIter *cddmiter_get_loopiter(void *self)
|
||||||
|
@@ -896,7 +896,7 @@ static DerivedMesh *ss_to_cdderivedmesh(CCGSubSurf *ss, int ssFromEditmesh,
|
|||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
|
static int ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
|
||||||
float (*vertexCos)[3], int useFlatSubdiv)
|
float (*vertexCos)[3], int useFlatSubdiv)
|
||||||
{
|
{
|
||||||
float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss);
|
float creaseFactor = (float) ccgSubSurf_getSubdivisionLevels(ss);
|
||||||
@@ -976,7 +976,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
|
|||||||
hasGivenError = 1;
|
hasGivenError = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
((int*)ccgSubSurf_getFaceUserData(ss, f))[1] = (index)? *index++: i;
|
((int*)ccgSubSurf_getFaceUserData(ss, f))[1] = (index)? *index++: i;
|
||||||
@@ -986,6 +986,7 @@ static void ss_sync_from_derivedmesh(CCGSubSurf *ss, DerivedMesh *dm,
|
|||||||
ccgSubSurf_processSync(ss);
|
ccgSubSurf_processSync(ss);
|
||||||
|
|
||||||
BLI_array_free(fVerts);
|
BLI_array_free(fVerts);
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
/***/
|
/***/
|
||||||
@@ -3106,7 +3107,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
|
|||||||
ccgdm->useSubsurfUv = useSubsurfUv;
|
ccgdm->useSubsurfUv = useSubsurfUv;
|
||||||
|
|
||||||
totvert = ccgSubSurf_getNumVerts(ss);
|
totvert = ccgSubSurf_getNumVerts(ss);
|
||||||
ccgdm->vertMap = MEM_mallocN(totvert * sizeof(*ccgdm->vertMap), "vertMap");
|
ccgdm->vertMap = MEM_callocN(totvert * sizeof(*ccgdm->vertMap), "vertMap");
|
||||||
vi = ccgSubSurf_getVertIterator(ss);
|
vi = ccgSubSurf_getVertIterator(ss);
|
||||||
for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
|
for(; !ccgVertIterator_isStopped(vi); ccgVertIterator_next(vi)) {
|
||||||
CCGVert *v = ccgVertIterator_getCurrent(vi);
|
CCGVert *v = ccgVertIterator_getCurrent(vi);
|
||||||
@@ -3116,7 +3117,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
|
|||||||
ccgVertIterator_free(vi);
|
ccgVertIterator_free(vi);
|
||||||
|
|
||||||
totedge = ccgSubSurf_getNumEdges(ss);
|
totedge = ccgSubSurf_getNumEdges(ss);
|
||||||
ccgdm->edgeMap = MEM_mallocN(totedge * sizeof(*ccgdm->edgeMap), "edgeMap");
|
ccgdm->edgeMap = MEM_callocN(totedge * sizeof(*ccgdm->edgeMap), "edgeMap");
|
||||||
ei = ccgSubSurf_getEdgeIterator(ss);
|
ei = ccgSubSurf_getEdgeIterator(ss);
|
||||||
for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
|
for(; !ccgEdgeIterator_isStopped(ei); ccgEdgeIterator_next(ei)) {
|
||||||
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
|
CCGEdge *e = ccgEdgeIterator_getCurrent(ei);
|
||||||
@@ -3125,7 +3126,7 @@ static CCGDerivedMesh *getCCGDerivedMesh(CCGSubSurf *ss,
|
|||||||
}
|
}
|
||||||
|
|
||||||
totface = ccgSubSurf_getNumFaces(ss);
|
totface = ccgSubSurf_getNumFaces(ss);
|
||||||
ccgdm->faceMap = MEM_mallocN(totface * sizeof(*ccgdm->faceMap), "faceMap");
|
ccgdm->faceMap = MEM_callocN(totface * sizeof(*ccgdm->faceMap), "faceMap");
|
||||||
fi = ccgSubSurf_getFaceIterator(ss);
|
fi = ccgSubSurf_getFaceIterator(ss);
|
||||||
for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
|
for(; !ccgFaceIterator_isStopped(fi); ccgFaceIterator_next(fi)) {
|
||||||
CCGFace *f = ccgFaceIterator_getCurrent(fi);
|
CCGFace *f = ccgFaceIterator_getCurrent(fi);
|
||||||
@@ -3458,7 +3459,14 @@ struct DerivedMesh *subsurf_make_derived_from_derived(
|
|||||||
smd->mCache = ss = _getSubSurf(smd->mCache, levels,
|
smd->mCache = ss = _getSubSurf(smd->mCache, levels,
|
||||||
useAging, 0, useSimple);
|
useAging, 0, useSimple);
|
||||||
|
|
||||||
ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
|
if (!ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple)) {
|
||||||
|
//ccgSubSurf_free(smd->mCache);
|
||||||
|
smd->mCache = ss = _getSubSurf(NULL, levels,
|
||||||
|
useAging, 0, useSimple);
|
||||||
|
|
||||||
|
ss_sync_from_derivedmesh(ss, dm, vertCos, useSimple);
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
result = getCCGDerivedMesh(smd->mCache,
|
result = getCCGDerivedMesh(smd->mCache,
|
||||||
drawInteriorEdges,
|
drawInteriorEdges,
|
||||||
|
@@ -292,12 +292,12 @@ int ED_vgroup_copy_array(Object *ob, Object *ob_from)
|
|||||||
|
|
||||||
for(i=0; i<dvert_tot; i++, dvf++, dv++) {
|
for(i=0; i<dvert_tot; i++, dvf++, dv++) {
|
||||||
if((*dv)->dw)
|
if((*dv)->dw)
|
||||||
MEM_freeN((*dv)->dw);
|
BLI_cellalloc_free((*dv)->dw);
|
||||||
|
|
||||||
*(*dv)= *(*dvf);
|
*(*dv)= *(*dvf);
|
||||||
|
|
||||||
if((*dv)->dw)
|
if((*dv)->dw)
|
||||||
(*dv)->dw= MEM_dupallocN((*dv)->dw);
|
(*dv)->dw= BLI_cellalloc_dupalloc((*dv)->dw);
|
||||||
}
|
}
|
||||||
|
|
||||||
MEM_freeN(dvert_array);
|
MEM_freeN(dvert_array);
|
||||||
@@ -365,7 +365,7 @@ static void ED_vgroup_nr_vert_remove(Object *ob, int def_nr, int vertnum)
|
|||||||
* left then just remove the deform weight
|
* left then just remove the deform weight
|
||||||
*/
|
*/
|
||||||
else {
|
else {
|
||||||
MEM_freeN(dvert->dw);
|
BLI_cellalloc_free(dvert->dw);
|
||||||
dvert->dw = NULL;
|
dvert->dw = NULL;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
@@ -1186,7 +1186,7 @@ static void vgroup_active_remove_verts(Object *ob, const int allverts, bDeformGr
|
|||||||
if(dvert->dw){
|
if(dvert->dw){
|
||||||
memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*i);
|
memcpy(newdw, dvert->dw, sizeof(MDeformWeight)*i);
|
||||||
memcpy(newdw+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i));
|
memcpy(newdw+i, dvert->dw+i+1, sizeof(MDeformWeight)*(dvert->totweight-i));
|
||||||
MEM_freeN(dvert->dw);
|
BLI_cellalloc_free(dvert->dw);
|
||||||
}
|
}
|
||||||
dvert->dw=newdw;
|
dvert->dw=newdw;
|
||||||
}
|
}
|
||||||
@@ -1280,7 +1280,7 @@ static void vgroup_delete_edit_mode(Object *ob, bDeformGroup *dg)
|
|||||||
else if(ob->type==OB_LATTICE) {
|
else if(ob->type==OB_LATTICE) {
|
||||||
Lattice *lt= vgroup_edit_lattice(ob);
|
Lattice *lt= vgroup_edit_lattice(ob);
|
||||||
if(lt->dvert) {
|
if(lt->dvert) {
|
||||||
MEM_freeN(lt->dvert);
|
BLI_cellalloc_free(lt->dvert);
|
||||||
lt->dvert= NULL;
|
lt->dvert= NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1320,7 +1320,7 @@ static void vgroup_delete_all(Object *ob)
|
|||||||
else if(ob->type==OB_LATTICE) {
|
else if(ob->type==OB_LATTICE) {
|
||||||
Lattice *lt= vgroup_edit_lattice(ob);
|
Lattice *lt= vgroup_edit_lattice(ob);
|
||||||
if(lt->dvert) {
|
if(lt->dvert) {
|
||||||
MEM_freeN(lt->dvert);
|
BLI_cellalloc_free(lt->dvert);
|
||||||
lt->dvert= NULL;
|
lt->dvert= NULL;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -137,13 +137,13 @@ static void deformVerts(ModifierData *md, Object *ob,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void deformVertsEM(
|
static void deformVertsEM(
|
||||||
ModifierData *md, Object *ob, struct EditMesh *editData,
|
ModifierData *md, Object *ob, struct BMEditMesh *editData,
|
||||||
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
||||||
{
|
{
|
||||||
ArmatureModifierData *amd = (ArmatureModifierData*) md;
|
ArmatureModifierData *amd = (ArmatureModifierData*) md;
|
||||||
DerivedMesh *dm = derivedData;
|
DerivedMesh *dm = derivedData;
|
||||||
|
|
||||||
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
|
if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data);
|
||||||
|
|
||||||
armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, numVerts,
|
armature_deform_verts(amd->object, ob, dm, vertexCos, NULL, numVerts,
|
||||||
amd->deformflag, NULL, amd->defgrp_name);
|
amd->deformflag, NULL, amd->defgrp_name);
|
||||||
@@ -152,14 +152,14 @@ static void deformVertsEM(
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void deformMatricesEM(
|
static void deformMatricesEM(
|
||||||
ModifierData *md, Object *ob, struct EditMesh *editData,
|
ModifierData *md, Object *ob, struct BMEditMesh *editData,
|
||||||
DerivedMesh *derivedData, float (*vertexCos)[3],
|
DerivedMesh *derivedData, float (*vertexCos)[3],
|
||||||
float (*defMats)[3][3], int numVerts)
|
float (*defMats)[3][3], int numVerts)
|
||||||
{
|
{
|
||||||
ArmatureModifierData *amd = (ArmatureModifierData*) md;
|
ArmatureModifierData *amd = (ArmatureModifierData*) md;
|
||||||
DerivedMesh *dm = derivedData;
|
DerivedMesh *dm = derivedData;
|
||||||
|
|
||||||
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
|
if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data);
|
||||||
|
|
||||||
armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
|
armature_deform_verts(amd->object, ob, dm, vertexCos, defMats, numVerts,
|
||||||
amd->deformflag, NULL, amd->defgrp_name);
|
amd->deformflag, NULL, amd->defgrp_name);
|
||||||
|
@@ -125,12 +125,12 @@ static void deformVerts(ModifierData *md, Object *ob,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void deformVertsEM(
|
static void deformVertsEM(
|
||||||
ModifierData *md, Object *ob, struct EditMesh *editData,
|
ModifierData *md, Object *ob, struct BMEditMesh *editData,
|
||||||
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
||||||
{
|
{
|
||||||
DerivedMesh *dm = derivedData;
|
DerivedMesh *dm = derivedData;
|
||||||
|
|
||||||
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
|
if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data);
|
||||||
|
|
||||||
deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
|
deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
|
||||||
|
|
||||||
|
@@ -267,12 +267,12 @@ static void deformVerts(ModifierData *md, Object *ob,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void deformVertsEM(
|
static void deformVertsEM(
|
||||||
ModifierData *md, Object *ob, struct EditMesh *editData,
|
ModifierData *md, Object *ob, struct BMEditMesh *editData,
|
||||||
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
||||||
{
|
{
|
||||||
DerivedMesh *dm = derivedData;
|
DerivedMesh *dm = derivedData;
|
||||||
|
|
||||||
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
|
if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data);
|
||||||
|
|
||||||
deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
|
deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
|
||||||
|
|
||||||
|
@@ -120,12 +120,12 @@ static void deformVerts(ModifierData *md, Object *ob,
|
|||||||
}
|
}
|
||||||
|
|
||||||
static void deformVertsEM(
|
static void deformVertsEM(
|
||||||
ModifierData *md, Object *ob, struct EditMesh *editData,
|
ModifierData *md, Object *ob, struct BMEditMesh *editData,
|
||||||
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
DerivedMesh *derivedData, float (*vertexCos)[3], int numVerts)
|
||||||
{
|
{
|
||||||
DerivedMesh *dm = derivedData;
|
DerivedMesh *dm = derivedData;
|
||||||
|
|
||||||
if(!derivedData) dm = CDDM_from_editmesh(editData, ob->data);
|
if(!derivedData) dm = CDDM_from_BMEditMesh(editData, ob->data);
|
||||||
|
|
||||||
deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
|
deformVerts(md, ob, dm, vertexCos, numVerts, 0, 0);
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user