fscene.f
上传用户:xk288cn
上传日期:2007-05-28
资源大小:4876k
文件大小:3k
源码类别:

GIS编程

开发平台:

Visual C++

  1. C  Copyright (c) Mark J. Kilgard, 1994.
  2. C  This program is freely distributable without licensing fees
  3. C  and is provided without guarantee or warrantee expressed or
  4. C  implied.  This program is -not- in the public domain.
  5. C  GLUT Fortran program to render simple red scene.
  6. subroutine display
  7. #include "GL/fgl.h"
  8. call fglclear(GL_COLOR_BUFFER_BIT + GL_DEPTH_BUFFER_BIT)
  9. call fglpushmatrix
  10. call fglscalef(1.3, 1.3, 1.3)
  11. call fglrotatef(20.0, 1.0, 0.0, 0.0)
  12. call fglpushmatrix
  13. call fgltranslatef(-0.75, 0.5, 0.0)
  14. call fglrotatef(90.0, 1.0, 0.0, 0.0)
  15. call glutsolidtorus(dble(0.275), dble(0.85), 10, 15)
  16. call fglpopmatrix
  17. call fglpushmatrix
  18. call fgltranslatef(-0.75, -0.5, 0.0)
  19. call fglrotatef(270.0, 1.0, 0.0, 0.0)
  20. call glutsolidtetrahedron
  21. call fglpopmatrix
  22. call fglpushmatrix
  23. call fgltranslatef(0.75, 0.0, -1.0)
  24. call glutsolidicosahedron
  25. call fglpopmatrix
  26. call fglpopmatrix
  27. call fglflush
  28. end
  29. subroutine reshape(w,h)
  30. #include "GL/fgl.h"
  31. integer w,h
  32. real wr,hr
  33. real*8 d
  34. call fglviewport(0, 0, w, h)
  35. call fglmatrixmode(GL_PROJECTION)
  36. call fglloadidentity
  37. wr = w
  38. hr = h
  39. d = 1.0
  40. if ( w .le. h ) then
  41.    call fglortho(dble(-2.5), dble(2.5),
  42.      2       dble(-2.5 * hr/wr), dble(2.5 * hr/wr),
  43.      3       dble(-10.0), dble(10.0))
  44. else
  45.    call fglortho(dble(-2.5 * hr/wr), dble(2.5 * hr/wr),
  46.      2       dble(-2.5), dble(2.5), dble(-10.0), dble(10.0))
  47. end if
  48. call fglmatrixmode(GL_MODELVIEW)
  49. end
  50. subroutine submenu(value)
  51. #include "GL/fgl.h"
  52. integer value
  53. if ( value .eq. 1 ) then
  54.   call fglenable(GL_DEPTH_TEST)
  55.   call fglenable(GL_LIGHTING)
  56.   call fgldisable(GL_BLEND)
  57.   call fglpolygonmode(GL_FRONT_AND_BACK, GL_FILL)
  58.         else
  59.   call fgldisable(GL_DEPTH_TEST)
  60.   call fgldisable(GL_LIGHTING)
  61.   call fglcolor3f(1.0, 1.0, 1.0)
  62.   call fglpolygonmode(GL_FRONT_AND_BACK, GL_LINE)
  63.   call fglenable(GL_LINE_SMOOTH)
  64.   call fglenable(GL_BLEND)
  65.   call fglblendfunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA)
  66. end if
  67. call glutpostredisplay
  68. end
  69. subroutine mainmenu(value)
  70. integer value
  71. call exit(1)
  72. end
  73. subroutine myinit
  74. #include "GL/fgl.h"
  75. real lambient(4), ldiffuse(4), lspecular(4), lposition(4)
  76. data lambient /0.0, 0.0, 0.0, 1.0/
  77. data ldiffuse /1.0, 0.0, 0.0, 1.0/
  78. data lspecular /1.0, 1.0, 1.0, 1.0/
  79. data lposition /1.0, 1.0, 1.0, 0.0/
  80. call fgllightfv(GL_LIGHT0, GL_AMBIENT, lambient)
  81. call fgllightfv(GL_LIGHT0, GL_DIFFUSE, ldiffuse)
  82. call fgllightfv(GL_LIGHT0, GL_SPECULAR, lspecular)
  83. call fgllightfv(GL_LIGHT0, GL_POSITION, lposition)
  84. call fglenable(GL_LIGHT0)
  85. call fgldepthfunc(GL_LESS)
  86. call fglenable(GL_DEPTH_TEST)
  87. call fglenable(GL_LIGHTING)
  88. end
  89. program main
  90. #include "GL/fglut.h"
  91. external display
  92. external reshape
  93. external submenu
  94. external mainmenu
  95. integer win, menu
  96. call glutinitwindowposition(500,500)
  97. call glutinitwindowsize(500,500)
  98. call glutinit
  99. win =  glutcreatewindow('Fortran GLUT program')
  100. call myinit
  101. call glutdisplayfunc(display)
  102. call glutreshapefunc(reshape)
  103. i = glutcreatemenu(submenu)
  104. call glutaddmenuentry('Filled', 1)
  105. call glutaddmenuentry('Outline', 2)
  106. menu = glutcreatemenu(mainmenu)
  107. call glutaddsubmenu('Polygon mode', i)
  108. call glutaddmenuentry('Quit', 666)
  109. call glutattachmenu(GLUT_RIGHT_BUTTON)
  110. call glutmainloop
  111. end