[vtkusers] Win32 OffScreen Rendering and Visibility cell selector

Lim, Theodore T.Lim at hw.ac.uk
Fri Mar 23 12:06:59 EDT 2007


Hi David, and fellow vtk-er's,
 
I've made a test to check the changes. What i've done is to create a bounding sphere that encompass a test object.  For each long-lat intersection of the sphere source, I re-locate the current camera position to a long-lat intersection and set the camera's focal point to the center of the bounding sphere. Once the camera is in its new position, it is reset so as to view the whole object. Then the visible test is performed.
 
The OffScreen works great but now i have a problem with OnScreen rendering. I've attached my code below.
 
Test subject:
 
Using STL model - 424000-IDGH.stl (located in vtkData branch)
 
Problem 1:
 
When  renWin->SetOffScreenRendering(0) , the first time through the 'for' loop (i.e. when i = 0), vtkVisibleCellSelector works fine. The number of cells returned is 2114 (based on the window size 800x800).
 
Then, for any value of i > 0, vtkVisibleCellSelector always returns 1 cell. Why??
 
Problem 2:
 
When  renWin->SetOffScreenRendering(1), and i = 0, the number of cells returned is 2116. Shouldn't this be the same as when renWin->SetOffScreenRendering(0), i.e. return 2114 cells??
 
For any value i > 0, there are always cells being returned (Yay!). Some results: When i = 1 (3448 cells), i = 2 (2574 cells). No complaints here, i'm getting cells back eventhough there are a couple extra (perhaps?).
 
Would appreciate if you or anyone else can spot the errors i'm getting and how to solve it.
 
Many thanks in advance, 
Theo.
 
//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
 
// TestVCellSelector.cpp : Defines the entry point for the console application.
//
#include <stdio.h>
#include <stdlib.h>
#include <iostream>
#include <fstream>
#include <tchar.h>
#include "vtkRenderer.h"
#include "vtkRenderWindow.h"
#include "vtkRenderWindowInteractor.h"
#include "vtkSphereSource.h"
#include "vtkPolyDataMapper.h"
#include "vtkActor.h"
#include "vtkInteractorStyleTrackballCamera.h"
#include "vtkCallbackCommand.h"
#include "vtkVisibleCellSelector.h"
#include "vtkSelection.h"
#include "vtkExtractSelectedPolyDataIds.h"
#include "vtkIdTypeArray.h"
#include "vtkCamera.h"
#include "vtkSmartPointer.h"
#include "vtkSTLReader.h"
#include "vtkProperty.h"
#include "vtkPoints.h"
#include "vtkWin32OpenGLRenderWindow.h"
#include "vtkWindowToImageFilter.h"
#include "vtkJPEGWriter.h"
#include "vtkUnsignedCharArray.h"
using namespace std;
int main()
{
 // Standard rendering classes
 vtkSmartPointer<vtkRenderer> renderer = vtkSmartPointer<vtkRenderer>::New();
 // set up the view
 renderer->GetActiveCamera()->SetViewUp(0, 1, 0);
 renderer->SetBackground(0.0,0.0,0.0);
 // set render window
 vtkSmartPointer<vtkRenderWindow> renWin = vtkSmartPointer<vtkRenderWindow>::New();
 renWin->AddRenderer(renderer);
 renWin->SetSize(800,800);
 /***********************************/
 // In 'for' loop below:
 // Works great offscreen with vtkVisibleCellSelector (huzzahhh!)
 //renWin->SetOffScreenRendering(1);
 // Works 1st time when set onscreen, faults after that (returns only 1 cell -- why??!!).
 renWin->SetOffScreenRendering(0);
 /***********************************/
 // set interactor
 vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
 iren->SetRenderWindow(renWin); 
 //use the trackball camera interactor style
 vtkSmartPointer<vtkInteractorStyleTrackballCamera> style = vtkSmartPointer<vtkInteractorStyleTrackballCamera>::New();
 iren->SetInteractorStyle(style);
 ////////////////////////////////////////////////////////////
 // load test part
 vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
 reader->SetFileName("C:/VTKData/Data/42400-IDGH.stl");
 // set on-screen mapper
 vtkSmartPointer<vtkPolyDataMapper> map1 = vtkSmartPointer<vtkPolyDataMapper>::New(); 
 map1->SetInput(reader->GetOutput());
 map1->Update();
 // set on-screen actor
 vtkSmartPointer<vtkActor> act1 = vtkSmartPointer<vtkActor>::New();
 act1->SetMapper(map1);
 renderer->AddActor(act1);
 // make a scaning sphere template
 int res = 10;
 double diagonal = act1->GetLength();
 double *center = act1->GetCenter();
 vtkSmartPointer<vtkSphereSource> S = vtkSmartPointer<vtkSphereSource>::New();
 S->SetThetaResolution(res);
 S->SetPhiResolution(res);
 S->SetRadius(diagonal);
 S->SetCenter(center);
 S->Update();
 // Get longLat intersect points
 vtkSmartPointer<vtkPoints> pts = S->GetOutput()->GetPoints();
 // Number of visible cells
 vtkIdType numCells;
 // Set visible cell selector
 vtkSmartPointer<vtkVisibleCellSelector> sel1 = vtkSmartPointer<vtkVisibleCellSelector>::New();
 sel1->SetRenderer(renderer);
 sel1->SetRenderPasses(0,1,0,1,1);
 int *size = renderer->GetSize();
 sel1->SetArea(size[0],size[1],size[2],size[3]);
 // Get visible cell scan at each long-Lat intersection
 for (int i = 0; i < pts->GetNumberOfPoints(); i++)
 {
  // set camera position at long-lat intersection  
  renderer->GetActiveCamera()->SetPosition(pts->GetPoint(i));
  renderer->GetActiveCamera()->SetFocalPoint(center);
  renderer->ResetCamera();
  // Update view when not using offscreen, so can see orientation of camera relative to viewed object
  if (!renWin->GetOffScreenRendering())
   renWin->Render();
  // Test...
  ////////////////////////////////////////////////////////////
  
  // grab all visible cells in render window
  sel1->Select();
  // get selected ids
  vtkSelection *res1 = vtkSelection::New();
  sel1->GetSelectedIds(res1);
  // extract cell id list
  vtkSelection *cellids = res1->GetChild(0);
  // get number of visible cells 
  vtkIdTypeArray *idArray = vtkIdTypeArray::SafeDownCast(cellids->GetSelectionList());
  numCells = idArray->GetNumberOfComponents()*idArray->GetNumberOfTuples();
  ////////////////////////////////////////////////////////////
  res1->Delete();
 }
 // render 
 renWin->Render();
 // start
 iren->Initialize();
 iren->Start();
 return 0;
}


________________________________

From: David E DeMarle [mailto:dave.demarle at kitware.com]
Sent: Thu 22/03/2007 19:12
To: Lim, Theodore 
Cc: vtk-users
Subject: Re: [vtkusers] Win32 OffScreen Rendering and Visibility cell selector


I've just committed a change to vtkOpenGLRenderWindow which appears to fix it. The change is to return default values if the window isn't mapped like getColorDepth does.

cheers
Dave DeMarle


On 3/22/07, David E DeMarle <dave.demarle at kitware.com> wrote: 

	Hmmm, the program looks ok to me, with the exception of two calls to a "render" instead of "ofsrender".
	I will try cell selection with offscreen rendering on windows and see if I can reproduce the problem. 
	
	cheers
	Dave DeMarle
	
	
	
	On 3/20/07, Lim, Theodore < T.Lim at hw.ac.uk <mailto:T.Lim at hw.ac.uk> > wrote:

		
		Hi,
		 
		Not sure how to put this but here goes...
		 
		I'm trying to get get visible cell data for a series of camera positions and would like to do this using the Win32 offscreen rendering capabilities.
		 
		However, i discovered that the offscreen render window color buffer size returns all 0 values. This seems to be the reason why the visible cell selector fails. Is there a way to set (or force) values into it?
		 
		Or rather, can the new class vtkVisibilityCellSelector be used in Offscreen rendering mode? And if so, how can this be achieved. I've attached the code which i'm testing below.
		 
		One note: i compiled with cmake option VTK_USE_OFFSCREEN set to 'Off' as this caused the vtkMFC examples (i.e. vtkDLG, vtkSDI, vtkMDI) to crash. It also caused the same response to my own VTK-MFC app. Not sure if this has anything to do with it not being able to use Offscreen. In the test code below, i use the vtkWindowToImageFilter to grab a snapshot of the offscreen render window and the results was as expected.
		 
		Any help would be greatly appreciated.
		 
		Many thanks, Theo.
		 
		/**************************************************************************************************/
		int main()
		{
		 //Load model
		 vtkSmartPointer<vtkSTLReader> reader = vtkSmartPointer<vtkSTLReader>::New();
		 reader->SetFileName("C:/Model/Data/MillCut.stl");
		 vtkSmartPointer<vtkPolyDataMapper> map1 = vtkSmartPointer<vtkPolyDataMapper>::New(); 
		 map1->SetInput(reader->GetOutput());

		 // set up offscreen renderer
		 vtkSmartPointer<vtkRenderer> ofsrenderer = vtkSmartPointer<vtkRenderer>::New();
		 ofsrenderer->SetBackground(0.0,0.0,0.0); 
		 vtkSmartPointer<vtkRenderWindow> ofsrenWin = vtkSmartPointer<vtkRenderWindow>::New();
		 ofsrenWin->AddRenderer(ofsrenderer);
		 ofsrenWin->SetSize(800,800);
		 ofsrenWin->SetOffScreenRendering(1);
		 // set interactor
		 vtkSmartPointer<vtkRenderWindowInteractor> iren = vtkSmartPointer<vtkRenderWindowInteractor>::New();
		 iren->SetRenderWindow(ofsrenWin);  

		 //set up the view
		 renderer->GetActiveCamera()->SetViewUp(0, 1, 0);
		 renderer->SetBackground(0.0,0.0,0.0); 
		  
		 
		 // set actor
		 vtkSmartPointer<vtkActor> act1 = vtkSmartPointer<vtkActor>::New();
		 act1->SetMapper(map1);
		 // add actor to renderer
		 double diagonal = act1->GetLength();
		 double *center = act1->GetCenter(); 
		 ofsrenderer->AddActor(act1);
		 ofsrenderer->GetActiveCamera()->SetFocalPoint(center);
		 ofsrenderer->GetActiveCamera()->SetPosition(20, -20, -27);
		 ofsrenderer->ResetCamera();

		 ofsrenWin->Render();
		 //-----------------------------------------------
		 // check offscreen render window...
		 int rgba[4];
		 ofsrenWin->GetColorBufferSizes(rgba);
		 vtkSmartPointer<vtkWindowToImageFilter> wif = vtkSmartPointer<vtkWindowToImageFilter>::New();//
		 wif->SetInput(ofsrenWin);
		 wif->Update(); 
		 vtkSmartPointer<vtkJPEGWriter> jpgw = vtkSmartPointer<vtkJPEGWriter>::New();
		 jpgw->SetInput(wif->GetOutput());
		 jpgw->SetQuality(100);
		 jpgw->SetFileName("D:/Projects/VTK/testoffscreen.jpg");
		 jpgw->Write();
		 //-----------------------------------------------

		 // get visible cells
		 vtkSmartPointer<vtkVisibleCellSelector> sel1 = vtkSmartPointer<vtkVisibleCellSelector>::New();
		 sel1->SetRenderer(ofsrenderer);
		        // grab everything in the render window viewport
		 int *size = ofsrenderer->GetRenderWindow()->GetSize();
		 sel1->SetRenderPasses(0,1,0,1,1);
		 sel1->SetArea(size[0],size[1],size[2],size[3]);
		 sel1->Select();
		 vtkSmartPointer<vtkSelection> res1 = vtkSmartPointer<vtkSelection>::New();
		 sel1->GetSelectedIds(res1);
		 vtkSmartPointer<vtkSelection> cellids = res1->GetChild(0);
		 vtkSmartPointer<vtkExtractSelectedPolyDataIds> extr = vtkSmartPointer<vtkExtractSelectedPolyDataIds>::New();
		        if (cellids)
		         {
		          extr->SetInput(1, act1->GetMapper()->GetInput());
		          extr->SetInput(0, cellids);
		          extr->Update();
		          sMap->SetInput(extr->GetOutput());
		         }
		        else
		         {
		          cerr << "Empty color buffer selection -" << endl;
		          cerr << "Check display color depth. Must be at least 24 bit." << endl;
		          sMap->SetInput(emptyPD);
		         }
		 ////////////////////////////////////////////////////////////
		 ofsrenWin->Render();

		 // Set the user method (bound to key 'u')
		 iren->Initialize();
		 iren->Start();

		 return 0;
		}
		 
		 

		_______________________________________________
		This is the private VTK discussion list.
		Please keep messages on-topic. Check the FAQ at: http://www.vtk.org/Wiki/VTK_FAQ
		Follow this link to subscribe/unsubscribe:
		http://www.vtk.org/mailman/listinfo/vtkusers 
		
		



-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://www.vtk.org/pipermail/vtkusers/attachments/20070323/3b4f463c/attachment.htm>


More information about the vtkusers mailing list