Draw entities back to front within tiles (#705)

* Draw entities per subtile for correct depth order

* Use a temporary entity slice for depth sorting

Speeds things up quite a bit
This commit is contained in:
Ziemas 2020-08-16 20:59:03 +02:00 committed by GitHub
parent 858fa18068
commit 8d87c19532
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 39 additions and 9 deletions

View File

@ -68,11 +68,11 @@ func (p *Position) Tile() *Vector {
// and to the lower left diagonal ('left') of the isometric grid. This renders the target one index above which visually
// is one tile below.
func (p *Position) RenderOffset() *Vector {
return p.subTileOffset().AddScalar(1)
return p.SubTileOffset().AddScalar(1)
}
// subTileOffset is the offset from the current map tile in sub tiles.
func (p *Position) subTileOffset() *Vector {
func (p *Position) SubTileOffset() *Vector {
t := p.Tile().Scale(subTilesPerTile)
c := p.Clone()

View File

@ -27,7 +27,7 @@ const (
dbgBoxHeight = 60
dbgBoxPadding = 10
dbgCollisionSize = 5
dbgCollisionSize = 5
dbgCollisionOffsetX = -3
dbgCollisionOffsetY = 4
@ -197,6 +197,8 @@ func (mr *MapRenderer) renderPass2(target d2interface.Surface, startX, startY, e
for tileX := startX; tileX < endX; tileX++ {
mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY))
tileEnt := make([]d2interface.MapEntity, 0)
// TODO: Do not loop over every entity every frame
for _, mapEntity := range mr.mapEngine.Entities() {
pos := mapEntity.GetPosition()
@ -211,9 +213,22 @@ func (mr *MapRenderer) renderPass2(target d2interface.Surface, startX, startY, e
continue
}
target.PushTranslation(mr.viewport.GetTranslationScreen())
mapEntity.Render(target)
target.Pop()
tileEnt = append(tileEnt, mapEntity)
}
for subY := 0; subY < 5; subY++ {
for subX := 0; subX < 5; subX++ {
for _, mapEntity := range tileEnt {
pos := mapEntity.GetPosition()
if (int(pos.SubTileOffset().X()) != subX) || (int(pos.SubTileOffset().Y()) != subY) {
continue
}
target.PushTranslation(mr.viewport.GetTranslationScreen())
mapEntity.Render(target)
target.Pop()
}
}
}
mr.viewport.PopTranslation()
@ -229,6 +244,8 @@ func (mr *MapRenderer) renderPass3(target d2interface.Surface, startX, startY, e
mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY))
mr.renderTilePass2(tile, target)
tileEnt := make([]d2interface.MapEntity, 0)
// TODO: Do not loop over every entity every frame
for _, mapEntity := range mr.mapEngine.Entities() {
pos := mapEntity.GetPosition()
@ -243,9 +260,22 @@ func (mr *MapRenderer) renderPass3(target d2interface.Surface, startX, startY, e
continue
}
target.PushTranslation(mr.viewport.GetTranslationScreen())
mapEntity.Render(target)
target.Pop()
tileEnt = append(tileEnt, mapEntity)
}
for subY := 0; subY < 5; subY++ {
for subX := 0; subX < 5; subX++ {
for _, mapEntity := range tileEnt {
pos := mapEntity.GetPosition()
if (int(pos.SubTileOffset().X()) != subX) || (int(pos.SubTileOffset().Y()) != subY) {
continue
}
target.PushTranslation(mr.viewport.GetTranslationScreen())
mapEntity.Render(target)
target.Pop()
}
}
}
mr.viewport.PopTranslation()