Skip to main content

3D TUI-based rasterization engine

Project description

Liquid-Red

A Python 3D rasterizer engine running entirely in the terminal. No GPU, no display server - just ASCII characters and math. Built on perspective projection, barycentric rasterization, a z-buffer, and Lambert shading. Designed to be used as a library for TUI 3D applications and games.


Features

  • Perspective projection with configurable focal length and zoom
  • Z-buffer for correct depth ordering
  • Barycentric triangle rasterization
  • Lambert shading with ASCII intensity ramp
  • Camera with yaw/pitch rotation and jump physics
  • Plane drawing helpers (draw_plane_xy, draw_plane_xz, draw_plane_yz)
  • Solid cube with faces and wireframe edges
  • Keyboard input via pynput

Installation

pip install pynput numpy LiquidRed

Quick Start

import time
from LiquidRed.camera import Camera
from LiquidRed.grid import Renderer
from LiquidRed.events import pressed
from LiquidRed.geometry import Point3d
import numpy as np
 
CANVAS_WIDTH = 64
CANVAS_HEIGHT = 32
LIGHT = np.array([0, 0, -1])
 
camera = Camera(x=0, y=0, z=-5)
renderer = Renderer(camera, light_direction_vector=LIGHT)
 
last_update = 0
 
while True:
    now = time.time()
    if now - last_update < 1 / 60:
        continue
    last_update = now
 
    camera.update(pressed, now)
    renderer.clear_grid()
 
    # draw a floor plane
    renderer.draw_plane_xz(-4, 4, 0, 20, 2)
 
    renderer.show_grid()

Cube(size, cx, cy, cz)

A solid cube centered at (cx, cy, cz).

from LiquidRed.objects import Cube
 
cube = Cube(size=2, cx=0, cy=0, cz=5)
 
# Draw as solid faces
for v0, v1, v2, v3 in cube.faces:
    renderer.draw_plane(v0, v1, v2, v3)
 
# Draw as wireframe
for i, j in cube.edges:
    renderer.draw_line(cube.vertices[i], cube.vertices[j])

Coordinate System

      -Y (up)
       |
       |
-X ----+---- +X
       |
       |
      +Y (down)
 
+Z = into the screen (away from camera)
-Z = toward the camera

Camera starts at negative Z looking toward positive Z. Place objects at positive Z values to put them in front of the camera.


Example: Corridor Scene

from LiquidRed.camera import Camera
from LiquidRed.grid import Renderer
from LiquidRed.events import pressed
import numpy as np, time
 
camera = Camera(z=-1)
renderer = Renderer(camera, np.array([0, 0, -1]))
 
W, H = 4, 3  # corridor half-width, half-height
 
while True:
    now = time.time()
    camera.update(pressed, now)
    renderer.clear_grid()
 
    # floor, ceiling, left wall, right wall
    renderer.draw_plane_xz(-W, W, 0, 30,  H)   # floor
    renderer.draw_plane_xz(-W, W, 0, 30, -H)   # ceiling
    renderer.draw_plane_yz(-H, H, 0, 30, -W)   # left
    renderer.draw_plane_yz(-H, H, 0, 30,  W)   # right
 
    renderer.show_grid()
    time.sleep(1/60)

Project details


Download files

Download the file for your platform. If you're not sure which to choose, learn more about installing packages.

Source Distribution

liquidred-0.2.0.tar.gz (10.8 kB view details)

Uploaded Source

Built Distribution

If you're not sure about the file name format, learn more about wheel file names.

liquidred-0.2.0-py3-none-any.whl (10.8 kB view details)

Uploaded Python 3

File details

Details for the file liquidred-0.2.0.tar.gz.

File metadata

  • Download URL: liquidred-0.2.0.tar.gz
  • Upload date:
  • Size: 10.8 kB
  • Tags: Source
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for liquidred-0.2.0.tar.gz
Algorithm Hash digest
SHA256 8b98419d629da500b9430184dec1f1d5fd068c4fc65dd47ec7a2a0abebf5e6f1
MD5 f27bdf4d21104111425a295e377f80f5
BLAKE2b-256 062a04fe5645ac8dc2cc1487876c2b7a94b7529c9eaf2e85af6f2b92a1c23301

See more details on using hashes here.

File details

Details for the file liquidred-0.2.0-py3-none-any.whl.

File metadata

  • Download URL: liquidred-0.2.0-py3-none-any.whl
  • Upload date:
  • Size: 10.8 kB
  • Tags: Python 3
  • Uploaded using Trusted Publishing? No
  • Uploaded via: twine/6.2.0 CPython/3.12.3

File hashes

Hashes for liquidred-0.2.0-py3-none-any.whl
Algorithm Hash digest
SHA256 d411b20b6bd8c6f8e7fa45351224c765a7fb12de025dead0fe77569773066932
MD5 66d16e8fb980cbd1a31a52fec283949a
BLAKE2b-256 a1e44389cb5b30aee40c848c3fc39fc3fce61531fbb39170f12bf24c91e1b6ad

See more details on using hashes here.

Supported by

AWS Cloud computing and Security Sponsor Datadog Monitoring Depot Continuous Integration Fastly CDN Google Download Analytics Pingdom Monitoring Sentry Error logging StatusPage Status page