OpenGl & max2D in GUI App
BlitzMax Forums/MaxGUI Module/OpenGl & max2D in GUI App
| ||
I just brought the GUI kit last night but I'm missing some fundamentals here. How can I mix OpenGL (as in the glcube example) and Max2d functionality (DrawImage etc)? I've tried searching without any luck. Thanks in advance. |
| ||
Use a Canvas gadget. |
| ||
Thanks Brucey. That's what the glcube sample is doing..... SetGraphicsDriver GLGraphicsDriver(),GRAPHICS_BACKBUFFER|GRAPHICS_DEPTHBUFFER ... Local c:TGadget = CreateCanvas(0,0,w.ClientWidth(),w.ClientHeight(),w,0) c.setlayout 1,1,1,1 CreateTimer( 60 ) While True WaitEvent() Select EventID() Case EVENT_WINDOWCLOSE End Case EVENT_TIMERTICK RedrawGadget c Case EVENT_GADGETPAINT SetGraphics CanvasGraphics( c ) 'loads of gl specific stuff... 'but it crashes on any max2d calls DrawRect( 0, 0, 100, 100 ) Flip EndSelect Wend |
| ||
I've done some more digging. It seems there is no valid Max2d graphics object created in this example (usually created with a Graphics w,h command) while there are GLDrawRect and GLDrawPixmap functions. Does this mean; a) I have to find another way of initialising Max2d, or b) i have to stick to using opengl? |
| ||
Use this - GLMax2DGraphicsDriver() - instead of GLGraphicsDriver(). |
| ||
Close :) It's GLMax2DDriver. I scanned for GLMax2DGraphicsDriver and found nothing, so scanned for GLGraphicsDriver and GLMax2DDriver in with it. The next issue is that it doesn't automatically handle window resize. I solved that with capturing WINDOWSIZE events and completely recreating the gadget to the new client size; Case EVENT_WINDOWSIZE FreeGadget( c ) c = CreateCanvas(0,0,w.ClientWidth(),w.ClientHeight(),w,0) Is there anything wrong with this? I was losing loaded images tho (so, I guess they're tied to a canvas?) Loading them after recreating the canvas somehow didn't stop them from being garbage collected a few frames later. This only worked when I suspended GC.. Case EVENT_WINDOWSIZE FreeGadget( c ) c = CreateCanvas(0,0,w.ClientWidth(),w.ClientHeight(),w,0) r = LoadImage( "iconstrip1.png" ) So ultimately I had to ensure the image was completely deleted and recreated.. Case EVENT_WINDOWSIZE r = Null FreeGadget( c ) GCCollect c = CreateCanvas(0,0,w.ClientWidth(),w.ClientHeight(),w,0) r = LoadImage( "iconstrip1.png" ) I think I've about hacked this to death :/ |
| ||
When you resize, you need to reset your ViewPort() to the correct dimensions. Close :) It's GLMax2DDriver Apologies... I should look them up rather than try to remember stuff ;-) |
| ||
ViewPort() -- that's more like it! I think you'll agree this is a bit cleaner...case EVENT_WINDOWSIZE SetViewport( 0, 0, w.ClientWidth(), w.ClientHeight() ) Apologies... I should look them up rather than try to remember stuff ;-) No worries, your memory is a lot more effective than my ignorant fumbling. Cheers Brucey! |