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

179 lines
6.5 KiB
C

#undef UFBXT_TEST_GROUP
#define UFBXT_TEST_GROUP "cache"
#if UFBXT_IMPL
static void ufbxt_test_sine_cache(ufbxt_diff_error *err, const char *path, double begin, double end, double err_threshold)
{
char buf[512];
snprintf(buf, sizeof(buf), "%s%s", data_root, path);
ufbx_geometry_cache *cache = ufbx_load_geometry_cache(buf, NULL, NULL);
ufbxt_assert(cache);
ufbxt_assert(cache->channels.count == 2);
bool found_cube1 = false;
for (size_t i = 0; i < cache->channels.count; i++) {
ufbx_cache_channel *channel = &cache->channels.data[i];
ufbxt_assert(channel->interpretation == UFBX_CACHE_INTERPRETATION_VERTEX_POSITION);
if (!strcmp(channel->name.data, "pCubeShape1")) {
found_cube1 = true;
ufbx_vec3 pos[64];
for (double time = begin; time <= end + 0.0001; time += 0.1/24.0) {
size_t num_verts = ufbx_sample_geometry_cache_vec3(channel, time, pos, ufbxt_arraycount(pos), NULL);
ufbxt_assert(num_verts == 36);
size_t dry_verts = ufbx_sample_geometry_cache_vec3(channel, time, pos, SIZE_MAX, NULL);
ufbxt_assert(num_verts == dry_verts);
double t = (time - 1.0/24.0) / (29.0/24.0) * 4.0;
double pi2 = 3.141592653589793*2.0;
double err_scale = 0.001 / err_threshold;
for (size_t i = 0; i < num_verts; i++) {
ufbx_vec3 v = pos[i];
double sx = sin((v.y + t * 0.5f)*pi2) * 0.25;
double vx = v.x;
vx += vx > 0.0 ? -0.5 : 0.5;
ufbxt_assert_close_real(err, vx*err_scale, sx*err_scale);
}
}
}
}
ufbxt_assert(found_cube1);
ufbx_free_geometry_cache(cache);
}
#endif
UFBXT_FILE_TEST(maya_cache_sine)
#if UFBXT_IMPL
{
ufbx_node *node = ufbx_find_node(scene, "pCube1");
ufbxt_assert(node && node->mesh);
ufbx_mesh *mesh = node->mesh;
ufbxt_assert(mesh->cache_deformers.count == 2);
for (size_t i = 0; i < 2; i++) {
ufbx_cache_deformer *deformer = mesh->cache_deformers.data[i];
ufbxt_assert(deformer->file);
ufbxt_assert(deformer->file->format == UFBX_CACHE_FILE_FORMAT_MC);
}
ufbxt_check_frame(scene, err, false, "maya_cache_sine_12", NULL, 12.0/24.0);
ufbxt_check_frame(scene, err, false, "maya_cache_sine_18", NULL, 18.0/24.0);
}
#endif
UFBXT_TEST(maya_cache_sine_caches)
#if UFBXT_IMPL
{
ufbxt_diff_error err = { 0 };
ufbxt_test_sine_cache(&err, "caches/sine_mcmf_undersample/cache.xml", 1.0/24.0, 29.0/24.0, 0.04);
ufbxt_test_sine_cache(&err, "caches/sine_mcsd_oversample/cache.xml", 1.0/24.0, 29.0/24.0, 0.003);
ufbxt_test_sine_cache(&err, "caches/sine_mxmd_oversample/cache.xml", 11.0/24.0, 19.0/24.0, 0.003);
ufbxt_test_sine_cache(&err, "caches/sine_mxsf_regular/cache.xml", 1.0/24.0, 29.0/24.0, 0.008);
ufbxt_logf(".. Absolute diff: avg %.3g, max %.3g (%zu tests)", err.sum / (ufbx_real)err.num, err.max, err.num);
}
#endif
UFBXT_FILE_TEST(max_cache_box)
#if UFBXT_IMPL
{
ufbx_node *node = ufbx_find_node(scene, "Box001");
ufbxt_assert(node && node->mesh);
ufbx_mesh *mesh = node->mesh;
ufbxt_assert(mesh->cache_deformers.count == 1);
ufbx_cache_deformer *deformer = mesh->cache_deformers.data[0];
ufbxt_assert(deformer->file);
ufbxt_assert(deformer->file->format == UFBX_CACHE_FILE_FORMAT_PC2);
ufbxt_assert(deformer->external_cache);
ufbxt_assert(deformer->external_channel);
ufbxt_assert(deformer->external_channel->frames.count == 11);
for (size_t i = 0; i < deformer->external_channel->frames.count; i++) {
ufbx_cache_frame *frame = &deformer->external_channel->frames.data[i];
ufbxt_assert(frame->file_format == UFBX_CACHE_FILE_FORMAT_PC2);
}
ufbxt_check_frame(scene, err, false, "max_cache_box_44", NULL, 44.0/30.0);
ufbxt_check_frame(scene, err, false, "max_cache_box_48", NULL, 48.0/30.0);
}
#endif
UFBXT_TEST(cache_xml_parse)
#if UFBXT_IMPL
{
char buf[512];
snprintf(buf, sizeof(buf), "%s%s", data_root, "caches/sine_xml_parse/cache.xml");
ufbx_geometry_cache *cache = ufbx_load_geometry_cache(buf, NULL, NULL);
ufbxt_assert(cache);
ufbxt_assert(cache->extra_info.count == 2);
ufbxt_check_string(cache->extra_info.data[0]);
ufbxt_check_string(cache->extra_info.data[1]);
const char *ex0 = "cdata! \"'&<><--&lt;&#x61;<tag></tag>-->!CDATA[]>\x61\xce\xb2\xe3\x82\xab\xf0\x9f\x98\x82]]";
ufbxt_assert(!strcmp(cache->extra_info.data[0].data, ex0));
const char *ex1 = "\"'&<>\x61\x61\x61\xce\xb2\xce\xb2\xce\xb2\xe3\x82\xab\xe3\x82\xab\xe3\x82\xab\xf0\x9f\x98\x82\xf0\x9f\x98\x82\xf0\x9f\x98\x82";
ufbxt_assert(!strcmp(cache->extra_info.data[1].data, ex1));
ufbxt_assert(cache->channels.count == 2);
ufbxt_check_string(cache->channels.data[0].name);
ufbxt_check_string(cache->channels.data[1].name);
ufbxt_check_string(cache->channels.data[0].interpretation_name);
ufbxt_check_string(cache->channels.data[1].interpretation_name);
ufbxt_assert(cache->channels.data[0].interpretation == UFBX_CACHE_INTERPRETATION_UNKNOWN);
ufbxt_assert(cache->channels.data[1].interpretation == UFBX_CACHE_INTERPRETATION_UNKNOWN);
ufbxt_assert(!strcmp(cache->channels.data[0].interpretation_name.data, "<!--\"positions\"-->"));
ufbxt_assert(!strcmp(cache->channels.data[1].interpretation_name.data, "<![CDATA[<positions>]]>"));
ufbx_free_geometry_cache(cache);
}
#endif
UFBXT_TEST(cache_xml_depth)
#if UFBXT_IMPL
{
char buf[512];
snprintf(buf, sizeof(buf), "%s%s", data_root, "cache_xml_depth.xml");
ufbx_error error;
ufbx_geometry_cache *cache = ufbx_load_geometry_cache(buf, NULL, &error);
ufbxt_assert(!cache);
ufbxt_assert(error.type == UFBX_ERROR_UNKNOWN);
}
#endif
UFBXT_FILE_TEST_OPTS(marvelous_quad, ufbxt_scale_to_cm_opts)
#if UFBXT_IMPL
{
{
ufbx_node *node = ufbx_find_node(scene, "marvelous_quad");
ufbxt_assert(node && node->mesh);
ufbx_mesh *mesh = node->mesh;
ufbxt_assert(mesh->materials.count == 1);
ufbx_material *material = mesh->materials.data[0].material;
// What? Marvelous writes relative filenames as absolute.
// TODO: Quirk mode to fix this?
const char *prefix = "D:\\Dev\\clean\\ufbx\\data\\";
ufbxt_check_material_texture_ex(scene, material->fbx.ambient_color.texture, prefix, "marvelous_quad_diffuse_100-1.png", true);
ufbxt_check_material_texture_ex(scene, material->fbx.diffuse_color.texture, prefix, "marvelous_quad_diffuse_100-1.png", true);
ufbxt_check_material_texture_ex(scene, material->fbx.normal_map.texture, prefix, "marvelous_quad_normal_100-1.png", true);
ufbxt_check_material_texture_ex(scene, material->pbr.base_color.texture, prefix, "marvelous_quad_diffuse_100-1.png", true);
ufbxt_check_material_texture_ex(scene, material->pbr.normal_map.texture, prefix, "marvelous_quad_normal_100-1.png", true);
}
ufbxt_check_frame(scene, err, false, "marvelous_quad_12", NULL, 12.0/24.0);
ufbxt_check_frame(scene, err, false, "marvelous_quad_22", NULL, 22.0/24.0);
}
#endif