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

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