Функции создания графических примитивов
Простые геометрические объекты (примитивы) удобнее создавать с помощью функций, обращаясь к этим функциям по мере необходимости. Переделаем код примера с белым треугольником. Добавим в файл opngl.asm функции CreateObjects для создания объектов:
; #########################################################################
CreateObjects PROC ParentW:DWORD,ParentH:DWORD
invoke SolidTriangle,1
invoke glMatrixMode,GL_PROJECTION
ret
CreateObjects ENDP
; #########################################################################
и SolidTriangle для сплошного треугольника:
; #########################################################################
SolidTriangle proc ListNumber:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke glBegin,GL_TRIANGLES
top(Top1)
top(Top2)
top(Top3)
invoke glEnd
invoke glEndList
ret
SolidTriangle endp
; #########################################################################
В определения прототипов впишем:
CreateObjects PROTO :DWORD,:DWORD
SolidTriangle PROTO :DWORD
В процедуру Init:
invoke CreateObjects,WINRect.right,WINRect.bottom
В секцию макросов файла opengl.inc добавим два новых макроса: top строит вершины, put2scene выводит объекты на экран:
top MACRO arg
lea eax,arg
invoke glVertex3f,[eax],[eax+4],[eax+8]
ENDM
put2scene MACRO num,arg
invoke glPushMatrix
lea eax,arg
mov ecx,[eax]
mov ebx,[eax+4]
mov eax,[eax+8]
invoke glTranslatef,ecx,ebx,eax
invoke glCallList,num
invoke glPopMatrix
ENDM
Полностью opngl.asm теперь выглядит так:
; #########################################################################
.data
MainHDC dd 0
OpenDC dd 0
PixFrm PIXELFORMATDESCRIPTOR <>
Position dd 0.0,0.0,-5.0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Top1 dd -1.0,-1.0,0.0
Top2 dd 1.0,-1.0,0.0
Top3 dd 0.0,1.0,0.0
;>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>
Float45 dq 45.0
Float3 dq 3.0
Float9 dq 9.0
Float1 dq 1.0
.code
ResizeObject PROTO :DWORD,:DWORD
DrawScene PROTO
Init PROTO :DWORD
CreateObjects PROTO :DWORD,:DWORD
SolidTriangle PROTO :DWORD
; #########################################################################
ResizeObject PROC ParentW:DWORD,ParentH:DWORD
invoke glViewport,0,0,ParentW,ParentH
invoke glMatrixMode,GL_PROJECTION
invoke glLoadIdentity
invoke gluPerspective,DWORD PTR Float45,DWORD PTR Float45+4,DWORD PTR Float1,DWORD PTR Float1+4,DWORD PTR Float3,DWORD PTR Float3+4,DWORD PTR Float9,DWORD PTR Float9+4
invoke glMatrixMode,GL_MODELVIEW
invoke glLoadIdentity
ret
ResizeObject ENDP
; #########################################################################
CreateObjects PROC ParentW:DWORD,ParentH:DWORD
invoke SolidTriangle,1
invoke glMatrixMode,GL_PROJECTION
ret
CreateObjects ENDP
; #########################################################################
DrawScene PROC
invoke glClear,GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT
put2scene 1,Position
invoke SwapBuffers,MainHDC
ret
DrawScene ENDP
; #########################################################################
SolidTriangle proc ListNumber:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke glBegin,GL_TRIANGLES
top(Top1)
top(Top2)
top(Top3)
invoke glEnd
invoke glEndList
ret
SolidTriangle endp
; #########################################################################
Init proc hWn:DWORD
LOCAL WINRect:RECT
LOCAL PixFormat:DWORD
invoke GetDC,hWn
mov MainHDC,eax
mov ax,SIZEOF PixFrm
mov PixFrm.nSize,ax
mov PixFrm.nVersion,1
mov PixFrm.dwFlags,PFD_DRAW_TO_WINDOW or PFD_SUPPORT_OPENGL or PFD_DOUBLEBUFFER
mov PixFrm.dwLayerMask,PFD_MAIN_PLANE
mov PixFrm.iPixelType,PFD_TYPE_RGBA
mov PixFrm.cColorBits,8
mov PixFrm.cDepthBits,16
mov PixFrm.cAccumBits,0
mov PixFrm.cStencilBits,0
invoke ChoosePixelFormat,MainHDC,ADDR PixFrm
mov PixFormat,eax
invoke SetPixelFormat,MainHDC,PixFormat,ADDR PixFrm
or eax,eax
jz Fail
invoke wglCreateContext,MainHDC
mov OpenDC,eax
invoke wglMakeCurrent,MainHDC,OpenDC
invoke GetClientRect,hWn,ADDR WINRect
invoke CreateObjects,WINRect.right,WINRect.bottom
invoke glEnable,GL_COLOR_MATERIAL
jmp abrt
Fail:
invoke MessageBox,hWn,SADD("OpenGL инициализировaть не удалось"),SADD("Отчет об инициализации"),MB_OK
abrt:
return 0
Init endp
; ########################################################
Программа покажет белый треугольник.