// File: /workspace/github_cpp_makefile_star2_O2/tomfunkhouser[P]gaps/pkgs/R3Surfels/R3SurfelConstraint.cpp
// Function: gaps::R3SurfelPlanarGridConstraint::Check(gaps::R3Point const&) const
int R3SurfelPlanarGridConstraint::
Check(const R3Point& point) const
{
  // Check distance from point to plane
  RNLength offplane_distance = R3Distance(grid->Plane(), point);
  if (offplane_distance > max_offplane_distance) return R3_SURFEL_CONSTRAINT_FAIL;

  // Get grid value
  RNScalar grid_value = grid_operand;
  if (grid_value_type != R3_SURFEL_CONSTRAINT_OPERAND) grid_value = grid->WorldValue(point);
  if (grid_value == R2_GRID_UNKNOWN_VALUE) return R3_SURFEL_CONSTRAINT_FAIL;

  // Get surfel value
  RNScalar surfel_value = surfel_operand;
  if (surfel_value_type == R3_SURFEL_CONSTRAINT_X) surfel_value = point.X();
  else if (surfel_value_type == R3_SURFEL_CONSTRAINT_Y) surfel_value = point.Y();
  else if (surfel_value_type == R3_SURFEL_CONSTRAINT_Z) surfel_value = point.Z();

  // Compare values
  switch (comparison_type) {
  case R3_SURFEL_CONSTRAINT_NOT_EQUAL: 
    return (RNIsNotEqual(surfel_value, grid_value, epsilon)) ?
      R3_SURFEL_CONSTRAINT_PASS : R3_SURFEL_CONSTRAINT_FAIL;
  case R3_SURFEL_CONSTRAINT_EQUAL: 
    return (RNIsEqual(surfel_value, grid_value, epsilon)) ?
      R3_SURFEL_CONSTRAINT_PASS : R3_SURFEL_CONSTRAINT_FAIL;
  case R3_SURFEL_CONSTRAINT_GREATER: 
    return (RNIsGreater(surfel_value, grid_value, epsilon)) ?
      R3_SURFEL_CONSTRAINT_PASS : R3_SURFEL_CONSTRAINT_FAIL;
  case R3_SURFEL_CONSTRAINT_GREATER_OR_EQUAL: 
    return (RNIsGreaterOrEqual(surfel_value, grid_value, epsilon)) ?
      R3_SURFEL_CONSTRAINT_PASS : R3_SURFEL_CONSTRAINT_FAIL;
  case R3_SURFEL_CONSTRAINT_LESS: 
    return (RNIsLess(surfel_value, grid_value, epsilon)) ?
      R3_SURFEL_CONSTRAINT_PASS : R3_SURFEL_CONSTRAINT_FAIL;
  case R3_SURFEL_CONSTRAINT_LESS_OR_EQUAL: 
    return (RNIsLessOrEqual(surfel_value, grid_value, epsilon)) ?
      R3_SURFEL_CONSTRAINT_PASS : R3_SURFEL_CONSTRAINT_FAIL;
  }

  // Did not pass test
  return R3_SURFEL_CONSTRAINT_FAIL;
}

// Assembly:
pushq %r15
pushq %r14
pushq %rbx
movq %rsi, %r15
movq %rdi, %r14
movq 0x8(%rdi), %rsi
movq %r15, %rdi
callq 0x49786
xorl %ebx, %ebx
ucomisd 0x10(%r14), %xmm0
ja 0x2dd50
cmpl $0x0, 0x20(%r14)
je 0x2dc42
movq 0x8(%r14), %rdi
movq %r15, %rsi
callq 0x2ed44
jmp 0x2dc48
movsd 0x30(%r14), %xmm0
ucomisd 0x9b640(%rip), %xmm0    # 0xc9290
jne 0x2dc58
jnp 0x2dd50
movl 0x1c(%r14), %eax
cmpl $0x4, %eax
je 0x2dc77
cmpl $0x3, %eax
je 0x2dc71
cmpl $0x2, %eax
je 0x2dc7b
leaq 0x28(%r14), %r15
jmp 0x2dc7b
addq $0x8, %r15
jmp 0x2dc7b
addq $0x10, %r15
movl 0x18(%r14), %eax
cmpq $0x5, %rax
ja 0x2dd50
movsd (%r15), %xmm1
leaq 0x9b61b(%rip), %rcx     # 0xc92b0
movslq (%rcx,%rax,4), %rax
addq %rcx, %rax
jmpq *%rax
movsd 0x38(%r14), %xmm2
subsd %xmm0, %xmm1
movapd 0x9a6f0(%rip), %xmm0    # 0xc83a0
xorpd %xmm2, %xmm0
xorl %eax, %eax
ucomisd %xmm1, %xmm0
seta %al
addl %eax, %eax
ucomisd %xmm2, %xmm1
pushq $0x2
popq %rbx
cmovbel %eax, %ebx
jmp 0x2dd50
movsd 0x38(%r14), %xmm2
xorpd 0x9a6c4(%rip), %xmm2    # 0xc83a0
subsd %xmm0, %xmm1
xorl %ebx, %ebx
ucomisd %xmm1, %xmm2
jmp 0x2dcf4
subsd %xmm0, %xmm1
xorl %ebx, %ebx
ucomisd 0x38(%r14), %xmm1
seta %bl
jmp 0x2dd4e
subsd %xmm0, %xmm1
movsd 0x38(%r14), %xmm0
xorpd 0x9a695(%rip), %xmm0    # 0xc83a0
xorl %ebx, %ebx
ucomisd %xmm0, %xmm1
jmp 0x2dd4b
movsd 0x38(%r14), %xmm2
subsd %xmm0, %xmm1
xorl %eax, %eax
ucomisd %xmm1, %xmm2
setae %al
xorpd 0x9a672(%rip), %xmm2    # 0xc83a0
addl %eax, %eax
xorl %ebx, %ebx
ucomisd %xmm2, %xmm1
cmovael %eax, %ebx
jmp 0x2dd50
movsd 0x38(%r14), %xmm2
subsd %xmm0, %xmm1
xorl %ebx, %ebx
ucomisd %xmm1, %xmm2
setae %bl
addl %ebx, %ebx
movl %ebx, %eax
popq %rbx
popq %r14
popq %r15
retq