Как использовать OpenGL в Haskell с несколькими окнами? - PullRequest
3 голосов
/ 01 февраля 2011

Существует ли простой полный пример кода, использующий какой-либо набор инструментов GUI (который будет работать как в Linux, так и в Windows) для одновременного открытия нескольких окон OpenGL?А как справиться со своими событиями и тому подобное по отдельности конечно.Я попробовал это наивно, и он вылетает.

Я получил полный рабочий пример исходного кода от кого-то за пределами stackoverflow.Я вставляю это здесь для всех.

module Main where

import Graphics.UI.GLUT
import System.Exit (exitWith, ExitCode(ExitSuccess))

reshape :: ReshapeCallback
reshape size = do
   viewport $= (Position 0 0, size)
   matrixMode $= Projection
   loadIdentity
   frustum (-1) 1 (-1) 1 1.5 20
   matrixMode $= Modelview 0

keyboard :: KeyboardMouseCallback
keyboard (Char '\27') Down _ _ = exitWith ExitSuccess
keyboard _            _    _ _ = return ()

renderCube :: Color3 GLfloat -> IO ()
renderCube c = do
   clear [ ColorBuffer ]

   let color3f = color :: Color3 GLfloat -> IO ()
       scalef = scale :: GLfloat -> GLfloat -> GLfloat -> IO ()

   color3f c
   loadIdentity
   lookAt (Vertex3 0 0 5) (Vertex3 0 0 0) (Vector3 0 1 0)
   scalef 1 2 1
   renderObject Wireframe (Cube 1)
   flush

displayR :: DisplayCallback
displayR = renderCube (Color3 1 0 0)

displayB :: DisplayCallback
displayB = renderCube (Color3 0 0 1)

createWindowWithDisplayFunc :: String -> Position -> DisplayCallback -> IO Window
createWindowWithDisplayFunc name pos display = do
   win <- createWindow name
   windowPosition $= pos
   clearColor $= Color4 0 0 0 0
   shadeModel $= Flat
   displayCallback $= display
   reshapeCallback $= Just reshape
   keyboardMouseCallback $= Just keyboard
   return win

main = do
   getArgsAndInitialize
   initialDisplayMode $= [ SingleBuffered, RGBMode ]
   initialWindowSize $= Size 100 100
   initialWindowPosition $= Position 100 100

   createWindowWithDisplayFunc "R" (Position 10 10) displayR
   createWindowWithDisplayFunc "B" (Position 110 10) displayB

   mainLoop

Ответы [ 2 ]

3 голосов
/ 05 февраля 2011

GLUT, конечно.

Домашняя страница GLUT сообщает

The toolkit supports:
- Multiple windows for OpenGL rendering
- Callback driven event processing
- Sophisticated input devices
- An 'idle' routine and timers
- A simple, cascading pop-up menu facility
- Utility routines to generate various solid and wire frame objects
- Support for bitmap and stroke fonts
- Miscellaneous window management functions

Следовательно, вы можете использовать GLUT для управления несколькими окнами (я использовал один раз). Здесь - это учебник для того, что вам нужно.

Я также нашел эту статью, на которую вы можете посмотреть немного, поскольку она специфична для Haskell.

1 голос
/ 01 февраля 2011

Поддержка OpenGL в wxWidgets использует WxGLCanvas класс , который равен в wxcore как GLCanvas. К сожалению, , похоже, не существует в пакете wx. Вероятно, вы можете реализовать свой собственный элемент управления для GLCanvas без особых проблем, используя в качестве справки другие элементы управления в пакете wx и примеры использования C ++.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...