X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fobjectrenderer.cpp;h=ac25c4ac04ef96d33b926396b3bee57d104cfe8a;hp=c552bd868d5efb8b3ffd350dd56916f3c5f44b4e;hb=6ad7fc3c833837713405b64a50e62dd128cb7a30;hpb=f59f24dff392428d7219ba2d6be5e1e81c344ee0 diff --git a/src/objectrenderer.cpp b/src/objectrenderer.cpp index c552bd8..ac25c4a 100644 --- a/src/objectrenderer.cpp +++ b/src/objectrenderer.cpp @@ -13,7 +13,9 @@ namespace IPDF /** * ObjectRenderer constructor - * Note we cannot compile the shaders in the constructor because the Screen class needs to initialise GL and it has a ShaderProgram member + * Note we cannot compile the shaders in the ShaderProgram constructor + * because the Screen class needs to initialise GL first and it has a + * ShaderProgram member */ ObjectRenderer::ObjectRenderer(const ObjectType & type, const char * vert_glsl_file, const char * frag_glsl_file, const char * geom_glsl_file) @@ -225,10 +227,13 @@ void BezierRenderer::RenderUsingCPU(const Objects & objects, const View & view, Real x[2]; Real y[2]; control.Evaluate(x[0], y[0], Real(0)); - for (unsigned j = 1; j <= 100; ++j) + int64_t blen = max(2L, min(100L, pix_bounds.w)); + Real invblen(1); invblen /= blen; + Debug("Using %li lines, inverse %f", blen, Double(invblen)); + for (int64_t j = 1; j <= blen; ++j) { - control.Evaluate(x[j % 2],y[j % 2], Real(0.01)*j); - ObjectRenderer::RenderLineOnCPU((int64_t)x[0],(int64_t)y[0], (int64_t)x[1],(int64_t)y[1], target); + control.Evaluate(x[j % 2],y[j % 2], invblen*j); + ObjectRenderer::RenderLineOnCPU((int64_t)Double(x[0]),(int64_t)Double(y[0]), (int64_t)Double(x[1]),(int64_t)Double(y[1]), target); } /* @@ -251,6 +256,49 @@ void BezierRenderer::RenderUsingCPU(const Objects & objects, const View & view, } } +void BezierRenderer::PrepareBezierGPUBuffer(const Objects& objects) +{ + m_bezier_coeffs.SetType(GraphicsBuffer::BufferTypeTexture); + m_bezier_coeffs.SetUsage(GraphicsBuffer::BufferUsageDynamicDraw); + m_bezier_coeffs.Resize(objects.beziers.size()*sizeof(GPUBezierCoeffs)); + BufferBuilder builder(m_bezier_coeffs.Map(false, true, true), m_bezier_coeffs.GetSize()); + + for (auto bez : objects.beziers) + { + GPUBezierCoeffs coeffs = { + Float(bez.x0), Float(bez.y0), + Float(bez.x1 - bez.x0), Float(bez.y1 - bez.y0), + Float(bez.x2 - bez.x0), Float(bez.y2 - bez.y0) + }; + builder.Add(coeffs); + } + m_bezier_coeffs.UnMap(); + glGenTextures(1, &m_bezier_buffer_texture); + glBindTexture(GL_TEXTURE_BUFFER, m_bezier_buffer_texture); + glTexBuffer(GL_TEXTURE_BUFFER, GL_RG32F, m_bezier_coeffs.GetHandle()); + + m_bezier_ids.SetType(GraphicsBuffer::BufferTypeTexture); + m_bezier_ids.SetUsage(GraphicsBuffer::BufferUsageDynamicDraw); + m_bezier_ids.Upload(objects.data_indices.size() * sizeof(uint32_t), &objects.data_indices[0]); + + glGenTextures(1, &m_bezier_id_buffer_texture); + glActiveTexture(GL_TEXTURE1); + glBindTexture(GL_TEXTURE_BUFFER, m_bezier_id_buffer_texture); + glTexBuffer(GL_TEXTURE_BUFFER, GL_R32I, m_bezier_ids.GetHandle()); + glActiveTexture(GL_TEXTURE0); +} + +void BezierRenderer::RenderUsingGPU() +{ + if (!m_shader_program.Valid()) + Warn("Shader is invalid (objects are of type %d)", m_type); + m_shader_program.Use(); + glUniform1i(m_shader_program.GetUniformLocation("bezier_buffer_texture"), 0); + glUniform1i(m_shader_program.GetUniformLocation("bezier_id_buffer_texture"), 1); + m_ibo.Bind(); + glDrawElements(GL_LINES, m_indexes.size()*2, GL_UNSIGNED_INT, 0); +} + /** * For debug, save pixels to bitmap */