mirror of
https://github.com/OpenDiablo2/OpenDiablo2
synced 2025-02-05 08:07:51 -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:
parent
858fa18068
commit
8d87c19532
@ -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()
|
||||
|
||||
|
@ -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,10 +213,23 @@ func (mr *MapRenderer) renderPass2(target d2interface.Surface, startX, startY, e
|
||||
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())
|
||||
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,10 +260,23 @@ func (mr *MapRenderer) renderPass3(target d2interface.Surface, startX, startY, e
|
||||
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())
|
||||
mapEntity.Render(target)
|
||||
target.Pop()
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
mr.viewport.PopTranslation()
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user