From: <jan...@t-...> - 2005-01-30 20:45:06
|
Hello. I can't get a program using multiple GLCanvases working properly. The first canvas in the first (MDIChild)Frame works perfectly fine, but the second GLCanvas that is created (in another (MDIChild)Frame) is just black. Trying out several things with glCanvasSetCurrent didn't help. Could anybody please provide some example program that uses two GLCanvases at the same time? This is quite important to me. Thanks Jan |
From: Patrick S. <mai...@st...> - 2005-01-30 23:58:10
Attachments:
twoGlCanvas.jpg
|
Hi there, The one important thing is, that the gl commands are sent to the actual gldevice context. To set the actual context you have to use glCanvasSetCurrent. So when you want two gl windows just do it and befor drawing in one switch the contex to this one. Here is the modified GlCanvas.hs from the sample directory the should answer all your questions. Cheers Patrick PS @developers: I have updated my cvs and THE ONE glSample is just the (non running) same. Will anyone make a fix on this sample so everybody can have a running one. If nobody will have time to to this I can send a fixed version. Interested?? <Code> module Main where import Data.List ( transpose ) import Graphics.UI.WX import Graphics.UI.WXCore import Graphics.Rendering.OpenGL -- Many code and Type are ambiguous, so we must qualify names. import qualified Graphics.UI.WX as WX import qualified Graphics.Rendering.OpenGL as GL main :: IO() main = start gui defaultWidth = 320 defaultHeight = 200 gui = do f <- frame [ text := "Simple OpenGL" ] -- We just create two glCanvas glCanvas <- glCanvasCreateEx f 0 (Rect 0 0 defaultWidth defaultHeight) 0 "GLCanvas" [GL_RGBA] nullPalette glCanvas2 <- glCanvasCreateEx f 0 (Rect 0 0 defaultWidth defaultHeight) 0 "GLCanvas" [GL_RGBA] nullPalette let glWidgetLayout = fill $ row 5 [widget glCanvas2, widget glCanvas] -- Hint: You have to use the paintRaw event. For switching between the two -- glwindows you can give both of them as parameter WX.set f [ layout := glWidgetLayout , on paintRaw := paintGL glCanvas glCanvas2 ] convWG (WX.Size w h) = (GL.Size (convInt32 w) (convInt32 h)) convInt32 = fromInteger . toInteger paintGL :: GLCanvas a -> GLCanvas a -> DC() -> WX.Rect -> [WX.Rect]-> IO () paintGL gl1 gl2 dc myrect _ = do -- Now we switch to the first one -- and do all init and painting stuff -- Hint: I changed the backgroundcolor for clearance glCanvasSetCurrent gl1 myInit reshape $ convWG $ rectSize myrect -- Or not reshape the size. reshape (GL.Size 320 200) GL.clearColor GL.$= GL.Color4 1 0 0 0 display glCanvasSwapBuffers gl1 -- All the same for the second one glCanvasSetCurrent gl2 myInit reshape $ convWG $ rectSize myrect -- Or not reshape the size. reshape (GL.Size 320 200) GL.clearColor GL.$= GL.Color4 0 2 0 0 display glCanvasSwapBuffers gl2 return () ctrlPoints :: [[GL.Vertex3 GL.GLfloat]] ctrlPoints = [ [ GL.Vertex3 (-1.5) (-1.5) 4.0, GL.Vertex3 (-0.5) (-1.5) 2.0, GL.Vertex3 0.5 (-1.5) (-1.0), GL.Vertex3 1.5 (-1.5) 2.0 ], [ GL.Vertex3 (-1.5) (-0.5) 1.0, GL.Vertex3 (-0.5) (-0.5) 3.0, GL.Vertex3 0.5 (-0.5) 0.0, GL.Vertex3 1.5 (-0.5) (-1.0) ], [ GL.Vertex3 (-1.5) 0.5 4.0, GL.Vertex3 (-0.5) 0.5 0.0, GL.Vertex3 0.5 0.5 3.0, GL.Vertex3 1.5 0.5 4.0 ], [ GL.Vertex3 (-1.5) 1.5 (-2.0), GL.Vertex3 (-0.5) 1.5 (-2.0), GL.Vertex3 0.5 1.5 0.0, GL.Vertex3 1.5 1.5 (-1.0) ]] initlights :: IO () initlights = do GL.lighting GL.$= GL.Enabled GL.light (GL.Light 0) GL.$= GL.Enabled GL.ambient (GL.Light 0) GL.$= GL.Color4 0.2 0.2 0.2 1.0 GL.position (GL.Light 0) GL.$= GL.Vertex4 0 0 2 1 GL.materialDiffuse GL.Front GL.$= GL.Color4 0.6 0.6 0.6 1.0 GL.materialSpecular GL.Front GL.$= GL.Color4 1.0 1.0 1.0 1.0 GL.materialShininess GL.Front GL.$= 50 myInit :: IO () myInit = do -- GL.clearColor GL.$= GL.Color4 1 0 0 0 GL.depthFunc GL.$= Just GL.Less m <- GL.newMap2 (0, 1) (0, 1) (transpose ctrlPoints) GL.map2 GL.$= Just (m :: GLmap2 GL.Vertex3 GL.GLfloat) GL.autoNormal GL.$= GL.Enabled mapGrid2 GL.$= ((20, (0, 1)), (20, (0, 1 :: GL.GLfloat))) initlights -- for lighted version only display = do GL.clear [ GL.ColorBuffer, GL.DepthBuffer ] GL.preservingMatrix $ do GL.rotate (85 :: GL.GLfloat) (GL.Vector3 1 1 1) evalMesh2 Fill (0, 20) (0, 20) GL.flush reshape mysize@(GL.Size w h) = do GL.viewport GL.$= (GL.Position 0 0, mysize) GL.matrixMode GL.$= GL.Projection GL.loadIdentity let wf = fromIntegral w hf = fromIntegral h if w <= h then GL.ortho (-4.0) 4.0 (-4.0*hf/wf) (4.0*hf/wf) (-4.0) 4.0 else GL.ortho (-4.0*wf/hf) (4.0*wf/hf) (-4.0) 4.0 (-4.0) 4.0 GL.matrixMode GL.$= GL.Modelview 0 GL.loadIdentity </Code> On Sunday 30 January 2005 21:44, Jan Rochel wrote: > Hello. > > I can't get a program using multiple GLCanvases working properly. > The first canvas in the first (MDIChild)Frame works perfectly fine, > but the second GLCanvas that is created (in another (MDIChild)Frame) is > just black. Trying out several things with glCanvasSetCurrent didn't > help. Could anybody please provide some example program that uses two > GLCanvases at the same time? This is quite important to me. > > Thanks > Jan > > > ------------------------------------------------------- > This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting > Tool for open source databases. Create drag-&-drop reports. Save time > by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc. > Download a FREE copy at http://www.intelliview.com/go/osdn_nl > _______________________________________________ > wxhaskell-users mailing list > wxh...@li... > https://lists.sourceforge.net/lists/listinfo/wxhaskell-users |
From: Daan L. <da...@cs...> - 2005-02-07 10:39:18
|
Patrick Scheibe wrote: > PS @developers: I have updated my cvs and THE ONE glSample is just the (non > running) same. Will anyone make a fix on this sample so everybody can have a > running one. If nobody will have time to to this I can send a fixed version. > Interested?? Hi Patrick, Please send me your GL samples and I will include them! I don't know anything about openGL and have never gotten it to work on my system, so all help is highly appreciated. I am currently gearing up for the wxHaskell 0.9 release this week (?) (with great printer support :-) so if anyone has good samples or suggestions, please tell me so. -- Daan. > > > <Code> > module Main > where > > import Data.List ( transpose ) > import Graphics.UI.WX > import Graphics.UI.WXCore > import Graphics.Rendering.OpenGL > -- Many code and Type are ambiguous, so we must qualify names. > import qualified Graphics.UI.WX as WX > import qualified Graphics.Rendering.OpenGL as GL > > main :: IO() > main = start gui > > > defaultWidth = 320 > defaultHeight = 200 > > gui = do > f <- frame [ text := "Simple OpenGL" ] > > -- We just create two glCanvas > > glCanvas <- glCanvasCreateEx f 0 (Rect 0 0 defaultWidth defaultHeight) > 0 "GLCanvas" [GL_RGBA] nullPalette > glCanvas2 <- glCanvasCreateEx f 0 (Rect 0 0 defaultWidth defaultHeight) > 0 "GLCanvas" [GL_RGBA] nullPalette > > let glWidgetLayout = fill $ row 5 [widget glCanvas2, widget glCanvas] > > -- Hint: You have to use the paintRaw event. For switching between the two > -- glwindows you can give both of them as parameter > WX.set f [ layout := glWidgetLayout > , on paintRaw := paintGL glCanvas glCanvas2 > ] > > > convWG (WX.Size w h) = (GL.Size (convInt32 w) (convInt32 h)) > convInt32 = fromInteger . toInteger > > paintGL :: GLCanvas a -> GLCanvas a -> DC() -> WX.Rect -> [WX.Rect]-> IO () > paintGL gl1 gl2 dc myrect _ = do > > -- Now we switch to the first one > -- and do all init and painting stuff > -- Hint: I changed the backgroundcolor for clearance > > glCanvasSetCurrent gl1 > myInit > reshape $ convWG $ rectSize myrect > -- Or not reshape the size. > reshape (GL.Size 320 200) > GL.clearColor GL.$= GL.Color4 1 0 0 0 > display > glCanvasSwapBuffers gl1 > > -- All the same for the second one > glCanvasSetCurrent gl2 > myInit > reshape $ convWG $ rectSize myrect > -- Or not reshape the size. > reshape (GL.Size 320 200) > GL.clearColor GL.$= GL.Color4 0 2 0 0 > display > glCanvasSwapBuffers gl2 > return () > > > ctrlPoints :: [[GL.Vertex3 GL.GLfloat]] > ctrlPoints = [ > [ GL.Vertex3 (-1.5) (-1.5) 4.0, GL.Vertex3 (-0.5) (-1.5) 2.0, > GL.Vertex3 0.5 (-1.5) (-1.0), GL.Vertex3 1.5 (-1.5) 2.0 ], > [ GL.Vertex3 (-1.5) (-0.5) 1.0, GL.Vertex3 (-0.5) (-0.5) 3.0, > GL.Vertex3 0.5 (-0.5) 0.0, GL.Vertex3 1.5 (-0.5) (-1.0) ], > [ GL.Vertex3 (-1.5) 0.5 4.0, GL.Vertex3 (-0.5) 0.5 0.0, > GL.Vertex3 0.5 0.5 3.0, GL.Vertex3 1.5 0.5 4.0 ], > [ GL.Vertex3 (-1.5) 1.5 (-2.0), GL.Vertex3 (-0.5) 1.5 (-2.0), > GL.Vertex3 0.5 1.5 0.0, GL.Vertex3 1.5 1.5 (-1.0) ]] > > initlights :: IO () > initlights = do > GL.lighting GL.$= GL.Enabled > GL.light (GL.Light 0) GL.$= GL.Enabled > > GL.ambient (GL.Light 0) GL.$= GL.Color4 0.2 0.2 0.2 1.0 > GL.position (GL.Light 0) GL.$= GL.Vertex4 0 0 2 1 > > GL.materialDiffuse GL.Front GL.$= GL.Color4 0.6 0.6 0.6 1.0 > GL.materialSpecular GL.Front GL.$= GL.Color4 1.0 1.0 1.0 1.0 > GL.materialShininess GL.Front GL.$= 50 > > myInit :: IO () > myInit = do > -- GL.clearColor GL.$= GL.Color4 1 0 0 0 > GL.depthFunc GL.$= Just GL.Less > m <- GL.newMap2 (0, 1) (0, 1) (transpose ctrlPoints) > GL.map2 GL.$= Just (m :: GLmap2 GL.Vertex3 GL.GLfloat) > GL.autoNormal GL.$= GL.Enabled > mapGrid2 GL.$= ((20, (0, 1)), (20, (0, 1 :: GL.GLfloat))) > initlights -- for lighted version only > > display = do > GL.clear [ GL.ColorBuffer, GL.DepthBuffer ] > GL.preservingMatrix $ do > GL.rotate (85 :: GL.GLfloat) (GL.Vector3 1 1 1) > evalMesh2 Fill (0, 20) (0, 20) > GL.flush > > reshape mysize@(GL.Size w h) = do > GL.viewport GL.$= (GL.Position 0 0, mysize) > GL.matrixMode GL.$= GL.Projection > GL.loadIdentity > let wf = fromIntegral w > hf = fromIntegral h > if w <= h > then GL.ortho (-4.0) 4.0 (-4.0*hf/wf) (4.0*hf/wf) (-4.0) 4.0 > else GL.ortho (-4.0*wf/hf) (4.0*wf/hf) (-4.0) 4.0 (-4.0) 4.0 > GL.matrixMode GL.$= GL.Modelview 0 > GL.loadIdentity > > > > </Code> > > > > On Sunday 30 January 2005 21:44, Jan Rochel wrote: > >>Hello. >> >>I can't get a program using multiple GLCanvases working properly. >>The first canvas in the first (MDIChild)Frame works perfectly fine, >>but the second GLCanvas that is created (in another (MDIChild)Frame) is >>just black. Trying out several things with glCanvasSetCurrent didn't >>help. Could anybody please provide some example program that uses two >>GLCanvases at the same time? This is quite important to me. >> >>Thanks >>Jan >> >> >>------------------------------------------------------- >>This SF.Net email is sponsored by: IntelliVIEW -- Interactive Reporting >>Tool for open source databases. Create drag-&-drop reports. Save time >>by over 75%! Publish reports on the web. Export to DOC, XLS, RTF, etc. >>Download a FREE copy at http://www.intelliview.com/go/osdn_nl >>_______________________________________________ >>wxhaskell-users mailing list >>wxh...@li... >>https://lists.sourceforge.net/lists/listinfo/wxhaskell-users >> >> >> ------------------------------------------------------------------------ >> |
From: Claus R. <cla...@ta...> - 2005-02-08 13:41:21
|
> I am currently gearing up for the wxHaskell 0.9 release this week (?) > (with great printer support :-) so if anyone has good samples or > suggestions, please tell me so. I had the nagging feeling that printing was not the only outstanding issue, but a quick scan through my inbox only brought up one other critical point (assuming that printer support refers to Postscript device contexts), namely the instability of Graphics.UI.WXCore.Process - any progress on this front? Cheers, Claus ps is the sourceforge bug tracker maintained/up to date? it seems to list mostly bugs in older releases, but neither printing nor Process problems. |
From: Daan L. <da...@cs...> - 2005-02-08 14:59:20
|
Claus Reinke wrote: > I had the nagging feeling that printing was not the only outstanding > issue, but a quick scan through my inbox only brought up one other > critical point (assuming that printer support refers to Postscript device > contexts), namely the instability of Graphics.UI.WXCore.Process - > any progress on this front? Yes!! The cvs contains a brand new process handler which seems much more stable. I am currently testing on macOSX and Linux boxes. Since there will be a new release of Helium sometime soon with a wxHint interface, we desparetely needed a better process handler here :-) However, the printing support refers only at the moment to just normal printing. I have not studied Postscript devices yet... Isn't it always possible to just select a postscript printer and print to file? Or do you have something special in mind? -- Daan. > ps is the sourceforge bug tracker maintained/up to date? it seems > to list mostly bugs in older releases, but neither printing nor > Process problems. Ehm, no it is not. I do not get emails from it and I don't quite understand how to manage it... I'll try to look into that. > > > |
From: Claus R. <cla...@ta...> - 2005-02-08 16:07:06
|
> Yes!! The cvs contains a brand new process handler which seems > much more stable. I am currently testing on macOSX and Linux boxes. > Since there will be a new release of Helium sometime soon with a > wxHint interface, we desparetely needed a better process handler here :-) Great!-) instable Haskell programs are always somewhat embarrasing, even if one can blame external sources. > However, the printing support refers only at the moment to just normal > printing. I have not studied Postscript devices yet... Isn't it > always possible to just select a postscript printer and print to file? > Or do you have something special in mind? perhaps I'm misunderstanding something here. It's been a while since I looked into this, but when I wanted a way to convert the graphs I draw on wxWidgets to print in scalable form, the way to go seemed to be to create a Postscript context and pass that to the normal repaint function, so that it would draw in Postscript commands instead of on the screen. Seemed almost too easy, only that I couldn't find a way to create such things in wxHaskell. I don't have a Postscript printer, I just want the eps in vector form, not bitmap, for embedding in papers and the like. How does the printer support you're talking about work, then? Claus > > ps is the sourceforge bug tracker maintained/up to date? it seems > > to list mostly bugs in older releases, but neither printing nor > > Process problems. > > Ehm, no it is not. I do not get emails from it and I don't quite > understand how to manage it... I'll try to look into that. :-) |
From: Daan L. <da...@cs...> - 2005-02-08 19:10:14
|
>>However, the printing support refers only at the moment to just normal >>printing. I have not studied Postscript devices yet... Isn't it >>always possible to just select a postscript printer and print to file? >>Or do you have something special in mind? > > > perhaps I'm misunderstanding something here. It's been a while since > I looked into this, but when I wanted a way to convert the graphs I > draw on wxWidgets to print in scalable form, the way to go seemed to > be to create a Postscript context and pass that to the normal repaint > function, so that it would draw in Postscript commands instead of on > the screen. Seemed almost too easy, only that I couldn't find a way to > create such things in wxHaskell. I added support for drawing onto printer device contexts. This means that you have printer support -- a user gets a printer dialog etc. and can print, while the haskell code just draws to a DC -- either the screen or a printer. On windows, I can simply select a postscript printer and print to a file to get postscript output. However, I have not added specific support for getting postscript output directly, even though I can vagelue remember that wxWidgets has such support -- if I find time, I'll look into it, but I am hoping that also on unix, one can emulate this behaviour by selecting a postscript printer and printing to file. -- Daan. |
From: Georg M. <mai...@st...> - 2005-02-08 19:41:17
|
On Tue, 08 Feb 2005 20:10:08 +0100, Daan Leijen <da...@cs...> wrote: >>> However, the printing support refers only at the moment to just norma= l >>> printing. I have not studied Postscript devices yet... Isn't it >>> always possible to just select a postscript printer and print to file= ? >>> Or do you have something special in mind? >> >> >> perhaps I'm misunderstanding something here. It's been a while since >> I looked into this, but when I wanted a way to convert the graphs I >> draw on wxWidgets to print in scalable form, the way to go seemed to >> be to create a Postscript context and pass that to the normal repaint >> function, so that it would draw in Postscript commands instead of on >> the screen. Seemed almost too easy, only that I couldn't find a way to >> create such things in wxHaskell. > > I added support for drawing onto printer device contexts. This means > that you have printer support -- a user gets a printer dialog etc. and > can print, while the haskell code just draws to a DC -- either the > screen or a printer. On windows, I can simply select a postscript > printer and print to a file to get postscript output. > > However, I have not added specific support for getting postscript > output directly, even though I can vagelue remember that wxWidgets > has such support -- if I find time, I'll look into it, but I am > hoping that also on unix, one can emulate this behaviour by selecting > a postscript printer and printing to file. On unix it is even more natural to print to a file in postscript format. = However, the question is how the content is represented for printing. I'a= m not sure whether the content of the DC in wx is sent to the printer as = a bitmap or as vector graphics. The latter would be certainly prefered fo= r ps-files. Georg |