mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2025-02-04 15:04:28 +01:00
Refactoring
This commit is contained in:
parent
a109c11594
commit
c921f4fc3b
@ -6,7 +6,6 @@ package opengl
|
|||||||
// #include <OpenGL/gl.h>
|
// #include <OpenGL/gl.h>
|
||||||
import "C"
|
import "C"
|
||||||
import (
|
import (
|
||||||
"fmt"
|
|
||||||
"github.com/hajimehoshi/go-ebiten/graphics"
|
"github.com/hajimehoshi/go-ebiten/graphics"
|
||||||
"github.com/hajimehoshi/go-ebiten/graphics/matrix"
|
"github.com/hajimehoshi/go-ebiten/graphics/matrix"
|
||||||
"github.com/hajimehoshi/go-ebiten/graphics/opengl/rendertarget"
|
"github.com/hajimehoshi/go-ebiten/graphics/opengl/rendertarget"
|
||||||
@ -115,46 +114,16 @@ func (context *Context) SetOffscreen(renderTargetId graphics.RenderTargetId) {
|
|||||||
context.setOffscreen(renderTarget)
|
context.setOffscreen(renderTarget)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (context *Context) doSetOffscreen(
|
|
||||||
usingMainFramebuffer bool,
|
|
||||||
framebuffer interface{}, x, y, width, height int) {
|
|
||||||
f := framebuffer.(rendertarget.Framebuffer)
|
|
||||||
C.glBindFramebuffer(C.GL_FRAMEBUFFER, C.GLuint(f))
|
|
||||||
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)
|
|
||||||
|
|
||||||
C.glViewport(C.GLint(x), C.GLint(y),
|
|
||||||
C.GLsizei(width), C.GLsizei(height))
|
|
||||||
|
|
||||||
matrix := graphics.OrthoProjectionMatrix(x, width, y, height)
|
|
||||||
if usingMainFramebuffer {
|
|
||||||
actualScreenHeight := context.screenHeight * context.screenScale
|
|
||||||
// Flip Y and move to fit with the top of the window.
|
|
||||||
matrix[1][1] *= -1
|
|
||||||
matrix[1][3] += float64(actualScreenHeight) / float64(height) * 2
|
|
||||||
}
|
|
||||||
|
|
||||||
for j := 0; j < 4; j++ {
|
|
||||||
for i := 0; i < 4; i++ {
|
|
||||||
context.projectionMatrix[i+j*4] = float32(matrix[i][j])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
func (context *Context) setOffscreen(rt *grendertarget.RenderTarget) {
|
func (context *Context) setOffscreen(rt *grendertarget.RenderTarget) {
|
||||||
C.glFlush()
|
C.glFlush()
|
||||||
|
|
||||||
usingMainFramebuffer := rt == context.mainFramebufferTexture
|
setter := &OffscreenSetter{
|
||||||
rt.SetAsOffscreen(func(framebuffer interface{},
|
context.screenHeight,
|
||||||
x, y, width, height int) {
|
context.screenScale,
|
||||||
context.doSetOffscreen(usingMainFramebuffer, framebuffer,
|
rt == context.mainFramebufferTexture,
|
||||||
x, y, width, height)
|
&context.projectionMatrix,
|
||||||
})
|
}
|
||||||
|
rt.SetAsOffscreen(setter)
|
||||||
}
|
}
|
||||||
|
|
||||||
func (context *Context) setMainFramebufferOffscreen() {
|
func (context *Context) setMainFramebufferOffscreen() {
|
||||||
|
48
graphics/opengl/offscreen.go
Normal file
48
graphics/opengl/offscreen.go
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
package opengl
|
||||||
|
|
||||||
|
// #cgo LDFLAGS: -framework OpenGL
|
||||||
|
//
|
||||||
|
// #include <stdlib.h>
|
||||||
|
// #include <OpenGL/gl.h>
|
||||||
|
import "C"
|
||||||
|
import (
|
||||||
|
"fmt"
|
||||||
|
"github.com/hajimehoshi/go-ebiten/graphics"
|
||||||
|
"github.com/hajimehoshi/go-ebiten/graphics/opengl/rendertarget"
|
||||||
|
)
|
||||||
|
|
||||||
|
type OffscreenSetter struct {
|
||||||
|
screenHeight int
|
||||||
|
screenScale int
|
||||||
|
usingMainFramebuffer bool
|
||||||
|
projectionMatrix *[16]float32
|
||||||
|
}
|
||||||
|
|
||||||
|
func (s *OffscreenSetter) Set(framebuffer interface{}, x, y, width, height int) {
|
||||||
|
f := framebuffer.(rendertarget.Framebuffer)
|
||||||
|
C.glBindFramebuffer(C.GL_FRAMEBUFFER, C.GLuint(f))
|
||||||
|
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)
|
||||||
|
|
||||||
|
C.glViewport(C.GLint(x), C.GLint(y),
|
||||||
|
C.GLsizei(width), C.GLsizei(height))
|
||||||
|
|
||||||
|
matrix := graphics.OrthoProjectionMatrix(x, width, y, height)
|
||||||
|
if s.usingMainFramebuffer {
|
||||||
|
actualScreenHeight := s.screenHeight * s.screenScale
|
||||||
|
// Flip Y and move to fit with the top of the window.
|
||||||
|
matrix[1][1] *= -1
|
||||||
|
matrix[1][3] += float64(actualScreenHeight) / float64(height) * 2
|
||||||
|
}
|
||||||
|
|
||||||
|
for j := 0; j < 4; j++ {
|
||||||
|
for i := 0; i < 4; i++ {
|
||||||
|
s.projectionMatrix[i+j*4] = float32(matrix[i][j])
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
@ -56,8 +56,7 @@ func createNativeTexture(textureWidth, textureHeight int, pixels []uint8,
|
|||||||
|
|
||||||
func create(textureWidth, textureHeight int, filter Filter) (
|
func create(textureWidth, textureHeight int, filter Filter) (
|
||||||
interface{}, error) {
|
interface{}, error) {
|
||||||
return createNativeTexture(textureWidth, textureHeight,
|
return createNativeTexture(textureWidth, textureHeight, nil, filter), nil
|
||||||
nil, filter), nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func createFromImage(img *image.NRGBA) (interface{}, error) {
|
func createFromImage(img *image.NRGBA) (interface{}, error) {
|
||||||
|
@ -4,6 +4,10 @@ import (
|
|||||||
"github.com/hajimehoshi/go-ebiten/graphics/texture"
|
"github.com/hajimehoshi/go-ebiten/graphics/texture"
|
||||||
)
|
)
|
||||||
|
|
||||||
|
type OffscreenSetter interface {
|
||||||
|
Set(framebuffer interface{}, x, y, width, height int)
|
||||||
|
}
|
||||||
|
|
||||||
type RenderTarget struct {
|
type RenderTarget struct {
|
||||||
texture *texture.Texture
|
texture *texture.Texture
|
||||||
framebuffer interface{}
|
framebuffer interface{}
|
||||||
@ -16,9 +20,8 @@ func NewWithFramebuffer(texture *texture.Texture, framebuffer interface{}) *Rend
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
func (renderTarget *RenderTarget) SetAsOffscreen(
|
func (renderTarget *RenderTarget) SetAsOffscreen(setter OffscreenSetter) {
|
||||||
setter func(framebuffer interface{}, x, y, width, height int)) {
|
|
||||||
renderTarget.texture.SetAsViewport(func(x, y, width, height int) {
|
renderTarget.texture.SetAsViewport(func(x, y, width, height int) {
|
||||||
setter(renderTarget.framebuffer, x, y, width, height)
|
setter.Set(renderTarget.framebuffer, x, y, width, height)
|
||||||
})
|
})
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user