mirror of
https://github.com/hajimehoshi/ebiten.git
synced 2025-02-03 22:44:28 +01:00
graphicscommand: Use an image in the uniform variables
This commit is contained in:
parent
968c0a9b9a
commit
6506c20f4e
@ -92,7 +92,7 @@ type commandQueue struct {
|
|||||||
var theCommandQueue = &commandQueue{}
|
var theCommandQueue = &commandQueue{}
|
||||||
|
|
||||||
// appendVertices appends vertices to the queue.
|
// appendVertices appends vertices to the queue.
|
||||||
func (q *commandQueue) appendVertices(vertices []float32, width, height float32) {
|
func (q *commandQueue) appendVertices(vertices []float32, src *Image) {
|
||||||
if len(q.vertices) < q.nvertices+len(vertices) {
|
if len(q.vertices) < q.nvertices+len(vertices) {
|
||||||
n := q.nvertices + len(vertices) - len(q.vertices)
|
n := q.nvertices + len(vertices) - len(q.vertices)
|
||||||
q.vertices = append(q.vertices, make([]float32, n)...)
|
q.vertices = append(q.vertices, make([]float32, n)...)
|
||||||
@ -102,6 +102,16 @@ func (q *commandQueue) appendVertices(vertices []float32, width, height float32)
|
|||||||
|
|
||||||
n := len(vertices) / graphics.VertexFloatNum
|
n := len(vertices) / graphics.VertexFloatNum
|
||||||
base := q.nvertices / graphics.VertexFloatNum
|
base := q.nvertices / graphics.VertexFloatNum
|
||||||
|
|
||||||
|
// If src is nil, elements for texels (the index in between 2 and 7) in the vertices are not used.
|
||||||
|
// Then, giving the size 1 is fine.
|
||||||
|
width := float32(1)
|
||||||
|
height := float32(1)
|
||||||
|
if src != nil {
|
||||||
|
w, h := src.InternalSize()
|
||||||
|
width = float32(w)
|
||||||
|
height = float32(h)
|
||||||
|
}
|
||||||
for i := 0; i < n; i++ {
|
for i := 0; i < n; i++ {
|
||||||
idx := base + i
|
idx := base + i
|
||||||
q.srcSizes[idx].width = width
|
q.srcSizes[idx].width = width
|
||||||
@ -134,17 +144,27 @@ func (q *commandQueue) EnqueueDrawTrianglesCommand(dst, src *Image, vertices []f
|
|||||||
split = true
|
split = true
|
||||||
}
|
}
|
||||||
|
|
||||||
n := len(vertices) / graphics.VertexFloatNum
|
const (
|
||||||
|
maxUint = ^uint(0)
|
||||||
|
maxInt = int(maxUint >> 1)
|
||||||
|
)
|
||||||
|
|
||||||
if src != nil {
|
if src != nil {
|
||||||
iw, ih := src.InternalSize()
|
q.appendVertices(vertices, src)
|
||||||
q.appendVertices(vertices, float32(iw), float32(ih))
|
|
||||||
} else {
|
} else {
|
||||||
// TODO: Use the image's size in the uniform variables.
|
var img *Image
|
||||||
// When there are multiple images, the smallest ID's image should be adopted.
|
id := maxInt
|
||||||
q.appendVertices(vertices, 1, 1)
|
for k, v := range uniforms {
|
||||||
|
if i, ok := v.(*Image); ok && id > k {
|
||||||
|
img = i
|
||||||
|
id = k
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
q.appendVertices(vertices, img)
|
||||||
}
|
}
|
||||||
q.appendIndices(indices, uint16(q.nextIndex))
|
q.appendIndices(indices, uint16(q.nextIndex))
|
||||||
q.nextIndex += n
|
q.nextIndex += len(vertices) / graphics.VertexFloatNum
|
||||||
q.tmpNumIndices += len(indices)
|
q.tmpNumIndices += len(indices)
|
||||||
|
|
||||||
// TODO: If dst is the screen, reorder the command to be the last.
|
// TODO: If dst is the screen, reorder the command to be the last.
|
||||||
|
@ -144,6 +144,13 @@ func (i *Image) InternalSize() (int, int) {
|
|||||||
// 11: Color Y
|
// 11: Color Y
|
||||||
//
|
//
|
||||||
// src and shader are exclusive and only either is non-nil.
|
// src and shader are exclusive and only either is non-nil.
|
||||||
|
//
|
||||||
|
// The elements that index is in between 2 and 7 are used for the source images.
|
||||||
|
// The source image is 1) src argument if non-nil, or 2) an image value in the uniform variables if it exists.
|
||||||
|
// If there are multiple images in the uniform variables, the smallest ID's value is adopted.
|
||||||
|
//
|
||||||
|
// If the source image is not specified, i.e., src is nil and there is no image in the uniform variables, these are
|
||||||
|
// not used.
|
||||||
func (i *Image) DrawTriangles(src *Image, vertices []float32, indices []uint16, clr *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address, shader *Shader, uniforms map[int]interface{}) {
|
func (i *Image) DrawTriangles(src *Image, vertices []float32, indices []uint16, clr *affine.ColorM, mode driver.CompositeMode, filter driver.Filter, address driver.Address, shader *Shader, uniforms map[int]interface{}) {
|
||||||
if src != nil && src.screen {
|
if src != nil && src.screen {
|
||||||
panic("graphicscommand: the screen image cannot be the rendering source")
|
panic("graphicscommand: the screen image cannot be the rendering source")
|
||||||
|
Loading…
Reference in New Issue
Block a user