forked from bartvdbraak/blender
Fix autosmooth with recent DM optimizations
Also avoid multiple float->short conversions for the same normal.
This commit is contained in:
parent
72c7e12a5d
commit
4143b8a6c7
@ -1419,10 +1419,9 @@ static void cdDM_buffer_copy_normal(
|
|||||||
{
|
{
|
||||||
int i, totface;
|
int i, totface;
|
||||||
int start;
|
int start;
|
||||||
float f_no[3];
|
|
||||||
|
|
||||||
const float *nors = dm->getTessFaceDataArray(dm, CD_NORMAL);
|
const float *nors = dm->getTessFaceDataArray(dm, CD_NORMAL);
|
||||||
short (*tlnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL);
|
const short (*tlnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL);
|
||||||
MVert *mvert = dm->getVertArray(dm);
|
MVert *mvert = dm->getVertArray(dm);
|
||||||
MFace *f = dm->getTessFaceArray(dm);
|
MFace *f = dm->getTessFaceArray(dm);
|
||||||
|
|
||||||
@ -1432,16 +1431,16 @@ static void cdDM_buffer_copy_normal(
|
|||||||
const int smoothnormal = (f->flag & ME_SMOOTH);
|
const int smoothnormal = (f->flag & ME_SMOOTH);
|
||||||
|
|
||||||
if (tlnors) {
|
if (tlnors) {
|
||||||
short (*tlnor)[3] = tlnors[i];
|
const short (*ln)[3] = tlnors[i];
|
||||||
/* Copy loop normals */
|
/* Copy loop normals */
|
||||||
copy_v3_v3_short(&varray[start], tlnor[0]);
|
copy_v3_v3_short(&varray[start], ln[0]);
|
||||||
copy_v3_v3_short(&varray[start + 3], tlnor[1]);
|
copy_v3_v3_short(&varray[start + 4], ln[1]);
|
||||||
copy_v3_v3_short(&varray[start + 6], tlnor[2]);
|
copy_v3_v3_short(&varray[start + 8], ln[2]);
|
||||||
start += 9;
|
start += 12;
|
||||||
|
|
||||||
if (f->v4) {
|
if (f->v4) {
|
||||||
copy_v3_v3_short(&varray[start], tlnor[3]);
|
copy_v3_v3_short(&varray[start], ln[3]);
|
||||||
start += 3;
|
start += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (smoothnormal) {
|
else if (smoothnormal) {
|
||||||
@ -1458,30 +1457,39 @@ static void cdDM_buffer_copy_normal(
|
|||||||
}
|
}
|
||||||
else if (nors) {
|
else if (nors) {
|
||||||
/* copy cached face normal */
|
/* copy cached face normal */
|
||||||
normal_float_to_short_v3(&varray[start], &nors[i * 3]);
|
short f_no_s[3];
|
||||||
normal_float_to_short_v3(&varray[start + 4], &nors[i * 3]);
|
|
||||||
normal_float_to_short_v3(&varray[start + 8], &nors[i * 3]);
|
normal_float_to_short_v3(f_no_s, &nors[i * 3]);
|
||||||
|
|
||||||
|
copy_v3_v3_short(&varray[start], f_no_s);
|
||||||
|
copy_v3_v3_short(&varray[start + 4], f_no_s);
|
||||||
|
copy_v3_v3_short(&varray[start + 8], f_no_s);
|
||||||
start += 12;
|
start += 12;
|
||||||
|
|
||||||
if (f->v4) {
|
if (f->v4) {
|
||||||
normal_float_to_short_v3(&varray[start], &nors[i * 3]);
|
copy_v3_v3_short(&varray[start], f_no_s);
|
||||||
start += 4;
|
start += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
/* calculate face normal */
|
/* calculate face normal */
|
||||||
|
float f_no[3];
|
||||||
|
short f_no_s[3];
|
||||||
|
|
||||||
if (f->v4)
|
if (f->v4)
|
||||||
normal_quad_v3(f_no, mvert[f->v1].co, mvert[f->v2].co, mvert[f->v3].co, mvert[f->v4].co);
|
normal_quad_v3(f_no, mvert[f->v1].co, mvert[f->v2].co, mvert[f->v3].co, mvert[f->v4].co);
|
||||||
else
|
else
|
||||||
normal_tri_v3(f_no, mvert[f->v1].co, mvert[f->v2].co, mvert[f->v3].co);
|
normal_tri_v3(f_no, mvert[f->v1].co, mvert[f->v2].co, mvert[f->v3].co);
|
||||||
|
|
||||||
normal_float_to_short_v3(&varray[start], f_no);
|
normal_float_to_short_v3(f_no_s, f_no);
|
||||||
normal_float_to_short_v3(&varray[start + 4], f_no);
|
|
||||||
normal_float_to_short_v3(&varray[start + 8], f_no);
|
copy_v3_v3_short(&varray[start], f_no_s);
|
||||||
|
copy_v3_v3_short(&varray[start + 4], f_no_s);
|
||||||
|
copy_v3_v3_short(&varray[start + 8], f_no_s);
|
||||||
start += 12;
|
start += 12;
|
||||||
|
|
||||||
if (f->v4) {
|
if (f->v4) {
|
||||||
normal_float_to_short_v3(&varray[start], f_no);
|
copy_v3_v3_short(&varray[start], f_no_s);
|
||||||
start += 4;
|
start += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1769,7 +1769,7 @@ static void ccgDM_buffer_copy_normal(
|
|||||||
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
|
CCGDerivedMesh *ccgdm = (CCGDerivedMesh *) dm;
|
||||||
CCGSubSurf *ss = ccgdm->ss;
|
CCGSubSurf *ss = ccgdm->ss;
|
||||||
CCGKey key;
|
CCGKey key;
|
||||||
short (*lnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL);
|
const short (*lnors)[4][3] = dm->getTessFaceDataArray(dm, CD_TESSLOOPNORMAL);
|
||||||
int gridSize = ccgSubSurf_getGridSize(ss);
|
int gridSize = ccgSubSurf_getGridSize(ss);
|
||||||
int gridFaces = gridSize - 1;
|
int gridFaces = gridSize - 1;
|
||||||
DMFlagMat *faceFlags = ccgdm->faceFlags;
|
DMFlagMat *faceFlags = ccgdm->faceFlags;
|
||||||
@ -1784,7 +1784,7 @@ static void ccgDM_buffer_copy_normal(
|
|||||||
CCGFace *f = ccgdm->faceMap[i].face;
|
CCGFace *f = ccgdm->faceMap[i].face;
|
||||||
int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
|
int S, x, y, numVerts = ccgSubSurf_getFaceNumVerts(f);
|
||||||
int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
|
int index = GET_INT_FROM_POINTER(ccgSubSurf_getFaceFaceHandle(f));
|
||||||
short (*ln)[4][3] = NULL;
|
const short (*ln)[3] = NULL;
|
||||||
|
|
||||||
if (faceFlags) {
|
if (faceFlags) {
|
||||||
shademodel = (lnors || (faceFlags[index].flag & ME_SMOOTH)) ? GL_SMOOTH : GL_FLAT;
|
shademodel = (lnors || (faceFlags[index].flag & ME_SMOOTH)) ? GL_SMOOTH : GL_FLAT;
|
||||||
@ -1794,7 +1794,7 @@ static void ccgDM_buffer_copy_normal(
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (lnors) {
|
if (lnors) {
|
||||||
ln = lnors;
|
ln = *lnors;
|
||||||
lnors += gridFaces * gridFaces * numVerts;
|
lnors += gridFaces * gridFaces * numVerts;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1805,13 +1805,13 @@ static void ccgDM_buffer_copy_normal(
|
|||||||
/* Can't use quad strips here... */
|
/* Can't use quad strips here... */
|
||||||
for (y = 0; y < gridFaces; y ++) {
|
for (y = 0; y < gridFaces; y ++) {
|
||||||
for (x = 0; x < gridFaces; x ++) {
|
for (x = 0; x < gridFaces; x ++) {
|
||||||
copy_v3_v3_short(&varray[start], ln[0][0]);
|
copy_v3_v3_short(&varray[start], ln[0]);
|
||||||
copy_v3_v3_short(&varray[start + 4], ln[0][3]);
|
copy_v3_v3_short(&varray[start + 4], ln[3]);
|
||||||
copy_v3_v3_short(&varray[start + 8], ln[0][2]);
|
copy_v3_v3_short(&varray[start + 8], ln[2]);
|
||||||
copy_v3_v3_short(&varray[start + 12], ln[0][1]);
|
copy_v3_v3_short(&varray[start + 12], ln[1]);
|
||||||
|
|
||||||
start += 16;
|
start += 16;
|
||||||
ln ++;
|
ln += 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1835,18 +1835,21 @@ static void ccgDM_buffer_copy_normal(
|
|||||||
else {
|
else {
|
||||||
for (y = 0; y < gridFaces; y ++) {
|
for (y = 0; y < gridFaces; y ++) {
|
||||||
for (x = 0; x < gridFaces; x ++) {
|
for (x = 0; x < gridFaces; x ++) {
|
||||||
float no[3];
|
float f_no[3];
|
||||||
|
short f_no_s[3];
|
||||||
|
|
||||||
float *a = CCG_grid_elem_co(&key, faceGridData, x, y );
|
float *a = CCG_grid_elem_co(&key, faceGridData, x, y );
|
||||||
float *b = CCG_grid_elem_co(&key, faceGridData, x + 1, y );
|
float *b = CCG_grid_elem_co(&key, faceGridData, x + 1, y );
|
||||||
float *c = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1);
|
float *c = CCG_grid_elem_co(&key, faceGridData, x + 1, y + 1);
|
||||||
float *d = CCG_grid_elem_co(&key, faceGridData, x, y + 1);
|
float *d = CCG_grid_elem_co(&key, faceGridData, x, y + 1);
|
||||||
|
|
||||||
ccgDM_NormalFast(a, b, c, d, no);
|
ccgDM_NormalFast(a, b, c, d, f_no);
|
||||||
|
normal_float_to_short_v3(f_no_s, f_no);
|
||||||
|
|
||||||
normal_float_to_short_v3(&varray[start], no);
|
copy_v3_v3_short(&varray[start], f_no_s);
|
||||||
normal_float_to_short_v3(&varray[start + 4], no);
|
copy_v3_v3_short(&varray[start + 4], f_no_s);
|
||||||
normal_float_to_short_v3(&varray[start + 8], no);
|
copy_v3_v3_short(&varray[start + 8], f_no_s);
|
||||||
normal_float_to_short_v3(&varray[start + 12], no);
|
copy_v3_v3_short(&varray[start + 12], f_no_s);
|
||||||
|
|
||||||
start += 16;
|
start += 16;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user