singe/testScripts/scene31.singe

71 lines
2.4 KiB
Text

-- Culling and instancing: a field of dragons on a plain. Every dragon is the same model, so
-- its parts batch into a handful of instanced draw calls, and the camera looks along the field so
-- most of them are behind it and culled. The overlay shows what sceneGetStats reports and the
-- frame time, so the sheet doubles as the measurement.
local font = fontLoad("Singe/FreeSansBold.ttf", 28)
local frames = 0
local last = singeGetTicks()
local ms = 0
fontSelect(font)
sceneEnable(true)
sceneSetSky("testScripts/sky.png")
sceneSetFog(190, 200, 215, 60, 220)
sceneSetShadowSize(2048)
sceneSetShadowDistance(80)
local ground = materialNew()
materialSetColor(ground, 110, 120, 90)
materialSetRoughness(ground, 0.95)
local plain = nodeNew()
nodeSetMesh(plain, meshPlane(400, 400), ground)
local dragonModel = modelLoad("testScripts/Models/DragonModel.glb")
local across = 20
local count = 0
for i = 0, across - 1 do
for j = 0, across - 1 do
local dragon = modelInstance(dragonModel)
nodeSetPosition(dragon, (i - across / 2) * 6, 0, (j - across / 2) * 6)
nodeSetRotation(dragon, 0, (i * 7 + j * 13) % 360, 0)
nodeSetScale(dragon, 0.35)
count = count + 1
end
end
local sun = lightNew(LIGHT_DIRECTIONAL)
nodeSetPosition(sun, 40, 60, 30)
nodeLookAt(sun, 0, 0, 0)
lightSetIntensity(sun, 2.5)
lightSetShadow(sun, true)
local camera = nodeNew()
cameraSet(camera)
cameraSetPerspective(60, 0.1, 400)
local stops = {
{ 0, 4, 130, 0, 2, 0 }, -- From the edge, looking across the field
{ 0, 60, 0, 0, 0, -140 }, -- High above, half the field in view
{ 3, 2, 3, -40, 3, -40 }, -- In among them, low
{ 0, 200, 1, 0, 0, 0 }, -- Straight down: everything in view
}
function onOverlayUpdate()
local stop = stops[math.min(#stops, math.floor(frames / 45) + 1)]
local now = singeGetTicks()
frames = frames + 1
ms = ms * 0.9 + (now - last) * 0.1
last = now
nodeSetPosition(camera, stop[1], stop[2], stop[3])
nodeLookAt(camera, stop[4], stop[5], stop[6])
local total, drawn, batches = sceneGetStats()
overlayClear()
fontPrint(20, 20, string.format("%d dragons: %d draws, %d in view, %d draw calls, %.1f ms, frame %d", count, total, drawn, batches, ms, frames))
if frames == 40 or frames == 85 or frames == 130 or frames == 175 then
singeScreenshot()
debugPrint(string.format("frame %d draws %d in view %d calls %d ms %.1f", frames, total, drawn, batches, ms))
end
if frames == 180 then
singeQuit()
end
end