115 lines
2.6 KiB
Go
115 lines
2.6 KiB
Go
package world
|
|
|
|
import (
|
|
"testing"
|
|
|
|
"github.com/stretchr/testify/require"
|
|
)
|
|
|
|
func TestRender_PanSmall_UsesCopyShiftAndRendersOnlyDirtyStrips(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
w := NewWorld(10, 10)
|
|
w.resetGrid(2 * SCALE)
|
|
|
|
_, err := w.AddPoint(5, 5)
|
|
require.NoError(t, err)
|
|
_, err = w.AddCircle(2, 2, 1)
|
|
require.NoError(t, err)
|
|
_, err = w.AddLine(9, 5, 1, 5)
|
|
require.NoError(t, err)
|
|
|
|
for _, obj := range w.objects {
|
|
w.indexObject(obj)
|
|
}
|
|
|
|
params := RenderParams{
|
|
ViewportWidthPx: 10,
|
|
ViewportHeightPx: 10,
|
|
MarginXPx: 4, // threshold=2
|
|
MarginYPx: 4, // threshold=2
|
|
CameraXWorldFp: 5 * SCALE,
|
|
CameraYWorldFp: 5 * SCALE,
|
|
CameraZoom: 1.0,
|
|
}
|
|
|
|
// First render initializes state (full redraw).
|
|
d0 := &fakePrimitiveDrawer{}
|
|
require.NoError(t, w.Render(d0, params))
|
|
|
|
// Pan right by 1 unit => dx=-1 => incremental shift expected.
|
|
params2 := params
|
|
params2.CameraXWorldFp += 1 * SCALE
|
|
|
|
d := &fakePrimitiveDrawer{}
|
|
err = w.Render(d, params2)
|
|
require.NoError(t, err)
|
|
|
|
// Must contain CopyShift for incremental path.
|
|
require.NotEmpty(t, d.CommandsByName("CopyShift"))
|
|
|
|
// All clip rects should be "small": width <= 1 for dx=-1 strip.
|
|
clipCmds := d.CommandsByName("ClipRect")
|
|
require.NotEmpty(t, clipCmds)
|
|
for _, c := range clipCmds {
|
|
wPx := int(c.Args[2])
|
|
hPx := int(c.Args[3])
|
|
require.LessOrEqual(t, wPx, 2)
|
|
require.LessOrEqual(t, hPx, params2.CanvasHeightPx())
|
|
}
|
|
|
|
require.NotEmpty(t, d.CommandsByName("AddPoint"))
|
|
require.NotEmpty(t, d.CommandsByName("AddCircle"))
|
|
require.NotEmpty(t, d.CommandsByName("AddLine"))
|
|
}
|
|
|
|
func TestRender_PanTooLarge_FallsBackToFullRedraw(t *testing.T) {
|
|
t.Parallel()
|
|
|
|
w := NewWorld(10, 10)
|
|
w.resetGrid(2 * SCALE)
|
|
|
|
_, err := w.AddPoint(5, 5)
|
|
require.NoError(t, err)
|
|
for _, obj := range w.objects {
|
|
w.indexObject(obj)
|
|
}
|
|
|
|
params := RenderParams{
|
|
ViewportWidthPx: 10,
|
|
ViewportHeightPx: 10,
|
|
MarginXPx: 4, // threshold=2
|
|
MarginYPx: 4,
|
|
CameraXWorldFp: 5 * SCALE,
|
|
CameraYWorldFp: 5 * SCALE,
|
|
CameraZoom: 1.0,
|
|
}
|
|
|
|
d0 := &fakePrimitiveDrawer{}
|
|
require.NoError(t, w.Render(d0, params))
|
|
|
|
// Pan right by 3 units => abs(dx)=3 > threshold(2) => full redraw expected.
|
|
params2 := params
|
|
params2.CameraXWorldFp += 3 * SCALE
|
|
|
|
d := &fakePrimitiveDrawer{}
|
|
err = w.Render(d, params2)
|
|
require.NoError(t, err)
|
|
|
|
// Full redraw should NOT call CopyShift.
|
|
require.Empty(t, d.CommandsByName("CopyShift"))
|
|
|
|
// Should contain at least one reasonably wide clip.
|
|
clipCmds := d.CommandsByName("ClipRect")
|
|
require.NotEmpty(t, clipCmds)
|
|
|
|
foundWide := false
|
|
for _, c := range clipCmds {
|
|
if int(c.Args[2]) > 1 {
|
|
foundWide = true
|
|
break
|
|
}
|
|
}
|
|
require.True(t, foundWide)
|
|
}
|