Needs names for the UI components to distinguish them, and probably stacking vertically for easier comparison.shared-context
@@ -862,7 +862,7 @@ void updateFPS(struct FPScounter* fps, float frameTime) | |||||
#define AVG_SIZE 20 | #define AVG_SIZE 20 | ||||
void renderFPS(struct NVGcontext* vg, float x, float y, struct FPScounter* fps) | |||||
void renderFPS(struct NVGcontext* vg, float x, float y, struct FPScounter* fps, enum FPSRenderStyle style) | |||||
{ | { | ||||
int i, head; | int i, head; | ||||
float avg, w, h; | float avg, w, h; | ||||
@@ -886,29 +886,54 @@ void renderFPS(struct NVGcontext* vg, float x, float y, struct FPScounter* fps) | |||||
nvgBeginPath(vg); | nvgBeginPath(vg); | ||||
nvgMoveTo(vg, x, y+h); | nvgMoveTo(vg, x, y+h); | ||||
for (i = 0; i < FPS_HISTORY_COUNT; i++) { | |||||
float v = 1.0f / (0.00001f + fps->values[(fps->head+i) % FPS_HISTORY_COUNT]); | |||||
if (v > 80.0f) v = 80.0f; | |||||
float vx = x + ((float)i/(FPS_HISTORY_COUNT-1)) * w; | |||||
float vy = y + h - ((v / 80.0f) * h); | |||||
nvgLineTo(vg, vx, vy); | |||||
} | |||||
if( RENDER_FPS == style ) | |||||
{ | |||||
for (i = 0; i < FPS_HISTORY_COUNT; i++) { | |||||
float v = 1.0f / (0.00001f + fps->values[(fps->head+i) % FPS_HISTORY_COUNT]); | |||||
if (v > 80.0f) v = 80.0f; | |||||
float vx = x + ((float)i/(FPS_HISTORY_COUNT-1)) * w; | |||||
float vy = y + h - ((v / 80.0f) * h); | |||||
nvgLineTo(vg, vx, vy); | |||||
} | |||||
} | |||||
else | |||||
{ | |||||
for (i = 0; i < FPS_HISTORY_COUNT; i++) { | |||||
float v = fps->values[(fps->head+i) % FPS_HISTORY_COUNT] * 1000.0f; | |||||
if (v > 20.0f) v = 20.0f; | |||||
float vx = x + ((float)i/(FPS_HISTORY_COUNT-1)) * w; | |||||
float vy = y + h - ((v / 20.0f) * h); | |||||
nvgLineTo(vg, vx, vy); | |||||
} | |||||
} | |||||
nvgLineTo(vg, x+w, y+h); | nvgLineTo(vg, x+w, y+h); | ||||
nvgFillColor(vg, nvgRGBA(255,192,0,128)); | nvgFillColor(vg, nvgRGBA(255,192,0,128)); | ||||
nvgFill(vg); | nvgFill(vg); | ||||
nvgFontFace(vg, "sans"); | nvgFontFace(vg, "sans"); | ||||
nvgFontSize(vg, 18.0f); | |||||
nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_MIDDLE); | |||||
nvgFillColor(vg, nvgRGBA(240,240,240,255)); | |||||
sprintf(str, "%.2f FPS", 1.0f / avg); | |||||
nvgText(vg, x+w-5,y+h/2, str, NULL); | |||||
if( RENDER_FPS == style ) | |||||
{ | |||||
nvgFontSize(vg, 18.0f); | |||||
nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_MIDDLE); | |||||
nvgFillColor(vg, nvgRGBA(240,240,240,255)); | |||||
sprintf(str, "%.2f FPS", 1.0f / avg); | |||||
nvgText(vg, x+w-5,y+h/2, str, NULL); | |||||
nvgFontSize(vg, 15.0f); | |||||
nvgTextAlign(vg,NVG_ALIGN_LEFT|NVG_ALIGN_MIDDLE); | |||||
nvgFillColor(vg, nvgRGBA(240,240,240,160)); | |||||
sprintf(str, "%.2f ms", avg * 1000.0f); | |||||
nvgText(vg, x+5,y+h/2, str, NULL); | |||||
} | |||||
else | |||||
{ | |||||
nvgFontSize(vg, 18.0f); | |||||
nvgTextAlign(vg,NVG_ALIGN_RIGHT|NVG_ALIGN_MIDDLE); | |||||
nvgFillColor(vg, nvgRGBA(240,240,240,255)); | |||||
sprintf(str, "%.2f ms", avg * 1000.0f); | |||||
nvgText(vg, x+w-5,y+h/2, str, NULL); | |||||
} | |||||
nvgFontSize(vg, 15.0f); | |||||
nvgTextAlign(vg,NVG_ALIGN_LEFT|NVG_ALIGN_MIDDLE); | |||||
nvgFillColor(vg, nvgRGBA(240,240,240,160)); | |||||
sprintf(str, "%.2f ms", avg * 1000.0f); | |||||
nvgText(vg, x+5,y+h/2, str, NULL); | |||||
} | } | ||||
@@ -17,6 +17,10 @@ void freeDemoData(struct NVGcontext* vg, struct DemoData* data); | |||||
void renderDemo(struct NVGcontext* vg, float mx, float my, float width, float height, float t, int blowup, struct DemoData* data); | void renderDemo(struct NVGcontext* vg, float mx, float my, float width, float height, float t, int blowup, struct DemoData* data); | ||||
#define FPS_HISTORY_COUNT 100 | #define FPS_HISTORY_COUNT 100 | ||||
enum FPSRenderStyle { | |||||
RENDER_FPS, | |||||
RENDER_MS, | |||||
}; | |||||
struct FPScounter | struct FPScounter | ||||
{ | { | ||||
float values[FPS_HISTORY_COUNT]; | float values[FPS_HISTORY_COUNT]; | ||||
@@ -25,7 +29,7 @@ struct FPScounter | |||||
void initFPS(struct FPScounter* fps); | void initFPS(struct FPScounter* fps); | ||||
void updateFPS(struct FPScounter* fps, float frameTime); | void updateFPS(struct FPScounter* fps, float frameTime); | ||||
void renderFPS(struct NVGcontext* vg, float x, float y, struct FPScounter* fps); | |||||
void renderFPS(struct NVGcontext* vg, float x, float y, struct FPScounter* fps, enum FPSRenderStyle style ); | |||||
#ifdef __cplusplus | #ifdef __cplusplus | ||||
} | } | ||||
@@ -55,7 +55,8 @@ int main() | |||||
struct DemoData data; | struct DemoData data; | ||||
struct NVGcontext* vg = NULL; | struct NVGcontext* vg = NULL; | ||||
struct FPScounter fps; | struct FPScounter fps; | ||||
double prevt = 0; | |||||
struct FPScounter cpuTimes; | |||||
double prevt = 0, cpuTime = 0; | |||||
if (!glfwInit()) { | if (!glfwInit()) { | ||||
printf("Failed to init GLFW."); | printf("Failed to init GLFW."); | ||||
@@ -63,6 +64,7 @@ int main() | |||||
} | } | ||||
initFPS(&fps); | initFPS(&fps); | ||||
initFPS(&cpuTimes); | |||||
glfwSetErrorCallback(errorcb); | glfwSetErrorCallback(errorcb); | ||||
#ifndef _WIN32 // don't require this on win32, and works with more cards | #ifndef _WIN32 // don't require this on win32, and works with more cards | ||||
@@ -122,6 +124,7 @@ int main() | |||||
dt = t - prevt; | dt = t - prevt; | ||||
prevt = t; | prevt = t; | ||||
updateFPS(&fps, dt); | updateFPS(&fps, dt); | ||||
updateFPS(&cpuTimes, cpuTime); | |||||
glfwGetCursorPos(window, &mx, &my); | glfwGetCursorPos(window, &mx, &my); | ||||
glfwGetWindowSize(window, &winWidth, &winHeight); | glfwGetWindowSize(window, &winWidth, &winHeight); | ||||
@@ -142,12 +145,13 @@ int main() | |||||
nvgBeginFrame(vg, winWidth, winHeight, pxRatio); | nvgBeginFrame(vg, winWidth, winHeight, pxRatio); | ||||
renderDemo(vg, mx,my, winWidth,winHeight, t, blowup, &data); | renderDemo(vg, mx,my, winWidth,winHeight, t, blowup, &data); | ||||
renderFPS(vg, 5,5, &fps); | |||||
renderFPS(vg, 5,5, &fps, RENDER_FPS); | |||||
renderFPS(vg, 310,5, &cpuTimes, RENDER_MS); | |||||
nvgEndFrame(vg); | nvgEndFrame(vg); | ||||
glEnable(GL_DEPTH_TEST); | glEnable(GL_DEPTH_TEST); | ||||
cpuTime = glfwGetTime() - t; | |||||
glfwSwapBuffers(window); | glfwSwapBuffers(window); | ||||
glfwPollEvents(); | glfwPollEvents(); | ||||
} | } | ||||