193 lines
7.4 KiB
C
193 lines
7.4 KiB
C
#undef UFBXT_TEST_GROUP
|
|
#define UFBXT_TEST_GROUP "collections"
|
|
|
|
UFBXT_FILE_TEST(max_selection_sets)
|
|
#if UFBXT_IMPL
|
|
{
|
|
ufbx_node *node = ufbx_find_node(scene, "Box001");
|
|
ufbxt_assert(node && node->mesh);
|
|
ufbx_mesh *mesh = node->mesh;
|
|
|
|
{
|
|
ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "ObjectCube");
|
|
ufbxt_assert(set && set->nodes.count == 1);
|
|
ufbx_selection_node *sel = set->nodes.data[0];
|
|
ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh);
|
|
ufbxt_assert(sel->include_node);
|
|
ufbxt_assert(sel->vertices.count == 0);
|
|
ufbxt_assert(sel->edges.count == 0);
|
|
ufbxt_assert(sel->faces.count == 0);
|
|
}
|
|
|
|
{
|
|
ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_TopFace_Face");
|
|
ufbxt_assert(set && set->nodes.count == 1);
|
|
ufbx_selection_node *sel = set->nodes.data[0];
|
|
ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh);
|
|
ufbxt_assert(!sel->include_node);
|
|
ufbxt_assert(sel->vertices.count == 0);
|
|
ufbxt_assert(sel->edges.count == 0);
|
|
ufbxt_assert(sel->faces.count == 2);
|
|
|
|
for (size_t i = 0; i < sel->faces.count; i++) {
|
|
ufbx_face face = mesh->faces.data[sel->faces.data[i]];
|
|
for (size_t j = 0; j < face.num_indices; j++) {
|
|
ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + j);
|
|
pos = ufbx_transform_position(&node->geometry_to_world, pos);
|
|
ufbxt_assert_close_real(err, pos.y / 10.0f, 2.0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
{
|
|
ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_BottomFace_Face");
|
|
ufbxt_assert(set && set->nodes.count == 1);
|
|
ufbx_selection_node *sel = set->nodes.data[0];
|
|
ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh);
|
|
ufbxt_assert(!sel->include_node);
|
|
ufbxt_assert(sel->vertices.count == 0);
|
|
ufbxt_assert(sel->edges.count == 0);
|
|
ufbxt_assert(sel->faces.count == 2);
|
|
|
|
for (size_t i = 0; i < sel->faces.count; i++) {
|
|
ufbx_face face = mesh->faces.data[sel->faces.data[i]];
|
|
for (size_t j = 0; j < face.num_indices; j++) {
|
|
ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + j);
|
|
pos = ufbx_transform_position(&node->geometry_to_world, pos);
|
|
ufbxt_assert_close_real(err, pos.y / 10.0f, 0.0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
{
|
|
ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_SideFaces_Face");
|
|
ufbxt_assert(set && set->nodes.count == 1);
|
|
ufbx_selection_node *sel = set->nodes.data[0];
|
|
ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh);
|
|
ufbxt_assert(!sel->include_node);
|
|
ufbxt_assert(sel->vertices.count == 0);
|
|
ufbxt_assert(sel->edges.count == 0);
|
|
ufbxt_assert(sel->faces.count == 8);
|
|
|
|
for (size_t i = 0; i < sel->faces.count; i++) {
|
|
ufbx_face face = mesh->faces.data[sel->faces.data[i]];
|
|
ufbx_real avg = 0.0f;
|
|
for (size_t j = 0; j < face.num_indices; j++) {
|
|
ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, face.index_begin + j);
|
|
pos = ufbx_transform_position(&node->geometry_to_world, pos);
|
|
avg += pos.y;
|
|
}
|
|
avg /= (ufbx_real)face.num_indices * 10.0f;
|
|
ufbxt_assert(avg > 0.5f && avg < 1.5f);
|
|
}
|
|
}
|
|
|
|
{
|
|
ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_TopEdges_Edge");
|
|
ufbxt_assert(set && set->nodes.count == 1);
|
|
ufbx_selection_node *sel = set->nodes.data[0];
|
|
ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh);
|
|
ufbxt_assert(!sel->include_node);
|
|
ufbxt_assert(sel->vertices.count == 0);
|
|
ufbxt_assert(sel->edges.count == 4);
|
|
ufbxt_assert(sel->faces.count == 0);
|
|
|
|
for (size_t i = 0; i < sel->edges.count; i++) {
|
|
ufbx_edge edge = mesh->edges.data[sel->edges.data[i]];
|
|
for (size_t j = 0; j < 2; j++) {
|
|
ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, edge.indices[j]);
|
|
pos = ufbx_transform_position(&node->geometry_to_world, pos);
|
|
ufbxt_assert_close_real(err, pos.y / 10.0f, 2.0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
{
|
|
ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_BottomEdges_Edge");
|
|
ufbxt_assert(set && set->nodes.count == 1);
|
|
ufbx_selection_node *sel = set->nodes.data[0];
|
|
ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh);
|
|
ufbxt_assert(!sel->include_node);
|
|
ufbxt_assert(sel->vertices.count == 0);
|
|
ufbxt_assert(sel->edges.count == 4);
|
|
ufbxt_assert(sel->faces.count == 0);
|
|
|
|
ufbx_mesh *mesh = sel->target_mesh;
|
|
for (size_t i = 0; i < sel->edges.count; i++) {
|
|
ufbx_edge edge = mesh->edges.data[sel->edges.data[i]];
|
|
for (size_t j = 0; j < 2; j++) {
|
|
ufbx_vec3 pos = ufbx_get_vertex_vec3(&mesh->vertex_position, edge.indices[j]);
|
|
pos = ufbx_transform_position(&node->geometry_to_world, pos);
|
|
ufbxt_assert_close_real(err, pos.y / 10.0f, 0.0f);
|
|
}
|
|
}
|
|
}
|
|
|
|
{
|
|
ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_TopVerts_Vertex");
|
|
ufbxt_assert(set && set->nodes.count == 1);
|
|
ufbx_selection_node *sel = set->nodes.data[0];
|
|
ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh);
|
|
ufbxt_assert(!sel->include_node);
|
|
ufbxt_assert(sel->vertices.count == 4);
|
|
ufbxt_assert(sel->edges.count == 0);
|
|
ufbxt_assert(sel->faces.count == 0);
|
|
|
|
for (size_t i = 0; i < sel->vertices.count; i++) {
|
|
ufbx_vec3 pos = mesh->vertices.data[sel->vertices.data[i]];
|
|
pos = ufbx_transform_position(&sel->target_node->geometry_to_world, pos);
|
|
ufbxt_assert_close_real(err, pos.y / 10.0f, 2.0f);
|
|
}
|
|
}
|
|
|
|
{
|
|
ufbx_selection_set *set = (ufbx_selection_set*)ufbx_find_element(scene, UFBX_ELEMENT_SELECTION_SET, "Box001_BottomVerts_Vertex");
|
|
ufbxt_assert(set && set->nodes.count == 1);
|
|
ufbx_selection_node *sel = set->nodes.data[0];
|
|
ufbxt_assert(sel->target_node == node && sel->target_mesh == mesh);
|
|
ufbxt_assert(!sel->include_node);
|
|
ufbxt_assert(sel->vertices.count == 4);
|
|
ufbxt_assert(sel->edges.count == 0);
|
|
ufbxt_assert(sel->faces.count == 0);
|
|
|
|
for (size_t i = 0; i < sel->vertices.count; i++) {
|
|
ufbx_vec3 pos = mesh->vertices.data[sel->vertices.data[i]];
|
|
pos = ufbx_transform_position(&sel->target_node->geometry_to_world, pos);
|
|
ufbxt_assert_close_real(err, pos.y / 10.0f, 0.0f);
|
|
}
|
|
}
|
|
}
|
|
#endif
|
|
|
|
UFBXT_FILE_TEST(maya_display_layers)
|
|
#if UFBXT_IMPL
|
|
{
|
|
ufbx_vec3 colors[] = { { 1,0,0 }, { 0,1,0 }, { 0,0,1 } };
|
|
|
|
ufbxt_assert(scene->display_layers.count == 3);
|
|
ufbxt_assert(scene->nodes.count == 5);
|
|
|
|
{
|
|
ufbx_display_layer *layer = (ufbx_display_layer*)ufbx_find_element(scene, UFBX_ELEMENT_DISPLAY_LAYER, "LayerA");
|
|
ufbxt_assert(layer && layer->nodes.count == 1 && !strcmp(layer->nodes.data[0]->name.data, "NodeA"));
|
|
ufbxt_assert(layer->visible && !layer->frozen);
|
|
ufbxt_assert_close_vec3(err, layer->ui_color, colors[0]);
|
|
}
|
|
|
|
{
|
|
ufbx_display_layer *layer = (ufbx_display_layer*)ufbx_find_element(scene, UFBX_ELEMENT_DISPLAY_LAYER, "LayerB");
|
|
ufbxt_assert(layer && layer->nodes.count == 1 && !strcmp(layer->nodes.data[0]->name.data, "NodeB"));
|
|
ufbxt_assert(layer->visible && layer->frozen);
|
|
ufbxt_assert_close_vec3(err, layer->ui_color, colors[1]);
|
|
}
|
|
|
|
{
|
|
ufbx_display_layer *layer = (ufbx_display_layer*)ufbx_find_element(scene, UFBX_ELEMENT_DISPLAY_LAYER, "LayerC");
|
|
ufbxt_assert(layer && layer->nodes.count == 1 && !strcmp(layer->nodes.data[0]->name.data, "NodeC"));
|
|
ufbxt_assert(!layer->visible && !layer->frozen);
|
|
ufbxt_assert_close_vec3(err, layer->ui_color, colors[2]);
|
|
}
|
|
|
|
}
|
|
#endif
|