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")