Welcome to mirror list, hosted at ThFree Co, Russian Federation.

git.blender.org/blender.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLaurynas Duburas <laurynas>2022-03-22 17:54:13 +0300
committerHans Goudey <h.goudey@me.com>2022-03-22 17:54:13 +0300
commit6bbc3b56108193ed383fcab1261360901c4c340a (patch)
tree1605841a0ce42db1bc7dab67210cd0dd721d97c5 /source/blender/blenkernel
parentb0aaf6ff4a9731e9142d8cf32ebcc1a01a4f5cc8 (diff)
Curve: Validation message split from nurb_check_valid
Split retrieval of translated text for the "invalid" messages for NURBS curves from the actual calculation, which is a lower-level function. Also fixes an issue where "At least two points required" would always display in the "Active Spline" panel. Differential Revision: https://developer.blender.org/D14315
Diffstat (limited to 'source/blender/blenkernel')
-rw-r--r--source/blender/blenkernel/BKE_curve.h2
-rw-r--r--source/blender/blenkernel/intern/curve.cc92
2 files changed, 70 insertions, 24 deletions
diff --git a/source/blender/blenkernel/BKE_curve.h b/source/blender/blenkernel/BKE_curve.h
index 394d97223e3..42897c59043 100644
--- a/source/blender/blenkernel/BKE_curve.h
+++ b/source/blender/blenkernel/BKE_curve.h
@@ -274,7 +274,7 @@ bool BKE_nurb_valid_message(int pnts,
short flag,
short type,
bool is_surf,
- const char *dir,
+ int dir,
char *message_dst,
size_t maxncpy);
diff --git a/source/blender/blenkernel/intern/curve.cc b/source/blender/blenkernel/intern/curve.cc
index 0b619c1a969..354ddd7d167 100644
--- a/source/blender/blenkernel/intern/curve.cc
+++ b/source/blender/blenkernel/intern/curve.cc
@@ -62,6 +62,14 @@ using blender::IndexRange;
/* local */
// static CLG_LogRef LOG = {"bke.curve"};
+enum class NURBSValidationStatus {
+ Valid,
+ AtLeastTwoPointsRequired,
+ MorePointsThanOrderRequired,
+ MoreRowsForBezierRequired,
+ MorePointsForBezierRequired
+};
+
static void curve_init_data(ID *id)
{
Curve *curve = (Curve *)id;
@@ -4700,56 +4708,94 @@ void BKE_curve_nurbs_key_vert_tilts_apply(ListBase *lb, const float *key)
}
}
-bool BKE_nurb_valid_message(const int pnts,
- const short order,
- const short flag,
- const short type,
- const bool is_surf,
- const char *dir,
- char *message_dst,
- const size_t maxncpy)
+static NURBSValidationStatus nurb_check_valid(const int pnts,
+ const short order,
+ const short flag,
+ const short type,
+ const bool is_surf,
+ int *r_points_needed)
{
- const char *msg_template = "";
- uint16_t points_needed = 0;
-
if (pnts <= 1) {
- msg_template = TIP_("At least two points required.");
+ return NURBSValidationStatus::AtLeastTwoPointsRequired;
}
else if (type == CU_NURBS) {
if (pnts < order) {
- msg_template = TIP_("Must have more control points than Order");
+ return NURBSValidationStatus::MorePointsThanOrderRequired;
}
else if (flag & CU_NURB_BEZIER) {
+ int points_needed = 0;
if (flag & CU_NURB_CYCLIC) {
- const uint16_t remainder = pnts % (order - 1);
+ const int remainder = pnts % (order - 1);
points_needed = remainder > 0 ? order - 1 - remainder : 0;
}
else if (((flag & CU_NURB_ENDPOINT) == 0) && pnts <= order) {
points_needed = order + 1 - pnts;
}
if (points_needed) {
- msg_template = is_surf ? TIP_("%d more %s row(s) needed for Bezier") :
- TIP_("%d more point(s) needed for Bezier");
+ *r_points_needed = points_needed;
+ return is_surf ? NURBSValidationStatus::MoreRowsForBezierRequired :
+ NURBSValidationStatus::MorePointsForBezierRequired;
}
}
}
+ return NURBSValidationStatus::Valid;
+}
+
+bool BKE_nurb_valid_message(const int pnts,
+ const short order,
+ const short flag,
+ const short type,
+ const bool is_surf,
+ const int dir,
+ char *message_dst,
+ const size_t maxncpy)
+{
+ int points_needed;
+ NURBSValidationStatus status = nurb_check_valid(
+ pnts, order, flag, type, is_surf, &points_needed);
- if (message_dst) {
- BLI_snprintf(message_dst, maxncpy, msg_template, points_needed, dir);
+ const char *msg_template = nullptr;
+ switch (status) {
+ case NURBSValidationStatus::Valid:
+ message_dst[0] = 0;
+ return false;
+ case NURBSValidationStatus::AtLeastTwoPointsRequired:
+ if (dir == 1) {
+ /* Exception made for curves as their pntsv == 1. */
+ message_dst[0] = 0;
+ return false;
+ }
+ msg_template = TIP_("At least two points required.");
+ break;
+ case NURBSValidationStatus::MorePointsThanOrderRequired:
+ msg_template = TIP_("Must have more control points than Order");
+ break;
+ case NURBSValidationStatus::MoreRowsForBezierRequired:
+ msg_template = TIP_("%d more %s row(s) needed for Bezier");
+ break;
+ case NURBSValidationStatus::MorePointsForBezierRequired:
+ msg_template = TIP_("%d more point(s) needed for Bezier");
+ break;
}
- return msg_template[0];
+
+ BLI_snprintf(message_dst, maxncpy, msg_template, points_needed, dir == 0 ? "U" : "V");
+ return true;
}
bool BKE_nurb_check_valid_u(const Nurb *nu)
{
- return !BKE_nurb_valid_message(
- nu->pntsu, nu->orderu, nu->flagu, nu->type, nu->pntsv > 1, "U", nullptr, 0);
+ int points_needed;
+ return NURBSValidationStatus::Valid ==
+ nurb_check_valid(
+ nu->pntsu, nu->orderu, nu->flagu, nu->type, nu->pntsv > 1, &points_needed);
}
bool BKE_nurb_check_valid_v(const Nurb *nu)
{
- return !BKE_nurb_valid_message(
- nu->pntsv, nu->orderv, nu->flagv, nu->type, nu->pntsv > 1, "V", nullptr, 0);
+ int points_needed;
+ return NURBSValidationStatus::Valid ==
+ nurb_check_valid(
+ nu->pntsv, nu->orderv, nu->flagv, nu->type, nu->pntsv > 1, &points_needed);
}
bool BKE_nurb_check_valid_uv(const Nurb *nu)