X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fobjectrenderer.cpp;h=13d17b293d648e515f07a84ead8199822377b124;hp=c552bd868d5efb8b3ffd350dd56916f3c5f44b4e;hb=e7e4a7ad5c977ae089bab7081e7931fd5e423cc1;hpb=f59f24dff392428d7219ba2d6be5e1e81c344ee0 diff --git a/src/objectrenderer.cpp b/src/objectrenderer.cpp index c552bd8..13d17b2 100644 --- a/src/objectrenderer.cpp +++ b/src/objectrenderer.cpp @@ -228,7 +228,7 @@ void BezierRenderer::RenderUsingCPU(const Objects & objects, const View & view, for (unsigned j = 1; j <= 100; ++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); + 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 +251,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 */