static void print_kdtree(t_kdtree_child const *node, uint32_t offset, char prefix) { if (node->type == KDTREE_SPLIT) { print_kdtree(node->v.split.left, offset + 4, '/'); ft_logf(LOG_DEBUG, "%*c %c|", offset, prefix, "xyz"[node->v.split.d]); print_kdtree(node->v.split.right, offset + 4, '\\'); return ; } ft_logf(LOG_DEBUG, "%*c= %d node(s)", offset, prefix, node->v.leaf.length); }
void print_kdtree(kdtree_t *tree, int depth) { if (tree == NULL) return; int i; for (i = 0; i < depth; i++) printf(" "); printf("node %d {d=%d, axis=%d, x=(%.2f", tree->i, tree->d, tree->axis, tree->x[0]); for (i = 1; i < tree->d; i++) printf(", %.2f", tree->x[i]); printf("), bbox_min = (%.2f", tree->bbox_min[0]); for (i = 1; i < tree->d; i++) printf(", %.2f", tree->bbox_min[i]); printf("), bbox_max = (%.2f", tree->bbox_max[0]); for (i = 1; i < tree->d; i++) printf(", %.2f", tree->bbox_max[i]); printf(")}\n"); print_kdtree(tree->left, depth+1); print_kdtree(tree->right, depth+1); }
static bool parse_scene(t_xml_parser *xml, t_scene *dst) { t_parse_scene scene; scene = (t_parse_scene){DSTR0(), KDTREE_BUILDER(3), VECTOR(t_light), VECTOR(t_camera), DEF_SKY_COLOR}; if (!ft_xml_next(xml) || (xml->token == XML_TOKEN_PARAM && !parse_xml_params(xml, &g_scene_params, &scene))) return (false); while (true) { ASSERT(xml->token == XML_TOKEN_START); if (!parse_scene_child(xml, &scene)) { ft_dstrclear(&scene.name); ft_vclear(&scene.lights); ft_vclear(&scene.cameras); kdtree_builder_destroy(&scene.kdtree); return (false); } if (!ft_xml_next(xml)) break ; } if (xml->token != XML_TOKEN_END) return (ft_xml_error(xml, SUBC("Unexpected EOF"))); if (scene.cameras.length == 0) ft_vpush(&scene.cameras, &DEF_CAMERA, 1); *dst = (t_scene){ DSTR_SUB(scene.name), kdtree_build(&scene.kdtree), scene.lights, scene.cameras, scene.sky_color }; kdtree_builder_destroy(&scene.kdtree); print_kdtree(dst->objs.root, 1, '.'); ft_logf(LOG_VERBOSE, "Scene '%ts' loaded: %u object(s), %u light(s), " "%u camera(s)", dst->name, dst->objs.length, dst->lights.length, dst->cameras.length); return (true); }