mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2024-12-25 19:28:57 +01:00
Refactoring: Hide some functions of opengl
This commit is contained in:
parent
501e51c554
commit
957b4d392f
@ -72,7 +72,5 @@ func (c *graphicsContext) postUpdate() error {
|
|||||||
if err := c.defaultR.drawImage(c.screen, options); err != nil {
|
if err := c.defaultR.drawImage(c.screen, options); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
opengl.Flush()
|
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
53
image.go
53
image.go
@ -17,7 +17,6 @@ package ebiten
|
|||||||
import (
|
import (
|
||||||
"github.com/hajimehoshi/ebiten/internal"
|
"github.com/hajimehoshi/ebiten/internal"
|
||||||
"github.com/hajimehoshi/ebiten/internal/opengl"
|
"github.com/hajimehoshi/ebiten/internal/opengl"
|
||||||
"github.com/hajimehoshi/ebiten/internal/opengl/internal/shader"
|
|
||||||
"image"
|
"image"
|
||||||
"image/color"
|
"image/color"
|
||||||
)
|
)
|
||||||
@ -44,12 +43,8 @@ func (i *innerImage) Clear() error {
|
|||||||
}
|
}
|
||||||
|
|
||||||
func (i *innerImage) Fill(clr color.Color) error {
|
func (i *innerImage) Fill(clr color.Color) error {
|
||||||
if err := i.framebuffer.SetAsViewport(); err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
r, g, b, a := internal.RGBA(clr)
|
r, g, b, a := internal.RGBA(clr)
|
||||||
opengl.Clear(r, g, b, a)
|
return i.framebuffer.Fill(r, g, b, a)
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func (i *innerImage) drawImage(img *innerImage, options *DrawImageOptions) error {
|
func (i *innerImage) drawImage(img *innerImage, options *DrawImageOptions) error {
|
||||||
@ -68,14 +63,9 @@ func (i *innerImage) drawImage(img *innerImage, options *DrawImageOptions) error
|
|||||||
}
|
}
|
||||||
geo := options.GeoM
|
geo := options.GeoM
|
||||||
clr := options.ColorM
|
clr := options.ColorM
|
||||||
|
w, h := img.size()
|
||||||
if err := i.framebuffer.SetAsViewport(); err != nil {
|
quads := &textureQuads{parts, w, h}
|
||||||
return err
|
return i.framebuffer.DrawTexture(img.texture, quads, geo, clr)
|
||||||
}
|
|
||||||
w, h := img.texture.Size()
|
|
||||||
quads := textureQuads(parts, w, h)
|
|
||||||
projectionMatrix := i.framebuffer.ProjectionMatrix()
|
|
||||||
return shader.DrawTexture(img.texture.Native(), projectionMatrix, quads, geo, clr)
|
|
||||||
}
|
}
|
||||||
|
|
||||||
func u(x float64, width int) float32 {
|
func u(x float64, width int) float32 {
|
||||||
@ -86,22 +76,25 @@ func v(y float64, height int) float32 {
|
|||||||
return float32(y) / float32(internal.NextPowerOf2Int(height))
|
return float32(y) / float32(internal.NextPowerOf2Int(height))
|
||||||
}
|
}
|
||||||
|
|
||||||
func textureQuads(parts []ImagePart, width, height int) []shader.TextureQuad {
|
type textureQuads struct {
|
||||||
quads := make([]shader.TextureQuad, 0, len(parts))
|
parts []ImagePart
|
||||||
for _, part := range parts {
|
width int
|
||||||
dst, src := part.Dst, part.Src
|
height int
|
||||||
x1 := float32(dst.Min.X)
|
}
|
||||||
x2 := float32(dst.Max.X)
|
|
||||||
y1 := float32(dst.Min.Y)
|
func (t *textureQuads) Len() int {
|
||||||
y2 := float32(dst.Max.Y)
|
return len(t.parts)
|
||||||
u1 := u(float64(src.Min.X), width)
|
}
|
||||||
u2 := u(float64(src.Max.X), width)
|
|
||||||
v1 := v(float64(src.Min.Y), height)
|
func (t *textureQuads) Vertex(i int) (x0, y0, x1, y1 float32) {
|
||||||
v2 := v(float64(src.Max.Y), height)
|
dst := t.parts[i].Dst
|
||||||
quad := shader.TextureQuad{x1, x2, y1, y2, u1, u2, v1, v2}
|
return float32(dst.Min.X), float32(dst.Min.Y), float32(dst.Max.X), float32(dst.Max.Y)
|
||||||
quads = append(quads, quad)
|
}
|
||||||
}
|
|
||||||
return quads
|
func (t *textureQuads) Texture(i int) (u0, v0, u1, v1 float32) {
|
||||||
|
src := t.parts[i].Src
|
||||||
|
w, h := t.width, t.height
|
||||||
|
return u(float64(src.Min.X), w), v(float64(src.Min.Y), h), u(float64(src.Max.X), w), v(float64(src.Max.Y), h)
|
||||||
}
|
}
|
||||||
|
|
||||||
type syncer interface {
|
type syncer interface {
|
||||||
|
@ -19,6 +19,7 @@ import (
|
|||||||
"fmt"
|
"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/opengl/internal/shader"
|
||||||
)
|
)
|
||||||
|
|
||||||
func orthoProjectionMatrix(left, right, bottom, top int) [4][4]float64 {
|
func orthoProjectionMatrix(left, right, bottom, top int) [4][4]float64 {
|
||||||
@ -84,7 +85,7 @@ func createFramebuffer(nativeTexture gl.Texture) (gl.Framebuffer, error) {
|
|||||||
return framebuffer, nil
|
return framebuffer, nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *Framebuffer) SetAsViewport() error {
|
func (f *Framebuffer) setAsViewport() error {
|
||||||
gl.Flush()
|
gl.Flush()
|
||||||
f.framebuffer.Bind()
|
f.framebuffer.Bind()
|
||||||
err := gl.CheckFramebufferStatus(gl.FRAMEBUFFER)
|
err := gl.CheckFramebufferStatus(gl.FRAMEBUFFER)
|
||||||
@ -101,7 +102,7 @@ func (f *Framebuffer) SetAsViewport() error {
|
|||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (f *Framebuffer) ProjectionMatrix() [4][4]float64 {
|
func (f *Framebuffer) projectionMatrix() [4][4]float64 {
|
||||||
width := internal.NextPowerOf2Int(f.width)
|
width := internal.NextPowerOf2Int(f.width)
|
||||||
height := internal.NextPowerOf2Int(f.height)
|
height := internal.NextPowerOf2Int(f.height)
|
||||||
m := orthoProjectionMatrix(0, width, 0, height)
|
m := orthoProjectionMatrix(0, width, 0, height)
|
||||||
@ -111,3 +112,31 @@ func (f *Framebuffer) ProjectionMatrix() [4][4]float64 {
|
|||||||
}
|
}
|
||||||
return m
|
return m
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type Matrix interface {
|
||||||
|
Element(i, j int) float64
|
||||||
|
}
|
||||||
|
|
||||||
|
type TextureQuads interface {
|
||||||
|
Len() int
|
||||||
|
Vertex(i int) (x0, y0, x1, y1 float32)
|
||||||
|
Texture(i int) (u0, v0, u1, v1 float32)
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Framebuffer) Fill(r, g, b, a float64) error {
|
||||||
|
if err := f.setAsViewport(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
gl.ClearColor(gl.GLclampf(r), gl.GLclampf(g), gl.GLclampf(b), gl.GLclampf(a))
|
||||||
|
gl.Clear(gl.COLOR_BUFFER_BIT)
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (f *Framebuffer) DrawTexture(t *Texture, quads TextureQuads, geo, clr Matrix) error {
|
||||||
|
if err := f.setAsViewport(); err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
projectionMatrix := f.projectionMatrix()
|
||||||
|
// TODO: Define texture.Draw()
|
||||||
|
return shader.DrawTexture(t.native, projectionMatrix, quads, geo, clr)
|
||||||
|
}
|
||||||
|
@ -32,12 +32,3 @@ func Init() {
|
|||||||
gl.Enable(gl.BLEND)
|
gl.Enable(gl.BLEND)
|
||||||
gl.BlendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)
|
gl.BlendFunc(gl.ONE, gl.ONE_MINUS_SRC_ALPHA)
|
||||||
}
|
}
|
||||||
|
|
||||||
func Clear(r, g, b, a float64) {
|
|
||||||
gl.ClearColor(gl.GLclampf(r), gl.GLclampf(g), gl.GLclampf(b), gl.GLclampf(a))
|
|
||||||
gl.Clear(gl.COLOR_BUFFER_BIT)
|
|
||||||
}
|
|
||||||
|
|
||||||
func Flush() {
|
|
||||||
gl.Flush()
|
|
||||||
}
|
|
||||||
|
@ -32,6 +32,12 @@ type Matrix interface {
|
|||||||
Element(i, j int) float64
|
Element(i, j int) float64
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type TextureQuads interface {
|
||||||
|
Len() int
|
||||||
|
Vertex(i int) (x0, y0, x1, y1 float32)
|
||||||
|
Texture(i int) (u0, v0, u1, v1 float32)
|
||||||
|
}
|
||||||
|
|
||||||
var initialized = false
|
var initialized = false
|
||||||
|
|
||||||
const size = 10000
|
const size = 10000
|
||||||
@ -40,7 +46,7 @@ const size = 10000
|
|||||||
const uint16Size = 2
|
const uint16Size = 2
|
||||||
const short32Size = 4
|
const short32Size = 4
|
||||||
|
|
||||||
func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []TextureQuad, geo Matrix, color Matrix) error {
|
func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads TextureQuads, geo Matrix, color Matrix) error {
|
||||||
// TODO: Check len(quads) and gl.MAX_ELEMENTS_INDICES?
|
// TODO: Check len(quads) and gl.MAX_ELEMENTS_INDICES?
|
||||||
const stride = 4 * 4
|
const stride = 4 * 4
|
||||||
if !initialized {
|
if !initialized {
|
||||||
@ -69,7 +75,7 @@ func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []Text
|
|||||||
initialized = true
|
initialized = true
|
||||||
}
|
}
|
||||||
|
|
||||||
if len(quads) == 0 {
|
if quads.Len() == 0 {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
// TODO: Check performance
|
// TODO: Check performance
|
||||||
@ -92,15 +98,9 @@ func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []Text
|
|||||||
texCoordAttrLocation.AttribPointer(2, gl.FLOAT, false, stride, uintptr(short32Size*2))
|
texCoordAttrLocation.AttribPointer(2, gl.FLOAT, false, stride, uintptr(short32Size*2))
|
||||||
|
|
||||||
vertices := []float32{}
|
vertices := []float32{}
|
||||||
for _, quad := range quads {
|
for i := 0; i < quads.Len(); i++ {
|
||||||
x0 := quad.VertexX0
|
x0, y0, x1, y1 := quads.Vertex(i)
|
||||||
x1 := quad.VertexX1
|
u0, v0, u1, v1 := quads.Texture(i)
|
||||||
y0 := quad.VertexY0
|
|
||||||
y1 := quad.VertexY1
|
|
||||||
u0 := quad.TextureCoordU0
|
|
||||||
u1 := quad.TextureCoordU1
|
|
||||||
v0 := quad.TextureCoordV0
|
|
||||||
v1 := quad.TextureCoordV1
|
|
||||||
vertices = append(vertices,
|
vertices = append(vertices,
|
||||||
x0, y0, u0, v0,
|
x0, y0, u0, v0,
|
||||||
x1, y0, u1, v0,
|
x1, y0, u1, v0,
|
||||||
@ -109,7 +109,7 @@ func DrawTexture(native gl.Texture, projectionMatrix [4][4]float64, quads []Text
|
|||||||
)
|
)
|
||||||
}
|
}
|
||||||
gl.BufferSubData(gl.ARRAY_BUFFER, 0, short32Size*len(vertices), vertices)
|
gl.BufferSubData(gl.ARRAY_BUFFER, 0, short32Size*len(vertices), vertices)
|
||||||
gl.DrawElements(gl.TRIANGLES, 6*len(quads), gl.UNSIGNED_SHORT, uintptr(0))
|
gl.DrawElements(gl.TRIANGLES, 6*quads.Len(), gl.UNSIGNED_SHORT, uintptr(0))
|
||||||
|
|
||||||
gl.Flush()
|
gl.Flush()
|
||||||
return nil
|
return nil
|
||||||
|
@ -1,26 +0,0 @@
|
|||||||
// Copyright 2014 Hajime Hoshi
|
|
||||||
//
|
|
||||||
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
// you may not use this file except in compliance with the License.
|
|
||||||
// You may obtain a copy of the License at
|
|
||||||
//
|
|
||||||
// http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
//
|
|
||||||
// Unless required by applicable law or agreed to in writing, software
|
|
||||||
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
// See the License for the specific language governing permissions and
|
|
||||||
// limitations under the License.
|
|
||||||
|
|
||||||
package shader
|
|
||||||
|
|
||||||
type TextureQuad struct {
|
|
||||||
VertexX0 float32
|
|
||||||
VertexX1 float32
|
|
||||||
VertexY0 float32
|
|
||||||
VertexY1 float32
|
|
||||||
TextureCoordU0 float32
|
|
||||||
TextureCoordU1 float32
|
|
||||||
TextureCoordV0 float32
|
|
||||||
TextureCoordV1 float32
|
|
||||||
}
|
|
Loading…
Reference in New Issue
Block a user