2018-06-17 02:59:23 +00:00
|
|
|
package doodle
|
|
|
|
|
|
|
|
import (
|
|
|
|
"fmt"
|
|
|
|
|
2018-07-25 03:57:22 +00:00
|
|
|
"git.kirsle.net/apps/doodle/doodads"
|
2018-06-17 02:59:23 +00:00
|
|
|
"git.kirsle.net/apps/doodle/render"
|
|
|
|
)
|
|
|
|
|
|
|
|
// Frames to cache for FPS calculation.
|
|
|
|
const maxSamples = 100
|
|
|
|
|
2018-07-26 02:38:54 +00:00
|
|
|
// Debug mode options, these can be enabled in the dev console
|
|
|
|
// like: boolProp DebugOverlay true
|
|
|
|
var (
|
2018-08-11 00:19:47 +00:00
|
|
|
DebugOverlay = false
|
2018-07-26 02:38:54 +00:00
|
|
|
DebugCollision = true
|
|
|
|
)
|
|
|
|
|
2018-06-17 02:59:23 +00:00
|
|
|
var (
|
|
|
|
fpsCurrentTicks uint32 // current time we get sdl.GetTicks()
|
|
|
|
fpsLastTime uint32 // last time we printed the fpsCurrentTicks
|
|
|
|
fpsCurrent int
|
|
|
|
fpsFrames int
|
|
|
|
fpsSkipped uint32
|
|
|
|
fpsInterval uint32 = 1000
|
|
|
|
)
|
|
|
|
|
|
|
|
// DrawDebugOverlay draws the debug FPS text on the SDL canvas.
|
|
|
|
func (d *Doodle) DrawDebugOverlay() {
|
2018-07-26 02:38:54 +00:00
|
|
|
if !d.Debug || !DebugOverlay {
|
2018-06-17 02:59:23 +00:00
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-07-22 00:12:22 +00:00
|
|
|
label := fmt.Sprintf(
|
2018-07-22 03:43:01 +00:00
|
|
|
"FPS: %d (%dms) S:%s F12=screenshot",
|
2018-06-17 02:59:23 +00:00
|
|
|
fpsCurrent,
|
|
|
|
fpsSkipped,
|
2018-07-26 02:38:54 +00:00
|
|
|
d.Scene.Name(),
|
2018-06-17 02:59:23 +00:00
|
|
|
)
|
2018-07-22 00:12:22 +00:00
|
|
|
|
|
|
|
err := d.Engine.DrawText(
|
|
|
|
render.Text{
|
|
|
|
Text: label,
|
|
|
|
Size: 24,
|
|
|
|
Color: DebugTextColor,
|
|
|
|
Stroke: DebugTextStroke,
|
|
|
|
Shadow: DebugTextShadow,
|
|
|
|
},
|
2018-07-22 03:43:01 +00:00
|
|
|
render.Point{
|
2018-07-22 00:12:22 +00:00
|
|
|
X: DebugTextPadding,
|
|
|
|
Y: DebugTextPadding,
|
|
|
|
},
|
|
|
|
)
|
|
|
|
if err != nil {
|
|
|
|
log.Error("DrawDebugOverlay: text error: %s", err.Error())
|
|
|
|
}
|
2018-06-17 02:59:23 +00:00
|
|
|
}
|
|
|
|
|
2018-07-25 03:57:22 +00:00
|
|
|
// DrawCollisionBox draws the collision box around a Doodad.
|
|
|
|
func (d *Doodle) DrawCollisionBox(actor doodads.Doodad) {
|
2018-07-26 02:38:54 +00:00
|
|
|
if !d.Debug || !DebugCollision {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
2018-07-25 03:57:22 +00:00
|
|
|
var (
|
|
|
|
rect = doodads.GetBoundingRect(actor)
|
|
|
|
box = doodads.GetCollisionBox(rect)
|
|
|
|
)
|
|
|
|
|
|
|
|
d.Engine.DrawLine(render.DarkGreen, box.Top[0], box.Top[1])
|
|
|
|
d.Engine.DrawLine(render.DarkBlue, box.Bottom[0], box.Bottom[1])
|
|
|
|
d.Engine.DrawLine(render.DarkYellow, box.Left[0], box.Left[1])
|
|
|
|
d.Engine.DrawLine(render.Red, box.Right[0], box.Right[1])
|
|
|
|
}
|
|
|
|
|
2018-06-17 02:59:23 +00:00
|
|
|
// TrackFPS shows the current FPS once per second.
|
|
|
|
func (d *Doodle) TrackFPS(skipped uint32) {
|
|
|
|
fpsFrames++
|
2018-07-22 00:12:22 +00:00
|
|
|
fpsCurrentTicks = d.Engine.GetTicks()
|
2018-06-17 02:59:23 +00:00
|
|
|
|
|
|
|
// Skip the first second.
|
|
|
|
if fpsCurrentTicks < fpsInterval {
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if fpsLastTime < fpsCurrentTicks-fpsInterval {
|
|
|
|
fpsLastTime = fpsCurrentTicks
|
|
|
|
fpsCurrent = fpsFrames
|
|
|
|
fpsFrames = 0
|
|
|
|
fpsSkipped = skipped
|
|
|
|
}
|
|
|
|
}
|