func sampler(orig, dir vector.Vector, seed *uint32) vector.Vector { st, dist, bounce := tracer(orig, dir) obounce := bounce if st == missUpward { p := 1 - dir.Z p = p * p p = p * p return vector.Vector{X: 0.7, Y: 0.6, Z: 1}.Scale(p) } h := orig.Add(dir.Scale(dist)) l := vector.Vector{X: 9 + rnd(seed), Y: 9 + rnd(seed), Z: 16}.Add(h.Scale(-1)).Normalize() b := l.DotProduct(bounce) sf := 1.0 if b < 0 { b = 0 sf = 0 } else { var st status if st, dist, bounce = tracer(h, l); st != missUpward { b = 0 sf = 0 } } if st == missDownward { h = h.Scale(0.2) fc := vector.Vector{X: 3, Y: 3, Z: 3} if int(math.Ceil(h.X)+math.Ceil(h.Y))&1 == 1 { fc = vector.Vector{X: 3, Y: 1, Z: 1} } return fc.Scale(b*0.2 + 0.1) } r := dir.Add(obounce.Scale(obounce.DotProduct(dir.Scale(-2)))) p := l.DotProduct(r.Scale(sf)) p33 := p * p // p ** 2 p33 = p33 * p33 // p ** 4 p33 = p33 * p33 // p ** 8 p33 = p33 * p33 // p ** 16 p33 = p33 * p33 // p ** 32 p33 = p33 * p // p ** 33 p = p33 * p33 * p33 return vector.Vector{X: p, Y: p, Z: p}.Add(sampler(h, r, seed).Scale(0.5)) }