⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 map.asm

📁 一个读取3DS文件并显示3D模型的例子
💻 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 + -