Fix: Versioning problem with cyclic bezier NURBS
Patch fixes versioning issue with NURBS files saved with Blender version from commit45d038181a
to0602852860
and opened with Blender version from commit0602852860
. Cyclic Bezier NURBS saved and then opened with Blender versions mentioned above changed their shape. Bug was reported in comments of T101160, circle problem. Differential Revision: https://developer.blender.org/D16503
This commit is contained in:
parent
db94d030bc
commit
18af9da572
Notes:
blender-bot
2023-02-14 04:56:36 +01:00
Referenced by issue #101160, Regression: deleting a point in a (cyclic) nurbs curve permanently converts to poly, subdividing as well
|
@ -2931,6 +2931,21 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain)
|
|||
}
|
||||
}
|
||||
|
||||
LISTBASE_FOREACH (Curve *, curve, &bmain->curves) {
|
||||
LISTBASE_FOREACH (Nurb *, nurb, &curve->nurb) {
|
||||
/* Previously other flags were ignored if CU_NURB_CYCLIC is set. */
|
||||
if (nurb->flagu & CU_NURB_CYCLIC) {
|
||||
nurb->flagu = CU_NURB_CYCLIC;
|
||||
BKE_nurb_knot_calc_u(nurb);
|
||||
}
|
||||
/* Previously other flags were ignored if CU_NURB_CYCLIC is set. */
|
||||
if (nurb->flagv & CU_NURB_CYCLIC) {
|
||||
nurb->flagv = CU_NURB_CYCLIC;
|
||||
BKE_nurb_knot_calc_v(nurb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/* Initialize the bone wireframe opacity setting. */
|
||||
if (!DNA_struct_elem_find(fd->filesdna, "View3DOverlay", "float", "bone_wire_alpha")) {
|
||||
LISTBASE_FOREACH (bScreen *, screen, &bmain->screens) {
|
||||
|
@ -3006,32 +3021,35 @@ void blo_do_versions_300(FileData *fd, Library * /*lib*/, Main *bmain)
|
|||
/* Alter NURBS knot mode flags to fit new modes. */
|
||||
LISTBASE_FOREACH (Curve *, curve, &bmain->curves) {
|
||||
LISTBASE_FOREACH (Nurb *, nurb, &curve->nurb) {
|
||||
/* Previously other flags were ignored if CU_NURB_CYCLIC is set. */
|
||||
if (nurb->flagu & CU_NURB_CYCLIC) {
|
||||
nurb->flagu = CU_NURB_CYCLIC;
|
||||
}
|
||||
/* CU_NURB_BEZIER and CU_NURB_ENDPOINT were ignored if combined. */
|
||||
else if (nurb->flagu & CU_NURB_BEZIER && nurb->flagu & CU_NURB_ENDPOINT) {
|
||||
if (nurb->flagu & CU_NURB_BEZIER && nurb->flagu & CU_NURB_ENDPOINT) {
|
||||
nurb->flagu &= ~(CU_NURB_BEZIER | CU_NURB_ENDPOINT);
|
||||
BKE_nurb_knot_calc_u(nurb);
|
||||
}
|
||||
else if (nurb->flagu & CU_NURB_CYCLIC) {
|
||||
/* In 45d038181ae2 cyclic bezier support is added, but CU_NURB_ENDPOINT still ignored. */
|
||||
nurb->flagu = CU_NURB_CYCLIC | (nurb->flagu & CU_NURB_BEZIER);
|
||||
BKE_nurb_knot_calc_u(nurb);
|
||||
}
|
||||
/* Bezier NURBS of order 3 were clamped to first control point. */
|
||||
else if (nurb->orderu == 3 && (nurb->flagu & CU_NURB_BEZIER)) {
|
||||
if (nurb->orderu == 3 && (nurb->flagu & CU_NURB_BEZIER)) {
|
||||
nurb->flagu |= CU_NURB_ENDPOINT;
|
||||
BKE_nurb_knot_calc_u(nurb);
|
||||
}
|
||||
|
||||
/* Previously other flags were ignored if CU_NURB_CYCLIC is set. */
|
||||
if (nurb->flagv & CU_NURB_CYCLIC) {
|
||||
nurb->flagv = CU_NURB_CYCLIC;
|
||||
}
|
||||
/* CU_NURB_BEZIER and CU_NURB_ENDPOINT were ignored if used together. */
|
||||
else if (nurb->flagv & CU_NURB_BEZIER && nurb->flagv & CU_NURB_ENDPOINT) {
|
||||
/* CU_NURB_BEZIER and CU_NURB_ENDPOINT were ignored if combined. */
|
||||
if (nurb->flagv & CU_NURB_BEZIER && nurb->flagv & CU_NURB_ENDPOINT) {
|
||||
nurb->flagv &= ~(CU_NURB_BEZIER | CU_NURB_ENDPOINT);
|
||||
BKE_nurb_knot_calc_v(nurb);
|
||||
}
|
||||
else if (nurb->flagv & CU_NURB_CYCLIC) {
|
||||
/* In 45d038181ae2 cyclic bezier support is added, but CU_NURB_ENDPOINT still ignored. */
|
||||
nurb->flagv = CU_NURB_CYCLIC | (nurb->flagv & CU_NURB_BEZIER);
|
||||
BKE_nurb_knot_calc_v(nurb);
|
||||
}
|
||||
/* Bezier NURBS of order 3 were clamped to first control point. */
|
||||
else if (nurb->orderv == 3 && (nurb->flagv & CU_NURB_BEZIER)) {
|
||||
if (nurb->orderv == 3 && (nurb->flagv & CU_NURB_BEZIER)) {
|
||||
nurb->flagv |= CU_NURB_ENDPOINT;
|
||||
BKE_nurb_knot_calc_v(nurb);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue