Not quite Seb, enablepolledinput may fix keyboard but for mouse handling a blitz3dsdk event handler is required:
' panel3d.bmx
' demonstrates running a Blitz3D runtime inside a MaxGUI application
Import maxgui.drivers
Import blitz3d.blitz3dsdk
Strict
enablepolledinput
Local b3dapp:TBlitz3DApplet
b3dapp=New TBlitz3DApplet.Create("Blitz3DSDK (C)2007 Blitz Research Ltd.")
While True
WaitEvent
b3dapp.OnEvent(CurrentEvent)
Wend
End
Const MENU_NEW=101
Const MENU_OPEN=102
Const MENU_SAVE=103
Const MENU_CLOSE=104
Const MENU_EXIT=105
Const MENU_CUT=106
Const MENU_COPY=107
Const MENU_PASTE=108
Const MENU_ABOUT=109
Type TBlitz3DApplet
Field camera,light
Field cube,cube2
Field lost=True
Function BBEventHandler(hwnd,msg,wp,lp) "win32"
bbSystemEmitOSEvent hwnd,msg,wp,lp,Null
Return -1
End Function
Method InitWorld(hwnd,maxwidth,maxheight)
bbSetBlitz3DHWND(hwnd)
bbSetBlitz3DEventCallback Int Byte Ptr BBEventHandler
bbBeginBlitz3D
bbGraphics3D maxwidth,maxheight,0,2
Local brush=bbCreateBrush(255,100,50)
cube=bbCreateCube()
bbPaintEntity cube,brush
bbFitMesh cube,-20,-20,-2,40,40,4
cube2=bbCreateCube()
bbPaintEntity cube2,brush
bbFitMesh cube2,-2,-20,-20,4,40,40
light=bbCreateLight()
camera=bbCreateCamera()
bbCameraClsColor camera,255,100,80
bbPositionEntity camera,0,0,-64
lost=False
End Method
Method DrawWorld(w,h)
If lost Return
bbCameraViewport camera,0,0,w,h
bbTurnEntity cube,0,1,0
bbTurnEntity cube2,0,1,0
bbRenderWorld
bbFlip
End Method
Field window:TGadget
Field canvas:TGadget
Field timer:TTimer
Field image:TImage
Field filemenu:TGadget
Field editmenu:TGadget
Field helpmenu:TGadget
Method Create:TBlitz3DApplet(name$)
Local w,h,hwnd
image=LoadImage("fltkwindow.png")
window=CreateWindow(name,20,20,512,512)
filemenu=CreateMenu("&File",0,WindowMenu(window))
CreateMenu"&New",MENU_NEW,filemenu,KEY_N,MODIFIER_COMMAND
CreateMenu"&Open",MENU_OPEN,filemenu,KEY_O,MODIFIER_COMMAND
CreateMenu"&Close",MENU_CLOSE,filemenu,KEY_W,MODIFIER_COMMAND
CreateMenu"",0,filemenu
CreateMenu"&Save",MENU_SAVE,filemenu,KEY_S,MODIFIER_COMMAND
CreateMenu"",0,filemenu
CreateMenu"E&xit",MENU_EXIT,filemenu,KEY_F4,MODIFIER_COMMAND
editmenu=CreateMenu("&Edit",0,WindowMenu(window))
CreateMenu "Cu&t",MENU_CUT,editmenu,KEY_X,MODIFIER_COMMAND
CreateMenu "&Copy",MENU_COPY,editmenu,KEY_C,MODIFIER_COMMAND
CreateMenu "&Paste",MENU_PASTE,editmenu,KEY_V,MODIFIER_COMMAND
helpmenu=CreateMenu("&Help",0,WindowMenu(window))
CreateMenu "&About",MENU_ABOUT,helpmenu
UpdateWindowMenu window
w=ClientWidth(window)
h=ClientHeight(window)
canvas=CreatePanel(0,0,w,h,window,PANEL_ACTIVE)
canvas.SetLayout 1,1,1,1
w=ClientWidth(Desktop())
h=ClientHeight(Desktop())
hwnd=QueryGadget(canvas,QUERY_HWND)
InitWorld(hwnd,w,h)
timer=CreateTimer(30)
Return Self
End Method
Field rendertime=MilliSecs()
Method OnEvent:Object(Event:TEvent)
If event.id<>EVENT_TIMERTICK
DebugLog CurrentEvent.ToString()
EndIf
Select event.id
Case EVENT_WINDOWCLOSE
End
Case EVENT_TIMERTICK
If (MilliSecs()-rendertime<10) Return
DrawWorld ClientWidth(canvas),ClientHeight(canvas)
rendertime=MilliSecs()
Case EVENT_MENUACTION
Select EventData()
Case MENU_EXIT
End
Case MENU_ABOUT
Notify "Incrediabler~n(C)2005 Incredible Software"
End Select
End Select
End Method
End Type
|