[vtkusers] Refreshing the vtkRenderWindow

Vivek Gupta vivekg at mac.com
Fri Apr 30 10:34:13 EDT 2004


David,

I did try out a simplified version of this with printing to see what 
would happen.  The results aren't quite what I expected. Here is what I 
did:

1)  I created a callback, currently all this does is print the fact 
that it was called to the console
2) From the RenderWindowInteractor I created a timer
3) I added an observer to listen to vtkCommand::TimerEvent

What I found was that I get my print out only when interacting with the 
interactor window.  Unfortunately when I am using my external device I 
am not directly interacting with the the renderwindow, so this isn't 
the behavior I wanted.  I'm hoping I can move my cursor around and have 
it update as you described in your idea.

Do I need to write my own event loop? But then I will have problems 
handling the RenderWindowInteractor, right?

Thanks,
Vivek

On Apr 26, 2004, at 13:38, David Gobbi wrote:

> Hi Vivek,
>
> You can only call "Render" from the main thread (i.e. from the thread
> that created the vtkRenderWindow).
>
> The proper solution to your problem is to get the device thread to
> communicate the coordinate information to the main thread via a mutex
> lock (specifically, a vtkMutexLock).
>
> For example, you could have a mutex lock called "renderLock" and four
> variables x, y, z and "render":
>
> vtkMutexLock *renderLock = vtkMutexLock::New();
> double x, y, z;
> int render;
>
> So every time your device wanted to render the window, it would do 
> this:
>
>   renderLock->Lock();
>   <set x, y, and z variables>
>   render = 1;
>   renderLock->Unlock();
>
> Then the main thread would have to check every-so-often to see if the
> "render" variable is set, you could add an observer for an interactor
> "Timer" event to do this:
>
>   if (render == 1)
>     {
>     renderLock->Lock();
>     <use x, y and z to set up the scene>
>     render = 0;
>     renderLock->Unlock();
>     window->Render();
>     }
>
> I have used tricks similar to this for the Flock of Birds, the Logitech
> 3D Mouse, and the Northern Digital POLARIS in order to separate the
> device thread from the main VTK thread.
>
>  - David
>
>
> On Mon, 26 Apr 2004, Vivek Gupta wrote:
>
>> Hello All,
>>
>> I have a case where I have a separate thread that is running and
>> interfaces with a device.  I use the devices coordinates to update the
>> location of an actor (3D cursor on the screen).  I also have
>> vtkRenderWindowInteractor associated with vtkRenderWindow so that in 
>> the
>> window I can use the built-in abilities to manipulate the camera.  
>> What
>> I'd like to be able to do is as I manipulate my device is refresh the
>> vtkRenderWindow to display the actor at the updated coordinates.
>>
>> I've tried a variety of methods to do this (vtkRenderWindow->Render(),
>> this gives some form of openGL error, which I haven't been able to 
>> read)
>> and none of them seems to work.  Is there a specific way I have to go
>> about getting the reference to vtkRenderWindow or some other way to
>> notify it that the actor has been modified so refresh the drawing.  
>> Do I
>> have use LevelOfDetail in order to set an auto-refresh rate?
>>
>> Thanks,
>> Vivek
>> _______________________________________________
>> This is the private VTK discussion list.
>> Please keep messages on-topic. Check the FAQ at: 
>> <http://public.kitware.com/cgi-bin/vtkfaq>
>> Follow this link to subscribe/unsubscribe:
>> http://www.vtk.org/mailman/listinfo/vtkusers
>>
>
>




More information about the vtkusers mailing list