def render(self, target: np.array, z_buffer: np.array, mesh: Mesh, **uniforms): positions, outputs = self.vertex_shader(mesh.vertices, mesh.vertex_normals, uniforms) screen = get_screen(to_clip(positions), resolution(target)) z_buffer.fill(np.inf) for face in mesh.faces: varying = {k: v[face] for k, v in outputs.items()} draw_triangle( target, z_buffer, screen[face], self.fragment_shader, varying)
def Split(self, data: np.array, outer: np.array, middle: np.array, inner: np.array, height: int, width: int): assert len(data.shape) >= 2 assert len(outer.shape) >= 2 assert len(middle.shape) >= 2 assert len(inner.shape) >= 2 s0 = max(0, math.floor((data.shape[0] - height) / 2)) s1 = max(0, math.floor((data.shape[1] - width) / 2)) e0 = min(data.shape[0], math.ceil((data.shape[0] + height) / 2)) e1 = min(data.shape[1], math.ceil((data.shape[1] + width) / 2)) np.resize(outer, data.shape) np.resize(middle, data.shape) np.resize(inner, data.shape) outer.fill(0) middle.fill(0) inner.fill(0) inner[s0:e0, s1:e1] = data[s0:e0, s1:e1] outer[:s0, :s1] = data[:s0, :s1] outer[:s0, e1:] = data[:s0, e1:] outer[e0:, :s1] = data[e0:, :s1] outer[e0:, e1:] = data[e0:, e1:] middle[:s0, s1:e1] = data[:s0, s1:e1] middle[e0:, s1:e1] = data[e0:, s1:e1] middle[s0:e0, :s1] = data[s0:e0, :s1] middle[s0:e0, e1:] = data[s0:e0, e1:]
def normalize(self, item: np.array): if np.max(item) - np.min(item) != 0: return np.divide(item + np.min(item), np.max(item) - np.min(item)) else: item.fill(1) return item