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:
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
|
// 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()
|
||||||
|
|
||||||
|
@ -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()
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user