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.1.0.tar.gz (10.2 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.1.0-py3-none-any.whl (10.1 kB view details)

Uploaded Python 3

File details

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

File metadata

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

File hashes

Hashes for liquidred-0.1.0.tar.gz
Algorithm Hash digest
SHA256 56755f1c8ff9f85d752f0c9de4bf6942434035cada1643a0938f159d0b4ab634
MD5 b70447678aa3279ce0f8ebcf41cb441c
BLAKE2b-256 ad4f9acc97e278ae33cfcaff2e298e9e8624c3061bee2b5644844cedc1cf47ee

See more details on using hashes here.

File details

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

File metadata

  • Download URL: liquidred-0.1.0-py3-none-any.whl
  • Upload date:
  • Size: 10.1 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.1.0-py3-none-any.whl
Algorithm Hash digest
SHA256 59b727172586204387d8b4d2799a57ee7ef51ad67ad654806d2def57bed969f4
MD5 b4f8eb67d5819c046a31f7607fd50be5
BLAKE2b-256 f581ee8a19e14b6f8598cfe7c7336f728bb06c14ff8d177813ba20ab2797591e

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