[Paraview] Using vtkIceTRenderManager

Mario mario.orefice at gmail.com
Tue Dec 5 05:52:35 EST 2006


Hi Kenneth,
thank you for your answering,
I tried vtkIceTRenderManager with the vtk DistributedData test...
It gives me a run time error and when I debug it crashes at the
cam->Register(this); instruction in vtkRenderer.cxx, SetActiveCamera method...
what's wrong?!?
Here's the code:

struct DDArgs_tmp
{
  int* retVal;
  int argc;
  char** argv;
};

static void Run(vtkMultiProcessController *contr, void *arg)
{
  int i, go;
  DDArgs_tmp *args = reinterpret_cast<DDArgs_tmp *>(arg);

  vtkIceTRenderManager *prm = vtkIceTRenderManager::New();

  // READER

  vtkDataSetReader *dsr = vtkDataSetReader::New();
  vtkUnstructuredGrid *ug = vtkUnstructuredGrid::New();

  vtkDataSet *ds = NULL;

  if (Me == 0)
    {
		char* fname = "c:/vtk/vtkdata/Data/tetraMesh.vtk";

    dsr->SetFileName(fname);

    ds = dsr->GetOutput();

    dsr->Update();
    go = 1;

    if ((ds == NULL) || (ds->GetNumberOfCells() == 0))
      {
      if (ds) cout << "Failure: input file has no cells" << endl;
      go = 0;
      }
    }
  else
    {
    ds = (vtkDataSet *)ug;
    }

  vtkMPICommunicator *comm =
    vtkMPICommunicator::SafeDownCast(contr->GetCommunicator());

  comm->Broadcast(&go, 1, 0);

  if (!go){
    dsr->Delete();
    ug->Delete();
    prm->Delete();
    return;
  }

  // DATA DISTRIBUTION FILTER

  vtkDistributedDataFilter *dd = vtkDistributedDataFilter::New();

  dd->SetInput(ds);
  dd->SetController(contr);

  dd->SetBoundaryModeToSplitBoundaryCells();  // clipping
  dd->UseMinimalMemoryOff();

  // COLOR BY PROCESS NUMBER

  vtkPieceScalars *ps = vtkPieceScalars::New();
  ps->SetInputConnection(dd->GetOutputPort());
  ps->SetScalarModeToCellData();

  // MORE FILTERING - this will request ghost cells

  vtkDataSetSurfaceFilter *dss = vtkDataSetSurfaceFilter::New();
  dss->SetInputConnection(ps->GetOutputPort());

  // COMPOSITE RENDER

  vtkPolyDataMapper *mapper = vtkPolyDataMapper::New();
  mapper->SetInputConnection(dss->GetOutputPort());

  mapper->SetColorModeToMapScalars();
  mapper->SetScalarModeToUseCellFieldData();
  mapper->SelectColorArray("Piece");
  mapper->SetScalarRange(0, NumProcs-1);

  vtkActor *actor = vtkActor::New();
  actor->SetMapper(mapper);

  //vtkRenderer *renderer = prm->MakeRenderer();
  vtkIceTRenderer *renderer = vtkIceTRenderer::New();
  renderer->AddActor(actor);

  vtkRenderWindow *renWin = prm->MakeRenderWindow();
  renWin->AddRenderer(renderer);

  renderer->SetBackground(0,0,0);
  renWin->SetSize(300,300);
  renWin->SetPosition(0, 360*Me);

  prm->SetRenderWindow(renWin);
  prm->SetController(contr);

  prm->InitializeOffScreen();   // Mesa GL only

  // We must update the whole pipeline here, otherwise node 0
  // goes into GetActiveCamera which updates the pipeline, putting
  // it into vtkDistributedDataFilter::Execute() which then hangs.
  // If it executes here, dd will be up-to-date won't have to
  // execute in GetActiveCamera.

  mapper->SetPiece(Me);
  mapper->SetNumberOfPieces(NumProcs);
  mapper->Update();

  if (Me == 0)
    {
    renderer->ResetCamera();
    vtkCamera *camera = renderer->GetActiveCamera();
    camera->UpdateViewport(renderer);
    camera->ParallelProjectionOn();
    camera->SetParallelScale(16);

    renWin->Render();
    renWin->Render();

    *(args->retVal) = vtkRegressionTester::Test(args->argc,
args->argv, renWin, 10);

    for (i=1; i < NumProcs; i++)
      {
      contr->Send(args->retVal, 1, i, 0x11);
      }

    prm->StopServices();
    }
  else
    {
    prm->StartServices();
    contr->Receive(args->retVal, 1, 0, 0x11);
    }

  if (*(args->retVal) == vtkTesting::PASSED)
    {
    // Now try using the memory conserving *Lean methods.  The
    // image produced should be identical

    dd->UseMinimalMemoryOn();
    mapper->SetPiece(Me);
    mapper->SetNumberOfPieces(NumProcs);
    mapper->Update();

    if (Me == 0)
      {
      renderer->ResetCamera();
      vtkCamera *camera = renderer->GetActiveCamera();
      camera->UpdateViewport(renderer);
      camera->ParallelProjectionOn();
      camera->SetParallelScale(16);

      renWin->Render();
      renWin->Render();

      *(args->retVal) = vtkRegressionTester::Test(args->argc,
args->argv, renWin, 10);

      for (i=1; i < NumProcs; i++)
        {
        contr->Send(args->retVal, 1, i, 0x11);
        }

      prm->StopServices();
      }
    else
      {
      prm->StartServices();
      contr->Receive(args->retVal, 1, 0, 0x11);
      }
    }

  // CLEAN UP

  mapper->Delete();
  actor->Delete();
  renderer->Delete();
  renWin->Delete();

  dd->Delete();
  dsr->Delete();
  ug->Delete();

  ps->Delete();
  dss->Delete();

  prm->Delete();
}

int main(int argc, char **argv)
{
  int retVal = 1;

  vtkMPIController *contr = vtkMPIController::New();
  contr->Initialize(&argc, &argv);

  vtkMultiProcessController::SetGlobalController(contr);

  NumProcs = contr->GetNumberOfProcesses();
  Me = contr->GetLocalProcessId();

  if (NumProcs != 2)
    {
    if (Me == 0)
      {
      cout << "DistributedData test requires 2 processes" << endl;
      }
    contr->Delete();
    return retVal;
    }

  if (!contr->IsA("vtkMPIController"))
    {
    if (Me == 0)
      {
      cout << "DistributedData test requires MPI" << endl;
      }
    contr->Delete();
    return retVal;   // is this the right error val?   TODO
    }

  // ----------------------------------------------
  DDArgs_tmp args;
  args.retVal = &retVal;
  args.argc = argc;
  args.argv = argv;
  // ---------------------------------------------

  contr->SetSingleMethod(Run, &args);
  contr->SingleMethodExecute();

  contr->Finalize();
  contr->Delete();
  int inputval;
  std::cin>> inputval;

  return !retVal;
}

I'm sorry about my bad english...
Thank you

Mario


2006/11/29, Moreland, Kenneth <kmorel at sandia.gov>:
>
>
>
> Mario,
>
>  vtkIceTRenderModule was originally designed to be a drop in replacement for
> any vtkParallelRenderManager (vtkCompositeRenderManager included) assuming
> you correctly use vtkIceTRenderer in place vtkRenderer.  That said, there
> have been many ParaView-specific changes made to these classes.
>
>  So my advice: try it.  It should work if you are not doing anything to
> fancy.  If not, you'll have to inquire about our money back guarantee.
>
>  If it doesn't work, give us a holler.  There may be an easy fix you can
> perform.  If it does work, let the future users know.
>
>  -Ken
>
>
>  -----Original Message-----
>  From: paraview-bounces+kmorel=sandia.gov at paraview.org on behalf of Mario
>  Sent: Wed 11/29/2006 8:37 AM
>  To: paraview at paraview.org
>  Subject: Re: [Paraview] Using vtkIceTRenderManager
>
>  2006/11/29, Mario <mario.orefice at gmail.com>:
>  > Hi,
>  > I want to use vtkIceTRenderManager and vtkIceTRenderer from Paraview
>  > in my vtk application, but I have a link problem:
>  >
>  > unresolved external symbol"public: static class vtkIceTRenderManager *
>  > __cdecl vtkIceTRenderManager::New(void)"
>  > (?New at vtkIceTRenderManager@@SAPAV1 at XZ)
>  >
>  > I'm a newbie, how can I resolve that? It's a cmake configuration problem?
>
>  Problem solved! I had to set advanced options in cmake and turn
>  paraview_use_icet on...
>  Now I'm waiting for your suggestions here:
>
>  > I'm just modifying vtk's parallel processing examples, using
>  > vtkIceTRenderManager instead of vtkCompositeRenderManager, will it
>  > work?
>  >
>  > There are some other examples where i can understand using of
>  > vtkIceTRenderManager?
>  >
>  > Thank you so much for helping
>  >
>  > Mario
>  >
>  _______________________________________________
>  ParaView mailing list
>  ParaView at paraview.org
>  http://www.paraview.org/mailman/listinfo/paraview
>
>


More information about the ParaView mailing list