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
Release history Release notifications | RSS feed
Download files
Download the file for your platform. If you're not sure which to choose, learn more about installing packages.
Source Distribution
Built Distribution
Filter files by name, interpreter, ABI, and platform.
If you're not sure about the file name format, learn more about wheel file names.
Copy a direct link to the current filters
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
56755f1c8ff9f85d752f0c9de4bf6942434035cada1643a0938f159d0b4ab634
|
|
| MD5 |
b70447678aa3279ce0f8ebcf41cb441c
|
|
| BLAKE2b-256 |
ad4f9acc97e278ae33cfcaff2e298e9e8624c3061bee2b5644844cedc1cf47ee
|
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
| Algorithm | Hash digest | |
|---|---|---|
| SHA256 |
59b727172586204387d8b4d2799a57ee7ef51ad67ad654806d2def57bed969f4
|
|
| MD5 |
b4f8eb67d5819c046a31f7607fd50be5
|
|
| BLAKE2b-256 |
f581ee8a19e14b6f8598cfe7c7336f728bb06c14ff8d177813ba20ab2797591e
|