// File: soybin[P]idyll/src/renderer.cpp
// Function: renderer::brdf(math::vec3, math::vec3)
math::vec3 renderer::brdf(math::vec3 direction, math::vec3 normal) {
	if (s->d(0.0, 1.0) > GLOSSINESS_CHANCE) {
		//
		// diffuse reflection without tangent thanks to Edd 
		// Biddulph:
		// http://www.amietia.com/lambertnotangent.html
		//
		double a = s->d(0.0, 1.0);
		double b = s->d(0.0, 1.0);
		// not an arbitrary number, it's pi * 2
		double theta = 6.283185 * a;
		b = 2.0 * b - 1.0;
		double bsqrt = std::sqrt(1.0 - b * b);
		math::vec3 point(bsqrt * cos(theta), bsqrt * sin(theta), b);
		return math::normalize(normal + point);
	} else {
		//
		// glossy reflection
		//
		math::vec3 reflection = math::reflect(direction, normal);
		double a = PI;
		double b = 2 * PI;
		math::vec3 uniformVector(std::sin(b) * std::sin(a), std::cos(b) * std::sin(a), std::cos(a));
		return math::normalize(reflection + uniformVector) * GLOSSINESS_AMOUNT;
	}

}

// Assembly:
pushq %rbp
movq %rsp, %rbp
subq $0x190, %rsp            # imm = 0x190
movq %rdi, -0x120(%rbp)
movq %rdi, -0x118(%rbp)
leaq 0x28(%rbp), %rax
movq %rax, -0x110(%rbp)
leaq 0x10(%rbp), %rax
movq %rax, -0x108(%rbp)
movq %rsi, -0x8(%rbp)
movq -0x8(%rbp), %rax
movq %rax, -0x100(%rbp)
movq 0xc8(%rax), %rdi
xorps %xmm0, %xmm0
movsd 0xeab0(%rip), %xmm1     # 0x1d670
callq 0x14f90
movq -0x100(%rbp), %rax
ucomisd 0x20(%rax), %xmm0
jbe 0xed30
movq -0x100(%rbp), %rax
movq 0xc8(%rax), %rdi
xorps %xmm0, %xmm0
movsd 0xea80(%rip), %xmm1     # 0x1d670
callq 0x14f90
movq -0x100(%rbp), %rax
movsd %xmm0, -0x10(%rbp)
movq 0xc8(%rax), %rdi
xorps %xmm0, %xmm0
movsd 0xea5d(%rip), %xmm1     # 0x1d670
callq 0x14f90
movsd %xmm0, -0x18(%rbp)
movsd 0xec83(%rip), %xmm0     # 0x1d8a8
mulsd -0x10(%rbp), %xmm0
movsd %xmm0, -0x20(%rbp)
movsd -0x18(%rbp), %xmm0
addsd %xmm0, %xmm0
movsd 0xec50(%rip), %xmm1     # 0x1d890
addsd %xmm1, %xmm0
movsd %xmm0, -0x18(%rbp)
movsd -0x18(%rbp), %xmm0
movsd -0x18(%rbp), %xmm1
movq %xmm0, %rax
movabsq $-0x8000000000000000, %rcx # imm = 0x8000000000000000
xorq %rcx, %rax
movq %rax, %xmm0
mulsd %xmm1, %xmm0
movsd 0xe9fa(%rip), %xmm1     # 0x1d670
addsd %xmm1, %xmm0
callq 0x42b0
movsd %xmm0, -0x28(%rbp)
movsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x138(%rbp)
movsd -0x20(%rbp), %xmm0
callq 0x4620
movaps %xmm0, %xmm1
movsd -0x138(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x128(%rbp)
movsd -0x28(%rbp), %xmm0
movsd %xmm0, -0x130(%rbp)
movsd -0x20(%rbp), %xmm0
callq 0x40a0
movsd -0x130(%rbp), %xmm1
movaps %xmm0, %xmm2
movsd -0x128(%rbp), %xmm0
mulsd %xmm2, %xmm1
movsd -0x18(%rbp), %xmm2
leaq -0x40(%rbp), %rdi
callq 0xbe30
movq -0x110(%rbp), %rsi
leaq -0x58(%rbp), %rdi
leaq -0x40(%rbp), %rdx
callq 0xbe70
movq -0x120(%rbp), %rdi
leaq -0x58(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0xc4d0
jmp 0xeee2
movq -0x110(%rbp), %rax
movq -0x108(%rbp), %rcx
movq (%rcx), %rdx
movq %rdx, -0x88(%rbp)
movq 0x8(%rcx), %rdx
movq %rdx, -0x80(%rbp)
movq 0x10(%rcx), %rcx
movq %rcx, -0x78(%rbp)
movq (%rax), %rcx
movq %rcx, -0xa0(%rbp)
movq 0x8(%rax), %rcx
movq %rcx, -0x98(%rbp)
movq 0x10(%rax), %rax
movq %rax, -0x90(%rbp)
leaq -0x70(%rbp), %rdi
leaq -0x88(%rbp), %rcx
leaq -0xa0(%rbp), %rax
movq (%rcx), %rdx
movq %rdx, (%rsp)
movq 0x8(%rcx), %rdx
movq %rdx, 0x8(%rsp)
movq 0x10(%rcx), %rcx
movq %rcx, 0x10(%rsp)
movq (%rax), %rcx
movq %rcx, 0x18(%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x20(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x28(%rsp)
callq 0xc7c0
movsd 0xeaae(%rip), %xmm0     # 0x1d878
movsd %xmm0, -0xa8(%rbp)
movsd 0xeac6(%rip), %xmm0     # 0x1d8a0
movsd %xmm0, -0xb0(%rbp)
movsd -0xb0(%rbp), %xmm0
callq 0x40a0
movsd %xmm0, -0x158(%rbp)
movsd -0xa8(%rbp), %xmm0
callq 0x40a0
movaps %xmm0, %xmm1
movsd -0x158(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x140(%rbp)
movsd -0xb0(%rbp), %xmm0
callq 0x4620
movsd %xmm0, -0x150(%rbp)
movsd -0xa8(%rbp), %xmm0
callq 0x40a0
movaps %xmm0, %xmm1
movsd -0x150(%rbp), %xmm0
mulsd %xmm1, %xmm0
movsd %xmm0, -0x148(%rbp)
movsd -0xa8(%rbp), %xmm0
callq 0x4620
movsd -0x148(%rbp), %xmm1
movaps %xmm0, %xmm2
movsd -0x140(%rbp), %xmm0
leaq -0xc8(%rbp), %rdi
callq 0xbe30
leaq -0xf8(%rbp), %rdi
leaq -0x70(%rbp), %rsi
leaq -0xc8(%rbp), %rdx
callq 0xbe70
leaq -0xe0(%rbp), %rdi
leaq -0xf8(%rbp), %rax
movq (%rax), %rcx
movq %rcx, (%rsp)
movq 0x8(%rax), %rcx
movq %rcx, 0x8(%rsp)
movq 0x10(%rax), %rax
movq %rax, 0x10(%rsp)
callq 0xc4d0
movq -0x100(%rbp), %rax
movq -0x120(%rbp), %rdi
movsd 0x28(%rax), %xmm0
leaq -0xe0(%rbp), %rsi
callq 0xbf90
movq -0x118(%rbp), %rax
addq $0x190, %rsp            # imm = 0x190
popq %rbp
retq
nopw %cs:(%rax,%rax)