update to latest

This commit is contained in:
Loic Nageleisen 2016-03-10 15:01:12 +01:00
parent 58bc762dc1
commit ff8dd84a8f
2 changed files with 380 additions and 371 deletions

View file

View file

@ -1,19 +1,20 @@
package main package main
import ( import (
"runtime"
"time"
"math"
"log"
"io"
"errors" "errors"
"os"
"syscall"
"image" "image"
"image/png" "image/png"
gl "github.com/go-gl/gl" "io"
glfw "github.com/go-gl/glfw3" "log"
pa "code.google.com/p/portaudio-go/portaudio" "math"
"os"
"runtime"
"syscall"
"time"
gl "github.com/go-gl/gl/v2.1/gl"
glfw "github.com/go-gl/glfw/v3.0/glfw"
pa "github.com/gordonklaus/portaudio"
) )
var _ = pa.Initialize // TODO: remove later var _ = pa.Initialize // TODO: remove later
@ -26,6 +27,8 @@ const (
INPUT_JUMP = 4 INPUT_JUMP = 4
) )
type Texture uint32
// iterate faster // iterate faster
func rerun() (err error) { func rerun() (err error) {
@ -41,7 +44,9 @@ func rerun() (err error) {
func reexec() { func reexec() {
err := rerun() err := rerun()
if err != nil { panic(err) } if err != nil {
panic(err)
}
} }
// glfw callbacks // glfw callbacks
@ -62,7 +67,7 @@ func onKey(input chan int, window *glfw.Window, k glfw.Key, s int, action glfw.A
switch glfw.Key(k) { switch glfw.Key(k) {
case glfw.KeyR: case glfw.KeyR:
if (mods & glfw.ModSuper != 0) && action == glfw.Press { if (mods&glfw.ModSuper != 0) && action == glfw.Press {
reexec() reexec()
} }
case glfw.KeyUp: case glfw.KeyUp:
@ -84,22 +89,22 @@ func onKey(input chan int, window *glfw.Window, k glfw.Key, s int, action glfw.A
} }
} }
// utils // utils
func readTexture(r io.Reader) (texId gl.Texture, err error) { func readTexture(r io.Reader) (texId Texture, err error) {
img, err := png.Decode(r) img, err := png.Decode(r)
if err != nil { if err != nil {
return gl.Texture(0), err return Texture(0), err
} }
rgba, ok := img.(*image.NRGBA) rgba, ok := img.(*image.NRGBA)
if !ok { if !ok {
return gl.Texture(0), errors.New("not an NRGBA image") return Texture(0), errors.New("not an NRGBA image")
} }
texId = gl.GenTexture() tid := uint32(texId)
texId.Bind(gl.TEXTURE_2D) gl.GenTextures(1, &tid)
gl.BindTexture(gl.TEXTURE_2D, uint32(texId))
gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MAG_FILTER, gl.NEAREST)
gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST) gl.TexParameterf(gl.TEXTURE_2D, gl.TEXTURE_MIN_FILTER, gl.NEAREST)
@ -107,7 +112,7 @@ func readTexture(r io.Reader) (texId gl.Texture, err error) {
raw := make([]byte, w*h*4) raw := make([]byte, w*h*4)
raw_stride := w * 4 raw_stride := w * 4
if raw_stride != rgba.Stride { if raw_stride != rgba.Stride {
return gl.Texture(0), errors.New("incompatible stride") return Texture(0), errors.New("incompatible stride")
} }
dst := len(raw) - raw_stride dst := len(raw) - raw_stride
@ -118,7 +123,7 @@ func readTexture(r io.Reader) (texId gl.Texture, err error) {
lod := 0 lod := 0
border := 0 border := 0
gl.TexImage2D(gl.TEXTURE_2D, lod, gl.RGBA, w, h, border, gl.RGBA, gl.UNSIGNED_BYTE, raw) gl.TexImage2D(gl.TEXTURE_2D, int32(lod), gl.RGBA, int32(w), int32(h), int32(border), gl.RGBA, gl.UNSIGNED_BYTE, gl.Ptr(raw))
return return
} }
@ -136,8 +141,8 @@ func scaledSpriteQuad(x int, y int, w int, h int, scale float32) {
// origin is as tex: bottom-left // origin is as tex: bottom-left
x1 := x * unit x1 := x * unit
y1 := y * unit y1 := y * unit
x2 := x1 + w * unit x2 := x1 + w*unit
y2 := y1 + h * unit y2 := y1 + h*unit
// abs pixel to relative tex coords // abs pixel to relative tex coords
rx1 := float32(x1) / float32(size) rx1 := float32(x1) / float32(size)
@ -150,10 +155,10 @@ func scaledSpriteQuad(x int, y int, w int, h int, scale float32) {
// relative model coords // relative model coords
// sprite-centered origin, half each way // sprite-centered origin, half each way
qx1 := -qsize * float32(unit * w) / 2.0 qx1 := -qsize * float32(unit*w) / 2.0
qy1 := -qsize * float32(unit * h) / 2.0 qy1 := -qsize * float32(unit*h) / 2.0
qx2 := qsize * float32(unit * w) / 2.0 qx2 := qsize * float32(unit*w) / 2.0
qy2 := qsize * float32(unit * h) / 2.0 qy2 := qsize * float32(unit*h) / 2.0
// draw sprite quad // draw sprite quad
gl.MatrixMode(gl.MODELVIEW) gl.MatrixMode(gl.MODELVIEW)
@ -170,41 +175,41 @@ func scaledSpriteQuad(x int, y int, w int, h int, scale float32) {
gl.End() gl.End()
} }
func drawSprite(texture gl.Texture, x float64, y float64, a float64, s float64, list uint) { func drawSprite(texture Texture, x float64, y float64, a float64, s float64, list uint) {
deg := math.Mod(360 * float64(a) / (2 * math.Pi), 360.0) deg := math.Mod(360*float64(a)/(2*math.Pi), 360.0)
gl.LoadIdentity() gl.LoadIdentity()
texture.Bind(gl.TEXTURE_2D) gl.BindTexture(gl.TEXTURE_2D, uint32(texture))
gl.Translatef(float32(x), float32(y), 0) gl.Translatef(float32(x), float32(y), 0)
gl.Rotatef(float32(deg), 0.0, 0.0, 1.0); gl.Rotatef(float32(deg), 0.0, 0.0, 1.0)
gl.Scalef(float32(s), float32(s), 1.0) gl.Scalef(float32(s), float32(s), 1.0)
gl.CallList(list) gl.CallList(uint32(list))
} }
func makeSprite(x int, y int, w int, h int) (quad uint) { func makeSprite(x int, y int, w int, h int) (quad uint) {
quad = gl.GenLists(1) quad = uint(gl.GenLists(1))
gl.NewList(quad, gl.COMPILE) gl.NewList(uint32(quad), gl.COMPILE)
spriteQuad(x, y, w, h) spriteQuad(x, y, w, h)
gl.EndList() gl.EndList()
return return
} }
func drawTile(texture gl.Texture, x int, y int, list uint) { func drawTile(texture Texture, x int, y int, list uint) {
sx := float64(16 * x + 16 / 2) sx := float64(16*x + 16/2)
sy := float64(16 * y + 16 / 2) sy := float64(16*y + 16/2)
drawSprite(texture, sx, sy, 0, 1, list) drawSprite(texture, sx, sy, 0, 1, list)
} }
func drawWaterTile(x int, y int, t float64) { func drawWaterTile(x int, y int, t float64) {
waveHeight := 0.0 waveHeight := 0.0
wavePhase := -1 + x % 2 * 2 wavePhase := -1 + x%2*2
if (t > 0) { if t > 0 {
waveHeight = float64(wavePhase) * math.Sin(t) waveHeight = float64(wavePhase) * math.Sin(t)
} }
qx1, qy1 := 16 * float32(x), 16 * float32(y) qx1, qy1 := 16*float32(x), 16*float32(y)
qx2, qy2 := qx1 + 16, qy1 + 16 qx2, qy2 := qx1+16, qy1+16
gl.Disable(gl.TEXTURE_2D) gl.Disable(gl.TEXTURE_2D)
gl.Disable(gl.LIGHTING) gl.Disable(gl.LIGHTING)
@ -216,8 +221,8 @@ func drawWaterTile(x int, y int, t float64) {
gl.Normal3f(0.0, 0.0, 1.0) gl.Normal3f(0.0, 0.0, 1.0)
gl.Vertex3f(qx1, qy1, 1.0) gl.Vertex3f(qx1, qy1, 1.0)
gl.Vertex3f(qx2, qy1, 1.0) gl.Vertex3f(qx2, qy1, 1.0)
gl.Vertex3f(qx2, qy2 + float32(waveHeight), 1.0) gl.Vertex3f(qx2, qy2+float32(waveHeight), 1.0)
gl.Vertex3f(qx1, qy2 + float32(waveHeight), 1.0) gl.Vertex3f(qx1, qy2+float32(waveHeight), 1.0)
gl.End() gl.End()
gl.Enable(gl.LIGHTING) gl.Enable(gl.LIGHTING)
@ -242,9 +247,9 @@ func main() {
var inputState [5]bool var inputState [5]bool
func inputMapper(input chan int) { func inputMapper(input chan int) {
inputState = [5]bool{false,false,false,false,false} inputState = [5]bool{false, false, false, false, false}
for { for {
in := <- input in := <-input
pressed := in < 8 pressed := in < 8
if !pressed { if !pressed {
in = in - 8 in = in - 8
@ -267,10 +272,10 @@ func stepper(tick chan int) {
for { for {
<-tick <-tick
pt, ct = ct, float64(time.Now().UnixNano()) / math.Pow(10, 9) pt, ct = ct, float64(time.Now().UnixNano())/math.Pow(10, 9)
dt = ct - pt dt = ct - pt
pvx, pvy := (pcx - ppx) / dt, (pcy - ppy) / dt pvx, pvy := (pcx-ppx)/dt, (pcy-ppy)/dt
ppx, ppy = pcx, pcy ppx, ppy = pcx, pcy
fx := 0.0 fx := 0.0
@ -297,8 +302,8 @@ func stepper(tick chan int) {
// integrator // integrator
pax := fx / pm pax := fx / pm
pay := fy / pm pay := fy / pm
pvx = pax * dt + pvx pvx = pax*dt + pvx
pvy = pay * dt + pvy pvy = pay*dt + pvy
dpcx := pvx * dt dpcx := pvx * dt
dpcy := pvy * dt dpcy := pvy * dt
if math.Abs(dpcx) < 0.001 { if math.Abs(dpcx) < 0.001 {
@ -319,7 +324,6 @@ func stepper(tick chan int) {
} }
// renderer // renderer
var mouseX float64 var mouseX float64
@ -352,18 +356,18 @@ func renderer(done chan int, input chan int, tick chan int) {
window.SetInputMode(glfw.Cursor, glfw.CursorHidden) window.SetInputMode(glfw.Cursor, glfw.CursorHidden)
onKeyClosure := func (window *glfw.Window, k glfw.Key, s int, action glfw.Action, mods glfw.ModifierKey) { onKeyClosure := func(window *glfw.Window, k glfw.Key, s int, action glfw.Action, mods glfw.ModifierKey) {
onKey(input, window, k, s, action, mods) onKey(input, window, k, s, action, mods)
} }
onMouseClosure := func (window *glfw.Window, x float64, y float64) { onMouseClosure := func(window *glfw.Window, x float64, y float64) {
rx := float64(ww) / (vx2 - vx1) rx := float64(ww) / (vx2 - vx1)
ry := float64(wh) / (vy2 - vy1) ry := float64(wh) / (vy2 - vy1)
mouseX, mouseY = x/rx - vx1, vy2 - (y/ry - vy1) mouseX, mouseY = x/rx-vx1, vy2-(y/ry-vy1)
mouseVisible = mouseX < vx2 && mouseX >= 0 && mouseY < vy2 && mouseY >= 0 mouseVisible = mouseX < vx2 && mouseX >= 0 && mouseY < vy2 && mouseY >= 0
} }
onMouseButtonClosure := func (window *glfw.Window, button glfw.MouseButton, action glfw.Action, mods glfw.ModifierKey) { onMouseButtonClosure := func(window *glfw.Window, button glfw.MouseButton, action glfw.Action, mods glfw.ModifierKey) {
if button == 0 { if button == 0 {
mousePressed = action == 1 mousePressed = action == 1
} }
@ -388,7 +392,7 @@ func renderer(done chan int, input chan int, tick chan int) {
done <- 1 done <- 1
} }
func setup() (textures map[string]gl.Texture, lists map[string]uint) { func setup() (textures map[string]Texture, lists map[string]uint) {
gl.Enable(gl.TEXTURE_2D) gl.Enable(gl.TEXTURE_2D)
gl.Enable(gl.DEPTH_TEST) gl.Enable(gl.DEPTH_TEST)
gl.Enable(gl.LIGHTING) gl.Enable(gl.LIGHTING)
@ -400,17 +404,21 @@ func setup() (textures map[string]gl.Texture, lists map[string]uint) {
gl.DepthFunc(gl.LEQUAL) gl.DepthFunc(gl.LEQUAL)
gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA) gl.BlendFunc(gl.SRC_ALPHA, gl.ONE_MINUS_SRC_ALPHA)
textures = map[string]gl.Texture{} textures = map[string]Texture{}
lists = map[string]uint{} lists = map[string]uint{}
// load spritesheet and make sprites // load spritesheet and make sprites
img, err := os.Open("spritesheet.png") img, err := os.Open("spritesheet.png")
if err != nil { log.Panic(err) } if err != nil {
log.Panic(err)
}
defer img.Close() defer img.Close()
spriteSheet, err := readTexture(img) spriteSheet, err := readTexture(img)
if err != nil { log.Panic(err) } if err != nil {
log.Panic(err)
}
textures["sprites"] = spriteSheet textures["sprites"] = spriteSheet
lists["test"] = makeSprite(0, 0, 2, 2) lists["test"] = makeSprite(0, 0, 2, 2)
@ -429,9 +437,10 @@ func setup() (textures map[string]gl.Texture, lists map[string]uint) {
return return
} }
func destroy(textures map[string]gl.Texture) { func destroy(textures map[string]Texture) {
for _, texture := range textures { for _, texture := range textures {
texture.Delete() t := uint32(texture)
gl.DeleteTextures(1, &t)
} }
} }
@ -440,7 +449,7 @@ var vy1 float64
var vx2 float64 var vx2 float64
var vy2 float64 var vy2 float64
func render(textures map[string]gl.Texture, lists map[string]uint) { func render(textures map[string]Texture, lists map[string]uint) {
// start afresh // start afresh
gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT)
@ -448,7 +457,7 @@ func render(textures map[string]gl.Texture, lists map[string]uint) {
width := float32(ww) width := float32(ww)
height := float32(wh) height := float32(wh)
density := 2 // times 2 because HiDPI density := 2 // times 2 because HiDPI
gl.Viewport(0, 0, int(width)*density, int(height)*density) gl.Viewport(0, 0, int32(width)*int32(density), int32(height)*int32(density))
vw := 320 vw := 320
vh := 240 vh := 240
@ -460,12 +469,12 @@ func render(textures map[string]gl.Texture, lists map[string]uint) {
vx2, vy2 = float64(vw), float64(vh) vx2, vy2 = float64(vw), float64(vh)
gl.Ortho(vx1, vx2, vy1, vy2, -1.0, 1.0) gl.Ortho(vx1, vx2, vy1, vy2, -1.0, 1.0)
gl.MatrixMode(gl.MODELVIEW); gl.MatrixMode(gl.MODELVIEW)
gl.LoadIdentity() gl.LoadIdentity()
// lighten things // lighten things
ambient := []float32{1, 1, 1, 1} ambient := []float32{1, 1, 1, 1}
gl.Lightfv(gl.LIGHT0, gl.AMBIENT, ambient) gl.Lightfv(gl.LIGHT0, gl.AMBIENT, &ambient[0])
gl.Enable(gl.LIGHT0) gl.Enable(gl.LIGHT0)
// time source // time source
@ -485,26 +494,26 @@ func render(textures map[string]gl.Texture, lists map[string]uint) {
drawTile(textures["sprites"], 3, 9, lists["stonewalltopright"]) drawTile(textures["sprites"], 3, 9, lists["stonewalltopright"])
for i := 0; i < 3; i++ { for i := 0; i < 3; i++ {
for j:= 0; j < 9; j++ { for j := 0; j < 9; j++ {
drawTile(textures["sprites"], i, j, lists["stonewall"]) drawTile(textures["sprites"], i, j, lists["stonewall"])
} }
drawTile(textures["sprites"], i, 9, lists["stonewalltop"]) drawTile(textures["sprites"], i, 9, lists["stonewalltop"])
} }
for j := 0; j < 6; j++ { for j := 0; j < 6; j++ {
drawTile(textures["sprites"], 19 - 2, j, lists["stonewallleft"]) drawTile(textures["sprites"], 19-2, j, lists["stonewallleft"])
} }
drawTile(textures["sprites"], 19 - 2, 6, lists["stonewalltopleft"]) drawTile(textures["sprites"], 19-2, 6, lists["stonewalltopleft"])
for i := 0; i < 2; i++ { for i := 0; i < 2; i++ {
for j:= 0; j < 6; j++ { for j := 0; j < 6; j++ {
drawTile(textures["sprites"], 19 - i, j, lists["stonewall"]) drawTile(textures["sprites"], 19-i, j, lists["stonewall"])
} }
drawTile(textures["sprites"], 19 - i, 6, lists["stonewalltop"]) drawTile(textures["sprites"], 19-i, 6, lists["stonewalltop"])
} }
// water // water
for i := 0; i < 320 / 16; i++ { for i := 0; i < 320/16; i++ {
for j := 0; j < 3; j++ { for j := 0; j < 3; j++ {
wt := 0.0 wt := 0.0
if j == 2 { if j == 2 {