diff --git a/d2common/d2math/d2vector/position.go b/d2common/d2math/d2vector/position.go index 84abdc30..f041f38a 100644 --- a/d2common/d2math/d2vector/position.go +++ b/d2common/d2math/d2vector/position.go @@ -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() diff --git a/d2core/d2map/d2maprenderer/renderer.go b/d2core/d2map/d2maprenderer/renderer.go index fa792652..e8325133 100644 --- a/d2core/d2map/d2maprenderer/renderer.go +++ b/d2core/d2map/d2maprenderer/renderer.go @@ -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()