我认为我问的是不可能的,但我正在使用Coffeescript来创建一个简单的WebGL库。我看着纹理和着色器,我有以下设置。在我的示例文件中,我有这个:
cgl = new CoffeeGL.App('webgl-canvas')
shader = new CoffeeGL.Shader.Basic(cgl).bind()
cgl.drawLoop = () ->
@gl.clearColor(0.15, 0.15, 0.15, 1.0)
@gl.clear(@gl.COLOR_BUFFER_BIT | @gl.DEPTH_BUFFER_BIT)
@updateCamera(c)
@draw(n0) if n0?
看看Shader。它通过了一个App。这个App类基本上是一个处理上下文的对象。 GL上下文,画布和所有这些都很好地封装在一个类中。由于着色器在其整个生命周期中需要上下文(与已发送到图形卡的纹理和几何图形相同),因此在创建时会为其提供上下文。
这让我觉得不那么优雅。是否可以创建像
这样的东西cgl = new CoffeeGL.App('webgl-canvas')
cgl.init = () ->
shader = new CoffeeGL.Shader.Basic().bind()
cgl.drawLoop = () ->
@gl.clearColor(0.15, 0.15, 0.15, 1.0)
@gl.clear(@gl.COLOR_BUFFER_BIT | @gl.DEPTH_BUFFER_BIT)
@updateCamera(c)
@draw(n0) if n0?
其中上下文实际上是从其调用构造函数的上下文(或者编译或绑定 - 不必是构造函数本身)的事实中获取的
我认为,因为Coffeescript(特别是如果你使用node.js来组合你的脚本)将所有内容包装在一个闭包中,这是不可能的。