10 #include <vtkCallbackCommand.h>
11 #include <vtkCamera.h>
12 #include <vtkCommand.h>
13 #include <vtkImageData.h>
14 #include <vtkImageSlice.h>
15 #include <vtkImageSliceMapper.h>
17 #include <vtkMatrix4x4.h>
18 #include <vtkObjectFactory.h>
19 #include <vtkPropCollection.h>
20 #include <vtkRenderWindowInteractor.h>
21 #include <vtkRenderer.h>
22 #include <vtkTransform.h>
36 this->Superclass::PrintSelf(os, indent);
37 os << indent <<
"RotationFactor: " << this->
RotationFactor <<
"\n";
44 int x = this->Interactor->GetEventPosition()[0];
45 int y = this->Interactor->GetEventPosition()[1];
47 this->FindPokedRenderer(
x,
y);
48 if (!this->CurrentRenderer) {
52 this->GrabFocus(this->EventCallbackCommand);
59 if (this->Interactor) {
60 if (this->State == VTKIS_PAN) {
71 int x = this->Interactor->GetEventPosition()[0];
72 int y = this->Interactor->GetEventPosition()[1];
74 this->FindPokedRenderer(
x,
y);
75 if (!this->CurrentRenderer) {
79 this->GrabFocus(this->EventCallbackCommand);
86 if (this->Interactor) {
87 if (this->State == VTKIS_ROTATE) {
96 if (this->Interactor) {
97 if (this->State == VTKIS_PAN) {
100 }
else if (this->State == VTKIS_ROTATE) {
104 vtkInteractorStyleImage::OnMouseMove();
111 if (this->CurrentRenderer ==
nullptr || this->Interactor ==
nullptr) {
115 vtkRenderWindowInteractor* rwi = this->Interactor;
116 vtkCamera* camera = this->CurrentRenderer->GetActiveCamera();
119 int*
size = this->CurrentRenderer->GetSize();
120 double displayCenter[2];
121 displayCenter[0] =
size[0] / 2.0;
122 displayCenter[1] =
size[1] / 2.0;
126 rwi->GetLastEventPosition()[0] -
static_cast<int>(displayCenter[0]);
127 int x2 = rwi->GetEventPosition()[0] -
static_cast<int>(displayCenter[0]);
129 rwi->GetLastEventPosition()[1] -
static_cast<int>(displayCenter[1]);
130 int y2 = rwi->GetEventPosition()[1] -
static_cast<int>(displayCenter[1]);
133 if ((x2 == 0 && y2 == 0) || (x1 == 0 && y1 == 0)) {
139 double len1 = sqrt(
static_cast<double>(x1 * x1 + y1 * y1));
140 double len2 = sqrt(
static_cast<double>(x2 * x2 + y2 * y2));
142 if (len1 == 0.0 || len2 == 0.0) {
150 vtkMath::DegreesFromRadians((x1 * y2 - y1 * x2) / (len1 * len2)) *
155 double* pos = camera->GetPosition();
156 double* fp = camera->GetFocalPoint();
157 axis[0] = fp[0] - pos[0];
158 axis[1] = fp[1] - pos[1];
159 axis[2] = fp[2] - pos[2];
160 vtkMath::Normalize(axis);
165 double center[3] = {0.0, 0.0, 0.0};
166 bool centerFound =
false;
169 vtkPropCollection* props = this->CurrentRenderer->GetViewProps();
170 props->InitTraversal();
171 vtkProp* prop =
nullptr;
172 while ((prop = props->GetNextProp()) !=
nullptr) {
173 vtkImageSlice* imageSlice = vtkImageSlice::SafeDownCast(prop);
174 if (imageSlice && imageSlice->GetVisibility()) {
177 imageSlice->GetBounds(bounds);
180 if (bounds[0] < bounds[1] && bounds[2] < bounds[3]) {
182 center[0] = (bounds[0] + bounds[1]) * 0.5;
183 center[1] = (bounds[2] + bounds[3]) * 0.5;
184 center[2] = (bounds[4] + bounds[5]) * 0.5;
193 camera->GetFocalPoint(center);
197 vtkTransform* transform = vtkTransform::New();
198 transform->Identity();
199 transform->Translate(center[0], center[1], center[2]);
200 transform->RotateWXYZ(angle, axis[0], axis[1], axis[2]);
201 transform->Translate(-center[0], -center[1], -center[2]);
203 camera->ApplyTransform(transform);
204 camera->OrthogonalizeViewUp();
207 if (this->AutoAdjustCameraClippingRange) {
208 this->CurrentRenderer->ResetCameraClippingRange();
211 if (rwi->GetLightFollowCamera()) {
212 this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
220 if (this->CurrentRenderer ==
nullptr || this->Interactor ==
nullptr) {
224 vtkRenderWindowInteractor* rwi = this->Interactor;
225 vtkCamera* camera = this->CurrentRenderer->GetActiveCamera();
228 if (camera->GetParallelProjection()) {
229 camera->OrthogonalizeViewUp();
230 double up[3], vpn[3], right[3];
231 camera->GetViewUp(up);
232 camera->GetViewPlaneNormal(vpn);
235 int*
size = this->CurrentRenderer->GetSize();
236 int dx = rwi->GetEventPosition()[0] - rwi->GetLastEventPosition()[0];
237 int dy = rwi->GetLastEventPosition()[1] -
238 rwi->GetEventPosition()[1];
240 double scale = camera->GetParallelScale();
241 double panX = (double)dx / (
double)
size[1] * scale * 2.0;
242 double panY = (double)dy / (
double)
size[1] * scale * 2.0;
244 double pos[3], fp[3];
245 camera->GetPosition(pos);
246 camera->GetFocalPoint(fp);
249 tmp = (right[0] * panX + up[0] * panY);
252 tmp = (right[1] * panX + up[1] * panY);
255 tmp = (right[2] * panX + up[2] * panY);
259 camera->SetPosition(pos);
260 camera->SetFocalPoint(fp);
263 double focalPoint[4], pickPoint[4], prevPickPoint[4];
266 camera->GetFocalPoint(focalPoint);
269 this->ComputeWorldToDisplay(this->CurrentRenderer, focalPoint[0],
270 focalPoint[1], focalPoint[2], focalPoint);
273 this->ComputeDisplayToWorld(
274 this->CurrentRenderer, rwi->GetLastEventPosition()[0],
275 rwi->GetLastEventPosition()[1],
z, prevPickPoint);
277 this->ComputeDisplayToWorld(this->CurrentRenderer,
278 rwi->GetEventPosition()[0],
279 rwi->GetEventPosition()[1],
z, pickPoint);
282 camera->SetFocalPoint(
283 focalPoint[0] - (pickPoint[0] - prevPickPoint[0]),
284 focalPoint[1] - (pickPoint[1] - prevPickPoint[1]),
285 focalPoint[2] - (pickPoint[2] - prevPickPoint[2]));
288 camera->GetPosition()[0] - (pickPoint[0] - prevPickPoint[0]),
289 camera->GetPosition()[1] - (pickPoint[1] - prevPickPoint[1]),
290 camera->GetPosition()[2] - (pickPoint[2] - prevPickPoint[2]));
293 if (this->AutoAdjustCameraClippingRange) {
294 this->CurrentRenderer->ResetCameraClippingRange();
297 if (rwi->GetLightFollowCamera()) {
298 this->CurrentRenderer->UpdateLightsGeometryToFollowCamera();
ParaView-style interactor for 2D image viewing.
~vtkPVImageInteractorStyle() override
void OnLeftButtonUp() override
vtkPVImageInteractorStyle()
void OnMiddleButtonUp() override
void OnMouseMove() override
void OnLeftButtonDown() override
void OnMiddleButtonDown() override
void PrintSelf(ostream &os, vtkIndent indent) override
CLOUDVIEWER_HOST_DEVICE float Cross(const Point &a, const Point &b)
vtkStandardNewMacro(vtkPVImageInteractorStyle)