From 49bcf8bb322d0f9e4c90e75b7f7a8191ef76f0c2 Mon Sep 17 00:00:00 2001 From: Hajime Hoshi Date: Thu, 18 Dec 2014 22:24:27 +0900 Subject: [PATCH] Remove Drawer; Add GraphicsContext.DrawTexture --- ebitenutil/debugprint.go | 2 +- example/blocks/blocks/font.go | 2 +- example/blocks/blocks/piece.go | 2 +- example/blocks/blocks/scenemanager.go | 4 ++-- example/blocks/blocks/titlescene.go | 4 ++-- example/paint/main.go | 4 ++-- example/perspective/main.go | 2 +- graphics.go | 27 +++++++---------------- graphicscontext.go | 21 ++++-------------- syncgraphicscontext.go | 31 ++------------------------- 10 files changed, 24 insertions(+), 75 deletions(-) diff --git a/ebitenutil/debugprint.go b/ebitenutil/debugprint.go index 8aaf62c36..5deaa28d1 100644 --- a/ebitenutil/debugprint.go +++ b/ebitenutil/debugprint.go @@ -57,7 +57,7 @@ func (d *debugPrintState) drawText(gr ebiten.GraphicsContext, str string, x, y i geom.Concat(ebiten.TranslateGeometry(float64(x)+1, float64(y))) clrm := ebiten.ColorMatrixI() clrm.Concat(ebiten.ScaleColor(clr)) - gr.Texture(d.textTexture).Draw(parts, geom, clrm) + gr.DrawTexture(d.textTexture, parts, geom, clrm) } func (d *debugPrintState) DebugPrint(gr ebiten.GraphicsContext, str string) { diff --git a/example/blocks/blocks/font.go b/example/blocks/blocks/font.go index 768ad687c..6e8d4f8d4 100644 --- a/example/blocks/blocks/font.go +++ b/example/blocks/blocks/font.go @@ -58,7 +58,7 @@ func drawText(context ebiten.GraphicsContext, textures *Textures, str string, x, geoMat.Concat(ebiten.TranslateGeometry(float64(x), float64(y))) clrMat := ebiten.ColorMatrixI() clrMat.Concat(ebiten.ScaleColor(clr)) - context.Texture(fontTextureId).Draw(parts, geoMat, clrMat) + context.DrawTexture(fontTextureId, parts, geoMat, clrMat) } func drawTextWithShadow(context ebiten.GraphicsContext, textures *Textures, str string, x, y, scale int, clr color.Color) { diff --git a/example/blocks/blocks/piece.go b/example/blocks/blocks/piece.go index 6c793bb17..cff612387 100644 --- a/example/blocks/blocks/piece.go +++ b/example/blocks/blocks/piece.go @@ -153,7 +153,7 @@ func drawBlocks(context ebiten.GraphicsContext, textures *Textures, blocks [][]B } } blocksTexture := textures.GetTexture("blocks") - context.Texture(blocksTexture).Draw(parts, geo, ebiten.ColorMatrixI()) + context.DrawTexture(blocksTexture, parts, geo, ebiten.ColorMatrixI()) } func (p *Piece) InitialPosition() (int, int) { diff --git a/example/blocks/blocks/scenemanager.go b/example/blocks/blocks/scenemanager.go index 9f3283079..14fdba063 100644 --- a/example/blocks/blocks/scenemanager.go +++ b/example/blocks/blocks/scenemanager.go @@ -78,11 +78,11 @@ func (s *SceneManager) Draw(context ebiten.GraphicsContext, textures *Textures) context.PopRenderTarget() color := ebiten.ColorMatrixI() - ebiten.DrawWholeRenderTarget(context, from, ebiten.GeometryMatrixI(), color) + ebiten.DrawWholeTexture(context, from.Texture(), ebiten.GeometryMatrixI(), color) alpha := float64(s.transitionCount) / float64(transitionMaxCount) color.Elements[3][3] = alpha - ebiten.DrawWholeRenderTarget(context, to, ebiten.GeometryMatrixI(), color) + ebiten.DrawWholeTexture(context, to.Texture(), ebiten.GeometryMatrixI(), color) } func (s *SceneManager) GoTo(scene Scene) { diff --git a/example/blocks/blocks/titlescene.go b/example/blocks/blocks/titlescene.go index 30264968a..224d751ab 100644 --- a/example/blocks/blocks/titlescene.go +++ b/example/blocks/blocks/titlescene.go @@ -54,7 +54,7 @@ func drawTitleBackground(context ebiten.GraphicsContext, textures *Textures, c i const textureWidth = 32 const textureHeight = 32 - backgroundTextureId := textures.GetTexture("background") + backgroundTexture := textures.GetTexture("background") parts := []ebiten.TexturePart{} for j := -1; j < ScreenHeight/textureHeight+1; j++ { for i := 0; i < ScreenWidth/textureWidth+1; i++ { @@ -70,7 +70,7 @@ func drawTitleBackground(context ebiten.GraphicsContext, textures *Textures, c i geo := ebiten.GeometryMatrixI() geo.Concat(ebiten.TranslateGeometry(float64(dx), float64(dy))) clr := ebiten.ColorMatrixI() - context.Texture(backgroundTextureId).Draw(parts, geo, clr) + context.DrawTexture(backgroundTexture, parts, geo, clr) } func drawLogo(context ebiten.GraphicsContext, textures *Textures, str string) { diff --git a/example/paint/main.go b/example/paint/main.go index a4d22257c..eaf7030a8 100644 --- a/example/paint/main.go +++ b/example/paint/main.go @@ -59,11 +59,11 @@ func (g *Game) Update(gr ebiten.GraphicsContext) error { clr := ebiten.ScaleColor(color.RGBA{0xff, 0x40, 0x40, 0xff}) theta := 2.0 * math.Pi * float64(g.count%60) / 60.0 clr.Concat(ebiten.RotateHue(theta)) - ebiten.DrawWholeRenderTarget(gr, g.brushRenderTarget, geo, clr) + ebiten.DrawWholeTexture(gr, g.brushRenderTarget.Texture(), geo, clr) gr.PopRenderTarget() } - ebiten.DrawWholeRenderTarget(gr, g.canvasRenderTarget, ebiten.GeometryMatrixI(), ebiten.ColorMatrixI()) + ebiten.DrawWholeTexture(gr, g.canvasRenderTarget.Texture(), ebiten.GeometryMatrixI(), ebiten.ColorMatrixI()) ebitenutil.DebugPrint(gr, fmt.Sprintf("(%d, %d)", mx, my)) return nil diff --git a/example/perspective/main.go b/example/perspective/main.go index 1d0b8c542..908c263bc 100644 --- a/example/perspective/main.go +++ b/example/perspective/main.go @@ -48,7 +48,7 @@ func (g *Game) Update(gr ebiten.GraphicsContext) error { geo := ebiten.TranslateGeometry(-maxWidth/2, -float64(h)/2) geo.Concat(ebiten.ScaleGeometry(0.4, 0.4)) geo.Concat(ebiten.TranslateGeometry(screenWidth/2, screenHeight/2)) - gr.Texture(g.gophersTexture).Draw(parts, geo, ebiten.ColorMatrixI()) + gr.DrawTexture(g.gophersTexture, parts, geo, ebiten.ColorMatrixI()) return nil } diff --git a/graphics.go b/graphics.go index d40ba9ec4..b2ab9ba1b 100644 --- a/graphics.go +++ b/graphics.go @@ -35,42 +35,26 @@ type TexturePart struct { Src Rect } -// A Drawer is the interface that draws itself. -type Drawer interface { - Draw(parts []TexturePart, geo GeometryMatrix, color ColorMatrix) error -} - // DrawWholeTexture draws the whole texture. func DrawWholeTexture(g GraphicsContext, texture *Texture, geo GeometryMatrix, color ColorMatrix) error { w, h := texture.Size() parts := []TexturePart{ {Rect{0, 0, float64(w), float64(h)}, Rect{0, 0, float64(w), float64(h)}}, } - return g.Texture(texture).Draw(parts, geo, color) -} - -// DrawWholeRenderTarget draws the whole render target. -func DrawWholeRenderTarget(g GraphicsContext, renderTarget *RenderTarget, geo GeometryMatrix, color ColorMatrix) error { - w, h := renderTarget.Size() - parts := []TexturePart{ - {Rect{0, 0, float64(w), float64(h)}, Rect{0, 0, float64(w), float64(h)}}, - } - return g.RenderTarget(renderTarget).Draw(parts, geo, color) + return g.DrawTexture(texture, parts, geo, color) } // A GraphicsContext is the interface that means a context of rendering. type GraphicsContext interface { Clear() error Fill(r, g, b uint8) error - Texture(texture *Texture) Drawer - RenderTarget(id *RenderTarget) Drawer + DrawTexture(texture *Texture, parts []TexturePart, geo GeometryMatrix, color ColorMatrix) error // TODO: ScreenRenderTarget() Drawer PushRenderTarget(id *RenderTarget) PopRenderTarget() } -// Filter represents the type of filter to be used when a texture or a render -// target is maginified or minified. +// Filter represents the type of filter to be used when a texture is maginified or minified. type Filter int // Filters @@ -97,6 +81,11 @@ type RenderTarget struct { texture *Texture } +// Texture returns the texture of the render target. +func (r *RenderTarget) Texture() *Texture { + return r.texture +} + // Size returns the size of the render target. func (r *RenderTarget) Size() (width int, height int) { return r.glRenderTarget.Width(), r.glRenderTarget.Height() diff --git a/graphicscontext.go b/graphicscontext.go index 348778399..1d22179ec 100644 --- a/graphicscontext.go +++ b/graphicscontext.go @@ -73,12 +73,9 @@ func (c *graphicsContext) Fill(r, g, b uint8) error { return idsInstance.fillRenderTarget(c.currents[len(c.currents)-1], r, g, b) } -func (c *graphicsContext) Texture(texture *Texture) Drawer { - return &textureWithContext{texture, c} -} - -func (c *graphicsContext) RenderTarget(renderTarget *RenderTarget) Drawer { - return &textureWithContext{renderTarget.texture, c} +func (c *graphicsContext) DrawTexture(texture *Texture, parts []TexturePart, geo GeometryMatrix, color ColorMatrix) error { + current := c.currents[len(c.currents)-1] + return idsInstance.drawTexture(current, texture, parts, geo, color) } func (c *graphicsContext) PushRenderTarget(renderTarget *RenderTarget) { @@ -103,17 +100,7 @@ func (c *graphicsContext) postUpdate() { scale := float64(c.screenScale) geo := GeometryMatrixI() geo.Concat(ScaleGeometry(scale, scale)) - DrawWholeRenderTarget(c, c.screen, geo, ColorMatrixI()) + DrawWholeTexture(c, c.screen.texture, geo, ColorMatrixI()) gl.Flush() } - -type textureWithContext struct { - texture *Texture - context *graphicsContext -} - -func (t *textureWithContext) Draw(parts []TexturePart, geo GeometryMatrix, color ColorMatrix) error { - current := t.context.currents[len(t.context.currents)-1] - return idsInstance.drawTexture(current, t.texture, parts, geo, color) -} diff --git a/syncgraphicscontext.go b/syncgraphicscontext.go index 2584850d5..022f8d1f5 100644 --- a/syncgraphicscontext.go +++ b/syncgraphicscontext.go @@ -41,22 +41,9 @@ func (c *syncGraphicsContext) Fill(r, g, b uint8) (err error) { return } -func (c *syncGraphicsContext) Texture(texture *Texture) (d Drawer) { +func (c *syncGraphicsContext) DrawTexture(texture *Texture, parts []TexturePart, geo GeometryMatrix, color ColorMatrix) (err error) { c.syncer.Sync(func() { - d = &drawer{ - syncer: c.syncer, - innerDrawer: c.innerGraphicsContext.Texture(texture), - } - }) - return -} - -func (c *syncGraphicsContext) RenderTarget(renderTarget *RenderTarget) (d Drawer) { - c.syncer.Sync(func() { - d = &drawer{ - syncer: c.syncer, - innerDrawer: c.innerGraphicsContext.RenderTarget(renderTarget), - } + err = c.innerGraphicsContext.DrawTexture(texture, parts, geo, color) }) return } @@ -72,17 +59,3 @@ func (c *syncGraphicsContext) PushRenderTarget(renderTarget *RenderTarget) { c.innerGraphicsContext.PushRenderTarget(renderTarget) }) } - -type drawer struct { - syncer syncer - innerDrawer Drawer -} - -var _ Drawer = new(drawer) - -func (d *drawer) Draw(parts []TexturePart, geo GeometryMatrix, color ColorMatrix) (err error) { - d.syncer.Sync(func() { - err = d.innerDrawer.Draw(parts, geo, color) - }) - return -}