mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-24 18:58:54 +01:00
Add opengl.Framebuffer.SetAsViewport
This commit is contained in:
parent
b1d4ce2120
commit
fbcd04cda8
@ -20,7 +20,7 @@ import (
|
|||||||
)
|
)
|
||||||
|
|
||||||
func newGraphicsContext(c *opengl.Context, screenWidth, screenHeight, screenScale int) (*graphicsContext, error) {
|
func newGraphicsContext(c *opengl.Context, screenWidth, screenHeight, screenScale int) (*graphicsContext, error) {
|
||||||
f, err := graphics.NewZeroFramebuffer(screenWidth*screenScale, screenHeight*screenScale)
|
f, err := graphics.NewZeroFramebuffer(c, screenWidth*screenScale, screenHeight*screenScale)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -29,7 +29,7 @@ func newGraphicsContext(c *opengl.Context, screenWidth, screenHeight, screenScal
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
screen, err := newInnerImage(texture)
|
screen, err := newInnerImage(c, texture)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
5
image.go
5
image.go
@ -17,6 +17,7 @@ package ebiten
|
|||||||
import (
|
import (
|
||||||
"github.com/hajimehoshi/ebiten/internal"
|
"github.com/hajimehoshi/ebiten/internal"
|
||||||
"github.com/hajimehoshi/ebiten/internal/graphics"
|
"github.com/hajimehoshi/ebiten/internal/graphics"
|
||||||
|
"github.com/hajimehoshi/ebiten/internal/opengl"
|
||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
)
|
)
|
||||||
@ -26,8 +27,8 @@ type innerImage struct {
|
|||||||
texture *graphics.Texture
|
texture *graphics.Texture
|
||||||
}
|
}
|
||||||
|
|
||||||
func newInnerImage(texture *graphics.Texture) (*innerImage, error) {
|
func newInnerImage(c *opengl.Context, texture *graphics.Texture) (*innerImage, error) {
|
||||||
framebuffer, err := graphics.NewFramebufferFromTexture(texture)
|
framebuffer, err := graphics.NewFramebufferFromTexture(c, texture)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -15,11 +15,10 @@
|
|||||||
package graphics
|
package graphics
|
||||||
|
|
||||||
import (
|
import (
|
||||||
"errors"
|
|
||||||
"fmt"
|
|
||||||
"github.com/go-gl/gl"
|
"github.com/go-gl/gl"
|
||||||
"github.com/hajimehoshi/ebiten/internal"
|
"github.com/hajimehoshi/ebiten/internal"
|
||||||
"github.com/hajimehoshi/ebiten/internal/graphics/internal/shader"
|
"github.com/hajimehoshi/ebiten/internal/graphics/internal/shader"
|
||||||
|
"github.com/hajimehoshi/ebiten/internal/opengl"
|
||||||
)
|
)
|
||||||
|
|
||||||
func orthoProjectionMatrix(left, right, bottom, top int) [4][4]float64 {
|
func orthoProjectionMatrix(left, right, bottom, top int) [4][4]float64 {
|
||||||
@ -37,13 +36,13 @@ func orthoProjectionMatrix(left, right, bottom, top int) [4][4]float64 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Framebuffer struct {
|
type Framebuffer struct {
|
||||||
framebuffer gl.Framebuffer
|
framebuffer opengl.Framebuffer
|
||||||
width int
|
width int
|
||||||
height int
|
height int
|
||||||
flipY bool
|
flipY bool
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewZeroFramebuffer(width, height int) (*Framebuffer, error) {
|
func NewZeroFramebuffer(c *opengl.Context, width, height int) (*Framebuffer, error) {
|
||||||
r := &Framebuffer{
|
r := &Framebuffer{
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
@ -52,8 +51,8 @@ func NewZeroFramebuffer(width, height int) (*Framebuffer, error) {
|
|||||||
return r, nil
|
return r, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFramebufferFromTexture(texture *Texture) (*Framebuffer, error) {
|
func NewFramebufferFromTexture(c *opengl.Context, texture *Texture) (*Framebuffer, error) {
|
||||||
framebuffer, err := createFramebuffer(gl.Texture(texture.native))
|
framebuffer, err := c.NewFramebuffer(opengl.Texture(texture.native))
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
@ -73,33 +72,10 @@ func (f *Framebuffer) Dispose() {
|
|||||||
f.framebuffer.Delete()
|
f.framebuffer.Delete()
|
||||||
}
|
}
|
||||||
|
|
||||||
func createFramebuffer(nativeTexture gl.Texture) (gl.Framebuffer, error) {
|
|
||||||
framebuffer := gl.GenFramebuffer()
|
|
||||||
framebuffer.Bind()
|
|
||||||
|
|
||||||
gl.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, nativeTexture, 0)
|
|
||||||
if gl.CheckFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE {
|
|
||||||
return 0, errors.New("creating framebuffer failed")
|
|
||||||
}
|
|
||||||
|
|
||||||
return framebuffer, nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (f *Framebuffer) setAsViewport() error {
|
func (f *Framebuffer) setAsViewport() error {
|
||||||
gl.Flush()
|
|
||||||
f.framebuffer.Bind()
|
|
||||||
err := gl.CheckFramebufferStatus(gl.FRAMEBUFFER)
|
|
||||||
if err != gl.FRAMEBUFFER_COMPLETE {
|
|
||||||
if gl.GetError() != 0 {
|
|
||||||
return errors.New(fmt.Sprintf("glBindFramebuffer failed: %d", gl.GetError()))
|
|
||||||
}
|
|
||||||
return errors.New("glBindFramebuffer failed: the context is different?")
|
|
||||||
}
|
|
||||||
|
|
||||||
width := internal.NextPowerOf2Int(f.width)
|
width := internal.NextPowerOf2Int(f.width)
|
||||||
height := internal.NextPowerOf2Int(f.height)
|
height := internal.NextPowerOf2Int(f.height)
|
||||||
gl.Viewport(0, 0, width, height)
|
return f.framebuffer.SetAsViewport(width, height)
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *Framebuffer) projectionMatrix() [4][4]float64 {
|
func (f *Framebuffer) projectionMatrix() [4][4]float64 {
|
||||||
|
@ -50,6 +50,26 @@ func (t Texture) Delete() {
|
|||||||
gl.Texture(t).Delete()
|
gl.Texture(t).Delete()
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Framebuffer gl.Framebuffer
|
||||||
|
|
||||||
|
func (f Framebuffer) SetAsViewport(width, height int) error {
|
||||||
|
gl.Flush()
|
||||||
|
gl.Framebuffer(f).Bind()
|
||||||
|
err := gl.CheckFramebufferStatus(gl.FRAMEBUFFER)
|
||||||
|
if err != gl.FRAMEBUFFER_COMPLETE {
|
||||||
|
if gl.GetError() != 0 {
|
||||||
|
return errors.New(fmt.Sprintf("glBindFramebuffer failed: %d", gl.GetError()))
|
||||||
|
}
|
||||||
|
return errors.New("glBindFramebuffer failed: the context is different?")
|
||||||
|
}
|
||||||
|
gl.Viewport(0, 0, width, height)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f Framebuffer) Delete() {
|
||||||
|
gl.Framebuffer(f).Delete()
|
||||||
|
}
|
||||||
|
|
||||||
func NewContext() *Context {
|
func NewContext() *Context {
|
||||||
c := &Context{
|
c := &Context{
|
||||||
Nearest: filterNearest,
|
Nearest: filterNearest,
|
||||||
@ -83,3 +103,15 @@ func (c *Context) NewTexture(width, height int, pixels []uint8, filter Filter) (
|
|||||||
|
|
||||||
return Texture(t), nil
|
return Texture(t), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (c *Context) NewFramebuffer(texture Texture) (Framebuffer, error) {
|
||||||
|
f := gl.GenFramebuffer()
|
||||||
|
f.Bind()
|
||||||
|
|
||||||
|
gl.FramebufferTexture2D(gl.FRAMEBUFFER, gl.COLOR_ATTACHMENT0, gl.TEXTURE_2D, gl.Texture(texture), 0)
|
||||||
|
if gl.CheckFramebufferStatus(gl.FRAMEBUFFER) != gl.FRAMEBUFFER_COMPLETE {
|
||||||
|
return 0, errors.New("creating framebuffer failed")
|
||||||
|
}
|
||||||
|
|
||||||
|
return Framebuffer(f), nil
|
||||||
|
}
|
||||||
|
4
ui.go
4
ui.go
@ -156,7 +156,7 @@ func (u *ui) newImageFromImage(img image.Image, filter Filter) (*Image, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
innerImage, err = newInnerImage(texture)
|
innerImage, err = newInnerImage(u.glContext, texture)
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
@ -173,7 +173,7 @@ func (u *ui) newImage(width, height int, filter Filter) (*Image, error) {
|
|||||||
if err != nil {
|
if err != nil {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
innerImage, err = newInnerImage(texture)
|
innerImage, err = newInnerImage(u.glContext, texture)
|
||||||
innerImage.Clear()
|
innerImage.Clear()
|
||||||
})
|
})
|
||||||
if err != nil {
|
if err != nil {
|
||||||
|
Loading…
Reference in New Issue
Block a user