1
1
mirror of https://github.com/OpenDiablo2/OpenDiablo2 synced 2025-02-05 16:17:45 -05:00

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 // and to the lower left diagonal ('left') of the isometric grid. This renders the target one index above which visually
// is one tile below. // is one tile below.
func (p *Position) RenderOffset() *Vector { 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. // 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) t := p.Tile().Scale(subTilesPerTile)
c := p.Clone() c := p.Clone()

View File

@ -197,6 +197,8 @@ func (mr *MapRenderer) renderPass2(target d2interface.Surface, startX, startY, e
for tileX := startX; tileX < endX; tileX++ { for tileX := startX; tileX < endX; tileX++ {
mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY)) mr.viewport.PushTranslationWorld(float64(tileX), float64(tileY))
tileEnt := make([]d2interface.MapEntity, 0)
// TODO: Do not loop over every entity every frame // TODO: Do not loop over every entity every frame
for _, mapEntity := range mr.mapEngine.Entities() { for _, mapEntity := range mr.mapEngine.Entities() {
pos := mapEntity.GetPosition() pos := mapEntity.GetPosition()
@ -211,10 +213,23 @@ func (mr *MapRenderer) renderPass2(target d2interface.Surface, startX, startY, e
continue continue
} }
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()) target.PushTranslation(mr.viewport.GetTranslationScreen())
mapEntity.Render(target) mapEntity.Render(target)
target.Pop() target.Pop()
} }
}
}
mr.viewport.PopTranslation() 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.viewport.PushTranslationWorld(float64(tileX), float64(tileY))
mr.renderTilePass2(tile, target) mr.renderTilePass2(tile, target)
tileEnt := make([]d2interface.MapEntity, 0)
// TODO: Do not loop over every entity every frame // TODO: Do not loop over every entity every frame
for _, mapEntity := range mr.mapEngine.Entities() { for _, mapEntity := range mr.mapEngine.Entities() {
pos := mapEntity.GetPosition() pos := mapEntity.GetPosition()
@ -243,10 +260,23 @@ func (mr *MapRenderer) renderPass3(target d2interface.Surface, startX, startY, e
continue continue
} }
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()) target.PushTranslation(mr.viewport.GetTranslationScreen())
mapEntity.Render(target) mapEntity.Render(target)
target.Pop() target.Pop()
} }
}
}
mr.viewport.PopTranslation() mr.viewport.PopTranslation()
} }