Reduce panics (#16)

This commit is contained in:
Hajime Hoshi 2014-12-29 00:21:40 +09:00
parent d8ffa6388a
commit 22035e79fe
6 changed files with 44 additions and 29 deletions

View File

@ -64,15 +64,16 @@ func (d *debugPrintState) drawText(rt *ebiten.Image, str string, x, y int, c col
})
}
func (d *debugPrintState) DebugPrint(r *ebiten.Image, str string) {
// DebugPrint prints the given text str on the given image r.
func (d *debugPrintState) DebugPrint(r *ebiten.Image, str string) error {
if d.textImage == nil {
img, err := assets.TextImage()
if err != nil {
panic(err)
return err
}
d.textImage, err = ebiten.NewImageFromImage(img, ebiten.FilterNearest)
if err != nil {
panic(err)
return err
}
}
if d.debugPrintRenderTarget == nil {
@ -80,9 +81,10 @@ func (d *debugPrintState) DebugPrint(r *ebiten.Image, str string) {
var err error
d.debugPrintRenderTarget, err = ebiten.NewImage(width, height, ebiten.FilterNearest)
if err != nil {
panic(err)
return err
}
}
d.drawText(r, str, 1, d.y+1, color.NRGBA{0x00, 0x00, 0x00, 0x80})
d.drawText(r, str, 0, d.y, color.NRGBA{0xff, 0xff, 0xff, 0xff})
return nil
}

View File

@ -75,8 +75,7 @@ func (i *innerImage) drawImage(img *innerImage, options *DrawImageOptions) error
w, h := img.texture.Size()
quads := textureQuads(parts, w, h)
projectionMatrix := i.framebuffer.ProjectionMatrix()
shader.DrawTexture(img.texture.Native(), projectionMatrix, quads, geo, clr)
return nil
return shader.DrawTexture(img.texture.Native(), projectionMatrix, quads, geo, clr)
}
func u(x float64, width int) float32 {
@ -200,7 +199,7 @@ type ImagePart struct {
Src image.Rectangle
}
// A DrawImageOptions presents options to render an image on an image.
// A DrawImageOptions represents options to render an image on an image.
type DrawImageOptions struct {
Parts []ImagePart
GeoM GeoM

View File

@ -40,11 +40,13 @@ const size = 10000
const uint16Size = 2
const short32Size = 4
func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []TextureQuad, geo Matrix, color Matrix) {
func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []TextureQuad, geo Matrix, color Matrix) error {
// TODO: Check len(quads) and gl.MAX_ELEMENTS_INDICES?
const stride = 4 * 4
if !initialized {
initialize()
if err := initialize(); err != nil {
return err
}
vertexBuffer := gl.GenBuffer()
vertexBuffer.Bind(gl.ARRAY_BUFFER)
@ -68,7 +70,7 @@ func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []Text
}
if len(quads) == 0 {
return
return nil
}
// TODO: Check performance
program := useProgramColorMatrix(glMatrix(projectionMatrix), geo, color)
@ -110,4 +112,5 @@ func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []Text
gl.DrawElements(gl.TRIANGLES, 6*len(quads), gl.UNSIGNED_SHORT, uintptr(0))
gl.Flush()
return nil
}

View File

@ -15,6 +15,7 @@
package shader
import (
"errors"
"github.com/go-gl/gl"
)
@ -27,10 +28,10 @@ var programColorMatrix = program{
shaderIds: []shaderId{shaderVertex, shaderColorMatrix},
}
func (p *program) create() {
func (p *program) create() error {
p.native = gl.CreateProgram()
if p.native == 0 {
panic("glCreateProgram failed")
return errors.New("glCreateProgram failed")
}
for _, shaderId := range p.shaderIds {
@ -38,13 +39,16 @@ func (p *program) create() {
}
p.native.Link()
if p.native.Get(gl.LINK_STATUS) == gl.FALSE {
panic("program error")
return errors.New("program error")
}
return nil
}
func initialize() {
func initialize() error {
for _, shader := range shaders {
shader.compile()
if err := shader.compile(); err != nil {
return err
}
}
defer func() {
for _, shader := range shaders {
@ -52,7 +56,7 @@ func initialize() {
}
}()
programColorMatrix.create()
return programColorMatrix.create()
}
func getAttributeLocation(program gl.Program, name string) gl.AttribLocation {

View File

@ -15,8 +15,9 @@
package shader
import (
"errors"
"fmt"
"github.com/go-gl/gl"
"log"
)
type shader struct {
@ -75,26 +76,26 @@ void main(void) {
},
}
func (s *shader) compile() {
func (s *shader) compile() error {
s.native = gl.CreateShader(s.shaderType)
if s.native == 0 {
panic("glCreateShader failed")
return errors.New("glCreateShader failed")
}
s.native.Source(s.source)
s.native.Compile()
if s.native.Get(gl.COMPILE_STATUS) == gl.FALSE {
s.showShaderLog()
panic("shader compile failed")
return errors.New(fmt.Sprintf("shader compile failed: %s", s.shaderLog()))
}
return nil
}
func (s *shader) showShaderLog() {
func (s *shader) shaderLog() string {
if s.native.Get(gl.INFO_LOG_LENGTH) == 0 {
return
return ""
}
log.Fatalf("shader error: %s\n", s.native.GetInfoLog())
return s.native.GetInfoLog()
}
func (s *shader) delete() {

View File

@ -59,10 +59,10 @@ func (t *Texture) Size() (width, height int) {
return t.width, t.height
}
func createNativeTexture(textureWidth, textureHeight int, pixels []uint8, filter Filter) gl.Texture {
func createNativeTexture(textureWidth, textureHeight int, pixels []uint8, filter Filter) (gl.Texture, error) {
nativeTexture := gl.GenTexture()
if nativeTexture < 0 {
panic("glGenTexture failed")
return 0, errors.New("glGenTexture failed")
}
gl.PixelStorei(gl.UNPACK_ALIGNMENT, 4)
nativeTexture.Bind(gl.TEXTURE_2D)
@ -73,7 +73,7 @@ func createNativeTexture(textureWidth, textureHeight int, pixels []uint8, filter
gl.TexImage2D(gl.TEXTURE_2D, 0, gl.RGBA, textureWidth, textureHeight, 0, gl.RGBA, gl.UNSIGNED_BYTE, pixels)
return nativeTexture
return nativeTexture, nil
}
func NewTexture(width, height int, filter Filter) (*Texture, error) {
@ -85,7 +85,10 @@ func NewTexture(width, height int, filter Filter) (*Texture, error) {
if h < 4 {
return nil, errors.New("height must be equal or more than 4.")
}
native := createNativeTexture(w, h, nil, filter)
native, err := createNativeTexture(w, h, nil, filter)
if err != nil {
return nil, err
}
return &Texture{native, width, height}, nil
}
@ -99,7 +102,10 @@ func NewTextureFromImage(img image.Image, filter Filter) (*Texture, error) {
}
adjustedImage := adjustImageForTexture(img)
size := adjustedImage.Bounds().Size()
native := createNativeTexture(size.X, size.Y, adjustedImage.Pix, filter)
native, err := createNativeTexture(size.X, size.Y, adjustedImage.Pix, filter)
if err != nil {
return nil, err
}
return &Texture{native, origSize.X, origSize.Y}, nil
}