5#include <gtest/gtest.h>
7#include "testing/testing.h"
71 int expect_image_count = 0)
78 std::string obj_path = blender::tests::flags_test_asset_dir() +
81 const size_t read_buffer_size = 650;
92 constexpr bool print_result_scene =
false;
93 if (print_result_scene) {
96 printf(
" {\"%s\", ", object->id.name);
100 printf(
"OB_MESH, %i, %i, %i, %i, float3(%g, %g, %g), float3(%g, %g, %g)",
117 size_t object_index = 0;
119 if (object_index >= expect_count) {
124 ASSERT_STREQ(object->id.name,
exp.name.c_str());
126 EXPECT_V3_NEAR(object->loc,
float3(0, 0, 0), 0.0001f);
127 if (!
STREQ(object->id.name,
"OBCube")) {
128 EXPECT_V3_NEAR(object->rot,
float3(
M_PI_2, 0, 0), 0.0001f);
130 EXPECT_V3_NEAR(object->scale,
float3(1, 1, 1), 0.0001f);
134 EXPECT_EQ(mesh->edges_num,
exp.mesh_edges_num_or_curve_endp);
135 EXPECT_EQ(mesh->faces_num,
exp.mesh_faces_num_or_curve_order);
136 EXPECT_EQ(mesh->corners_num,
exp.mesh_corner_num_or_curve_cyclic);
138 EXPECT_V3_NEAR(positions.first(),
exp.vert_first, 0.0001f);
139 EXPECT_V3_NEAR(positions.last(),
exp.vert_last, 0.0001f);
141 mesh->corner_normals().data() :
143 float3 normal_first = corner_normals !=
nullptr ? corner_normals[0] :
float3(0, 0, 0);
144 EXPECT_V3_NEAR(normal_first,
exp.normal_first, 0.0001f);
148 EXPECT_V2_NEAR(uv_first,
exp.uv_first, 0.0001f);
149 if (
exp.color_first.
x >= 0) {
152 EXPECT_TRUE(colors !=
nullptr);
153 EXPECT_V4_NEAR(colors[0],
exp.color_first, 0.0001f);
164 EXPECT_V3_NEAR(vertexCos[0],
exp.vert_first, 0.0001f);
165 EXPECT_V3_NEAR(vertexCos[numVerts - 1],
exp.vert_last, 0.0001f);
175 if (!
exp.first_mat.empty()) {
177 ASSERT_STREQ(mat ? mat->
id.
name :
"<null>",
exp.first_mat.c_str());
189 EXPECT_EQ(ima_count, expect_image_count);
198 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
207 float3(-0.57758f, 0.57735f, -0.57711f)},
209 import_and_check(
"cube.obj", expect, std::size(expect), 1);
215 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
225 float3(0.57735f, -0.57735f, 0.57735f),
236 float3(-0.2357f, 0.9428f, 0.2357f),
239 import_and_check(
"cube_o_after_verts.obj", expect, std::size(expect), 2);
245 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
252 float3(-0.4375f, 0.164062f, 0.765625f),
253 float3(0.4375f, 0.164062f, 0.765625f),
254 float3(-0.6040f, -0.5102f, 0.6122f),
255 float2(0.692094f, 0.40191f)},
257 import_and_check(
"suzanne_all_data.obj", expect, std::size(expect), 0);
263 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
270 float3(0.260472f, -1.477212f, -0.866025f),
271 float3(-1.5f, 2.598076f, 0)},
273 import_and_check(
"nurbs.obj", expect, std::size(expect), 0);
279 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
280 {
"OBCurveDeg3",
OB_CURVES_LEGACY, 4, 0, 3, 0,
float3(10, -2, 0),
float3(6, -2, 0)},
281 {
"OBnurbs_curves",
OB_CURVES_LEGACY, 4, 0, 4, 0,
float3(2, -2, 0),
float3(-2, -2, 0)},
282 {
"OBNurbsCurveCyclic",
OB_CURVES_LEGACY, 7, 0, 4, 1,
float3(-2, -2, 0),
float3(-6, 2, 0)},
283 {
"OBNurbsCurveDiffWeights",
291 {
"OBNurbsCurveEndpoint",
300 import_and_check(
"nurbs_curves.obj", expect, std::size(expect), 0);
306 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
313 float3(2.591002f, 0, -0.794829f),
314 float3(3.280729f, 0, 3.043217f)},
316 import_and_check(
"nurbs_cyclic.obj", expect, std::size(expect), 0);
322 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
323 {
"OBCurveEndpointRange01",
330 float3(22.17f, 0, -5.31f)},
331 {
"OBCurveEndpointRangeNon01",
338 float3(22.17f, 0, -5.31f)},
339 {
"OBCurveNoEndpointRange01",
346 float3(22.17f, 0, -5.31f)},
348 import_and_check(
"nurbs_endpoint.obj", expect, std::size(expect), 0);
354 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
355 {
"OBCurve_Cyclic",
OB_CURVES_LEGACY, 7, 0, 4, 1,
float3(-2, 0, 2),
float3(2, 0, -2)},
356 {
"OBCurve_Endpoints",
OB_CURVES_LEGACY, 5, 1, 4, 0,
float3(-2, 0, 2),
float3(-2, 0, 2)},
357 {
"OBCurve_NonUniform_Parm",
365 {
"OBCurve_Uniform_Parm",
OB_CURVES_LEGACY, 5, 0, 4, 0,
float3(-2, 0, 2),
float3(-2, 0, 2)},
367 import_and_check(
"nurbs_manual.obj", expect, std::size(expect), 0);
373 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
380 float3(0.438725f, 1.070313f, 0.433013f),
381 float3(0.625557f, 1.040691f, 0.460328f)},
383 import_and_check(
"nurbs_mesh.obj", expect, std::size(expect), 0);
389 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
401 "MAno_textures_red"},
413 "MAno_textures_red"},
427 import_and_check(
"materials.obj", expect, std::size(expect), 4, 8);
433 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
445 "MAMat_BaseRoughEmissNormal10"},
470 {
"OBCubeTiledTexFromAnotherFolder",
481 "MAMat_EmissTiledAnotherFolder"},
483 import_and_check(
"cubes_with_textures_rel.obj", expect, std::size(expect), 4, 4);
489 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
490 {
"OBFaceAllVerts_BecomesOneOverlappingFaceUsingAllVerts",
498 {
"OBFaceAllVertsDup_BecomesOneOverlappingFaceUsingAllVerts",
506 {
"OBFaceJustTwoVerts_IsSkipped",
OB_MESH, 2, 0, 0, 0,
float3(8, 0, 3),
float3(8, 0, 7)},
507 {
"OBFaceQuadDupSomeVerts_BecomesOneQuadUsing4Verts",
515 {
"OBFaceTriDupVert_Becomes1Tri",
OB_MESH, 3, 3, 1, 3,
float3(-2, 0, 3),
float3(2, 0, 7)},
516 {
"OBFaceWithHole_BecomesTwoFacesFormingAHole",
525 import_and_check(
"faces_invalid_or_with_holes.obj", expect, std::size(expect), 0);
531 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
532 {
"OBTheMesh",
OB_MESH, 5, 3, 1, 3,
float3(-2, 0, -2),
float3(0, 2, 0)},
534 import_and_check(
"invalid_faces.obj", expect, std::size(expect), 0);
540 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
552 import_and_check(
"invalid_indices.obj", expect, std::size(expect), 0);
558 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
559 {
"OBObjectWithAReallyLongNameToCheckHowImportHandlesNamesThatAreLon",
570 import_and_check(
"invalid_syntax.obj", expect, std::size(expect), 0);
576 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
578 {
"OBBezierCurve",
OB_MESH, 13, 12, 0, 0,
float3(-1, -2, 0),
float3(1, -2, 0)},
579 {
"OBBlankCube",
OB_MESH, 8, 13, 7, 26,
float3(1, 1, -1),
float3(-1, 1, 1),
float3(0, 0, 1)},
598 float3(3.292893f, -2.707107f, 0),
599 float3(3.369084f, -2.77607f, 0)},
600 {
"OBNurbsCircle.001",
OB_MESH, 4, 4, 0, 0,
float3(2, -3, 0),
float3(3, -2, 0)},
618 float3(-0.4082f, -0.4082f, 0.8165f)},
627 float3(0.5774f, 0.5773f, 0.5774f),
637 float3(7.292893f, -2.707107f, -1),
638 float3(7.525872f, -2.883338f, 1),
639 float3(-0.7071f, -0.7071f, 0),
647 float3(12.5f, -2.5f, 0.694444f),
648 float3(13.5f, -1.5f, 0.694444f),
649 float3(-0.3246f, -0.3531f, 0.8775f),
659 float3(-0.0541f, -0.0541f, -0.9971f),
667 float3(5.34467f, -2.65533f, -0.176777f),
668 float3(5.232792f, -2.411795f, -0.220835f),
669 float3(-0.5042f, -0.5042f, -0.7011f),
677 float3(24.444445f, 0.502543f, -0.753814f),
678 float3(23.790743f, 0.460522f, -0.766546f),
679 float3(-0.0546f, 0.1716f, 0.9837f)},
686 float3(1.75f, -9.458f, 0),
687 float3(0.587f, -9.406f, 0),
699 float2(0.654526f, 0.579873f)},
709 float2(0.654526f, 0.579873f)},
720 float4(0.0f, 0.002125f, 1.0f, 1.0f)},
731 import_and_check(
"all_objects.obj", expect, std::size(expect), 7);
737 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
744 float3(1.0f, 1.0f, -3.812445f),
745 float3(-1.0f, -1.0f, -1.812445f),
748 float4(0.89627f, 0.036889f, 0.47932f, 1.0f)},
749 {
"OBCubeCornerFloat",
755 float3(3.481967f, 1.0f, -3.812445f),
756 float3(1.481967f, -1.0f, -1.812445f),
759 float4(1.564582f, 0.039217f, 0.664309f, 1.0f)},
760 {
"OBCubeMultiColorAttribs",
766 float3(-4.725068f, -1.0f, 1.0f),
767 float3(-2.725068f, 1.0f, -1.0f),
770 float4(0.270498f, 0.47932f, 0.262251f, 1.0f)},
777 float3(-4.550208f, -1.0f, -1.918042f),
778 float3(-2.550208f, 1.0f, -3.918042f)},
785 float3(1.0f, 1.0f, -1.0f),
786 float3(-1.0f, -1.0f, 1.0f),
789 float4(0.846873f, 0.027321f, 0.982123f, 1.0f)},
790 {
"OBCubeVertexFloat",
796 float3(3.392028f, 1.0f, -1.0f),
797 float3(1.392028f, -1.0f, 1.0f),
800 float4(49.99467f, 0.027321f, 0.982123f, 1.0f)},
802 import_and_check(
"cubes_vertex_colors.obj", expect, std::size(expect), 0);
808 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
819 float4(0.8714f, 0.6308f, 0.5271f, 1.0f)},
830 float4(0.6038f, 0.3185f, 0.1329f, 1.0f)},
841 float4(1.0f, 0.0f, 0.0f, 1.0f)},
853 import_and_check(
"cubes_vertex_colors_mrgb.obj", expect, std::size(expect), 0);
859 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
883 import_and_check(
"vertex_colors_non_contiguous.obj", expect, std::size(expect), 0);
889 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
891 {
"OBCube.001",
OB_MESH, 8, 0, 0, 0,
float3(1, 1, -1),
float3(-1, 1, 1)},
893 import_and_check(
"vertices.obj", expect, std::size(expect), 0);
900 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
901 {
"OBBox",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, -1, 1)},
902 {
"OBPyramid",
OB_MESH, 5, 8, 5, 16,
float3(3, 1, -1),
float3(4, 0, 2)},
904 import_and_check(
"split_options.obj", expect, std::size(expect), 0);
909 params.use_split_objects =
false;
910 params.use_split_groups =
true;
912 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
913 {
"OBBoxOne",
OB_MESH, 4, 4, 1, 4,
float3(1, -1, -1),
float3(-1, -1, 1)},
914 {
"OBBoxTwo",
OB_MESH, 6, 7, 2, 8,
float3(1, 1, 1),
float3(-1, -1, 1)},
915 {
"OBBoxTwo.001",
OB_MESH, 6, 7, 2, 8,
float3(1, 1, -1),
float3(-1, -1, -1)},
916 {
"OBPyrBottom",
OB_MESH, 4, 4, 1, 4,
float3(3, 1, -1),
float3(3, -1, -1)},
917 {
"OBPyrSides",
OB_MESH, 5, 8, 4, 12,
float3(3, 1, -1),
float3(4, 0, 2)},
918 {
"OBsplit_options",
OB_MESH, 4, 4, 1, 4,
float3(1, 1, -1),
float3(-1, 1, 1)},
920 import_and_check(
"split_options.obj", expect, std::size(expect), 0);
925 params.use_split_objects =
true;
926 params.use_split_groups =
true;
928 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
929 {
"OBBox",
OB_MESH, 4, 4, 1, 4,
float3(1, 1, -1),
float3(-1, 1, 1)},
930 {
"OBBoxOne",
OB_MESH, 4, 4, 1, 4,
float3(1, -1, -1),
float3(-1, -1, 1)},
931 {
"OBBoxTwo",
OB_MESH, 6, 7, 2, 8,
float3(1, 1, 1),
float3(-1, -1, 1)},
932 {
"OBBoxTwo.001",
OB_MESH, 6, 7, 2, 8,
float3(1, 1, -1),
float3(-1, -1, -1)},
933 {
"OBPyrBottom",
OB_MESH, 4, 4, 1, 4,
float3(3, 1, -1),
float3(3, -1, -1)},
934 {
"OBPyrSides",
OB_MESH, 5, 8, 4, 12,
float3(3, 1, -1),
float3(4, 0, 2)},
936 import_and_check(
"split_options.obj", expect, std::size(expect), 0);
941 params.use_split_objects =
false;
942 params.use_split_groups =
false;
944 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
945 {
"OBsplit_options",
OB_MESH, 13, 20, 11, 40,
float3(1, 1, -1),
float3(4, 0, 2)},
947 import_and_check(
"split_options.obj", expect, std::size(expect), 0);
953 {
"OBCube",
OB_MESH, 8, 12, 6, 24,
float3(1, 1, -1),
float3(-1, 1, 1)},
954 {
"OBpolylines",
OB_MESH, 13, 8, 0, 0,
float3(1, 0, 0),
float3(.7, .7, 2)},
956 import_and_check(
"polylines.obj", expect, std::size(expect), 0);
float(* BKE_curve_nurbs_vert_coords_alloc(const ListBase *lb, int *r_vert_len))[3]
CustomData interface, see also DNA_customdata_types.h.
const void * CustomData_get_layer(const CustomData *data, eCustomDataType type)
bool CustomData_has_layer(const CustomData *data, eCustomDataType type)
General operations, lookup, etc. for materials.
struct Material * BKE_object_material_get(struct Object *ob, short act)
General operations, lookup, etc. for blender objects.
Mesh * BKE_object_get_evaluated_mesh(const Object *object_eval)
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)
#define STRNCPY(dst, src)
external readfile function prototypes.
#define DEG_OBJECT_ITER_BEGIN(settings_, instance_)
#define DEG_OBJECT_ITER_END
Object * DEG_get_evaluated_object(const Depsgraph *depsgraph, Object *object)
@ DEG_ITER_OBJECT_FLAG_LINKED_DIRECTLY
@ DEG_ITER_OBJECT_FLAG_VISIBLE
@ DEG_ITER_OBJECT_FLAG_DUPLI
@ DEG_ITER_OBJECT_FLAG_LINKED_VIA_SET
Read Guarded memory(de)allocation.
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)
draw_view in_light_buf[] float
void MEM_freeN(void *vmemh)
ccl_device_inline float3 exp(float3 v)
TEST_F(OBJExportTest, filter_objects_curves_as_mesh)
void importer_main(bContext *C, const OBJImportParams &import_params)
VecBase< float, 4 > float4
VecBase< float, 2 > float2
VecBase< float, 3 > float3
ViewLayer * cur_view_layer
bool import_vertex_groups
int mesh_edges_num_or_curve_endp
int mesh_faces_num_or_curve_order
int mesh_corner_num_or_curve_cyclic