// File: FreeSlave[P]vhlt/hlrad/mathutil.cpp
// Function: snap_to_winding(Winding const&, dplane_t const&, float*)
void			snap_to_winding(const Winding& w, const dplane_t& plane, vec_t* const point)
{
	int				numpoints;
	int				x;
	vec_t			*p1, *p2;
	vec3_t			delta;
	vec3_t			normal;
	vec_t			dist;
	vec_t			dot1, dot2, dot;
	vec3_t			bestpoint;
	vec_t			bestdist;
	bool			in;

	numpoints = w.m_NumPoints;

	in = true;
	for (x = 0; x < numpoints; x++)
	{
		p1 = w.m_Points[x];
		p2 = w.m_Points[(x + 1) % numpoints];
		VectorSubtract (p2, p1, delta);
		CrossProduct (delta, plane.normal, normal);
		dist = DotProduct (point, normal) - DotProduct (p1, normal);

		if (dist < 0.0)
		{
			in = false;

			CrossProduct (plane.normal, normal, delta);
			dot = DotProduct (delta, point);
			dot1 = DotProduct (delta, p1);
			dot2 = DotProduct (delta, p2);
			if (dot1 < dot && dot < dot2)
			{
				dist = dist / DotProduct (normal, normal);
				VectorMA (point, -dist, normal, point);
				return;
			}
		}
	}
	if (in)
	{
		return;
	}

	for (x = 0; x < numpoints; x++)
	{
		p1 = w.m_Points[x];
		VectorSubtract (p1, point, delta);
		dist = DotProduct (delta, plane.normal) / DotProduct (plane.normal, plane.normal);
		VectorMA (delta, -dist, plane.normal, delta);
		dot = DotProduct (delta, delta);

		if (x == 0 || dot < bestdist)
		{
			VectorAdd (point, delta, bestpoint);
			bestdist = dot;
		}
	}
	if (numpoints > 0)
	{
		VectorCopy (bestpoint, point);
	}
	return;
}

// Assembly:
movq %rdi, -0x8(%rsp)
movq %rsi, -0x10(%rsp)
movq %rdx, -0x18(%rsp)
movq -0x8(%rsp), %rax
movl 0x8(%rax), %eax
movl %eax, -0x1c(%rsp)
movb $0x1, -0x69(%rsp)
movl $0x0, -0x20(%rsp)
movl -0x20(%rsp), %eax
cmpl -0x1c(%rsp), %eax
jge 0x4a95f
movq -0x8(%rsp), %rax
movq 0x10(%rax), %rax
movslq -0x20(%rsp), %rcx
imulq $0xc, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x28(%rsp)
movq -0x8(%rsp), %rax
movq 0x10(%rax), %rax
movq %rax, -0x78(%rsp)
movl -0x20(%rsp), %eax
addl $0x1, %eax
cltd
idivl -0x1c(%rsp)
movq -0x78(%rsp), %rax
movslq %edx, %rcx
imulq $0xc, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x30(%rsp)
movq -0x30(%rsp), %rax
movss (%rax), %xmm0
movq -0x28(%rsp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x3c(%rsp)
movq -0x30(%rsp), %rax
movss 0x4(%rax), %xmm0
movq -0x28(%rsp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x38(%rsp)
movq -0x30(%rsp), %rax
movss 0x8(%rax), %xmm0
movq -0x28(%rsp), %rax
subss 0x8(%rax), %xmm0
movss %xmm0, -0x34(%rsp)
movss -0x38(%rsp), %xmm0
movq -0x10(%rsp), %rax
movss 0x8(%rax), %xmm2
movss -0x34(%rsp), %xmm1
movq -0x10(%rsp), %rax
mulss 0x4(%rax), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x48(%rsp)
movss -0x34(%rsp), %xmm0
movq -0x10(%rsp), %rax
movss (%rax), %xmm2
movss -0x3c(%rsp), %xmm1
movq -0x10(%rsp), %rax
mulss 0x8(%rax), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x44(%rsp)
movss -0x3c(%rsp), %xmm0
movq -0x10(%rsp), %rax
movss 0x4(%rax), %xmm2
movss -0x38(%rsp), %xmm1
movq -0x10(%rsp), %rax
mulss (%rax), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x40(%rsp)
movq -0x18(%rsp), %rax
movss (%rax), %xmm1
movss -0x48(%rsp), %xmm2
movq -0x18(%rsp), %rax
movss 0x4(%rax), %xmm0
mulss -0x44(%rsp), %xmm0
mulss %xmm2, %xmm1
addss %xmm0, %xmm1
movq -0x18(%rsp), %rax
movss 0x8(%rax), %xmm0
movss -0x40(%rsp), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x28(%rsp), %rax
movss (%rax), %xmm2
movss -0x48(%rsp), %xmm3
movq -0x28(%rsp), %rax
movss 0x4(%rax), %xmm1
mulss -0x44(%rsp), %xmm1
mulss %xmm3, %xmm2
addss %xmm1, %xmm2
movq -0x28(%rsp), %rax
movss 0x8(%rax), %xmm1
movss -0x40(%rsp), %xmm3
mulss %xmm3, %xmm1
addss %xmm2, %xmm1
subss %xmm1, %xmm0
movss %xmm0, -0x4c(%rsp)
movss -0x4c(%rsp), %xmm0
cvtss2sd %xmm0, %xmm1
xorps %xmm0, %xmm0
ucomisd %xmm1, %xmm0
jbe 0x4a94d
movb $0x0, -0x69(%rsp)
movq -0x10(%rsp), %rax
movss 0x4(%rax), %xmm0
movss -0x40(%rsp), %xmm2
movq -0x10(%rsp), %rax
movss 0x8(%rax), %xmm1
mulss -0x44(%rsp), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x3c(%rsp)
movq -0x10(%rsp), %rax
movss 0x8(%rax), %xmm0
movss -0x48(%rsp), %xmm2
movq -0x10(%rsp), %rax
movss (%rax), %xmm1
mulss -0x40(%rsp), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x38(%rsp)
movq -0x10(%rsp), %rax
movss (%rax), %xmm0
movss -0x44(%rsp), %xmm2
movq -0x10(%rsp), %rax
movss 0x4(%rax), %xmm1
mulss -0x48(%rsp), %xmm1
movd %xmm1, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm1
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x34(%rsp)
movss -0x3c(%rsp), %xmm1
movq -0x18(%rsp), %rax
movss (%rax), %xmm2
movss -0x38(%rsp), %xmm0
movq -0x18(%rsp), %rax
mulss 0x4(%rax), %xmm0
mulss %xmm2, %xmm1
addss %xmm0, %xmm1
movss -0x34(%rsp), %xmm0
movq -0x18(%rsp), %rax
movss 0x8(%rax), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x58(%rsp)
movss -0x3c(%rsp), %xmm1
movq -0x28(%rsp), %rax
movss (%rax), %xmm2
movss -0x38(%rsp), %xmm0
movq -0x28(%rsp), %rax
mulss 0x4(%rax), %xmm0
mulss %xmm2, %xmm1
addss %xmm0, %xmm1
movss -0x34(%rsp), %xmm0
movq -0x28(%rsp), %rax
movss 0x8(%rax), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x50(%rsp)
movss -0x3c(%rsp), %xmm1
movq -0x30(%rsp), %rax
movss (%rax), %xmm2
movss -0x38(%rsp), %xmm0
movq -0x30(%rsp), %rax
mulss 0x4(%rax), %xmm0
mulss %xmm2, %xmm1
addss %xmm0, %xmm1
movss -0x34(%rsp), %xmm0
movq -0x30(%rsp), %rax
movss 0x8(%rax), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x54(%rsp)
movss -0x50(%rsp), %xmm1
movss -0x58(%rsp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x4a94b
movss -0x58(%rsp), %xmm1
movss -0x54(%rsp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x4a94b
movss -0x4c(%rsp), %xmm0
movss -0x48(%rsp), %xmm2
movss -0x48(%rsp), %xmm3
movss -0x44(%rsp), %xmm1
mulss -0x44(%rsp), %xmm1
mulss %xmm3, %xmm2
addss %xmm1, %xmm2
movss -0x40(%rsp), %xmm1
movss -0x40(%rsp), %xmm3
mulss %xmm3, %xmm1
addss %xmm2, %xmm1
divss %xmm1, %xmm0
movss %xmm0, -0x4c(%rsp)
movq -0x18(%rsp), %rax
movss (%rax), %xmm1
movss -0x4c(%rsp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss -0x48(%rsp), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x18(%rsp), %rax
movss %xmm0, (%rax)
movq -0x18(%rsp), %rax
movss 0x4(%rax), %xmm1
movss -0x4c(%rsp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss -0x44(%rsp), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x18(%rsp), %rax
movss %xmm0, 0x4(%rax)
movq -0x18(%rsp), %rax
movss 0x8(%rax), %xmm1
movss -0x4c(%rsp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movss -0x40(%rsp), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x18(%rsp), %rax
movss %xmm0, 0x8(%rax)
jmp 0x4abf5
jmp 0x4a94d
jmp 0x4a94f
movl -0x20(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rsp)
jmp 0x4a4c8
testb $0x1, -0x69(%rsp)
je 0x4a96b
jmp 0x4abf5
movl $0x0, -0x20(%rsp)
movl -0x20(%rsp), %eax
cmpl -0x1c(%rsp), %eax
jge 0x4abbd
movq -0x8(%rsp), %rax
movq 0x10(%rax), %rax
movslq -0x20(%rsp), %rcx
imulq $0xc, %rcx, %rcx
addq %rcx, %rax
movq %rax, -0x28(%rsp)
movq -0x28(%rsp), %rax
movss (%rax), %xmm0
movq -0x18(%rsp), %rax
subss (%rax), %xmm0
movss %xmm0, -0x3c(%rsp)
movq -0x28(%rsp), %rax
movss 0x4(%rax), %xmm0
movq -0x18(%rsp), %rax
subss 0x4(%rax), %xmm0
movss %xmm0, -0x38(%rsp)
movq -0x28(%rsp), %rax
movss 0x8(%rax), %xmm0
movq -0x18(%rsp), %rax
subss 0x8(%rax), %xmm0
movss %xmm0, -0x34(%rsp)
movss -0x3c(%rsp), %xmm1
movq -0x10(%rsp), %rax
movss (%rax), %xmm2
movss -0x38(%rsp), %xmm0
movq -0x10(%rsp), %rax
mulss 0x4(%rax), %xmm0
mulss %xmm2, %xmm1
addss %xmm0, %xmm1
movss -0x34(%rsp), %xmm0
movq -0x10(%rsp), %rax
movss 0x8(%rax), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movq -0x10(%rsp), %rax
movss (%rax), %xmm2
movq -0x10(%rsp), %rax
movss (%rax), %xmm3
movq -0x10(%rsp), %rax
movss 0x4(%rax), %xmm1
movq -0x10(%rsp), %rax
mulss 0x4(%rax), %xmm1
mulss %xmm3, %xmm2
addss %xmm1, %xmm2
movq -0x10(%rsp), %rax
movss 0x8(%rax), %xmm1
movq -0x10(%rsp), %rax
movss 0x8(%rax), %xmm3
mulss %xmm3, %xmm1
addss %xmm2, %xmm1
divss %xmm1, %xmm0
movss %xmm0, -0x4c(%rsp)
movss -0x3c(%rsp), %xmm1
movss -0x4c(%rsp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movq -0x10(%rsp), %rax
movss (%rax), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x3c(%rsp)
movss -0x38(%rsp), %xmm1
movss -0x4c(%rsp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movq -0x10(%rsp), %rax
movss 0x4(%rax), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x38(%rsp)
movss -0x34(%rsp), %xmm1
movss -0x4c(%rsp), %xmm0
movd %xmm0, %eax
xorl $0x80000000, %eax       # imm = 0x80000000
movd %eax, %xmm0
movq -0x10(%rsp), %rax
movss 0x8(%rax), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x34(%rsp)
movss -0x3c(%rsp), %xmm1
movss -0x3c(%rsp), %xmm2
movss -0x38(%rsp), %xmm0
mulss -0x38(%rsp), %xmm0
mulss %xmm2, %xmm1
addss %xmm0, %xmm1
movss -0x34(%rsp), %xmm0
movss -0x34(%rsp), %xmm2
mulss %xmm2, %xmm0
addss %xmm1, %xmm0
movss %xmm0, -0x58(%rsp)
cmpl $0x0, -0x20(%rsp)
je 0x4ab5e
movss -0x58(%rsp), %xmm1
movss -0x68(%rsp), %xmm0
ucomiss %xmm1, %xmm0
jbe 0x4abab
movq -0x18(%rsp), %rax
movss (%rax), %xmm0
addss -0x3c(%rsp), %xmm0
movss %xmm0, -0x64(%rsp)
movq -0x18(%rsp), %rax
movss 0x4(%rax), %xmm0
addss -0x38(%rsp), %xmm0
movss %xmm0, -0x60(%rsp)
movq -0x18(%rsp), %rax
movss 0x8(%rax), %xmm0
addss -0x34(%rsp), %xmm0
movss %xmm0, -0x5c(%rsp)
movss -0x58(%rsp), %xmm0
movss %xmm0, -0x68(%rsp)
jmp 0x4abad
movl -0x20(%rsp), %eax
addl $0x1, %eax
movl %eax, -0x20(%rsp)
jmp 0x4a973
cmpl $0x0, -0x1c(%rsp)
jle 0x4abf3
movss -0x64(%rsp), %xmm0
movq -0x18(%rsp), %rax
movss %xmm0, (%rax)
movss -0x60(%rsp), %xmm0
movq -0x18(%rsp), %rax
movss %xmm0, 0x4(%rax)
movss -0x5c(%rsp), %xmm0
movq -0x18(%rsp), %rax
movss %xmm0, 0x8(%rax)
jmp 0x4abf5
retq
nopw %cs:(%rax,%rax)