📄 map.asm
字号:
PFD_MAIN_PLANE equ 0
PFD_TYPE_COLORINDEX equ 1
PFD_TYPE_RGBA equ 0
PFD_DOUBLEBUFFER equ 1
PFD_DRAW_TO_WINDOW equ 4
PFD_SUPPORT_OPENGL equ 020h
AUX_RGBImageRec STRUCT
sizeX dd ?
sizeY dd ?
data dd ?
AUX_RGBImageRec ENDS
.data
pVertical dd 9 dup (0)
pNormal dd 9 dup (0)
pTexCoord dd 6 dup (0)
file3ds db '2.3ds',0
filebmp db '2.BMP',0
rtri dd 0.0
ratio dq 0.0
Value1Dbl dq 1.0
Value45Dbl dq 45.0
Value01Dbl dq 5.0 ;深度缓存
Value100Dbl dq 300.0
V1 dd 1.0
V2 dd -180.0 ;场景深度
V3 dd 0
LightSourcePosition dd 0.0,0.0,0.0,1.0
PixFrm PIXELFORMATDESCRIPTOR <>
MapHdc dd ?
OpenDC dd ?
texture dd 3 dup (0)
.code
CalcNormal proc ;计算法向量
fld pVertical[0*4]
fsub pVertical[3*4]
fstp pNormal[3*4]
fld pVertical[1*4]
fsub pVertical[4*4]
fstp pNormal[4*4]
fld pVertical[2*4]
fsub pVertical[5*4]
fstp pNormal[5*4]
fld pVertical[3*4]
fsub pVertical[6*4]
fstp pNormal[6*4]
fld pVertical[4*4]
fsub pVertical[7*4]
fstp pNormal[7*4]
fld pVertical[5*4]
fsub pVertical[8*4]
fstp pNormal[8*4]
;pNormal[0] = d1[1] * d2[2] - d1[2] * d2[1]
fld pNormal[4*4]
fld pNormal[8*4]
fmulp st(1),st(0)
fld pNormal[5*4]
fld pNormal[7*4]
fmulp st(1),st(0)
fsubp st(1),st(0)
FSTP pNormal[0]
;pNormal[1] = d1[2] * d2[0] - d1[0] * d2[2]
fld pNormal[5*4]
fld pNormal[6*4]
fmulp st(1),st(0)
fld pNormal[3*4]
fld pNormal[8*4]
fmulp st(1),st(0)
fsubp st(1),st(0)
FSTP pNormal[4]
;pNormal[2] = d1[0] * d2[1] - d1[1] * d2[0]
fld pNormal[3*4]
fld pNormal[7*4]
fmulp st(1),st(0)
fld pNormal[4*4]
fld pNormal[6*4]
fmulp st(1),st(0)
fsubp st(1),st(0)
FSTP pNormal[8]
ret
CalcNormal endp
LoadGLTexture PROC lpfilebmp ;加载纹理
LOCAL hBMP:DWORD, ImgInfo:BITMAP
assume edi:ptr AUX_RGBImageRec
invoke auxDIBImageLoad,lpfilebmp
mov hBMP,eax
invoke glGenTextures,3,addr texture
invoke glPixelStorei,GL_UNPACK_ALIGNMENT,1
invoke glBindTexture,GL_TEXTURE_2D, texture
invoke glTexParameteri,GL_TEXTURE_2D,GL_TEXTURE_MIN_FILTER,GL_LINEAR_MIPMAP_NEAREST
invoke glTexParameteri,GL_TEXTURE_2D,GL_TEXTURE_MAG_FILTER,GL_LINEAR_MIPMAP_NEAREST
mov edi,hBMP
invoke gluBuild2DMipmaps,GL_TEXTURE_2D,3,[edi].sizeX,[edi].sizeY,GL_RGB,GL_UNSIGNED_BYTE,[edi].data
invoke glEnable,GL_TEXTURE_2D
ret
LoadGLTexture ENDP
Read3ds proc uses esi edi lpfile:dword ;读取3DS文件
local hfile,hfilemap,lpmemory
local MAIN3DSMX,VerTexls,lpVerTexl,Mappings,lpMapping,Facelis,lpFaceli
local P1,P2,P3,FaceliClass
invoke SetFileAttributes,lpfile,FILE_ATTRIBUTE_NORMAL
invoke CreateFile,lpfile,GENERIC_READ or GENERIC_WRITE ,FILE_SHARE_READ or FILE_SHARE_WRITE ,0,OPEN_EXISTING,FILE_ATTRIBUTE_NORMAL,0
mov hfile,eax
invoke CreateFileMapping,eax,0,PAGE_READWRITE,0,0,NULL
mov hfilemap,eax
invoke MapViewOfFile,eax,FILE_MAP_READ or FILE_MAP_WRITE,0,0,0
.if eax!=0
mov lpmemory,eax
mov esi,lpmemory
MOV EAX,[esi+2]
mov MAIN3DSMX,eax
add MAIN3DSMX,esi
add esi,16
mov Mappings,0
.while TRUE
movzx eax,word ptr [esi]
.if eax==3D3Dh
add esi,6
.elseif eax==4000h ;模型名
add esi,6
invoke lstrlen,esi
add esi,eax
inc esi
.elseif eax==4100h
add esi,6
.elseif eax==4110h ;顶点数
add esi,6
movzx eax,word ptr [esi]
mov VerTexls,eax
add esi,2
mov lpVerTexl,esi
invoke IntMul,12,eax
add esi,eax
.elseif eax==4140h ;纹理坐标
add esi,6
movzx eax,word ptr [esi]
mov Mappings,eax
add esi,2
mov lpMapping,esi
invoke IntMul,8,eax
add esi,eax
.elseif eax==4120h ;面数
add esi,6
movzx eax,word ptr [esi]
mov Facelis,eax
add esi,2
mov lpFaceli,esi
invoke IntMul,8,eax
add esi,eax
mov ecx,0
push lpFaceli
push esi
push edi
.while Facelis>ecx
push ecx
mov eax,lpFaceli
mov edx,0
movzx edx,word ptr [eax+6]
shl dx,13
shr dx,13
mov FaceliClass,edx
movzx eax,word ptr [eax+0]
mov ecx,12
mul ecx
add eax,lpVerTexl
mov esi,eax
mov edi,offset pVertical[0]
mov ecx,3
cld
rep movsd
.if FaceliClass==7H
mov edi,offset pVertical[24]
.elseif FaceliClass==0H
mov edi,offset pVertical[12]
.endif
mov eax,lpFaceli
movzx eax,word ptr [eax+2]
mov ecx,12
mul ecx
add eax,lpVerTexl
mov esi,eax
mov ecx,3
cld
rep movsd
.if FaceliClass==7H
mov edi,offset pVertical[12]
.elseif FaceliClass==0H
mov edi,offset pVertical[24]
.endif
mov eax,lpFaceli
movzx eax,word ptr [eax+4]
mov ecx,12
mul ecx
add eax,lpVerTexl
mov esi,eax
mov ecx,3
cld
rep movsd
.if Mappings>1
mov eax,lpFaceli
movzx eax,word ptr [eax+0]
mov ecx,8
mul ecx
add eax,lpMapping
mov esi,eax
mov edi,offset pTexCoord[0]
mov ecx,2
cld
rep movsd
mov eax,lpFaceli
movzx eax,word ptr [eax+2]
mov ecx,8
mul ecx
add eax,lpMapping
mov esi,eax
mov edi,offset pTexCoord[16]
mov ecx,2
cld
rep movsd
mov eax,lpFaceli
movzx eax,word ptr [eax+4]
mov ecx,8
mul ecx
add eax,lpMapping
mov esi,eax
mov edi,offset pTexCoord[8]
mov ecx,2
cld
rep movsd
.endif
invoke glTexCoord2f, pTexCoord[0],pTexCoord[4]
invoke glVertex3f,pVertical[0],pVertical[4],pVertical[8]
invoke glTexCoord2f, pTexCoord[8],pTexCoord[12]
invoke glVertex3f,pVertical[12],pVertical[16],pVertical[20]
invoke glTexCoord2f, pTexCoord[16],pTexCoord[20]
invoke glVertex3f,pVertical[24],pVertical[28],pVertical[32]
pop ecx
inc ecx
add lpFaceli,8
.endw
pop edi
pop esi
pop lpFaceli
.elseif eax==0B000h
add esi,[esi+2]
.else
add esi,[esi+2]
.endif
.break .if esi>=MAIN3DSMX
.endw
invoke UnmapViewOfFile,lpmemory
invoke CloseHandle,hfilemap
invoke CloseHandle,hfile
.endif
ret
Read3ds endp
MapProc proc hWnd:DWORD, uMsg:DWORD, wParam:DWORD, lParam:DWORD
LOCAL PixFormat:DWORD
LOCAL hMapRect:RECT
.if uMsg == WM_INITDIALOG
invoke SetTimer,hWnd,1,1,NULL
invoke GetDC,hWnd
mov MapHdc,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,24
mov PixFrm.cDepthBits,32
mov PixFrm.cAccumBits,0
mov PixFrm.cStencilBits,0
invoke ChoosePixelFormat,MapHdc,ADDR PixFrm
mov PixFormat,eax
invoke SetPixelFormat,MapHdc,PixFormat,ADDR PixFrm
or eax,eax
invoke wglCreateContext,MapHdc
mov OpenDC,eax
invoke wglMakeCurrent,MapHdc,OpenDC
invoke glPolygonMode,GL_FRONT,GL_FILL;//多边型的正面为填充模式;
invoke glPolygonMode,GL_BACK,GL_FILL;//多边形的背面为填充模式;
invoke glShadeModel,GL_SMOOTH;//明暗模式为平滑型;
invoke glClearDepth,DWORD PTR Value1Dbl,DWORD PTR Value1Dbl+4 ;设置深度缓存
invoke glEnable,GL_DEPTH_TEST ;enable depth testing
invoke glDepthFunc,GL_LEQUAL ;type of depth test
invoke glHint, GL_PERSPECTIVE_CORRECTION_HINT, GL_NICEST
invoke glEnable,GL_NORMALIZE;//使能法向量单位化;
invoke glFrontFace,GL_CW;//设置朝向正面的多边型的顶点环绕方向为顺时针方向;
invoke LoadGLTexture,addr filebmp
invoke glNewList,1,GL_COMPILE
invoke glBegin,GL_TRIANGLES ;绘制三角形
invoke Read3ds,addr file3ds
invoke glEnd ;三角形绘制结束
invoke glEndList
invoke ShowWindow,hWnd,SW_MAXIMIZE
.elseif uMsg == WM_SIZE
invoke GetClientRect,hWnd,ADDR hMapRect
invoke glViewport,0,0,hMapRect.right,hMapRect.bottom
invoke glMatrixMode,GL_PROJECTION
invoke glLoadIdentity
fild hMapRect.right
fild hMapRect.bottom
fdivp st(1), st ;width/height
fstp ratio
invoke gluPerspective,DWORD PTR Value45Dbl,DWORD PTR Value45Dbl+4,DWORD PTR ratio,DWORD PTR ratio+4,DWORD PTR Value01Dbl,DWORD PTR Value01Dbl+4,DWORD PTR Value100Dbl,DWORD PTR Value100Dbl+4
invoke glMatrixMode,GL_MODELVIEW
invoke glLoadIdentity
.elseif uMsg == WM_TIMER
invoke glClear,GL_COLOR_BUFFER_BIT or GL_DEPTH_BUFFER_BIT ;清除屏幕背景
invoke glLoadIdentity ;
invoke glTranslatef,0,0,V2 ; 移动当前坐标
fld rtri
fadd Value1Dbl
fstp rtri
invoke glRotatef,rtri,0,V1,0 ;旋转
invoke glCallList,1
invoke SwapBuffers,MapHdc
.elseif uMsg == WM_DESTROY
invoke wglDeleteContext,OpenDC
invoke ReleaseDC,hWnd,MapHdc
.elseif uMsg==WM_CLOSE
invoke EndDialog,hWnd,0
.else
mov eax,FALSE
ret
.endif
mov eax,TRUE
ret
MapProc endp
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -