Cloned library of VTK-5.0.0 with extra build files for internal package management.
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.

364 lines
13 KiB

2 years ago
/*=========================================================================
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