3 #include <gtest/gtest.h>
5 #include "testing/testing.h"
51 int expect_image_count = 0)
62 params.validate_meshes =
true;
63 params.import_vertex_groups =
false;
64 params.relative_paths =
true;
65 params.clear_selection =
true;
67 std::string obj_path = blender::tests::flags_test_asset_dir() +
"/io_tests/obj/" + path;
69 const size_t read_buffer_size = 650;
78 size_t object_index = 0;
80 if (object_index >= expect_count) {
85 ASSERT_STREQ(object->id.name,
exp.name.c_str());
87 EXPECT_V3_NEAR(object->loc,
float3(0, 0, 0), 0.0001f);
88 if (strcmp(object->id.name,
"OBCube") != 0) {
89 EXPECT_V3_NEAR(object->rot,
float3(
M_PI_2, 0, 0), 0.0001f);
91 EXPECT_V3_NEAR(object->scale,
float3(1, 1, 1), 0.0001f);
101 float3 normal_first = lnors !=
nullptr ? lnors[0] :
float3(0, 0, 0);
102 EXPECT_V3_NEAR(normal_first,
exp.normal_first, 0.0001f);
106 EXPECT_V2_NEAR(uv_first,
exp.uv_first, 0.0001f);
107 if (
exp.color_first.
x >= 0) {
110 EXPECT_TRUE(colors !=
nullptr);
111 EXPECT_V4_NEAR(colors[0],
exp.color_first, 0.0001f);
122 EXPECT_V3_NEAR(vertexCos[0],
exp.vert_first, 0.0001f);
123 EXPECT_V3_NEAR(vertexCos[numVerts - 1],
exp.vert_last, 0.0001f);
143 EXPECT_EQ(ima_count, expect_image_count);
150 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
159 float3(-0.57735f, 0.57735f, -0.57735f)},
161 import_and_check(
"cube.obj", expect,
std::size(expect), 1);
167 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
188 float3(-0.2357f, 0.9428f, 0.2357f),
191 import_and_check(
"cube_o_after_verts.obj", expect,
std::size(expect), 2);
197 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
204 float3(-0.4375f, 0.164062f, 0.765625f),
205 float3(0.4375f, 0.164062f, 0.765625f),
206 float3(-0.6040f, -0.5102f, 0.6122f),
207 float2(0.692094f, 0.40191f)},
209 import_and_check(
"suzanne_all_data.obj", expect,
std::size(expect), 0);
215 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
222 float3(0.260472f, -1.477212f, -0.866025f),
223 float3(-1.5f, 2.598076f, 0)},
225 import_and_check(
"nurbs.obj", expect,
std::size(expect), 0);
231 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
232 {
"OBCurveDeg3",
OB_CURVES_LEGACY, 4, 0, 3, 0,
float3(10, -2, 0),
float3(6, -2, 0)},
233 {
"OBnurbs_curves",
OB_CURVES_LEGACY, 4, 0, 4, 0,
float3(2, -2, 0),
float3(-2, -2, 0)},
234 {
"OBNurbsCurveCyclic",
OB_CURVES_LEGACY, 7, 0, 4, 1,
float3(-2, -2, 0),
float3(-6, 2, 0)},
235 {
"OBNurbsCurveDiffWeights",
243 {
"OBNurbsCurveEndpoint",
252 import_and_check(
"nurbs_curves.obj", expect,
std::size(expect), 0);
258 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
265 float3(2.591002f, 0, -0.794829f),
266 float3(3.280729f, 0, 3.043217f)},
268 import_and_check(
"nurbs_cyclic.obj", expect,
std::size(expect), 0);
274 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
275 {
"OBCurve_Cyclic",
OB_CURVES_LEGACY, 7, 0, 4, 1,
float3(-2, 0, 2),
float3(2, 0, -2)},
276 {
"OBCurve_Endpoints",
OB_CURVES_LEGACY, 5, 1, 4, 0,
float3(-2, 0, 2),
float3(-2, 0, 2)},
277 {
"OBCurve_NonUniform_Parm",
285 {
"OBCurve_Uniform_Parm",
OB_CURVES_LEGACY, 5, 0, 4, 0,
float3(-2, 0, 2),
float3(-2, 0, 2)},
287 import_and_check(
"nurbs_manual.obj", expect,
std::size(expect), 0);
293 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
300 float3(0.438725f, 1.070313f, 0.433013f),
301 float3(0.625557f, 1.040691f, 0.460328f)},
303 import_and_check(
"nurbs_mesh.obj", expect,
std::size(expect), 0);
309 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
310 {
"OBmaterials",
OB_MESH, 8, 12, 6, 24,
float3(-1, -1, 1),
float3(1, -1, -1)},
312 import_and_check(
"materials.obj", expect,
std::size(expect), 4, 8);
318 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
328 float2(0.9935f, 0.0020f)},
338 float2(0.9935f, 0.0020f)},
348 float2(0.9935f, 0.0020f)},
349 {
"OBCubeTiledTexFromAnotherFolder",
358 float2(0.9935f, 0.0020f)},
360 import_and_check(
"cubes_with_textures_rel.obj", expect,
std::size(expect), 4, 4);
366 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
367 {
"OBFaceAllVerts_BecomesOneOverlappingFaceUsingAllVerts",
375 {
"OBFaceAllVertsDup_BecomesOneOverlappingFaceUsingAllVerts",
383 {
"OBFaceJustTwoVerts_IsSkipped",
OB_MESH, 2, 0, 0, 0,
float3(8, 0, 3),
float3(8, 0, 7)},
384 {
"OBFaceQuadDupSomeVerts_BecomesOneQuadUsing4Verts",
392 {
"OBFaceTriDupVert_Becomes1Tri",
OB_MESH, 3, 3, 1, 3,
float3(-2, 0, 3),
float3(2, 0, 7)},
393 {
"OBFaceWithHole_BecomesTwoFacesFormingAHole",
402 import_and_check(
"faces_invalid_or_with_holes.obj", expect,
std::size(expect), 0);
408 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
420 import_and_check(
"invalid_indices.obj", expect,
std::size(expect), 0);
426 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
427 {
"OBObjectWithAReallyLongNameToCheckHowImportHandlesNamesThatAreLon",
438 import_and_check(
"invalid_syntax.obj", expect,
std::size(expect), 0);
444 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
446 {
"OBBezierCurve",
OB_MESH, 13, 12, 0, 0,
float3(-1, -2, 0),
float3(1, -2, 0)},
447 {
"OBBlankCube",
OB_MESH, 8, 13, 7, 26,
float3(1, 1, -1),
float3(-1, 1, 1),
float3(0, 0, 1)},
463 float3(3.292893f, -2.707107f, 0),
464 float3(3.369084f, -2.77607f, 0)},
465 {
"OBNurbsCircle.001",
OB_MESH, 4, 4, 0, 0,
float3(2, -3, 0),
float3(3, -2, 0)},
483 float3(-0.4082f, -0.4082f, 0.8165f)},
492 float3(0.5774f, 0.5773f, 0.5774f)},
499 float3(7.292893f, -2.707107f, -1),
500 float3(7.525872f, -2.883338f, 1),
501 float3(-0.7071f, -0.7071f, 0),
509 float3(12.5f, -2.5f, 0.694444f),
510 float3(13.5f, -1.5f, 0.694444f),
511 float3(-0.3246f, -0.3531f, 0.8775f),
521 float3(-0.0541f, -0.0541f, -0.9971f),
529 float3(5.34467f, -2.65533f, -0.176777f),
530 float3(5.232792f, -2.411795f, -0.220835f),
531 float3(-0.5042f, -0.5042f, -0.7011f),
539 float3(24.444445f, 0.502543f, -0.753814f),
540 float3(23.790743f, 0.460522f, -0.766546f),
541 float3(-0.0546f, 0.1716f, 0.9837f)},
548 float3(1.75f, -9.458f, 0),
549 float3(0.587f, -9.406f, 0),
561 float2(0.654526f, 0.579873f)},
571 float2(0.654526f, 0.579873f)},
582 float4(0.0f, 0.002125f, 1.0f, 1.0f)},
593 import_and_check(
"all_objects.obj", expect,
std::size(expect), 7);
599 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
606 float3(1.0f, 1.0f, -3.812445f),
607 float3(-1.0f, -1.0f, -1.812445f),
610 float4(0.89627f, 0.036889f, 0.47932f, 1.0f)},
611 {
"OBCubeCornerFloat",
617 float3(3.481967f, 1.0f, -3.812445f),
618 float3(1.481967f, -1.0f, -1.812445f),
621 float4(1.564582f, 0.039217f, 0.664309f, 1.0f)},
622 {
"OBCubeMultiColorAttribs",
628 float3(-4.725068f, -1.0f, 1.0f),
629 float3(-2.725068f, 1.0f, -1.0f),
632 float4(0.270498f, 0.47932f, 0.262251f, 1.0f)},
639 float3(-4.550208f, -1.0f, -1.918042f),
640 float3(-2.550208f, 1.0f, -3.918042f)},
647 float3(1.0f, 1.0f, -1.0f),
648 float3(-1.0f, -1.0f, 1.0f),
651 float4(0.846873f, 0.027321f, 0.982123f, 1.0f)},
652 {
"OBCubeVertexFloat",
658 float3(3.392028f, 1.0f, -1.0f),
659 float3(1.392028f, -1.0f, 1.0f),
662 float4(49.99467f, 0.027321f, 0.982123f, 1.0f)},
664 import_and_check(
"cubes_vertex_colors.obj", expect,
std::size(expect), 0);
670 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
681 float4(0.8714f, 0.6308f, 0.5271f, 1.0f)},
692 float4(0.6038f, 0.3185f, 0.1329f, 1.0f)},
703 float4(1.0f, 0.0f, 0.0f, 1.0f)},
715 import_and_check(
"cubes_vertex_colors_mrgb.obj", expect,
std::size(expect), 0);
721 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
723 {
"OBCube.001",
OB_MESH, 8, 0, 0, 0,
float3(1, 1, -1),
float3(-1, 1, 1)},
725 import_and_check(
"vertices.obj", expect,
std::size(expect), 0);
typedef float(TangentPoint)[2]
float(* BKE_curve_nurbs_vert_coords_alloc(const struct ListBase *lb, int *r_vert_len))[3]
CustomData interface, see also DNA_customdata_types.h.
bool CustomData_has_layer(const struct CustomData *data, int type)
void * CustomData_get_layer(const struct CustomData *data, int type)
General operations, lookup, etc. for blender objects.
struct Mesh * BKE_object_get_evaluated_mesh(const struct Object *object)
EXPECT_EQ(BLI_expr_pylike_eval(expr, nullptr, 0, &result), EXPR_PYLIKE_INVALID)
void * BLI_findlink(const struct ListBase *listbase, int number) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
int BLI_listbase_count(const struct ListBase *listbase) ATTR_WARN_UNUSED_RESULT ATTR_NONNULL(1)
external readfile function prototypes.
#define DEG_OBJECT_ITER_END
#define DEG_OBJECT_ITER_BEGIN(graph_, instance_, flag_)
@ DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY
@ DEG_ITER_OBJECT_FLAG_VISIBLE
@ DEG_ITER_OBJECT_FLAG_DUPLI
@ DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET
struct Object * DEG_get_evaluated_object(const struct Depsgraph *depsgraph, struct Object *object)
Read Guarded memory(de)allocation.
static DBVT_INLINE btScalar size(const btDbvtVolume &a)
virtual void depsgraph_create(eEvaluationMode depsgraph_evaluation_mode)
bool blendfile_load(const char *filepath)
struct Depsgraph * depsgraph
struct BlendFileData * bfile
void import_and_check(const char *path, const Expectation *expect, size_t expect_count, int expect_mat_count, int expect_image_count=0)
void(* MEM_freeN)(void *vmemh)
ccl_device_inline float3 exp(float3 v)
TEST_F(obj_exporter_test, filter_objects_curves_as_mesh)
void importer_main(bContext *C, const OBJImportParams &import_params)
vec_base< float, 3 > float3
vec_base< float, 4 > float4
vec_base< float, 2 > float2
struct ViewLayer * cur_view_layer
int mesh_totpoly_or_curve_order
int mesh_totedge_or_curve_endp
int mesh_totloop_or_curve_cyclic