18#include "testing/testing.h"
70 std::unique_ptr<IOBJCurve> curve_wrapper(
new OBJCurves(curve, identity,
"test"));
122 const KnotsMode *expected_mode =
nullptr,
123 const bool *expected_cyclic =
nullptr)
127 std::string out_file_path = tempdir +
BLI_path_basename(
"io_obj/tmp_6f5273f4.obj");
131 ASSERT_TRUE(src_curve.
cyclic()[0] == cyclic);
137 ASSERT_TRUE(
result.size() == 1);
138 result_curve = &
result[0].get_curves()->geometry.wrap();
142 EXPECT_EQ(result_curve->
cyclic()[0], expected_cyclic ? *expected_cyclic : cyclic);
146 expected_points = expected_points.size() ? expected_points : points;
147 ASSERT_EQ(expected_points.size(), result_points.
size());
148 EXPECT_NEAR_ARRAY_ND(
149 expected_points.data(), result_points.
data(), expected_points.size(), 3, 1
e-4);
158 float3{2.0f, -2.0f, 4.0f},
159 float3{3.0f, -3.0f, 6.0f},
160 float3{4.0f, -4.0f, 8.0f},
161 float3{5.0f, -5.0f, 10.0f},
162 float3{6.0f, -6.0f, 12.0f},
163 float3{7.0f, -7.0f, 14.0f},
164 float3{1.0f / 4.0f, -2.0f, 3.0f / 6.0f},
165 float3{1.0f / 6.0f, -3.0f, 3.0f / 9.0f},
166 float3{1.0f / 8.0f, -4.0f, 3.0f / 12.0f},
167 float3{1.0f / 5.0f, -5.0f, 3.0f / 11.0f},
168 float3{1.0f / 3.0f, -6.0f, 3.0f / 10.0f},
169 float3{1.0f / 2.0f, -7.0f, 3.0f / 9.0f}};
178 const int8_t order = 2;
179 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_NORMAL;
180 const bool cyclic =
false;
183 const KnotsMode expected_mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT;
187 run_nurbs_test(positions, order, mode, cyclic, src,
result, positions, &expected_mode);
196 std::array<int, 7> expected_mult;
197 std::fill(expected_mult.begin(), expected_mult.end(), 1);
198 EXPECT_EQ_SPAN<int>(multiplicity, expected_mult);
203 const int8_t order = 6;
204 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_NORMAL;
209 run_nurbs_test(positions, order, mode,
false, src,
result);
214 const int8_t order = 2;
215 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT;
220 run_nurbs_test(positions, order, mode,
false, src,
result);
225 const int8_t order = 3;
226 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT;
231 run_nurbs_test(positions, order, mode,
false, src,
result);
236 const int8_t order = 6;
237 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_NORMAL;
242 run_nurbs_test(positions, order, mode,
false, src,
result);
247 const int8_t order = 2;
248 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_NORMAL;
251 const KnotsMode expected_mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT;
255 run_nurbs_test(positions, order, mode,
true, src,
result, positions, &expected_mode);
260 const int8_t order = 5;
261 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_NORMAL;
266 run_nurbs_test(positions, order, mode,
true, src,
result);
271 const int8_t order = 5;
272 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT;
277 run_nurbs_test(positions, order, mode,
true, src,
result);
288 const int8_t order = 3;
289 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
294 run_nurbs_test(positions, order, mode,
false, src,
result);
299 const int8_t order = 5;
300 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
305 run_nurbs_test(positions, order, mode,
false, src,
result);
310 const int8_t order = 3;
311 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
316 run_nurbs_test(positions, order, mode,
false, src,
result);
321 const int8_t order = 3;
322 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
327 run_nurbs_test(positions, order, mode,
false, src,
result, positions.
slice(0, 7));
332 const int8_t order = 5;
333 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
340 run_nurbs_test(positions, order, mode,
false, src,
result);
346 run_nurbs_test(positions.
slice(0, 9), order, mode,
false, src,
result);
354 run_nurbs_test(positions.
slice(0, 12), order, mode,
false, src,
result, positions.
slice(0, 9));
360 run_nurbs_test(positions.
slice(0, 11), order, mode,
false, src,
result, positions.
slice(0, 9));
366 run_nurbs_test(positions.
slice(0, 10), order, mode,
false, src,
result, positions.
slice(0, 9));
372 const int8_t order = 5;
373 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
378 run_nurbs_test(positions.
slice(0, 12), order, mode,
true, src,
result);
383 const int8_t order = 5;
384 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
389 run_nurbs_test(positions, order, mode,
true, src,
result);
394 const int8_t order = 5;
395 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
399 expected.
append(positions[0]);
400 const bool expect_cyclic =
false;
401 const KnotsMode expect_mode = KnotsMode::NURBS_KNOT_MODE_CUSTOM;
407 positions, order, mode,
true, src,
result, expected, &expect_mode, &expect_cyclic);
412 const int8_t order = 5;
413 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
417 expected.
append(positions[0]);
418 const bool expect_cyclic =
false;
419 const KnotsMode expect_mode = KnotsMode::NURBS_KNOT_MODE_CUSTOM;
425 positions, order, mode,
true, src,
result, expected, &expect_mode, &expect_cyclic);
430 const int8_t order = 5;
431 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
435 expected.
append(positions[0]);
436 const bool expect_cyclic =
false;
437 const KnotsMode expect_mode = KnotsMode::NURBS_KNOT_MODE_CUSTOM;
443 positions, order, mode,
true, src,
result, expected, &expect_mode, &expect_cyclic);
448 const int8_t order = 5;
449 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
453 expected.
append(positions[0]);
454 const bool expect_cyclic =
false;
455 const KnotsMode expect_mode = KnotsMode::NURBS_KNOT_MODE_CUSTOM;
461 positions, order, mode,
true, src,
result, expected, &expect_mode, &expect_cyclic);
472 const int8_t order = 5;
473 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_BEZIER;
480 const KnotsMode expect_mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
484 run_nurbs_test(positions, order, mode,
true, src,
result, expected, &expect_mode);
489 const int8_t order = 5;
490 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_BEZIER;
496 expected.
last() = positions[1];
498 const bool expect_cyclic =
false;
499 const KnotsMode expect_mode = KnotsMode::NURBS_KNOT_MODE_CUSTOM;
504 positions, order, mode,
true, src,
result, expected, &expect_mode, &expect_cyclic);
509 const int8_t order = 5;
510 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_BEZIER;
516 expected.
last() = positions[1];
518 const bool expect_cyclic =
false;
519 const KnotsMode expect_mode = KnotsMode::NURBS_KNOT_MODE_CUSTOM;
524 positions, order, mode,
true, src,
result, expected, &expect_mode, &expect_cyclic);
529 const int8_t order = 5;
530 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_BEZIER;
536 expected.
last() = positions[1];
538 const bool expect_cyclic =
false;
539 const KnotsMode expect_mode = KnotsMode::NURBS_KNOT_MODE_CUSTOM;
544 positions, order, mode,
true, src,
result, expected, &expect_mode, &expect_cyclic);
549 const int8_t order = 5;
550 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_BEZIER;
556 expected.
last() = positions[1];
558 const bool expect_cyclic =
false;
559 const KnotsMode expect_mode = KnotsMode::NURBS_KNOT_MODE_CUSTOM;
564 positions, order, mode,
true, src,
result, expected, &expect_mode, &expect_cyclic);
569 const int8_t order = 5;
570 const KnotsMode mode = KnotsMode::NURBS_KNOT_MODE_BEZIER;
577 const KnotsMode expect_mode = KnotsMode::NURBS_KNOT_MODE_ENDPOINT_BEZIER;
581 run_nurbs_test(positions, order, mode,
true, src,
result, expected, &expect_mode);
void BKE_tempdir_init(const char *userdir)
const char * BKE_tempdir_base() ATTR_WARN_UNUSED_RESULT ATTR_RETURNS_NONNULL
Low-level operations for curves.
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void void void const char * BLI_path_basename(const char *path) ATTR_NONNULL(1) ATTR_WARN_UNUSED_RESULT
char * STRNCPY(char(&dst)[N], const char *src)
ATTR_WARN_UNUSED_RESULT const BMVert const BMEdge * e
constexpr void fill(const T &value) const
constexpr void copy_from(Span< T > values) const
constexpr Span slice(int64_t start, int64_t size) const
constexpr const T * data() const
constexpr const T & first() const
constexpr int64_t size() const
void append(const T &value)
const T & last(const int64_t n=0) const
MutableSpan< T > as_mutable_span()
MutableSpan< float3 > positions_for_write()
MutableSpan< int8_t > nurbs_knots_modes_for_write()
MutableSpan< int8_t > nurbs_orders_for_write()
VArray< int8_t > nurbs_knots_modes() const
Span< float3 > positions() const
MutableSpan< float > nurbs_weights_for_write()
MutableSpan< int > offsets_for_write()
VArray< bool > cyclic() const
MutableSpan< bool > cyclic_for_write()
VArray< int8_t > nurbs_orders() const
Vector< bke::GeometrySet > read_curves(OBJImportParams params)
static bke::CurvesGeometry create_rational_nurbs(Span< float3 > points, Span< float > weights, bool cyclic, int8_t order, KnotsMode mode)
static bke::CurvesGeometry create_nurbs(Span< float3 > points, bool cyclic, int8_t order, KnotsMode mode)
void write_curves(const bke::CurvesGeometry &curve, OBJExportParams params)
static void SetUpTestSuite()
void write_curves(const std::unique_ptr< IOBJCurve > &curve, OBJExportParams params)
void write_curves(const Span< std::unique_ptr< IOBJCurve > > curves, OBJExportParams params)
static bke::CurvesGeometry create_curves(Span< float3 > points, bool cyclic)
void run_nurbs_test(const Span< float3 > points, const int8_t order, const KnotsMode mode, const bool cyclic, bke::CurvesGeometry &src_curve, const bke::CurvesGeometry *&result_curve, Span< float3 > expected_points=Span< float3 >(), const KnotsMode *expected_mode=nullptr, const bool *expected_cyclic=nullptr)
static void TearDownTestSuite()
void copy(const GVArray &src, GMutableSpan dst, int64_t grain_size=4096)
Vector< int > calculate_multiplicity_sequence(Span< float > knots)
void calculate_knots(int points_num, KnotsMode mode, int8_t order, bool cyclic, MutableSpan< float > knots)
int knots_num(int points_num, int8_t order, bool cyclic)
void export_objects(const OBJExportParams &export_params, const Span< std::unique_ptr< OBJMesh > > meshes, const Span< std::unique_ptr< IOBJCurve > > curves, const char *filepath)
static OBJImportParams default_import_params(const std::string &filepath)
static OBJExportParams default_export_params(const std::string &filepath)
TEST_F(OBJExportTest, filter_objects_curves_as_mesh)
const std::array< float3, 13 > position_array
const Span< float3 > position_data
void importer_geometry(const OBJImportParams &import_params, Vector< bke::GeometrySet > &geometries, size_t read_buffer_size)
MatBase< float, 4, 4 > float4x4
VecBase< float, 3 > float3
static MatBase identity()