Drawing Triangles - ZackWilde27/Z3dPy GitHub Wiki
Built-In
Once you've got your rastered triangles:
for tri in z3dpy.Raster():
My library has shortcuts for drawing triangles to a pygame or tkinter screen.
# Pygame
# Greyscale, using the same float for each colour channel
z3dpy.PgDrawTriF(tri, 0.6, screen, pygame)
# RGB, using the supplied colour
z3dpy.PgDrawTriRGB(tri, [255, 212, 104], screen, pygame)
# RGB, but converts 0-1 to 0-255
z3dpy.PgDrawTriRGBF(tri, [1, 0.7, 0.5], screen, pygame)
# Outline, using the supplied colour
z3dpy.PgDrawTriOutl(tri, [255, 0, 0], screen, pygame)
# Shading, multiplies the triangle's colour with a float
z3dpy.PgDrawTriS(tri, 0.8, screen, pygame)
# Dynamic Flat Lighting
z3dpy.PgDrawTriFL(tri, screen, pygame)
# Baked Flat Lighting
z3dpy.PgDrawTriFLB(tri, screen, pygame)
# Tkinter
# Same as PyGame
z3dpy.TkDrawTriF(tri, 0.8, canvas)
z3dpy.TkDrawTriRGB(tri, [255, 0, 0], canvas)
z3dpy.TkDrawTriRGBF(tri, [1, 0.7, 0.3], canvas)
z3dpy.TkDrawTriOutl(tri, [255, 0, 0], canvas)
z3dpy.TkDrawTriS(tri, 0.8, canvas)
z3dpy.TkDrawTriFL(tri, canvas)
z3dpy.TkDrawTriFLB(tri, canvas)
0.2.0+ includes an in-progress version of my texture shader:
z3dpy.PgPixelShader(tri, pixelArray, *texture)
z3dpy.TkPixelShader(tri, canvas, *texture)
These show off the speed of Python, or should I say lack thereof
Manually
If your drawing method only supports pixels or lines, there's TriToPixels() or TriToLines()
for pixel in z3dpy.TriToPixels(tri):
x = pixel[0]
y = pixel[1]
# Or
for line in z3dpy.TriToLines(tri):
lineStart = line[0]
sX = lineStart[0]
sY = lineStart[1]
lineEnd = line[1]
eX = lineEnd[0]
eY = lineEnd[1]
But a lot of libraries have built-in triangle support:
PyGame
for tri in z3dpy.Raster():
colour = z3dpy.TriGetColour(tri)
pygame.draw.polygon(screen, colour, [(tri[0][0], tri[0][1]), (tri[1][0], tri[1][1]), (tri[2][0], tri[2][1])])
Pyglet
def on_draw():
triangles = [pyglet.shapes.Triangle(tri[0][0], tri[0][1], tri[1][0], tri[1][1], tri[2][0], tri[2][1], color=z3dpy.TriGetColour(tri), batch=myBatch) for tri in z3dpy.Raster()]
myWindow.clear()
myBatch.draw()
Tkinter
for tri in z3dpy.Raster():
colour = z3dpy.RGBToHex(z3dpy.TriGetColour(tri))
canvas.create_polygon([tri[0][0], tri[0][1], tri[1][0], tri[1][1], tri[2][0], tri[2][1]], fill=colour)
Kivy
with self.canvas.before:
for tri in z3dpy.Raster():
colour = z3dpy.TriGetColour(tri)
kivy.graphics.Color(colour[0], colour[1], colour[2], 1, mode='rgba')
kivy.graphics.Triangle(points=(tri[0][0], tri[0][1], tri[1][0], tri[1][1], tri[2][0], tri[2][1]))
Graphics.py
for tri in z3dpy.Raster():
colour = z3dpy.RGBToHex(z3dpy.TriGetColour(tri))
points = [Point(tri[0][0], tri[0][1]), Point(tri[1][0], tri[1][1]), Point(tri[2][0], tri[2][1])]
triangle = Polygon(points)
triangle.setFill(colour)
triangle.draw(win)