// File: /workspace/github_cpp_makefile_star2_O3/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 %r15
pushq %r14
pushq %r12
pushq %rbx
subq $0x98, %rsp
movq %rsi, %r14
movq %rdi, %rbx
movb 0x4a5224(%rip), %al     # 0x4e6d10
testb %al, %al
je 0x41ca3
leaq 0x61345(%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 0x66c08(%rip), %rsi     # 0xa8740
movq %r15, %rdi
callq 0x2dbe4
movq %r15, %rdi
callq 0x403e0
testb $0x2, %r14b
je 0x41c31
movl $0x186a0, %esi          # imm = 0x186A0
btl $0x8, %r14d
jb 0x41b69
movl $0x186a1, %esi          # imm = 0x186A1
testb $0x20, %r14b
je 0x41b75
movq 0x4a5198(%rip), %rdi    # 0x4e6d08
callq 0xe1d0
movl %r14d, %esi
shrl $0x9, %esi
movq 0x4a5186(%rip), %rdi    # 0x4e6d08
andl $0x1, %esi
callq 0xe830
movq 0x4a5177(%rip), %rdi    # 0x4e6d08
movl $0x186ac, %esi          # imm = 0x186AC
callq 0xe770
movq 0x4a5166(%rip), %rdi    # 0x4e6d08
movsd 0x50(%rbx), %xmm2
movsd 0x78(%rbx), %xmm0
movsd 0xc0(%rbx), %xmm1
movl $0x10, %esi
movl $0x1, %edx
callq 0xe090
movq 0x4a513e(%rip), %rdi    # 0x4e6d08
movl $0x186b5, %esi          # imm = 0x186B5
callq 0xe150
movq 0x4a512d(%rip), %rdi    # 0x4e6d08
movsd 0x78(%rbx), %xmm1
xorps %xmm0, %xmm0
movl $0x10, %esi
movl $0x1, %edx
callq 0xe4b0
movq 0x4a510f(%rip), %rdi    # 0x4e6d08
movl $0x186b4, %esi          # imm = 0x186B4
callq 0xe150
movsd 0x50(%rbx), %xmm2
xorps %xmm0, %xmm0
xorps %xmm1, %xmm1
callq 0xe4a0
movq 0x4a50ee(%rip), %rdi    # 0x4e6d08
movsd 0x78(%rbx), %xmm1
xorps %xmm0, %xmm0
movl $0x10, %esi
movl $0x1, %edx
callq 0xe4b0
testb $0x1, %r14b
je 0x41c8f
movq 0x4a50ca(%rip), %rdi    # 0x4e6d08
movl $0x186a2, %esi          # imm = 0x186A2
callq 0xe1d0
movq 0x4a50b9(%rip), %rdi    # 0x4e6d08
xorl %esi, %esi
callq 0xe830
movq 0x4a50ab(%rip), %rdi    # 0x4e6d08
movl $0x186ad, %esi          # imm = 0x186AD
callq 0xe770
movq 0x4a509a(%rip), %rdi    # 0x4e6d08
movsd 0x50(%rbx), %xmm2
movsd 0x78(%rbx), %xmm0
movsd 0xc0(%rbx), %xmm1
movl $0x10, %esi
movl $0x1, %edx
callq 0xe090
callq 0xe850
addq $0x98, %rsp
popq %rbx
popq %r12
popq %r14
popq %r15
retq
leaq 0x4a5066(%rip), %rdi    # 0x4e6d10
callq 0xe810
testl %eax, %eax
je 0x41af4
callq 0xe500
movq %rax, 0x4a5045(%rip)    # 0x4e6d08
leaq 0x4a5046(%rip), %rdi    # 0x4e6d10
callq 0xe2e0
jmp 0x41af4
movq %rax, %rbx
leaq 0x4a5032(%rip), %rdi    # 0x4e6d10
callq 0xe2d0
movq %rbx, %rdi
callq 0xe7e0
nop