func setupConnection(gl *webgl.Context) { document := js.Global.Get("document") location := document.Get("location") ws, err := websocket.New(fmt.Sprintf("ws://%s/render", location.Get("host"))) assert(err) renderer := make(chan struct{}) onOpen := func(ev *js.Object) { setup := setupMessage{ Resolution: imgCmResolution, ClearColor: [4]byte{127, 127, 127, 255}, } msg, err := json.Marshal(setup) assert(err) assert(ws.Send(string(msg))) go updateCamera(ws, gl, renderer) } onMessage := func(ev *js.Object) { face := frameId % 6 fmt.Println("Received face:", face) data := js.Global.Get("Uint8Array").New(ev.Get("data")) gl.Call("texImage2D", gl.TEXTURE_CUBE_MAP_POSITIVE_X+face, 0, gl.RGBA, imgCmResolution, imgCmResolution, 0, gl.RGBA, gl.UNSIGNED_BYTE, data) frameId++ select { case renderer <- struct{}{}: default: } } ws.BinaryType = "arraybuffer" ws.AddEventListener("open", false, onOpen) ws.AddEventListener("message", false, onMessage) }
func setupTextures(gl *webgl.Context, program *js.Object) { gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_CUBE_MAP, gl.CreateTexture()) for i := 0; i < 6; i++ { gl.Call("texImage2D", gl.TEXTURE_CUBE_MAP_POSITIVE_X+i, 0, gl.RGBA, imgCmResolution, imgCmResolution, 0, gl.RGBA, gl.UNSIGNED_BYTE, nil) } gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR) /* gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.NEAREST) */ gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.Uniform1i(gl.GetUniformLocation(program, "s_texture"), 0) }