simpler
This commit is contained in:
parent
7bcb138c6f
commit
1af7f5ca7c
1 changed files with 21 additions and 23 deletions
|
@ -744,18 +744,17 @@ proc quickSort(a: var seq[(float32, bool)], inl, inr: int) =
|
||||||
quickSort(a, inl, r)
|
quickSort(a, inl, r)
|
||||||
quickSort(a, l, inr)
|
quickSort(a, l, inr)
|
||||||
|
|
||||||
proc computeBounds(shapes: seq[seq[(Segment, bool)]]): Rect =
|
proc computeBounds(segments: seq[(Segment, bool)]): Rect =
|
||||||
var
|
var
|
||||||
xMin = float32.high
|
xMin = float32.high
|
||||||
xMax = float32.low
|
xMax = float32.low
|
||||||
yMin = float32.high
|
yMin = float32.high
|
||||||
yMax = float32.low
|
yMax = float32.low
|
||||||
for shape in shapes:
|
for (segment, _) in segments:
|
||||||
for (segment, _) in shape:
|
xMin = min(xMin, min(segment.at.x, segment.to.x))
|
||||||
xMin = min(xMin, min(segment.at.x, segment.to.x))
|
xMax = max(xMax, max(segment.at.x, segment.to.x))
|
||||||
xMax = max(xMax, max(segment.at.x, segment.to.x))
|
yMin = min(yMin, min(segment.at.y, segment.to.y))
|
||||||
yMin = min(yMin, min(segment.at.y, segment.to.y))
|
yMax = max(yMax, max(segment.at.y, segment.to.y))
|
||||||
yMax = max(yMax, max(segment.at.y, segment.to.y))
|
|
||||||
|
|
||||||
xMin = floor(xMin)
|
xMin = floor(xMin)
|
||||||
xMax = ceil(xMax)
|
xMax = ceil(xMax)
|
||||||
|
@ -773,23 +772,23 @@ proc fillShapes(
|
||||||
color: ColorRGBA,
|
color: ColorRGBA,
|
||||||
windingRule: WindingRule
|
windingRule: WindingRule
|
||||||
) =
|
) =
|
||||||
var sortedShapes = newSeq[seq[(Segment, bool)]](shapes.len)
|
var sortedSegments: seq[(Segment, bool)]
|
||||||
for i, sorted in sortedShapes.mpairs:
|
for shape in shapes:
|
||||||
for segment in shapes[i].segments:
|
for segment in shape.segments:
|
||||||
if segment.at.y == segment.to.y: # Skip horizontal
|
if segment.at.y == segment.to.y: # Skip horizontal
|
||||||
continue
|
continue
|
||||||
let winding = segment.at.y > segment.to.y
|
let winding = segment.at.y > segment.to.y
|
||||||
if winding:
|
if winding:
|
||||||
var segment = segment
|
var segment = segment
|
||||||
swap(segment.at, segment.to)
|
swap(segment.at, segment.to)
|
||||||
sorted.add((segment, winding))
|
sortedSegments.add((segment, winding))
|
||||||
else:
|
else:
|
||||||
sorted.add((segment, winding))
|
sortedSegments.add((segment, winding))
|
||||||
|
|
||||||
# Figure out the total bounds of all the shapes,
|
# Figure out the total bounds of all the shapes,
|
||||||
# rasterize only within the total bounds
|
# rasterize only within the total bounds
|
||||||
let
|
let
|
||||||
bounds = computeBounds(sortedShapes)
|
bounds = computeBounds(sortedSegments)
|
||||||
startX = max(0, bounds.x.int)
|
startX = max(0, bounds.x.int)
|
||||||
startY = max(0, bounds.y.int)
|
startY = max(0, bounds.y.int)
|
||||||
stopY = min(image.height, (bounds.y + bounds.h).int)
|
stopY = min(image.height, (bounds.y + bounds.h).int)
|
||||||
|
@ -816,16 +815,15 @@ proc fillShapes(
|
||||||
yLine = y.float32 + initialOffset + offset * m.float32 + ep
|
yLine = y.float32 + initialOffset + offset * m.float32 + ep
|
||||||
scanline = Line(a: vec2(0, yLine), b: vec2(1000, yLine))
|
scanline = Line(a: vec2(0, yLine), b: vec2(1000, yLine))
|
||||||
numHits = 0
|
numHits = 0
|
||||||
for i, shape in sortedShapes:
|
for (segment, winding) in sortedSegments:
|
||||||
for (segment, winding) in shape:
|
if segment.at.y > yLine or segment.to.y < y.float32:
|
||||||
if segment.at.y > yLine or segment.to.y < y.float32:
|
continue
|
||||||
continue
|
var at: Vec2
|
||||||
var at: Vec2
|
if scanline.intersects(segment, at):# and segment.to != at:
|
||||||
if scanline.intersects(segment, at):# and segment.to != at:
|
if numHits == hits.len:
|
||||||
if numHits == hits.len:
|
hits.setLen(hits.len * 2)
|
||||||
hits.setLen(hits.len * 2)
|
hits[numHits] = (at.x.clamp(0, image.width.float32), winding)
|
||||||
hits[numHits] = (at.x.clamp(0, image.width.float32), winding)
|
inc numHits
|
||||||
inc numHits
|
|
||||||
|
|
||||||
quickSort(hits, 0, numHits - 1)
|
quickSort(hits, 0, numHits - 1)
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue