Files
coven/modules/ufbx/test/test_convert.h

1129 lines
38 KiB
C

#undef UFBXT_TEST_GROUP
#define UFBXT_TEST_GROUP "convert"
#if UFBXT_IMPL
ufbx_load_opts ufbxt_geometry_transform_helper_opts()
{
ufbx_load_opts opts = { 0 };
opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES;
return opts;
}
ufbx_load_opts ufbxt_geometry_transform_modify_opts()
{
ufbx_load_opts opts = { 0 };
opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY;
return opts;
}
ufbx_load_opts ufbxt_geometry_transform_modify_no_fallback_opts()
{
ufbx_load_opts opts = { 0 };
opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_MODIFY_GEOMETRY_NO_FALLBACK;
return opts;
}
ufbx_load_opts ufbxt_geometry_transform_helper_name_opts()
{
ufbx_load_opts opts = { 0 };
opts.geometry_transform_handling = UFBX_GEOMETRY_TRANSFORM_HANDLING_HELPER_NODES;
opts.geometry_transform_helper_name.data = "(ufbxt helper)";
opts.geometry_transform_helper_name.length = SIZE_MAX;
return opts;
}
ufbx_load_opts ufbxt_y_up_meters_root_opts()
{
ufbx_load_opts opts = { 0 };
opts.target_axes = ufbx_axes_right_handed_y_up;
opts.target_unit_meters = 1.0f;
opts.space_conversion = UFBX_SPACE_CONVERSION_TRANSFORM_ROOT;
return opts;
}
ufbx_load_opts ufbxt_y_up_meters_adjust_opts()
{
ufbx_load_opts opts = { 0 };
opts.target_axes = ufbx_axes_right_handed_y_up;
opts.target_unit_meters = 1.0f;
opts.space_conversion = UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS;
return opts;
}
ufbx_load_opts ufbxt_z_up_meters_root_opts()
{
ufbx_load_opts opts = { 0 };
opts.target_axes = ufbx_axes_right_handed_z_up;
opts.target_unit_meters = 1.0f;
opts.space_conversion = UFBX_SPACE_CONVERSION_TRANSFORM_ROOT;
return opts;
}
ufbx_load_opts ufbxt_z_up_meters_adjust_opts()
{
ufbx_load_opts opts = { 0 };
opts.target_axes = ufbx_axes_right_handed_z_up;
opts.target_unit_meters = 1.0f;
opts.space_conversion = UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS;
return opts;
}
ufbx_load_opts ufbxt_rh_y_camera_light_axes_opts()
{
ufbx_load_opts opts = { 0 };
opts.target_camera_axes = ufbx_axes_right_handed_y_up;
opts.target_light_axes = ufbx_axes_right_handed_y_up;
return opts;
}
ufbx_load_opts ufbxt_blender_space_adjust_opts()
{
ufbx_load_opts opts = { 0 };
opts.target_axes = ufbx_axes_right_handed_z_up;
opts.target_unit_meters = 1.0f;
opts.target_camera_axes = ufbx_axes_right_handed_y_up;
opts.target_light_axes = ufbx_axes_right_handed_y_up;
opts.space_conversion = UFBX_SPACE_CONVERSION_ADJUST_TRANSFORMS;
return opts;
}
#endif
#if UFBXT_IMPL
typedef struct {
ufbx_vec3 translation;
ufbx_vec3 rotation_euler;
ufbx_vec3 scale;
} ufbxt_ref_transform;
static void ufbxt_check_transform(ufbxt_diff_error *err, const char *name, ufbx_transform transform, ufbxt_ref_transform ref)
{
ufbx_vec3 rotation_euler = ufbx_quat_to_euler(transform.rotation, UFBX_ROTATION_ORDER_XYZ);
ufbxt_hintf("%s { { %.2f, %.2f, %.2f }, { %.2f, %.2f, %.2f }, { %.2f, %.2f, %.2f } }", name,
transform.translation.x, transform.translation.y, transform.translation.z,
rotation_euler.x, rotation_euler.y, rotation_euler.z,
transform.scale.x, transform.scale.y, transform.scale.z);
ufbxt_assert_close_vec3(err, transform.translation, ref.translation);
ufbxt_assert_close_vec3(err, rotation_euler, ref.rotation_euler);
ufbxt_assert_close_vec3(err, transform.scale, ref.scale);
ufbxt_hintf("");
}
static const ufbxt_ref_transform ufbxt_ref_transform_identity = {
{ 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f },
};
#endif
UFBXT_FILE_TEST(max_geometry_transform)
#if UFBXT_IMPL
{
ufbxt_assert(scene->nodes.count == 3);
{
ufbx_node *node = ufbx_find_node(scene, "Box001");
ufbxt_assert(node);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper == NULL);
ufbxt_assert(node->mesh);
ufbxt_ref_transform local_transform = {
{ 0.0f, -10.0f, 0.0f }, { 0.0f, 0.0f, -90.0f }, { 1.0f, 2.0f, 1.0f },
};
ufbxt_ref_transform geometry_transform = {
{ 0.0f, 0.0f, 10.0f }, { 0.0f, 90.0f, 0.0f }, { 1.0f, 1.0f, 2.0f },
};
ufbxt_check_transform(err, "Box001 local", node->local_transform, local_transform);
ufbxt_check_transform(err, "Box001 geometry", node->geometry_transform, geometry_transform);
}
{
ufbx_node *node = ufbx_find_node(scene, "Box002");
ufbxt_assert(node);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper == NULL);
ufbxt_assert(node->mesh);
ufbxt_ref_transform local_transform = {
{ 0.0f, 0.0f, 20.0f }, { 0.0f, 0.0f, -180.0f }, { 1.0f, 0.5f, 1.0f },
};
ufbxt_ref_transform geometry_transform = {
{ 10.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f },
};
ufbxt_check_transform(err, "Box002 local", node->local_transform, local_transform);
ufbxt_check_transform(err, "Box002 geometry", node->geometry_transform, geometry_transform);
}
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_helper, max_geometry_transform, ufbxt_geometry_transform_helper_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbxt_assert(scene->nodes.count == 5);
{
ufbx_node *node = ufbx_find_node(scene, "Box001");
ufbxt_assert(node);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper != NULL);
ufbxt_assert(!node->mesh);
ufbxt_ref_transform local_transform = {
{ 0.0f, -10.0f, 0.0f }, { 0.0f, 0.0f, -90.0f }, { 1.0f, 2.0f, 1.0f },
};
ufbxt_ref_transform geometry_transform = {
{ 0.0f, 0.0f, 10.0f }, { 0.0f, 90.0f, 0.0f }, { 1.0f, 1.0f, 2.0f },
};
ufbxt_check_transform(err, "Box001 local", node->local_transform, local_transform);
ufbxt_check_transform(err, "Box001 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
node = node->geometry_transform_helper;
ufbxt_assert(node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper == NULL);
ufbxt_assert(node->mesh);
ufbxt_check_transform(err, "Box001 helper local", node->local_transform, geometry_transform);
ufbxt_check_transform(err, "Box001 helper geometry", node->geometry_transform, ufbxt_ref_transform_identity);
}
{
ufbx_node *node = ufbx_find_node(scene, "Box002");
ufbxt_assert(node);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper != NULL);
ufbxt_assert(!node->mesh);
ufbxt_ref_transform local_transform = {
{ 0.0f, 0.0f, 20.0f }, { 0.0f, 0.0f, -180.0f }, { 1.0f, 0.5f, 1.0f },
};
ufbxt_ref_transform geometry_transform = {
{ 10.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f },
};
ufbxt_check_transform(err, "Box002 local", node->local_transform, local_transform);
ufbxt_check_transform(err, "Box002 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
node = node->geometry_transform_helper;
ufbxt_assert(node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper == NULL);
ufbxt_assert(node->mesh);
ufbxt_check_transform(err, "Box002 helper local", node->local_transform, geometry_transform);
ufbxt_check_transform(err, "Box002 helper geometry", node->geometry_transform, ufbxt_ref_transform_identity);
}
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_modify, max_geometry_transform, ufbxt_geometry_transform_modify_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbxt_assert(scene->nodes.count == 3);
{
ufbx_node *node = ufbx_find_node(scene, "Box001");
ufbxt_assert(node);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper == NULL);
ufbxt_assert(node->mesh);
ufbxt_ref_transform local_transform = {
{ 0.0f, -10.0f, 0.0f }, { 0.0f, 0.0f, -90.0f }, { 1.0f, 2.0f, 1.0f },
};
ufbxt_check_transform(err, "Box001 local", node->local_transform, local_transform);
ufbxt_check_transform(err, "Box001 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
}
{
ufbx_node *node = ufbx_find_node(scene, "Box002");
ufbxt_assert(node);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper == NULL);
ufbxt_assert(node->mesh);
ufbxt_ref_transform local_transform = {
{ 0.0f, 0.0f, 20.0f }, { 0.0f, 0.0f, -180.0f }, { 1.0f, 0.5f, 1.0f },
};
ufbxt_check_transform(err, "Box002 local", node->local_transform, local_transform);
ufbxt_check_transform(err, "Box002 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
}
}
#endif
UFBXT_FILE_TEST_OPTS_ALT(no_unnecessary_geometry_helpers, maya_cube, ufbxt_geometry_transform_helper_opts)
#if UFBXT_IMPL
{
ufbxt_assert(scene->nodes.count == 2);
ufbx_node *node = ufbx_find_node(scene, "pCube1");
ufbxt_assert(node);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper == NULL);
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_transformed_skin_helpers, max_transformed_skin, ufbxt_geometry_transform_helper_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbx_node *node = ufbx_find_node(scene, "Box001");
ufbxt_assert(node);
ufbxt_assert(!node->mesh);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper);
ufbxt_assert(!node->has_geometry_transform);
ufbx_node *geo_node = node->geometry_transform_helper;
ufbxt_assert(geo_node->mesh);
ufbxt_assert(geo_node->is_geometry_transform_helper);
ufbxt_assert(!geo_node->geometry_transform_helper);
ufbxt_assert(!geo_node->has_geometry_transform);
ufbxt_check_frame(scene, err, false, "max_transformed_skin_5", NULL, 5.0/30.0);
ufbxt_check_frame(scene, err, false, "max_transformed_skin_15", NULL, 15.0/30.0);
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_transformed_skin_modify, max_transformed_skin, ufbxt_geometry_transform_modify_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbx_node *node = ufbx_find_node(scene, "Box001");
ufbxt_assert(node);
ufbxt_assert(node->mesh);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(!node->geometry_transform_helper);
ufbxt_assert(!node->has_geometry_transform);
ufbxt_check_frame(scene, err, false, "max_transformed_skin_5", NULL, 5.0/30.0);
ufbxt_check_frame(scene, err, false, "max_transformed_skin_15", NULL, 15.0/30.0);
}
#endif
UFBXT_FILE_TEST(max_geometry_transform_instances)
#if UFBXT_IMPL
{
if (scene->metadata.version >= 7000) {
ufbxt_assert(scene->meshes.count == 1);
} else {
ufbxt_assert(scene->meshes.count == 4);
}
ufbxt_assert(scene->nodes.count == 5);
for (size_t i = 1; i < scene->nodes.count; i++) {
ufbx_node *node = scene->nodes.data[i];
ufbxt_assert(node->has_geometry_transform);
ufbxt_assert(node->mesh);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(!node->geometry_transform_helper);
}
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_instances_helper, max_geometry_transform_instances, ufbxt_geometry_transform_helper_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
if (scene->metadata.version >= 7000) {
ufbxt_assert(scene->meshes.count == 1);
} else {
ufbxt_assert(scene->meshes.count == 4);
}
ufbxt_assert(scene->nodes.count == 9);
for (size_t i = 1; i < scene->nodes.count; i++) {
ufbx_node *node = scene->nodes.data[i];
ufbxt_assert(!node->has_geometry_transform);
if (node->name.length > 0) {
ufbxt_assert(!node->mesh);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper);
} else {
ufbxt_assert(node->mesh);
ufbxt_assert(node->is_geometry_transform_helper);
ufbxt_assert(!node->geometry_transform_helper);
}
}
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_instances_modify, max_geometry_transform_instances, ufbxt_geometry_transform_modify_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
if (scene->metadata.version >= 7000) {
ufbxt_assert(scene->meshes.count == 1);
} else {
ufbxt_assert(scene->meshes.count == 4);
}
if (scene->metadata.version >= 7000) {
ufbxt_assert(scene->nodes.count == 9);
for (size_t i = 1; i < scene->nodes.count; i++) {
ufbx_node *node = scene->nodes.data[i];
ufbxt_assert(!node->has_geometry_transform);
if (node->name.length > 0) {
ufbxt_assert(!node->mesh);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(node->geometry_transform_helper);
} else {
ufbxt_assert(node->mesh);
ufbxt_assert(node->is_geometry_transform_helper);
ufbxt_assert(!node->geometry_transform_helper);
}
}
} else {
ufbxt_assert(scene->nodes.count == 5);
for (size_t i = 1; i < scene->nodes.count; i++) {
ufbx_node *node = scene->nodes.data[i];
ufbxt_assert(!node->has_geometry_transform);
ufbxt_assert(node->mesh);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(!node->geometry_transform_helper);
}
}
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_instances_modify_no_fallback, max_geometry_transform_instances, ufbxt_geometry_transform_modify_no_fallback_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS|UFBXT_FILE_TEST_FLAG_DIFF_EXPECT_FAIL_POST_7000)
#if UFBXT_IMPL
{
if (scene->metadata.version >= 7000) {
ufbxt_assert(scene->meshes.count == 1);
} else {
ufbxt_assert(scene->meshes.count == 4);
}
ufbxt_assert(scene->nodes.count == 5);
for (size_t i = 1; i < scene->nodes.count; i++) {
ufbx_node *node = scene->nodes.data[i];
ufbxt_assert(!node->has_geometry_transform);
ufbxt_assert(node->mesh);
ufbxt_assert(!node->is_geometry_transform_helper);
ufbxt_assert(!node->geometry_transform_helper);
}
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_helper_names, max_geometry_transform, ufbxt_geometry_transform_helper_name_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS)
#if UFBXT_IMPL
{
ufbxt_assert(scene->nodes.count == 5);
{
ufbx_node *node = ufbx_find_node(scene, "Box001");
ufbxt_assert(node->geometry_transform_helper != NULL);
node = node->geometry_transform_helper;
ufbxt_assert(!strcmp(node->name.data, "(ufbxt helper)"));
}
{
ufbx_node *node = ufbx_find_node(scene, "Box002");
ufbxt_assert(node->geometry_transform_helper != NULL);
node = node->geometry_transform_helper;
ufbxt_assert(!strcmp(node->name.data, "(ufbxt helper)"));
}
}
#endif
UFBXT_FILE_TEST(max_geometry_transform_types)
#if UFBXT_IMPL
{
{
ufbx_node *node = ufbx_find_node(scene, "Plane001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Plane001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_assert(node->has_geometry_transform);
ufbxt_assert(node->attrib_type == UFBX_ELEMENT_MESH);
}
{
ufbx_node *node = ufbx_find_node(scene, "Line001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Line001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_assert(node->has_geometry_transform);
if (scene->metadata.version >= 7000) {
ufbxt_assert(node->attrib_type == UFBX_ELEMENT_LINE_CURVE);
} else {
ufbxt_assert(node->attrib_type == UFBX_ELEMENT_EMPTY);
}
}
{
ufbx_node *node = ufbx_find_node(scene, "Curve001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Curve001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_assert(node->has_geometry_transform);
ufbxt_assert(node->attrib_type == UFBX_ELEMENT_NURBS_CURVE);
}
{
ufbx_node *node = ufbx_find_node(scene, "Surface001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Surface001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_assert(node->has_geometry_transform);
ufbxt_assert(node->attrib_type == UFBX_ELEMENT_NURBS_SURFACE);
}
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_types_helper, max_geometry_transform_types, ufbxt_geometry_transform_helper_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
{
ufbx_node *node = ufbx_find_node(scene, "Plane001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Plane001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_check_transform(err, "Plane001 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
ufbxt_assert(!node->has_geometry_transform);
ufbxt_assert(!node->attrib);
ufbxt_assert(node->geometry_transform_helper);
node = node->geometry_transform_helper;
ufbxt_assert(node->attrib_type == UFBX_ELEMENT_MESH);
}
{
ufbx_node *node = ufbx_find_node(scene, "Line001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Line001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_check_transform(err, "Line001 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
ufbxt_assert(!node->has_geometry_transform);
ufbxt_assert(!node->attrib);
ufbxt_assert(node->geometry_transform_helper);
node = node->geometry_transform_helper;
if (scene->metadata.version >= 7000) {
ufbxt_assert(node->attrib_type == UFBX_ELEMENT_LINE_CURVE);
} else {
ufbxt_assert(node->attrib_type == UFBX_ELEMENT_EMPTY);
}
}
{
ufbx_node *node = ufbx_find_node(scene, "Curve001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Curve001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_check_transform(err, "Curve001 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
ufbxt_assert(!node->has_geometry_transform);
ufbxt_assert(!node->attrib);
ufbxt_assert(node->geometry_transform_helper);
node = node->geometry_transform_helper;
ufbxt_assert(node->attrib_type == UFBX_ELEMENT_NURBS_CURVE);
}
{
ufbx_node *node = ufbx_find_node(scene, "Surface001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Surface001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_check_transform(err, "Surface001 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
ufbxt_assert(!node->has_geometry_transform);
ufbxt_assert(!node->attrib);
ufbxt_assert(node->geometry_transform_helper);
node = node->geometry_transform_helper;
ufbxt_assert(node->attrib_type == UFBX_ELEMENT_NURBS_SURFACE);
}
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_types_modify, max_geometry_transform_types, ufbxt_geometry_transform_modify_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
{
ufbx_node *node = ufbx_find_node(scene, "Plane001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Plane001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_check_transform(err, "Plane001 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
ufbxt_assert(!node->has_geometry_transform);
ufbx_mesh *mesh = node->mesh;
ufbxt_assert(mesh);
ufbxt_assert(mesh->vertex_normal.exists);
ufbxt_assert(mesh->vertex_tangent.exists);
ufbxt_assert(mesh->vertex_bitangent.exists);
ufbx_vec3 ref_positions[] = {
{ 20.0f, 10.0f, 0.0f },
{ 0.0f, 10.0f, 10.0f },
{ 20.0f, -10.0f, 0.0f },
};
ufbx_vec3 ref_normal = { 0.447213f, 0.0f, 0.894427f };
ufbx_vec3 ref_tangent = { 0.0f, -1.0f, 0.0f };
ufbx_vec3 ref_bitangent = { 0.894427f, 0.0f, -0.447213f };
ufbxt_assert(mesh->num_indices == 3);
for (size_t i = 0; i < 3; i++) {
ufbxt_hintf("i=%zu", i);
ufbx_vec3 position = ufbx_get_vertex_vec3(&mesh->vertex_position, i);
ufbx_vec3 normal = ufbx_get_vertex_vec3(&mesh->vertex_normal, i);
ufbx_vec3 tangent = ufbx_get_vertex_vec3(&mesh->vertex_tangent, i);
ufbx_vec3 bitangent = ufbx_get_vertex_vec3(&mesh->vertex_bitangent, i);
ufbxt_assert_close_vec3(err, position, ref_positions[i]);
ufbxt_assert_close_vec3(err, normal, ref_normal);
ufbxt_assert_close_vec3(err, tangent, ref_tangent);
ufbxt_assert_close_vec3(err, bitangent, ref_bitangent);
}
}
{
ufbx_node *node = ufbx_find_node(scene, "Line001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Line001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_check_transform(err, "Line001 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
ufbxt_assert(!node->has_geometry_transform);
ufbx_line_curve *line = ufbx_as_line_curve(node->attrib);
if (scene->metadata.version >= 7000) {
ufbxt_assert(line);
ufbx_vec3 ref_positions[] = {
{ 20.0f, -10.0f, 0.0f },
{ 20.0f, 10.0f, 0.0f },
{ 0.0f, 10.0f, 0.0f },
};
ufbxt_assert(line->point_indices.count == 3);
ufbxt_assert(line->segments.count == 1);
ufbxt_assert(line->segments.data[0].index_begin == 0);
ufbxt_assert(line->segments.data[0].num_indices == 3);
for (size_t i = 0; i < 3; i++) {
ufbxt_hintf("i=%zu", i);
ufbx_vec3 position = line->control_points.data[line->point_indices.data[i]];
ufbxt_assert_close_vec3(err, position, ref_positions[i]);
}
}
}
{
ufbx_node *node = ufbx_find_node(scene, "Curve001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Curve001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_check_transform(err, "Curve001 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
ufbxt_assert(!node->has_geometry_transform);
ufbx_nurbs_curve *curve = ufbx_as_nurbs_curve(node->attrib);
ufbxt_assert(curve);
ufbx_vec4 ref_points[] = {
{ 0.0f, 10.0f, 0.0f, 1.0f },
{ 6.666666f, 3.333333f, 0.0f, 1.0f },
{ 13.333333f, -3.333333f, 0.0f, 1.0f },
{ 20.0f, -10.0f, 0.0f, 1.0f },
};
ufbxt_assert(curve->control_points.count == 4);
for (size_t i = 0; i < 4; i++) {
ufbxt_hintf("i=%zu", i);
ufbx_vec4 point = curve->control_points.data[i];
ufbxt_assert_close_vec4(err, point, ref_points[i]);
}
}
{
ufbx_node *node = ufbx_find_node(scene, "Surface001");
ufbxt_assert(node);
ufbxt_check_transform(err, "Surface001 local", node->local_transform, ufbxt_ref_transform_identity);
ufbxt_check_transform(err, "Surface001 geometry", node->geometry_transform, ufbxt_ref_transform_identity);
ufbxt_assert(!node->has_geometry_transform);
ufbx_nurbs_surface *surface = ufbx_as_nurbs_surface(node->attrib);
ufbxt_assert(surface);
ufbxt_assert(surface->num_control_points_u == 4);
ufbxt_assert(surface->num_control_points_v == 4);
for (size_t v = 0; v < 4; v++) {
for (size_t u = 0; u < 4; u++) {
ufbxt_hintf("u=%zu, v=%zu", u, v);
ufbx_vec4 ref_point;
ref_point.x = (ufbx_real)v * 6.666666f;
ref_point.y = 10.0f - (ufbx_real)u * 6.666666f;
ref_point.z = 0.0f;
ref_point.w = 1.0f;
ufbx_vec4 point = surface->control_points.data[v*4 + u];
ufbxt_assert_close_vec4(err, point, ref_point);
}
}
}
}
#endif
UFBXT_FILE_TEST_FLAGS(blender_340_z_up, UFBXT_FILE_TEST_FLAG_DIFF_EXPECT_FAIL)
#if UFBXT_IMPL
{
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(blender_340_z_up_root, blender_340_z_up, ufbxt_y_up_meters_root_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbx_node *root = scene->root_node;
ufbxt_ref_transform root_transform = {
{ 0.0f, 0.0f, 0.0f }, { -90.0f, 0.0f, 0.0f }, { 0.01f, 0.01f, 0.01f },
};
ufbxt_check_transform(err, "root", root->local_transform, root_transform);
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(blender_340_z_up_adjust, blender_340_z_up, ufbxt_y_up_meters_adjust_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbx_node *root = scene->root_node;
ufbxt_check_transform(err, "root", root->local_transform, ufbxt_ref_transform_identity);
size_t num_adjusted = 0;
for (size_t i = 0; i < scene->nodes.count; i++) {
ufbx_node *node = scene->nodes.data[i];
if (node->node_depth == 1) {
ufbxt_assert(node->has_adjust_transform);
ufbx_vec3 rotation = { -90.0f, 0.0f, 0.0f };
ufbx_vec3 scale = { 0.01f, 0.01f, 0.01f };
ufbx_quat rotation_quat = ufbx_euler_to_quat(rotation, UFBX_ROTATION_ORDER_XYZ);
ufbxt_assert_close_quat(err, node->adjust_post_rotation, ufbx_identity_quat);
ufbxt_assert_close_quat(err, node->adjust_pre_rotation, rotation_quat);
ufbxt_assert_close_vec3(err, node->adjust_pre_scale, scale);
num_adjusted++;
} else {
ufbxt_assert(!node->has_adjust_transform);
ufbx_vec3 scale = { 1.0f, 1.0f, 1.0f };
ufbxt_assert_close_quat(err, node->adjust_post_rotation, ufbx_identity_quat);
ufbxt_assert_close_quat(err, node->adjust_pre_rotation, ufbx_identity_quat);
ufbxt_assert_close_vec3(err, node->adjust_pre_scale, scale);
}
}
{
ufbx_node *node = ufbx_find_node(scene, "Light");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 4.0f, 5.0f, -1.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "Light", node->local_transform, ref_transform);
}
{
ufbx_node *node = ufbx_find_node(scene, "Camera");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 7.0f, 5.0f, -6.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "Camera", node->local_transform, ref_transform);
}
{
ufbx_node *node = ufbx_find_node(scene, "Cube");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 0.0f, 1.0f, -1.0f }, { -90.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "Camera", node->local_transform, ref_transform);
}
ufbxt_assert(scene->nodes.count == 5);
ufbxt_assert(num_adjusted == 3);
}
#endif
UFBXT_FILE_TEST_FLAGS(blender_340_y_up, UFBXT_FILE_TEST_FLAG_DIFF_EXPECT_FAIL)
#if UFBXT_IMPL
{
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(blender_340_y_up_root, blender_340_y_up, ufbxt_z_up_meters_root_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbx_node *root = scene->root_node;
ufbxt_ref_transform root_transform = {
{ 0.0f, 0.0f, 0.0f }, { 90.0f, 0.0f, 0.0f }, { 0.01f, 0.01f, 0.01f },
};
ufbxt_check_transform(err, "root", root->local_transform, root_transform);
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(blender_340_y_up_adjust, blender_340_y_up, ufbxt_z_up_meters_adjust_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbx_node *root = scene->root_node;
ufbxt_check_transform(err, "root", root->local_transform, ufbxt_ref_transform_identity);
size_t num_adjusted = 0;
for (size_t i = 0; i < scene->nodes.count; i++) {
ufbx_node *node = scene->nodes.data[i];
if (node->node_depth == 1) {
ufbxt_assert(node->has_adjust_transform);
ufbx_vec3 rotation = { 90.0f, 0.0f, 0.0f };
ufbx_vec3 scale = { 0.01f, 0.01f, 0.01f };
ufbx_quat rotation_quat = ufbx_euler_to_quat(rotation, UFBX_ROTATION_ORDER_XYZ);
ufbxt_assert_close_quat(err, node->adjust_post_rotation, ufbx_identity_quat);
ufbxt_assert_close_quat(err, node->adjust_pre_rotation, rotation_quat);
ufbxt_assert_close_vec3(err, node->adjust_pre_scale, scale);
num_adjusted++;
} else {
ufbxt_assert(!node->has_adjust_transform);
ufbx_vec3 scale = { 1.0f, 1.0f, 1.0f };
ufbxt_assert_close_quat(err, node->adjust_post_rotation, ufbx_identity_quat);
ufbxt_assert_close_quat(err, node->adjust_pre_rotation, ufbx_identity_quat);
ufbxt_assert_close_vec3(err, node->adjust_pre_scale, scale);
}
}
{
ufbx_node *node = ufbx_find_node(scene, "Light");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 4.0f, 1.0f, 5.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "Light", node->local_transform, ref_transform);
}
{
ufbx_node *node = ufbx_find_node(scene, "Camera");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 7.0f, 6.0f, 5.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "Camera", node->local_transform, ref_transform);
}
{
ufbx_node *node = ufbx_find_node(scene, "Cube");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 0.0f, 1.0f, 1.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "Camera", node->local_transform, ref_transform);
}
ufbxt_assert(scene->nodes.count == 5);
ufbxt_assert(num_adjusted == 3);
}
#endif
UFBXT_FILE_TEST(maya_camera_light_axes_y_up)
#if UFBXT_IMPL
{
{
ufbx_node *node = ufbx_find_node(scene, "forwardCamera");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 0.0f, 0.0f, 0.0f }, { 0.0f, 90.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "forwardCamera", node->local_transform, ref_transform);
}
{
ufbx_node *node = ufbx_find_node(scene, "forwardLight");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 0.0f, 0.0f, 0.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "forwardLight", node->local_transform, ref_transform);
}
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(maya_camera_light_axes_y_up_rh_y, maya_camera_light_axes_y_up, ufbxt_rh_y_camera_light_axes_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS)
#if UFBXT_IMPL
{
{
ufbx_node *node = ufbx_find_node(scene, "forwardCamera");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "forwardCamera", node->local_transform, ref_transform);
}
{
ufbx_node *node = ufbx_find_node(scene, "forwardLight");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "forwardLight", node->local_transform, ref_transform);
}
}
#endif
UFBXT_FILE_TEST_OPTS(blender_340_default_unscaled, ufbxt_blender_space_adjust_opts)
#if UFBXT_IMPL
{
{
ufbx_node *node = ufbx_find_node(scene, "Cube");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 0.0f, 0.0f, 0.0f }, { 0.0f, 0.0f, 0.0f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "Cube", node->local_transform, ref_transform);
}
{
ufbx_node *node = ufbx_find_node(scene, "Camera");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 7.3589f, -6.9258f, 4.9583f }, { 63.5593f, 0.0f, 46.6919f }, { 1.0f, 1.0f, 1.0f }
};
ufbxt_check_transform(err, "Camera", node->local_transform, ref_transform);
ufbx_camera *camera = node->camera;
ufbxt_assert(camera);
ufbxt_assert(camera->projection_axes.right == UFBX_COORDINATE_AXIS_POSITIVE_X);
ufbxt_assert(camera->projection_axes.up == UFBX_COORDINATE_AXIS_POSITIVE_Y);
ufbxt_assert(camera->projection_axes.front == UFBX_COORDINATE_AXIS_POSITIVE_Z);
}
{
ufbx_node *node = ufbx_find_node(scene, "Light");
ufbxt_assert(node);
ufbxt_ref_transform ref_transform = {
{ 4.0762f, 1.0055f, 5.9039f }, { 37.261f, 3.16371f, 106.936f }, { 1.0f, 1.0f, 1.0f },
};
ufbxt_check_transform(err, "Light", node->local_transform, ref_transform);
ufbx_light *light = node->light;
ufbxt_assert(light);
ufbx_vec3 ref_dir = { 0.0f, 0.0f, -1.0f };
ufbxt_assert_close_vec3(err, light->local_direction, ref_dir);
}
}
#endif
UFBXT_FILE_TEST(max_geometry_transform_order)
#if UFBXT_IMPL
{
ufbxt_assert(scene->nodes.count == 3);
ufbx_node **nodes = scene->nodes.data;
ufbxt_assert(!strcmp(nodes[0]->name.data, ""));
ufbxt_assert(nodes[0]->is_root);
ufbxt_assert(nodes[0]->node_depth == 0);
ufbxt_assert(nodes[0]->parent == NULL);
ufbxt_assert(!strcmp(nodes[1]->name.data, "Box001"));
ufbxt_assert(nodes[1]->has_geometry_transform);
ufbxt_assert(nodes[1]->node_depth == 1);
ufbxt_assert(nodes[1]->parent == nodes[0]);
ufbxt_assert(!strcmp(nodes[2]->name.data, "Box002"));
ufbxt_assert(nodes[2]->has_geometry_transform);
ufbxt_assert(nodes[2]->node_depth == 2);
ufbxt_assert(nodes[2]->parent == nodes[1]);
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_order_helper, max_geometry_transform_order, ufbxt_geometry_transform_helper_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbxt_assert(scene->nodes.count == 5);
ufbx_node **nodes = scene->nodes.data;
ufbxt_assert(!strcmp(nodes[0]->name.data, ""));
ufbxt_assert(nodes[0]->is_root);
ufbxt_assert(nodes[0]->node_depth == 0);
ufbxt_assert(nodes[0]->parent == NULL);
ufbxt_assert(!strcmp(nodes[1]->name.data, "Box001"));
ufbxt_assert(nodes[1]->geometry_transform_helper);
ufbxt_assert(nodes[1]->node_depth == 1);
ufbxt_assert(nodes[1]->parent == nodes[0]);
ufbxt_assert(!strcmp(nodes[2]->name.data, ""));
ufbxt_assert(nodes[2]->is_geometry_transform_helper);
ufbxt_assert(nodes[2]->node_depth == 2);
ufbxt_assert(nodes[2]->parent == nodes[1]);
ufbxt_assert(!strcmp(nodes[3]->name.data, "Box002"));
ufbxt_assert(nodes[3]->geometry_transform_helper);
ufbxt_assert(nodes[3]->node_depth == 2);
ufbxt_assert(nodes[3]->parent == nodes[1]);
ufbxt_assert(!strcmp(nodes[4]->name.data, ""));
ufbxt_assert(nodes[4]->is_geometry_transform_helper);
ufbxt_assert(nodes[4]->node_depth == 3);
ufbxt_assert(nodes[4]->parent == nodes[3]);
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(max_geometry_transform_order_modify, max_geometry_transform_order, ufbxt_geometry_transform_modify_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbxt_assert(scene->nodes.count == 5);
ufbx_node **nodes = scene->nodes.data;
ufbxt_assert(!strcmp(nodes[0]->name.data, ""));
ufbxt_assert(nodes[0]->is_root);
ufbxt_assert(nodes[0]->node_depth == 0);
ufbxt_assert(nodes[0]->parent == NULL);
ufbxt_assert(!strcmp(nodes[1]->name.data, "Box001"));
ufbxt_assert(nodes[1]->geometry_transform_helper);
ufbxt_assert(nodes[1]->node_depth == 1);
ufbxt_assert(nodes[1]->parent == nodes[0]);
ufbxt_assert(!strcmp(nodes[2]->name.data, ""));
ufbxt_assert(nodes[2]->is_geometry_transform_helper);
ufbxt_assert(nodes[2]->node_depth == 2);
ufbxt_assert(nodes[2]->parent == nodes[1]);
ufbxt_assert(!strcmp(nodes[3]->name.data, "Box002"));
ufbxt_assert(nodes[3]->geometry_transform_helper);
ufbxt_assert(nodes[3]->node_depth == 2);
ufbxt_assert(nodes[3]->parent == nodes[1]);
ufbxt_assert(!strcmp(nodes[4]->name.data, ""));
ufbxt_assert(nodes[4]->is_geometry_transform_helper);
ufbxt_assert(nodes[4]->node_depth == 3);
ufbxt_assert(nodes[4]->parent == nodes[3]);
}
#endif
UFBXT_FILE_TEST(synthetic_geometry_transform_camera)
#if UFBXT_IMPL
{
ufbx_node *node = ufbx_find_node(scene, "Camera001");
ufbxt_assert(node);
ufbxt_ref_transform geo_transform = {
{ 10.0f, 20.0f, 30.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 2.0f, 3.0f },
};
ufbxt_check_transform(err, "Camera geometry", node->geometry_transform, geo_transform);
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_geometry_transform_camera_helper, synthetic_geometry_transform_camera, ufbxt_geometry_transform_helper_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbx_node *node = ufbx_find_node(scene, "Camera001");
ufbxt_assert(node);
ufbxt_assert(!node->has_geometry_transform);
ufbx_node *geo_node = node->geometry_transform_helper;
ufbxt_assert(geo_node);
ufbxt_ref_transform geo_transform = {
{ 10.0f, 20.0f, 30.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 2.0f, 3.0f },
};
ufbxt_check_transform(err, "Camera geometry", geo_node->local_transform, geo_transform);
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_geometry_transform_camera_modify, synthetic_geometry_transform_camera, ufbxt_geometry_transform_modify_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbx_node *node = ufbx_find_node(scene, "Camera001");
ufbxt_assert(node);
ufbxt_assert(!node->has_geometry_transform);
ufbx_node *geo_node = node->geometry_transform_helper;
ufbxt_assert(geo_node);
ufbxt_ref_transform geo_transform = {
{ 10.0f, 20.0f, 30.0f }, { 90.0f, 0.0f, 0.0f }, { 1.0f, 2.0f, 3.0f },
};
ufbxt_check_transform(err, "Camera geometry", geo_node->local_transform, geo_transform);
}
#endif
UFBXT_FILE_TEST_OPTS_ALT_FLAGS(synthetic_geometry_transform_camera_modify_no_fallback, synthetic_geometry_transform_camera, ufbxt_geometry_transform_modify_no_fallback_opts,
UFBXT_FILE_TEST_FLAG_FUZZ_ALWAYS|UFBXT_FILE_TEST_FLAG_FUZZ_OPTS|UFBXT_FILE_TEST_FLAG_DIFF_ALWAYS)
#if UFBXT_IMPL
{
ufbx_node *node = ufbx_find_node(scene, "Camera001");
ufbxt_assert(node);
ufbxt_assert(!node->has_geometry_transform);
}
#endif
UFBXT_TEST(synthetic_unnormalized)
#if UFBXT_IMPL
{
char path[512];
ufbxt_diff_error err = { 0 };
ufbxt_file_iterator iter = { "synthetic_unnormalized" };
while (ufbxt_next_file(&iter, path, sizeof(path))) {
for (int normalize_normals = 0; normalize_normals <= 1; normalize_normals++)
for (int normalize_tangents = 0; normalize_tangents <= 1; normalize_tangents++) {
ufbxt_hintf("normalize_normals=%d normalize_tangets=%d", normalize_normals, normalize_tangents);
ufbx_load_opts opts = { 0 };
opts.normalize_normals = normalize_normals != 0;
opts.normalize_tangents = normalize_tangents != 0;
ufbx_scene *scene = ufbx_load_file(path, &opts, NULL);
ufbxt_assert(scene);
ufbxt_check_scene(scene);
ufbx_node *node = ufbx_find_node(scene, "pPlane1");
ufbxt_assert(node && node->mesh);
ufbx_mesh *mesh = node->mesh;
ufbxt_assert(mesh->vertex_normal.values.count == 4);
for (size_t i = 0; i < 4; i++) {
ufbx_vec3 ref = ufbx_zero_vec3;
if (normalize_normals) {
ref.y = i > 0 ? 1.0f : 0.0f;
} else {
ref.y = (ufbx_real)i;
}
ufbxt_assert_close_vec3(&err, mesh->vertex_normal.values.data[i], ref);
}
ufbxt_assert(mesh->vertex_tangent.values.count == 4);
for (size_t i = 0; i < 4; i++) {
ufbx_vec3 ref = ufbx_zero_vec3;
if (normalize_tangents) {
ref.x = i > 0 ? 1.0f : 0.0f;
} else {
ref.x = (ufbx_real)i;
}
ufbxt_assert_close_vec3(&err, mesh->vertex_tangent.values.data[i], ref);
}
ufbxt_assert(mesh->vertex_bitangent.values.count == 4);
for (size_t i = 0; i < 4; i++) {
ufbx_vec3 ref = ufbx_zero_vec3;
if (normalize_tangents) {
ref.z = i > 0 ? -1.0f : 0.0f;
} else {
ref.z = -(ufbx_real)i;
}
ufbxt_assert_close_vec3(&err, mesh->vertex_bitangent.values.data[i], ref);
}
ufbx_free_scene(scene);
}
}
if (err.num > 0) {
ufbx_real avg = err.sum / (ufbx_real)err.num;
ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", avg, err.max, err.num);
}
}
#endif