mirror of
https://github.com/dschmenk/PLASMA.git
synced 2026-04-20 16:16:34 +00:00
Initial turtle graphics library
This commit is contained in:
@@ -0,0 +1,10 @@
|
||||
import turtle
|
||||
predef initTurtle(width, height)#0
|
||||
predef turnLeft(angle)#0
|
||||
predef turnRight(angle)#0
|
||||
predef turnTo(angle)#0
|
||||
predef moveForward(dist)#0
|
||||
predef moveTo(x, y)#0
|
||||
predef penUp#0
|
||||
predef penDown#0
|
||||
end
|
||||
@@ -0,0 +1,153 @@
|
||||
include "inc/cmdsys.plh"
|
||||
include "inc/int32.plh"
|
||||
include "inc/sincos.plh"
|
||||
include "inc/lines.plh"
|
||||
|
||||
const CLIP_LEFT = 1
|
||||
const CLIP_RIGHT = 2
|
||||
const CLIP_TOP = 4
|
||||
const CLIP_BOTTOM = 8
|
||||
|
||||
var turtleX, turtleY, turtleAngle
|
||||
byte pen
|
||||
var clipLeft, clipRight, clipTop, clipBottom
|
||||
|
||||
def clipCode(x, y)#1
|
||||
byte code
|
||||
|
||||
code = 0
|
||||
if x < clipLeft
|
||||
code = CLIP_LEFT
|
||||
elsif x > clipRight
|
||||
code = CLIP_RIGHT
|
||||
fin
|
||||
if y < clipTop
|
||||
code = code | CLIP_TOP
|
||||
elsif y > clipBottom
|
||||
code = code | CLIP_BOTTOM
|
||||
fin
|
||||
return code
|
||||
end
|
||||
|
||||
def abs(val)#1
|
||||
return val < 0 ?? -val :: val
|
||||
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
|
||||
|
||||
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
|
||||
elsif outcode1 & CLIP_RIGHT
|
||||
y1 = lerp(x1, y1, x2, y2, clipRight)
|
||||
x1 = clipRight
|
||||
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
|
||||
elsif outcode2 & CLIP_RIGHT
|
||||
y2 = lerp(x1, y1, x2, y2, clipRight)
|
||||
x2 = clipRight
|
||||
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
|
||||
outcode1 = clipCode(x1, y1)
|
||||
outcode2 = clipCode(x2, y2)
|
||||
if outcode1 & outcode2; return; fin // Clipped away
|
||||
fin
|
||||
linespans(x1, y1, x2, y2)
|
||||
end
|
||||
|
||||
export def clipRect(left, top, right, bottom)#0
|
||||
clipLeft = left
|
||||
clipTop = top
|
||||
clipLeft = left
|
||||
clipBottom = bottom
|
||||
end
|
||||
|
||||
export def initTurtle(width, height)#0
|
||||
cliprect(0, 0, width - 1, height - 1)
|
||||
turtleX = width / 2
|
||||
turtleY = height / 2
|
||||
turtleAngle = 0
|
||||
pen = 1
|
||||
end
|
||||
|
||||
export def turnLeft(angle)#0
|
||||
turtleAngle = turtleAngle - angle
|
||||
while turtleAngle < 0; turtleAngle = turtleAngle + 360; loop
|
||||
end
|
||||
|
||||
export def turnRight(angle)#0
|
||||
turtleAngle = turtleAngle + angle
|
||||
while turtleAngle >= 360; turtleAngle = turtleAngle - 360; loop
|
||||
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 moveForward(dist)#0
|
||||
var x, y
|
||||
|
||||
x = turtleX + mulcos(dist, turtleAngle)
|
||||
y = turtleY + mulsin(dist, turtleAngle)
|
||||
if pen
|
||||
clipLine(turtleX, turtleY, x, y)
|
||||
fin
|
||||
turtleX = x
|
||||
turtleY = y
|
||||
end
|
||||
|
||||
export def moveTo(x, y)#0
|
||||
if pen
|
||||
clipLine(turtleX, turtleY, x, y)
|
||||
fin
|
||||
turtleX = x
|
||||
turtleY = y
|
||||
end
|
||||
|
||||
export def penUp#0
|
||||
pen = 0
|
||||
end
|
||||
|
||||
export def penDown#0
|
||||
pen = 1
|
||||
end
|
||||
|
||||
//
|
||||
// Keep module in memory
|
||||
//
|
||||
return modkeep
|
||||
done
|
||||
+7
-2
@@ -69,6 +69,7 @@ HGRSPRITE = rel/apple/HGRSPRITE\#FE1000
|
||||
HGRTILE = rel/apple/HGRTILE\#FE1000
|
||||
HGRFONT = rel/apple/HGRFONT\#FE1000
|
||||
LINES = rel/LINES\#FE1000
|
||||
TURTLE = rel/TURTLE\#FE1000
|
||||
SINCOS = rel/SINCOS\#FE1000
|
||||
GRAFIX = rel/apple/GRAFIX\#FE1000
|
||||
SFM = rel/apple/SFM\#FE1000
|
||||
@@ -126,8 +127,8 @@ $(CMD) $(CMDJIT) $(JIT) $(JIT16) $(JITUNE) $(SOSCMD) $(SOSCMDJIT) $(PLASMAPLASM)
|
||||
$(HRFORTH) $(HR2FORTH) $(TX2FORTH) $(SEXPR) $(SMATH) $(DRAWL) $(ZIPCHIP) $(MATCHFILES) $(ARGS) $(MEMMGR) \
|
||||
$(MEMTEST) $(FIBER) $(FIBERTEST) $(LONGJMP) $(ED) $(MON) $(COPY) $(DEL) $(REN) $(CAT) $(NEWDIR) $(TYPE) \
|
||||
$(INITSLOT) $(SOS) $(ROD) $(SIEVE) $(PRIMEGAP) $(MOUSE) $(UTHERNET2) $(UTHERNET) $(ETHERIP) $(INET) $(DHCP) \
|
||||
$(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(SFMSPRT) $(GRAFIX) $(GFXDEMO) $(LINES) $(SINCOS) \
|
||||
$(HGRTILE) $(HGRFONT) $(HGRSPRITE) $(HGRLIB) $(TILETEST) $(HGRTEST) $(GRLIB) $(DGRLIB) $(VBLANK) \
|
||||
$(HTTPD) $(TFTPD) $(ROGUE) $(ROGUEMAP) $(ROGUECOMBAT) $(SFM) $(SFMSPRT) $(GRAFIX) $(GFXDEMO) $(LINES) $(TURTLE) \
|
||||
$(SINCOS) $(HGRTILE) $(HGRFONT) $(HGRSPRITE) $(HGRLIB) $(TILETEST) $(HGRTEST) $(GRLIB) $(DGRLIB) $(VBLANK) \
|
||||
$(GRTEST) $(DGRTEST) $(HGRTEST) $(FILEIO_APL) $(CONIO_APL) $(JOYBUZZ) $(PORTIO) $(SPIPORT) \
|
||||
$(SDFAT) $(FATCAT) $(FATGET) $(FATPUT) $(FATWDSK) $(FATRDSK) $(INT32) $(INT32TEST) $(SANE) $(FPSTR) $(FPU) $(SANITY) \
|
||||
$(LZ4) $(LZ4CAT) $(RPNCALC) $(SNDSEQ) $(PLAYSEQ) $(PLAYPCM) $(CONIOTEST)
|
||||
@@ -307,6 +308,10 @@ $(LINES): libsrc/lines.pla $(PLVM02) $(PLASM)
|
||||
./$(PLASM) -AMOW libsrc/lines.pla
|
||||
acme --setpc 4094 -o $(LINES) libsrc/lines.a
|
||||
|
||||
$(TURTLE): libsrc/turtle.pla $(PLVM02) $(PLASM)
|
||||
./$(PLASM) -AMOW libsrc/turtle.pla
|
||||
acme --setpc 4094 -o $(TURTLE) libsrc/turtle.a
|
||||
|
||||
$(SINCOS): libsrc/sincos.pla $(PLVM02) $(PLASM)
|
||||
./$(PLASM) -AMOW libsrc/sincos.pla
|
||||
acme --setpc 4094 -o $(SINCOS) libsrc/sincos.a
|
||||
|
||||
@@ -14,6 +14,7 @@ mkdir prodos/sys
|
||||
cp rel/apple/FILEIO#FE1000 prodos/sys/FILEIO.REL
|
||||
cp rel/apple/CONIO#FE1000 prodos/sys/CONIO.REL
|
||||
cp rel/LINES#FE1000 prodos/sys/LINES.REL
|
||||
cp rel/TURTLE#FE1000 prodos/sys/TURTLE.REL
|
||||
cp rel/SINCOS#FE1000 prodos/sys/SINCOS.REL
|
||||
cp rel/apple/HGRFONT#FE1000 prodos/sys/HGRFONT.REL
|
||||
cp rel/apple/HGRTILE#FE1000 prodos/sys/HGRTILE.REL
|
||||
@@ -72,6 +73,7 @@ cp scripts/fileio.4th prodos/sys/scripts/FILEIO.4TH.TXT
|
||||
cp scripts/grlib.4th prodos/sys/scripts/GRLIB.4TH.TXT
|
||||
cp scripts/dgrlib.4th prodos/sys/scripts/DGRLIB.4TH.TXT
|
||||
cp scripts/hgrlib.4th prodos/sys/scripts/HGRLIB.4TH.TXT
|
||||
cp scripts/turtle.4th prodos/sys/scripts/TURTLE.4TH.TXT
|
||||
cp scripts/grafix.4th prodos/sys/scripts/GRAFIX.4TH.TXT
|
||||
cp scripts/int32.4th prodos/sys/scripts/INT32.4TH.TXT
|
||||
cp scripts/fpu.4th prodos/sys/scripts/FPU.4TH.TXT
|
||||
@@ -225,6 +227,7 @@ cp inc/matchfiles.plh prodos/bld/inc/MATCHFILES.PLH.TXT
|
||||
cp inc/cmdsys.plh prodos/bld/inc/CMDSYS.PLH.TXT
|
||||
cp inc/conio.plh prodos/bld/inc/CONIO.PLH.TXT
|
||||
cp inc/lines.plh prodos/bld/inc/LINES.PLH.TXT
|
||||
cp inc/turtle.plh prodos/bld/inc/TURTLE.PLH.TXT
|
||||
cp inc/sincos.plh prodos/bld/inc/SINCOS.PLH.TXT
|
||||
cp inc/hgrfont.plh prodos/bld/inc/HGRFONT.PLH.TXT
|
||||
cp inc/hgrtile.plh prodos/bld/inc/HGRTILE.PLH.TXT
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
' INITTURTLE ?ENDSRC
|
||||
" TURTLE" LOADMOD" "
|
||||
LOOKUP INITTURTLE PLASMA INITTURTLE
|
||||
LOOKUP CLIPRECT PLASMA CLIPRECT
|
||||
LOOKUP TURNLEFT PLASMA TURNLEFT
|
||||
LOOKUP TURNRIGHT PLASMA TURNRIGHT
|
||||
LOOKUP TURNTO PLASMA TURNTO
|
||||
LOOKUP MOVEFORWARD PLASMA MOVEFORWARD
|
||||
LOOKUP MOVETO PLASMA MOVETO
|
||||
LOOKUP PENUP PLASMA PENUP
|
||||
LOOKUP PENDOWN PLASMA PENDOWN
|
||||
Reference in New Issue
Block a user