X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fscreen.cpp;h=6d67820126f5ab24cee9dab9a5ca40934c8a5417;hp=9687c5514279b6bc6619e5de2af873333c16ac7f;hb=57c3c69cbc7d9b3724874fd83cd001984ac21b6a;hpb=b8c16a21a8f59ff8cde6bb546cc44a6fc422c2b7 diff --git a/src/screen.cpp b/src/screen.cpp index 9687c55..6d67820 100644 --- a/src/screen.cpp +++ b/src/screen.cpp @@ -5,6 +5,7 @@ #include // for access(2) #include // for access(2) +#include "bufferbuilder.h" #include "shaderprogram.h" #define BASICTEX_VERT \ @@ -308,7 +309,7 @@ void Screen::RenderBMP(const char * filename) const int w = bmp->w; int h = bmp->h; - GLenum texture_format; + GLenum texture_format = GL_RGBA; switch (bmp->format->BytesPerPixel) { case 4: //contains alpha @@ -330,9 +331,9 @@ void Screen::RenderBMP(const char * filename) const quad_vertex_buffer.SetType(GraphicsBuffer::BufferTypeVertex); GLfloat quad[] = { 0, 0, 0, 0, - 1, 0, ViewportWidth(), 0, - 1, 1, ViewportWidth(), ViewportHeight(), - 0, 1, 0, ViewportHeight() + 1, 0, (float)ViewportWidth(), 0, + 1, 1, (float)ViewportWidth(), (float)ViewportHeight(), + 0, 1, 0, (float)ViewportHeight() }; quad_vertex_buffer.Upload(sizeof(GLfloat) * 16, quad); quad_vertex_buffer.Bind(); @@ -415,8 +416,8 @@ void Screen::DebugFontFlush() glEnableVertexAttribArray(1); glEnable(GL_PRIMITIVE_RESTART); glPrimitiveRestartIndex(65535); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), (void*)(2*sizeof(float))); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), 0); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), 0); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4*sizeof(float), (void*)(2*sizeof(float))); glDrawElements(GL_TRIANGLE_STRIP, m_debug_font_index_head, GL_UNSIGNED_SHORT, 0); glDisable(GL_PRIMITIVE_RESTART); glDisableVertexAttribArray(1); @@ -424,6 +425,8 @@ void Screen::DebugFontFlush() glDisable(GL_BLEND); + m_debug_font_vertices.Invalidate(); + m_debug_font_indices.Invalidate(); m_debug_font_vertex_head = 0; m_debug_font_index_head = 0; } @@ -432,11 +435,17 @@ 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); - uint16_t *indexData = (uint16_t*)m_debug_font_indices.MapRange(m_debug_font_index_head*sizeof(uint16_t), m_debug_font_indices.GetSize() - m_debug_font_index_head*sizeof(uint16_t), false, true, true); + struct fontvertex + { + float x, y, s, t; + }; + + BufferBuilder vertexData(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), m_debug_font_vertices.GetSize() - m_debug_font_vertex_head*sizeof(float)); + BufferBuilder indexData(m_debug_font_indices.MapRange(m_debug_font_index_head*sizeof(uint16_t), m_debug_font_indices.GetSize() - m_debug_font_index_head*sizeof(uint16_t), false, true, true), m_debug_font_indices.GetSize() - m_debug_font_index_head*sizeof(uint16_t)); + + size_t baseVertex = m_debug_font_vertex_head/4; while (*str) { - if ((m_debug_font_vertex_head*sizeof(float) + 16*sizeof(float) >= m_debug_font_vertices.GetSize() ) || - (m_debug_font_index_head*sizeof(uint16_t) + 5*sizeof(uint16_t) >= m_debug_font_indices.GetSize())) + if (!vertexData.Free(4) || !indexData.Free(5)) { m_debug_font_indices.UnMap(); m_debug_font_vertices.UnMap(); @@ -444,31 +453,22 @@ void Screen::DebugFontPrint(const char* str) DebugFontPrint(str); return; } - if (*str >= 32 && *str < 128) { + if (*str >= 32 && (unsigned char)(*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); - *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++; - - *indexData = m_debug_font_vertex_head/4; indexData++; - *indexData = m_debug_font_vertex_head/4+1; indexData++; - *indexData = m_debug_font_vertex_head/4+3; indexData++; - *indexData = m_debug_font_vertex_head/4+2; indexData++; - *indexData = 65535; indexData++; + size_t index = vertexData.Add({q.x0, q.y0, q.s0, q.t0}); + index += baseVertex; + indexData.Add(index); + index = vertexData.Add({q.x1, q.y0, q.s1, q.t0}); + index += baseVertex; + indexData.Add(index); + index = vertexData.Add({q.x0, q.y1, q.s0, q.t1}); + index += baseVertex; + indexData.Add(index); + index = vertexData.Add({q.x1, q.y1, q.s1, q.t1}); + index += baseVertex; + indexData.Add(index); + indexData.Add(65535); m_debug_font_vertex_head += 16; m_debug_font_index_head += 5;