Render object range on the CPU
[ipdf/code.git] / src / view.cpp
index 6bae54e..eb269a2 100644 (file)
@@ -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,19 +147,24 @@ void View::Render(int width, int height)
 
        if (m_use_gpu_transform)
        {
-               GLfloat glbounds[] = {static_cast<GLfloat>(Float(m_bounds.x)), static_cast<GLfloat>(Float(m_bounds.y)), static_cast<GLfloat>(Float(m_bounds.w)), static_cast<GLfloat>(Float(m_bounds.h))};
-               m_bounds_ubo.Upload(sizeof(float)*4, glbounds);
+               GLfloat glbounds[] = {static_cast<GLfloat>(Float(m_bounds.x)), static_cast<GLfloat>(Float(m_bounds.y)), static_cast<GLfloat>(Float(m_bounds.w)), static_cast<GLfloat>(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;
 
        m_cached_display.Bind(); //NOTE: This is redundant; Clear already calls Bind
        m_cached_display.Clear();
 
+       // When we QuadTree, this will be magic.
+       int first_obj = 0;
+       int last_obj = m_document.ObjectCount();
 
        // Render using GPU
        if (m_use_gpu_rendering) 
@@ -175,7 +181,7 @@ void View::Render(int width, int height)
        
                for (unsigned i = 0; i < m_object_renderers.size(); ++i)
                {
-                       m_object_renderers[i]->RenderUsingGPU();
+                       m_object_renderers[i]->RenderUsingGPU(first_obj, last_obj);
                }
                
                glDisableVertexAttribArray(0);
@@ -200,7 +206,7 @@ void View::Render(int width, int height)
 
                for (unsigned i = 0; i < m_object_renderers.size(); ++i)
                {
-                       m_object_renderers[i]->RenderUsingCPU(m_document.m_objects, *this, {m_cpu_rendering_pixels, width, height});
+                       m_object_renderers[i]->RenderUsingCPU(m_document.m_objects, *this, {m_cpu_rendering_pixels, width, height}, first_obj, last_obj);
                }
                m_screen.RenderPixels(0,0,width, height, m_cpu_rendering_pixels); //TODO: Make this work :(
                // Debug for great victory (do something similar for GPU and compare?)
@@ -212,7 +218,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 +262,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 +285,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<BezierRenderer*>(m_object_renderers[BEZIER])->PrepareBezierGPUBuffer(m_document.m_objects);
        m_render_dirty = false;
 }

UCC git Repository :: git.ucc.asn.au