You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
363 lines
13 KiB
363 lines
13 KiB
/*=========================================================================
|
|
|
|
Program: Visualization Toolkit
|
|
Module: $RCSfile: vtkRenderWindowInteractor.h,v $
|
|
|
|
Copyright (c) Ken Martin, Will Schroeder, Bill Lorensen
|
|
All rights reserved.
|
|
See Copyright.txt or http://www.kitware.com/Copyright.htm for details.
|
|
|
|
This software is distributed WITHOUT ANY WARRANTY; without even
|
|
the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
|
|
PURPOSE. See the above copyright notice for more information.
|
|
|
|
=========================================================================*/
|
|
// .NAME vtkRenderWindowInteractor - platform-independent render window interaction including picking and frame rate control.
|
|
|
|
// .SECTION Description
|
|
// vtkRenderWindowInteractor provides a platform-independent interaction
|
|
// mechanism for mouse/key/time events. It serves as a base class for
|
|
// platform-dependent implementations that handle routing of mouse/key/timer
|
|
// messages to vtkInteractorStyle and its subclasses.
|
|
// vtkRenderWindowInteractor also provides controls for picking,
|
|
// rendering frame rate, and headlights.
|
|
//
|
|
// vtkRenderWindowInteractor has changed from previous implementations and
|
|
// now serves only as a shell to hold user preferences and route messages
|
|
// to vtkInteractorStyle. Callbacks are available for many Events.
|
|
// Platform specific subclasses should provide methods for
|
|
// CreateTimer/DestroyTimer, TerminateApp, and an event loop if required
|
|
// via Initialize/Start/Enable/Disable.
|
|
|
|
#ifndef __vtkRenderWindowInteractor_h
|
|
#define __vtkRenderWindowInteractor_h
|
|
|
|
#include "vtkObject.h"
|
|
|
|
// Timer flags for win32/X compatibility
|
|
#define VTKI_TIMER_FIRST 0
|
|
#define VTKI_TIMER_UPDATE 1
|
|
|
|
class vtkAbstractPicker;
|
|
class vtkAbstractPropPicker;
|
|
class vtkInteractorObserver;
|
|
class vtkInteractorObserver;
|
|
class vtkRenderWindow;
|
|
class vtkRenderer;
|
|
|
|
class VTK_RENDERING_EXPORT vtkRenderWindowInteractor : public vtkObject
|
|
{
|
|
public:
|
|
static vtkRenderWindowInteractor *New();
|
|
vtkTypeRevisionMacro(vtkRenderWindowInteractor,vtkObject);
|
|
void PrintSelf(ostream& os, vtkIndent indent);
|
|
|
|
// Description:
|
|
// Prepare for handling events. This must be called before the
|
|
// interactor will work.
|
|
virtual void Initialize();
|
|
void ReInitialize() { this->Initialized = 0; this->Enabled = 0;
|
|
this->Initialize(); }
|
|
|
|
// Description:
|
|
// This Method detects loops of RenderWindow-Interactor,
|
|
// so objects are freed properly.
|
|
virtual void UnRegister(vtkObjectBase *o);
|
|
|
|
// Description:
|
|
// Start the event loop. This is provided so that you do not have to
|
|
// implement your own event loop. You still can use your own
|
|
// event loop if you want. Initialize should be called before Start.
|
|
virtual void Start() {};
|
|
|
|
// Description:
|
|
// Enable/Disable interactions. By default interactors are enabled when
|
|
// initialized. Initialize() must be called prior to enabling/disabling
|
|
// interaction. These methods are used when a window/widget is being
|
|
// shared by multiple renderers and interactors. This allows a "modal"
|
|
// display where one interactor is active when its data is to be displayed
|
|
// and all other interactors associated with the widget are disabled
|
|
// when their data is not displayed.
|
|
virtual void Enable() { this->Enabled = 1; this->Modified();};
|
|
virtual void Disable() { this->Enabled = 0; this->Modified();};
|
|
vtkGetMacro(Enabled, int);
|
|
|
|
// Description:
|
|
// Set/Get the rendering window being controlled by this object.
|
|
void SetRenderWindow(vtkRenderWindow *aren);
|
|
vtkGetObjectMacro(RenderWindow,vtkRenderWindow);
|
|
|
|
// Description:
|
|
// Event loop notification member for Window size change
|
|
virtual void UpdateSize(int x,int y);
|
|
|
|
// Description:
|
|
// Timer methods must be overridden by platform dependent subclasses.
|
|
// flag is passed to indicate if this is first timer set or an update
|
|
// as Win32 uses repeating timers, whereas X uses One shot more timer
|
|
// if flag==VTKXI_TIMER_FIRST Win32 and X should createtimer
|
|
// otherwise Win32 should exit and X should perform AddTimeOut()
|
|
virtual int CreateTimer(int ) { return 1; };
|
|
virtual int DestroyTimer() { return 1; };
|
|
|
|
// Description:
|
|
// This function is called on 'q','e' keypress if exitmethod is not
|
|
// specified and should be overridden by platform dependent subclasses
|
|
// to provide a termination procedure if one is required.
|
|
virtual void TerminateApp(void) {};
|
|
|
|
// Description:
|
|
// External switching between joystick/trackball/new? modes.
|
|
virtual void SetInteractorStyle(vtkInteractorObserver *);
|
|
vtkGetObjectMacro(InteractorStyle,vtkInteractorObserver);
|
|
|
|
// Description:
|
|
// Turn on/off the automatic repositioning of lights as the camera moves.
|
|
vtkSetMacro(LightFollowCamera,int);
|
|
vtkGetMacro(LightFollowCamera,int);
|
|
vtkBooleanMacro(LightFollowCamera,int);
|
|
|
|
// Description:
|
|
// Set/Get the desired update rate. This is used by vtkLODActor's to tell
|
|
// them how quickly they need to render. This update is in effect only
|
|
// when the camera is being rotated, or zoomed. When the interactor is
|
|
// still, the StillUpdateRate is used instead.
|
|
vtkSetClampMacro(DesiredUpdateRate,double,0.0001,VTK_LARGE_FLOAT);
|
|
vtkGetMacro(DesiredUpdateRate,double);
|
|
|
|
// Description:
|
|
// Set/Get the desired update rate when movement has stopped.
|
|
// See the SetDesiredUpdateRate method.
|
|
vtkSetClampMacro(StillUpdateRate,double,0.0001,VTK_LARGE_FLOAT);
|
|
vtkGetMacro(StillUpdateRate,double);
|
|
|
|
// Description:
|
|
// See whether interactor has been initialized yet.
|
|
vtkGetMacro(Initialized,int);
|
|
|
|
// Description:
|
|
// Set/Get the object used to perform pick operations. In order to
|
|
// pick instances of vtkProp, the picker must be a subclass of
|
|
// vtkAbstractPropPicker, meaning that it can identify a particular
|
|
// instance of vtkProp.
|
|
virtual void SetPicker(vtkAbstractPicker*);
|
|
vtkGetObjectMacro(Picker,vtkAbstractPicker);
|
|
|
|
// Description:
|
|
// Create default picker. Used to create one when none is specified.
|
|
// Default is an instance of vtkPropPicker.
|
|
virtual vtkAbstractPropPicker *CreateDefaultPicker();
|
|
|
|
// Description:
|
|
// These methods correspond to the the Exit, User and Pick
|
|
// callbacks. They allow for the Style to invoke them.
|
|
virtual void ExitCallback();
|
|
virtual void UserCallback();
|
|
virtual void StartPickCallback();
|
|
virtual void EndPickCallback();
|
|
|
|
// Description:
|
|
// Get the current position of the mouse.
|
|
virtual void GetMousePosition(int *x, int *y) { *x = 0 ; *y = 0; }
|
|
|
|
// Description:
|
|
// Hide or show the mouse cursor, it is nice to be able to hide the
|
|
// default cursor if you want VTK to display a 3D cursor instead.
|
|
void HideCursor();
|
|
void ShowCursor();
|
|
|
|
// Description:
|
|
// Render the scene. Just pass the render call on to the
|
|
// associated vtkRenderWindow.
|
|
virtual void Render();
|
|
|
|
// Description:
|
|
// Given a position x, move the current camera's focal point to x.
|
|
// The movement is animated over the number of frames specified in
|
|
// NumberOfFlyFrames. The LOD desired frame rate is used.
|
|
void FlyTo(vtkRenderer *ren, double x, double y, double z);
|
|
void FlyTo(vtkRenderer *ren, double *x)
|
|
{this->FlyTo(ren, x[0], x[1], x[2]);}
|
|
void FlyToImage(vtkRenderer *ren, double x, double y);
|
|
void FlyToImage(vtkRenderer *ren, double *x)
|
|
{this->FlyToImage(ren, x[0], x[1]);}
|
|
|
|
// Description:
|
|
// Set the number of frames to fly to when FlyTo is invoked.
|
|
vtkSetClampMacro(NumberOfFlyFrames,int,1,VTK_LARGE_INTEGER);
|
|
vtkGetMacro(NumberOfFlyFrames,int);
|
|
|
|
// Description:
|
|
// Set the total Dolly value to use when flying to (FlyTo()) a
|
|
// specified point. Negative values fly away from the point.
|
|
vtkSetMacro(Dolly,double);
|
|
vtkGetMacro(Dolly,double);
|
|
|
|
// Description:
|
|
// Set/Get information about the current event.
|
|
// The current x,y position is in the EventPosition, and the previous
|
|
// event position is in LastEventPosition, updated automatically each
|
|
// time EventPosition is set using its Set() method.
|
|
// The other information is about key board input.
|
|
vtkGetVector2Macro(EventPosition,int);
|
|
vtkGetVector2Macro(LastEventPosition,int);
|
|
vtkSetVector2Macro(LastEventPosition,int);
|
|
virtual void SetEventPosition(int x, int y)
|
|
{
|
|
vtkDebugMacro(<< this->GetClassName() << " (" << this
|
|
<< "): setting EventPosition to (" << x << "," << y << ")");
|
|
if (this->EventPosition[0] != x || this->EventPosition[1] != y)
|
|
{
|
|
this->LastEventPosition[0] = this->EventPosition[0];
|
|
this->LastEventPosition[1] = this->EventPosition[1];
|
|
this->EventPosition[0] = x;
|
|
this->EventPosition[1] = y;
|
|
this->Modified();
|
|
}
|
|
};
|
|
virtual void SetEventPosition(int pos[2])
|
|
{
|
|
this->SetEventPosition(pos[0], pos[1]);
|
|
}
|
|
virtual void SetEventPositionFlipY(int x, int y)
|
|
{
|
|
this->SetEventPosition(x, this->Size[1] - y - 1);
|
|
}
|
|
virtual void SetEventPositionFlipY(int pos[2])
|
|
{
|
|
this->SetEventPositionFlipY(pos[0], pos[1]);
|
|
}
|
|
vtkSetMacro(ControlKey, int);
|
|
vtkGetMacro(ControlKey, int);
|
|
vtkSetMacro(ShiftKey, int);
|
|
vtkGetMacro(ShiftKey, int);
|
|
vtkSetMacro(KeyCode, char);
|
|
vtkGetMacro(KeyCode, char);
|
|
vtkSetMacro(RepeatCount, int);
|
|
vtkGetMacro(RepeatCount, int);
|
|
vtkSetStringMacro(KeySym);
|
|
vtkGetStringMacro(KeySym);
|
|
|
|
// Description:
|
|
// Set all the event information in one call.
|
|
void SetEventInformation(int x,
|
|
int y,
|
|
int ctrl=0,
|
|
int shift=0,
|
|
char keycode=0,
|
|
int repeatcount=0,
|
|
const char* keysym=0)
|
|
{
|
|
this->LastEventPosition[0] = this->EventPosition[0];
|
|
this->LastEventPosition[1] = this->EventPosition[1];
|
|
this->EventPosition[0] = x;
|
|
this->EventPosition[1] = y;
|
|
this->ControlKey = ctrl;
|
|
this->ShiftKey = shift;
|
|
this->KeyCode = keycode;
|
|
this->RepeatCount = repeatcount;
|
|
if(keysym)
|
|
{
|
|
this->SetKeySym(keysym);
|
|
}
|
|
this->Modified();
|
|
}
|
|
|
|
// Description:
|
|
// Calls SetEventInformation, but flips the Y based on the current Size[1]
|
|
// value (i.e. y = this->Size[1] - y - 1).
|
|
void SetEventInformationFlipY(int x,
|
|
int y,
|
|
int ctrl=0,
|
|
int shift=0,
|
|
char keycode=0,
|
|
int repeatcount=0,
|
|
const char* keysym=0)
|
|
{
|
|
this->SetEventInformation(x,
|
|
this->Size[1] - y - 1,
|
|
ctrl,
|
|
shift,
|
|
keycode,
|
|
repeatcount,
|
|
keysym);
|
|
}
|
|
|
|
// Description:
|
|
// Set all the keyboard-related event information in one call.
|
|
void SetKeyEventInformation(int ctrl=0,
|
|
int shift=0,
|
|
char keycode=0,
|
|
int repeatcount=0,
|
|
const char* keysym=0)
|
|
{
|
|
this->ControlKey = ctrl;
|
|
this->ShiftKey = shift;
|
|
this->KeyCode = keycode;
|
|
this->RepeatCount = repeatcount;
|
|
if(keysym)
|
|
{
|
|
this->SetKeySym(keysym);
|
|
}
|
|
this->Modified();
|
|
}
|
|
|
|
// Description:
|
|
// This methods sets the Size ivar of the interactor without
|
|
// actually changing the size of the window. Normally
|
|
// application programmers would use UpdateSize if anything.
|
|
// This is useful for letting someone else change the size of
|
|
// the rendering window and just letting the interactor
|
|
// know about the change.
|
|
// The current event width/height (if any) is in EventSize
|
|
// (Expose event, for example).
|
|
vtkSetVector2Macro(Size,int);
|
|
vtkGetVector2Macro(Size,int);
|
|
vtkSetVector2Macro(EventSize,int);
|
|
vtkGetVector2Macro(EventSize,int);
|
|
|
|
// Description:
|
|
// When an event occurs, we must determine which Renderer the event
|
|
// occurred within, since one RenderWindow may contain multiple
|
|
// renderers.
|
|
virtual vtkRenderer *FindPokedRenderer(int,int);
|
|
|
|
protected:
|
|
vtkRenderWindowInteractor();
|
|
~vtkRenderWindowInteractor();
|
|
|
|
vtkRenderWindow *RenderWindow;
|
|
vtkInteractorObserver *InteractorStyle;
|
|
|
|
// Used as a helper object to pick instances of vtkProp
|
|
vtkAbstractPicker *Picker;
|
|
|
|
int Initialized;
|
|
int Enabled;
|
|
int Style;
|
|
int LightFollowCamera;
|
|
int ActorMode;
|
|
double DesiredUpdateRate;
|
|
double StillUpdateRate;
|
|
|
|
// Event information
|
|
int ControlKey;
|
|
int ShiftKey;
|
|
char KeyCode;
|
|
int RepeatCount;
|
|
char* KeySym;
|
|
int EventPosition[2];
|
|
int LastEventPosition[2];
|
|
int EventSize[2];
|
|
int Size[2];
|
|
|
|
// control the fly to
|
|
int NumberOfFlyFrames;
|
|
double Dolly;
|
|
|
|
private:
|
|
vtkRenderWindowInteractor(const vtkRenderWindowInteractor&); // Not implemented.
|
|
void operator=(const vtkRenderWindowInteractor&); // Not implemented.
|
|
};
|
|
|
|
#endif
|
|
|