mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2025-02-20 15:00:08 +01:00
Remove texture.Texture.Native
This commit is contained in:
parent
feb9ac103f
commit
e4ab8de45e
@ -49,24 +49,20 @@ func (context *Context) Init() {
|
|||||||
C.glGetIntegerv(C.GL_FRAMEBUFFER_BINDING, &mainFramebuffer)
|
C.glGetIntegerv(C.GL_FRAMEBUFFER_BINDING, &mainFramebuffer)
|
||||||
|
|
||||||
var err error
|
var err error
|
||||||
context.mainFramebufferTexture, err = rendertarget.NewRenderTargetWithFramebuffer(
|
context.mainFramebufferTexture, err = rendertarget.NewWithFramebuffer(
|
||||||
context.screenWidth*context.screenScale,
|
context.screenWidth*context.screenScale,
|
||||||
context.screenHeight*context.screenScale,
|
context.screenHeight*context.screenScale,
|
||||||
rendertarget.Framebuffer(mainFramebuffer))
|
rendertarget.Framebuffer(mainFramebuffer),
|
||||||
|
texture.FilterLinear)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("creating main framebuffer failed: " + err.Error())
|
panic("creating main framebuffer failed: " + err.Error())
|
||||||
}
|
}
|
||||||
|
|
||||||
context.screenId, err = context.NewRenderTarget(
|
context.screenId, err = context.newRenderTarget(
|
||||||
context.screenWidth, context.screenHeight)
|
context.screenWidth, context.screenHeight, texture.FilterNearest)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
panic("initializing the offscreen failed: " + err.Error())
|
panic("initializing the offscreen failed: " + err.Error())
|
||||||
}
|
}
|
||||||
screen := context.renderTargets[context.screenId]
|
|
||||||
C.glBindTexture(C.GL_TEXTURE_2D, C.GLuint(screen.Texture().Native().(texture.Native)))
|
|
||||||
C.glTexParameteri(C.GL_TEXTURE_2D, C.GL_TEXTURE_MAG_FILTER, C.GL_NEAREST)
|
|
||||||
C.glTexParameteri(C.GL_TEXTURE_2D, C.GL_TEXTURE_MIN_FILTER, C.GL_NEAREST)
|
|
||||||
C.glBindTexture(C.GL_TEXTURE_2D, 0)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (context *Context) ToTexture(renderTargetId graphics.RenderTargetId) graphics.TextureId {
|
func (context *Context) ToTexture(renderTargetId graphics.RenderTargetId) graphics.TextureId {
|
||||||
@ -127,8 +123,9 @@ func (context *Context) SetOffscreen(renderTargetId graphics.RenderTargetId) {
|
|||||||
func (context *Context) setOffscreen(renderTarget *grendertarget.RenderTarget) {
|
func (context *Context) setOffscreen(renderTarget *grendertarget.RenderTarget) {
|
||||||
C.glFlush()
|
C.glFlush()
|
||||||
|
|
||||||
framebuffer := C.GLuint(renderTarget.Framebuffer().(rendertarget.Framebuffer))
|
renderTarget.SetAsOffscreen(func(framebuffer interface{}) {
|
||||||
C.glBindFramebuffer(C.GL_FRAMEBUFFER, framebuffer)
|
f := framebuffer.(rendertarget.Framebuffer)
|
||||||
|
C.glBindFramebuffer(C.GL_FRAMEBUFFER, C.GLuint(f))
|
||||||
err := C.glCheckFramebufferStatus(C.GL_FRAMEBUFFER)
|
err := C.glCheckFramebufferStatus(C.GL_FRAMEBUFFER)
|
||||||
if err != C.GL_FRAMEBUFFER_COMPLETE {
|
if err != C.GL_FRAMEBUFFER_COMPLETE {
|
||||||
panic(fmt.Sprintf("glBindFramebuffer failed: %d", err))
|
panic(fmt.Sprintf("glBindFramebuffer failed: %d", err))
|
||||||
@ -145,6 +142,7 @@ func (context *Context) setOffscreen(renderTarget *grendertarget.RenderTarget) {
|
|||||||
context,
|
context,
|
||||||
}
|
}
|
||||||
renderTarget.SetAsViewport(setter.Set)
|
renderTarget.SetAsViewport(setter.Set)
|
||||||
|
})
|
||||||
}
|
}
|
||||||
|
|
||||||
type viewportSetter struct {
|
type viewportSetter struct {
|
||||||
@ -178,9 +176,9 @@ func (context *Context) flush() {
|
|||||||
C.glFlush()
|
C.glFlush()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (context *Context) NewRenderTarget(width, height int) (
|
func (context *Context) newRenderTarget(width, height int, filter texture.Filter) (
|
||||||
graphics.RenderTargetId, error) {
|
graphics.RenderTargetId, error) {
|
||||||
renderTarget, err := rendertarget.NewRenderTarget(width, height)
|
renderTarget, err := rendertarget.New(width, height, filter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return 0, nil
|
return 0, nil
|
||||||
}
|
}
|
||||||
@ -198,6 +196,11 @@ func (context *Context) NewRenderTarget(width, height int) (
|
|||||||
return renderTargetId, nil
|
return renderTargetId, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (context *Context) NewRenderTarget(width, height int) (
|
||||||
|
graphics.RenderTargetId, error) {
|
||||||
|
return context.newRenderTarget(width, height, texture.FilterLinear)
|
||||||
|
}
|
||||||
|
|
||||||
func (context *Context) NewTextureFromImage(img image.Image) (
|
func (context *Context) NewTextureFromImage(img image.Image) (
|
||||||
graphics.TextureId, error) {
|
graphics.TextureId, error) {
|
||||||
texture, err := texture.NewFromImage(img)
|
texture, err := texture.NewFromImage(img)
|
||||||
|
@ -17,10 +17,12 @@ func createFramebuffer(nativeTexture C.GLuint) C.GLuint {
|
|||||||
|
|
||||||
origFramebuffer := C.GLint(0)
|
origFramebuffer := C.GLint(0)
|
||||||
C.glGetIntegerv(C.GL_FRAMEBUFFER_BINDING, &origFramebuffer)
|
C.glGetIntegerv(C.GL_FRAMEBUFFER_BINDING, &origFramebuffer)
|
||||||
|
|
||||||
C.glBindFramebuffer(C.GL_FRAMEBUFFER, framebuffer)
|
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.glFramebufferTexture2D(C.GL_FRAMEBUFFER, C.GL_COLOR_ATTACHMENT0,
|
||||||
C.GL_TEXTURE_2D, nativeTexture, 0)
|
C.GL_TEXTURE_2D, nativeTexture, 0)
|
||||||
C.glBindFramebuffer(C.GL_FRAMEBUFFER, C.GLuint(origFramebuffer))
|
|
||||||
if C.glCheckFramebufferStatus(C.GL_FRAMEBUFFER) !=
|
if C.glCheckFramebufferStatus(C.GL_FRAMEBUFFER) !=
|
||||||
C.GL_FRAMEBUFFER_COMPLETE {
|
C.GL_FRAMEBUFFER_COMPLETE {
|
||||||
panic("creating framebuffer failed")
|
panic("creating framebuffer failed")
|
||||||
@ -29,17 +31,23 @@ func createFramebuffer(nativeTexture C.GLuint) C.GLuint {
|
|||||||
return framebuffer
|
return framebuffer
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRenderTarget(width, height int) (*rendertarget.RenderTarget, error) {
|
func New(width, height int, filter texture.Filter) (
|
||||||
tex, err := texture.New(width, height)
|
*rendertarget.RenderTarget, error) {
|
||||||
|
tex, err := texture.New(width, height, filter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
framebuffer := createFramebuffer(C.GLuint(tex.Native().(texture.Native)))
|
framebuffer := C.GLuint(0)
|
||||||
|
tex.CreateFramebuffer(func(native interface{}) {
|
||||||
|
framebuffer =
|
||||||
|
createFramebuffer(C.GLuint(native.(texture.Native)))
|
||||||
|
})
|
||||||
return rendertarget.NewWithFramebuffer(tex, Framebuffer(framebuffer)), nil
|
return rendertarget.NewWithFramebuffer(tex, Framebuffer(framebuffer)), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewRenderTargetWithFramebuffer(width, height int, framebuffer Framebuffer) (*rendertarget.RenderTarget, error) {
|
func NewWithFramebuffer(width, height int, framebuffer Framebuffer,
|
||||||
tex, err := texture.New(width, height)
|
filter texture.Filter) (*rendertarget.RenderTarget, error) {
|
||||||
|
tex, err := texture.New(width, height, filter)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,15 @@ import (
|
|||||||
|
|
||||||
type Native C.GLuint
|
type Native C.GLuint
|
||||||
|
|
||||||
func createNativeTexture(textureWidth, textureHeight int, pixels []uint8) Native {
|
type Filter int
|
||||||
|
|
||||||
|
const (
|
||||||
|
FilterLinear = iota
|
||||||
|
FilterNearest
|
||||||
|
)
|
||||||
|
|
||||||
|
func createNativeTexture(textureWidth, textureHeight int, pixels []uint8,
|
||||||
|
filter Filter) Native {
|
||||||
nativeTexture := C.GLuint(0)
|
nativeTexture := C.GLuint(0)
|
||||||
|
|
||||||
C.glGenTextures(1, (*C.GLuint)(&nativeTexture))
|
C.glGenTextures(1, (*C.GLuint)(&nativeTexture))
|
||||||
@ -23,8 +31,17 @@ func createNativeTexture(textureWidth, textureHeight int, pixels []uint8) Native
|
|||||||
C.glBindTexture(C.GL_TEXTURE_2D, C.GLuint(nativeTexture))
|
C.glBindTexture(C.GL_TEXTURE_2D, C.GLuint(nativeTexture))
|
||||||
defer C.glBindTexture(C.GL_TEXTURE_2D, 0)
|
defer C.glBindTexture(C.GL_TEXTURE_2D, 0)
|
||||||
|
|
||||||
C.glTexParameteri(C.GL_TEXTURE_2D, C.GL_TEXTURE_MAG_FILTER, C.GL_LINEAR)
|
glFilter := C.GLint(0)
|
||||||
C.glTexParameteri(C.GL_TEXTURE_2D, C.GL_TEXTURE_MIN_FILTER, C.GL_LINEAR)
|
switch filter {
|
||||||
|
case FilterLinear:
|
||||||
|
glFilter = C.GL_LINEAR
|
||||||
|
case FilterNearest:
|
||||||
|
glFilter = C.GL_NEAREST
|
||||||
|
default:
|
||||||
|
panic("not reached")
|
||||||
|
}
|
||||||
|
C.glTexParameteri(C.GL_TEXTURE_2D, C.GL_TEXTURE_MAG_FILTER, glFilter)
|
||||||
|
C.glTexParameteri(C.GL_TEXTURE_2D, C.GL_TEXTURE_MIN_FILTER, glFilter)
|
||||||
|
|
||||||
ptr := unsafe.Pointer(nil)
|
ptr := unsafe.Pointer(nil)
|
||||||
if pixels != nil {
|
if pixels != nil {
|
||||||
@ -37,17 +54,20 @@ func createNativeTexture(textureWidth, textureHeight int, pixels []uint8) Native
|
|||||||
return Native(nativeTexture)
|
return Native(nativeTexture)
|
||||||
}
|
}
|
||||||
|
|
||||||
func create(textureWidth, textureHeight int) (interface{}, error) {
|
func create(textureWidth, textureHeight int, filter Filter) (interface{}, error) {
|
||||||
return createNativeTexture(textureWidth, textureHeight, nil), nil
|
return createNativeTexture(textureWidth, textureHeight, nil, filter), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func createFromImage(img *image.NRGBA) (interface{}, error) {
|
func createFromImage(img *image.NRGBA) (interface{}, error) {
|
||||||
size := img.Bounds().Size()
|
size := img.Bounds().Size()
|
||||||
return createNativeTexture(size.X, size.Y, img.Pix), nil
|
return createNativeTexture(size.X, size.Y, img.Pix, FilterLinear), nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(width, height int) (*gtexture.Texture, error) {
|
func New(width, height int, filter Filter) (*gtexture.Texture, error) {
|
||||||
return gtexture.New(width, height, create)
|
f := func(textureWidth, textureHeight int) (interface{}, error) {
|
||||||
|
return create(textureWidth, textureHeight, filter)
|
||||||
|
}
|
||||||
|
return gtexture.New(width, height, f)
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFromImage(img image.Image) (*gtexture.Texture, error) {
|
func NewFromImage(img image.Image) (*gtexture.Texture, error) {
|
||||||
|
@ -21,11 +21,10 @@ func (renderTarget *RenderTarget) Texture() *texture.Texture {
|
|||||||
return renderTarget.texture
|
return renderTarget.texture
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Remove this
|
|
||||||
func (renderTarget *RenderTarget) Framebuffer() interface{} {
|
|
||||||
return renderTarget.framebuffer
|
|
||||||
}
|
|
||||||
|
|
||||||
func (renderTarget *RenderTarget) SetAsViewport(setter func(x, y, width, height int)) {
|
func (renderTarget *RenderTarget) SetAsViewport(setter func(x, y, width, height int)) {
|
||||||
renderTarget.texture.SetAsViewport(setter)
|
renderTarget.texture.SetAsViewport(setter)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (renderTarget *RenderTarget) SetAsOffscreen(setter func(framebuffer interface{})) {
|
||||||
|
setter(renderTarget.framebuffer)
|
||||||
|
}
|
||||||
|
@ -23,20 +23,23 @@ type Texture struct {
|
|||||||
height int
|
height int
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(width, height int, create func(textureWidth, textureHeight int) (interface{}, error)) (*Texture, error) {
|
func New(width, height int, create func(textureWidth, textureHeight int) (
|
||||||
|
interface{}, error)) (*Texture, error) {
|
||||||
texture := &Texture{
|
texture := &Texture{
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
}
|
}
|
||||||
var err error
|
var err error
|
||||||
texture.native, err = create(texture.textureWidth(), texture.textureHeight())
|
texture.native, err = create(texture.textureWidth(),
|
||||||
|
texture.textureHeight())
|
||||||
if err != nil {
|
if err != nil {
|
||||||
return nil, err
|
return nil, err
|
||||||
}
|
}
|
||||||
return texture, nil
|
return texture, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewFromImage(img image.Image, create func(img *image.NRGBA) (interface{}, error)) (*Texture, error) {
|
func NewFromImage(img image.Image, create func(img *image.NRGBA) (
|
||||||
|
interface{}, error)) (*Texture, error) {
|
||||||
size := img.Bounds().Size()
|
size := img.Bounds().Size()
|
||||||
width, height := size.X, size.Y
|
width, height := size.X, size.Y
|
||||||
texture := &Texture{
|
texture := &Texture{
|
||||||
@ -69,11 +72,6 @@ func (texture *Texture) textureHeight() int {
|
|||||||
return int(nextPowerOf2(uint64(texture.height)))
|
return int(nextPowerOf2(uint64(texture.height)))
|
||||||
}
|
}
|
||||||
|
|
||||||
// TODO: Remove this
|
|
||||||
func (texture *Texture) Native() interface{} {
|
|
||||||
return texture.native
|
|
||||||
}
|
|
||||||
|
|
||||||
func (texture *Texture) u(x int) float32 {
|
func (texture *Texture) u(x int) float32 {
|
||||||
return float32(x) / float32(texture.textureWidth())
|
return float32(x) / float32(texture.textureWidth())
|
||||||
}
|
}
|
||||||
@ -110,7 +108,8 @@ func (texture *Texture) Draw(draw func(native interface{}, quads []Quad)) {
|
|||||||
draw(texture.native, []Quad{quad})
|
draw(texture.native, []Quad{quad})
|
||||||
}
|
}
|
||||||
|
|
||||||
func (texture *Texture) DrawParts(parts []graphics.TexturePart, draw func(native interface{}, quads []Quad)) {
|
func (texture *Texture) DrawParts(parts []graphics.TexturePart,
|
||||||
|
draw func(native interface{}, quads []Quad)) {
|
||||||
quads := []Quad{}
|
quads := []Quad{}
|
||||||
for _, part := range parts {
|
for _, part := range parts {
|
||||||
x1 := float32(part.LocationX)
|
x1 := float32(part.LocationX)
|
||||||
@ -126,3 +125,7 @@ func (texture *Texture) DrawParts(parts []graphics.TexturePart, draw func(native
|
|||||||
}
|
}
|
||||||
draw(texture.native, quads)
|
draw(texture.native, quads)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func (texture *Texture) CreateFramebuffer(create func(native interface{})) {
|
||||||
|
create(texture.native)
|
||||||
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user