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)) }
func sampler(orig, dir vector.Vector) vector.Vector { st, dist, bounce := tracer(orig, dir) if st == missUpward { return vector.Vector{X: 0.7, Y: 0.6, Z: 1}.Scale(math.Pow(1-dir.Z, 4)) } h := orig.Add(dir.Scale(dist)) l := vector.Vector{X: 9 + Rand(), Y: 9 + Rand(), Z: 16}.Add(h.Scale(-1)).Normalize() r := dir.Add(bounce.Scale(bounce.DotProduct(dir.Scale(-2)))) b := l.DotProduct(bounce) if b < 0 { b = 0 } else { var st status if st, dist, bounce = tracer(h, l); st != missUpward { b = 0 } } var sf float64 if b > 0 { sf = 1.0 } p := math.Pow(l.DotProduct(r.Scale(sf)), 99) 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) } return vector.Vector{X: p, Y: p, Z: p}.Add(sampler(h, r).Scale(0.5)) }