func uploadTexture_NRGBA32(img *image.NRGBA) gl.Texture { b := img.Bounds() data := make([]uint8, b.Max.X*b.Max.Y*4) for y := 0; y < b.Max.Y; y++ { for x := 0; x < b.Max.X; x++ { p := img.At(x, y) offset := y*b.Max.X*4 + x*4 r, g, b, a := p.RGBA() data[offset+0] = uint8(r) data[offset+1] = uint8(g) data[offset+2] = uint8(b) data[offset+3] = uint8(a) } } id := gl.GenTexture() id.Bind(gl.TEXTURE_2D) 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.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_T, gl.CLAMP_TO_EDGE) gl.TexParameteri(gl.TEXTURE_2D, gl.TEXTURE_WRAP_R, gl.CLAMP_TO_EDGE) gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, b.Max.X, b.Max.Y, 0, gl.RGBA, gl.UNSIGNED_BYTE, data) if gl.GetError() != gl.NO_ERROR { id.Delete() panic(errors.New("Failed to load a texture")) return 0 } return id }
func invertImageNrgba(nrgba *image.NRGBA) { bounds := nrgba.Bounds() for y := bounds.Min.Y; y < bounds.Max.Y; y++ { for x := bounds.Min.X; x < bounds.Max.X; x++ { c := nrgba.At(x, y).(color.NRGBA) c.R = 255 - c.R c.G = 255 - c.G c.B = 255 - c.B nrgba.SetNRGBA(x, y, c) } } }
func drawMotionMap(ske0, ske1 *image.NRGBA, m *MotionMap, shift *ShiftMap) (img *image.RGBA) { bounds := ske0.Bounds().Intersect(ske1.Bounds()).Intersect(m.Bounds) if shift != nil { bounds = bounds.Intersect(shift.Bounds) } s := 10 img = image.NewRGBA(image.Rectangle{bounds.Min.Mul(s), bounds.Max.Mul(s)}) gc := draw2d.NewGraphicContext(img) for y := img.Bounds().Min.Y; y < img.Bounds().Max.Y; y++ { for x := img.Bounds().Min.X; x < img.Bounds().Max.X; x++ { c := color.NRGBA{255, 255, 255, 255} if ske0.At(x/s, y/s).(color.NRGBA).A > 0 { c.R = 0 } if ske1.At(x/s, y/s).(color.NRGBA).A > 0 { c.G = 0 } img.Set(x, y, c) } } count := 0 for y := m.Bounds.Min.Y; y < m.Bounds.Max.Y; y++ { for x := m.Bounds.Min.X; x < m.Bounds.Max.X; x++ { v := GetMotion(m, x, y) if v.X != 0 || v.Y != 0 { cx, cy := x*s+s/2, y*s+s/2 dx, dy := v.X*s, v.Y*s gc.SetStrokeColor(color.RGBA{0, 0, 0, 255}) gc.MoveTo(float64(cx), float64(cy)) gc.LineTo(float64(cx+dx), float64(cy+dy)) gc.Stroke() count++ } if shift != nil { sv := GetShift(shift, x, y) if sv.Dx != 0.0 || sv.Dy != 0.0 { cx, cy := x*s+s/2, y*s+s/2 sf := float64(s) //fmt.Println(x, y, sv) gc.SetStrokeColor(color.RGBA{0, 200, 0, 255}) gc.MoveTo(float64(cx), float64(cy)) gc.LineTo(float64(cx)+sv.Dx*sf, float64(cy)+sv.Dy*sf) gc.Stroke() } } } } fmt.Println("count:", count) return }