+ if (triangle->kids[0] && triangle->kids[1]) {
+ if (all) list = g_list_prepend(list, triangle);
+ list = _roam_sphere_get_leaves(triangle->kids[0], list, all);
+ list = _roam_sphere_get_leaves(triangle->kids[1], list, all);
+ return list;
+ } else {
+ return g_list_prepend(list, triangle);
+ }
+}
+static GList *_roam_sphere_get_intersect_rec(RoamTriangle *triangle, GList *list,
+ gboolean all, gdouble n, gdouble s, gdouble e, gdouble w)
+{
+ gdouble tn = triangle->edge.n;
+ gdouble ts = triangle->edge.s;
+ gdouble te = triangle->edge.e;
+ gdouble tw = triangle->edge.w;
+
+ gboolean debug = FALSE &&
+ n==90 && s==45 && e==-90 && w==-180 &&
+ ts > 44 && ts < 46;
+
+ if (debug)
+ g_message("t=%p: %f < %f || %f > %f || %f < %f || %f > %f",
+ triangle, tn, s, ts, n, te, w, tw, e);
+ if (tn < s || ts > n || te < w || tw > e) {
+ /* No intersect */
+ if (debug) g_message("no intersect");
+ return list;
+ } else if (tn <= n && ts >= s && te <= e && tw >= w) {
+ /* Triangle is completely contained */
+ if (debug) g_message("contained");
+ if (all) list = g_list_prepend(list, triangle);
+ return _roam_sphere_get_leaves(triangle, list, all);
+ } else if (triangle->kids[0] && triangle->kids[1]) {
+ /* Paritial intersect with children */
+ if (debug) g_message("edge w/ child");
+ if (all) list = g_list_prepend(list, triangle);
+ list = _roam_sphere_get_intersect_rec(triangle->kids[0], list, all, n, s, e, w);
+ list = _roam_sphere_get_intersect_rec(triangle->kids[1], list, all, n, s, e, w);
+ return list;
+ } else {
+ /* This triangle is an edge case */
+ if (debug) g_message("edge");
+ return g_list_prepend(list, triangle);
+ }