renderer.py
3.3 kB · python · 81 lines
1import numpy as np2from typing import Dict, List, Optional, TextIO, Tuple, TYPE_CHECKING34if TYPE_CHECKING:5 from .models import Cell3d67# TEXT89def text_3d(grid: np.ndarray, mapping: Optional[Dict[int, str]] = None) -> List[str]:10 rows = []11 depth, height, width = grid.shape12 for z in range(depth):13 for y in range(height):14 row_str = ""15 for x in range(width):16 val = grid[z, y, x]17 if mapping:18 row_str += mapping.get(val, str(val))19 else:20 row_str += str(val)21 rows.append(row_str)22 return rows2324# OBJ2526def to_obj(cell: "Cell3d", fp: TextIO) -> None:27 grid = cell.types28 vertices: List[Tuple[int, int, int]] = []29 faces: List[Tuple[int, int, int, int]] = []30 vertex_map: Dict[Tuple[int, int, int], int] = {}31 def add_vertex(v_coords: Tuple[int, int, int]) -> int:32 if v_coords not in vertex_map:33 vertex_map[v_coords] = len(vertices) + 134 vertices.append(v_coords)35 return vertex_map[v_coords]36 dim_x, dim_y, dim_z = grid.shape37 for i in range(dim_x):38 for j in range(dim_y):39 for k in range(dim_z):40 if grid[i, j, k] == 0:41 continue42 if i == 0 or grid[i - 1, j, k] == 0:43 v1 = add_vertex((i, j, k))44 v2 = add_vertex((i, j, k + 1))45 v3 = add_vertex((i, j + 1, k + 1))46 v4 = add_vertex((i, j + 1, k))47 faces.append((v1, v2, v3, v4))48 if i == dim_x - 1 or grid[i + 1, j, k] == 0:49 v1 = add_vertex((i + 1, j, k))50 v2 = add_vertex((i + 1, j + 1, k))51 v3 = add_vertex((i + 1, j + 1, k + 1))52 v4 = add_vertex((i + 1, j, k + 1))53 faces.append((v1, v2, v3, v4))54 if j == 0 or grid[i, j - 1, k] == 0:55 v1 = add_vertex((i, j, k))56 v2 = add_vertex((i + 1, j, k))57 v3 = add_vertex((i + 1, j, k + 1))58 v4 = add_vertex((i, j, k + 1))59 faces.append((v1, v2, v3, v4))60 if j == dim_y - 1 or grid[i, j + 1, k] == 0:61 v1 = add_vertex((i, j + 1, k))62 v2 = add_vertex((i, j + 1, k + 1))63 v3 = add_vertex((i + 1, j + 1, k + 1))64 v4 = add_vertex((i + 1, j + 1, k))65 faces.append((v1, v2, v3, v4))66 if k == 0 or grid[i, j, k - 1] == 0:67 v1 = add_vertex((i, j, k))68 v2 = add_vertex((i, j + 1, k))69 v3 = add_vertex((i + 1, j + 1, k))70 v4 = add_vertex((i + 1, j, k))71 faces.append((v1, v2, v3, v4))72 if k == dim_z - 1 or grid[i, j, k + 1] == 0:73 v1 = add_vertex((i, j, k + 1))74 v2 = add_vertex((i + 1, j, k + 1))75 v3 = add_vertex((i + 1, j + 1, k + 1))76 v4 = add_vertex((i, j + 1, k + 1))77 faces.append((v1, v2, v3, v4))78 for v in vertices:79 fp.write(f"v {v[0]} {v[1]} {v[2]}\n")80 for f in faces:81 fp.write(f"f {f[0]} {f[1]} {f[2]} {f[3]}\n")