MASM32 и OpenGL
Это не так сложно, как на самом деле

Пример DLL

Программа, рисующая снеговика, содержит функции рисования сферы, диска и цилиндра. Упакуем эти функции в динамическую библиотеку, причем возмем как функции рисования как сплошных, так и проволочных объектов. Основной файл obj3d.asm:



.386
.model flat, stdcall
option casemap :none

include \masm32\include\windows.inc
include \masm32\include\user32.inc
include \masm32\include\kernel32.inc
include \masm32\include\gdi32.inc
include \masm32\include\opengl32.inc
include \masm32\include\glu32.inc
include \masm32\include\masm32.inc


includelib \masm32\lib\user32.lib
includelib \masm32\lib\kernel32.lib
includelib \masm32\lib\gdi32.lib
includelib \masm32\lib\opengl32.lib
includelib \masm32\lib\glu32.lib
includelib \masm32\lib\masm32.lib


SolidSphere PROTO :DWORD,:DWORD,:DWORD,:DWORD
WireSphere PROTO :DWORD,:DWORD,:DWORD,:DWORD
SolidDisk PROTO :DWORD,:DWORD,:DWORD,:DWORD
WireDisk PROTO :DWORD,:DWORD,:DWORD,:DWORD
SolidCylinder PROTO :DWORD,:DWORD,:DWORD,:DWORD
WireCylinder PROTO :DWORD,:DWORD,:DWORD,:DWORD



.code
; #########################################################################
LibMain proc

ret
LibMain Endp

; #########################################################################
SolidSphere PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hSphere:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hSphere,eax
invoke gluQuadricDrawStyle,hSphere,GL_FILL
invoke gluQuadricNormals,hSphere,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluSphere,hSphere,[eax],[eax+4],Parts,Parts
invoke glEndList
mov eax,hSphere
ret
SolidSphere ENDP
; #########################################################################
WireSphere PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hSphere:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hSphere,eax
invoke gluQuadricDrawStyle,hSphere,GLU_LINE
invoke gluQuadricNormals,hSphere,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluSphere,hSphere,[eax],[eax+4],Parts,Parts
invoke glEndList
mov eax,hSphere
ret
WireSphere ENDP
; #########################################################################
SolidDisk PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hDisk:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hDisk,eax
invoke gluQuadricDrawStyle,hDisk,GLU_FILL
invoke gluQuadricNormals,hDisk,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluDisk,hDisk,[eax],[eax+4],[eax+8],[eax+12],Parts,Parts
invoke glEndList
mov eax,hDisk
ret
SolidDisk ENDP

; #########################################################################
WireDisk PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hDisk:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hDisk,eax
invoke gluQuadricDrawStyle,hDisk,GLU_LINE
invoke gluQuadricNormals,hDisk,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluDisk,hDisk,[eax],[eax+4],[eax+8],[eax+12],Parts,Parts
invoke glEndList
mov eax,hDisk
ret
WireDisk ENDP

; #########################################################################

SolidCylinder PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hCylinder:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hCylinder,eax
invoke gluQuadricDrawStyle,hCylinder,GLU_FILL
invoke gluQuadricNormals,hCylinder,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluCylinder,hCylinder,[eax],[eax+4],[eax+8],[eax+12],[eax+16],[eax+20],Parts,Parts


invoke glEndList
mov eax,hCylinder
ret
SolidCylinder ENDP
; #########################################################################

WireCylinder PROC ListNumber:DWORD,Color:DWORD,Radius:DWORD,Parts:DWORD
LOCAL hCylinder:DWORD
invoke glNewList,ListNumber,GL_COMPILE_AND_EXECUTE
invoke gluNewQuadric
mov hCylinder,eax
invoke gluQuadricDrawStyle,hCylinder,GLU_LINE
invoke gluQuadricNormals,hCylinder,GL_SMOOTH
invoke glColor3fv,Color
mov eax,Radius
invoke gluCylinder,hCylinder,[eax],[eax+4],[eax+8],[eax+12],[eax+16],[eax+20],Parts,Parts


invoke glEndList
mov eax,hCylinder
ret
WireCylinder ENDP

; #########################################################################
end LibMain

Файл определений obj3d.def:

LIBRARY obj3d
EXPORTS SolidSphere
EXPORTS WireSphere
EXPORTS SolidDisk
EXPORTS WireDisk
EXPORTS SolidCylinder
EXPORTS WireCylinder

Последний файл - makedll.bat:

@echo off

if exist obj3d.obj del obj3d.obj
if exist obj3d.dll del obj3d.dll

\masm32\bin\ml /c /coff obj3d.asm

\masm32\bin\Link /SUBSYSTEM:WINDOWS /DLL /DEF:obj3d.def obj3d.obj

dir obj3d.*

pause

Все три файла помещаем в отдельную папку и запускаем makedll.bat. В результате компиляции в папке появятся такие файлы: obj3d.obj, obj3d.exp, obj3d.lib и obj3d.dll. Нам понадобятся только два: obj3d.lib и obj3d.dll (остальное - отходы компиляции).

Скачать исходники.

©   Короленко М.В., 2011       
Перепечатка материалов возможна только после согласования с автором при условии обязательной ссылки на сайт