254 lines
9.9 KiB
C
254 lines
9.9 KiB
C
#undef UFBXT_TEST_GROUP
|
|
#define UFBXT_TEST_GROUP "legacy"
|
|
|
|
#if UFBXT_IMPL
|
|
static void ufbxt_diff_material_value(ufbxt_diff_error *err, const ufbx_material_map *color, const ufbx_material_map *factor, ufbx_vec3 value)
|
|
{
|
|
ufbxt_assert_close_real(err, color->value_vec3.x * factor->value_vec3.x, value.x);
|
|
ufbxt_assert_close_real(err, color->value_vec3.y * factor->value_vec3.x, value.y);
|
|
ufbxt_assert_close_real(err, color->value_vec3.z * factor->value_vec3.x, value.z);
|
|
}
|
|
#endif
|
|
|
|
UFBXT_FILE_TEST(max7_cube)
|
|
#if UFBXT_IMPL
|
|
{
|
|
}
|
|
#endif
|
|
|
|
UFBXT_FILE_TEST(max7_cube_normals)
|
|
#if UFBXT_IMPL
|
|
{
|
|
}
|
|
#endif
|
|
|
|
UFBXT_FILE_TEST(max2009_blob)
|
|
#if UFBXT_IMPL
|
|
{
|
|
ufbxt_assert(scene->lights.count == 3);
|
|
ufbxt_assert(scene->cameras.count == 1);
|
|
|
|
{
|
|
ufbx_node *node = ufbx_find_node(scene, "Box01");
|
|
ufbxt_assert(node);
|
|
ufbxt_assert(node->mesh);
|
|
ufbxt_assert(node->children.count == 16);
|
|
ufbx_mesh *mesh = node->mesh;
|
|
|
|
size_t num_top = 0;
|
|
size_t num_left = 0;
|
|
size_t num_right = 0;
|
|
size_t num_front = 0;
|
|
|
|
for (size_t fi = 0; fi < mesh->num_faces; fi++) {
|
|
ufbx_face face = mesh->faces.data[fi];
|
|
ufbx_vec3 center = ufbx_zero_vec3;
|
|
for (size_t i = 0; i < face.num_indices; i++) {
|
|
ufbx_vec3 v = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + i);
|
|
center.x += v.x;
|
|
center.y += v.y;
|
|
center.z += v.z;
|
|
}
|
|
center.x /= (ufbx_real)face.num_indices;
|
|
center.y /= (ufbx_real)face.num_indices;
|
|
center.z /= (ufbx_real)face.num_indices;
|
|
|
|
if (center.z >= 14.0f) {
|
|
ufbx_mesh_material *mat = &mesh->materials.data[mesh->face_material.data[fi]];
|
|
ufbxt_assert(!strcmp(mat->material->name.data, "Top"));
|
|
num_top++;
|
|
}
|
|
if (center.y <= -10.0f) {
|
|
ufbx_mesh_material *mat = &mesh->materials.data[mesh->face_material.data[fi]];
|
|
ufbxt_assert(!strcmp(mat->material->name.data, "Right"));
|
|
num_right++;
|
|
}
|
|
if (center.y >= 10.0f) {
|
|
ufbx_mesh_material *mat = &mesh->materials.data[mesh->face_material.data[fi]];
|
|
ufbxt_assert(!strcmp(mat->material->name.data, "Left"));
|
|
num_left++;
|
|
}
|
|
if (center.x >= 9.0f) {
|
|
ufbx_mesh_material *mat = &mesh->materials.data[mesh->face_material.data[fi]];
|
|
ufbxt_assert(!strcmp(mat->material->name.data, "Front"));
|
|
num_front++;
|
|
}
|
|
}
|
|
|
|
ufbxt_assert(num_top >= 80);
|
|
ufbxt_assert(num_left >= 80);
|
|
ufbxt_assert(num_right >= 80);
|
|
ufbxt_assert(num_front >= 80);
|
|
}
|
|
|
|
{
|
|
ufbx_node *node = ufbx_find_node(scene, "Omni01");
|
|
ufbxt_assert(node && node->light);
|
|
ufbx_light *light = node->light;
|
|
ufbxt_assert(light->type == UFBX_LIGHT_POINT);
|
|
if (scene->metadata.version < 6000) {
|
|
ufbxt_assert(light->decay == UFBX_LIGHT_DECAY_QUADRATIC);
|
|
}
|
|
ufbx_vec3 color = { 0.172549024224281f, 0.364705890417099f, 1.0f };
|
|
ufbxt_assert_close_vec3(err, light->color, color);
|
|
ufbxt_assert_close_real(err, light->intensity, 1.0f);
|
|
}
|
|
|
|
{
|
|
ufbx_node *node = ufbx_find_node(scene, "Fspot01");
|
|
ufbxt_assert(node && node->light);
|
|
ufbx_light *light = node->light;
|
|
ufbxt_assert(light->type == UFBX_LIGHT_SPOT);
|
|
if (scene->metadata.version < 6000) {
|
|
ufbxt_assert(light->decay == UFBX_LIGHT_DECAY_QUADRATIC);
|
|
}
|
|
ufbx_vec3 color = { 0.972549080848694f ,0.0705882385373116f, 0.0705882385373116f };
|
|
ufbxt_assert_close_vec3(err, light->color, color);
|
|
ufbxt_assert_close_real(err, light->intensity, 1.0f);
|
|
ufbxt_assert_close_real(err, light->outer_angle, 45.0f);
|
|
}
|
|
|
|
{
|
|
ufbx_node *node = ufbx_find_node(scene, "FDirect02");
|
|
ufbxt_assert(node && node->light);
|
|
ufbx_light *light = node->light;
|
|
ufbxt_assert(light->type == UFBX_LIGHT_DIRECTIONAL);
|
|
if (scene->metadata.version < 6000) {
|
|
ufbxt_assert(light->decay == UFBX_LIGHT_DECAY_NONE);
|
|
}
|
|
ufbx_vec3 color = { 0.533333361148834f ,0.858823597431183f, 0.647058844566345f };
|
|
ufbxt_assert_close_vec3(err, light->color, color);
|
|
ufbxt_assert_close_real(err, light->intensity, 1.0f);
|
|
}
|
|
|
|
{
|
|
ufbx_node *node = ufbx_find_node(scene, "Camera01");
|
|
ufbxt_assert(node && node->camera);
|
|
ufbx_camera *camera = node->camera;
|
|
ufbxt_assert(camera->aspect_mode == UFBX_ASPECT_MODE_WINDOW_SIZE);
|
|
ufbxt_assert(camera->aperture_mode == UFBX_APERTURE_MODE_HORIZONTAL);
|
|
ufbx_vec2 aperture = { 1.41732287406921f ,1.06299209594727f };
|
|
ufbxt_assert_close_real(err, camera->focal_length_mm, 43.4558439883016f);
|
|
ufbxt_assert_close_vec2(err, camera->film_size_inch, aperture);
|
|
ufbxt_assert_close_vec2(err, camera->aperture_size_inch, aperture);
|
|
}
|
|
|
|
{
|
|
ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Left");
|
|
ufbxt_assert(material);
|
|
ufbx_vec3 ambient = { 0.588235318660736f, 0.588235318660736f, 0.588235318660736f };
|
|
ufbx_vec3 diffuse = { 0.588235318660736f, 0.588235318660736f, 0.588235318660736f };
|
|
ufbx_vec3 specular = { 0.179999984502793f, 0.179999984502793f, 0.179999984502793f };
|
|
ufbx_vec3 emission = { 0.823529481887817f, 0.0f, 0.0f };
|
|
ufbx_real shininess = 1.99999991737042f;
|
|
ufbxt_diff_material_value(err, &material->fbx.ambient_color, &material->fbx.ambient_factor, ambient);
|
|
ufbxt_diff_material_value(err, &material->fbx.diffuse_color, &material->fbx.diffuse_factor, diffuse);
|
|
ufbxt_diff_material_value(err, &material->fbx.specular_color, &material->fbx.specular_factor, specular);
|
|
ufbxt_diff_material_value(err, &material->fbx.emission_color, &material->fbx.emission_factor, emission);
|
|
ufbxt_assert_close_real(err, material->fbx.specular_exponent.value_vec3.x, shininess);
|
|
}
|
|
|
|
{
|
|
ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Front");
|
|
ufbxt_assert(material);
|
|
ufbx_vec3 ambient = { 0.588235318660736f, 0.921568691730499f, 0.925490260124207f };
|
|
ufbx_vec3 diffuse = { 0.588235318660736f, 0.921568691730499f, 0.925490260124207f };
|
|
ufbx_vec3 specular = { 0.0f, 0.0f, 0.0f };
|
|
ufbx_vec3 emission = { 0.0f, 0.0f, 0.0f };
|
|
ufbx_real shininess = 1.99999991737042f;
|
|
ufbxt_diff_material_value(err, &material->fbx.ambient_color, &material->fbx.ambient_factor, ambient);
|
|
ufbxt_diff_material_value(err, &material->fbx.diffuse_color, &material->fbx.diffuse_factor, diffuse);
|
|
ufbxt_diff_material_value(err, &material->fbx.specular_color, &material->fbx.specular_factor, specular);
|
|
ufbxt_diff_material_value(err, &material->fbx.emission_color, &material->fbx.emission_factor, emission);
|
|
ufbxt_assert_close_real(err, material->fbx.specular_exponent.value_vec3.x, shininess);
|
|
}
|
|
|
|
{
|
|
ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Right");
|
|
ufbxt_assert(material);
|
|
ufbx_vec3 ambient = { 0.588235318660736f, 0.588235318660736f, 0.588235318660736f };
|
|
ufbx_vec3 diffuse = { 0.588235318660736f, 0.588235318660736f, 0.588235318660736f };
|
|
ufbx_vec3 specular = { 0.0f, 0.0f, 0.0f };
|
|
ufbx_vec3 emission = { 0.0f, 0.803921639919281f, 0.0f };
|
|
ufbx_real shininess = 7.99999900844507f;
|
|
ufbxt_diff_material_value(err, &material->fbx.ambient_color, &material->fbx.ambient_factor, ambient);
|
|
ufbxt_diff_material_value(err, &material->fbx.diffuse_color, &material->fbx.diffuse_factor, diffuse);
|
|
ufbxt_diff_material_value(err, &material->fbx.specular_color, &material->fbx.specular_factor, specular);
|
|
ufbxt_diff_material_value(err, &material->fbx.emission_color, &material->fbx.emission_factor, emission);
|
|
ufbxt_assert_close_real(err, material->fbx.specular_exponent.value_vec3.x, shininess);
|
|
}
|
|
|
|
{
|
|
ufbx_material *material = (ufbx_material*)ufbx_find_element(scene, UFBX_ELEMENT_MATERIAL, "Top");
|
|
ufbxt_assert(material);
|
|
ufbx_vec3 ambient = { 0.564705908298492f, 0.603921592235565f, 0.890196144580841f };
|
|
ufbx_vec3 diffuse = { 0.564705908298492f, 0.603921592235565f, 0.890196144580841f };
|
|
ufbx_vec3 specular = { 0.0f, 0.0f, 0.0f };
|
|
ufbx_vec3 emission = { 0.0f, 0.0f, 0.0f };
|
|
ufbx_real shininess = 1.99999991737042f;
|
|
ufbxt_diff_material_value(err, &material->fbx.ambient_color, &material->fbx.ambient_factor, ambient);
|
|
ufbxt_diff_material_value(err, &material->fbx.diffuse_color, &material->fbx.diffuse_factor, diffuse);
|
|
ufbxt_diff_material_value(err, &material->fbx.specular_color, &material->fbx.specular_factor, specular);
|
|
ufbxt_diff_material_value(err, &material->fbx.emission_color, &material->fbx.emission_factor, emission);
|
|
ufbxt_assert_close_real(err, material->fbx.specular_exponent.value_vec3.x, shininess);
|
|
}
|
|
|
|
ufbxt_check_frame(scene, err, false, "max2009_blob_8", NULL, 8.0/30.0);
|
|
ufbxt_check_frame(scene, err, false, "max2009_blob_18", NULL, 18.0/30.0);
|
|
}
|
|
#endif
|
|
|
|
UFBXT_FILE_TEST(max7_skin)
|
|
#if UFBXT_IMPL
|
|
{
|
|
ufbxt_check_frame(scene, err, false, "max7_skin_5", NULL, 5.0/30.0);
|
|
ufbxt_check_frame(scene, err, false, "max7_skin_15", NULL, 15.0/30.0);
|
|
}
|
|
#endif
|
|
|
|
UFBXT_FILE_TEST(max7_blend_cube)
|
|
#if UFBXT_IMPL
|
|
{
|
|
ufbx_node *node = ufbx_find_node(scene, "Box01");
|
|
ufbxt_assert(node);
|
|
ufbxt_assert(node->mesh);
|
|
ufbx_mesh *mesh = node->mesh;
|
|
ufbxt_assert(mesh->blend_deformers.count == 1);
|
|
ufbx_blend_deformer *blend = mesh->blend_deformers.data[0];
|
|
ufbxt_assert(blend->channels.count == 2);
|
|
|
|
ufbxt_check_frame(scene, err, false, "max7_blend_cube_8", NULL, 8.0/30.0);
|
|
ufbxt_check_frame(scene, err, false, "max7_blend_cube_24", NULL, 24.0/30.0);
|
|
}
|
|
#endif
|
|
|
|
UFBXT_FILE_TEST(max6_teapot)
|
|
#if UFBXT_IMPL
|
|
{
|
|
ufbx_node *node = ufbx_find_node(scene, "Teapot01");
|
|
ufbxt_assert(node);
|
|
ufbxt_assert(node->mesh);
|
|
ufbx_mesh *mesh = node->mesh;
|
|
ufbxt_assert(mesh->vertex_normal.exists);
|
|
ufbxt_assert(mesh->vertex_uv.exists);
|
|
}
|
|
#endif
|
|
|
|
UFBXT_FILE_TEST(synthetic_legacy_nonzero_material)
|
|
#if UFBXT_IMPL
|
|
{
|
|
ufbx_node *node = ufbx_find_node(scene, "Box01");
|
|
ufbxt_assert(node && node->mesh);
|
|
ufbx_mesh *mesh = node->mesh;
|
|
ufbxt_assert(mesh->faces.count == 1);
|
|
ufbxt_assert(mesh->num_indices == 3);
|
|
ufbxt_assert(mesh->materials.count == 2);
|
|
ufbxt_assert(!strcmp(mesh->materials.data[0].material->name.data, "Right"));
|
|
ufbxt_assert(mesh->materials.data[0].num_faces == 0);
|
|
ufbxt_assert(!strcmp(mesh->materials.data[1].material->name.data, "Left"));
|
|
ufbxt_assert(mesh->materials.data[1].num_faces == 1);
|
|
ufbxt_assert(mesh->face_material.count == 1);
|
|
ufbxt_assert(mesh->face_material.data[0] == 1);
|
|
}
|
|
#endif
|