ebiten/graphics/opengl/rendertarget/render_target.go

59 lines
1.6 KiB
Go
Raw Normal View History

2013-10-27 11:54:28 +01:00
package rendertarget
// #cgo LDFLAGS: -framework OpenGL
//
// #include <OpenGL/gl.h>
import "C"
import (
2014-01-08 08:38:03 +01:00
"fmt"
2013-12-18 10:05:28 +01:00
"github.com/hajimehoshi/go-ebiten/graphics"
2013-10-27 11:54:28 +01:00
"github.com/hajimehoshi/go-ebiten/graphics/opengl/texture"
)
2014-01-08 06:37:07 +01:00
type RenderTarget struct {
2014-01-08 10:03:21 +01:00
framebuffer texture.Framebuffer
width int
height int
2013-10-27 11:54:28 +01:00
}
2013-12-18 10:05:28 +01:00
func Create(width, height int, filter graphics.Filter) (
2014-01-08 06:37:07 +01:00
*RenderTarget, *texture.Texture, error) {
2013-11-28 18:38:18 +01:00
tex, err := texture.Create(width, height, filter)
2013-10-27 11:54:28 +01:00
if err != nil {
2013-10-27 14:09:19 +01:00
return nil, nil, err
2013-10-27 11:54:28 +01:00
}
2014-01-08 10:03:21 +01:00
framebuffer := tex.CreateFramebuffer()
return &RenderTarget{framebuffer, width, height}, tex, nil
2013-10-27 11:54:28 +01:00
}
2014-01-08 10:03:21 +01:00
func CreateWithFramebuffer(width, height int, framebuffer texture.Framebuffer) (
2014-01-08 06:37:07 +01:00
*RenderTarget, error) {
return &RenderTarget{framebuffer, width, height}, nil
}
2014-01-08 08:38:03 +01:00
func (r *RenderTarget) SetAsViewport() {
C.glBindFramebuffer(C.GL_FRAMEBUFFER, C.GLuint(r.framebuffer))
err := C.glCheckFramebufferStatus(C.GL_FRAMEBUFFER)
if err != C.GL_FRAMEBUFFER_COMPLETE {
panic(fmt.Sprintf("glBindFramebuffer failed: %d", err))
}
C.glBlendFuncSeparate(C.GL_SRC_ALPHA, C.GL_ONE_MINUS_SRC_ALPHA,
C.GL_ZERO, C.GL_ONE)
width := graphics.AdjustSizeForTexture(r.width)
height := graphics.AdjustSizeForTexture(r.height)
C.glViewport(0, 0, C.GLsizei(width), C.GLsizei(height))
}
func (r *RenderTarget) ProjectionMatrix() [4][4]float64 {
width := graphics.AdjustSizeForTexture(r.width)
height := graphics.AdjustSizeForTexture(r.height)
return graphics.OrthoProjectionMatrix(0, width, 0, height)
}
2014-01-08 06:37:07 +01:00
func (r *RenderTarget) Dispose() {
2014-01-08 08:38:03 +01:00
f := C.GLuint(r.framebuffer)
2014-01-08 06:37:07 +01:00
C.glDeleteFramebuffers(1, &f)
}