func LoadTexture2D(filename string) { surface := loadSdlSurface(filename) defer surface.Free() W, H := int(surface.W), int(surface.H) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA8, W, H, 0, gl.RGBA, gl.UNSIGNED_BYTE, surface.Pixels()) }
func (this *FrameBuffer) Resize(width, height int) { //this.Framebuffer.Bind() // this.RenderTexture := gl.GenTexture() this.RenderTexture.Bind(gl.TEXTURE_RECTANGLE) gl.TexImage2D(gl.TEXTURE_RECTANGLE, 0, gl.RGBA, width, height, 0, gl.RGBA, gl.UNSIGNED_BYTE, nil) gl.TexParameteri(gl.TEXTURE_RECTANGLE, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_RECTANGLE, gl.TEXTURE_MIN_FILTER, gl.NEAREST) this.RenderTexture.Unbind(gl.TEXTURE_RECTANGLE) // depthStencilTexture := gl.GenTexture() this.DepthTexture.Bind(gl.TEXTURE_RECTANGLE) gl.TexImage2D(gl.TEXTURE_RECTANGLE, 0, gl.DEPTH24_STENCIL8, width, height, 0, gl.DEPTH_STENCIL, gl.UNSIGNED_INT_24_8, nil) gl.TexParameteri(gl.TEXTURE_RECTANGLE, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_RECTANGLE, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.TexParameteri(gl.TEXTURE_RECTANGLE, gl.TEXTURE_WRAP_S, gl.CLAMP) gl.TexParameteri(gl.TEXTURE_RECTANGLE, gl.TEXTURE_WRAP_T, gl.CLAMP) this.DepthTexture.Unbind(gl.TEXTURE_RECTANGLE) }
func LoadTextureCube(filename string) { surface := loadSdlSurface(filename) defer surface.Free() W := surface.W / 4 H := surface.H / 3 top_rect := sdl.Rect{W, 0 * H, W, H} bottom_rect := sdl.Rect{W, 2 * H, W, H} left_rect := sdl.Rect{0 * W, H, W, H} front_rect := sdl.Rect{1 * W, H, W, H} right_rect := sdl.Rect{2 * W, H, W, H} back_rect := sdl.Rect{3 * W, H, W, H} bounds := sdl.Rect{0, 0, W, H} imageData, _ := sdl.CreateRGBSurface(0, W, H, 32, surface.Format.Rmask, surface.Format.Gmask, surface.Format.Bmask, surface.Format.Amask) surface.Blit(&top_rect, imageData, &bounds) gl.TexImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Y, 0, gl.RGBA, int(W), int(H), 0, gl.RGBA, gl.UNSIGNED_BYTE, imageData.Pixels()) surface.Blit(&bottom_rect, imageData, &bounds) gl.TexImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Y, 0, gl.RGBA, int(W), int(H), 0, gl.RGBA, gl.UNSIGNED_BYTE, imageData.Pixels()) surface.Blit(&left_rect, imageData, &bounds) gl.TexImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_X, 0, gl.RGBA, int(W), int(H), 0, gl.RGBA, gl.UNSIGNED_BYTE, imageData.Pixels()) surface.Blit(&right_rect, imageData, &bounds) gl.TexImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_X, 0, gl.RGBA, int(W), int(H), 0, gl.RGBA, gl.UNSIGNED_BYTE, imageData.Pixels()) surface.Blit(&back_rect, imageData, &bounds) gl.TexImage2D(gl.TEXTURE_CUBE_MAP_NEGATIVE_Z, 0, gl.RGBA, int(W), int(H), 0, gl.RGBA, gl.UNSIGNED_BYTE, imageData.Pixels()) surface.Blit(&front_rect, imageData, &bounds) gl.TexImage2D(gl.TEXTURE_CUBE_MAP_POSITIVE_Z, 0, gl.RGBA, int(W), int(H), 0, gl.RGBA, gl.UNSIGNED_BYTE, imageData.Pixels()) }
func NewTextureEmpty(width int, height int, model color.Model) *Texture { internalFormat, typ, format, target, e := ColorModelToGLTypes(model) if e != nil { return nil } a := gl.GenTexture() a.Bind(target) gl.TexImage2D(target, 0, internalFormat, width, height, 0, typ, format, nil) t := &Texture{a, false, nil, format, typ, internalFormat, target, width, height} t.SetWraping(WrapS, ClampToEdge) t.SetWraping(WrapT, ClampToEdge) t.SetFiltering(Nearest, Nearest) ResourceManager.Add(t) return t }
func NewTexture2(data interface{}, width int, height int, target gl.GLenum, internalFormat int, typ gl.GLenum, format gl.GLenum) *Texture { a := gl.GenTexture() a.Bind(target) gl.TexImage2D(target, 0, internalFormat, width, height, 0, typ, format, data) t := &Texture{a, false, data, format, typ, internalFormat, target, width, height} t.SetWraping(WrapS, ClampToEdge) t.SetWraping(WrapT, ClampToEdge) t.SetFiltering(Nearest, Nearest) //ansi := []float32{0} //gl.GetFloatv(gl.MAX_TEXTURE_MAX_ANISOTROPY_EXT, ansi) //gl.TexParameterf(target, gl.TEXTURE_MAX_ANISOTROPY_EXT, ansi[0]) t.PreloadRender() //Forcing texture to go to VRAM and prevent shuttering t.data = nil data = nil ResourceManager.Add(t) return t }
func NewTextures(heightMap *gamestate.HeightMap) *Textures { textures := make([]gl.Texture, 10) gl.GenTextures(textures) gl.ActiveTexture(gl.TEXTURE0 + constants.TextureGround) textures[1].Bind(gl.TEXTURE_2D) helpers.LoadTexture2DWatched("textures/GravelCobbleS.jpg") gl.GenerateMipmap(gl.TEXTURE_2D) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_R, gl.REPEAT) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.ActiveTexture(gl.TEXTURE0 + constants.TextureCliffs) textures[2].Bind(gl.TEXTURE_2D) helpers.LoadTexture2DWatched("textures/Cliffs0149_18_S.png") gl.GenerateMipmap(gl.TEXTURE_2D) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_R, gl.REPEAT) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.ActiveTexture(gl.TEXTURE0 + constants.TextureColorBand) textures[3].Bind(gl.TEXTURE_1D) helpers.LoadTexture1DWatched("textures/gradient.png") gl.TexParameteri(gl.TEXTURE_1D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_1D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.ActiveTexture(gl.TEXTURE0 + constants.TextureHeightMap) textures[4].Bind(gl.TEXTURE_2D) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.R16, heightMap.W, heightMap.H, 0, gl.RED, gl.FLOAT, heightMap.TexturePixels()) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.REPEAT) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.REPEAT) gl.ActiveTexture(gl.TEXTURE0 + constants.TextureTree) textures[5].Bind(gl.TEXTURE_2D) helpers.LoadTexture2DWatched("textures/palme.png") gl.GenerateMipmap(gl.TEXTURE_2D) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.ActiveTexture(gl.TEXTURE0 + constants.TextureFireBall) textures[6].Bind(gl.TEXTURE_2D) helpers.LoadTexture2DWatched("textures/fireball.png") gl.GenerateMipmap(gl.TEXTURE_2D) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_S, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.ActiveTexture(gl.TEXTURE0 + constants.TextureSkybox) textures[7].Bind(gl.TEXTURE_CUBE_MAP) helpers.LoadTextureCubeWatched("textures/Above_The_Sea.jpg") gl.GenerateMipmap(gl.TEXTURE_CUBE_MAP) gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MIN_FILTER, gl.LINEAR_MIPMAP_LINEAR) gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_MAG_FILTER, gl.LINEAR) //gl.TexParameteri(gl.TEXTURE_CUBE_MAP, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE) 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.Enable(gl.TEXTURE_CUBE_MAP_SEAMLESS) ttf.Init() defer ttf.Quit() font, _ := ttf.OpenFont("fonts/Symbola.ttf", 64) color := sdl.Color{255, 255, 255, 255} surface, _ := font.RenderUTF8_Blended("Bla", color) defer surface.Free() gl.ActiveTexture(gl.TEXTURE0 + constants.TextureFont) textures[8].Bind(gl.TEXTURE_2D) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, int(surface.W), int(surface.H), 0, gl.RGBA, gl.UNSIGNED_BYTE, uintptr(surface.Data())) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.LINEAR) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.LINEAR) gl.ActiveTexture(gl.TEXTURE0) return &Textures{textures} }
func (v *Video) Render() { for running { select { case buf := <-v.videoTick: gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) v.prog.Use() gl.ActiveTexture(gl.TEXTURE0) v.texture.Bind(gl.TEXTURE_2D) gl.TexImage2D(gl.TEXTURE_2D, 0, 3, 240, 224, 0, gl.RGBA, gl.UNSIGNED_INT_8_8_8_8, buf) gl.DrawArrays(gl.TRIANGLES, 0, 6) if v.screen != nil { sdl.GL_SwapBuffers() v.fpsmanager.FramerateDelay() } case ev := <-sdl.Events: switch e := ev.(type) { case sdl.ResizeEvent: v.ResizeEvent(int(e.W), int(e.H)) case sdl.QuitEvent: os.Exit(0) case sdl.KeyboardEvent: switch e.Keysym.Sym { case sdl.K_ESCAPE: running = false case sdl.K_r: // Trigger reset interrupt if e.Type == sdl.KEYDOWN { // cpu.RequestInterrupt(InterruptReset) } case sdl.K_l: if e.Type == sdl.KEYDOWN { nes.LoadGameState() } case sdl.K_s: if e.Type == sdl.KEYDOWN { nes.SaveGameState() } case sdl.K_i: if e.Type == sdl.KEYDOWN { nes.AudioEnabled = !nes.AudioEnabled } case sdl.K_p: if e.Type == sdl.KEYDOWN { nes.TogglePause() } case sdl.K_d: if e.Type == sdl.KEYDOWN { jsHandler.ReloadFile(debugfile) } case sdl.K_m: if e.Type == sdl.KEYDOWN { nes.Handler.Handle("debug-mode") } case sdl.K_BACKSLASH: if e.Type == sdl.KEYDOWN { nes.Pause() nes.StepFrame() } case sdl.K_1: if e.Type == sdl.KEYDOWN { v.ResizeEvent(256, 240) } case sdl.K_2: if e.Type == sdl.KEYDOWN { v.ResizeEvent(512, 480) } case sdl.K_3: if e.Type == sdl.KEYDOWN { v.ResizeEvent(768, 720) } case sdl.K_4: if e.Type == sdl.KEYDOWN { v.ResizeEvent(1024, 960) } } switch e.Type { case sdl.KEYDOWN: nes.Pads[0].KeyDown(e, 0) case sdl.KEYUP: nes.Pads[0].KeyUp(e, 0) } } } } }