X-Git-Url: https://git.ucc.asn.au/?p=ipdf%2Fcode.git;a=blobdiff_plain;f=src%2Fview.cpp;h=2d9d0b39dcfe815488c42f0b89406a555e8f6dec;hp=6bae54e4261045cc34a3374bbe4685558ccbd8af;hb=3ab3475a54c82cb9f5e0b1dbb88035f341b92d49;hpb=cfe7da763b5d8ef4252ddb94558abb080bbd893d diff --git a/src/view.cpp b/src/view.cpp index 6bae54e..2d9d0b3 100644 --- a/src/view.cpp +++ b/src/view.cpp @@ -21,10 +21,11 @@ View::View(Document & document, Screen & screen, const Rect & bounds, const Colo Debug("View Created - Bounds => {%s}", m_bounds.Str().c_str()); // Create ObjectRenderers - new's match delete's in View::~View - // Ok, look, this may seem disgusting, but go look at View::PrepareRender before you murder me + //TODO: Don't forget to put new renderers here or things will be segfaultastic m_object_renderers[RECT_FILLED] = new RectFilledRenderer(); m_object_renderers[RECT_OUTLINE] = new RectOutlineRenderer(); m_object_renderers[CIRCLE_FILLED] = new CircleFilledRenderer(); + m_object_renderers[BEZIER] = new BezierRenderer(); // To add rendering for a new type of object; // 1. Add enum to ObjectType in ipdf.h @@ -41,7 +42,7 @@ View::~View() { for (unsigned i = 0; i < m_object_renderers.size(); ++i) { - delete m_object_renderers[i]; + delete m_object_renderers[i]; // delete's match new's in constructor } m_object_renderers.clear(); delete [] m_cpu_rendering_pixels; @@ -87,7 +88,7 @@ void View::ScaleAroundPoint(Real x, Real y, Real scale_amount) m_bounds.y = y - top; m_bounds.w *= scale_amount; m_bounds.h *= scale_amount; - Debug("View Bounds => %s", m_bounds.Str().c_str()); + //Debug("Scale at {%s, %s} by %s View Bounds => %s", x.Str().c_str(), y.Str().c_str(), scale_amount.Str().c_str(), m_bounds.Str().c_str()); if (!m_use_gpu_transform) m_buffer_dirty = true; m_bounds_dirty = true; @@ -146,13 +147,15 @@ void View::Render(int width, int height) if (m_use_gpu_transform) { - GLfloat glbounds[] = {static_cast(Float(m_bounds.x)), static_cast(Float(m_bounds.y)), static_cast(Float(m_bounds.w)), static_cast(Float(m_bounds.h))}; - m_bounds_ubo.Upload(sizeof(float)*4, glbounds); + GLfloat glbounds[] = {static_cast(Float(m_bounds.x)), static_cast(Float(m_bounds.y)), static_cast(Float(m_bounds.w)), static_cast(Float(m_bounds.h)), + 0.0, 0.0, 640.0, 480.0}; + m_bounds_ubo.Upload(sizeof(float)*8, glbounds); } else { - GLfloat glbounds[] = {0.0f, 0.0f, 1.0f, 1.0f}; - m_bounds_ubo.Upload(sizeof(float)*4, glbounds); + GLfloat glbounds[] = {0.0f, 0.0f, 1.0f, 1.0f, + 0.0f, 0.0f, 640.0f, 480.0f}; + m_bounds_ubo.Upload(sizeof(float)*8, glbounds); } m_bounds_dirty = false; @@ -212,7 +215,6 @@ void View::Render(int width, int height) void View::UpdateObjBoundsVBO() { - Debug("Called"); m_objbounds_vbo.Invalidate(); m_objbounds_vbo.SetType(GraphicsBuffer::BufferTypeVertex); if (m_use_gpu_transform) @@ -257,7 +259,9 @@ void View::UpdateObjBoundsVBO() */ void View::PrepareRender() { + Debug("Recreate buffers with %u objects", m_document.ObjectCount()); // Prepare bounds vbo + m_bounds_ubo.Invalidate(); m_bounds_ubo.SetType(GraphicsBuffer::BufferTypeUniform); m_bounds_ubo.SetUsage(GraphicsBuffer::BufferUsageStreamDraw); @@ -278,12 +282,15 @@ void View::PrepareRender() ObjectType type = m_document.m_objects.types[id]; m_object_renderers.at(type)->AddObjectToBuffers(id); // Use at() in case the document is corrupt TODO: Better error handling? // (Also, Wow I just actually used std::vector::at()) + // (Also, I just managed to make it throw an exception because I'm a moron) + Debug("Object of type %d", type); } // Finish the buffers for (unsigned i = 0; i < m_object_renderers.size(); ++i) { m_object_renderers[i]->FinaliseBuffers(); - } + } + dynamic_cast(m_object_renderers[BEZIER])->PrepareBezierGPUBuffer(m_document.m_objects); m_render_dirty = false; }