Fix #20887: multires sculpt normals not updated correct in solid

textured draw mode.
This commit is contained in:
Brecht Van Lommel 2010-02-07 13:22:46 +00:00
parent 65dc616e10
commit aea91b97fc

@ -1220,6 +1220,21 @@ static void ccgDM_glNormalFast(float *a, float *b, float *c, float *d)
glNormal3fv(no);
}
static void ccgdm_pbvh_update(CCGDerivedMesh *ccgdm)
{
if(ccgdm->pbvh) {
CCGFace **faces;
int totface;
BLI_pbvh_get_grid_updates(ccgdm->pbvh, 1, (void***)&faces, &totface);
if(totface) {
ccgSubSurf_updateFromFaces(ccgdm->ss, 0, faces, totface);
ccgSubSurf_updateNormals(ccgdm->ss, faces, totface);
MEM_freeN(faces);
}
}
}
/* Only used by non-editmesh types */
static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)[4], int fast, int (*setMaterial)(int, void *attribs)) {
CCGDerivedMesh *ccgdm = (CCGDerivedMesh*) dm;
@ -1229,17 +1244,9 @@ static void ccgDM_drawFacesSolid(DerivedMesh *dm, float (*partial_redraw_planes)
char *faceFlags = ccgdm->faceFlags;
int step = (fast)? gridSize-1: 1;
ccgdm_pbvh_update(ccgdm);
if(ccgdm->pbvh && ccgdm->multires.mmd && !fast) {
CCGFace **faces;
int totface;
BLI_pbvh_get_grid_updates(ccgdm->pbvh, 1, (void***)&faces, &totface);
if(totface) {
ccgSubSurf_updateFromFaces(ss, 0, faces, totface);
ccgSubSurf_updateNormals(ss, faces, totface);
MEM_freeN(faces);
}
if(dm->numFaceData) {
/* should be per face */
if(!setMaterial(faceFlags[1]+1, NULL))
@ -1330,6 +1337,8 @@ static void ccgDM_drawMappedFacesGLSL(DerivedMesh *dm, int (*setMaterial)(int, v
char *faceFlags = ccgdm->faceFlags;
int a, b, i, doDraw, numVerts, matnr, new_matnr, totface;
ccgdm_pbvh_update(ccgdm);
doDraw = 0;
numVerts = 0;
matnr = -1;
@ -1484,6 +1493,8 @@ static void ccgDM_drawFacesColored(DerivedMesh *dm, int useTwoSided, unsigned ch
unsigned char *cp1, *cp2;
int useTwoSide=1;
ccgdm_pbvh_update(ccgdm);
cp1= col1;
if(col2) {
cp2= col2;
@ -1554,6 +1565,8 @@ static void ccgDM_drawFacesTex_common(DerivedMesh *dm,
int i, totface, flag, gridSize = ccgSubSurf_getGridSize(ss);
int gridFaces = gridSize - 1;
ccgdm_pbvh_update(ccgdm);
if(!mcol)
mcol = dm->getFaceDataArray(dm, CD_MCOL);