func (ms *ManaSource) Draw(local *LocalData, zoom float64, dx float64, dy float64) { if local.nodeTextureData == nil { // gl.Enable(gl.TEXTURE_2D) local.nodeTextureData = make([]byte, ms.options.NumNodeRows*ms.options.NumNodeCols*3) gl.GenTextures(1, &local.nodeTextureId) gl.BindTexture(gl.TEXTURE_2D, local.nodeTextureId) gl.TexEnvf(gl.TEXTURE_ENV, gl.TEXTURE_ENV_MODE, gl.MODULATE) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) gl.TexImage2D( gl.TEXTURE_2D, 0, gl.RGB, gl.Sizei(ms.options.NumNodeRows), gl.Sizei(ms.options.NumNodeCols), 0, gl.RGB, gl.UNSIGNED_BYTE, gl.Pointer(&local.nodeTextureData[0])) } for i := range ms.rawNodes { for c := 0; c < 3; c++ { color_frac := ms.rawNodes[i].Mana[c] * 1.0 / ms.options.NodeMagnitude color_range := float64(ms.options.MaxNodeBrightness - ms.options.MinNodeBrightness) local.nodeTextureData[i*3+c] = byte( color_frac*color_range + float64(ms.options.MinNodeBrightness)) } } gl.Enable(gl.TEXTURE_2D) //gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, local.nodeTextureId) gl.TexSubImage2D( gl.TEXTURE_2D, 0, 0, 0, gl.Sizei(ms.options.NumNodeRows), gl.Sizei(ms.options.NumNodeCols), gl.RGB, gl.UNSIGNED_BYTE, gl.Pointer(&local.nodeTextureData[0])) base.EnableShader("nodes") base.SetUniformI("nodes", "width", ms.options.NumNodeRows*3) base.SetUniformI("nodes", "height", ms.options.NumNodeCols*3) base.SetUniformI("nodes", "drains", 1) base.SetUniformI("nodes", "tex0", 0) base.SetUniformI("nodes", "tex1", 1) base.SetUniformF("nodes", "zoom", float32(zoom)) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, local.nodeTextureId) // I have no idea why this value for move works, but it does. So, hooray. move := (dx - dy) / 2 texture.RenderAdvanced(move, -move, dy, dx, 3.1415926535/2, true) base.EnableShader("") gl.Disable(gl.TEXTURE_2D) }
func makeErrorTexture() { gl.Enable(gl.TEXTURE_2D) gl.GenTextures(1, (*gl.Uint)(&error_texture)) gl.BindTexture(gl.TEXTURE_2D, error_texture) gl.TexEnvf(gl.TEXTURE_ENV, gl.TEXTURE_ENV_MODE, gl.MODULATE) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) pink := []byte{255, 0, 255, 255} gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.BYTE, gl.Pointer(&pink[0])) }
func (m *Manager) LoadSprite(path string) (*Sprite, error) { // We can't run this during an init() function because it will get queued to // run before the opengl context is created, so we just check here and run // it if we haven't run it before. gen_tex_once.Do(func() { render.Queue(func() { gl.Enable(gl.TEXTURE_2D) gl.GenTextures(1, &error_texture) gl.BindTexture(gl.TEXTURE_2D, error_texture) gl.TexEnvf(gl.TEXTURE_ENV, gl.TEXTURE_ENV_MODE, gl.MODULATE) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) pink := []byte{255, 0, 255, 255} gl.TexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, 1, 1, 0, gl.RGBA, gl.UNSIGNED_INT, gl.Pointer(&pink[0])) }) }) path = filepath.Clean(path) err := m.loadSharedSprite(path) if err != nil { return nil, err } var s Sprite m.mutex.Lock() s.shared = m.shared[path] m.mutex.Unlock() s.anim_node = s.shared.anim_start s.state_node = s.shared.state_start return &s, nil }
func (s *sheet) makeTexture(pixer <-chan []byte) { gl.Enable(gl.TEXTURE_2D) gl.GenTextures(1, &s.texture) gl.BindTexture(gl.TEXTURE_2D, s.texture) gl.TexEnvf(gl.TEXTURE_ENV, gl.TEXTURE_ENV_MODE, gl.MODULATE) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) data := <-pixer gl.TexImage2D( gl.TEXTURE_2D, 0, gl.RGBA, gl.Sizei(s.dx), gl.Sizei(s.dy), 0, gl.RGBA, gl.UNSIGNED_INT, gl.Pointer(&data[0])) memory.FreeBlock(data) }
// Sets up anything that wouldn't have been loaded from disk, including // all opengl data, and sets up finalizers for that data. func (d *Dictionary) setupGlStuff() { d.dlists = make(map[string]uint32) d.strs = make(map[string]strBuffer) d.pars = make(map[string]strBuffer) // TODO: This finalizer is untested runtime.SetFinalizer(d, func(d *Dictionary) { render.Queue(func() { for _, v := range d.dlists { gl.DeleteLists(gl.Uint(v), 1) } }) }) render.Queue(func() { gl.Enable(gl.TEXTURE_2D) gl.GenTextures(1, (*gl.Uint)(&d.texture)) gl.BindTexture(gl.TEXTURE_2D, gl.Uint(d.texture)) gl.PixelStorei(gl.UNPACK_ALIGNMENT, 1) gl.TexEnvf(gl.TEXTURE_ENV, gl.TEXTURE_ENV_MODE, gl.MODULATE) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) gl.TexImage2D( gl.TEXTURE_2D, 0, gl.ALPHA, gl.Sizei(d.data.Dx), gl.Sizei(d.data.Dy), 0, gl.ALPHA, gl.UNSIGNED_BYTE, gl.Pointer(&d.data.Pix[0])) gl.Disable(gl.TEXTURE_2D) }) }
func (ms *ManaSource) Draw(gw *GameWindow, dx float64, dy float64) { if gw.nodeTextureData == nil { // gl.Enable(gl.TEXTURE_2D) gw.nodeTextureData = make([]byte, ms.options.NumNodeRows*ms.options.NumNodeCols*3) gl.GenTextures(1, &gw.nodeTextureId) gl.BindTexture(gl.TEXTURE_2D, gw.nodeTextureId) gl.TexEnvf(gl.TEXTURE_ENV, gl.TEXTURE_ENV_MODE, gl.MODULATE) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) gl.TexImage2D( gl.TEXTURE_2D, 0, gl.RGB, gl.Sizei(ms.options.NumNodeCols), gl.Sizei(ms.options.NumNodeRows), 0, gl.RGB, gl.UNSIGNED_BYTE, gl.Pointer(&gw.nodeTextureData[0])) // gl.ActiveTexture(gl.TEXTURE1) gl.GenTextures(1, &gw.nodeWarpingTexture) gl.BindTexture(gl.TEXTURE_1D, gw.nodeWarpingTexture) gl.TexEnvf(gl.TEXTURE_ENV, gl.TEXTURE_ENV_MODE, gl.MODULATE) gl.TexParameterf(gl.TEXTURE_1D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_1D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameterf(gl.TEXTURE_1D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.TexParameterf(gl.TEXTURE_1D, gl.TEXTURE_WRAP_T, gl.REPEAT) gw.nodeWarpingData = make([]byte, 4*10) gl.TexImage1D( gl.TEXTURE_1D, 0, gl.RGBA, gl.Sizei(len(gw.nodeWarpingData)/4), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Pointer(&gw.nodeWarpingData[0])) } for x := range ms.nodes { for y, node := range ms.nodes[x] { pos := 3 * (y*ms.options.NumNodeCols + x) for c := 0; c < 3; c++ { color_frac := node.Mana[c] * 1.0 / ms.options.NodeMagnitude color_range := float64(ms.options.MaxNodeBrightness - ms.options.MinNodeBrightness) gw.nodeTextureData[pos+c] = byte( color_frac*color_range + float64(ms.options.MinNodeBrightness)) } } } gl.Enable(gl.TEXTURE_1D) gl.Enable(gl.TEXTURE_2D) //gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, gw.nodeTextureId) gl.TexSubImage2D( gl.TEXTURE_2D, 0, 0, 0, gl.Sizei(ms.options.NumNodeCols), gl.Sizei(ms.options.NumNodeRows), gl.RGB, gl.UNSIGNED_BYTE, gl.Pointer(&gw.nodeTextureData[0])) gl.ActiveTexture(gl.TEXTURE1) for i, ent := range gw.game.Ents { p := ent.Pos() gw.nodeWarpingData[3*i+0] = byte(p.X / float64(gw.game.Dx) * 255) gw.nodeWarpingData[3*i+1] = -byte(p.Y / float64(gw.game.Dy) * 255) gw.nodeWarpingData[3*i+2] = 255 } gl.TexImage1D( gl.TEXTURE_1D, 0, gl.RGBA, gl.Sizei(len(gw.nodeWarpingData)/4), 0, gl.RGBA, gl.UNSIGNED_BYTE, gl.Pointer(&gw.nodeWarpingData[0])) base.EnableShader("nodes") base.SetUniformI("nodes", "width", ms.options.NumNodeCols) base.SetUniformI("nodes", "height", ms.options.NumNodeRows) base.SetUniformI("nodes", "drains", 1) base.SetUniformI("nodes", "tex0", 0) base.SetUniformI("nodes", "tex1", 1) gl.ActiveTexture(gl.TEXTURE1) gl.BindTexture(gl.TEXTURE_1D, gw.nodeWarpingTexture) gl.ActiveTexture(gl.TEXTURE0) gl.BindTexture(gl.TEXTURE_2D, gw.nodeTextureId) texture.Render(0, dy, dx, -dy) base.EnableShader("") gl.Disable(gl.TEXTURE_2D) gl.Disable(gl.TEXTURE_1D) }