ÚÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄ¿ ³ Xine - issue #5 - Phile 301 ³ ÀÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÄÙ here come's the nice little gatos funky, they are provided as standalone win32asm compilable exemples, enjoy guys ;----------OpenGL in win32asm example 1---------------- ; ; draw a simple colored rectangle ; can be used as a template for more complex animations ; ; not at all optimized, it's better for code clarity ; by Spanska for Xine#5, February 2001, copyleft ; ; TASM32 /ml /m3 /z /t opengl ; TLINK32 -Tpe -aa opengl,,,import32 opengl32 callW macro x extrn x:PROC call x endm .386p .model flat,STDCALL .data ;------------- funky structures --------------------- paint_struct: pshdc dd ? psfErase dd 0 psrcPaint dd offset rect_struct psfRestore dd ? psfIncUpdate dd ? psrgbReserved db 32 dup(?) rect_struct: rcLeft dd ? rcTop dd ? rcRight dd ? rcBottom dd ? wndclassx: clscbSize dd wndclassx_size clsStyle dd 20h+2+1 ; class style CS_OWNDC+CS_VREDRAW+CS_HREDRAW clsLpfnWndProc dd ? clsCbClsExtra dd 0 clsCbWndExtra dd 0 clsHInstance dd ? ; instance handle clsHIcon dd 0 ; class icon handle clsHCursor dd 0 ; class cursor handle clsHbrBackground dd 7 ; class background brush clsLpszMenuName dd 0 ; menu name clsLpszClassName dd ? ; far ptr to class name clshIconSm dd 0 wndclassx_size equ $-offset wndclassx msg: msHWND dd ? msMESSAGE dd ? msWPARAM dd ? msLPARAM dd ? msTIME dd ? msPT dd ? DDPIXELFORMAT_struct: pfd_nSize dw 0 pfd_nVersion dw 0 pfd_dwFlags dd 0 pfd_iPixelType db 0 pfd_cColorBits db 0 pfd_cRedBits db 0 pfd_cRedShift db 0 pfd_cGreenBits db 0 pfd_cGreenShift db 0 pfd_cBlueBits db 0 pfd_cBlueShift db 0 pfd_cAlphaBits db 0 pfd_cAlphaShift db 0 pfd_cAccumBits db 0 pfd_cAccumRedBits db 0 pfd_cAccumGreenBits db 0 pfd_cAccumBlueBits db 0 pfd_cAccumAlphaBits db 0 pfd_cDepthBits db 0 pfd_cStencilBits db 0 pfd_cAuxBuffers db 0 pfd_iLayerType db 0 pfd_bReserved db 0 pfd_dwLayerMask dd 0 pfd_dwVisibleMask dd 0 pfd_dwDamageMask dd 0 DDPIXELFORMAT_struct_size equ $-offset DDPIXELFORMAT_struct ;------------- some data --------------------- nom_fenetre db "OpenGL",0 handle dd ? handle_wd dd ? pixformat dd ? theDC dd ? theRC dd ? .code start: ;----------------- register wndclass ---------------------------- push 0 callW GetModuleHandleA mov handle, eax mov clsHInstance, eax mov eax, offset wndproc mov clsLpfnWndProc, eax mov clsLpszClassName, offset nom_fenetre push offset wndclassx callW RegisterClassExA ;--------------------- create the window -------------------------- push 0 push handle push 0 push 0 ;HWND_DESKTOP push 400 ;hauteur push 600 ;largeur push 0 ;y push 0 ;x push 0CF0000h+4000000h+2000000h ;WS_OVERLAPPEDWINDOW+WS_CLIPSIBLINGS+WS_CLIPCHILDREN push offset nom_fenetre push offset nom_fenetre push 0 ;extra style callW CreateWindowExA mov handle_wd, eax ;------------------------ show window ------------------------------ push 1 push handle_wd callW ShowWindow push handle_wd callW UpdateWindow call enable_opengl ;<========= NOW! ;------------------------ the message loop ---------------------------------- winmain_msg_loop: push 0 push 0 push handle_wd callW InvalidateRect ;force paint push 1 push 0 push 0 push 0 push offset msg callW PeekMessageA cmp eax, 0 jnz process_messages jmp winmain_msg_loop ;----- check if window is closed -------- process_messages: cmp msMESSAGE, 12h ;WM_QUIT equ 0012h je end_loop push offset msg callW TranslateMessage push offset msg callW DispatchMessageA jmp winmain_msg_loop end_loop: call disable_opengl ;<========= NOW! push msWPARAM callW ExitProcess ;------------------ windows proc ------------------------ wndproc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD cmp wmsg,2 ;WM_DESTROY? jne suite1 push 0 callW PostQuitMessage xor eax, eax jmp wndproc_end suite1: cmp wmsg, 0fh ;WM_PAINT? jne suite2 push offset rect_struct push handle_wd callW GetClientRect mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW BeginPaint call draw_opengl ;<========= NOW! mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW EndPaint xor eax, eax jmp wndproc_end suite2: push lparam push wparam push wmsg push hwnd callW DefWindowProcA wndproc_end: ret wndproc endp ;--------------------- disable OpenGL ---------------------- disable_opengl: push 0 push 0 callW wglMakeCurrent push theRC callW wglDeleteContext push theDC push handle_wd callW ReleaseDC ret ;--------------------- enable OpenGL for window ----------------------------------- enable_opengl: push handle_wd callW GetDC mov theDC, eax ;set pixel format mov pfd_nSize, DDPIXELFORMAT_struct_size mov pfd_nVersion, 1 mov pfd_dwFlags, 20h+1+4 ;PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER OR PFD_DRAW_TO_WINDOW mov pfd_dwLayerMask, 0 ;PFD_MAIN_PLANE mov pfd_iPixelType, 0 ;PFD_TYPE_RGBA mov pfd_cColorBits, 24 mov pfd_cDepthBits, 16 mov pfd_cAccumBits, 0 mov pfd_cStencilBits, 0 push offset DDPIXELFORMAT_struct push theDC callW ChoosePixelFormat mov pixformat, eax push offset DDPIXELFORMAT_struct push pixformat push theDC callW SetPixelFormat ;once you call this, td32 becomes crazy? push theDC callW wglCreateContext mov theRC, eax push theRC push theDC callW wglMakeCurrent ;clear background push 0 push 0 push 0 push 0 callW glClearColor ;define window push 400 push 600 push 0 push 0 callW glViewport ;define the perspective parameters ;here it's simple 2D so we use a simple orthographic matrix push 1701h ;GL_PROJECTION callW glMatrixMode callW glLoadIdentity push 3ff00000h ;this is 1.875 in floating number format [distance max] push 0 push 0 ;[distance min] push 0 push 40240000h ;2.5625 [top] push 0 push 0c0240000h ;-2.5625 [bottom] push 0 push 40240000h ;2.5625 [right] push 0 push 0c0240000h ;-2.5625 [left] push 0 callW glOrtho ;define the eye parameters ;identity matrix is enough here push 1700h ;GL_MODELVIEW callW glMatrixMode callW glLoadIdentity ret draw_opengl: ;----------------- here goes the OpenGL animation ------------------------- ;clear color buffer push 4000h ;GL_COLOR_BUFFER_BIT callW glClear ;define what we are drawing (object, colors) push 9 ;GL_POLYGON callW glBegin ;first corner: red push 0 ;blue push 0 ;green push 3f800000h ;red = 1 callW glColor3f push 0c0a00000h ;y = -5 push 0c0a00000h ;x = -5 callW glVertex2f ;second corner: white push 3f800000h ;blue = 1 push 3f800000h ;green = 1 push 3f800000h ;red = 1 callW glColor3f push 40a00000h ;y = 5 push 0c0a00000h ;x = -5 callW glVertex2f ;third corner: blue push 3f800000h ;blue = 1 push 0 ;green push 0 ;red callW glColor3f push 40a00000h ;y = 5 push 40a00000h ;x = 5 callW glVertex2f ;fourth corner: green push 0 ;blue push 3f800000h ;green = 1 push 0 ;red callW glColor3f push 0c0a00000h ;y = -5 push 40a00000h ;x = 5 callW glVertex2f callW glEnd callW glFlush ;execute OpenGL commands now push theDC ;not really useful here cause no animation callW SwapBuffers ;exchange front and back buffer ret end start ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;----------OpenGL in win32asm example 2---------------- ; ; draw some simple objects in 3D and rotate them ; ; not at all optimized, it's better for code clarity ; by Spanska for Xine#5, February 2001, copyleft ; ; TASM32 /ml /m3 /z /t opengl ; TLINK32 -Tpe -aa opengl,,,import32 opengl32 callW macro x extrn x:PROC call x endm .386p .model flat,STDCALL .data ;------------- funky structures --------------------- paint_struct: pshdc dd ? psfErase dd 0 psrcPaint dd offset rect_struct psfRestore dd ? psfIncUpdate dd ? psrgbReserved db 32 dup(?) rect_struct: rcLeft dd ? rcTop dd ? rcRight dd ? rcBottom dd ? wndclassx: clscbSize dd wndclassx_size clsStyle dd 20h+2+1 ; class style CS_OWNDC+CS_VREDRAW+CS_HREDRAW clsLpfnWndProc dd ? clsCbClsExtra dd 0 clsCbWndExtra dd 0 clsHInstance dd ? ; instance handle clsHIcon dd 0 ; class icon handle clsHCursor dd 0 ; class cursor handle clsHbrBackground dd 7 ; class background brush clsLpszMenuName dd 0 ; menu name clsLpszClassName dd ? ; far ptr to class name clshIconSm dd 0 wndclassx_size equ $-offset wndclassx msg: msHWND dd ? msMESSAGE dd ? msWPARAM dd ? msLPARAM dd ? msTIME dd ? msPT dd ? DDPIXELFORMAT_struct: pfd_nSize dw 0 pfd_nVersion dw 0 pfd_dwFlags dd 0 pfd_iPixelType db 0 pfd_cColorBits db 0 pfd_cRedBits db 0 pfd_cRedShift db 0 pfd_cGreenBits db 0 pfd_cGreenShift db 0 pfd_cBlueBits db 0 pfd_cBlueShift db 0 pfd_cAlphaBits db 0 pfd_cAlphaShift db 0 pfd_cAccumBits db 0 pfd_cAccumRedBits db 0 pfd_cAccumGreenBits db 0 pfd_cAccumBlueBits db 0 pfd_cAccumAlphaBits db 0 pfd_cDepthBits db 0 pfd_cStencilBits db 0 pfd_cAuxBuffers db 0 pfd_iLayerType db 0 pfd_bReserved db 0 pfd_dwLayerMask dd 0 pfd_dwVisibleMask dd 0 pfd_dwDamageMask dd 0 DDPIXELFORMAT_struct_size equ $-offset DDPIXELFORMAT_struct ;------------- some data --------------------- nom_fenetre db "OpenGL",0 handle dd ? handle_wd dd ? pixformat dd ? theDC dd ? theRC dd ? angle dd 0 objet1 dd ? objet2 dd ? ;-------- name some simple precision float numbers --------------------- ; (NB: i may not use them all) float TYPEDEF REAL4 increment float 3.0 p0_1 float 0.1 p0_5 float 0.5 m0_5 float -0.5 p1_0 float 1.0 m1_0 float -1.0 p1_3 float 1.333333333 m1_5 float -1.5 p1_5 float 1.5 p1_6 float 1.6 p1_7 float 1.7 p1_8 float 1.8 p1_85 float 1.85 p1_9 float 1.9 p2_0 float 2.0 m2_0 float -2.0 m3_0 float -3.0 p3_0 float 3.0 m4_0 float -4.0 p4_0 float 4.0 m5_0 float -5.0 p5_0 float 5.0 m6_0 float -6.0 m8_0 float -8.0 p10 float 10.0 m10 float -10.0 m40 float -40.0 p40 float 40.0 p45 float 45.0 ;-------- name some double precision float numbers --------------------- ; (NB: i may not use them all) dfloat TYPEDEF REAL8 p0__1 dfloat 0.1 p1__0 dfloat 1.0 p1__33 dfloat 1.3333 p2__0 dfloat 2.0 p3__0 dfloat 3.0 m3__0 dfloat -3.0 p4__0 dfloat 4.0 p5__0 dfloat 5.0 m5__0 dfloat -5.0 p7__0 dfloat 7.0 pp10 dfloat 10.0 mm10 dfloat -10.0 pp40 dfloat 40.0 pp45 dfloat 45.0 ;-------- small structures with float numbers --------------------- Light_Diffuse: qq1 float 1.0 ;Red qq2 float 1.0 ;Green qq3 float 1.0 ;Blue qq4 float 1.0 ;alpha? Light_Position: qq5 float 10.0 ;x qq6 float 10.0 ;y qq7 float 10.0 ;z qq8 float 0 ;directional source .code start: ;----------------- register wndclass ---------------------------- push 0 callW GetModuleHandleA mov handle, eax mov clsHInstance, eax mov eax, offset wndproc mov clsLpfnWndProc, eax mov clsLpszClassName, offset nom_fenetre push offset wndclassx callW RegisterClassExA ;--------------------- create the window -------------------------- push 0 push handle push 0 push 0 ;HWND_DESKTOP push 500 ;hauteur push 500 ;largeur push 0 ;y push 0 ;x push 0CF0000h+4000000h+2000000h ;WS_OVERLAPPEDWINDOW+WS_CLIPSIBLINGS+WS_CLIPCHILDREN push offset nom_fenetre push offset nom_fenetre push 0 ;extra style callW CreateWindowExA mov handle_wd, eax ;------------------------ show window ------------------------------ push 1 push handle_wd callW ShowWindow push handle_wd callW UpdateWindow call enable_opengl ;<========= NOW! ;------------------------ the message loop ---------------------------------- winmain_msg_loop: push 0 push 0 push handle_wd callW InvalidateRect ;force paint push 1 push 0 push 0 push 0 push offset msg callW PeekMessageA cmp eax, 0 jnz process_messages jmp winmain_msg_loop ;----- check if window is closed -------- process_messages: cmp msMESSAGE, 12h ;WM_QUIT equ 0012h je end_loop push offset msg callW TranslateMessage push offset msg callW DispatchMessageA jmp winmain_msg_loop end_loop: call disable_opengl ;<========= NOW! push msWPARAM callW ExitProcess ;------------------ windows proc ------------------------ wndproc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD cmp wmsg,2 ;WM_DESTROY? jne suite1 call disable_opengl push 0 callW PostQuitMessage xor eax, eax jmp wndproc_end suite1: cmp wmsg, 0fh ;WM_PAINT? jne suite2 push offset rect_struct push handle_wd callW GetClientRect mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW BeginPaint call draw_opengl mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW EndPaint xor eax, eax jmp wndproc_end suite2: push lparam push wparam push wmsg push hwnd callW DefWindowProcA wndproc_end: ret wndproc endp ;--------------------- disable OpenGL ---------------------- disable_opengl: push 0 push 0 callW wglMakeCurrent push theRC callW wglDeleteContext push theDC push handle_wd callW ReleaseDC ret ;--------------------- enable OpenGL for window ----------------------------------- enable_opengl: push handle_wd callW GetDC mov theDC, eax mov pfd_nSize, DDPIXELFORMAT_struct_size mov pfd_nVersion, 1 mov pfd_dwFlags, 20h+1+4 ;PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER OR PFD_DRAW_TO_WINDOW mov pfd_dwLayerMask, 0 ;PFD_MAIN_PLANE mov pfd_iPixelType, 0 ;PFD_TYPE_RGBA mov pfd_cColorBits, 24 mov pfd_cDepthBits, 16 mov pfd_cAccumBits, 0 mov pfd_cStencilBits, 0 push offset DDPIXELFORMAT_struct push theDC callW ChoosePixelFormat mov pixformat, eax push offset DDPIXELFORMAT_struct push pixformat push theDC callW SetPixelFormat ;once you call this, td32 becomes crazy? push theDC callW wglCreateContext mov theRC, eax push theRC push theDC callW wglMakeCurrent ;--------------------- prepare OpenGL ---------------------- ;pre-build objects in a list to speed up the process push 2 ;2 objects = 2 lists callW glGenLists mov objet1, eax ;-------- the cube (with normal, so lighting depends on light angle) push 1300h ;GL_COMPILE push objet1 callW glNewList ;first list push 7 ;GL_QUADS callW glBegin ;front face push p1_0 push 0 push 0 callW glNormal3f ;normal points away from the viewer push 0 push 0 push p1_0 callW glColor3f ;first corner color red push p1_0 push p1_0 push p1_0 callW glVertex3f ;first corner coordz: top right push 0 push p1_0 push 0 callW glColor3f ;second corner color green push p1_0 push m1_0 push p1_0 callW glVertex3f ;second corner coordz: bottom right push p1_0 push p1_0 push p1_0 callW glColor3f ;third corner color white push p1_0 push m1_0 push m1_0 callW glVertex3f ;third corner coordz: bottom left push p1_0 push 0 push p1_0 callW glColor3f ;fourth corner color pink push p1_0 push p1_0 push m1_0 callW glVertex3f ;fourth corner coordz: top left ;left face push 0 push 0 push p1_0 callW glNormal3f ;normal points to the right push p1_0 push 0 push 0 callW glColor3f ;first corner color blue push p1_0 push p1_0 push p1_0 callW glVertex3f ;first corner coordz: top front push p1_0 push 0 push 0 callW glColor3f ;second corner color blue push p1_0 push m1_0 push p1_0 callW glVertex3f ;second corner coordz: bottom front push 0 push 0 push p1_0 callW glColor3f ;third corner color red push m1_0 push m1_0 push p1_0 callW glVertex3f ;third corner coordz: bottom far push 0 push 0 push p1_0 callW glColor3f ;fourth corner color red push m1_0 push p1_0 push p1_0 callW glVertex3f ;fourth corner coordz: top far callW glEnd callW glEndList ;-------- the pyramid (no normals: no shadow effect) mov eax, objet1 inc eax mov objet2, eax ;second object handle push 1300h ;GL_COMPILE push objet2 callW glNewList ;second list push 4 ;GL_TRIANGLE callW glBegin ;front face red push 0 push 0 push p1_0 callW glColor3f push 0 push 0 push 0 callW glVertex3f push 0 push p1_0 push 0 callW glVertex3f push 0 push 0 push p1_0 callW glVertex3f ;right-back face blue push p1_0 push 0 push 0 callW glColor3f push 0 push p1_0 push 0 callW glVertex3f push 0 push 0 push p1_0 callW glVertex3f push m1_0 push 0 push 0 callW glVertex3f ;left face pink push p1_0 push 0 push p1_0 callW glColor3f push 0 push 0 push 0 callW glVertex3f push m1_0 push 0 push 0 callW glVertex3f push 0 push p1_0 push 0 callW glVertex3f ;bottom face white push p1_0 push p1_0 push p1_0 callW glColor3f push 0 push 0 push 0 callW glVertex3f push 0 push 0 push p1_0 callW glVertex3f push m1_0 push 0 push 0 callW glVertex3f callW glEnd callW glEndList ;others things push 0 push 0 push 0 push 0 callW glClearColor push 500 push 500 push 0 push 0 callW glViewport push p1__0 callW glClearDepth push 0b71h ;GL_DEPTH_TEST callW glEnable push 203h ;GL_LEQUAL callW glDepthFunc push 1102h ;GL_NICEST push 0c50h ;GL_PERSPECTIVE_CORRECTION_HINT callW glHint push 1d01h ;GL_SMOOTH callW glShadeModel ;push 0b44h ;GL_CULL_FACE ;callW glEnable ;Don't show faces when drawn counter clockwise push 1701h ;GL_PROJECTION callW glMatrixMode callW glLoadIdentity push pp10 ;zfar push p4__0 ;znear push p3__0 ;top push m3__0 ;bottom push p3__0 ;right push m3__0 ;left callW glFrustum push 1700h ;GL_MODELVIEW callW glMatrixMode callW glLoadIdentity push offset Light_Diffuse push 1201h ;GL_DIFFUSE push 4000h ;GL_LIGHT0 callW glLightfv push offset Light_Position push 1203h ;GL_POSITION push 4000h ;GL_LIGHT0 callW glLightfv push 0b57h ;GL_COLOR_MATERIAL callW glEnable ret ;--------------------- calculate, draw, eat cpu time... ---------------------- draw_opengl: push 4000h+100h ;GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT callW glClear ;--- draw rotating rectangle on ze left callW glLoadIdentity push m6_0 ;z push 0 ;y push m1_5 ;x callW glTranslatef push 0 push p1_0 push 0 push angle callW glRotatef push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push objet1 callW glCallList ;---- Draw rotating pyramid on the right callW glLoadIdentity push m5_0 ;z push 0 ;y push p2_0 ;x callW glTranslatef push p1_0 push p1_0 push p1_0 push angle callW glRotatef push p1_0 push 0 push 0 callW glColor3f push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push objet2 callW glCallList push theDC callW SwapBuffers fld angle fadd increment ;increment angle fstp angle ret end start ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;----------OpenGL in win32asm example 3---------------- ; ; draw some letters in 3D and rotate them ; ; not at all optimized, it's better for code clarity ; by Spanska for Xine#5, February 2001, copyleft ; ; TASM32 /ml /m3 /z /t opengl ; TLINK32 -Tpe -aa opengl,,,import32 opengl32 callW macro x extrn x:PROC call x endm .386p .model flat,STDCALL .data ;------------- funky structures --------------------- paint_struct: pshdc dd ? psfErase dd 0 psrcPaint dd offset rect_struct psfRestore dd ? psfIncUpdate dd ? psrgbReserved db 32 dup(?) rect_struct: rcLeft dd ? rcTop dd ? rcRight dd ? rcBottom dd ? wndclassx: clscbSize dd wndclassx_size clsStyle dd 20h+2+1 ; class style CS_OWNDC+CS_VREDRAW+CS_HREDRAW clsLpfnWndProc dd ? clsCbClsExtra dd 0 clsCbWndExtra dd 0 clsHInstance dd ? ; instance handle clsHIcon dd 0 ; class icon handle clsHCursor dd 0 ; class cursor handle clsHbrBackground dd 7 ; class background brush clsLpszMenuName dd 0 ; menu name clsLpszClassName dd ? ; far ptr to class name clshIconSm dd 0 wndclassx_size equ $-offset wndclassx msg: msHWND dd ? msMESSAGE dd ? msWPARAM dd ? msLPARAM dd ? msTIME dd ? msPT dd ? DDPIXELFORMAT_struct: pfd_nSize dw 0 pfd_nVersion dw 0 pfd_dwFlags dd 0 pfd_iPixelType db 0 pfd_cColorBits db 0 pfd_cRedBits db 0 pfd_cRedShift db 0 pfd_cGreenBits db 0 pfd_cGreenShift db 0 pfd_cBlueBits db 0 pfd_cBlueShift db 0 pfd_cAlphaBits db 0 pfd_cAlphaShift db 0 pfd_cAccumBits db 0 pfd_cAccumRedBits db 0 pfd_cAccumGreenBits db 0 pfd_cAccumBlueBits db 0 pfd_cAccumAlphaBits db 0 pfd_cDepthBits db 0 pfd_cStencilBits db 0 pfd_cAuxBuffers db 0 pfd_iLayerType db 0 pfd_bReserved db 0 pfd_dwLayerMask dd 0 pfd_dwVisibleMask dd 0 pfd_dwDamageMask dd 0 DDPIXELFORMAT_struct_size equ $-offset DDPIXELFORMAT_struct ;------------- some data --------------------- nom_fenetre db "OpenGL",0 handle dd ? handle_wd dd ? pixformat dd ? theDC dd ? theRC dd ? objet1 dd ? objet2 dd ? font dd ? name_font db "Comic Sans MS",0 texte db "Mali" texte_size equ $ - offset texte ;-------- name some simple precision float numbers --------------------- ; (NB: i may not use them all) float TYPEDEF REAL4 angle float 0.0 increment float 3.0 p0_1 float 0.1 m0_1 float -0.1 p0_5 float 0.5 m0_5 float -0.5 m0_8 float -0.8 p0_8 float 0.8 p1_0 float 1.0 m1_0 float -1.0 p1_3 float 1.333333333 m1_5 float -1.5 p1_5 float 1.5 p1_6 float 1.6 p1_7 float 1.7 p1_8 float 1.8 p1_85 float 1.85 p1_9 float 1.9 p2_0 float 2.0 m2_0 float -2.0 m3_0 float -3.0 m3_5 float -3.5 p3_0 float 3.0 m4_0 float -4.0 p4_0 float 4.0 m5_0 float -5.0 p5_0 float 5.0 m6_0 float -6.0 m8_0 float -8.0 p10 float 10.0 m10 float -10.0 m40 float -40.0 p40 float 40.0 p45 float 45.0 ;-------- name some double precision float numbers --------------------- ; (NB: i may not use them all) dfloat TYPEDEF REAL8 p0__1 dfloat 0.1 p0__5 dfloat 0.5 m0__5 dfloat -0.5 p1__0 dfloat 1.0 p1__33 dfloat 1.3333 p2__0 dfloat 2.0 p3__0 dfloat 3.0 m3__0 dfloat -3.0 p4__0 dfloat 4.0 p5__0 dfloat 5.0 m5__0 dfloat -5.0 p7__0 dfloat 7.0 pp10 dfloat 10.0 mm10 dfloat -10.0 pp20 dfloat 20.0 pp40 dfloat 40.0 pp45 dfloat 45.0 ;-------- small structures with float numbers --------------------- Light_Diffuse: qq1 float 1.0 ;Red qq2 float 1.0 ;Green qq3 float 1.0 ;Blue qq4 float 1.0 ;alpha? Light_Position: qq5 float 10.0 ;x qq6 float 10.0 ;y qq7 float 10.0 ;z qq8 float 0 ;directional source .code start: ;----------------- enregistrer la wndclass ---------------------------- push 0 callW GetModuleHandleA mov handle, eax mov clsHInstance, eax mov eax, offset wndproc mov clsLpfnWndProc, eax mov clsLpszClassName, offset nom_fenetre push offset wndclassx callW RegisterClassExA ;--------------------- create the window -------------------------- push 0 push handle push 0 push 0 ;HWND_DESKTOP push 500 ;hauteur push 500 ;largeur push 0 ;y push 0 ;x push 0CF0000h+4000000h+2000000h ;WS_OVERLAPPEDWINDOW+WS_CLIPSIBLINGS+WS_CLIPCHILDREN push offset nom_fenetre push offset nom_fenetre push 0 ;extra style callW CreateWindowExA mov handle_wd, eax ;------------------------ show window ------------------------------ push 1 push handle_wd callW ShowWindow push handle_wd callW UpdateWindow call enable_opengl ;<========= NOW! ;---------------------- the message loop ----------------------------- winmain_msg_loop: push 0 push 0 push handle_wd callW InvalidateRect ;force paint? push 1 push 0 push 0 push 0 push offset msg callW PeekMessageA cmp eax, 0 jnz process_messages jmp winmain_msg_loop ;----- check if window is closed -------- process_messages: cmp msMESSAGE, 12h ;WM_QUIT equ 0012h je end_loop push offset msg callW TranslateMessage push offset msg callW DispatchMessageA jmp winmain_msg_loop end_loop: call disable_opengl ;<========= NOW! push msWPARAM callW ExitProcess ;------------------ windows proc ------------------------ wndproc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD cmp wmsg,2 ;WM_DESTROY? jne suite1 call disable_opengl push 0 callW PostQuitMessage xor eax, eax jmp wndproc_end suite1: cmp wmsg, 0fh ;WM_PAINT? jne suite3 push offset rect_struct push handle_wd callW GetClientRect mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW BeginPaint call draw_opengl mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW EndPaint xor eax, eax jmp wndproc_end suite3: cmp wmsg, 100h ;WM_KEYDOWN? jne suite4 push 0 callW PostQuitMessage xor eax, eax jmp wndproc_end suite4: push lparam push wparam push wmsg push hwnd callW DefWindowProcA wndproc_end: ret wndproc endp ;--------------------- disable OpenGL ---------------------- disable_opengl: push 256 push objet1 callW glDeleteLists ;kill font push 0 push 0 callW wglMakeCurrent push theRC callW wglDeleteContext push theDC push handle_wd callW ReleaseDC ret ;--------------------- enable OpenGL for window ----------------------------------- enable_opengl: push handle_wd callW GetDC mov theDC, eax mov pfd_nSize, DDPIXELFORMAT_struct_size mov pfd_nVersion, 1 mov pfd_dwFlags, 20h+1+4 ;PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER OR PFD_DRAW_TO_WINDOW mov pfd_dwLayerMask, 0 ;PFD_MAIN_PLANE mov pfd_iPixelType, 0 ;PFD_TYPE_RGBA mov pfd_cColorBits, 24 mov pfd_cDepthBits, 16 mov pfd_cAccumBits, 0 mov pfd_cStencilBits, 0 push offset DDPIXELFORMAT_struct push theDC callW ChoosePixelFormat mov pixformat, eax push offset DDPIXELFORMAT_struct push pixformat push theDC callW SetPixelFormat ;once you call this, td32 becomes crazy? push theDC callW wglCreateContext mov theRC, eax push theRC push theDC callW wglMakeCurrent ;--------------------- prepare OpenGL ---------------------- ;pre-build font in 256 display lists push 256 callW glGenLists mov objet1, eax push offset name_font push 0+0 ;family and pitch FF_DONTCARE+DEFAULT_PITCH push 4 ;output quality = ANTIALIASED_QUALITY push 0 ;clipping precision = CLIP_DEFAULT_PRECIS push 4 ;output precision = OUT_TT_PRECIS push 0 ;character set identifier = ANSI_CHARSET push 0 ;strikeout = FALSE push 0 ;underline = FALSE push 0 ;italic = FALSE push 700h ;weight = FW_BOLD push 0 ;orientation push 0 ;angle push 0 ;width push -1 ;height callW CreateFontA mov font, eax push font push theDC callW SelectObject push 0 ;When lpgmf is NULL, no glyph metrics are returned push 1 ;format = WGL_FONT_POLYGONS =1 , 0 = lines push p0_1 ;thickness in float push 0 ;deviation in float (nb of polygons in letter, 0 = best, but slooow) push objet1 push 255 ;nb of display lists to build push 0 ;starting character push theDC callW wglUseFontOutlinesA ;clear background and define window push 0 push 0 push 0 push 0 callW glClearColor push 500 push 500 push 0 push 0 callW glViewport ;set some parameters push 0b57h ;GL_COLOR_MATERIAL callW glEnable push p1__0 callW glClearDepth push 0b71h ;GL_DEPTH_TEST callW glEnable push 203h ;GL_LEQUAL callW glDepthFunc push 1102h ;GL_NICEST push 0c50h ;GL_PERSPECTIVE_CORRECTION_HINT callW glHint push 1d01h ;GL_SMOOTH callW glShadeModel ;push 0b44h ;GL_CULL_FACE ;callW glEnable ;Don't show faces when drawn counter clockwise ;define the eye parameters (position, perspective distortion) push 1701h ;GL_PROJECTION callW glMatrixMode callW glLoadIdentity push p4__0 ;zfar push p1__0 ;znear push p0__5 ;top push m0__5 ;bottom push p0__5 ;right push m0__5 ;left callW glFrustum ;define the object location push 1700h ;GL_MODELVIEW callW glMatrixMode callW glLoadIdentity push m3_0 ;angle ;z This time object coordz are defined at start push 0 ;y And at each draw_opengl, we don't put the matrix push 0 ;x back to zero with glLoadIdentity callW glTranslatef ret ;--------------------- calculate, draw, eat cpu time... ---------------------- draw_opengl: callW glPushMatrix ;save position ;go a bit to the left so text is centered push 0 ;z push 0 ;y push m1_0 ;x callW glTranslatef ;define text properties push 4000h+100h ;GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT callW glClear push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push p0_5 push p1_0 push p0_5 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte_size callW glCallLists callW glPopAttrib ;now come back, from end of text, a bit to the left and behind the text push m1_0 ;z push 0 ;y push m0_8 ;x callW glTranslatef ;define rectangle properties push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push 7 ;GL_QUADS callW glBegin ;draw multicolor rectangle push p1_0 push 0 push 0 callW glNormal3f ;pointe vers l'avant push 0 push 0 push p1_0 callW glColor3f push p0_5 push p0_5 push p0_5 callW glVertex3f push 0 push p1_0 push p1_0 callW glColor3f push p0_5 push m0_5 push p0_5 callW glVertex3f push p1_0 push 0 push p1_0 callW glColor3f push p0_5 push m0_5 push m0_5 callW glVertex3f push p1_0 push 0 push 0 callW glColor3f push p0_5 push p0_5 push m0_5 callW glVertex3f callW glEnd ;pop initial position/orientation of the objects callW glPopMatrix ;rotate the matrix a bit push p1_0 push p1_0 push p1_0 push increment callW glRotatef push theDC callW SwapBuffers ret end start ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;----------OpenGL in win32asm example 4---------------- ; ; draw some text in 3D do a StarWars like effect ; for the fun, define a non standart-shaped window ; ; not at all optimized, it's better for code clarity ; by Spanska for Xine#5, February 2001, copyleft ; ; TASM32 /ml /m3 /z /t opengl ; TLINK32 -Tpe -aa opengl,,,import32 opengl32 callW macro x extrn x:PROC call x endm .386p .model flat,STDCALL .data ;------------- funky structures --------------------- paint_struct: pshdc dd ? psfErase dd 0 psrcPaint dd offset rect_struct psfRestore dd ? psfIncUpdate dd ? psrgbReserved db 32 dup(?) rect_struct: rcLeft dd ? rcTop dd ? rcRight dd ? rcBottom dd ? wndclassx: clscbSize dd wndclassx_size clsStyle dd 20h+2+1 ; class style CS_OWNDC+CS_VREDRAW+CS_HREDRAW clsLpfnWndProc dd ? clsCbClsExtra dd 0 clsCbWndExtra dd 0 clsHInstance dd ? ; instance handle clsHIcon dd 0 ; class icon handle clsHCursor dd 0 ; class cursor handle clsHbrBackground dd 7 ; class background brush clsLpszMenuName dd 0 ; menu name clsLpszClassName dd ? ; far ptr to class name clshIconSm dd 0 wndclassx_size equ $-offset wndclassx msg: msHWND dd ? msMESSAGE dd ? msWPARAM dd ? msLPARAM dd ? msTIME dd ? msPT dd ? DDPIXELFORMAT_struct: pfd_nSize dw 0 pfd_nVersion dw 0 pfd_dwFlags dd 0 pfd_iPixelType db 0 pfd_cColorBits db 0 pfd_cRedBits db 0 pfd_cRedShift db 0 pfd_cGreenBits db 0 pfd_cGreenShift db 0 pfd_cBlueBits db 0 pfd_cBlueShift db 0 pfd_cAlphaBits db 0 pfd_cAlphaShift db 0 pfd_cAccumBits db 0 pfd_cAccumRedBits db 0 pfd_cAccumGreenBits db 0 pfd_cAccumBlueBits db 0 pfd_cAccumAlphaBits db 0 pfd_cDepthBits db 0 pfd_cStencilBits db 0 pfd_cAuxBuffers db 0 pfd_iLayerType db 0 pfd_bReserved db 0 pfd_dwLayerMask dd 0 pfd_dwVisibleMask dd 0 pfd_dwDamageMask dd 0 DDPIXELFORMAT_struct_size equ $-offset DDPIXELFORMAT_struct ;------------- some data --------------------- nom_fenetre db "OpenGL",0 handle dd ? handle_wd dd ? pixformat dd ? theDC dd ? theRC dd ? angle dd 0 objet1 dd ? objet2 dd ? font dd ? name_font db "Comic Sans MS",0 texte1 db "Miserables" texte1_size equ $ - offset texte1 texte2 db " by " texte2_size equ $ - offset texte2 texte3 db " Victor " texte3_size equ $ - offset texte3 texte4 db " and " texte4_size equ $ - offset texte4 texte5 db " Hugo " texte5_size equ $ - offset texte5 ;-------- name some simple precision float numbers --------------------- ; (NB: i may not use them all) float TYPEDEF REAL4 position_z float -2.0 increment float 0.02 p0_1 float 0.1 m0_1 float -0.1 p0_5 float 0.5 m0_5 float -0.5 m0_8 float -0.8 p0_8 float 0.8 p1_0 float 1.0 m1_0 float -1.0 p1_3 float 1.333333333 m1_5 float -1.5 p1_5 float 1.5 p1_6 float 1.6 p1_7 float 1.7 p1_8 float 1.8 p1_85 float 1.85 p1_9 float 1.9 p2_0 float 2.0 m2_0 float -2.0 m2_5 float -2.5 m3_0 float -3.0 m3_5 float -3.5 p3_0 float 3.0 m4_0 float -4.0 p4_0 float 4.0 m5_0 float -5.0 p5_0 float 5.0 m6_0 float -6.0 m8_0 float -8.0 p10 float 10.0 m10 float -10.0 m40 float -40.0 p40 float 40.0 p45 float 45.0 m45 float -45.0 m60 float -60.0 m70 float -70.0 p90 float 90.0 m90 float -90.0 ;-------- name some double precision float numbers --------------------- ; (NB: i may not use them all) dfloat TYPEDEF REAL8 p0__1 dfloat 0.1 p0__5 dfloat 0.5 m0__5 dfloat -0.5 p1__0 dfloat 1.0 p1__33 dfloat 1.3333 p2__0 dfloat 2.0 p3__0 dfloat 3.0 m3__0 dfloat -3.0 p4__0 dfloat 4.0 p5__0 dfloat 5.0 m5__0 dfloat -5.0 p7__0 dfloat 7.0 pp10 dfloat 10.0 mm10 dfloat -10.0 pp20 dfloat 20.0 pp40 dfloat 40.0 pp45 dfloat 45.0 ;-------- small structures with float numbers --------------------- Light_Diffuse: qq1 float 1.0 ;Red qq2 float 1.0 ;Green qq3 float 1.0 ;Blue qq4 float 1.0 ;alpha? Light_Position: qq5 float 10.0 ;x qq6 float 10.0 ;y qq7 float 10.0 ;z qq8 float 0 ;directional source .code start: ;----------------- register wndclass ---------------------------- push 0 callW GetModuleHandleA mov handle, eax mov clsHInstance, eax mov eax, offset wndproc mov clsLpfnWndProc, eax mov clsLpszClassName, offset nom_fenetre push offset wndclassx callW RegisterClassExA ;--------------------- create the window -------------------------- push 0 push handle push 0 push 0 ;HWND_DESKTOP push 400 ;hauteur push 800 ;largeur push 100 ;y push 0 ;x push 0CF0000h+4000000h+2000000h ;WS_OVERLAPPEDWINDOW+WS_CLIPSIBLINGS+WS_CLIPCHILDREN push offset nom_fenetre push offset nom_fenetre push 0 ;extra style callW CreateWindowExA mov handle_wd, eax ;---------- define ellipsoidal window mask ------------------- push 395 ;y lower-right push 790 ;x lower-right push 30 ;y upper-left push 10 ;x upper-left callW CreateEllipticRgn ;return region handle push 1 ;window redraw flag 1=true push eax ;handle to region push handle_wd callW SetWindowRgn ;------------------------ show window ------------------------------ push 1 push handle_wd callW ShowWindow push handle_wd callW UpdateWindow call enable_opengl ;--------------------- the message loop -------------------------- winmain_msg_loop: push 0 push 0 push handle_wd callW InvalidateRect ;force paint? push 1 push 0 push 0 push 0 push offset msg callW PeekMessageA cmp eax, 0 jnz process_messages jmp winmain_msg_loop ;----- check if window is closed -------- process_messages: cmp msMESSAGE, 12h ;WM_QUIT equ 0012h je end_loop push offset msg callW TranslateMessage push offset msg callW DispatchMessageA jmp winmain_msg_loop end_loop: call disable_opengl push msWPARAM callW ExitProcess ;------------------ windows proc ------------------------ wndproc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD cmp wmsg,2 ;WM_DESTROY? jne suite1 call disable_opengl push 0 callW PostQuitMessage xor eax, eax jmp wndproc_end suite1: cmp wmsg, 0fh ;WM_PAINT? jne suite3 push offset rect_struct push handle_wd callW GetClientRect mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW BeginPaint call draw_opengl mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW EndPaint xor eax, eax jmp wndproc_end suite3: cmp wmsg, 100h ;WM_KEYDOWN? jne suite4 push 0 callW PostQuitMessage xor eax, eax jmp wndproc_end suite4: push lparam push wparam push wmsg push hwnd callW DefWindowProcA wndproc_end: ret wndproc endp ;--------------------- disable OpenGL ---------------------- disable_opengl: push 256 push objet1 callW glDeleteLists ;kill font push 0 push 0 callW wglMakeCurrent push theRC callW wglDeleteContext push theDC push handle_wd callW ReleaseDC ret ;--------------------- enable OpenGL for window ----------------------------------- enable_opengl: push handle_wd callW GetDC mov theDC, eax mov pfd_nSize, DDPIXELFORMAT_struct_size mov pfd_nVersion, 1 mov pfd_dwFlags, 20h+1+4 ;PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER OR PFD_DRAW_TO_WINDOW mov pfd_dwLayerMask, 0 ;PFD_MAIN_PLANE mov pfd_iPixelType, 0 ;PFD_TYPE_RGBA mov pfd_cColorBits, 24 mov pfd_cDepthBits, 16 mov pfd_cAccumBits, 0 mov pfd_cStencilBits, 0 push offset DDPIXELFORMAT_struct push theDC callW ChoosePixelFormat mov pixformat, eax push offset DDPIXELFORMAT_struct push pixformat push theDC callW SetPixelFormat ;once you call this, td32 becomes crazy? push theDC callW wglCreateContext mov theRC, eax push theRC push theDC callW wglMakeCurrent ;--------------------- prepare OpenGL ---------------------- ;pre-build font in 256 display lists push 256 callW glGenLists mov objet1, eax push offset name_font push 0+0 ;family and pitch FF_DONTCARE+DEFAULT_PITCH push 4 ;output quality = ANTIALIASED_QUALITY push 0 ;clipping precision = CLIP_DEFAULT_PRECIS push 4 ;output precision = OUT_TT_PRECIS push 0 ;character set identifier = ANSI_CHARSET push 0 ;strikeout = FALSE push 0 ;underline = FALSE push 0 ;italic = FALSE push 700h ;weight = FW_BOLD push 0 ;orientation push 0 ;angle push 0 ;width push -1 ;height callW CreateFontA mov font, eax push font push theDC callW SelectObject push 0 ;When lpgmf is NULL, no glyph metrics are returned push 1 ;format = WGL_FONT_POLYGONS =1 , 0 = lines push p0_1 ;thickness in float push p1_0 ;deviation in float (nb of polygons in letter, 0 = best, but slooow) push objet1 push 255 ;nb of display lists to build push 0 ;starting character push theDC callW wglUseFontOutlinesA ;clear background and define window push 0 push 0 push 0 push 0 callW glClearColor push 400 push 800 push 0 push 0 callW glViewport ;set some parameters push 0b57h ;GL_COLOR_MATERIAL callW glEnable push p1__0 callW glClearDepth push 0b71h ;GL_DEPTH_TEST callW glEnable push 203h ;GL_LEQUAL callW glDepthFunc push 1102h ;GL_NICEST push 0c50h ;GL_PERSPECTIVE_CORRECTION_HINT (slower) callW glHint push 1d01h ;GL_SMOOTH callW glShadeModel push 0b44h ;GL_CULL_FACE callW glEnable ;ne montre pas les faces quand dessinees ccw (faster) ;define the eye parameters (position, perspective distortion) push 1701h ;GL_PROJECTION callW glMatrixMode callW glLoadIdentity push pp40 ;zfar push p1__0 ;znear push p0__5 ;top push m0__5 ;bottom push p0__5 ;right push m0__5 ;left callW glFrustum ;define the object location/orientation push 1700h ;GL_MODELVIEW callW glMatrixMode callW glLoadIdentity push position_z ;z Cette fois on definit des le depart les coords de l'objet push m2_0 ;y Et a chaque draw_opengl on ne remet pas la matrice a push 0 ;x zero avec glLoadIdentity callW glTranslatef push 0 push 0 push p1_0 push m60 callW glRotatef ret ;--------------------- calculate, draw, eat cpu time... ---------------------- draw_opengl: callW glPushMatrix ;save position for the end - think like a Push EAX ;---- first line ;go a bit to the left so text is centered push 0 ;z push 0 ;y push m2_0 ;x callW glTranslatef ;define text properties push 4000h+100h ;GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT callW glClear push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push 0 push 0 push p1_0 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte1 push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte1_size callW glCallLists callW glPopAttrib ;---- second line ;go a bit to the left so text is centered push m0_5 ;z push m0_5 ;y push m4_0 ;x callW glTranslatef ;define text properties push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push 0 push p1_0 push p1_0 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte2 push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte2_size callW glCallLists callW glPopAttrib ;---- third line ;go a bit to the left so text is centered push p0_5 ;z push m1_5 ;y push m2_5 ;x callW glTranslatef ;define text properties push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push p1_0 push p1_0 push p1_0 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte3 push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte3_size callW glCallLists callW glPopAttrib ;---- line 4 ;go a bit to the left so text is centered push m0_5 ;z push m0_5 ;y push m4_0 ;x callW glTranslatef ;define text properties push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push 0 push p1_0 push p1_0 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte4 push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte4_size callW glCallLists callW glPopAttrib ;---- line 5 ;go a bit to the left so text is centered push p0_5 ;z push m1_5 ;y push m3_0 ;x callW glTranslatef ;define text properties push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push p1_0 push p1_0 push p1_0 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte5 push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte5_size callW glCallLists callW glPopAttrib ;pop initial position/orientation of the objects callW glPopMatrix ;deplace the matrix a bit push 0 ;z push increment ;y push 0 ;x callW glTranslatef push theDC callW SwapBuffers ret end start ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;----------OpenGL in win32asm example 5---------------- ; ; draw some text in flat 3D do a StarWars like effect ; for the fun, make it full-screen ; ; not at all optimized, it's better for code clarity ; by Spanska for Xine#5, February 2001, copyleft ; ; TASM32 /ml /m3 /z /t opengl ; TLINK32 -Tpe -aa opengl,,,import32 opengl32 callW macro x extrn x:PROC call x endm .386p .model flat,STDCALL .data ;------------- funky structures --------------------- paint_struct: pshdc dd ? psfErase dd 0 psrcPaint dd offset rect_struct psfRestore dd ? psfIncUpdate dd ? psrgbReserved db 32 dup(?) rect_struct: rcLeft dd ? rcTop dd ? rcRight dd ? rcBottom dd ? wndclassx: clscbSize dd wndclassx_size clsStyle dd 20h+2+1 ; class style CS_OWNDC+CS_VREDRAW+CS_HREDRAW clsLpfnWndProc dd ? clsCbClsExtra dd 0 clsCbWndExtra dd 0 clsHInstance dd ? ; instance handle clsHIcon dd 0 ; class icon handle clsHCursor dd 0 ; class cursor handle clsHbrBackground dd 7 ; class background brush clsLpszMenuName dd 0 ; menu name clsLpszClassName dd ? ; far ptr to class name clshIconSm dd 0 wndclassx_size equ $-offset wndclassx msg: msHWND dd ? msMESSAGE dd ? msWPARAM dd ? msLPARAM dd ? msTIME dd ? msPT dd ? DDPIXELFORMAT_struct: pfd_nSize dw 0 pfd_nVersion dw 0 pfd_dwFlags dd 0 pfd_iPixelType db 0 pfd_cColorBits db 0 pfd_cRedBits db 0 pfd_cRedShift db 0 pfd_cGreenBits db 0 pfd_cGreenShift db 0 pfd_cBlueBits db 0 pfd_cBlueShift db 0 pfd_cAlphaBits db 0 pfd_cAlphaShift db 0 pfd_cAccumBits db 0 pfd_cAccumRedBits db 0 pfd_cAccumGreenBits db 0 pfd_cAccumBlueBits db 0 pfd_cAccumAlphaBits db 0 pfd_cDepthBits db 0 pfd_cStencilBits db 0 pfd_cAuxBuffers db 0 pfd_iLayerType db 0 pfd_bReserved db 0 pfd_dwLayerMask dd 0 pfd_dwVisibleMask dd 0 pfd_dwDamageMask dd 0 DDPIXELFORMAT_struct_size equ $-offset DDPIXELFORMAT_struct ;------------- some data --------------------- nom_fenetre db "OpenGL",0 handle dd ? handle_wd dd ? adresse_retour dd ? pixformat dd ? theDC dd ? theRC dd ? objet1 dd ? objet2 dd ? font dd ? name_font db "Comic Sans MS",0 texte1 db "Miserables" texte1_size equ $ - offset texte1 texte2 db " by " texte2_size equ $ - offset texte2 texte3 db " Victor " texte3_size equ $ - offset texte3 texte4 db " and " texte4_size equ $ - offset texte4 texte5 db " Hugo " texte5_size equ $ - offset texte5 screenX dd ? screenY dd ? ;-------- name some simple precision float numbers --------------------- ; (NB: i may not use them all) float TYPEDEF REAL4 position_z float -2.0 increment float 0.02 p0_1 float 0.1 m0_1 float -0.1 p0_5 float 0.5 m0_5 float -0.5 m0_8 float -0.8 p0_8 float 0.8 p1_0 float 1.0 m1_0 float -1.0 p1_3 float 1.333333333 m1_5 float -1.5 p1_5 float 1.5 p1_6 float 1.6 p1_7 float 1.7 p1_8 float 1.8 p1_85 float 1.85 p1_9 float 1.9 p2_0 float 2.0 m2_0 float -2.0 m2_5 float -2.5 m3_0 float -3.0 m3_5 float -3.5 p3_0 float 3.0 m4_0 float -4.0 p4_0 float 4.0 m5_0 float -5.0 p5_0 float 5.0 m6_0 float -6.0 m8_0 float -8.0 p10 float 10.0 m10 float -10.0 m40 float -40.0 p40 float 40.0 p45 float 45.0 m45 float -45.0 m60 float -60.0 m70 float -70.0 p90 float 90.0 m90 float -90.0 ;-------- name some double precision float numbers --------------------- ; (NB: i may not use them all) dfloat TYPEDEF REAL8 p0__1 dfloat 0.1 p0__5 dfloat 0.5 m0__5 dfloat -0.5 p1__0 dfloat 1.0 p1__33 dfloat 1.3333 p2__0 dfloat 2.0 p3__0 dfloat 3.0 m3__0 dfloat -3.0 p4__0 dfloat 4.0 p5__0 dfloat 5.0 m5__0 dfloat -5.0 p7__0 dfloat 7.0 pp10 dfloat 10.0 mm10 dfloat -10.0 pp20 dfloat 20.0 pp40 dfloat 40.0 pp45 dfloat 45.0 ;-------- small structures with float numbers --------------------- Light_Diffuse: qq1 float 1.0 ;Red qq2 float 1.0 ;Green qq3 float 1.0 ;Blue qq4 float 1.0 ;alpha? Light_Position: qq5 float 10.0 ;x qq6 float 10.0 ;y qq7 float 10.0 ;z qq8 float 0 ;directional source .code start: ;----------------- register wndclass ---------------------------- push 0 callW GetModuleHandleA mov handle, eax mov clsHInstance, eax mov eax, offset wndproc mov clsLpfnWndProc, eax mov clsLpszClassName, offset nom_fenetre push offset wndclassx callW RegisterClassExA ;------------------- get screen size -------------------------------- push 0 ;SM_CXSCREEN callW GetSystemMetrics mov screenX, eax push 1 ;SM_CYSCREEN callW GetSystemMetrics mov screenY, eax ;--------------------- create the window -------------------------- push 0 push handle push 0 push 0 ;HWND_DESKTOP push screenY ;hauteur push screenX ;largeur push 0 ;y push 0 ;x push 80000000h+1000000h ;WS_POPUP push offset nom_fenetre push offset nom_fenetre push 0 ;extra style callW CreateWindowExA mov handle_wd, eax ;------------------------ show window ------------------------------ push 1 push handle_wd callW ShowWindow push handle_wd callW UpdateWindow call enable_opengl ;------------------------ the message loop ---------------------------------- winmain_msg_loop: push 0 push 0 push handle_wd callW InvalidateRect ;force paint? push 1 push 0 push 0 push 0 push offset msg callW PeekMessageA cmp eax, 0 jnz process_messages jmp winmain_msg_loop ;----- check if window is closed -------- process_messages: cmp msMESSAGE, 12h ;WM_QUIT equ 0012h je end_loop push offset msg callW TranslateMessage push offset msg callW DispatchMessageA jmp winmain_msg_loop end_loop: call disable_opengl push msWPARAM callW ExitProcess ;------------------ windows proc ------------------------ wndproc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD cmp wmsg,2 ;WM_DESTROY? jne suite1 call disable_opengl push 0 callW PostQuitMessage xor eax, eax jmp wndproc_end suite1: cmp wmsg, 0fh ;WM_PAINT? jne suite3 push offset rect_struct push handle_wd callW GetClientRect mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW BeginPaint call draw_opengl mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW EndPaint xor eax, eax jmp wndproc_end suite3: cmp wmsg, 100h ;WM_KEYDOWN? jne suite4 push 0 callW PostQuitMessage xor eax, eax jmp wndproc_end suite4: push lparam push wparam push wmsg push hwnd callW DefWindowProcA wndproc_end: ret wndproc endp ;--------------------- disable OpenGL ---------------------- disable_opengl: push 256 push objet1 callW glDeleteLists ;kill font push 0 push 0 callW wglMakeCurrent push theRC callW wglDeleteContext push theDC push handle_wd callW ReleaseDC ret ;--------------------- enable OpenGL for window ----------------------------------- enable_opengl: push handle_wd callW GetDC mov theDC, eax mov pfd_nSize, DDPIXELFORMAT_struct_size mov pfd_nVersion, 1 mov pfd_dwFlags, 20h+1+4 ;PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER OR PFD_DRAW_TO_WINDOW mov pfd_dwLayerMask, 0 ;PFD_MAIN_PLANE mov pfd_iPixelType, 0 ;PFD_TYPE_RGBA mov pfd_cColorBits, 24 mov pfd_cDepthBits, 16 mov pfd_cAccumBits, 0 mov pfd_cStencilBits, 0 push offset DDPIXELFORMAT_struct push theDC callW ChoosePixelFormat mov pixformat, eax push offset DDPIXELFORMAT_struct push pixformat push theDC callW SetPixelFormat ;once you call this, td32 becomes crazy? push theDC callW wglCreateContext mov theRC, eax push theRC push theDC callW wglMakeCurrent ;--------------------- prepare OpenGL ---------------------- ;pre-build font in 256 display lists push 256 callW glGenLists mov objet1, eax push offset name_font push 0+0 ;family and pitch FF_DONTCARE+DEFAULT_PITCH push 4 ;output quality = ANTIALIASED_QUALITY push 0 ;clipping precision = CLIP_DEFAULT_PRECIS push 4 ;output precision = OUT_TT_PRECIS push 0 ;character set identifier = ANSI_CHARSET push 0 ;strikeout = FALSE push 0 ;underline = FALSE push 0 ;italic = FALSE push 700h ;weight = FW_BOLD push 0 ;orientation push 0 ;angle push 0 ;width push -1 ;height callW CreateFontA mov font, eax push font push theDC callW SelectObject push 0 ;When lpgmf is NULL, no glyph metrics are returned push 1 ;format = WGL_FONT_POLYGONS =1 , 0 = lines push 0 ;p0_1 ;thickness in float push p1_0 ;deviation in float (nb of polygons in letter, 0 = best, but slooow) push objet1 push 255 ;nb of display lists to build push 0 ;starting character push theDC callW wglUseFontOutlinesA ;clear background and define window push 0 push 0 push 0 push 0 callW glClearColor push screenY push screenX push 0 push 0 callW glViewport ;set some parameters push 0b57h ;GL_COLOR_MATERIAL callW glEnable push p1__0 callW glClearDepth push 0b71h ;GL_DEPTH_TEST callW glEnable push 203h ;GL_LEQUAL callW glDepthFunc push 1102h ;GL_NICEST push 0c50h ;GL_PERSPECTIVE_CORRECTION_HINT (slower) callW glHint push 1d01h ;GL_SMOOTH callW glShadeModel push 0b44h ;GL_CULL_FACE callW glEnable ;ne montre pas les faces quand dessinees ccw (faster) ;define the eye parameters (position, perspective distortion) push 1701h ;GL_PROJECTION callW glMatrixMode callW glLoadIdentity push pp40 ;zfar push p1__0 ;znear push p0__5 ;top push m0__5 ;bottom push p0__5 ;right push m0__5 ;left callW glFrustum ;define the object location/orientation push 1700h ;GL_MODELVIEW callW glMatrixMode callW glLoadIdentity push position_z ;z Cette fois on definit des le depart les coords de l'objet push m2_0 ;y Et a chaque draw_opengl on ne remet pas la matrice a push 0 ;x zero avec glLoadIdentity callW glTranslatef push 0 push 0 push p1_0 push m60 callW glRotatef ret ;--------------------- calculate, draw, eat cpu time... ---------------------- draw_opengl: callW glPushMatrix ;save position for the end - think like a Push EAX ;---- first line ;go a bit to the left so text is centered push 0 ;z push 0 ;y push m2_0 ;x callW glTranslatef ;define text properties push 4000h+100h ;GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT callW glClear push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push 0 push 0 push p1_0 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte1 push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte1_size callW glCallLists callW glPopAttrib ;---- second line ;go a bit to the left so text is centered push m0_5 ;z push m0_5 ;y push m4_0 ;x callW glTranslatef ;define text properties push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push 0 push p1_0 push p1_0 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte2 push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte2_size callW glCallLists callW glPopAttrib ;---- third line ;go a bit to the left so text is centered push p0_5 ;z push m1_5 ;y push m2_5 ;x callW glTranslatef ;define text properties push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push p1_0 push p1_0 push p1_0 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte3 push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte3_size callW glCallLists callW glPopAttrib ;---- line 4 ;go a bit to the left so text is centered push m0_5 ;z push m0_5 ;y push m4_0 ;x callW glTranslatef ;define text properties push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push 0 push p1_0 push p1_0 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte4 push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte4_size callW glCallLists callW glPopAttrib ;---- line 5 ;go a bit to the left so text is centered push p0_5 ;z push m1_5 ;y push m4_0 ;x callW glTranslatef ;define text properties push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push p1_0 push p1_0 push p1_0 callW glColor3f ;draw it push 20000h ;GL_LIST_BIT callW glPushAttrib push objet1 callW glListBase push offset texte5 push 1401h ;GL_UNSIGNED_BYTE parce que 0 < no de liste (=ASCII) < 255 push texte5_size callW glCallLists callW glPopAttrib ;pop initial position/orientation of the objects callW glPopMatrix ;deplace the matrix a bit push 0 ;z push increment ;y push 0 ;x callW glTranslatef push theDC callW SwapBuffers ret end start ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;----------OpenGL in win32asm example 6---------------- ; ; draw an hypnotizing spiral in 2D (was done for Hybris) ; (it's actually a bit overkill to do 2D stuff in OpenGL) ; ; not at all optimized, it's better for code clarity ; by Spanska for Xine#5, February 2001, copyleft ; ; TASM32 /ml /m3 /z /t opengl ; TLINK32 -Tpe -aa opengl,,,import32 opengl32 callW macro x extrn x:PROC call x endm .386p .model flat,STDCALL .data ;------------- funky structures --------------------- paint_struct: pshdc dd ? psfErase dd 0 psrcPaint dd offset rect_struct psfRestore dd ? psfIncUpdate dd ? psrgbReserved db 32 dup(?) rect_struct: rcLeft dd ? rcTop dd ? rcRight dd ? rcBottom dd ? wndclassx: clscbSize dd wndclassx_size clsStyle dd 20h+2+1 ; class style CS_OWNDC+CS_VREDRAW+CS_HREDRAW clsLpfnWndProc dd ? clsCbClsExtra dd 0 clsCbWndExtra dd 0 clsHInstance dd ? ; instance handle clsHIcon dd 0 ; class icon handle clsHCursor dd 0 ; class cursor handle clsHbrBackground dd 7 ; class background brush clsLpszMenuName dd 0 ; menu name clsLpszClassName dd ? ; far ptr to class name clshIconSm dd 0 wndclassx_size equ $-offset wndclassx msg: msHWND dd ? msMESSAGE dd ? msWPARAM dd ? msLPARAM dd ? msTIME dd ? msPT dd ? DDPIXELFORMAT_struct: pfd_nSize dw 0 pfd_nVersion dw 0 pfd_dwFlags dd 0 pfd_iPixelType db 0 pfd_cColorBits db 0 pfd_cRedBits db 0 pfd_cRedShift db 0 pfd_cGreenBits db 0 pfd_cGreenShift db 0 pfd_cBlueBits db 0 pfd_cBlueShift db 0 pfd_cAlphaBits db 0 pfd_cAlphaShift db 0 pfd_cAccumBits db 0 pfd_cAccumRedBits db 0 pfd_cAccumGreenBits db 0 pfd_cAccumBlueBits db 0 pfd_cAccumAlphaBits db 0 pfd_cDepthBits db 0 pfd_cStencilBits db 0 pfd_cAuxBuffers db 0 pfd_iLayerType db 0 pfd_bReserved db 0 pfd_dwLayerMask dd 0 pfd_dwVisibleMask dd 0 pfd_dwDamageMask dd 0 DDPIXELFORMAT_struct_size equ $-offset DDPIXELFORMAT_struct ;------------- some data --------------------- nom_fenetre db "OpenGL",0 handle dd ? handle_wd dd ? adresse_retour dd ? pixformat dd ? theDC dd ? theRC dd ? screenX dd ? screenY dd ? ;--------- spiral data -------------- color dd 0ffffffffh pen dd ? compteur dd 110 hbit dd ? hbrush dd ? float TYPEDEF REAL4 angle1 float 0.0 angle2 float 1.0 angle3 float 3.1415926535 angle4 float 4.1415926535 angle_inc float 0.2 zoom float 0.01 zoom_reset float 0.01 zoom_inc float 0.01 angle_anim float 0.0 angle_anim_inc float 0.2 y1 float 0.0 x1 float 0.0 y2 float 0.0 x2 float 0.0 yy1 float 0.0 xx1 float 0.0 yy2 float 0.0 xx2 float 0.0 yyy1 float 0.0 xxx1 float 0.0 yyy2 float 0.0 xxx2 float 0.0 yyyy1 float 0.0 xxxx1 float 0.0 yyyy2 float 0.0 xxxx2 float 0.0 ;-------- name some simple precision float numbers --------------------- ; (NB: i may not use them all) p0_1 float 0.1 m0_1 float -0.1 p0_5 float 0.5 m0_5 float -0.5 m0_8 float -0.8 p0_8 float 0.8 p1_0 float 1.0 m1_0 float -1.0 p1_3 float 1.333333333 m1_5 float -1.5 p1_5 float 1.5 p1_6 float 1.6 p1_7 float 1.7 p1_8 float 1.8 p1_85 float 1.85 p1_9 float 1.9 p2_0 float 2.0 m2_0 float -2.0 m2_5 float -2.5 m3_0 float -3.0 m3_5 float -3.5 p3_0 float 3.0 m4_0 float -4.0 p4_0 float 4.0 m5_0 float -5.0 p5_0 float 5.0 m6_0 float -6.0 m8_0 float -8.0 p10 float 10.0 m10 float -10.0 m40 float -40.0 p40 float 40.0 p45 float 45.0 m45 float -45.0 m60 float -60.0 m70 float -70.0 p90 float 90.0 m90 float -90.0 .code start: ;------------------------- get screen size, center hypno ----------------- push 0 ;SM_CXSCREEN callW GetSystemMetrics sub eax, 600 shr eax, 1 mov screenX, eax push 1 ;SM_CYSCREEN callW GetSystemMetrics sub eax, 600 shr eax, 1 mov screenY, eax ;----------------- register wndclass ---------------------------- push 0 callW GetModuleHandleA mov handle, eax mov clsHInstance, eax mov eax, offset wndproc mov clsLpfnWndProc, eax mov clsLpszClassName, offset nom_fenetre push offset wndclassx callW RegisterClassExA ;--------------------- create the window -------------------------- push 0 push handle push 0 push 0 ;HWND_DESKTOP push 600 ;hauteur push 600 ;largeur push screenY ;y push screenX ;x push 0CF0000h+4000000h+2000000h ;WS_OVERLAPPEDWINDOW+WS_CLIPSIBLINGS+WS_CLIPCHILDREN push offset nom_fenetre push offset nom_fenetre push 0 ;extra style callW CreateWindowExA mov handle_wd, eax ;---------- define the circle-shaped window mask ------------------- push 590 ;y lower-right push 590 ;x lower-right push 30 ;y upper-left push 10 ;x upper-left callW CreateEllipticRgn ;return region handle push 1 ;window redraw flag 1=true push eax ;handle to region push handle_wd callW SetWindowRgn ;------------------------ show window ------------------------------ push 1 push handle_wd callW ShowWindow push handle_wd callW UpdateWindow call enable_opengl ;------------------------ the message loop ---------------------------------- winmain_msg_loop: push 0 push 0 push handle_wd callW InvalidateRect ;force paint? push 1 push 0 push 0 push 0 push offset msg callW PeekMessageA cmp eax, 0 jnz process_messages jmp winmain_msg_loop ;----- check if window is closed -------- process_messages: cmp msMESSAGE, 12h ;WM_QUIT equ 0012h je end_loop push offset msg callW TranslateMessage push offset msg callW DispatchMessageA jmp winmain_msg_loop end_loop: call disable_opengl push msWPARAM callW ExitProcess ;------------------ windows proc ------------------------ wndproc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD cmp wmsg,2 ;WM_DESTROY? jne suite1 call disable_opengl push 0 callW PostQuitMessage xor eax, eax jmp wndproc_end suite1: cmp wmsg, 0fh ;WM_PAINT? jne suite2 push offset rect_struct push handle_wd callW GetClientRect mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW BeginPaint call draw_opengl mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW EndPaint xor eax, eax jmp wndproc_end suite2: cmp wmsg, 84h ;WM_NCHITEST (mouse click) jne suite3 mov eax, 2 ;HTCAPTION (so you can move it with mouse) jmp wndproc_end suite3: push lparam push wparam push wmsg push hwnd callW DefWindowProcA wndproc_end: ret wndproc endp ;--------------------- disable OpenGL ---------------------- disable_opengl: push 0 push 0 callW wglMakeCurrent push theRC callW wglDeleteContext push theDC push handle_wd callW ReleaseDC ret ;--------------------- enable OpenGL for window ----------------------------------- enable_opengl: push handle_wd callW GetDC mov theDC, eax mov pfd_nSize, DDPIXELFORMAT_struct_size mov pfd_nVersion, 1 mov pfd_dwFlags, 20h+1+4 ;PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER OR PFD_DRAW_TO_WINDOW mov pfd_dwLayerMask, 0 ;PFD_MAIN_PLANE mov pfd_iPixelType, 0 ;PFD_TYPE_RGBA mov pfd_cColorBits, 24 mov pfd_cDepthBits, 16 mov pfd_cAccumBits, 0 mov pfd_cStencilBits, 0 push offset DDPIXELFORMAT_struct push theDC callW ChoosePixelFormat mov pixformat, eax push offset DDPIXELFORMAT_struct push pixformat push theDC callW SetPixelFormat ;once you call this, td32 becomes crazy? push theDC callW wglCreateContext mov theRC, eax push theRC push theDC callW wglMakeCurrent ret ;--------------------- calculate, draw, eat cpu time... ---------------------- draw_opengl: ;---- clear background push 0 ;alpha push 0 ;B push p1_0 ;G push p1_0 ;R callW glClearColor push 4000h ;GL_COLOR_BUFFER_BIT callW glClear ;---- draw spirals mov ecx, compteur draw_two_spirals: push ecx ;--- calculate coordinates of next point of the spiral 1 fld angle1 ;x fcos fld zoom fmul fstp x2 fld angle1 ;y fsin fld zoom fmul fstp y2 ;--- calculate coordinates of next point of the spiral 2 fld angle2 ;x fcos fld zoom fmul fstp xx2 fld angle2 ;y fsin fld zoom fmul fstp yy2 ;--- calculate coordinates of next point of the spiral 3 fld angle3 ;x fcos fld zoom fmul fstp xxx2 fld angle3 ;y fsin fld zoom fmul fstp yyy2 ;--- calculate coordinates of next point of the spiral 4 fld angle4 ;x fcos fld zoom fmul fstp xxxx2 fld angle4 ;y fsin fld zoom fmul fstp yyyy2 ;--- inc angle and thickness fld angle1 fadd angle_inc fstp angle1 fld angle2 fadd angle_inc fstp angle2 fld angle3 fadd angle_inc fstp angle3 fld angle4 fadd angle_inc fstp angle4 fld zoom fadd zoom_inc fstp zoom ;---- draw the little piece of both spirals push 7 ;GL_QUADS callW glBegin ;spiral 1 push 0 push 0 push p1_0 callW glColor3f push y1 push x1 callW glVertex2f push y2 push x2 callW glVertex2f ;spiral 2 push yy1 push xx1 callW glVertex2f push yy2 push xx2 callW glVertex2f ;spiral 3 push yyy1 push xxx1 callW glVertex2f push yyy2 push xxx2 callW glVertex2f ;spiral 4 push yyyy1 push xxxx1 callW glVertex2f push yyyy2 push xxxx2 callW glVertex2f callW glEnd ;--- point p becomes point p-1 (spiral 1) mov eax, x2 mov x1, eax mov eax, y2 mov y1, eax ;--- point p becomes point p-1 (spiral 2) mov eax, xx2 mov xx1, eax mov eax, yy2 mov yy1, eax ;--- point p becomes point p-1 (spiral 3) mov eax, xxx2 mov xxx1, eax mov eax, yyy2 mov yyy1, eax ;--- point p becomes point p-1 (spiral 4) mov eax, xxxx2 mov xxxx1, eax mov eax, yyyy2 mov yyyy1, eax ;--- dec counter pop ecx dec ecx jnz draw_two_spirals push theDC callW SwapBuffers ;--- reset the parameters for next spirals mov x1, 0 ;first point back to center mov y1, 0 mov xx1, 0 ;first point back to center mov yy1, 0 mov xxx1, 0 ;first point back to center mov yyy1, 0 mov xxxx1, 0 ;first point back to center mov yyyy1, 0 fld angle_anim ;rotate next spirals a bit fadd angle_anim_inc fstp angle_anim mov eax, angle_anim ;initialize the new starting angle for spiral 1 mov angle1, eax fld p0_5 ;idem for spiral 2 but with 180 degrees (pi radians) shift fadd angle_anim fstp angle2 fldpi ;idem for spiral 3 but with 180 degrees (pi radians) shift fadd angle_anim fstp angle3 fldpi ;idem for spiral 4 but with 180 degrees (pi radians) shift fadd p0_5 fadd angle_anim fstp angle4 mov eax, zoom_reset ;reset the zoom level mov zoom, eax ret end start ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ;----------OpenGL in win32asm example 7---------------- ; ; draw a complex 3D object (a face) and smooth-shade it ; push 1/2 for x rotation ; push 3/4 for y rotation ; push 5/6 for z rotation ; push 7/8 for distance ; push 9 to see the effect of averaging normals at each vertex: ; - left semi-face uses polygon normals for flat shading ; - right semi-face uses averaged vertex normas for smooth shading ; ; not at all optimized, it's better for code clarity ; by Spanska for Xine#5, February 2001, copyleft ; ; TASM32 /ml /m3 /z /t opengl ; TLINK32 -Tpe -aa opengl,,,import32 opengl32 callW macro x extrn x:PROC call x endm .386p .model flat,STDCALL .data ;------------- funky structures --------------------- paint_struct: pshdc dd ? psfErase dd 0 psrcPaint dd offset rect_struct psfRestore dd ? psfIncUpdate dd ? psrgbReserved db 32 dup(?) rect_struct: rcLeft dd ? rcTop dd ? rcRight dd ? rcBottom dd ? wndclassx: clscbSize dd wndclassx_size clsStyle dd 20h+2+1 ; class style CS_OWNDC+CS_VREDRAW+CS_HREDRAW clsLpfnWndProc dd ? clsCbClsExtra dd 0 clsCbWndExtra dd 0 clsHInstance dd ? ; instance handle clsHIcon dd 0 ; class icon handle clsHCursor dd 0 ; class cursor handle clsHbrBackground dd 7 ; class background brush clsLpszMenuName dd 0 ; menu name clsLpszClassName dd ? ; far ptr to class name clshIconSm dd 0 wndclassx_size equ $-offset wndclassx msg: msHWND dd ? msMESSAGE dd ? msWPARAM dd ? msLPARAM dd ? msTIME dd ? msPT dd ? DDPIXELFORMAT_struct: pfd_nSize dw 0 pfd_nVersion dw 0 pfd_dwFlags dd 0 pfd_iPixelType db 0 pfd_cColorBits db 0 pfd_cRedBits db 0 pfd_cRedShift db 0 pfd_cGreenBits db 0 pfd_cGreenShift db 0 pfd_cBlueBits db 0 pfd_cBlueShift db 0 pfd_cAlphaBits db 0 pfd_cAlphaShift db 0 pfd_cAccumBits db 0 pfd_cAccumRedBits db 0 pfd_cAccumGreenBits db 0 pfd_cAccumBlueBits db 0 pfd_cAccumAlphaBits db 0 pfd_cDepthBits db 0 pfd_cStencilBits db 0 pfd_cAuxBuffers db 0 pfd_iLayerType db 0 pfd_bReserved db 0 pfd_dwLayerMask dd 0 pfd_dwVisibleMask dd 0 pfd_dwDamageMask dd 0 DDPIXELFORMAT_struct_size equ $-offset DDPIXELFORMAT_struct ;------------- some data --------------------- nom_fenetre db "OpenGL",0 handle dd ? handle_wd dd ? adresse_retour dd ? pixformat dd ? theDC dd ? theRC dd ? angle dd 0 ;--------- data that can be changed with keyboard ------------ float TYPEDEF REAL4 inc_angle float 1.0 cur_anglex float 0 cur_angley float 0 cur_anglez float 0 inc_distance float 0.2 cur_distance float -20.0 smooth_or_flat dd 0 ;-------- name some simple precision float numbers --------------------- ; (NB: i may not use them all) p0_1 float 0.1 p0_5 float 0.5 m0_5 float -0.5 p1_0 float 1.0 m1_0 float -1.0 p1_3 float 1.333333333 m1_4 float -1.4 m1_5 float -1.5 p1_5 float 1.5 p1_6 float 1.6 p1_7 float 1.7 p1_8 float 1.8 p1_85 float 1.85 p1_9 float 1.9 p2_0 float 2.0 m2_0 float -2.0 m3_0 float -3.0 p3_0 float 3.0 m4_0 float -4.0 p4_0 float 4.0 m5_0 float -5.0 p5_0 float 5.0 p6_0 float 6.0 m6_0 float -6.0 p7_0 float 7.0 p8_0 float 8.0 m8_0 float -8.0 p10 float 10.0 m10 float -10.0 m15 float -15.0 p20 float 20.0 m40 float -40.0 p40 float 40.0 p45 float 45.0 p99 float 99.0 ;-------- name some double precision float numbers --------------------- ; (NB: i may not use them all) dfloat TYPEDEF REAL8 p0__1 dfloat 0.1 p1__0 dfloat 1.0 m1__0 dfloat -1.0 p1__33 dfloat 1.3333 p2__0 dfloat 2.0 m2__0 dfloat -2.0 p3__0 dfloat 3.0 m3__0 dfloat -3.0 p4__0 dfloat 4.0 m4__0 dfloat -4.0 p5__0 dfloat 5.0 m5__0 dfloat -5.0 p7__0 dfloat 7.0 pp10 dfloat 10.0 mm10 dfloat -10.0 pp20 dfloat 20.0 pp30 dfloat 30.0 pp40 dfloat 40.0 pp45 dfloat 45.0 ;-------- small structures with float numbers --------------------- Light_Diffuse: qq1 float 0.2 ;Red qq2 float 0.2 ;Green qq3 float 0.2 ;Blue qq4 float 1.0 ;alpha Light_Position: qq5 float 0.0 ;x qq6 float 0.0 ;y qq7 float 10.0 ;z qq8 float 0 ;directional source mat_Ambient float 1.0,0.01,0.01,1.0 mat_Diffuse float 1.0,0.01,0.01,1.0 mat_Specular float 0.5,0.5,0.5,1.0 mat_Shine float 5.0 ;-------- data to construct the face --------------------- include index.asm ;index of polygons include faceline.asm ;coordz of vertex index_1 dd ? index_2 dd ? index_3 dd ? index_4 dd ? x1 dd ? y1 dd ? z1 dd ? x2 dd ? y2 dd ? z2 dd ? x3 dd ? y3 dd ? z3 dd ? normal_x dd ? normal_y dd ? normal_z dd ? longueur dd ? v1normal_x dd ? v1normal_y dd ? v1normal_z dd ? v2normal_x dd ? v2normal_y dd ? v2normal_z dd ? v3normal_x dd ? v3normal_y dd ? v3normal_z dd ? table_faces_normals dd ? current_pointer_facettes dd ? current_pointer_normals dd ? a dd ? b dd ? c dd ? anx1 dd 0 any1 dd 0 anz1 dd 0 anx2 dd 0 any2 dd 0 anz2 dd 0 anx3 dd 0 any3 dd 0 anz3 dd 0 .code start: ;------------- get memory for the big table --------------------- ; table = 441 faces * (24 dd) ; these 24 dd are: ; index123,xyz1,xyz2,xyz3,normalxyz,an1xyz,an2xyz,an3xyz mov eax, 441*(24*4) add eax, 1024 ;just in case push eax ;number of bytes to allocate push 40h ;40h=LMEM_ZEROINIT callW LocalAlloc mov table_faces_normals, eax ;---------------- pre-calculate everything ----------------------- ; - normals of each triangle first, we could stop here for flat shading ; - using these, calculate average normals for each vertex, needed for smooth shading mov ecx, 441 mov esi, offset facettes mov eax, table_faces_normals mov current_pointer_normals, eax ;--- get indexes of the current polygon get_indexes: xor eax, eax lodsb ; index no 1 dec al mov index_1, eax xor eax, eax lodsb ; index no 2 dec al mov index_2, eax xor eax, eax lodsb ; index no 3 dec al mov index_3, eax pusha ;--- using these indexes, get xyz of the three vertexes (corners) mov esi, offset coords ;esi at start of coordz table mov eax, index_1 ;eax = index of first coordz mov ebx, 12 mul ebx ;1 index = 3 coordz of 4 bytes add esi, eax lodsd ;get x mov x1, eax lodsd ;get y mov y1, eax lodsd ;get z mov z1, eax mov esi, offset coords ;same for second vertex mov eax, index_2 mov ebx, 12 mul ebx add esi, eax lodsd mov x2, eax lodsd mov y2, eax lodsd mov z2, eax mov esi, offset coords ;same for second vertex mov eax, index_3 mov ebx, 12 mul ebx add esi, eax lodsd mov x3, eax lodsd mov y3, eax lodsd mov z3, eax ;-- now use these coordz to calculate normals (xyz) of each polygon ;coa = -(py1 * (pz2-pz3) + py2*(pz3-pz1) + py3*(pz1-pz2)) fld z2 fsub z3 fmul y1 fld z3 fsub z1 fmul y2 fld z1 fsub z2 fmul y3 fadd fadd fchs fstp normal_x ;save it ;cob = -(pz1 * (px2-px3) + pz2*(px3-px1) + pz3*(px1-px2)) fld x2 fsub x3 fmul z1 fld x3 fsub x1 fmul z2 fld x1 fsub x2 fmul z3 fadd fadd fchs fstp normal_y ;save it ;coc = -(px1 * (py2-py3) + px2*(py3-py1) + px3*(py1-py2)) fld y2 fsub y3 fmul x1 fld y3 fsub y1 fmul x2 fld y1 fsub y2 fmul x3 fadd fadd fchs fstp normal_z ;save it ;--- calculate the length of the normal ;absvec = sqrt ((double) ((coa*coa) + (cob*cob) + (coc*coc))) ; not useful actually because glNormalize will take care of that ; maybe speed difference, but i didn't noticed fld normal_x fmul normal_x fld normal_y fmul normal_y fld normal_z fmul normal_z fadd fadd fsqrt fstp longueur ;--- normalize this length to 1 ; we divide each xyz component by the length of the normal vector ; not useful actually because glNormalize will take care of that ; maybe speed difference, but i didn't noticed ; norm[0] = coa/absvec fld normal_x fdiv longueur fstp normal_x ; norm[1] = cob/absvec fld normal_y fdiv longueur fstp normal_y ; norm[2] = coc/absvec fld normal_z fdiv longueur fstp normal_z ;--- put all the stuff in the big table ; This table has the data for 441 polygons. ; for each polygon we have: ; dd index1,index2,index3,x1,y1,z1,x2,y2,z2,x3,y3,z3,nx,ny,nz,an1xyz,an2xyz,an3xyz ; see above for a clearer structure mov edi, current_pointer_normals mov eax, index_1 stosd mov eax, index_2 stosd mov eax, index_3 stosd mov eax, x1 stosd mov eax, y1 stosd mov eax, z1 stosd mov eax, x2 stosd mov eax, y2 stosd mov eax, z2 stosd mov eax, x3 stosd mov eax, y3 stosd mov eax, z3 stosd mov eax, normal_x stosd mov eax, normal_y stosd mov eax, normal_z stosd xor eax, eax ;stuff we still need to calculate (averaged normals) stosd ;so fill with zeros stosd stosd stosd stosd stosd stosd stosd stosd mov current_pointer_normals, edi popa dec ecx jnz get_indexes ;ok so here we have one big table of 441 faces * 24 dd : ; ;dd index1, index2, index3 ;dd x1, y1, z1 ;dd x2, y2, z2 ;dd x3, y3, z3 ;dd normalx, normaly, normalz ;dd averagednormalx1, averagednormaly1, averagednormalz1 <= need to calculate them now ;dd averagednormalx2, averagednormaly2, averagednormalz2 <= need to calculate them now ;dd averagednormalx3, averagednormaly3, averagednormalz3 <= need to calculate them now ;--- calculate the averaged normals to smooth the light ; we have to find which polygons share a vertex, and then ; calculate the average normal at this vertex. ;loop1: for each face, put index1, index2, index3 in 3 variables a b c ; now start again from beginning of the table ; loop2: check if "a" matches one of the 3 indexes ; if yes, go to the normals, add them to 3 variables anx1, any1, anz1 ; same for b and c ; continue loop2 ; to avoid bad shadowing in the middle, between 2 semi-faces: ; if x1=0 then anx=0 ; if x2=0... ;put anx, any, anz in the averaged normal of the current face ;loop1 mov ecx, 441 mov esi, table_faces_normals loop1: lodsd ; get the 3 indexes and put them in a temp location mov a, eax lodsd mov b, eax lodsd mov c, eax add esi, (24*4)-12 mov edi, esi sub edi, (3*4)*3 pusha mov ecx, 441 mov esi, table_faces_normals xor eax, eax ; clean the temp variables mov anx1, eax mov any1, eax mov anz1, eax mov anx2, eax mov any2, eax mov anz2, eax mov anx3, eax mov any3, eax mov anz3, eax loop2: @0: ;check if other polygons share the first vertex lodsd cmp eax, a jne @1 fld dword ptr [esi+44] ;normal_x fadd anx1 fstp anx1 fld dword ptr [esi+48] ;normal_y fadd any1 fstp any1 fld dword ptr [esi+52] ;normal_z fadd anz1 fstp anz1 @1: ;check if other polygons share the second vertex cmp eax, b jne @2 fld dword ptr [esi+44] ;normal_x fadd anx2 fstp anx2 fld dword ptr [esi+48] ;normal_y fadd any2 fstp any2 fld dword ptr [esi+52] ;normal_z fadd anz2 fstp anz2 @2: ;check if other polygons share the third vertex cmp eax, c jne @3 fld dword ptr [esi+44] ;normal_x fadd anx3 fstp anx3 fld dword ptr [esi+48] ;normal_y fadd any3 fstp any3 fld dword ptr [esi+52] ;normal_z fadd anz3 fstp anz3 @3: ;check if other polygons share the first vertex lodsd cmp eax, a jne @4 fld dword ptr [esi+40] ;normal_x fadd anx1 fstp anx1 fld dword ptr [esi+44] ;normal_y fadd any1 fstp any1 fld dword ptr [esi+48] ;normal_z fadd anz1 fstp anz1 @4: ;check if other polygons share the second vertex cmp eax, b jne @5 fld dword ptr [esi+40] ;normal_x fadd anx2 fstp anx2 fld dword ptr [esi+44] ;normal_y fadd any2 fstp any2 fld dword ptr [esi+48] ;normal_z fadd anz2 fstp anz2 @5: ;check if other polygons share the third vertex cmp eax, c jne @6 fld dword ptr [esi+40] ;normal_x fadd anx3 fstp anx3 fld dword ptr [esi+44] ;normal_y fadd any3 fstp any3 fld dword ptr [esi+48] ;normal_z fadd anz3 fstp anz3 @6: ;check if other polygons share the first vertex lodsd cmp eax, a jne @7 fld dword ptr [esi+36] ;normal_x fadd anx1 fstp anx1 fld dword ptr [esi+40] ;normal_y fadd any1 fstp any1 fld dword ptr [esi+44] ;normal_z fadd anz1 fstp anz1 @7: ;check if other polygons share the second vertex cmp eax, b jne @8 fld dword ptr [esi+36] ;normal_x fadd anx2 fstp anx2 fld dword ptr [esi+40] ;normal_y fadd any2 fstp any2 fld dword ptr [esi+44] ;normal_z fadd anz2 fstp anz2 @8: ;check if other polygons share the third vertex cmp eax, c jne @9 fld dword ptr [esi+36] ;normal_x fadd anx3 fstp anx3 fld dword ptr [esi+40] ;normal_y fadd any3 fstp any3 fld dword ptr [esi+44] ;normal_z fadd anz3 fstp anz3 @9: add esi, (24*4)-12 end_loop2: dec ecx jnz loop2 popa ;--- small trick to avoid bad smoothing along the 2 semi-faces ; ;here esi = next struct, edi = current anx1 ;small routine to smooth the shadow between 2 semi-faces ;ie all triangles touching the frontier (x=0) have their normal X=0 cmp dword ptr [esi-(21*4)], 0 ;x1 jne buzzz1 mov anx1, 0 buzzz1: cmp dword ptr [esi-(18*4)], 0 ;x2 jne buzzz2 mov anx2, 0 buzzz2: cmp dword ptr [esi-(15*4)], 0 ;x3 jne buzzz3 mov anx3, 0 buzzz3: ;--- put calculated averaged normals at each vertex in the table mov eax, anx1 stosd mov eax, any1 stosd mov eax, anz1 stosd mov eax, anx2 stosd mov eax, any2 stosd mov eax, anz2 stosd mov eax, anx3 stosd mov eax, any3 stosd mov eax, anz3 stosd dec ecx jnz loop1 ;----------------- OK, now normal windows stuph --------------------- ;----------------- register wndclass ---------------------------- push 0 callW GetModuleHandleA mov handle, eax mov clsHInstance, eax mov eax, offset wndproc mov clsLpfnWndProc, eax mov clsLpszClassName, offset nom_fenetre push offset wndclassx callW RegisterClassExA ;--------------------- create the window -------------------------- push 0 push handle push 0 push 0 ;HWND_DESKTOP push 500 ;hauteur push 500 ;largeur push 0 ;y push 0 ;x push 0CF0000h+4000000h+2000000h ;WS_OVERLAPPEDWINDOW+WS_CLIPSIBLINGS+WS_CLIPCHILDREN push offset nom_fenetre push offset nom_fenetre push 0 ;extra style callW CreateWindowExA mov handle_wd, eax ;------------------------ show window ------------------------------ push 1 push handle_wd callW ShowWindow push handle_wd callW UpdateWindow call enable_opengl ;------------------------ the message loop ---------------------------------- winmain_msg_loop: push 0 push 0 push handle_wd callW InvalidateRect ;force paint? push 1 push 0 push 0 push 0 push offset msg callW PeekMessageA cmp eax, 0 jnz process_messages jmp winmain_msg_loop ;----- check if window is closed -------- process_messages: cmp msMESSAGE, 12h ;WM_QUIT equ 0012h je end_loop push offset msg callW TranslateMessage push offset msg callW DispatchMessageA jmp winmain_msg_loop end_loop: call disable_opengl push table_faces_normals callW LocalFree push msWPARAM callW ExitProcess ;------------------ windows proc ------------------------ wndproc proc hwnd:DWORD, wmsg:DWORD, wparam:DWORD, lparam:DWORD cmp wmsg,2 ;WM_DESTROY? jne suite1 push 0 callW PostQuitMessage xor eax, eax jmp wndproc_end suite1: cmp wmsg, 0fh ;WM_PAINT? jne suite3 push offset rect_struct push handle_wd callW GetClientRect mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW BeginPaint call draw_opengl mov eax, theDC mov pshdc, eax push offset paint_struct push handle_wd callW EndPaint xor eax, eax jmp wndproc_end suite3: cmp wmsg, 102h ;WM_CHAR? jne suite4 ;stuff for keyboard control ;i should have done that with the mouse cmp wparam, "1" ;but too late: T00fic is gonna kill me jne __suite1 ;if i ask more time :) fld cur_anglex fadd inc_angle fstp cur_anglex jmp fin_test_clavier __suite1: cmp wparam, "2" jne __suite2 fld cur_anglex fsub inc_angle fstp cur_anglex jmp fin_test_clavier __suite2: cmp wparam, "3" jne __suite3 fld cur_angley fadd inc_angle fstp cur_angley jmp fin_test_clavier __suite3: cmp wparam, "4" jne __suite4 fld cur_angley fsub inc_angle fstp cur_angley jmp fin_test_clavier __suite4: cmp wparam, "5" jne __suite5 fld cur_anglez fadd inc_angle fstp cur_anglez jmp fin_test_clavier __suite5: cmp wparam, "6" jne __suite6 fld cur_anglez fsub inc_angle fstp cur_anglez jmp fin_test_clavier __suite6: cmp wparam, "7" jne __suite7 fld cur_distance fadd inc_distance fstp cur_distance jmp fin_test_clavier __suite7: cmp wparam, "8" jne __suite8 fld cur_distance fsub inc_distance fstp cur_distance jmp fin_test_clavier __suite8: cmp wparam, "9" jne __suite9 xor smooth_or_flat,0ffh jmp fin_test_clavier __suite9: fin_test_clavier: xor eax, eax jmp wndproc_end suite4: push lparam push wparam push wmsg push hwnd callW DefWindowProcA wndproc_end: ret wndproc endp ;--------------------- disable OpenGL ---------------------- disable_opengl: push 0 push 0 callW wglMakeCurrent push theRC callW wglDeleteContext push theDC push handle_wd callW ReleaseDC ret ;--------------------- enable OpenGL for window ----------------------------------- enable_opengl: push handle_wd callW GetDC mov theDC, eax mov pfd_nSize, DDPIXELFORMAT_struct_size mov pfd_nVersion, 1 mov pfd_dwFlags, 20h+1+4 ;PFD_SUPPORT_OPENGL OR PFD_DOUBLEBUFFER OR PFD_DRAW_TO_WINDOW mov pfd_dwLayerMask, 0 ;PFD_MAIN_PLANE mov pfd_iPixelType, 0 ;PFD_TYPE_RGBA mov pfd_cColorBits, 24 mov pfd_cDepthBits, 16 mov pfd_cAccumBits, 0 mov pfd_cStencilBits, 0 push offset DDPIXELFORMAT_struct push theDC callW ChoosePixelFormat mov pixformat, eax push offset DDPIXELFORMAT_struct push pixformat push theDC callW SetPixelFormat ;once you call this, td32 becomes crazy? push theDC callW wglCreateContext mov theRC, eax push theRC push theDC callW wglMakeCurrent ;--------------------- prepare OpenGL ---------------------- push 0 push 0 push 0 push 0 callW glClearColor push 500 push 500 push 0 push 0 callW glViewport push p1__0 callW glClearDepth push 0b71h ;GL_DEPTH_TEST callW glEnable push 203h ;GL_LEQUAL callW glDepthFunc push 1102h ;GL_NICEST push 0c50h ;GL_PERSPECTIVE_CORRECTION_HINT callW glHint push 1d01h ;GL_SMOOTH callW glShadeModel push 0b44h ;GL_CULL_FACE callW glEnable ;don't show faces when drawn ccw push 1701h ;GL_PROJECTION callW glMatrixMode callW glLoadIdentity push pp30 ;zfar push p4__0 ;znear push p3__0 ;top push m3__0 ;bottom push p3__0 ;right push m3__0 ;left callW glFrustum push 1700h ;GL_MODELVIEW callW glMatrixMode callW glLoadIdentity push offset Light_Diffuse push 1201h ;GL_DIFFUSE push 4000h ;GL_LIGHT0 callW glLightfv push offset Light_Position push 1203h ;GL_POSITION push 4000h ;GL_LIGHT0 callW glLightfv push 0b57h ;GL_COLOR_MATERIAL callW glEnable push 0ba1h ;GL_NORMALIZE let OpenGL normalize normal length (=1) callW glEnable ;so we don't have to do it; slower but don't care ;because we precalculate everything before drawing ret ;--------------------- calculate, draw, eat cpu time... ---------------------- draw_opengl: push 4000h+100h ;GL_COLOR_BUFFER_BIT+GL_DEPTH_BUFFER_BIT callW glClear ;---- Draw callW glLoadIdentity push cur_distance ;translate z axis push 0 push 0 callW glTranslatef push 0 push 0 push p1_0 ;rotate x axis push cur_anglex callW glRotatef push 0 push p1_0 ;rotate y axis push 0 push cur_angley callW glRotatef push p1_0 ;rotate z axis push 0 push 0 push cur_anglez callW glRotatef push p1_0 push p1_0 push p1_0 callW glColor3f push 0b50h ;GL_LIGHTING callW glEnable push 4000h ;GL_LIGHT0 callW glEnable push 4 ;GL_TRIANGLES callW glBegin push offset mat_Ambient push 1200h ;GL_AMBIENT push 404h ;GL_FRONT callW glMaterialfv push offset mat_Diffuse push 1201h ;GL_DIFFUSE push 404h ;GL_FRONT callW glMaterialfv push offset mat_Specular push 1202h ;GL_SPECULAR push 404h ;GL_FRONT callW glMaterialfv push offset mat_Shine push 1601h ;GL_SHININESS push 404h ;GL_FRONT callW glMaterialfv ;As a reminder: we have one big table of 441 faces * 24 dd : ; ;dd index1, index2, index3 ;dd x1, y1, z1 ;dd x2, y2, z2 ;dd x3, y3, z3 ;dd normalx, normaly, normalz ;dd averagednormalx1, averagednormaly1, averagednormalz1 ;dd averagednormalx2, averagednormaly2, averagednormalz2 ;dd averagednormalx3, averagednormaly3, averagednormalz3 ;--- Draw these fucking 441 polygons at once mov ecx, 441 mov esi, table_faces_normals draw_them_all_at_once: push ecx ;--- get everything we need in the table add esi, 12 lodsd mov x1, eax lodsd mov y1, eax lodsd mov z1, eax lodsd mov x2, eax lodsd mov y2, eax lodsd mov z2, eax lodsd mov x3, eax lodsd mov y3, eax lodsd mov z3, eax lodsd mov normal_x, eax lodsd mov normal_y, eax lodsd mov normal_z, eax lodsd mov anx1, eax lodsd mov any1, eax lodsd mov anz1, eax lodsd mov anx2, eax lodsd mov any2, eax lodsd mov anz2, eax lodsd mov anx3, eax lodsd mov any3, eax lodsd mov anz3, eax ;--- at least, draw the shit cmp smooth_or_flat, 0 je smooth_shading ; flat shade half of the face flat_shading: push normal_z ;use not the averaged normals at each vertex push normal_y ;but the polygon normal => each polygon becomes push normal_x ;very visible and flat callW glNormal3f push z2 push y2 push x2 callW glVertex3f push z1 push y1 push x1 callW glVertex3f push z3 push y3 push x3 callW glVertex3f jmp end_smooth ; smooth shade half of the face smooth_shading: push anz2 push any2 push anx2 callW glNormal3f push z2 push y2 push x2 callW glVertex3f push anz1 push any1 push anx1 callW glNormal3f push z1 push y1 push x1 callW glVertex3f push anz3 push any3 push anx3 callW glNormal3f push z3 push y3 push x3 callW glVertex3f end_smooth: ;--- mirror second half-face by inverting all x coordinates (symetric by y,z plan) fld x1 fchs fstp x1 fld x2 fchs fstp x2 fld x3 fchs fstp x3 fld anx1 fchs fstp anx1 fld anx2 fchs fstp anx2 fld anx3 fchs fstp anx3 fld normal_x fchs fstp normal_x ;--- draw second semi-face, always smoothed push anz1 push any1 push anx1 callW glNormal3f push z1 push y1 push x1 callW glVertex3f push anz2 push any2 push anx2 callW glNormal3f push z2 push y2 push x2 callW glVertex3f push anz3 push any3 push anx3 callW glNormal3f push z3 push y3 push x3 callW glVertex3f pop ecx dec ecx jnz draw_them_all_at_once callW glEnd push theDC callW SwapBuffers ret end start ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - File: index.inc facettes: db 1,2,5 db 1,5,4 db 2,3,6 db 2,6,5 db 7,4,5 db 7,5,8 db 8,5,6 db 8,6,9 db 11,8,9 db 10,7,8 db 10,8,11 db 6,3,14 db 6,14,13 db 9,6,13 db 9,13,12 db 11,9,12 db 11,12,17 db 11,17,18 db 12,13,16 db 12,16,17 db 13,14,15 db 13,15,16 db 16,15,25 db 16,25,24 db 16,24,23 db 17,16,23 db 17,23,22 db 18,17,22 db 18,22,21 db 19,11,18 db 20,19,18 db 20,18,21 db 24,25,26 db 24,26,27 db 23,24,27 db 23,27,28 db 22,23,28 db 22,28,29 db 21,22,29 db 21,29,30 db 32,20,21 db 32,21,31 db 31,21,30 db 31,30,35 db 35,30,29 db 35,29,36 db 29,28,37 db 29,37,36 db 28,27,38 db 28,38,37 db 27,26,39 db 27,39,38 db 38,39,40 db 38,40,41 db 37,38,41 db 37,41,42 db 36,37,42 db 36,42,43 db 35,36,43 db 35,43,44 db 34,31,35 db 34,35,44 db 33,32,31 db 33,31,34 db 45,33,34 db 45,34,46 db 46,34,44 db 46,44,47 db 47,44,43 db 47,43,48 db 48,43,42 db 48,42,49 db 42,41,50 db 42,50,49 db 41,40,51 db 41,51,50 db 50,51,64 db 50,64,63 db 49,50,63 db 49,63,62 db 48,49,62 db 48,62,61 db 47,48,61 db 63,64,65 db 63,65,66 db 66,65,77 db 66,77,76 db 67,66,76 db 67,76,75 db 62,63,66 db 62,66,67 db 73,67,75 db 73,75,74 db 68,62,67 db 68,67,73 db 60,61,62 db 60,62,68 db 52,47,61 db 52,61,60 db 53,46,47 db 53,47,52 db 54,45,46 db 54,46,53 db 55,54,53 db 55,53,56 db 58,55,56 db 58,56,57 db 56,53,52 db 56,52,57 db 58,57,59 db 57,52,60 db 57,60,59 db 58,59,69 db 58,69,70 db 59,60,68 db 59,68,69 db 70,69,72 db 70,72,71 db 69,68,73 db 69,73,72 db 72,73,74 db 58,146,55 db 146,145,54 db 146,54,55 db 145,144,45 db 145,45,54 db 144,142,45 db 142,141,33 db 142,33,45 db 141,98,32 db 141,32,33 db 98,97,20 db 98,20,32 db 97,89,19 db 97,12,20 db 89,87,19 db 19,87,11 db 87,88,10 db 87,10,11 db 87,85,86 db 87,86,88 db 87,84,85 db 84,81,82 db 84,82,85 db 85,82,83 db 85,83,86 db 81,80,79 db 81,79,82 db 82,79,78 db 82,78,83 db 89,90,84 db 89,84,87 db 90,91,81 db 90,81,84 db 91,92,80 db 91,80,81 db 94,93,92 db 94,92,91 db 95,94,91 db 96,95,91 db 96,91,90 db 97,96,90 db 97,90,89 db 98,99,96 db 98,96,97 db 99,100,95 db 99,95,96 db 100,101,102 db 100,102,95 db 102,103,94 db 102,94,95 db 103,104,93 db 103,93,94 db 106,105,104 db 106,104,103 db 102,106,103 db 107,106,102 db 109,101,100 db 110,109,100 db 111,110,100 db 111,100,112 db 111,117,118 db 111,118,110 db 110,118,108 db 110,108,109 db 118,119,107 db 118,107,109 db 119,120,106 db 119,106,107 db 120,121,105 db 120,105,106 db 123,122,121 db 123,121,120 db 124,123,120 db 124,120,119 db 117,124,119 db 117,119,118 db 115,116,117 db 115,117,111 db 113,112,100 db 113,100,99 db 141,113,99 db 141,99,98 db 114,115,111 db 114,111,112 db 114,112,113 db 116,125,124 db 116,124,117 db 124,127,123 db 127,128,122 db 127,122,123 db 126,129,128 db 126,128,127 db 125,126,127 db 125,127,124 db 131,130,129 db 131,129,126 db 132,131,126 db 132,126,125 db 115,132,125 db 115,125,116 db 134,135,130 db 134,130,131 db 133,134,131 db 133,131,132 db 133,132,115 db 133,115,114 db 139,114,113 db 139,113,140 db 140,113,141 db 140,141,142 db 143,140,142 db 144,143,142 db 148,144,145 db 170,148,145 db 170,145,146 db 147,170,146 db 147,171,169 db 147,169,170 db 169,149,148 db 169,148,170 db 149,150,144 db 149,144,148 db 150,151,143 db 150,143,144 db 151,152,140 db 151,140,143 db 152,153,139 db 152,139,140 db 153,138,139 db 139,138,133 db 139,133,114 db 153,138,139 db 138,137,134 db 138,134,133 db 137,136,135 db 137,135,134 db 156,157,136 db 156,136,137 db 155,156,137 db 155,137,138 db 154,155,138 db 154,138,153 db 152,154,153 db 159,158,157 db 159,157,156 db 160,159,156 db 160,156,155 db 161,160,155 db 161,155,154 db 163,162,161 db 163,161,154 db 164,163,154 db 164,154,152 db 165,164,152 db 165,152,151 db 166,165,151 db 166,151,150 db 167,166,150 db 167,150,149 db 169,168,167 db 169,167,149 db 171,174,168 db 171,168,169 db 174,177,178 db 174,178,168 db 168,178,179 db 168,179,167 db 179,180,166 db 179,166,167 db 180,181,165 db 180,165,166 db 181,182,164 db 181,164,165 db 182,183,163 db 182,163,164 db 183,184,162 db 183,162,163 db 184,185,162 db 185,186,161 db 185,161,162 db 186,187,160 db 186,160,161 db 187,188,159 db 187,159,160 db 188,189,158 db 188,158,159 db 191,190,189 db 191,189,188 db 192,191,188 db 192,188,187 db 193,192,187 db 193,187,186 db 194,193,186 db 194,186,185 db 214,193,194 db 214,194,195 db 214,207,192 db 214,192,193 db 208,207,214 db 208,214,213 db 213,214,195 db 213,195,196 db 212,213,196 db 212,196,197 db 211,212,197 db 211,197,198 db 200,211,198 db 200,198,199 db 178,200,199 db 178,199,179 db 177,201,200 db 177,200,178 db 201,210,211 db 201,211,200 db 210,209,212 db 210,212,211 db 209,208,213 db 209,213,212 db 206,191,192 db 206,192,207 db 205,206,207 db 205,207,208 db 204,205,208 db 204,208,209 db 203,204,209 db 203,209,210 db 202,203,210 db 202,210,201 db 176,202,201 db 176,201,177 db 174,176,177 db 191,215,190 db 215,228,229 db 215,229,190 db 228,231,230 db 228,230,229 db 231,242,243 db 231,243,230 db 232,241,242 db 232,242,231 db 232,231,228 db 232,228,227 db 227,228,215 db 227,215,216 db 216,215,191 db 216,191,206 db 217,216,206 db 217,206,205 db 226,227,216 db 226,216,217 db 233,232,227 db 233,227,226 db 240,241,232 db 240,232,233 db 239,240,233 db 239,233,234 db 234,233,226 db 234,226,225 db 225,226,217 db 225,217,218 db 218,217,205 db 218,205,204 db 219,218,204 db 219,204,203 db 224,225,218 db 224,218,219 db 235,234,225 db 235,225,224 db 238,239,234 db 238,234,235 db 237,238,235 db 237,235,236 db 236,235,224 db 236,224,223 db 223,224,219 db 223,219,220 db 221,220,202 db 221,202,176 db 220,219,203 db 220,203,202 db 175,237,236 db 175,236,223 db 175,223,220 db 175,220,221 db 222,221,176 db 222,176,174 db 222,174,171 db 175,221,222 db 175,222,173 db 173,222,171 db 173,171,172 db 172,171,147 db 147,171,169 db 147,169,170 db 244,245,194 db 244,194,185 db 245,246,195 db 245,195,194 db 246,247,196 db 246,196,195 db 247,248,197 db 247,197,196 db 248,249,198 db 248,198,197 db 249,250,199 db 249,199,198 db 250,251,179 db 250,179,199 db 179,251,252 db 179,252,180 db 181,180,252 db 181,252,253 db 182,181,253 db 182,253,254 db 183,182,254 db 183,254,255 db 184,183,255 db 184,255,0 ;256 db 185,184,0 ;256 db 185,0,244 ;256 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - File: Faceline.asm float TYPEDEF REAL4 coords: float 0.000, -2.280, 8.875 float 0.000, -2.456, 8.980 float 0.000, -2.701, 9.005 float -0.509, -2.230, 8.865 float -0.577, -2.414, 8.962 float -0.585, -2.670, 8.987 float -1.027, -2.201, 8.544 float -1.135, -2.372, 8.658 float -1.182, -2.556, 8.657 float -1.570, -2.221, 8.025 float -1.805, -2.354, 8.037 float -1.151, -3.134, 8.433 float -0.565, -3.181, 8.583 float 0.000, -3.216, 8.631 float 0.000, -3.545, 8.640 float -0.582, -3.517, 8.557 float -1.158, -3.443, 8.329 float -1.999, -2.568, 7.895 float -2.121, -2.222, 7.917 float -2.395, -2.073, 7.692 float -2.213, -2.797, 7.639 float -1.358, -3.775, 8.198 float -0.837, -3.880, 8.520 float -0.590, -3.910, 8.645 float 0.000, -3.914, 8.646 float 0.000, -4.564, 8.583 float -0.700, -4.532, 8.584 float -1.058, -4.461, 8.459 float -1.579, -4.290, 8.085 float -1.995, -3.660, 7.538 float -2.572, -2.969, 7.100 float -2.746, -1.859, 7.124 float -2.990, -1.690, 6.640 float -2.751, -3.033, 6.688 float -2.147, -4.156, 7.145 float -1.620, -4.770, 7.945 float -1.081, -4.944, 8.281 float -0.699, -4.994, 8.360 float 0.000, -5.021, 8.360 float 0.000, -5.412, 7.852 float -0.602, -5.444, 7.853 float -0.990, -5.418, 7.854 float -1.597, -5.169, 7.416 float -2.342, -4.202, 6.524 float -3.374, -1.344, 5.866 float -3.118, -3.043, 5.708 float -2.559, -4.377, 5.351 float -1.600, -5.205, 6.353 float -0.945, -5.501, 6.834 float -0.542, -5.601, 7.067 float 0.000, -5.636, 7.068 float -3.232, -3.283, 3.861 float -3.686, -2.281, 4.257 float -3.797, -0.831, 4.703 float -4.136, -0.236, 3.398 float -4.093, -1.041, 3.153 float -3.959, -1.660, 2.889 float -4.295, 0.021, 2.170 float -3.485, -2.252, 2.286 float -2.740, -3.866, 3.388 float -2.315, -4.570, 4.819 float -0.966, -5.443, 4.589 float -0.556, -5.511, 4.589 float 0.000, -5.553, 4.589 float 0.000, -7.061, 3.726 float -0.436, -6.971, 3.553 float -0.926, -6.872, 3.196 float -2.414, -4.428, 2.801 float -3.120, -3.336, 1.701 float -3.204, -2.934, 1.002 float -3.120, -5.511, 0.149 float -3.119, -5.510, 0.702 float -2.343, -6.297, 1.993 float -2.389, -6.885, 1.708 float -1.053, -8.199, 2.359 float -0.336, -8.622, 2.554 float 0.000, -8.714, 2.559 float 0.000, -2.278, 8.878 float 0.000, -2.064, 9.078 float 0.000, -1.830, 9.119 float -0.484, -1.720, 9.116 float -0.512, -2.003, 9.070 float -0.521, -2.231, 8.876 float -1.170, -1.928, 9.000 float -1.083, -2.093, 8.703 float -1.032, -2.198, 8.549 float -1.773, -2.057, 8.299 float -1.572, -2.217, 8.022 float -2.039, -1.735, 8.072 float -1.285, -1.456, 8.655 float -0.456, -1.314, 8.986 float 0.000, -1.461, 8.920 float 0.000, -0.710, 8.876 float -0.237, -0.648, 8.971 float -0.446, -0.648, 8.971 float -1.316, -0.911, 8.428 float -2.206, -1.333, 7.855 float -2.274, -1.067, 7.654 float -1.276, -0.534, 8.239 float -0.753, -0.441, 8.580 float -0.534, -0.074, 8.714 float -0.191, -0.056, 9.150 float -0.171, -0.426, 9.051 float 0.000, -0.441, 9.053 float 0.000, -0.232, 9.570 float -0.168, -0.224, 9.570 float -0.560, 0.058, 9.376 float -0.767, 0.046, 9.042 float -0.843, -0.128, 8.806 float -0.978, -0.276, 8.684 float -1.091, -0.204, 8.513 float -0.905, -0.325, 8.292 float -1.320, -0.188, 8.010 float -0.895, 0.194, 8.202 float -1.002, 0.217, 8.462 float -1.077, 0.307, 8.703 float -1.017, 0.325, 8.904 float -0.900, 0.099, 9.033 float -0.574, 0.252, 9.485 float -0.118, -0.099, 9.722 float 0.000, -0.098, 9.723 float 0.000, 0.512, 9.855 float -0.158, 0.508, 9.820 float -0.587, 0.550, 9.557 float -0.660, 0.776, 9.277 float -0.242, 1.137, 9.532 float -0.208, 0.854, 9.713 float 0.000, 0.862, 9.749 float 0.000, 1.192, 9.559 float 0.000, 1.445, 9.385 float -0.250, 1.387, 9.361 float -0.495, 1.190, 9.132 float -0.526, 1.443, 8.894 float -0.284, 1.740, 9.158 float 0.000, 1.817, 9.200 float 0.000, 2.180, 8.995 float -0.322, 2.100, 8.927 float -0.667, 1.571, 8.598 float -1.312, 0.849, 8.093 float -2.093, 0.282, 7.775 float -2.327, -0.805, 7.560 float -3.108, -0.078, 7.267 float -3.182, 0.649, 7.412 float -3.805, 0.868, 6.790 float -4.108, 1.022, 5.942 float -4.360, 1.772, 4.387 float -4.187, 2.611, 4.596 float -4.028, 1.464, 6.118 float -3.708, 2.236, 6.211 float -3.359, 1.693, 6.896 float -2.876, 1.352, 7.271 float -2.100, 1.207, 7.559 float -1.337, 1.263, 8.027 float -1.270, 1.664, 7.809 float -0.723, 2.023, 8.332 float -0.357, 2.487, 8.669 float 0.000, 2.608, 8.699 float 0.000, 2.909, 8.460 float -0.392, 2.825, 8.420 float -0.623, 2.411, 8.173 float -0.853, 2.189, 7.760 float -1.119, 2.259, 7.352 float -1.460, 1.887, 7.332 float -2.095, 1.531, 7.388 float -2.765, 1.605, 7.294 float -3.156, 1.949, 6.974 float -3.399, 2.397, 6.443 float -3.657, 2.603, 6.413 float -3.904, 2.477, 5.990 float -4.092, 1.936, 5.653 float -3.994, 2.776, 5.641 float -4.121, 3.106, 4.611 float -4.105, 3.756, 4.772 float -3.883, 2.972, 6.298 float -3.928, 4.609, 5.060 float -3.866, 3.453, 6.724 float -3.788, 3.260, 6.846 float -3.556, 2.930, 6.956 float -3.201, 2.669, 6.903 float -3.001, 2.353, 7.274 float -2.571, 2.177, 7.578 float -2.113, 2.147, 7.561 float -1.602, 2.246, 7.687 float -1.210, 2.404, 7.438 float -0.967, 2.609, 7.023 float -0.638, 2.684, 7.661 float -0.584, 3.052, 8.055 float -0.431, 3.211, 8.189 float 0.000, 3.262, 8.208 float 0.000, 3.664, 8.101 float -0.487, 3.639, 8.101 float -0.760, 3.420, 7.947 float -0.829, 3.210, 7.554 float -1.006, 2.963, 7.129 float -1.309, 3.290, 7.370 float -1.772, 3.474, 7.615 float -2.268, 3.493, 7.824 float -2.704, 3.315, 7.781 float -3.129, 3.065, 7.391 float -3.421, 3.337, 7.438 float -3.624, 3.650, 7.348 float -3.730, 3.872, 7.238 float -3.285, 4.274, 7.783 float -2.569, 4.558, 8.182 float -1.841, 4.676, 8.353 float -1.067, 4.327, 8.469 float -1.150, 4.072, 8.222 float -1.853, 4.265, 8.296 float -2.509, 4.191, 8.259 float -3.195, 3.970, 7.895 float -2.963, 3.637, 7.879 float -2.381, 3.830, 8.100 float -1.782, 3.850, 8.071 float -1.227, 3.657, 8.072 float -0.450, 4.377, 8.175 float -0.991, 4.862, 8.093 float -1.731, 5.054, 7.962 float -2.474, 4.937, 7.775 float -3.170, 4.658, 7.356 float -3.605, 4.334, 6.861 float -3.890, 3.957, 6.326 float -3.941, 3.197, 5.815 float -3.590, 5.230, 6.286 float -3.102, 5.495, 6.831 float -2.330, 5.690, 7.264 float -1.576, 5.648, 7.632 float -0.888, 5.445, 7.804 float -0.406, 5.084, 7.869 float 0.000, 4.670, 7.912 float 0.000, 6.172, 7.196 float -0.354, 6.247, 7.229 float -0.746, 6.328, 7.263 float -1.426, 6.432, 7.212 float -2.244, 6.373, 6.969 float -3.105, 6.092, 6.495 float -3.639, 5.648, 5.945 float -3.562, 6.154, 5.544 float -3.109, 6.630, 5.986 float -2.176, 7.198, 6.426 float -1.281, 7.365, 6.600 float -0.547, 7.488, 6.717 float -0.286, 7.510, 6.750 float 0.000, 7.522, 6.764 float -0.973, 2.625, 7.123 float -1.041, 2.870, 7.229 float -1.295, 3.155, 7.470 float -1.693, 3.288, 7.715 float -2.196, 3.267, 7.924 float -2.545, 3.146, 7.881 float -2.856, 2.944, 7.491 float -3.091, 2.634, 7.003 float -2.846, 2.481, 7.474 float -2.383, 2.398, 7.878 float -2.012, 2.370, 7.961 float -1.574, 2.388, 7.987 float -1.197, 2.479, 7.638 ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - ; - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -