Fix T84041: Bevel caps have invalid normals
Bevel caps always had incorrect normals, causing display glitches in some cases. It seems this never worked properly (at least 2.79 also had this bug). Use the projection vector as the normal.
This commit is contained in:
parent
e25f7e33ff
commit
418cd7c4ba
Notes:
blender-bot
2023-11-20 12:14:32 +01:00
Referenced by issue #84848, Specific Rig Crashes blender when going into pose mode Referenced by issue #84041, Beveled path`s cap have wrong shading and glitches
|
@ -458,6 +458,7 @@ static void curve_to_displist(Curve *cu,
|
|||
/**
|
||||
* \param normal_proj: Optional normal that's used to project the scanfill verts into 2d coords.
|
||||
* Pass this along if known since it saves time calculating the normal.
|
||||
* This is also used to initialize #DispList.nors (one normal per display list).
|
||||
* \param flipnormal: Flip the normal (same as passing \a normal_proj negated)
|
||||
*/
|
||||
void BKE_displist_fill(ListBase *dispbase,
|
||||
|
@ -550,6 +551,18 @@ void BKE_displist_fill(ListBase *dispbase,
|
|||
dlnew->index = MEM_mallocN(sizeof(int[3]) * tot, "dlindex");
|
||||
dlnew->verts = MEM_mallocN(sizeof(float[3]) * totvert, "dlverts");
|
||||
|
||||
if (normal_proj != NULL) {
|
||||
/* Use a single normal for #DL_INDEX3.
|
||||
* Counter intuitively, the normal must always be the flipped projection vector. */
|
||||
dlnew->nors = MEM_mallocN(sizeof(float[3]), "dlnors");
|
||||
if (flipnormal) {
|
||||
copy_v3_v3(dlnew->nors, normal_proj);
|
||||
}
|
||||
else {
|
||||
negate_v3_v3(dlnew->nors, normal_proj);
|
||||
}
|
||||
}
|
||||
|
||||
/* vert data */
|
||||
f1 = dlnew->verts;
|
||||
totvert = 0;
|
||||
|
|
Loading…
Reference in New Issue