[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