DKL9 GitList
Repositories
DKL9 home
voxels
Code
Commits
Branches
Tags
Search
Tree:
dfcfe5f
Branches
Tags
master
voxels
mapgen.py
Correct voxel raycast, voxel types, reflectance
dkl9
commited
dfcfe5f
at 2025-175 11:55:45
mapgen.py
Blame
History
Raw
from libs import * def smerp(ab, w): assert all([abs(x) < 2 for x in ab]) for i in range(w.shape[0]): ab = [a + w[i] ** 2 * (3 - 2 * w[i]) * (b - a) for (a, b) in zip(ab[::2], ab[1::2])] return ab[0] class MapGen: def __init__(self): self.grads = [{} for _ in range(4)] def perlin(self, name, pos, period): dim = pos.shape[0] gt = self.grads[dim].setdefault(name, {}) corner, fract = np.divmod(pos, period) fract /= period # https://stackoverflow.com/a/58827205 corners = np.arange(1 << dim)[:, None] >> np.arange(dim) & 1 dots = [] for c in corners: ci = tuple(np.add(c, corner, dtype=int, casting="unsafe")) cg = gt.setdefault(ci, normalise(np.random.normal(size=dim))) assert abs(np.linalg.norm(cg) - 1) < 1e-3 dots.append(np.dot(fract - c, cg)) return 2 * smerp(dots, fract) def world_natural(self, wr): n = 0 for i in range(wr.r): for j in range(wr.r): h = 8 + 4 * self.perlin("height", np.add(wr.pos[[0, 2]], (i, j)), np.array([10, 5])) for k in range(int(h)): wr.grid[i, k, j] = 3 n += 1 wr.grid[i, int(h), j] = 4 return n def world_min(self, wr): wr.add_voxel((0, 0, 0)) return 1 def world_grid(self, wr): n = 0 for i in range(0, wr.r, 2): for j in range(0, wr.r, 2): for k in range(0, wr.r, 2): wr.grid[i, j, k] = 1 n += 1 return n def world_checker(self, wr): n = 0 for i in range(wr.r): for j in range(wr.r): for k in range(wr.r): if not (i + j + k) % 2: wr.grid[i, j, k] = 1 n += 1 return n