Bugfix #5107
Autosmooth didn't copy additional texture coordinates such as sticky correctly. This was part of the vertex struct in 2.41 and older, but it became dynamic in 2.42.
This commit is contained in:
@@ -309,15 +309,6 @@ u | | F1 | F2 |
|
||||
|
||||
/* ------------------------------------------------------------------------- */
|
||||
|
||||
static VertRen *duplicate_vertren(Render *re, VertRen *ver)
|
||||
{
|
||||
VertRen *v1= RE_findOrAddVert(re, re->totvert++);
|
||||
int index= v1->index;
|
||||
*v1= *ver;
|
||||
v1->index= index;
|
||||
return v1;
|
||||
}
|
||||
|
||||
static void split_v_renderfaces(Render *re, int startvlak, int startvert, int usize, int vsize, int uIndex, int cyclu, int cyclv)
|
||||
{
|
||||
int vLen = vsize-1+(!!cyclv);
|
||||
@@ -325,7 +316,7 @@ static void split_v_renderfaces(Render *re, int startvlak, int startvert, int us
|
||||
|
||||
for (v=0; v<vLen; v++) {
|
||||
VlakRen *vlr = RE_findOrAddVlak(re, startvlak + vLen*uIndex + v);
|
||||
VertRen *vert = duplicate_vertren(re, vlr->v2);
|
||||
VertRen *vert = RE_vertren_copy(re, vlr->v2);
|
||||
|
||||
if (cyclv) {
|
||||
vlr->v2 = vert;
|
||||
@@ -346,7 +337,7 @@ static void split_v_renderfaces(Render *re, int startvlak, int startvert, int us
|
||||
}
|
||||
|
||||
if (v==0) {
|
||||
vlr->v1 = duplicate_vertren(re, vlr->v1);
|
||||
vlr->v1 = RE_vertren_copy(re, vlr->v1);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -903,7 +894,7 @@ static void autosmooth(Render *re, float mat[][4], int startvert, int startvlak,
|
||||
v1= as_findvertex(vlr, ver, asv, thresh);
|
||||
if(v1==NULL) {
|
||||
/* make a new vertex */
|
||||
v1= duplicate_vertren(re, ver);
|
||||
v1= RE_vertren_copy(re, ver);
|
||||
}
|
||||
asf->nver[b]= v1;
|
||||
if(vlr->v1==ver) vlr->v1= v1;
|
||||
|
||||
@@ -188,6 +188,48 @@ float *RE_vertren_get_winspeed(Render *re, VertRen *ver, int verify)
|
||||
return winspeed + (ver->index & 255)*RE_WINSPEED_ELEMS;
|
||||
}
|
||||
|
||||
VertRen *RE_vertren_copy(Render *re, VertRen *ver)
|
||||
{
|
||||
VertRen *v1= RE_findOrAddVert(re, re->totvert++);
|
||||
float *fp1, *fp2;
|
||||
int index= v1->index;
|
||||
|
||||
*v1= *ver;
|
||||
v1->index= index;
|
||||
|
||||
fp1= RE_vertren_get_sticky(re, ver, 0);
|
||||
if(fp1) {
|
||||
fp2= RE_vertren_get_sticky(re, v1, 1);
|
||||
memcpy(fp2, fp1, RE_STICKY_ELEMS*sizeof(float));
|
||||
}
|
||||
fp1= RE_vertren_get_stress(re, ver, 0);
|
||||
if(fp1) {
|
||||
fp2= RE_vertren_get_stress(re, v1, 1);
|
||||
memcpy(fp2, fp1, RE_STRESS_ELEMS*sizeof(float));
|
||||
}
|
||||
fp1= RE_vertren_get_rad(re, ver, 0);
|
||||
if(fp1) {
|
||||
fp2= RE_vertren_get_rad(re, v1, 1);
|
||||
memcpy(fp2, fp1, RE_RAD_ELEMS*sizeof(float));
|
||||
}
|
||||
fp1= RE_vertren_get_strand(re, ver, 0);
|
||||
if(fp1) {
|
||||
fp2= RE_vertren_get_strand(re, v1, 1);
|
||||
memcpy(fp2, fp1, RE_STRAND_ELEMS*sizeof(float));
|
||||
}
|
||||
fp1= RE_vertren_get_tangent(re, ver, 0);
|
||||
if(fp1) {
|
||||
fp2= RE_vertren_get_tangent(re, v1, 1);
|
||||
memcpy(fp2, fp1, RE_TANGENT_ELEMS*sizeof(float));
|
||||
}
|
||||
fp1= RE_vertren_get_winspeed(re, ver, 0);
|
||||
if(fp1) {
|
||||
fp2= RE_vertren_get_winspeed(re, v1, 1);
|
||||
memcpy(fp2, fp1, RE_WINSPEED_ELEMS*sizeof(float));
|
||||
}
|
||||
return v1;
|
||||
}
|
||||
|
||||
VertRen *RE_findOrAddVert(Render *re, int nr)
|
||||
{
|
||||
VertTableNode *temp;
|
||||
|
||||
Reference in New Issue
Block a user