From 546b33d3627639b5ef38615ab2797f36e5d18939 Mon Sep 17 00:00:00 2001 From: Carl Worth Date: Fri, 13 Sep 2002 19:01:01 +0000 Subject: [PATCH] Fixed some broken polygons by adding another sort to polygon tessellation code. --- src/xrtraps.c | 92 +++++++++++++++++++++++++++++---------------------- xrtraps.c | 92 +++++++++++++++++++++++++++++---------------------- 2 files changed, 104 insertions(+), 80 deletions(-) diff --git a/src/xrtraps.c b/src/xrtraps.c index 729db28c4..9abab9022 100644 --- a/src/xrtraps.c +++ b/src/xrtraps.c @@ -246,6 +246,54 @@ _ComputeIntersect (XLineFixed *l1, XLineFixed *l2) return XDoubleToFixed ((b2 - b1) / (m1 - m2)); } +static void +_SortEdgeList(XrEdge **active) +{ + XrEdge *e, *en, *next; + + /* sort active list */ + for (e = *active; e; e = next) + { + next = e->next; + /* + * Find one later in the list that belongs before the + * current one + */ + for (en = next; en; en = en->next) + { + if (en->current_x < e->current_x || + (en->current_x == e->current_x && + en->next_x < e->next_x)) + { + /* + * insert en before e + * + * extract en + */ + en->prev->next = en->next; + if (en->next) + en->next->prev = en->prev; + /* + * insert en + */ + if (e->prev) + e->prev->next = en; + else + *active = en; + en->prev = e->prev; + e->prev = en; + en->next = e; + /* + * start over at en + */ + next = en; + break; + } + } + } +} + + XrError XrTrapsTessellatePolygon (XrTraps *traps, XrPolygon *poly, @@ -323,46 +371,8 @@ XrTrapsTessellatePolygon (XrTraps *traps, e->next_x = _ComputeX (&e->edge, next_y); } - /* sort active list */ - for (e = active; e; e = next) - { - next = e->next; - /* - * Find one later in the list that belongs before the - * current one - */ - for (en = next; en; en = en->next) - { - if (en->current_x < e->current_x || - (en->current_x == e->current_x && - en->next_x < e->next_x)) - { - /* - * insert en before e - * - * extract en - */ - en->prev->next = en->next; - if (en->next) - en->next->prev = en->prev; - /* - * insert en - */ - if (e->prev) - e->prev->next = en; - else - active = en; - en->prev = e->prev; - e->prev = en; - en->next = e; - /* - * start over at en - */ - next = en; - break; - } - } - } + _SortEdgeList(&active); + #if 0 printf ("y: %6.3g:", y / 65536.0); for (e = active; e; e = e->next) @@ -400,6 +410,8 @@ XrTrapsTessellatePolygon (XrTraps *traps, for (e = active; e; e = e->next) { e->current_x = e->next_x; } + + _SortEdgeList(&active); /* delete inactive edges from list */ for (e = active; e; e = next) diff --git a/xrtraps.c b/xrtraps.c index 729db28c4..9abab9022 100644 --- a/xrtraps.c +++ b/xrtraps.c @@ -246,6 +246,54 @@ _ComputeIntersect (XLineFixed *l1, XLineFixed *l2) return XDoubleToFixed ((b2 - b1) / (m1 - m2)); } +static void +_SortEdgeList(XrEdge **active) +{ + XrEdge *e, *en, *next; + + /* sort active list */ + for (e = *active; e; e = next) + { + next = e->next; + /* + * Find one later in the list that belongs before the + * current one + */ + for (en = next; en; en = en->next) + { + if (en->current_x < e->current_x || + (en->current_x == e->current_x && + en->next_x < e->next_x)) + { + /* + * insert en before e + * + * extract en + */ + en->prev->next = en->next; + if (en->next) + en->next->prev = en->prev; + /* + * insert en + */ + if (e->prev) + e->prev->next = en; + else + *active = en; + en->prev = e->prev; + e->prev = en; + en->next = e; + /* + * start over at en + */ + next = en; + break; + } + } + } +} + + XrError XrTrapsTessellatePolygon (XrTraps *traps, XrPolygon *poly, @@ -323,46 +371,8 @@ XrTrapsTessellatePolygon (XrTraps *traps, e->next_x = _ComputeX (&e->edge, next_y); } - /* sort active list */ - for (e = active; e; e = next) - { - next = e->next; - /* - * Find one later in the list that belongs before the - * current one - */ - for (en = next; en; en = en->next) - { - if (en->current_x < e->current_x || - (en->current_x == e->current_x && - en->next_x < e->next_x)) - { - /* - * insert en before e - * - * extract en - */ - en->prev->next = en->next; - if (en->next) - en->next->prev = en->prev; - /* - * insert en - */ - if (e->prev) - e->prev->next = en; - else - active = en; - en->prev = e->prev; - e->prev = en; - en->next = e; - /* - * start over at en - */ - next = en; - break; - } - } - } + _SortEdgeList(&active); + #if 0 printf ("y: %6.3g:", y / 65536.0); for (e = active; e; e = e->next) @@ -400,6 +410,8 @@ XrTrapsTessellatePolygon (XrTraps *traps, for (e = active; e; e = e->next) { e->current_x = e->next_x; } + + _SortEdgeList(&active); /* delete inactive edges from list */ for (e = active; e; e = next)