changeset 2011:579fe3f6fe76

Improved texture atlas size estimation in Nuklear
author Mike Pavone <pavone@retrodev.com>
date Sun, 01 Nov 2020 12:35:08 -0800
parents 19957e7353a4
children b05295c2ad04
files nuklear_ui/nuklear.h nuklear_ui/nuklear_sdl_gles2.h
diffstat 2 files changed, 16 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/nuklear_ui/nuklear.h	Sun Nov 01 12:32:25 2020 -0800
+++ b/nuklear_ui/nuklear.h	Sun Nov 01 12:35:08 2020 -0800
@@ -11368,10 +11368,13 @@
     NK_ASSERT(alloc);
 
     if (!image_memory || !width || !height || !config_list || !count) return nk_false;
+	int pixel_area_estimate = 0;
     for (config_iter = config_list; config_iter; config_iter = config_iter->next) {
         range_count = nk_range_count(config_iter->range);
         total_range_count += range_count;
-        total_glyph_count += nk_range_glyph_count(config_iter->range, range_count);
+		int glyphs = nk_range_glyph_count(config_iter->range, range_count);
+        total_glyph_count += glyphs;
+		pixel_area_estimate += glyphs * config_iter->size * config_iter->size;
     }
 
     /* setup font baker from temporary memory */
@@ -11382,7 +11385,13 @@
     }
 
     *height = 0;
-    *width = (total_glyph_count > 1000) ? 1024 : 512;
+	int width_estimate = sqrt(pixel_area_estimate) + 0.5;
+	*width = 128;
+	while (*width < width_estimate)
+	{
+		*width *= 2;
+	}
+    //*width = (total_glyph_count > 1000) ? 1024 : 512;
     nk_tt_PackBegin(&baker->spc, 0, (int)*width, (int)max_height, 0, 1, alloc);
     {
         int input_i = 0;
--- a/nuklear_ui/nuklear_sdl_gles2.h	Sun Nov 01 12:32:25 2020 -0800
+++ b/nuklear_ui/nuklear_sdl_gles2.h	Sun Nov 01 12:35:08 2020 -0800
@@ -166,8 +166,13 @@
     glBindTexture(GL_TEXTURE_2D, dev->font_tex);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR);
     glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_LINEAR);
+	printf("Creating texture atlas texture with size %dx%d\n", width, height);
     glTexImage2D(GL_TEXTURE_2D, 0, GL_RGBA, (GLsizei)width, (GLsizei)height, 0,
                 GL_RGBA, GL_UNSIGNED_BYTE, image);
+	GLenum err = glGetError();
+	if (err != GL_NO_ERROR) {
+		printf("glTexImage2D failed with error %d\n", err);
+	}
 }
 
 NK_API void