// File: /workspace/github_cpp_makefile_star2_O2/tomfunkhouser[P]gaps/pkgs/R3Shapes/R3Draw.cpp
// Function: gaps::R3Cylinder::Draw(gaps::RNFlags) const
void R3Cylinder::
Draw(const R3DrawFlags draw_flags) const
{
#if (RN_3D_GRFX == RN_OPENGL)
    // Create GLU quadric
    static GLUquadricObj *cylinder = 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(cylinder, (GLenum) GLU_SMOOTH);
	else if (draw_flags[R3_SURFACE_NORMALS_DRAW_FLAG]) gluQuadricNormals(cylinder, (GLenum) GLU_FLAT);
	if (draw_flags[R3_VERTEX_TEXTURE_COORDS_DRAW_FLAG]) gluQuadricTexture(cylinder, GL_TRUE);
	else gluQuadricTexture(cylinder, GL_FALSE);
	gluQuadricDrawStyle(cylinder, (GLenum) GLU_FILL);
	gluCylinder(cylinder, base.Radius(), top.Radius(), Height(), 16, 1);
	gluQuadricOrientation(cylinder, (GLenum) GLU_INSIDE);
	gluDisk(cylinder, 0.0, Radius(), 16, 1);
	gluQuadricOrientation(cylinder, (GLenum) GLU_OUTSIDE);
	glTranslated(0.0, 0.0, Height());
	gluDisk(cylinder, 0.0, Radius(), 16, 1);
    }

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

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

// Assembly:
pushq %rbp
pushq %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0xa0, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movb 0x49f64d(%rip), %al     # 0x4dbd20
testb %al, %al
je 0x3c876
leaq 0x5770e(%rip), %rsi     # 0x93df0
leaq 0x20(%rsp), %r15
movq %r15, %rdi
callq 0x2967c
leaq 0x8(%rbx), %rsi
leaq 0x8(%rsp), %r12
movq %r12, %rdi
callq 0x212f8
movq %r15, %rdi
movq %r12, %rsi
callq 0x2a5cc
leaq 0x20(%rbx), %rdx
leaq 0x5cfda(%rip), %rsi     # 0x996f0
movq %r15, %rdi
callq 0x2aa9a
movq %r15, %rdi
callq 0x3b398
testb $0x2, %r14b
je 0x3c807
movl $0x186a0, %esi          # imm = 0x186A0
btl $0x8, %r14d
jb 0x3c747
movl $0x186a1, %esi          # imm = 0x186A1
testb $0x20, %r14b
je 0x3c753
movq 0x49f5ca(%rip), %rdi    # 0x4dbd18
callq 0xe1d0
movl %r14d, %esi
shrl $0x9, %esi
movq 0x49f5b8(%rip), %rdi    # 0x4dbd18
andl $0x1, %esi
callq 0xe860
movq 0x49f5a9(%rip), %rdi    # 0x4dbd18
movl $0x186ac, %esi          # imm = 0x186AC
callq 0xe7a0
movq 0x49f598(%rip), %rdi    # 0x4dbd18
movsd 0x50(%rbx), %xmm2
movsd 0x78(%rbx), %xmm0
movsd 0xc0(%rbx), %xmm1
pushq $0x10
popq %rbp
pushq $0x1
popq %r15
movl %ebp, %esi
movl %r15d, %edx
callq 0xe090
movq 0x49f56e(%rip), %rdi    # 0x4dbd18
movl $0x186b5, %esi          # imm = 0x186B5
callq 0xe150
movq 0x49f55d(%rip), %rdi    # 0x4dbd18
movsd 0x78(%rbx), %xmm1
xorps %xmm0, %xmm0
movl %ebp, %esi
movl %r15d, %edx
callq 0xe4d0
movq 0x49f544(%rip), %rdi    # 0x4dbd18
movl $0x186b4, %esi          # imm = 0x186B4
callq 0xe150
movsd 0x50(%rbx), %xmm2
xorps %xmm0, %xmm0
xorps %xmm1, %xmm1
callq 0xe4c0
movq 0x49f523(%rip), %rdi    # 0x4dbd18
movsd 0x78(%rbx), %xmm1
xorps %xmm0, %xmm0
movl %ebp, %esi
movl %r15d, %edx
callq 0xe4d0
testb $0x1, %r14b
je 0x3c861
movq 0x49f504(%rip), %rdi    # 0x4dbd18
movl $0x186a2, %esi          # imm = 0x186A2
callq 0xe1d0
movq 0x49f4f3(%rip), %rdi    # 0x4dbd18
xorl %esi, %esi
callq 0xe860
movq 0x49f4e5(%rip), %rdi    # 0x4dbd18
movl $0x186ad, %esi          # imm = 0x186AD
callq 0xe7a0
movq 0x49f4d4(%rip), %rdi    # 0x4dbd18
movsd 0x50(%rbx), %xmm2
movsd 0x78(%rbx), %xmm0
movsd 0xc0(%rbx), %xmm1
pushq $0x10
popq %rsi
pushq $0x1
popq %rdx
callq 0xe090
callq 0xe880
addq $0xa0, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
popq %rbp
retq
leaq 0x49f4a3(%rip), %rdi    # 0x4dbd20
callq 0xe840
testl %eax, %eax
je 0x3c6db
callq 0xe520
movq %rax, 0x49f482(%rip)    # 0x4dbd18
leaq 0x49f483(%rip), %rdi    # 0x4dbd20
callq 0xe2f0
jmp 0x3c6db
movq %rax, %rbx
leaq 0x49f46f(%rip), %rdi    # 0x4dbd20
callq 0xe2e0
movq %rbx, %rdi
callq 0xe810