[vtk-developers] OpenGL2 : VBO update missing for mapper2d

Xabi Riobe xabivtk at gmail.com
Wed Oct 7 05:49:33 EDT 2015


Hi,

There is a missing update of the VBO in vtkOpenGLPolyDataMapper2D when we
use TransformCoordinate and the viewport changes.

In the attached example, a plane is rendered to cover the full window, but
if you resize the window, the plane does not update.

Maybe in vtkOpenGLPolyDataMapper2D::RenderOverlay, we should had a test on
the viewport MTime when updating the VBO? It works if i force to pass this
condition and update:

  if (this->VBOUpdateTime < this->GetMTime() ||
      this->VBOUpdateTime < actor->GetMTime() ||
      this->VBOUpdateTime < input->GetMTime() )
    {
    this->UpdateVBO(actor, viewport);
    this->VBOUpdateTime.Modified();
    }
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20151007/dcee075d/attachment.html>
-------------- next part --------------
#include <vtkActor2D.h>
#include <vtkCoordinate.h>
#include <vtkPlaneSource.h>
#include <vtkPointData.h>
#include <vtkPolyDataMapper2D.h>
#include <vtkRenderer.h>
#include <vtkRenderWindow.h>
#include <vtkRenderWindowInteractor.h>
#include <vtkSmartPointer.h>

int main(int, char *[])
{
   vtkSmartPointer<vtkRenderer> ren1 = vtkSmartPointer<vtkRenderer>::New();
   vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
   renWin->SetSize(512, 512);
   renWin->AddRenderer(ren1);

   vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
   iren->SetRenderWindow(renWin);

   vtkSmartPointer<vtkPlaneSource> source = vtkSmartPointer<vtkPlaneSource>::New();
   source->SetOrigin(0.0, 0.0, 0.0);
   source->SetPoint1(1.0, 0.0, 0.0);
   source->SetPoint2(0.0, 1.0, 0.0);
   source->Update();

   vtkSmartPointer<vtkUnsignedCharArray> scalars = vtkSmartPointer<vtkUnsignedCharArray>::New();
   double bottom[3] = { 255.0, 0, 0 };
   double top[3] = { 0, 255.0, 0 };
   scalars->Initialize();
   scalars->SetNumberOfComponents(3);
   scalars->SetNumberOfTuples(4);
   scalars->InsertTuple(0, bottom);
   scalars->InsertTuple(1, bottom);
   scalars->InsertTuple(2, top);
   scalars->InsertTuple(3, top);
   source->GetOutput()->GetPointData()->SetScalars(scalars);

   vtkSmartPointer<vtkCoordinate> coordinateSystem = vtkSmartPointer<vtkCoordinate>::New();
   coordinateSystem->SetCoordinateSystemToNormalizedViewport();

   vtkSmartPointer<vtkPolyDataMapper2D> mapper = vtkSmartPointer<vtkPolyDataMapper2D>::New();
   mapper->SetInputConnection(source->GetOutputPort());
   mapper->SetTransformCoordinate(coordinateSystem);
   mapper->TransformCoordinateUseDoubleOn();

   vtkSmartPointer<vtkActor2D> actor2d = vtkSmartPointer<vtkActor2D>::New();
   actor2d->SetMapper(mapper);

   ren1->AddActor(actor2d);

   ren1->ResetCamera();
   renWin->Render();
   iren->Start();

   return EXIT_SUCCESS;
}


More information about the vtk-developers mailing list