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)