// File: /workspace/github_cpp_makefile_star2_O3/tomfunkhouser[P]gaps/pkgs/R3Shapes/R3Draw.cpp
// Function: gaps::R3Cone::Draw(gaps::RNFlags) const
void R3Cone::
Draw(const R3DrawFlags draw_flags) const
{
#if (RN_3D_GRFX == RN_OPENGL)
    // Create GLU quadric
    // Should create GLU quadric for each draw style ???
    static GLUquadricObj *cone = gluNewQuadric(); 

    // Push matrix
    R4Matrix matrix = R4identity_matrix;
    matrix.Translate(axis.Start().Vector());
    matrix.Rotate(R3posz_vector, axis.Vector());
    matrix.Push();

    // Draw surface
    if (draw_flags[R3_SURFACES_DRAW_FLAG]) {
	if (draw_flags[R3_VERTEX_NORMALS_DRAW_FLAG]) gluQuadricNormals(cone, (GLenum) GLU_SMOOTH);
	else if (draw_flags[R3_SURFACE_NORMALS_DRAW_FLAG]) gluQuadricNormals(cone, (GLenum) GLU_FLAT);
	if (draw_flags[R3_VERTEX_TEXTURE_COORDS_DRAW_FLAG]) gluQuadricTexture(cone, GL_TRUE);
	else gluQuadricTexture(cone, GL_FALSE);
	gluQuadricDrawStyle(cone, (GLenum) GLU_FILL);
	gluCylinder(cone, Radius(), 0.0, Height(), 16, 1);
	gluQuadricOrientation(cone, (GLenum) GLU_INSIDE);
	gluDisk(cone, 0.0, Radius(), 16, 1);
	gluQuadricOrientation(cone, (GLenum) GLU_OUTSIDE);
    }

    // Draw edges
    if (draw_flags[R3_EDGES_DRAW_FLAG]) {
	gluQuadricNormals(cone, (GLenum) GLU_NONE);
	gluQuadricTexture(cone, GL_FALSE);
	gluQuadricDrawStyle(cone, (GLenum) GLU_SILHOUETTE);
	gluCylinder(cone, Radius(), 0.0, Height(), 16, 1);
    }

    // Pop matrix
    matrix.Pop();
#else
    RNAbort("Not Implemented");
#endif
}

// Assembly:
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x98, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movb 0x4a501a(%rip), %al     # 0x4e6d20
testb %al, %al
je 0x41e85
leaq 0x6112b(%rip), %rsi     # 0xa2e40
leaq 0x18(%rsp), %r15
movq %r15, %rdi
callq 0x2c2be
movsd 0x8(%rbx), %xmm0
movsd 0x10(%rbx), %xmm1
movsd 0x18(%rbx), %xmm2
movq %rsp, %r12
movq %r12, %rdi
callq 0x3cfc6
movq %r15, %rdi
movq %r12, %rsi
callq 0x2d3f8
leaq 0x20(%rbx), %rdx
leaq 0x669ee(%rip), %rsi     # 0xa8740
movq %r15, %rdi
callq 0x2dbe4
movq %r15, %rdi
callq 0x403e0
testb $0x2, %r14b
je 0x41e18
movl $0x186a0, %esi          # imm = 0x186A0
btl $0x8, %r14d
jb 0x41d83
movl $0x186a1, %esi          # imm = 0x186A1
testb $0x20, %r14b
je 0x41d8f
movq 0x4a4f8e(%rip), %rdi    # 0x4e6d18
callq 0xe1d0
movl %r14d, %esi
shrl $0x9, %esi
movq 0x4a4f7c(%rip), %rdi    # 0x4e6d18
andl $0x1, %esi
callq 0xe830
movq 0x4a4f6d(%rip), %rdi    # 0x4e6d18
movl $0x186ac, %esi          # imm = 0x186AC
callq 0xe770
movq 0x4a4f5c(%rip), %rdi    # 0x4e6d18
movsd 0x50(%rbx), %xmm2
movsd 0x78(%rbx), %xmm0
xorps %xmm1, %xmm1
movl $0x10, %esi
movl $0x1, %edx
callq 0xe090
movq 0x4a4f39(%rip), %rdi    # 0x4e6d18
movl $0x186b5, %esi          # imm = 0x186B5
callq 0xe150
movq 0x4a4f28(%rip), %rdi    # 0x4e6d18
movsd 0x78(%rbx), %xmm1
xorps %xmm0, %xmm0
movl $0x10, %esi
movl $0x1, %edx
callq 0xe4b0
movq 0x4a4f0a(%rip), %rdi    # 0x4e6d18
movl $0x186b4, %esi          # imm = 0x186B4
callq 0xe150
testb $0x1, %r14b
je 0x41e71
movq 0x4a4ef3(%rip), %rdi    # 0x4e6d18
movl $0x186a2, %esi          # imm = 0x186A2
callq 0xe1d0
movq 0x4a4ee2(%rip), %rdi    # 0x4e6d18
xorl %esi, %esi
callq 0xe830
movq 0x4a4ed4(%rip), %rdi    # 0x4e6d18
movl $0x186ad, %esi          # imm = 0x186AD
callq 0xe770
movq 0x4a4ec3(%rip), %rdi    # 0x4e6d18
movsd 0x50(%rbx), %xmm2
movsd 0x78(%rbx), %xmm0
xorps %xmm1, %xmm1
movl $0x10, %esi
movl $0x1, %edx
callq 0xe090
callq 0xe850
addq $0x98, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
leaq 0x4a4e94(%rip), %rdi    # 0x4e6d20
callq 0xe810
testl %eax, %eax
je 0x41d0e
callq 0xe500
movq %rax, 0x4a4e73(%rip)    # 0x4e6d18
leaq 0x4a4e74(%rip), %rdi    # 0x4e6d20
callq 0xe2e0
jmp 0x41d0e
movq %rax, %rbx
leaq 0x4a4e60(%rip), %rdi    # 0x4e6d20
callq 0xe2d0
movq %rbx, %rdi
callq 0xe7e0
nop