format	PE GUI 4.0

; Equates.

include 'C:\Fasm\Include\win32a.inc'	; Set this to your directory.

GL_COLOR_BUFFER_BIT	= $00004000
GL_TRIANGLE_STRIP	= $0005
GL_BLEND		= $0BE2
GL_ONE			= 1
GL_SRC_ALPHA_SATURATE	= $0308
GL_POLYGON_SMOOTH	= $0B41
GL_CULL_FACE		= $0B44
GL_TEXTURE_2D		= $0DE1
GL_LINEAR		= $2601
GL_TEXTURE_MAG_FILTER	= $2800
GL_TEXTURE_MIN_FILTER	= $2801
GL_MODELVIEW		= $1700
GL_PROJECTION		= $1701
GL_COMPILE		= $1300
GL_UNSIGNED_BYTE	= $1401
GL_LUMINANCE		= $1909



; Startup.
	xor	esi,esi
	mov	edi,win32_name

	pushd	edi esi esi esi esi esi esi esi
	pushd	win32_wndproc CS_OWNDC esp
	call	[RegisterClass]
	pushd	esi esi esi esi esi esi esi esi
	pushd	WS_POPUP+WS_VISIBLE+WS_MAXIMIZE
	pushd	edi edi esi
	call	[CreateWindowEx]
	pushd	eax
	call	[GetDC]
	xchg	edi,eax

	pushd	esi esi esi esi esi 08000000h
	pushd	esi 00180000h
	pushd	00000025h 00010028h
	pushd	esp edi
	call	[wglChoosePixelFormat]
	pushd	esp eax edi
	call	[wglSetPixelFormat]

	add	esp,80

	pushd	edi
	call	[wglCreateContext]
	pushd	eax edi
	pushd	eax edi
	call	[wglMakeCurrent]

	pushd	GL_ONE GL_SRC_ALPHA_SATURATE
	call	[glBlendFunc]

	mov	esi,[glEnable]
	mov	edi,GL_TEXTURE_2D

	pushd	edi
	call	esi
	pushd	GL_BLEND
	call	esi
	pushd	GL_POLYGON_SMOOTH
	call	esi
	pushd	GL_CULL_FACE
	call	esi
	mov	esi,[glTexParameteri]
	pushd	GL_LINEAR GL_TEXTURE_MIN_FILTER edi
	call	esi
	pushd	GL_LINEAR GL_TEXTURE_MAG_FILTER edi
	call	esi

	pushd	GL_PROJECTION
	call	[glMatrixMode]
	mov	eax,0.0
	mov	edx,2.03450520833333333333333333333333e-5
	mov	esi,0.0000152587890625
	pushd	1.0 eax eax eax
	pushd	eax esi eax eax
	pushd	eax eax edx eax
	pushd	eax eax eax esi
	pushd	esp
	call	[glLoadMatrixf]
	add	esp,64
	pushd	GL_MODELVIEW
	call	[glMatrixMode]

	pushd	GL_COMPILE 1
	call	[glNewList]
	pushd	GL_TRIANGLE_STRIP
	call	[glBegin]

	mov	ebx,mesh
	mov	esi,4
    display_list_loop:
	pushd	ebx
	call	[glTexCoord2sv]
	add	ebx,4
	pushd	ebx
	call	[glVertex3sv]
	add	ebx,6
	dec	esi
	jnz	short display_list_loop

	call	[glEnd]
	call	[glEndList]

	pushd	1 GL_TEXTURE_2D 	; <---- Changing the 1 to 0 fixes it.
	call	[glBindTexture]

	pushd	texture GL_UNSIGNED_BYTE GL_LUMINANCE 0
	pushd	8 8 GL_LUMINANCE 0 GL_TEXTURE_2D
	call	[glTexImage2D]


; Loop.
main_loop:


	pushd	1
	call	[glCallList]


	call	[glFinish]
	pushd	[esp]
	call	[wglSwapBuffers]
	pushd	GL_COLOR_BUFFER_BIT
	call	[glClear]

	sub	esp,28
    pump_loop:
	xor	eax,eax
	mov	edx,esp
	pushd	PM_REMOVE eax eax eax edx
	call	[PeekMessage]
	test	eax,eax
	jz	short pump_end
	pushd	esp
	call	[DispatchMessage]
	jmp	short pump_loop
    pump_end:
	add	esp,28

	mov	eax,[exit_flag]
	test	eax,eax
	jz	main_loop

; Shutdown.
	pushd	[esp+4]
	call	[wglDeleteContext]
	xor	eax,eax
	pushd	eax eax
	call	[ChangeDisplaySettings]
	pop	eax eax

	xor	eax,eax
	dec	eax
	ret	16



win32_wndproc:
	mov	eax,[esp+8]
	cmp	eax,WM_DESTROY
	jz	.wmdestroy
 .defwndproc:
	jmp	[DefWindowProc]
 .wmdestroy:
	inc	[exit_flag]
	xor	eax,eax
	dec	eax
	ret	16


data import

	dd 0,0,0, rva _user  , rva user
	dd 0,0,0, rva _opengl, rva opengl
	dd 0,0,0,0,0


    label user

	RegisterClass		dd rva _RegisterClass
	CreateWindowEx		dd rva _CreateWindowEx
	GetDC			dd rva _GetDC
	ChangeDisplaySettings	dd rva _ChangeDisplaySettings
	PeekMessage		dd rva _PeekMessage
	DispatchMessage 	dd rva _DispatchMessage
	DefWindowProc		dd rva _DefWindowProc
	ShowCursor		dd rva _ShowCursor

    dd 0

    label opengl

	wglGetProcAddress	dd rva _wglGetProcAddress
	wglCreateContext	dd rva _wglCreateContext
	wglDeleteContext	dd rva _wglDeleteContext
	wglMakeCurrent		dd rva _wglMakeCurrent
	wglChoosePixelFormat	dd rva _wglChoosePixelFormat
	wglSetPixelFormat	dd rva _wglSetPixelFormat
	wglSwapBuffers		dd rva _wglSwapBuffers
	glViewport		dd rva _glViewport
	glFinish		dd rva _glFinish
	glEnable		dd rva _glEnable
	glBlendFunc		dd rva _glBlendFunc
	glClear 		dd rva _glClear
	glNewList		dd rva _glNewList
	glEndList		dd rva _glEndList
	glCallList		dd rva _glCallList
	glMatrixMode		dd rva _glMatrixMode
	glLoadMatrixf		dd rva _glLoadMatrixf
	glBindTexture		dd rva _glBindTexture
	glTexParameteri 	dd rva _glTexParameteri
	glTexImage2D		dd rva _glTexImage2D
	glVertex3sv		dd rva _glVertex3sv
	glTexCoord2sv		dd rva _glTexCoord2sv
	glBegin 		dd rva _glBegin
	glEnd			dd rva _glEnd


    dw 0

	_RegisterClass		db 0,0,'RegisterClassA'
	_ChangeDisplaySettings	db 0,0,'ChangeDisplaySettingsA'
	_CreateWindowEx 	db 0,0,'CreateWindowExA'
	_GetDC			db 0,0,'GetDC'
	_DefWindowProc		db 0,0,'DefWindowProcA'
	_PeekMessage		db 0,0,'PeekMessageA'
	_DispatchMessage	db 0,0,'DispatchMessageA'
	_ShowCursor		db 0,0,'ShowCursor'

	_wglGetProcAddress	db 0,0,'wglGetProcAddress'
	_wglCreateContext	db 0,0,'wglCreateContext'
	_wglDeleteContext	db 0,0,'wglDeleteContext'
	_wglMakeCurrent 	db 0,0,'wglMakeCurrent'
	_wglChoosePixelFormat	db 0,0,'wglChoosePixelFormat'
	_wglSetPixelFormat	db 0,0,'wglSetPixelFormat'
	_wglSwapBuffers 	db 0,0,'wglSwapBuffers'
	_glViewport		db 0,0,'glViewport'
	_glFinish		db 0,0,'glFinish'
	_glEnable		db 0,0,'glEnable'
	_glBlendFunc		db 0,0,'glBlendFunc'
	_glClear		db 0,0,'glClear'
	_glNewList		db 0,0,'glNewList'
	_glEndList		db 0,0,'glEndList'
	_glCallList		db 0,0,'glCallList'
	_glMatrixMode		db 0,0,'glMatrixMode'
	_glLoadMatrixf		db 0,0,'glLoadMatrixf'
	_glBindTexture		db 0,0,'glBindTexture'
	_glTexParameteri	db 0,0,'glTexParameteri'
	_glTexImage2D		db 0,0,'glTexImage2D'
	_glVertex3sv		db 0,0,'glVertex3sv'
	_glTexCoord2sv		db 0,0,'glTexCoord2sv'
	_glBegin		db 0,0,'glBegin'
	_glEnd			db 0,0,'glEnd'

	db 0

	_user			db 'USER32',0
	_opengl 		db 'OPENGL32',0

end data

mesh:
 dw -32767,32767
 dw -6554 , 6554,0
 dw -32767,-32767
 dw -6554 ,-6554,0
 dw 32767 ,32767
 dw  6554 , 6554,0
 dw 32767 ,-32767
 dw  6554 ,-6554,0

texture:
 db $00,$FF,$00,$FF,$00,$FF,$00,$FF
 db $FF,$00,$FF,$00,$FF,$00,$FF,$00
 db $00,$FF,$00,$FF,$00,$FF,$00,$FF
 db $FF,$00,$FF,$00,$FF,$00,$FF,$00
 db $00,$FF,$00,$FF,$00,$FF,$00,$FF
 db $FF,$00,$FF,$00,$FF,$00,$FF,$00
 db $00,$FF,$00,$FF,$00,$FF,$00,$FF
 db $FF,$00,$FF,$00,$FF,$00,$FF,$00



exit_flag dd 0

win32_name db 'Test',0
