mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 11:18:54 +01:00
Swap the order of the dependencies 'buffered and 'mipmap'
This commit is contained in:
parent
71aec36ef3
commit
d017a1b95e
66
image.go
66
image.go
@ -19,9 +19,9 @@ import (
|
|||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
|
|
||||||
"github.com/hajimehoshi/ebiten/internal/buffered"
|
|
||||||
"github.com/hajimehoshi/ebiten/internal/driver"
|
"github.com/hajimehoshi/ebiten/internal/driver"
|
||||||
"github.com/hajimehoshi/ebiten/internal/graphics"
|
"github.com/hajimehoshi/ebiten/internal/graphics"
|
||||||
|
"github.com/hajimehoshi/ebiten/internal/mipmap"
|
||||||
)
|
)
|
||||||
|
|
||||||
// Image represents a rectangle set of pixels.
|
// Image represents a rectangle set of pixels.
|
||||||
@ -34,7 +34,7 @@ type Image struct {
|
|||||||
// See strings.Builder for similar examples.
|
// See strings.Builder for similar examples.
|
||||||
addr *Image
|
addr *Image
|
||||||
|
|
||||||
buffered *buffered.Image
|
mipmap *mipmap.Mipmap
|
||||||
|
|
||||||
bounds image.Rectangle
|
bounds image.Rectangle
|
||||||
original *Image
|
original *Image
|
||||||
@ -55,7 +55,7 @@ func (i *Image) Size() (width, height int) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (i *Image) isDisposed() bool {
|
func (i *Image) isDisposed() bool {
|
||||||
return i.buffered == nil
|
return i.mipmap == nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *Image) isSubImage() bool {
|
func (i *Image) isSubImage() bool {
|
||||||
@ -89,7 +89,7 @@ func (i *Image) Fill(clr color.Color) error {
|
|||||||
panic("ebiten: rendering to a sub-image is not implemented (Fill)")
|
panic("ebiten: rendering to a sub-image is not implemented (Fill)")
|
||||||
}
|
}
|
||||||
|
|
||||||
i.buffered.Fill(color.RGBAModel.Convert(clr).(color.RGBA))
|
i.mipmap.Fill(color.RGBAModel.Convert(clr).(color.RGBA))
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -257,13 +257,13 @@ func (i *Image) DrawImage(img *Image, options *DrawImageOptions) error {
|
|||||||
vs := graphics.QuadVertices(sx0, sy0, sx1, sy1, a, b, c, d, tx, ty, 1, 1, 1, 1, filter == driver.FilterScreen)
|
vs := graphics.QuadVertices(sx0, sy0, sx1, sy1, a, b, c, d, tx, ty, 1, 1, 1, 1, filter == driver.FilterScreen)
|
||||||
is := graphics.QuadIndices()
|
is := graphics.QuadIndices()
|
||||||
|
|
||||||
srcs := [graphics.ShaderImageNum]*buffered.Image{img.buffered}
|
srcs := [graphics.ShaderImageNum]*mipmap.Mipmap{img.mipmap}
|
||||||
if options.Shader == nil {
|
if options.Shader == nil {
|
||||||
i.buffered.DrawTriangles(srcs, vs, is, options.ColorM.impl, mode, filter, driver.AddressUnsafe, driver.Region{}, nil, nil)
|
i.mipmap.DrawTriangles(srcs, vs, is, options.ColorM.impl, mode, filter, driver.AddressUnsafe, driver.Region{}, nil, nil)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
i.buffered.DrawTriangles(srcs, vs, is, nil, mode, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, options.Shader.shader, options.Uniforms)
|
i.mipmap.DrawTriangles(srcs, vs, is, nil, mode, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, options.Shader.shader, options.Uniforms)
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -418,16 +418,16 @@ func (i *Image) DrawTriangles(vertices []Vertex, indices []uint16, img *Image, o
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var srcs [graphics.ShaderImageNum]*buffered.Image
|
var srcs [graphics.ShaderImageNum]*mipmap.Mipmap
|
||||||
if img != nil {
|
if img != nil {
|
||||||
srcs[0] = img.buffered
|
srcs[0] = img.mipmap
|
||||||
}
|
}
|
||||||
|
|
||||||
if options.Shader == nil {
|
if options.Shader == nil {
|
||||||
i.buffered.DrawTriangles(srcs, vs, is, options.ColorM.impl, mode, filter, driver.Address(options.Address), sr, nil, nil)
|
i.mipmap.DrawTriangles(srcs, vs, is, options.ColorM.impl, mode, filter, driver.Address(options.Address), sr, nil, nil)
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
i.buffered.DrawTriangles(srcs, vs, is, nil, mode, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, options.Shader.shader, options.Uniforms)
|
i.mipmap.DrawTriangles(srcs, vs, is, nil, mode, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, options.Shader.shader, options.Uniforms)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DrawRectShaderOptions represents options for DrawRectShader
|
// DrawRectShaderOptions represents options for DrawRectShader
|
||||||
@ -482,7 +482,7 @@ func (i *Image) DrawRectShader(width, height int, shader *Shader, options *DrawR
|
|||||||
|
|
||||||
mode := driver.CompositeMode(options.CompositeMode)
|
mode := driver.CompositeMode(options.CompositeMode)
|
||||||
|
|
||||||
var imgs [graphics.ShaderImageNum]*buffered.Image
|
var imgs [graphics.ShaderImageNum]*mipmap.Mipmap
|
||||||
for i, img := range options.Images {
|
for i, img := range options.Images {
|
||||||
if img == nil {
|
if img == nil {
|
||||||
continue
|
continue
|
||||||
@ -497,14 +497,14 @@ func (i *Image) DrawRectShader(width, height int, shader *Shader, options *DrawR
|
|||||||
if w, h := img.Size(); width != w || height != h {
|
if w, h := img.Size(); width != w || height != h {
|
||||||
panic("ebiten: all the source images must be the same size with the rectangle")
|
panic("ebiten: all the source images must be the same size with the rectangle")
|
||||||
}
|
}
|
||||||
imgs[i] = img.buffered
|
imgs[i] = img.mipmap
|
||||||
}
|
}
|
||||||
|
|
||||||
a, b, c, d, tx, ty := options.GeoM.elements32()
|
a, b, c, d, tx, ty := options.GeoM.elements32()
|
||||||
vs := graphics.QuadVertices(0, 0, float32(width), float32(height), a, b, c, d, tx, ty, 1, 1, 1, 1, false)
|
vs := graphics.QuadVertices(0, 0, float32(width), float32(height), a, b, c, d, tx, ty, 1, 1, 1, 1, false)
|
||||||
is := graphics.QuadIndices()
|
is := graphics.QuadIndices()
|
||||||
|
|
||||||
i.buffered.DrawTriangles(imgs, vs, is, nil, mode, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, shader.shader, options.Uniforms)
|
i.mipmap.DrawTriangles(imgs, vs, is, nil, mode, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, shader.shader, options.Uniforms)
|
||||||
}
|
}
|
||||||
|
|
||||||
// DrawTrianglesShaderOptions represents options for DrawTrianglesShader
|
// DrawTrianglesShaderOptions represents options for DrawTrianglesShader
|
||||||
@ -566,7 +566,7 @@ func (i *Image) DrawTrianglesShader(vertices []Vertex, indices []uint16, shader
|
|||||||
mode := driver.CompositeMode(options.CompositeMode)
|
mode := driver.CompositeMode(options.CompositeMode)
|
||||||
|
|
||||||
var imgw, imgh int
|
var imgw, imgh int
|
||||||
var imgs [graphics.ShaderImageNum]*buffered.Image
|
var imgs [graphics.ShaderImageNum]*mipmap.Mipmap
|
||||||
for i, img := range options.Images {
|
for i, img := range options.Images {
|
||||||
if img == nil {
|
if img == nil {
|
||||||
continue
|
continue
|
||||||
@ -583,7 +583,7 @@ func (i *Image) DrawTrianglesShader(vertices []Vertex, indices []uint16, shader
|
|||||||
} else if w, h := img.Size(); imgw != w || imgh != h {
|
} else if w, h := img.Size(); imgw != w || imgh != h {
|
||||||
panic("ebiten: all the source images must be the same size")
|
panic("ebiten: all the source images must be the same size")
|
||||||
}
|
}
|
||||||
imgs[i] = img.buffered
|
imgs[i] = img.mipmap
|
||||||
}
|
}
|
||||||
|
|
||||||
vs := make([]float32, len(vertices)*graphics.VertexFloatNum)
|
vs := make([]float32, len(vertices)*graphics.VertexFloatNum)
|
||||||
@ -600,7 +600,7 @@ func (i *Image) DrawTrianglesShader(vertices []Vertex, indices []uint16, shader
|
|||||||
is := make([]uint16, len(indices))
|
is := make([]uint16, len(indices))
|
||||||
copy(is, indices)
|
copy(is, indices)
|
||||||
|
|
||||||
i.buffered.DrawTriangles(imgs, vs, is, nil, mode, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, shader.shader, options.Uniforms)
|
i.mipmap.DrawTriangles(imgs, vs, is, nil, mode, driver.FilterNearest, driver.AddressUnsafe, driver.Region{}, shader.shader, options.Uniforms)
|
||||||
}
|
}
|
||||||
|
|
||||||
// SubImage returns an image representing the portion of the image p visible through r.
|
// SubImage returns an image representing the portion of the image p visible through r.
|
||||||
@ -630,7 +630,7 @@ func (i *Image) SubImage(r image.Rectangle) image.Image {
|
|||||||
}
|
}
|
||||||
|
|
||||||
img := &Image{
|
img := &Image{
|
||||||
buffered: i.buffered,
|
mipmap: i.mipmap,
|
||||||
filter: i.filter,
|
filter: i.filter,
|
||||||
bounds: r,
|
bounds: r,
|
||||||
original: orig,
|
original: orig,
|
||||||
@ -670,7 +670,7 @@ func (i *Image) At(x, y int) color.Color {
|
|||||||
if !image.Pt(x, y).In(i.Bounds()) {
|
if !image.Pt(x, y).In(i.Bounds()) {
|
||||||
return color.RGBA{}
|
return color.RGBA{}
|
||||||
}
|
}
|
||||||
pix, err := i.buffered.Pixels(x, y, 1, 1)
|
pix, err := i.mipmap.Pixels(x, y, 1, 1)
|
||||||
if err != nil {
|
if err != nil {
|
||||||
theUIContext.setError(err)
|
theUIContext.setError(err)
|
||||||
return color.RGBA{}
|
return color.RGBA{}
|
||||||
@ -699,7 +699,7 @@ func (i *Image) Set(x, y int, clr color.Color) {
|
|||||||
|
|
||||||
r, g, b, a := clr.RGBA()
|
r, g, b, a := clr.RGBA()
|
||||||
pix := []byte{byte(r >> 8), byte(g >> 8), byte(b >> 8), byte(a >> 8)}
|
pix := []byte{byte(r >> 8), byte(g >> 8), byte(b >> 8), byte(a >> 8)}
|
||||||
if err := i.buffered.ReplacePixels(pix, x, y, 1, 1); err != nil {
|
if err := i.mipmap.ReplacePixels(pix, x, y, 1, 1); err != nil {
|
||||||
theUIContext.setError(err)
|
theUIContext.setError(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -722,8 +722,8 @@ func (i *Image) Dispose() error {
|
|||||||
if i.isSubImage() {
|
if i.isSubImage() {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
i.buffered.MarkDisposed()
|
i.mipmap.MarkDisposed()
|
||||||
i.buffered = nil
|
i.mipmap = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -748,9 +748,9 @@ func (i *Image) ReplacePixels(pixels []byte) error {
|
|||||||
r := i.Bounds()
|
r := i.Bounds()
|
||||||
|
|
||||||
// Do not need to copy pixels here.
|
// Do not need to copy pixels here.
|
||||||
// * In internal/buffered, pixels are copied when necessary.
|
// * In internal/mipmap, pixels are copied when necessary.
|
||||||
// * In internal/shareable, pixels are copied to make its paddings.
|
// * In internal/shareable, pixels are copied to make its paddings.
|
||||||
if err := i.buffered.ReplacePixels(pixels, r.Min.X, r.Min.Y, r.Dx(), r.Dy()); err != nil {
|
if err := i.mipmap.ReplacePixels(pixels, r.Min.X, r.Min.Y, r.Dx(), r.Dy()); err != nil {
|
||||||
theUIContext.setError(err)
|
theUIContext.setError(err)
|
||||||
}
|
}
|
||||||
return nil
|
return nil
|
||||||
@ -770,9 +770,9 @@ func NewImage(width, height int, filter Filter) (*Image, error) {
|
|||||||
|
|
||||||
func newImage(width, height int, filter Filter, volatile bool) *Image {
|
func newImage(width, height int, filter Filter, volatile bool) *Image {
|
||||||
i := &Image{
|
i := &Image{
|
||||||
buffered: buffered.NewImage(width, height, volatile),
|
mipmap: mipmap.New(width, height, volatile),
|
||||||
filter: filter,
|
filter: filter,
|
||||||
bounds: image.Rect(0, 0, width, height),
|
bounds: image.Rect(0, 0, width, height),
|
||||||
}
|
}
|
||||||
i.addr = i
|
i.addr = i
|
||||||
return i
|
return i
|
||||||
@ -792,9 +792,9 @@ func NewImageFromImage(source image.Image, filter Filter) (*Image, error) {
|
|||||||
width, height := size.X, size.Y
|
width, height := size.X, size.Y
|
||||||
|
|
||||||
i := &Image{
|
i := &Image{
|
||||||
buffered: buffered.NewImage(width, height, false),
|
mipmap: mipmap.New(width, height, false),
|
||||||
filter: filter,
|
filter: filter,
|
||||||
bounds: image.Rect(0, 0, width, height),
|
bounds: image.Rect(0, 0, width, height),
|
||||||
}
|
}
|
||||||
i.addr = i
|
i.addr = i
|
||||||
|
|
||||||
@ -804,9 +804,9 @@ func NewImageFromImage(source image.Image, filter Filter) (*Image, error) {
|
|||||||
|
|
||||||
func newScreenFramebufferImage(width, height int) *Image {
|
func newScreenFramebufferImage(width, height int) *Image {
|
||||||
i := &Image{
|
i := &Image{
|
||||||
buffered: buffered.NewScreenFramebufferImage(width, height),
|
mipmap: mipmap.NewScreenFramebufferMipmap(width, height),
|
||||||
filter: FilterDefault,
|
filter: FilterDefault,
|
||||||
bounds: image.Rect(0, 0, width, height),
|
bounds: image.Rect(0, 0, width, height),
|
||||||
}
|
}
|
||||||
i.addr = i
|
i.addr = i
|
||||||
return i
|
return i
|
||||||
|
@ -53,7 +53,7 @@ func takeScreenshot(screen *Image) error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
blackbg := !IsScreenTransparent()
|
blackbg := !IsScreenTransparent()
|
||||||
if err := screen.buffered.Dump(newname, blackbg); err != nil {
|
if err := screen.mipmap.Dump(newname, blackbg); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -22,12 +22,12 @@ import (
|
|||||||
"github.com/hajimehoshi/ebiten/internal/affine"
|
"github.com/hajimehoshi/ebiten/internal/affine"
|
||||||
"github.com/hajimehoshi/ebiten/internal/driver"
|
"github.com/hajimehoshi/ebiten/internal/driver"
|
||||||
"github.com/hajimehoshi/ebiten/internal/graphics"
|
"github.com/hajimehoshi/ebiten/internal/graphics"
|
||||||
"github.com/hajimehoshi/ebiten/internal/mipmap"
|
|
||||||
"github.com/hajimehoshi/ebiten/internal/shaderir"
|
"github.com/hajimehoshi/ebiten/internal/shaderir"
|
||||||
|
"github.com/hajimehoshi/ebiten/internal/shareable"
|
||||||
)
|
)
|
||||||
|
|
||||||
type Image struct {
|
type Image struct {
|
||||||
img *mipmap.Mipmap
|
img *shareable.Image
|
||||||
width int
|
width int
|
||||||
height int
|
height int
|
||||||
|
|
||||||
@ -39,14 +39,14 @@ type Image struct {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BeginFrame() error {
|
func BeginFrame() error {
|
||||||
if err := mipmap.BeginFrame(); err != nil {
|
if err := shareable.BeginFrame(); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
return flushDelayedCommands()
|
return flushDelayedCommands()
|
||||||
}
|
}
|
||||||
|
|
||||||
func EndFrame() error {
|
func EndFrame() error {
|
||||||
return mipmap.EndFrame()
|
return shareable.EndFrame()
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewImage(width, height int, volatile bool) *Image {
|
func NewImage(width, height int, volatile bool) *Image {
|
||||||
@ -64,7 +64,7 @@ func (i *Image) initialize(width, height int, volatile bool) {
|
|||||||
return
|
return
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
i.img = mipmap.New(width, height, volatile)
|
i.img = shareable.NewImage(width, height, volatile)
|
||||||
i.width = width
|
i.width = width
|
||||||
i.height = height
|
i.height = height
|
||||||
}
|
}
|
||||||
@ -85,7 +85,7 @@ func (i *Image) initializeAsScreenFramebuffer(width, height int) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
i.img = mipmap.NewScreenFramebufferMipmap(width, height)
|
i.img = shareable.NewScreenFramebufferImage(width, height)
|
||||||
i.width = width
|
i.width = width
|
||||||
i.height = height
|
i.height = height
|
||||||
}
|
}
|
||||||
@ -261,12 +261,12 @@ func (i *Image) DrawTriangles(srcs [graphics.ShaderImageNum]*Image, vertices []f
|
|||||||
}
|
}
|
||||||
i.resolvePendingPixels(false)
|
i.resolvePendingPixels(false)
|
||||||
|
|
||||||
var s *mipmap.Shader
|
var s *shareable.Shader
|
||||||
if shader != nil {
|
if shader != nil {
|
||||||
s = shader.shader
|
s = shader.shader
|
||||||
}
|
}
|
||||||
|
|
||||||
var imgs [graphics.ShaderImageNum]*mipmap.Mipmap
|
var imgs [graphics.ShaderImageNum]*shareable.Image
|
||||||
for i, img := range srcs {
|
for i, img := range srcs {
|
||||||
if img == nil {
|
if img == nil {
|
||||||
continue
|
continue
|
||||||
@ -279,12 +279,12 @@ func (i *Image) DrawTriangles(srcs [graphics.ShaderImageNum]*Image, vertices []f
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Shader struct {
|
type Shader struct {
|
||||||
shader *mipmap.Shader
|
shader *shareable.Shader
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewShader(program *shaderir.Program) *Shader {
|
func NewShader(program *shaderir.Program) *Shader {
|
||||||
return &Shader{
|
return &Shader{
|
||||||
shader: mipmap.NewShader(program),
|
shader: shareable.NewShader(program),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,10 +20,10 @@ import (
|
|||||||
"math"
|
"math"
|
||||||
|
|
||||||
"github.com/hajimehoshi/ebiten/internal/affine"
|
"github.com/hajimehoshi/ebiten/internal/affine"
|
||||||
|
"github.com/hajimehoshi/ebiten/internal/buffered"
|
||||||
"github.com/hajimehoshi/ebiten/internal/driver"
|
"github.com/hajimehoshi/ebiten/internal/driver"
|
||||||
"github.com/hajimehoshi/ebiten/internal/graphics"
|
"github.com/hajimehoshi/ebiten/internal/graphics"
|
||||||
"github.com/hajimehoshi/ebiten/internal/shaderir"
|
"github.com/hajimehoshi/ebiten/internal/shaderir"
|
||||||
"github.com/hajimehoshi/ebiten/internal/shareable"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var graphicsDriver driver.Graphics
|
var graphicsDriver driver.Graphics
|
||||||
@ -33,21 +33,21 @@ func SetGraphicsDriver(graphics driver.Graphics) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func BeginFrame() error {
|
func BeginFrame() error {
|
||||||
return shareable.BeginFrame()
|
return buffered.BeginFrame()
|
||||||
}
|
}
|
||||||
|
|
||||||
func EndFrame() error {
|
func EndFrame() error {
|
||||||
return shareable.EndFrame()
|
return buffered.EndFrame()
|
||||||
}
|
}
|
||||||
|
|
||||||
// Mipmap is a set of shareable.Image sorted by the order of mipmap level.
|
// Mipmap is a set of buffered.Image sorted by the order of mipmap level.
|
||||||
// The level 0 image is a regular image and higher-level images are used for mipmap.
|
// The level 0 image is a regular image and higher-level images are used for mipmap.
|
||||||
type Mipmap struct {
|
type Mipmap struct {
|
||||||
width int
|
width int
|
||||||
height int
|
height int
|
||||||
volatile bool
|
volatile bool
|
||||||
orig *shareable.Image
|
orig *buffered.Image
|
||||||
imgs map[int]*shareable.Image
|
imgs map[int]*buffered.Image
|
||||||
}
|
}
|
||||||
|
|
||||||
func New(width, height int, volatile bool) *Mipmap {
|
func New(width, height int, volatile bool) *Mipmap {
|
||||||
@ -55,8 +55,8 @@ func New(width, height int, volatile bool) *Mipmap {
|
|||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
volatile: volatile,
|
volatile: volatile,
|
||||||
orig: shareable.NewImage(width, height, volatile),
|
orig: buffered.NewImage(width, height, volatile),
|
||||||
imgs: map[int]*shareable.Image{},
|
imgs: map[int]*buffered.Image{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -64,8 +64,8 @@ func NewScreenFramebufferMipmap(width, height int) *Mipmap {
|
|||||||
return &Mipmap{
|
return &Mipmap{
|
||||||
width: width,
|
width: width,
|
||||||
height: height,
|
height: height,
|
||||||
orig: shareable.NewScreenFramebufferImage(width, height),
|
orig: buffered.NewScreenFramebufferImage(width, height),
|
||||||
imgs: map[int]*shareable.Image{},
|
imgs: map[int]*buffered.Image{},
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -78,9 +78,12 @@ func (m *Mipmap) Fill(clr color.RGBA) {
|
|||||||
m.disposeMipmaps()
|
m.disposeMipmaps()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Mipmap) ReplacePixels(pix []byte) {
|
func (m *Mipmap) ReplacePixels(pix []byte, x, y, width, height int) error {
|
||||||
m.orig.ReplacePixels(pix)
|
if err := m.orig.ReplacePixels(pix, x, y, width, height); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
m.disposeMipmaps()
|
m.disposeMipmaps()
|
||||||
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Mipmap) Pixels(x, y, width, height int) ([]byte, error) {
|
func (m *Mipmap) Pixels(x, y, width, height int) ([]byte, error) {
|
||||||
@ -134,12 +137,12 @@ func (m *Mipmap) DrawTriangles(srcs [graphics.ShaderImageNum]*Mipmap, vertices [
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
var s *shareable.Shader
|
var s *buffered.Shader
|
||||||
if shader != nil {
|
if shader != nil {
|
||||||
s = shader.shader
|
s = shader.shader
|
||||||
}
|
}
|
||||||
|
|
||||||
var imgs [graphics.ShaderImageNum]*shareable.Image
|
var imgs [graphics.ShaderImageNum]*buffered.Image
|
||||||
for i, src := range srcs {
|
for i, src := range srcs {
|
||||||
if src == nil {
|
if src == nil {
|
||||||
continue
|
continue
|
||||||
@ -163,7 +166,7 @@ func (m *Mipmap) DrawTriangles(srcs [graphics.ShaderImageNum]*Mipmap, vertices [
|
|||||||
m.disposeMipmaps()
|
m.disposeMipmaps()
|
||||||
}
|
}
|
||||||
|
|
||||||
func (m *Mipmap) level(level int) *shareable.Image {
|
func (m *Mipmap) level(level int) *buffered.Image {
|
||||||
if level == 0 {
|
if level == 0 {
|
||||||
panic("ebiten: level must be non-zero at level")
|
panic("ebiten: level must be non-zero at level")
|
||||||
}
|
}
|
||||||
@ -176,7 +179,7 @@ func (m *Mipmap) level(level int) *shareable.Image {
|
|||||||
return img
|
return img
|
||||||
}
|
}
|
||||||
|
|
||||||
var src *shareable.Image
|
var src *buffered.Image
|
||||||
var vs []float32
|
var vs []float32
|
||||||
var filter driver.Filter
|
var filter driver.Filter
|
||||||
switch {
|
switch {
|
||||||
@ -219,8 +222,8 @@ func (m *Mipmap) level(level int) *shareable.Image {
|
|||||||
m.imgs[level] = nil
|
m.imgs[level] = nil
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
s := shareable.NewImage(w2, h2, m.volatile)
|
s := buffered.NewImage(w2, h2, m.volatile)
|
||||||
s.DrawTriangles([graphics.ShaderImageNum]*shareable.Image{src}, vs, is, nil, driver.CompositeModeCopy, filter, driver.AddressUnsafe, driver.Region{}, nil, nil)
|
s.DrawTriangles([graphics.ShaderImageNum]*buffered.Image{src}, vs, is, nil, driver.CompositeModeCopy, filter, driver.AddressUnsafe, driver.Region{}, nil, nil)
|
||||||
m.imgs[level] = s
|
m.imgs[level] = s
|
||||||
|
|
||||||
return m.imgs[level]
|
return m.imgs[level]
|
||||||
@ -357,12 +360,12 @@ func pow2(power int) float32 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Shader struct {
|
type Shader struct {
|
||||||
shader *shareable.Shader
|
shader *buffered.Shader
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewShader(program *shaderir.Program) *Shader {
|
func NewShader(program *shaderir.Program) *Shader {
|
||||||
return &Shader{
|
return &Shader{
|
||||||
shader: shareable.NewShader(program),
|
shader: buffered.NewShader(program),
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -20,8 +20,8 @@ import (
|
|||||||
"go/parser"
|
"go/parser"
|
||||||
"go/token"
|
"go/token"
|
||||||
|
|
||||||
"github.com/hajimehoshi/ebiten/internal/buffered"
|
|
||||||
"github.com/hajimehoshi/ebiten/internal/graphics"
|
"github.com/hajimehoshi/ebiten/internal/graphics"
|
||||||
|
"github.com/hajimehoshi/ebiten/internal/mipmap"
|
||||||
"github.com/hajimehoshi/ebiten/internal/shader"
|
"github.com/hajimehoshi/ebiten/internal/shader"
|
||||||
)
|
)
|
||||||
|
|
||||||
@ -66,7 +66,7 @@ func texture%[1]dAt(pos vec2) vec4 {
|
|||||||
}
|
}
|
||||||
|
|
||||||
type Shader struct {
|
type Shader struct {
|
||||||
shader *buffered.Shader
|
shader *mipmap.Shader
|
||||||
}
|
}
|
||||||
|
|
||||||
func NewShader(src []byte) (*Shader, error) {
|
func NewShader(src []byte) (*Shader, error) {
|
||||||
@ -87,7 +87,7 @@ func NewShader(src []byte) (*Shader, error) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
return &Shader{
|
return &Shader{
|
||||||
shader: buffered.NewShader(s),
|
shader: mipmap.NewShader(s),
|
||||||
}, nil
|
}, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user