将内置插件强加给他们的GL等价物

时间:2012-08-28 21:11:17

标签: opengl haskell types casting functional-programming

我刚刚在Haskell写了一篇快速的Conway的生命游戏来练习,虽然我现在应该为它制作动画。

我想使用GLUT + OpenGL和几秒钟谷歌搜索,我有一个例子,准备开火。示例中的不同之处在于它定义了一个函数,该函数将某些点返回为myPoints :: [(GLfloat,GLfloat,GLfloat)],而我将Coord定义为data Coord = Coord {x :: Int, y :: Int} deriving (Show, Eq)。这一切都很好,整洁,游戏似乎以简单的形式工作,但是当我尝试绘制它时会出现问题。即我应该将点数传递给渲染器的部分: renderPrimitive Points $ mapM_ (\(x, y, z)->vertex$Vertex3 x y z) myPoints 如果myPoints包含GLfloat类型的值,但renderPrimitive Points $ mapM_ (\(Coord x y)->vertex$Vertex2 x y) myCoords抱怨,那就没关系了:

No instance for (VertexComponent Int)
  arising from a use of `vertex'
Possible fix: add an instance declaration for (VertexComponent Int)

我尝试了fromIntegral x之类的内容并添加了类型签名:: GLfloatGLint,但似乎总是抱怨它不能采用该类型或者它不能进入​​Int - > GLfloat /闪烁。

我的问题是,如何让我的Coord类型与OpenGL类型一起玩?我在Web上找不到任何提示,我宁愿不做Coord = Coord {x :: GLfloat, y :: GLfloat},原因很简单,因为很多其他代码都不能很好地与GLfloats一起使用,因为它们都期待Num或{ {1}}等等。

下面是说明问题并且我希望能够编译的最小情况:

Int

1 个答案:

答案 0 :(得分:2)

在与我家中的另一个程序员打猎一段时间之后,我们找到了一段代码,让我们从一个int中创建GLfloat,即fromIntegral x :: GLfloat将产生所需的结果。同样,fromRational可用于Float -> GLfloat