2017-01-08 10 views
1

シンプルなWebGLのサンプルをTranscryptに移植しました(下記のコードを参照)。 1つの詳細は別として、それはFirefoxで次のエラーを与えるようgl.clear()呼び出しが何らかの形で、適切に翻訳されていないように思える:Webgl clear()issue

TypeError: gl.py_clear is not a function 

行をコメントアウト例の作業を行います。

のPython:

from org.transcrypt.stubs.browser import document, __new__ 


def make_shader(gl, vs, fs): 

    prog = gl.createProgram() 

    def add_shader(type_, source): 
     s = gl.createShader(gl.VERTEX_SHADER 
          if (type_ == 'vertex') 
          else gl.FRAGMENT_SHADER) 
     gl.shaderSource(s, source) 
     gl.compileShader(s) 
     if not gl.getShaderParameter(s, gl.COMPILE_STATUS): 
      return 
     gl.attachShader(prog, s) 

    add_shader('vertex', vs) 
    add_shader('fragment', fs) 
    gl.linkProgram(prog) 
    if not gl.getProgramParameter(prog, gl.LINK_STATUS): 
     raise RuntimeError("Could not link the shader program!") 

    return prog 


def attribute_set_floats(gl, prog, attr_name, rsize, arr): 
    gl.bindBuffer(gl.ARRAY_BUFFER, gl.createBuffer()) 
    gl.bufferData(gl.ARRAY_BUFFER, __new__(Float32Array(arr)), 
        gl.STATIC_DRAW) 
    attr = gl.getAttribLocation(prog, attr_name) 
    gl.enableVertexAttribArray(attr) 
    gl.vertexAttribPointer(attr, rsize, gl.FLOAT, False, 0, 0) 


def draw(): 
    gl = document.getElementById("webgl").getContext("webgl") 
    gl.clearColor(0.8, 0.8, 0.8, 1.0) 
    gl.clear(gl.COLOR_BUFFER_BIT) # <- error! 

    prog = make_shader(gl, 
         ("attribute vec3 pos;" 
         "void main() {" 
         " gl_Position = vec4(pos, 2.0);" 
         "}"), 
         ("void main() {" 
         " gl_FragColor = vec4(0.5, 0.5, 1.0, 1.0);" 
         "}")) 

    gl.useProgram(prog) 

    attribute_set_floats(gl, prog, "pos", 3, [ 
     -1, 0, 0, 
     0, 1, 0, 
     0, -1, 0, 
     1, 0, 0 
    ]) 

    gl.drawArrays(gl.TRIANGLE_STRIP, 0, 4) 


draw() 

HTML:

html 
<!DOCTYPE html> 
<html> 
    <head> 
    <meta charset="utf-8" /> 
    <title>Example</title> 
    </head> 
    <body> 
     <canvas id="webgl" width="640" height="480"></canvas> 
     <script type="text/javascript" src="__javascript__/webgl.js"> 
     </script> 
    </body> 
</html> 

答えて

0

それ以外の場合は、特別な治療を受けPython辞書 'クリア' の方法、と競合するので、 'クリア' の名前は、エイリアス名ですTranscryptによって任意の辞書コンテンツを許可します。

(Transcryptは、Pythonは動的型付けされているので、オブジェクトまたは変数の型を予測する手段がない。)

あなたの代わりに「js_clear」を使用している場合は、それが動作するはずですので、:

  • gl.js_clear(gl.COLOR_BUFFER_BIT)

二つの選択肢、私の見解では好まれるべきではなく、両方:

すべての定義済みのエイリアスを使用

  • 使用__pragma__ ('js', '{}', 'gl.js_clear(gl.COLOR_BUFFER_BIT)')
  • はに記載されています。