[iB3D] Improved MaxGUI Sample, resizing feature !
BlitzMax Forums/BlitzMax Programming/[iB3D] Improved MaxGUI Sample, resizing feature !
| ||
Hey guys! I finally found a way to resize the GUI instantly inside the canvas ! It's incredible, but it really works ! Here's how to do, gman didn't included the IDriver.OnResize(size) function, that one was needed to resize the 3d view without having to restart... Open C:\Program Files\blitzmax\mod\irrlicht.mod\core.mod\video\ivideodriver_wrap.h After : IImage* IrrVideo_IVideoDriver_createImageFromStream(IVideoDriver* driver,IReadFile* file) { if (driver) return driver->createImageFromFile(file); else return 0; } Add the following : void IrrVideo_IVideoDriver_OnResize(IVideoDriver* driver, s32 width, s32 height) { if (driver) { dimension2d<s32> size(width, height); driver->OnResize(size); } } Save And Close. Open C:\Program Files\blitzmax\mod\irrlicht.mod\core.mod\video\ivideodriver_wrap.bmx After : Function IrrVideo_IVideoDriver_createImageFromFile:Int(pIVideoDriver:Int, filename$z) ' returns IImage* Add the following : Function IrrVideo_IVideoDriver_OnResize(pIVideoDriver:Int, width:Int, height:Int) Save And Close Open C:\Program Files\blitzmax\mod\irrlicht.mod\core.mod\video\ivideodriver.bmx After : Method createImageFromFile:IImage(filename:String) Return IImage.createFromHandle(IrrVideo_IVideoDriver_createImageFromFile(handle,filename)) EndMethod Add the following : Method OnResize(width:Int, height:Int) IrrVideo_IVideoDriver_OnResize(handle, width, height) ' returns IImage* End Method Compile the modules. How does it work ? Here's the WINDOWSIZE event. Case EVENT_WINDOWSIZE Local devce:ib3d_engine = _g_ib3d_engine Local driver:IVideoDriver = devce.Driver SetGadgetShape(hIrrlichtWindow, 0, 0, ClientWidth(window), ClientHeight(window)) ib3d_CameraViewport(cam, 0, 0, ClientWidth(window), ClientHeight(window)) driver.OnResize(ClientWidth(window),ClientHeight(window)) If ClientWidth(hIrrlichtWindow) > ClientHeight(hIrrlichtWindow) ib3d_CameraAspectRatio(cam, 1.0 * (ClientWidth(hIrrlichtWindow) / ClientHeight(hIrrlichtWindow))) Else ib3d_CameraAspectRatio(cam, 1.0 * (ClientHeight(hIrrlichtWindow) / ClientWidth(hIrrlichtWindow))) EndIf SetGadgetText(window,ClientWidth(window) + " x " + ClientHeight(window)) First, we get the Irrlicht driver's functions : Local devce:ib3d_engine = _g_ib3d_engine Local driver:IVideoDriver = devce.Driver We set the 3D canvas' size to the Window's Client's Size : SetGadgetShape(hIrrlichtWindow, 0, 0, ClientWidth(window), ClientHeight(window)) Update the camera's viewport to the new 3d canvas' size : ib3d_CameraViewport(cam, 0, 0, ClientWidth(window), ClientHeight(window)) Call the OnResize method, to tell the driver that the 3D View's Resolution has been changed ! driver.OnResize(ClientWidth(window),ClientHeight(window)) Update the camera's aspect ratio, the divided number must be bigger than the divider one. Otherwise, you'll get a black screen if the width is smaller than the height. If ClientWidth(hIrrlichtWindow) > ClientHeight(hIrrlichtWindow) ib3d_CameraAspectRatio(cam, 1.0 * (ClientWidth(hIrrlichtWindow) / ClientHeight(hIrrlichtWindow))) Else ib3d_CameraAspectRatio(cam, 1.0 * (ClientHeight(hIrrlichtWindow) / ClientWidth(hIrrlichtWindow))) EndIf Here's the full code to test : ' this is an example showing how to display Irrlicht in a panel on a MaxGUI form. i have modified it a bit ' by adding an eventreceiver to the Irrlicht instance to show how MaxGUI and Irrlicht events can coexist. ' it is important to note that there still is probably some issues to work out, but for now this works. ' ' NOTE: press the 'w' key to toggle wireframe SuperStrict Framework Irrlicht.B3D Import BRL.Basic Import BRL.Win32MaxGUI Import BRL.EventQueue Local window:TGadget' Author: robobimbo Local windowWidth:Int = 800 Local windowHeight:Int = 600 window = CreateWindow("MyApp", 100, 100, .. windowWidth, windowHeight, Null)',WINDOW_TITLEBAR | WINDOW_CLIENTCOORDS | WINDOW_HIDDEN) ' create window To put irrlicht in Global hIrrlichtWindow:TGadget = CreatePanel(0, 0, 800, 600, window, PANEL_ACTIVE | PANEL_BORDER) Global param:SIrrlichtCreationParameters = SIrrlichtCreationParameters.Create() param.setWindowId(QueryGadget(hIrrlichtWindow,QUERY_HWND)) param.setDriverType(EDT_OPENGL) ' create the device from the params object and initialize iB3D ib3d_Graphics3DParams(param) ' setup a simple 3d scene Local cam:CAMERA = ib3d_CreateCamera() Local LIGHT1:LIGHT = ib3d_CreateLight() ib3d_LightColor(LIGHT1, 255, 255, 255) ib3d_LightRange(LIGHT1, 60) ib3d_LightCastShadows(LIGHT1,True) ib3d_PositionEntity(LIGHT1, 30, 0, 0) ib3d_LightAmbientColor(LIGHT1,0,0,0) Local plane:MESH = ib3d_CreatePlane(100, 100, 1, 1) ib3d_PositionEntity(plane, 30, - 10, 30) ib3d_PointEntity cam, plane Local cube:PRIMITIVE = ib3d_CreateCube() ib3d_PositionEntity(cube, 30, - 5, 30) ib3d_NameEntity(cube, "CUBE") ib3d_MoveEntity(cam, 0, 5, 0) ' show And execute dialog ShowGadget(window) ' do message queue Local bWireFrame:Int = False While (True) ib3d_TurnEntity cube, 0, 2, 0 ib3d_UpdateWorld() ib3d_RenderWorld() If PeekEvent() Then PollEvent() Select EventID() Case EVENT_WINDOWSIZE Local devce:ib3d_engine = _g_ib3d_engine Local driver:IVideoDriver = devce.Driver SetGadgetShape(hIrrlichtWindow, 0, 0, ClientWidth(window), ClientHeight(window)) ib3d_CameraViewport(cam, 0, 0, ClientWidth(window), ClientHeight(window)) driver.OnResize(ClientWidth(window),ClientHeight(window)) If ClientWidth(hIrrlichtWindow) > ClientHeight(hIrrlichtWindow) ib3d_CameraAspectRatio(cam, 1.0 * (ClientWidth(hIrrlichtWindow) / ClientHeight(hIrrlichtWindow))) Else ib3d_CameraAspectRatio(cam, 1.0 * (ClientHeight(hIrrlichtWindow) / ClientWidth(hIrrlichtWindow))) EndIf SetGadgetText(window,ClientWidth(window) + " x " + ClientHeight(window)) Case EVENT_WINDOWCLOSE Exit Case EVENT_GADGETACTION Default ActivateGadget(hIrrlichtWindow) If EventID()=EVENT_KEYDOWN And EventData()=KEY_W bWireFrame = Not bWireFrame 'ib3d_EntityFX(cube,EMF_WIREFRAME,bWireFrame) EndIf End Select End If Wend Now, launch the program and resize... WOOT WOOT ! IT WORKS ! That's it guys, ENJOY ! :D |