Отсечения в OpenGL

Тема в разделе "WASM.OpenGL", создана пользователем fastmod, 5 апр 2007.

  1. fastmod

    fastmod New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2007
    Сообщения:
    7
    Помогите разобраться...
    Последовательно рисуются 4 сферы с помощью gluSphere. Т.к. gluSphere рисует объект в центре, то каждая сфера сдвигается командой glTranslatef. В итоге получаются 4 рядом стоящие сферы. И мне надо, чтобы плоскость сечения отсекала у всей общей картины (например одну из сфер). Но если задать плоскость glClipPlane(GL_CLIP_PLANE0, equation); и включить её до рисования сфер, то отсекается кусок у каждой сферы а не у всей картины. После рисования сфер включение плоскости ничего не дает. Как мне выйти из ситуации?
     
  2. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    А в штатный масмовский екзампл заглядывал? там вроде отсечение выскочивших "перед экраном" сфер идёт как надо :)
     
  3. fastmod

    fastmod New Member

    Публикаций:
    0
    Регистрация:
    5 апр 2007
    Сообщения:
    7
    нет не смотрел, где взять?
    Для внесения большей ясности, код генерирования DL рисования сфер:

    oList = glGenLists(1);
    glNewList(oList, GL_COMPILE);
    for (index=0; index<automataList.count(); index++) {
    glPushMatrix();
    glTranslatef( points[index].x, points[index].y, points[index].z );
    gluSphere(qobj, aRadius, aSlices, aStacks);
    glPopMatrix();
    }
    glEndList();

    Вопрос такой: можно ли нарисовать это без использования glTranslatef или можно ли отсечь у уже нарисованой сцены?
     
  4. Y_Mur

    Y_Mur Active Member

    Публикаций:
    0
    Регистрация:
    6 сен 2006
    Сообщения:
    2.494
    Это слегка изменённый пример, входящий в комплект пакета MASM32
    Надеюсь я правильно понял задачу?
    Код (Text):
    1. ; ------------------------------------------
    2. ; Title: OpenGL test
    3. ;
    4. ; Author: Franck Charlet.
    5. ;
    6. ; Notes: Just a little example on how to use OpenGL.
    7. ;    Needs OpenGl32.dll and Glu32.dll (should be no problem).
    8. ;    Object have 2112 faces / 3 (weird) moving light sources
    9. ;    and it's f***ing slow on my cyrix 133.
    10. ;
    11. ; ------------------------------------------
    12.  
    13. ; --------------- Assembler directives
    14.             .386
    15.                 .model  flat,stdcall
    16.             option  casemap:none  
    17.  
    18. ; --------------- External includes
    19.             include D:\masm32\include\windows.inc
    20.             include D:\masm32\win32\user32.inc
    21.             include D:\masm32\win32\kernel32.inc
    22.             include D:\masm32\win32\gdi32.inc
    23.             include D:\masm32\win32\opengl32.inc
    24.             include D:\masm32\win32\glu32.inc
    25.  
    26. ;           includelib \masm32\lib\user32.lib
    27. ;           includelib \masm32\lib\kernel32.lib
    28. ;           includelib \masm32\lib\gdi32.lib
    29. ;           includelib \masm32\lib\gdi32.lib
    30. ;           includelib \masm32\lib\opengl32.lib
    31. ;           includelib \masm32\lib\glu32.lib
    32.  
    33. ; --------------- Macros Section
    34. szText          MACRO   Name,Text:VARARG
    35.             LOCAL   lbl
    36.             jmp lbl
    37. Name            db  Text,0
    38. lbl:
    39.             ENDM
    40.  
    41. m2m         MACRO   M1, M2
    42.             push    M2
    43.             pop M1
    44.             ENDM
    45.  
    46. return          MACRO   arg
    47.             mov eax,arg
    48.             ret
    49.             ENDM
    50.  
    51. ; --------------- These constants are not defined in windows.inc
    52. PFD_MAIN_PLANE      equ 0
    53. PFD_TYPE_COLORINDEX equ 1
    54. PFD_TYPE_RGBA       equ 0
    55. PFD_DOUBLEBUFFER    equ 1
    56. PFD_DRAW_TO_WINDOW  equ 4
    57. PFD_SUPPORT_OPENGL  equ 020h
    58.  
    59. ; --------------- Data Section
    60.             .data
    61. szDisplayName       db  "TestOpenGL - Written by Franck 'hitchhikr' Charlet.", 0
    62.             even
    63. PixFrm          PIXELFORMATDESCRIPTOR <>
    64.  
    65. CommandLine     dd  0
    66. hWnd            dd  0
    67. MainHDC         dd  0
    68. OpenDC          dd  0
    69. hInstance       dd  0
    70.  
    71. ; Some values
    72. Value0Flt       dd  0.0
    73. Value1Flt       dd  1.0
    74. Value1Dbl       dq  1.0
    75. Value45Dbl      dq  45.0
    76. Value3Dbl       dq  3.0
    77. Value7Dbl       dq  7.0
    78.  
    79. ; Light position
    80. LightSourcePosition dd  -2.0,-2.0,-4.0,0.0
    81. LightSource2Position    dd  2.0,2.0,4.0,0.0
    82. LightSource3Position    dd  -2.0,2.0,4.0,0.0
    83. LightAmbient        dd  0.2,0.0,0.0,1.0
    84. Light2Ambient       dd  0.0,0.2,0.0,1.0
    85. Light3Ambient       dd  0.0,0.0,0.2,1.0
    86. LightDiffuse        dd  1.0,1.0,1.0,1.0
    87. LightSpecular       dd  1.0,1.0,1.0,1.0
    88. SpotCut         dd  -1.0
    89. SpotExp         dd  0.0
    90. SpotDir         dd  -1.0,-1.0,-1.0
    91. LightConstAtt       dd  1.0
    92. LightLinAtt     dd  1.0
    93. LightQuadAtt        dd  1.0
    94.  
    95. ; --- Sphere 1
    96. ; Angles
    97. Sphere1AnglesFlt    dd  0.0,0.0,0.0
    98. ; Rotations speed
    99. Sphere1AnglesSpeedFlt   dd  -1.0,-1.2,-1.4
    100. ; Objects datas
    101. Sphere1Color        dd  0.6,0.4,0.2,0.0
    102. Sphere1Radius       dq  1.0
    103. sphere1Parts        dd  24
    104. Sphere1Position     dd  0.0,0.0,-3.750
    105. GlSphere1       dd  0
    106.  
    107. ; --- Sphere 2
    108. ; Angles
    109. Sphere2AnglesFlt    dd  0.0,0.0,0.0
    110. ; Rotations speed
    111. Sphere2AnglesSpeedFlt   dd  -1.0,0.8,-0.4
    112. ; Objects datas
    113. Sphere2Color        dd  0.4,0.6,0.2,0.0
    114. Sphere2Radius       dq  0.3
    115. sphere2Parts        dd  16
    116. Sphere2Position     dd  0.0,0.0,-1.5
    117. GlSphere2       dd  0
    118.  
    119. ; --- Sphere 3
    120. ; Angles
    121. Sphere3AnglesFlt    dd  0.0,0.0,0.0
    122. ; Rotations speed
    123. Sphere3AnglesSpeedFlt   dd  -1.0,-0.8,1.4
    124. ; Objects datas
    125. Sphere3Color        dd  0.2,0.4,0.6,0.0
    126. Sphere3Radius       dq  0.3
    127. sphere3Parts        dd  16
    128. Sphere3Position     dd  0.0,0.0,1.5
    129. GlSphere3       dd  0
    130.  
    131. ; --- Sphere 4
    132. ; Angles
    133. Sphere4AnglesFlt    dd  0.0,0.0,0.0
    134. ; Rotations speed
    135. Sphere4AnglesSpeedFlt   dd  -1.0,1.4,-0.8
    136. ; Objects datas
    137. Sphere4Color        dd  0.4,0.2,0.6,0.0
    138. Sphere4Radius       dq  0.3
    139. sphere4Parts        dd  16
    140. Sphere4Position     dd  0.0,1.5,0.0
    141. GlSphere4       dd  0
    142.  
    143. ; --- Sphere 5
    144. ; Angles
    145. Sphere5AnglesFlt    dd  0.0,0.0,0.0
    146. ; Rotations speed
    147. Sphere5AnglesSpeedFlt   dd  1.0,1.8,0.8
    148. ; Objects datas
    149. Sphere5Color        dd  0.6,0.2,0.4,0.0
    150. Sphere5Radius       dq  0.3
    151. sphere5Parts        dd  16
    152. Sphere5Position     dd  1.5,0.0,0.0
    153. GlSphere5       dd  0
    154.  
    155. ; --- Sphere 6
    156. ; Angles
    157. Sphere6AnglesFlt    dd  0.0,0.0,0.0
    158. ; Rotations speed
    159. Sphere6AnglesSpeedFlt   dd  1.0,-1.8,2.0
    160. ; Objects datas
    161. Sphere6Color        dd  0.2,0.6,0.4,0.0
    162. Sphere6Radius       dq  0.3
    163. sphere6Parts        dd  16
    164. Sphere6Position     dd  -1.5,0.0,0.0
    165. GlSphere6       dd  0
    166.  
    167. ; --- Sphere 7
    168. ; Angles
    169. Sphere7AnglesFlt    dd  0.0,0.0,0.0
    170. ; Rotations speed
    171. Sphere7AnglesSpeedFlt   dd  -2.1,-1.8,2.0
    172. ; Objects datas
    173. Sphere7Color        dd  0.6,0.6,0.6,0.0
    174. Sphere7Radius       dq  0.3
    175. sphere7Parts        dd  16
    176. Sphere7Position     dd  0.0,-1.5,0.0
    177. GlSphere7       dd  0
    178.  
    179. ; --------------- Procedures Declarations
    180.             .code
    181.  
    182. MainInit        PROTO   :DWORD,:DWORD,:DWORD,:DWORD
    183. MainLoop        PROTO   :DWORD,:DWORD,:DWORD,:DWORD
    184. TopXY           PROTO   :DWORD,:DWORD
    185. DrawScene       PROTO
    186. GlInit          PROTO   :DWORD,:DWORD
    187. ResizeObject        PROTO   :DWORD,:DWORD
    188. CreateSphere        PROTO   :DWORD,:DWORD,:DWORD,:DWORD,:DWORD,:DWORD
    189. SetLightSource      PROTO   :DWORD,:DWORD,:DWORD
    190. RotateObject        PROTO   :DWORD,:DWORD,:DWORD,:DWORD
    191. DeleteSpheres       PROTO
    192.  
    193. ; --------------- Procedures Section
    194. CenterForm      PROC    wDim:DWORD, sDim:DWORD
    195.             shr sDim,1
    196.             shr wDim,1
    197.             mov eax,wDim
    198.             sub sDim,eax
    199.             return  sDim
    200. CenterForm      ENDP
    201.  
    202. DoEvents        PROC
    203.             LOCAL   msg:MSG
    204. StartLoop:      ; Основной цикл очереди сообщений
    205.             invoke  PeekMessage, ADDR msg, 0, 0, 0, PM_NOREMOVE
    206.             or  eax,eax
    207.             jz  NoMsg
    208.             invoke  GetMessage, ADDR msg, 0, 0, 0
    209.             or  eax,eax
    210.             jz  ExitLoop
    211.             invoke  TranslateMessage, ADDR msg
    212.             invoke  DispatchMessage, ADDR msg
    213.             jmp StartLoop
    214. NoMsg:          ; No pending messages: draw the scene
    215.             invoke  DrawScene
    216.             jmp StartLoop
    217. ExitLoop:       mov eax,msg.wParam
    218.             ret
    219. DoEvents        ENDP
    220.  
    221. ; --------------- Program start
    222. start:          invoke  GetModuleHandle,NULL
    223.             mov hInstance, eax
    224.             invoke  GetCommandLine
    225.             mov CommandLine,eax
    226.             invoke  MainInit, hInstance, NULL, CommandLine, SW_SHOWDEFAULT
    227.             invoke  ExitProcess,eax
    228.  
    229. ; --------------- Program main inits
    230. MainInit        PROC    hInst:DWORD,hPrevInst:DWORD,CmdLine:DWORD,CmdShow:DWORD
    231.             LOCAL   wc:WNDCLASSEX
    232.             LOCAL   Wwd:DWORD
    233.             LOCAL   Wht:DWORD
    234.             LOCAL   Wtx:DWORD
    235.             LOCAL   Wty:DWORD
    236.                 szText  szClassName,"Win32SDI_Class"
    237.             mov wc.cbSize,sizeof WNDCLASSEX
    238.             mov wc.style,0
    239.             mov wc.lpfnWndProc,offset MainLoop
    240.             mov wc.cbClsExtra,NULL
    241.             mov wc.cbWndExtra,NULL
    242.             m2m wc.hInstance,hInst
    243.             mov wc.hbrBackground,COLOR_WINDOWTEXT+1
    244.             mov wc.lpszMenuName,NULL
    245.             mov wc.lpszClassName,offset szClassName
    246.             invoke  LoadIcon, hInst, 2
    247.             mov wc.hIcon,eax
    248.             invoke  LoadCursor,NULL,IDC_ARROW
    249.             mov wc.hCursor,eax
    250.             mov wc.hIconSm,0
    251.             invoke  RegisterClassEx, ADDR wc
    252.             mov Wwd,600
    253.             mov Wht,620
    254.             invoke  GetSystemMetrics,SM_CXSCREEN
    255.             invoke  CenterForm,Wwd,eax
    256.             mov Wtx,eax
    257.             invoke  GetSystemMetrics,SM_CYSCREEN
    258.             invoke  CenterForm,Wht,eax
    259.             mov Wty,eax
    260.             invoke  CreateWindowEx,0,ADDR szClassName,
    261.                         ADDR szDisplayName,
    262.                         WS_OVERLAPPEDWINDOW or WS_CLIPSIBLINGS or WS_CLIPCHILDREN,
    263.                         Wtx,Wty,Wwd,Wht,
    264.                         NULL,NULL,
    265.                         hInst,NULL
    266.             mov hWnd,eax
    267.             invoke  LoadMenu,hInst,600
    268.             invoke  SetMenu,hWnd,eax
    269.             invoke  ShowWindow,hWnd,SW_SHOWNORMAL
    270.             invoke  UpdateWindow,hWnd
    271.             call    DoEvents
    272.             ret
    273. MainInit        ENDP
    274.  
    275. ; --------------- Program main loop
    276. MainLoop        PROC    hWin:DWORD,uMsg:DWORD,wParam:DWORD,lParam:DWORD
    277.             LOCAL   WINRect:RECT
    278.             LOCAL   PixFormat:DWORD
    279.             .if uMsg == WM_COMMAND
    280.                 .if wParam == 1000
    281.                     invoke  SendMessage,hWin,WM_SYSCOMMAND,SC_CLOSE,NULL
    282.                 .endif
    283.                 return  0
    284.             .elseif uMsg == WM_CREATE
    285.                 invoke  GetDC,hWin
    286.                 mov MainHDC,eax
    287.                 mov ax,SIZEOF PixFrm
    288.                 mov PixFrm.nSize,ax
    289.                 mov PixFrm.nVersion,1
    290.                 mov PixFrm.dwFlags,PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER
    291.                 mov PixFrm.dwLayerMask,PFD_MAIN_PLANE
    292.                 mov PixFrm.iPixelType,PFD_TYPE_RGBA
    293.                 mov PixFrm.cColorBits,8
    294.                 mov PixFrm.cDepthBits,16
    295.                 mov PixFrm.cAccumBits,0
    296.                 mov PixFrm.cStencilBits,0
    297.                 invoke  ChoosePixelFormat,MainHDC,ADDR PixFrm
    298.                 mov PixFormat,eax
    299.                 invoke  SetPixelFormat, MainHDC, PixFormat, ADDR PixFrm
    300.                 or  eax, eax
    301.                 jz  NoPixelFmt
    302.                 invoke  wglCreateContext,MainHDC
    303.                 mov OpenDC,eax
    304.                 invoke  wglMakeCurrent,MainHDC,OpenDC
    305.                 invoke  GetClientRect,hWin,ADDR WINRect
    306.                 invoke  GlInit,WINRect.right,WINRect.bottom
    307. NoPixelFmt:    
    308.                 return  0
    309.             .elseif uMsg == WM_SIZE
    310.                 invoke  GetWindowRect, hWin, ADDR WINRect
    311.                 mov eax, [WINRect.right]
    312.                 sub eax, [WINRect.left]
    313.                 mov [WINRect.right], eax
    314.                 add eax, 20
    315.                 mov [WINRect.bottom], eax
    316.                 invoke  SetWindowPos, hWin, 0, 0, 0, [WINRect.right], [WINRect.bottom], SWP_NOMOVE
    317.                 invoke  GetClientRect, hWin, ADDR WINRect
    318.                 invoke  ResizeObject, WINRect.right, WINRect.bottom
    319.                 return  0
    320.                
    321.             .elseif uMsg == WM_CLOSE
    322. ;               szText TheText,"Вы действительно хотите выйти ?"
    323. ;               invoke  MessageBox,hWin,ADDR TheText,ADDR szDisplayName,MB_YESNO+MB_ICONQUESTION
    324.                 .if eax == IDNO
    325.                     return  0
    326.                 .endif
    327.                 mov eax, OpenDC
    328.                 or  eax, eax
    329.                 jz  NoGlDC
    330.                 ; Delete our objects
    331.                 invoke  DeleteSpheres
    332.                 invoke  wglDeleteContext, OpenDC
    333. NoGlDC:             invoke  ReleaseDC, hWin, MainHDC
    334.                 invoke  DestroyWindow, hWin
    335.                 return  0
    336.             .elseif uMsg == WM_DESTROY
    337.                 invoke  PostQuitMessage,NULL
    338.                 return  0
    339.             .endif
    340.             invoke  DefWindowProc,hWin,uMsg,wParam,lParam
    341.             ret
    342. MainLoop        ENDP
    343.  
    344. ; ------------------------------
    345. ; OpenGl related stuff
    346. ; ------------------------------
    347.  
    348. ; --------------- Init the scene
    349. GlInit          PROC    ParentW:DWORD, ParentH:DWORD
    350. ;           invoke  SetLightSource, GL_LIGHT0, ADDR LightSourcePosition,  ADDR LightAmbient
    351.             invoke  SetLightSource, GL_LIGHT1, ADDR LightSource2Position, ADDR Light2Ambient
    352.             invoke  SetLightSource, GL_LIGHT2, ADDR LightSource3Position, ADDR Light3Ambient
    353.             invoke  CreateSphere, 1, GLU_FILL, GLU_SMOOTH, ADDR Sphere1Color, ADDR Sphere1Radius, sphere1Parts
    354.             mov GlSphere1, eax
    355.             invoke  CreateSphere, 2, GLU_FILL, GLU_SMOOTH, ADDR Sphere2Color, ADDR Sphere2Radius, sphere2Parts
    356.             mov GlSphere2, eax
    357.             invoke  CreateSphere, 3, GLU_FILL, GLU_SMOOTH, ADDR Sphere3Color, ADDR Sphere3Radius, sphere3Parts
    358.             mov GlSphere3, eax
    359.             invoke  CreateSphere, 4, GLU_FILL, GLU_SMOOTH, ADDR Sphere4Color, ADDR Sphere4Radius, sphere4Parts
    360.             mov GlSphere4, eax
    361.             invoke  CreateSphere, 5, GLU_FILL, GLU_SMOOTH, ADDR Sphere5Color, ADDR Sphere5Radius, sphere5Parts
    362.             mov GlSphere5, eax
    363.             invoke  CreateSphere, 6, GLU_FILL, GLU_SMOOTH, ADDR Sphere6Color, ADDR Sphere6Radius, sphere6Parts
    364.             mov GlSphere6, eax
    365.             invoke  CreateSphere, 7, GLU_FILL, GLU_SMOOTH, ADDR Sphere7Color, ADDR Sphere7Radius, sphere7Parts
    366.             mov GlSphere7, eax
    367.             ; Set global flags
    368.             invoke  glEnable, GL_DEPTH_TEST     ; Включить Z буффер
    369.             invoke  glEnable, GL_LIGHTING       ; Разрешить цвета ??
    370. ;           invoke  glEnable, GL_CULL_FACE      ; Не рисовать заднюю поверхность Don't render back faces
    371.             invoke  glShadeModel, GL_SMOOTH ; GL_FLAT ; режим сглаживания
    372.             invoke  glEnable, GL_NORMALIZE      ; масштабировать вектор нормали
    373.             ret
    374. GlInit          ENDP
    375.  
    376. ; --------------- Display the scene
    377. DrawScene       PROC
    378.                 invoke  glClear, GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
    379.             invoke  glPushMatrix
    380.                 invoke  RotateObject,1,ADDR Sphere1Position,ADDR Sphere1AnglesSpeedFlt,ADDR Sphere1AnglesFlt
    381.                 invoke  glPushMatrix
    382.                     invoke  RotateObject,2,ADDR Sphere2Position,ADDR Sphere2AnglesSpeedFlt,ADDR Sphere2AnglesFlt
    383.                     invoke  glLightfv,GL_LIGHT0,GL_POSITION,ADDR LightSourcePosition
    384.                 invoke  glPopMatrix
    385.                 invoke  glPushMatrix
    386.                     invoke  RotateObject,3,ADDR Sphere3Position,ADDR Sphere3AnglesSpeedFlt,ADDR Sphere3AnglesFlt
    387.                     invoke  glLightfv,GL_LIGHT1,GL_POSITION,ADDR LightSource2Position
    388.                 invoke  glPopMatrix
    389.                 invoke  glPushMatrix
    390.                     invoke  RotateObject,4,ADDR Sphere4Position,ADDR Sphere4AnglesSpeedFlt,ADDR Sphere4AnglesFlt
    391.                     invoke  glLightfv,GL_LIGHT2,GL_POSITION,ADDR LightSource3Position
    392.                 invoke  glPopMatrix
    393.                 invoke  glPushMatrix
    394.                     invoke  RotateObject,5,ADDR Sphere5Position,ADDR Sphere5AnglesSpeedFlt,ADDR Sphere5AnglesFlt
    395.                 invoke  glPopMatrix
    396.                 invoke  glPushMatrix
    397.                     invoke  RotateObject,6,ADDR Sphere6Position,ADDR Sphere6AnglesSpeedFlt,ADDR Sphere6AnglesFlt
    398.                 invoke  glPopMatrix
    399.                 invoke  glPushMatrix
    400.                     invoke  RotateObject,7,ADDR Sphere7Position,ADDR Sphere7AnglesSpeedFlt,ADDR Sphere7AnglesFlt
    401.                 invoke  glPopMatrix
    402.             invoke  glPopMatrix
    403.             invoke  SwapBuffers,MainHDC
    404.             ret
    405. DrawScene       ENDP
    406.  
    407. ; --------------- Resize the scene
    408. ResizeObject        PROC    ParentW:DWORD,ParentH:DWORD
    409.             invoke  glViewport,0,0,ParentW,ParentH
    410.             invoke  glMatrixMode,GL_PROJECTION
    411.             invoke  glLoadIdentity
    412.             invoke  gluPerspective,DWORD PTR Value45Dbl,DWORD PTR Value45Dbl+4,DWORD PTR Value1Dbl,DWORD PTR Value1Dbl+4,DWORD PTR Value3Dbl,DWORD PTR Value3Dbl+4,DWORD PTR Value7Dbl,DWORD PTR Value7Dbl+4
    413.             invoke  glMatrixMode,GL_MODELVIEW
    414.             invoke  glLoadIdentity
    415.             ret
    416. ResizeObject        ENDP
    417.  
    418. ; --------------- Free the memory allocated for the spheres
    419. DeleteSpheres       PROC
    420.             invoke  gluDeleteQuadric,GlSphere1
    421.             invoke  gluDeleteQuadric,GlSphere2
    422.             invoke  gluDeleteQuadric,GlSphere3
    423.             invoke  gluDeleteQuadric,GlSphere4
    424.             invoke  gluDeleteQuadric,GlSphere5
    425.             invoke  gluDeleteQuadric,GlSphere6
    426.             invoke  gluDeleteQuadric,GlSphere7
    427.             ret
    428. DeleteSpheres       ENDP
    429.  
    430. ; --------------- Create a sphere with glu object
    431. CreateSphere        PROC    ListNumber:DWORD,FillType:DWORD,NormalsType:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
    432.             LOCAL   GlSphere:DWORD
    433.             invoke  glNewList,ListNumber,GL_COMPILE
    434.             ; Create a template
    435.             invoke  gluNewQuadric
    436.             mov GlSphere,eax
    437.             ; Set object draw style
    438.             invoke  gluQuadricDrawStyle, GlSphere, FillType
    439. ;           invoke  gluQuadricDrawStyle, GlSphere, GLU_POINT
    440.             ; Set normals style
    441.             invoke  gluQuadricNormals, GlSphere, NormalsType
    442.             ; Set object color
    443. ;           invoke  glMaterialfv, GL_FRONT, GL_AMBIENT_AND_DIFFUSE, Color
    444.             invoke  glMaterialfv, GL_FRONT_AND_BACK, GL_AMBIENT_AND_DIFFUSE, Color
    445.             mov eax,Radius
    446.             ; Create a sphere primitive
    447.             invoke  gluSphere, GlSphere, [eax], [eax+4], 35, 15;Parts, Parts
    448.             invoke  glEndList
    449.             mov eax,GlSphere
    450.             ret
    451. CreateSphere        ENDP
    452.  
    453. ; --------------- Set a light source
    454. SetLightSource      PROC    LtNumber:DWORD, LtPosition:DWORD, LtAmbient:DWORD
    455.             invoke  glLightfv, LtNumber, GL_POSITION, LtPosition
    456.             invoke  glLightfv, LtNumber, GL_DIFFUSE, ADDR LightDiffuse
    457.             invoke  glLightfv, LtNumber, GL_SPECULAR, ADDR LightSpecular
    458.             invoke  glLightfv, LtNumber, GL_AMBIENT, LtAmbient
    459.             invoke  glLightfv, LtNumber, GL_CONSTANT_ATTENUATION, ADDR LightConstAtt
    460.             invoke  glLightfv, LtNumber, GL_LINEAR_ATTENUATION, ADDR LightLinAtt
    461.             invoke  glLightfv, LtNumber, GL_QUADRATIC_ATTENUATION, ADDR LightQuadAtt
    462.             invoke  glLightfv, LtNumber, GL_SPOT_CUTOFF, ADDR SpotCut
    463.             invoke  glLightfv, LtNumber, GL_SPOT_EXPONENT, ADDR SpotExp
    464.             invoke  glLightfv, LtNumber, GL_SPOT_DIRECTION, ADDR SpotDir
    465.             invoke  glEnable,  LtNumber
    466.             ret
    467. SetLightSource      ENDP
    468.  
    469. ; --------------- Position and rotate an object
    470. RotateObject        PROC    ListNumber:DWORD,XYZPosition:DWORD,XYZRotations:DWORD,XYZAngles:DWORD
    471.             LOCAL   LocXSpd:DWORD
    472.             LOCAL   LocYSpd:DWORD
    473.             LOCAL   LocZSpd:DWORD
    474.             LOCAL   LocXAngle:DWORD
    475.             LOCAL   LocYAngle:DWORD
    476.             LOCAL   LocZAngle:DWORD
    477.             mov eax,XYZPosition
    478.             mov ecx,[eax]
    479.             mov ebx,[eax+4]
    480.             mov eax,[eax+8]
    481.             invoke  glTranslatef,ecx,ebx,eax
    482.                 mov eax,XYZAngles           ; Rotate X
    483.                 mov ebx,XYZRotations
    484.                 fld DWORD PTR [eax]
    485.                 fadd    DWORD PTR [ebx]
    486.                 fstp    DWORD PTR [eax]
    487.                 invoke  glRotatef,[eax],Value0Flt,Value1Flt,Value0Flt
    488.                 mov eax,XYZAngles           ; Rotate Y
    489.                 mov ebx,XYZRotations
    490.                 fld DWORD PTR [eax+4]
    491.                 fadd    DWORD PTR [ebx+4]
    492.                 fstp    DWORD PTR [eax+4]
    493.                 invoke  glRotatef,[eax+4],Value1Flt,Value0Flt,Value0Flt
    494.                 mov eax,XYZAngles           ; Rotate Z
    495.                 mov ebx,XYZRotations
    496.                 fld DWORD PTR [eax+8]
    497.                 fadd    DWORD PTR [ebx+8]
    498.                 fstp    DWORD PTR [eax+8]
    499.                 invoke  glRotatef,DWORD PTR [eax+8],Value0Flt,Value0Flt,Value1Flt
    500.             invoke  glCallList,ListNumber
    501.             ret
    502. RotateObject        ENDP
    503.  
    504. ; --------------- Program end
    505. end start
    Глюк с аттачами так и не исправлен - приходится извращаться :))