i found another way to do it using eikons code.
here is my whole code for d3d7graphics.bmx now graphics command will create a centered window, with the icon working without the requirement of maxgui. i have indiepaths dxrendertype function already set into this. all you have to do is follow the instructions to modify d3d7.bmx file and you can have it working. go here http://www.blitzbasic.com/Community/posts.php?topic=51795 and just do the first step. this code already has the rest.
[edit] ive been playing with OpenGl and i was reading the source file. i cant seem to make opengl windows centered tho. i tried but the variables rect.top and the like seem to be off. If anyone could help that would be great.
Strict
Import BRL.Graphics
Import BRL.LinkedList
Import BRL.KeyCodes
Import PUB.Win32
Import PUB.DirectX
Global DXRenderType:Byte
Const RGB = 1
Const MMX = 2
Const TnL = 3
Private
Extern "win32"
Function GetActiveWindow%()
Function GetDesktopWindow%()
Function GetWindowRect%(hWnd%, lpRect:Byte Ptr)
Function SetWindowText%(hWnd%, lpString$z) = "SetWindowTextA@8"
Function SetWindowPos%(hWnd%, after%, x%, y%, w%, h%, flags%)
End Extern
Type lpRECT
Field l%, t%, r%, b%
End Type
Global DDDevices:TList=New TList
Global DX_CLASS_NAME:Byte Ptr="BBDX7Device Window Class".ToCString()
Function WndProc( hwnd,message,wp,lp ) "win32"
bbSystemEmitOSEvent hwnd,message,wp,lp,Null
Select message
Case WM_CLOSE
Return
Case WM_KEYDOWN
Return
Case WM_SYSKEYDOWN
If wp<>KEY_F4 Return
Case WM_SETFOCUS
PrimaryDevice.SetFocus
Return
Case WM_KILLFOCUS
PrimaryDevice.KillFocus
Return
Case WM_DESTROY
Return
Case WM_LBUTTONDOWN,WM_RBUTTONDOWN,WM_MBUTTONDOWN
If Not (PrimaryDevice.state & PrimaryDevice.DX7FULLSCREEN)
SetCapture hwnd
EndIf
Return
Case WM_LBUTTONUP,WM_RBUTTONUP,WM_MBUTTONUP
If Not (PrimaryDevice.state & PrimaryDevice.DX7FULLSCREEN)
ReleaseCapture
EndIf
Return
End Select
Return DefWindowProcA( hwnd,message,wp,lp )
End Function
Function CreateHWND(width,height,fullscreen)
Local style,ex_style,hwnd
Local hinst=GetModuleHandleA(0)
Global wndClas
If Not wndClas
Local wc:WNDCLASS=New WNDCLASS
wc.hIcon=LoadIconA(hinst,Byte Ptr(101)) ' Added by yan
wc.hInstance=hinst
wc.lpfnWndProc=WndProc
wc.hCursor=LoadCursorA( Null,Byte Ptr IDC_ARROW )
wc.lpszClassName=DX_CLASS_NAME
wndClas=RegisterClassA( wc )
If Not wndClas
Throw "Failed to register window class"
EndIf
EndIf
Local wndTitle:Byte Ptr=AppTitle.ToCString()
If fullscreen
style=WS_VISIBLE|WS_POPUP
hwnd=CreateWindowExA( 0,DX_CLASS_NAME,wndTitle,style,0,0,width,height,0,0,hinst,Null )
Else
Local xpos,ypos ' Added by Moogle
Local desk_hWnd = GetDesktopWindow(), l:lpRect = New lpRECT
GetWindowRect(desk_hWnd, l:lpRECT) ' Get Desktop Dimensions
xpos = ((l.r/2)-(width/2)) ' Added by Moogle
ypos = ((l.b/2)-(height/2)) ' Added by Moogle
style=WS_VISIBLE|WS_CAPTION|WS_SYSMENU|WS_MINIMIZEBOX ' Added by Moogle
Local rect[]=[0,0,width,height]
AdjustWindowRect rect,style,0
width = rect[2] - rect[0]
height = rect[3] - rect[1]
hwnd=CreateWindowExA( 0,DX_CLASS_NAME,wndTitle,style,xPos,yPos,width,height,0,0,hinst,Null )
EndIf
MemFree wndTitle
If Not hwnd Throw "Failed to create window"
Return hwnd
End Function
Function enum_devices_callback(guid Ptr,desc:Byte Ptr,name:Byte Ptr,context Ptr) "win32"
Local device:TD3D7Device
Local devicedesc:Int Ptr,caps
devicedesc=Int Ptr(desc)
caps=devicedesc[0]
If (caps&D3DDEVCAPS_HWRASTERIZATION)=0 Return
device=New TD3D7Device
device.guid=guid
device.name=String.FromCString(name)
device.description=String.FromCString(desc)
If Not primarydevice primarydevice=device
DDDevices.AddLast device
Return True
End Function
'Type TDDFormat
' Field width,height,depth,frequency
'End Type
Public
Global PrimaryDevice:TD3D7Device
Type TD3D7Device
Field guid Ptr
Field name$
Field description$
Field ddraw:IDirectDraw7
Field d3d:IDirect3D7
Field device:IDirect3DDevice7
Field primarysurface:IDirectDrawSurface7
Field backbuffer:IDirectDrawSurface7
Field clipper:IDirectDrawClipper
Field reslist:TList=New TList
Field displaymodes:TGraphicsMode[]
Field state
Field width,height,depth,freq,hwnd
Field flipflags
Field painter:Object
Field devicecount
Const DX7FULLSCREEN=1
Const DX7WINDOWED=2
Const DX7DESKTOP=4
Const DX7EXCLUSIVE=8
Const DX7LOST=16
Function enum_modes_callback(surfdesc:Byte Ptr,context:Object) "win32"
Local device:TD3D7Device
Local surf Ptr
device=TD3D7Device(context)
surf=Int Ptr(surfdesc)
device.AddFormat(surf[3],surf[2],surf[21],surf[6])
Return DDENUMRET_OK
End Function
Function enum_d3d_callback(desc:Byte Ptr,name:Byte Ptr,d3ddevice:Byte Ptr,context:Object) "win32"
Local device:TD3D7Device
Local dev Ptr
dev=Int Ptr(d3ddevice)
device=TD3D7Device(context)
device.AddD3DDevice(String.FromCString(desc),String.FromCString(name))
Return D3DENUMRET_OK
End Function
Method GetDevice:IDirect3DDevice7(user:Object)
If (state&DX7LOST)=False And device
painter=user
Return device
EndIf
End Method
Method AddD3DDevice(desc$,name$)
' Print "desc="+desc+" name="+name
devicecount:+1
End Method
Method AddFormat(w,h,d,f)
If d<16 Return
Local pf:TGraphicsMode 'TDDFormat
' Print "w="+w+" h="+h+" d="+d+" f="+f
pf=New TGraphicsMode'TDDFormat
pf.width=w
pf.height=h
pf.depth=d
pf.hertz=f
ResList.AddLast pf
End Method
Method Init()
Local res
res=DirectDrawCreateEx( guid,Varptr ddraw,IID_IDirectDraw7,Null )
If res RuntimeError "DirectDrawCreateEx failed:"+res
res=DDraw.QueryInterface( IID_IDirect3D7,Byte Ptr Ptr(Varptr D3D) )
If res RuntimeError "Direct3D7 Interface Failed:"+res
D3D.EnumDevices enum_d3d_callback,Self
If Not primarydevice Return
ddraw.EnumDisplayModes DDEDM_REFRESHRATES,Null,Self,enum_modes_callback
Local i
displaymodes=New TGraphicsMode[reslist.count()]
For Local mode:TGraphicsMode=EachIn reslist
displaymodes[i]=mode
i:+1
Next
End Method
Method SetFocus()
Local res
If state&DX7FULLSCREEN And state&DX7EXCLUSIVE And state&DX7LOST
Restore
EndIf
End Method
Method KillFocus()
Local res
If state&DX7FULLSCREEN And state&DX7EXCLUSIVE
res=ddraw.SetCooperativeLevel(hwnd,DDSCL_NORMAL|DDSCL_FPUPRESERVE)
ShowWindow( hwnd,SW_MINIMIZE )
state:|DX7LOST
If painter painter.SendMessage("DEVICELOST",Self)
EndIf
End Method
Method Restore()
Local res
If state&DX7FULLSCREEN And state&DX7EXCLUSIVE
res=ddraw.SetDisplayMode(width,height,depth,freq,0)
Assert Not res,"Restore:SetDisplayMode Failed result="+res
res=ddraw.SetCooperativeLevel(hwnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_FPUPRESERVE)
Assert Not res,"Restore:SetCooperativeLevel Failed result="+res
EndIf
res=PrimarySurface.Restore()
Assert Not res,"PrimarySurface Restore Failed result="+res
res=BackBuffer.Restore()
Assert Not res,"BackBuffer Restore Failed result="+res
state:&~DX7LOST
Device.BeginScene() 'simon was here
If painter painter.SendMessage("DEVICERESTORED",Self)
End Method
Method OpenDesktop()
Local rect[4],res
If state=DX7DESKTOP Return
hwnd=GetDesktopWindow()
GetWindowRect(hwnd,rect)
hwnd=0
width=rect[2]
height=rect[3]
depth=0
freq=0
res=ddraw.SetCooperativeLevel(0,DDSCL_NORMAL|DDSCL_FPUPRESERVE)
Assert Not res,"SetCooperativeLevel Failed result="+res
state=DX7DESKTOP
Reset()
device.BeginScene()
End Method
Method OpenWindowed(w,h)
Local res
width=w
height=h
depth=0
freq=0
hwnd=CreateHWND(width,height,False)
res=ddraw.SetCooperativeLevel(hwnd,DDSCL_NORMAL|DDSCL_FPUPRESERVE)
Assert Not res,"SetCooperativeLevel Failed result="+res
state=DX7WINDOWED
Reset()
device.BeginScene()
End Method
Method OpenFullScreen(w,h,d,f)
Local res
width=w
height=h
depth=d
freq=f
hwnd=CreateHWND(width,height,True)
res=ddraw.SetCooperativeLevel(hwnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_FPUPRESERVE)
Assert Not res,"SetCooperativeLevel Failed result="+res
res=ddraw.SetDisplayMode(width,height,depth,freq,0)
If res And freq
freq=0
res=ddraw.SetDisplayMode(width,height,depth,freq,0)
EndIf
If res And depth<>32
depth=32
res=ddraw.SetDisplayMode(width,height,depth,freq,0)
EndIf
If res
If depth=24 depth=32
res=ddraw.SetDisplayMode(width,height,depth,freq,0)
EndIf
Assert Not res,"SetDisplayMode Failed result="+res
' res=ddraw.SetCooperativeLevel(hwnd,DDSCL_EXCLUSIVE|DDSCL_FULLSCREEN|DDSCL_FPUPRESERVE)
' Assert Not res,"SetCooperativeLevel Failed result="+res
state=DX7FULLSCREEN|DX7EXCLUSIVE
Reset()
device.BeginScene()
End Method
Method Reset()
Local ddsd:DDSURFACEDESC2
Local ddsc:DDSCAPS2
Local res
Local fullscreen
ddsd=New DDSURFACEDESC2
ddsd.dwSize=SizeOf(ddsd)
fullscreen=state&DX7FULLSCREEN
flipflags=DDFLIP_WAIT
If fullscreen
ddsd.dwFlags=DDSD_CAPS|DDSD_BACKBUFFERCOUNT
ddsd.ddsCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_FLIP|DDSCAPS_COMPLEX|DDSCAPS_3DDEVICE
ddsd.dwBackBufferCount=1
Else
ddsd.dwFlags=DDSD_CAPS
ddsd.ddsCaps=DDSCAPS_PRIMARYSURFACE|DDSCAPS_3DDEVICE
EndIf
res=ddraw.CreateSurface( ddsd,Varptr primarysurface,Null )
Assert Not res,"CreateSurface Failed result="+res
Select DXRenderType
Case RGB
res=d3d.CreateDevice(IID_IDirect3DRGBDevice,primarysurface,Varptr device)
Case MMX
res=d3d.CreateDevice(IID_IDirect3DMMXDevice,primarysurface,Varptr device)
Case TnL
res=d3d.CreateDevice(IID_IDirect3DTnLHalDevice,primarysurface,Varptr device)
Default
res=d3d.CreateDevice(IID_IDirect3DHALDevice,primarysurface,Varptr device)
End Select
If res res=d3d.CreateDevice(IID_IDirect3DHALDevice,primarysurface,Varptr device)
Assert Not res,"CreateDevice Failed result="+res
If fullscreen
ddsc=New DDSCAPS2
ddsc.dwCaps=DDSCAPS_BACKBUFFER
res=primarysurface.GetAttachedSurface( ddsc,Varptr BackBuffer )
Assert Not res,"GetAttachedSurface Failed result="+res
Else
ddsd.ddsCaps=DDSCAPS_OFFSCREENPLAIN|DDSCAPS_3DDEVICE
ddsd.dwFlags=DDSD_WIDTH|DDSD_HEIGHT|DDSD_CAPS
ddsd.dwWidth=width
ddsd.dwHeight=height
res=ddraw.CreateSurface( ddsd,Varptr BackBuffer,Null )
Assert Not res,"CreateSurface Failed result="+res
res=ddraw.CreateClipper( 0,Varptr Clipper,Null )
Assert Not res,"CreateClipper Failed result="+res
res=primarysurface.SetClipper(Clipper)
Assert Not res,"SetClipper Failed result="+res
res=clipper.SetHWnd( 0,hwnd )
Assert Not res,"Clipper.SetHWND Failed result="+res
EndIf
device.SetRenderTarget BackBuffer,0
device.SetRenderState D3DRS_LIGHTING,False
End Method
Method _Release()
Local res
res=BackBuffer.Release_()
BackBuffer=Null
' Print "backbuffer release res="+res
res=device.Release_()
device=Null
' Print "D3D.Release res="+res
res=PrimarySurface.Release_()
PrimarySurface=Null
' Print "primarybuffer release res="+res
If Clipper
res=Clipper.Release_()
Clipper=Null
' Print "clipper release res="+res
EndIf
End Method
Method Close()
device.EndScene()
device.SetRenderTarget(Null,0)
If state&DX7FULLSCREEN
Local res=ddraw.SetCooperativeLevel(hwnd,DDSCL_NORMAL|DDSCL_FPUPRESERVE)
EndIf
_Release
If state&DX7WINDOWED Or state&DX7FULLSCREEN DestroyWindow(hwnd);
state=0
End Method
Method Flip()
Device.EndScene()
If state&DX7FULLSCREEN
PrimarySurface.Flip Null,flipflags
Else
Local src[]=[0,0,width,height]
Local dest[]=[0,0,width,height]
ClientToScreen hwnd,dest
dest[2]:+dest[0]
dest[3]:+dest[1]
PrimarySurface.Blt dest,BackBuffer,src,0,Null
EndIf
Device.BeginScene()
End Method
Method SetSwapInterval( interval )
If state&DX7FULLSCREEN=0 Return
Select interval
Case 0
flipflags=DDFLIP_NOVSYNC
Case 2
flipflags=DDFLIP_WAIT|DDFLIP_INTERVAL2
Case 3
flipflags=DDFLIP_WAIT|DDFLIP_INTERVAL3
Case 4
flipflags=DDFLIP_WAIT|DDFLIP_INTERVAL4
Default
flipflags=DDFLIP_WAIT
End Select
End Method
End Type
Type TD3D7Graphics Extends TGraphics
Field hwnd
Method Driver:TD3D7GraphicsDriver()
Return D3D7GraphicsDriver()
End Method
Method GetSettings( width Var,height Var,depth Var,hertz Var,flags Var )
If hwnd
Local dest[4]
GetClientRect hwnd,dest
width=dest[2]
height=dest[3]
Else
width=PrimaryDevice.width
height=PrimaryDevice.height
EndIf
depth=0
hertz=0
flags=0
End Method
Method Close()
PrimaryDevice.Close
End Method
Method GetDevice:IDirect3DDevice7(user:Object)
Return PrimaryDevice.GetDevice(user)
End Method
End Type
Type TD3D7GraphicsDriver Extends TGraphicsDriver
Global _graphics:TD3D7Graphics
Field islost
Method GraphicsModes:TGraphicsMode[]()
Return PrimaryDevice.displaymodes
End Method
Method AttachGraphics:TD3D7Graphics( widget,flags )
Local g:TD3D7Graphics
PrimaryDevice.OpenDesktop
g=New TD3D7Graphics
g.hwnd=widget
Return g
End Method
Method CreateGraphics:TD3D7Graphics( width,height,depth,hertz,flags )
Local g:TD3D7Graphics
If depth
PrimaryDevice.OpenFullScreen width,height,depth,hertz
Else
PrimaryDevice.OpenWindowed width,height
EndIf
g=New TD3D7Graphics
Return g
End Method
Method SetGraphics( g:TGraphics )
_graphics=TD3D7Graphics( g )
If Not _graphics Return
If _graphics.hwnd
If islost
Print "device lost!"
PrimaryDevice._Release
PrimaryDevice.Reset
PrimaryDevice.device.BeginScene()
Print "device restored!"
EndIf
PrimaryDevice.clipper.SetHWnd( 0,_graphics.hwnd )
EndIf
End Method
Method Flip( sync )
If Not _graphics Return
Local interval
If sync interval=1
PrimaryDevice.SetSwapInterval interval
If _graphics.hwnd
islost=PrimaryDevice.device.EndScene()
Local src[4]
Local dest[4]
GetClientRect _graphics.hwnd,dest
GetClientRect _graphics.hwnd,src
ClientToScreen _graphics.hwnd,dest
dest[2]:+dest[0]
dest[3]:+dest[1]
PrimaryDevice.primarysurface.Blt dest,PrimaryDevice.backbuffer,src,0,Null
PrimaryDevice.device.BeginScene()
Else
PrimaryDevice.Flip
EndIf
End Method
End Type
Function D3D7GraphicsDriver:TD3D7GraphicsDriver()
Global _done
Global _driver:TD3D7GraphicsDriver
If _done Return _driver
If DirectDrawCreateEx
DirectDrawEnumerate enum_devices_callback,Null
' Print "DirectDraw found "+DDDevices.Count()+" devices."
If PrimaryDevice
PrimaryDevice.Init
' Print "PrimaryDevice reslist.count()="+PrimaryDevice.reslist.Count()
If PrimaryDevice.reslist.Count()
_driver=New TD3D7GraphicsDriver
EndIf
EndIf
EndIf
_done=True
Return _driver
End Function
|