1
0
mirror of https://github.com/dschmenk/PLASMA.git synced 2026-01-24 00:16:56 +00:00
Files
PLASMA/src/libsrc/turtle.pla
2025-12-11 18:28:45 -08:00

149 lines
3.4 KiB
Plaintext

include "inc/cmdsys.plh"
include "inc/int32.plh"
include "inc/sincos.plh"
const CLIP_LEFT = 1
const CLIP_RIGHT = 2
const CLIP_TOP = 4
const CLIP_BOTTOM = 8
var turtleXp4, turtleYp4, turtleAngle, drawLine
byte pen
var clipLeft, clipRight, clipTop, clipBottom
def clipCode(x, y)#1
byte xcode, ycode
if x < clipLeft
xcode = CLIP_LEFT
elsif x > clipRight
xcode = CLIP_RIGHT
else
xcode = 0
fin
if y < clipTop
ycode = CLIP_TOP
elsif y > clipBottom
ycode = CLIP_BOTTOM
else
ycode = 0
fin
return xcode | ycode
end
def lerp(a1, b1, a2, b2, n)#1
word[2] i32
if b2 == b1; return b1; fin // Horizontal lerp
if a2 == a1; return n; fin // Vertical lerp
loadi16(b2 - b1)
muli16(n - a1)
divi16(a2 - a1)
store32(@i32)
return i32[0] + b1
end
export def clipLine(x1, y1, x2, y2)#0
byte outcode1, outcode2
outcode1 = clipCode(x1, y1)
outcode2 = clipCode(x2, y2)
if outcode1 & outcode2; return; fin // Early exit - clipped away
if outcode1 | outcode2 // Something is getting clipped
if outcode1 & CLIP_LEFT
y1 = lerp(x1, y1, x2, y2, clipLeft)
x1 = clipLeft
outcode1 = clipCode(x1, y1)
elsif outcode1 & CLIP_RIGHT
y1 = lerp(x1, y1, x2, y2, clipRight)
x1 = clipRight
outcode1 = clipCode(x1, y1)
fin
if outcode1 & CLIP_TOP
x1 = lerp(y1, x1, y2, x2, clipTop)
y1 = clipTop
elsif outcode1 & CLIP_BOTTOM
x1 = lerp(y1, x1, y2, x2, clipBottom)
y1 = clipBottom
fin
if outcode2 & CLIP_LEFT
y2 = lerp(x1, y1, x2, y2, clipLeft)
x2 = clipLeft
outcode2 = clipCode(x2, y2)
elsif outcode2 & CLIP_RIGHT
y2 = lerp(x1, y1, x2, y2, clipRight)
x2 = clipRight
outcode2 = clipCode(x2, y2)
fin
if outcode2 & CLIP_TOP
x2 = lerp(y1, x1, y2, x2, clipTop)
y2 = clipTop
elsif outcode2 & CLIP_BOTTOM
x2 = lerp(y1, x1, y2, x2, clipBottom)
y2 = clipBottom
fin
if clipCode(x1, y1) | clipCode(x2, y2); return; fin // Clipped away
fin
drawLine(x1, y1, x2, y2)#0
end
export def clipRect(left, top, right, bottom)#0
clipLeft = left
clipTop = top
clipRight = right
clipBottom = bottom
end
export def initTurtle(width, height, linefunc)#0
drawLine = linefunc
clipRect(0, 0, width - 1, height - 1)
turtleXp4 = width << 3
turtleYp4 = height << 3
turtleAngle = 0
pen = 1
end
export def turnTo(angle)#0
turtleAngle = angle
while turtleAngle >= 360; turtleAngle = turtleAngle - 360; loop
while turtleAngle < 0; turtleAngle = turtleAngle + 360; loop
end
export def turn(angle)#0
turnTo(turtleAngle + angle)
end
export def moveTo(x, y)#0
if pen
clipLine(turtleXp4 >> 4, turtleYp4 >> 4, x, y)
fin
turtleXp4 = x << 4
turtleYp4 = y << 4
end
export def move(dist)#0
var oldX, oldY
oldX = turtleXp4 >> 4
oldY = turtleYp4 >> 4
turtleXp4 = turtleXp4 + mulcos(dist << 4, turtleAngle)
turtleYp4 = turtleYp4 + mulsin(dist << 4, turtleAngle)
if pen
clipLine(turtleXp4 >> 4, turtleYp4 >> 4, oldX, oldY)
fin
end
export def penUp#0
pen = 0
end
export def penDown#0
pen = 1
end
//
// Keep module in memory
//
return modkeep
done