package rendertarget // #cgo LDFLAGS: -framework OpenGL // // #include import "C" import ( "github.com/hajimehoshi/go-ebiten/graphics/opengl/texture" "github.com/hajimehoshi/go-ebiten/graphics/rendertarget" ) type Framebuffer C.GLuint func createFramebuffer(nativeTexture C.GLuint) C.GLuint { framebuffer := C.GLuint(0) C.glGenFramebuffers(1, &framebuffer) origFramebuffer := C.GLint(0) C.glGetIntegerv(C.GL_FRAMEBUFFER_BINDING, &origFramebuffer) C.glBindFramebuffer(C.GL_FRAMEBUFFER, framebuffer) defer C.glBindFramebuffer(C.GL_FRAMEBUFFER, C.GLuint(origFramebuffer)) C.glFramebufferTexture2D(C.GL_FRAMEBUFFER, C.GL_COLOR_ATTACHMENT0, C.GL_TEXTURE_2D, nativeTexture, 0) if C.glCheckFramebufferStatus(C.GL_FRAMEBUFFER) != C.GL_FRAMEBUFFER_COMPLETE { panic("creating framebuffer failed") } return framebuffer } func New(width, height int, filter texture.Filter) ( *rendertarget.RenderTarget, error) { tex, err := texture.New(width, height, filter) if err != nil { return nil, err } framebuffer := C.GLuint(0) tex.CreateFramebuffer(func(native interface{}) { framebuffer = createFramebuffer(C.GLuint(native.(texture.Native))) }) return rendertarget.NewWithFramebuffer(tex, Framebuffer(framebuffer)), nil } func NewWithFramebuffer(width, height int, framebuffer Framebuffer, filter texture.Filter) (*rendertarget.RenderTarget, error) { tex, err := texture.New(width, height, filter) if err != nil { return nil, err } return rendertarget.NewWithFramebuffer(tex, framebuffer), nil }