From: David Gow Date: Tue, 22 Apr 2014 07:43:45 +0000 (+0800) Subject: Horrible debug font bufferification. (Sorry) X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=commitdiff_plain;h=bdda0103bf26d215d41093316ca0e15cd67fec1d Horrible debug font bufferification. (Sorry) --- diff --git a/bin/ipdf b/bin/ipdf index 0c11d65..ce60299 100755 Binary files a/bin/ipdf and b/bin/ipdf differ diff --git a/src/graphicsbuffer.cpp b/src/graphicsbuffer.cpp index 43143d6..6f9ea9a 100644 --- a/src/graphicsbuffer.cpp +++ b/src/graphicsbuffer.cpp @@ -1,4 +1,5 @@ #include "graphicsbuffer.h" +#include "log.h" #define GL_GLEXT_PROTOTYPES #include #include @@ -67,6 +68,8 @@ static GLenum BufferTypeToGLType(GraphicsBuffer::BufferType buffer_type) GraphicsBuffer::GraphicsBuffer() { + m_invalidated = true; + m_buffer_size = 0; SetUsage(BufferUsageStaticDraw); } @@ -107,7 +110,7 @@ void* GraphicsBuffer::MapRange(int offset, int length, bool read, bool write, bo { GLbitfield access = ((read)?GL_MAP_READ_BIT:0) | ((write)?GL_MAP_WRITE_BIT:0) | ((invalidate)?GL_MAP_INVALIDATE_RANGE_BIT:0); GLenum target = BufferTypeToGLType(m_buffer_type); - + Bind(); return glMapBufferRange(target, offset, length, access); @@ -164,6 +167,7 @@ void GraphicsBuffer::Resize(size_t length) glCopyBufferSubData(GL_COPY_READ_BUFFER, GL_COPY_WRITE_BUFFER, 0, 0, m_buffer_size); glDeleteBuffers(1, &old_buffer); } + m_buffer_size = length; } diff --git a/src/graphicsbuffer.h b/src/graphicsbuffer.h index 15e5b42..d74d344 100644 --- a/src/graphicsbuffer.h +++ b/src/graphicsbuffer.h @@ -52,6 +52,7 @@ namespace IPDF void UploadRange(size_t length, intptr_t offset, const void *data); void Resize(size_t length); + const size_t GetSize() const { return m_buffer_size; } void Bind(); private: diff --git a/src/screen.cpp b/src/screen.cpp index 5c3957c..8adb195 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -21,6 +21,8 @@ Screen::Screen() m_gl_context = SDL_GL_CreateContext(m_window); + m_debug_font_atlas = 0; + ResizeViewport(800, 600); Clear(); @@ -130,6 +132,8 @@ void Screen::SetMouseCursor(Screen::MouseCursors cursor) void Screen::Present() { + if (m_debug_font_atlas) + DebugFontFlush(); SDL_GL_SwapWindow(m_window); } @@ -248,16 +252,23 @@ void Screen::DebugFontInit(const char *name, float font_size) glTexImage2D(GL_TEXTURE_2D, 0, GL_ALPHA, 1024,1024, 0, GL_ALPHA, GL_UNSIGNED_BYTE, font_atlas_data); glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_LINEAR); m_debug_font_size = font_size; + + m_debug_font_vertices.SetUsage(GraphicsBuffer::BufferUsageStreamDraw); + m_debug_font_vertices.SetType(GraphicsBuffer::BufferTypeVertex); + m_debug_font_vertices.Upload(512, nullptr); + m_debug_font_vertex_head = 0; } void Screen::DebugFontClear() { m_debug_font_x = m_debug_font_y = 0; + if (!m_debug_font_atlas) return; DebugFontPrint("\n"); } -void Screen::DebugFontPrint(const char* str) +void Screen::DebugFontFlush() { + glBindFramebuffer(GL_FRAMEBUFFER, 0); glMatrixMode(GL_PROJECTION); glPushMatrix(); glLoadIdentity(); @@ -266,21 +277,68 @@ void Screen::DebugFontPrint(const char* str) glPushMatrix(); glLoadIdentity(); + glColor4f(0,0,0,1); - + glEnable(GL_TEXTURE_2D); glEnable(GL_BLEND); glBlendFunc(GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); glBindTexture(GL_TEXTURE_2D, m_debug_font_atlas); - glBegin(GL_QUADS); + + m_debug_font_vertices.Bind(); + glEnableClientState(GL_VERTEX_ARRAY); + glEnableClientState(GL_TEXTURE_COORD_ARRAY); + glVertexPointer(2, GL_FLOAT, 4*sizeof(float), (void*)(2*sizeof(float))); + glTexCoordPointer(2, GL_FLOAT, 4*sizeof(float), 0); + Debug("Flushing Debug Font arrays, %d verts (%d floats)", m_debug_font_vertex_head/4, m_debug_font_vertex_head); + glDrawArrays(GL_QUADS, 0, m_debug_font_vertex_head/4); + glDisableClientState(GL_VERTEX_ARRAY); + glDisableClientState(GL_TEXTURE_COORD_ARRAY); + + glDisable(GL_BLEND); + glDisable(GL_TEXTURE_2D); + glPopMatrix(); + glMatrixMode(GL_PROJECTION); + glPopMatrix(); + + m_debug_font_vertex_head = 0; +} + +void Screen::DebugFontPrint(const char* str) +{ + if (!m_debug_font_atlas) return; + + float *vertexData = (float*)m_debug_font_vertices.MapRange(m_debug_font_vertex_head*sizeof(float), m_debug_font_vertices.GetSize() - m_debug_font_vertex_head*sizeof(float), false, true, true); while (*str) { + if (m_debug_font_vertex_head*sizeof(float) + 16*sizeof(float) >= m_debug_font_vertices.GetSize() ) + { + m_debug_font_vertices.UnMap(); + DebugFontFlush(); + DebugFontPrint(str); + return; + } if (*str >= 32 && *str < 128) { stbtt_aligned_quad q; stbtt_GetBakedQuad(m_debug_font_rects, 1024,1024, *str-32, &m_debug_font_x,&m_debug_font_y,&q,1); - glTexCoord2f(q.s0,q.t0); glVertex2f(q.x0,q.y0); - glTexCoord2f(q.s1,q.t0); glVertex2f(q.x1,q.y0); - glTexCoord2f(q.s1,q.t1); glVertex2f(q.x1,q.y1); - glTexCoord2f(q.s0,q.t1); glVertex2f(q.x0,q.y1); + *vertexData = q.s0; vertexData++; + *vertexData = q.t0; vertexData++; + *vertexData = q.x0; vertexData++; + *vertexData = q.y0; vertexData++; + *vertexData = q.s1; vertexData++; + *vertexData = q.t0; vertexData++; + *vertexData = q.x1; vertexData++; + *vertexData = q.y0; vertexData++; + *vertexData = q.s1; vertexData++; + *vertexData = q.t1; vertexData++; + *vertexData = q.x1; vertexData++; + *vertexData = q.y1; vertexData++; + *vertexData = q.s0; vertexData++; + *vertexData = q.t1; vertexData++; + *vertexData = q.x0; vertexData++; + *vertexData = q.y1; vertexData++; + + m_debug_font_vertex_head += 16; + } else if (*str == '\n') { @@ -289,12 +347,8 @@ void Screen::DebugFontPrint(const char* str) } ++str; } - glEnd(); - glDisable(GL_BLEND); - glDisable(GL_TEXTURE_2D); - glPopMatrix(); - glMatrixMode(GL_PROJECTION); - glPopMatrix(); + m_debug_font_vertices.UnMap(); + //DebugFontFlush(); } void Screen::DebugFontPrintF(const char *fmt, ...) diff --git a/src/screen.h b/src/screen.h index 66590e7..ddcf8ca 100644 --- a/src/screen.h +++ b/src/screen.h @@ -6,6 +6,7 @@ #include #include "stb_truetype.h" +#include "graphicsbuffer.h" namespace IPDF { @@ -59,6 +60,7 @@ namespace IPDF void RenderBMP(const char * filename) const; private: void ResizeViewport(int width, int height); + void DebugFontFlush(); MouseHandler m_mouse_handler; int m_last_mouse_x; @@ -73,6 +75,10 @@ namespace IPDF float m_debug_font_x; float m_debug_font_y; float m_debug_font_size; + GraphicsBuffer m_debug_font_vertices; + GraphicsBuffer m_debug_font_indices; + int m_debug_font_vertex_head; + int m_debug_font_index_head; }; }