segmented render time display

This commit is contained in:
Edgaru089 2022-02-22 14:28:35 +08:00
parent e2717aaaa9
commit 3595c32ae5
3 changed files with 63 additions and 3 deletions

View File

@ -1,6 +1,8 @@
package igwrap package igwrap
import ( import (
"math"
"edgaru089.ml/go/gl01/internal/util/itype" "edgaru089.ml/go/gl01/internal/util/itype"
"github.com/inkyblackness/imgui-go/v4" "github.com/inkyblackness/imgui-go/v4"
) )
@ -20,6 +22,17 @@ func PackedColor(color itype.Vec4f) imgui.PackedColor {
return imgui.PackedColorFromVec4(Vec4(color)) return imgui.PackedColorFromVec4(Vec4(color))
} }
// UnpackedColor unpacks a color to RGBA.
func UnpackedColor(color imgui.PackedColor) itype.Vec4f {
r, g, b, a := color.RGBA()
return itype.Vec4f{
float32(r) / float32(math.MaxUint32),
float32(g) / float32(math.MaxUint32),
float32(b) / float32(math.MaxUint32),
float32(a) / float32(math.MaxUint32),
}
}
// Vec2 converts itype.Vec2f to imgui.Vec2. // Vec2 converts itype.Vec2f to imgui.Vec2.
func Vec2(v itype.Vec2f) imgui.Vec2 { func Vec2(v itype.Vec2f) imgui.Vec2 {
return imgui.Vec2{X: v[0], Y: v[1]} return imgui.Vec2{X: v[0], Y: v[1]}

View File

@ -30,18 +30,18 @@ func Text(format string, a ...interface{}) {
// It also fills the background of the text with half-transparant black, and takes care of the padding. // It also fills the background of the text with half-transparant black, and takes care of the padding.
func TextBackground(format string, a ...interface{}) { func TextBackground(format string, a ...interface{}) {
pad := Vec2f(imgui.CurrentStyle().ItemSpacing()) pad := Vec2f(imgui.CurrentStyle().ItemSpacing())
TextBackgroundV(itype.Vec4f{0, 0, 0, 0.5}, pad, format, a...) TextBackgroundV(PackedColor(itype.Vec4f{0, 0, 0, 0.5}), pad, format, a...)
} }
// TextBackgroundV wraps imgui.Text to create a shortcut for fmt.Sprintf. // TextBackgroundV wraps imgui.Text to create a shortcut for fmt.Sprintf.
// //
// It also fills the background of the text with the given color. // It also fills the background of the text with the given color.
func TextBackgroundV(color itype.Vec4f, padding itype.Vec2f, format string, a ...interface{}) { func TextBackgroundV(color imgui.PackedColor, padding itype.Vec2f, format string, a ...interface{}) {
text := fmt.Sprintf(format, a...) text := fmt.Sprintf(format, a...)
orig := imgui.CursorScreenPos() orig := imgui.CursorScreenPos()
size := imgui.CalcTextSize(text, false, 0) size := imgui.CalcTextSize(text, false, 0)
halfpad := padding.Multiply(0.5) halfpad := padding.Multiply(0.5)
imgui.BackgroundDrawList().AddRectFilledV(orig.Minus(Vec2(halfpad)), orig.Plus(size).Plus(Vec2(halfpad)), PackedColor(color), 0, 0) imgui.BackgroundDrawList().AddRectFilledV(orig.Minus(Vec2(halfpad)), orig.Plus(size).Plus(Vec2(halfpad)), color, 0, 0)
imgui.Text(text) imgui.Text(text)
} }

View File

@ -12,12 +12,35 @@ import (
"github.com/inkyblackness/imgui-go/v4" "github.com/inkyblackness/imgui-go/v4"
) )
const (
timebarN = 700
timebarScale = 160
)
var (
colorset = [...]imgui.PackedColor{4289753676, 4283598045, 4285048917, 4283584196, 4289950337, 4284512403, 4291005402, 4287401100, 4285839820, 4291671396}
timebars [timebarN][]int // height of each bar set
timebari int
)
func (r *WorldRenderer) renderDebugInfo() { func (r *WorldRenderer) renderDebugInfo() {
// Render information // Render information
if igwrap.Begin("F3", nil, 0) { if igwrap.Begin("F3", nil, 0) {
igwrap.TextBlank() igwrap.TextBlank()
igwrap.TextBackground("WorldRender: lastframe %.3fms", float64(io.Diagnostics.Times.Render.Nanoseconds())/float64(time.Millisecond)) igwrap.TextBackground("WorldRender: lastframe %.3fms", float64(io.Diagnostics.Times.Render.Nanoseconds())/float64(time.Millisecond))
igwrap.TextBackground("TimeBars:")
pad := igwrap.Vec2f(imgui.CurrentStyle().ItemSpacing())
imgui.SameLine()
igwrap.TextBackgroundV(colorset[0], pad, "Depthmap")
imgui.SameLine()
igwrap.TextBackgroundV(colorset[1], pad, "Geometry")
imgui.SameLine()
igwrap.TextBackgroundV(colorset[2], pad, "SSAO")
imgui.SameLine()
igwrap.TextBackgroundV(colorset[3], pad, "Lighting")
imgui.SameLine()
igwrap.TextBackgroundV(colorset[4], pad, "Postfx")
isize := asset.WorldTextureAtlas.ImageSize isize := asset.WorldTextureAtlas.ImageSize
igwrap.TextBackground("Texture Atlas Size: (%dx%d)", isize[0], isize[1]) igwrap.TextBackground("Texture Atlas Size: (%dx%d)", isize[0], isize[1])
@ -36,6 +59,7 @@ func (r *WorldRenderer) renderDebugInfo() {
imgui.End() imgui.End()
} }
// Draw Textures
imgui.SetNextWindowPosV(imgui.Vec2{X: float32(r.lastDisplaySize[0]), Y: 0}, imgui.ConditionAlways, imgui.Vec2{X: 1, Y: 0}) imgui.SetNextWindowPosV(imgui.Vec2{X: float32(r.lastDisplaySize[0]), Y: 0}, imgui.ConditionAlways, imgui.Vec2{X: 1, Y: 0})
if igwrap.Begin("Renderer Textures/Outputs", nil, igwrap.WindowFlagsOverlay) { if igwrap.Begin("Renderer Textures/Outputs", nil, igwrap.WindowFlagsOverlay) {
imgui.PushStyleVarVec2(imgui.StyleVarItemSpacing, imgui.Vec2{}) imgui.PushStyleVarVec2(imgui.StyleVarItemSpacing, imgui.Vec2{})
@ -53,4 +77,27 @@ func (r *WorldRenderer) renderDebugInfo() {
imgui.End() imgui.End()
} }
// Push the next bar
timebars[timebari] = []int{
int(io.Diagnostics.Times.RenderPasses.Depthmap.Nanoseconds() * timebarScale / 1000 / 1000),
int(io.Diagnostics.Times.RenderPasses.Geometry.Nanoseconds() * timebarScale / 1000 / 1000),
int(io.Diagnostics.Times.RenderPasses.SSAO.Nanoseconds() * timebarScale / 1000 / 1000),
int(io.Diagnostics.Times.RenderPasses.Lighting.Nanoseconds() * timebarScale / 1000 / 1000),
int(io.Diagnostics.Times.RenderPasses.Postfx.Nanoseconds() * timebarScale / 1000 / 1000),
}
timebari++
if timebari >= len(timebars) {
timebari = 0
}
// Draw time bars
size := r.lastDisplaySize
dl := imgui.BackgroundDrawList()
for i, l := range timebars {
ex := 0
for j, d := range l {
dl.AddLine(imgui.Vec2{X: float32(i), Y: float32(size[1] - ex - 1)}, imgui.Vec2{X: float32(i), Y: float32(size[1] - ex - d)}, colorset[j])
ex += d
}
}
} }