将Netwire网络连接到OpenGL / GLUT回调

时间:2012-11-17 01:53:54

标签: haskell glut frp

作为一项实验,我已经设置了一组连接到电机的模拟齿轮,并使用OpenGL / GLUT进行渲染。目前,有线网络的唯一输入是Time。我想用键盘来控制电机的速度变化。我还想将物理时间步长从帧速率中分离出来,如Fix your Timestep!中所述。

这意味着我需要使用三种不同类型的输入从三个不同的GLUT回调(keyboardMouseCallbackidleCallbackdisplayCallback)运行Wire网络。我不清楚如何将Netwire与GLUT回调集成。

2 个答案:

答案 0 :(得分:3)

GLUT对于需要控制主循环(如Netwire)的框架有点敌视。这是可能的,但你可能不得不使用IORef或类似的东西。我所知道的Netwire最友好的OpenGL管理器是SDL,但当然你也可以试试Nicol的GLFW建议。否则,您确实必须从多个事件处理程序中切换线路。

为了处理实际的键盘输入,我建议你将事件信息添加到你正在使用的任何底层monad中(读者monad可能是最好的解决方案)。然后实现一个keyDown导线,只要按下给定的键就会生成该导线:

keyDown :: (Monoid e) => Key -> Wire e (Reader GuiState) a a

现在你可以做一些简单的事情:

position = integral_ 0 . speed
    where
    direction key dir = dir . keyDown key <|> 0
    speed = direction Right 1 + direction Left (-1)

答案 1 :(得分:1)

你考虑过......不这样做吗?

没有法律规定你必须使用(免费)GLUT。 GLFW(几乎)有能力,它允许您根据需要控制渲染循环。这是一个基于轮询的API,因此任何回调只会在您需要时才会发生。