913a4c4a |
1 | // Created on: 2011-10-14 |
2 | // Created by: Roman KOZLOV |
3 | // Copyright (c) 2011-2014 OPEN CASCADE SAS |
4 | // |
5 | // This file is part of Open CASCADE Technology software library. |
6 | // |
7 | // This library is free software; you can redistribute it and/or modify it under |
8 | // the terms of the GNU Lesser General Public License version 2.1 as published |
9 | // by the Free Software Foundation, with special exception defined in the file |
10 | // OCCT_LGPL_EXCEPTION.txt. Consult the file LICENSE_LGPL_21.txt included in OCCT |
11 | // distribution for complete text of the license and disclaimer of any warranty. |
12 | // |
13 | // Alternatively, this file may be used under the terms of Open CASCADE |
14 | // commercial license or contractual agreement. |
15 | |
16 | |
17 | #include <IVtkVTK_View.hxx> |
18 | #include <vtkAutoInit.h> |
19 | #include <vtkCamera.h> |
20 | #include <vtkRenderer.h> |
f751596e |
21 | #include <vtkRenderWindow.h> |
913a4c4a |
22 | #include <vtkTransform.h> |
23 | |
92efcf78 |
24 | IMPLEMENT_STANDARD_RTTIEXT(IVtkVTK_View,IVtk_IView) |
25 | |
913a4c4a |
26 | // Initialization of VTK object factories. |
27 | // Since VTK 6 the factory methods require "auto-initialization" depending on |
28 | // what modules are enabled at VTK configure time. |
29 | // Some defines are needed in order to make the factories work properly. |
88d533be |
30 | #ifdef VTK_OPENGL2_BACKEND |
31 | VTK_MODULE_INIT(vtkRenderingOpenGL2) |
32 | #else |
68858c7d |
33 | VTK_MODULE_INIT(vtkRenderingOpenGL) |
88d533be |
34 | #endif |
68858c7d |
35 | VTK_MODULE_INIT(vtkInteractionStyle) |
913a4c4a |
36 | |
37 | // Handle implementation |
ec357c5c |
38 | |
913a4c4a |
39 | |
40 | //================================================================ |
41 | // Function : Constructor |
42 | // Purpose : |
43 | //================================================================ |
44 | IVtkVTK_View::IVtkVTK_View (vtkRenderer* theRenderer) |
45 | : myRenderer (theRenderer) |
46 | { } |
47 | |
48 | //================================================================ |
49 | // Function : Destructor |
50 | // Purpose : |
51 | //================================================================ |
52 | IVtkVTK_View::~IVtkVTK_View() |
53 | { } |
54 | |
55 | //================================================================ |
56 | // Function : IsPerspective |
57 | // Purpose : |
58 | //================================================================ |
59 | bool IVtkVTK_View::IsPerspective() const |
60 | { |
61 | return !myRenderer->GetActiveCamera()->GetParallelProjection(); |
62 | } |
63 | |
64 | //================================================================ |
65 | // Function : GetDistance |
66 | // Purpose : |
67 | //================================================================ |
68 | double IVtkVTK_View::GetDistance() const |
69 | { |
70 | return myRenderer->GetActiveCamera()->GetDistance(); |
71 | } |
72 | |
73 | //================================================================ |
74 | // Function : GetPosition |
75 | // Purpose : |
76 | //================================================================ |
77 | void IVtkVTK_View::GetPosition (double& theX, double& theY, double& theZ) const |
78 | { |
79 | myRenderer->GetActiveCamera()->GetFocalPoint (theX, theY, theZ); |
80 | } |
81 | |
82 | //================================================================ |
83 | // Function : GetViewUp |
84 | // Purpose : |
85 | //================================================================ |
86 | void IVtkVTK_View::GetViewUp (double& theDx, double& theDy, double& theDz) const |
87 | { |
88 | myRenderer->GetActiveCamera()->OrthogonalizeViewUp(); |
89 | myRenderer->GetActiveCamera()->GetViewUp (theDx, theDy, theDz); |
90 | } |
91 | |
92 | //================================================================ |
93 | // Function : GetDirectionOfProjection |
94 | // Purpose : |
95 | //================================================================ |
96 | void IVtkVTK_View::GetDirectionOfProjection (double& theDx, |
97 | double& theDy, |
98 | double& theDz) const |
99 | { |
100 | myRenderer->GetActiveCamera()->GetDirectionOfProjection (theDx, theDy, theDz); |
101 | theDx = -theDx; |
102 | theDy = -theDy; |
103 | theDz = -theDz; |
104 | } |
105 | |
106 | //================================================================ |
107 | // Function : GetScale |
108 | // Purpose : |
109 | //================================================================ |
110 | void IVtkVTK_View::GetScale (double& theX, double& theY, double& theZ) const |
111 | { |
112 | double aScale[3]; |
113 | myRenderer->GetActiveCamera()->GetViewTransformObject()->GetScale (aScale); |
114 | theX = aScale[0]; |
115 | theY = aScale[1]; |
116 | theZ = aScale[2]; |
117 | } |
118 | |
119 | //================================================================ |
120 | // Function : GetParallelScale |
121 | // Purpose : |
122 | //================================================================ |
123 | double IVtkVTK_View::GetParallelScale() const |
124 | { |
125 | return myRenderer->GetActiveCamera()->GetParallelScale(); |
126 | } |
127 | |
128 | //================================================================ |
129 | // Function : GetViewAngle |
130 | // Purpose : |
131 | //================================================================ |
132 | double IVtkVTK_View::GetViewAngle() const |
133 | { |
134 | return myRenderer->GetActiveCamera()->GetViewAngle(); |
135 | } |
136 | |
137 | //================================================================ |
138 | // Function : GetViewCenter |
139 | // Purpose : |
140 | //================================================================ |
141 | void IVtkVTK_View::GetViewCenter (double& theX, double& theY) const |
142 | { |
143 | double* aCenter = myRenderer->GetCenter(); |
144 | theX = aCenter[0]; |
145 | theY = aCenter[1]; |
146 | } |
147 | |
148 | //================================================================ |
149 | // Function : DisplayToWorld |
150 | // Purpose : |
151 | //================================================================ |
152 | bool IVtkVTK_View::DisplayToWorld (const gp_XY& theDisplayPnt, gp_XYZ& theWorldPnt) const |
153 | { |
154 | // Convert the selection point into world coordinates. |
155 | myRenderer->SetDisplayPoint (theDisplayPnt.X(), theDisplayPnt.Y(), 0.0); |
156 | myRenderer->DisplayToWorld(); |
157 | |
5ca413ce |
158 | double* const aCoords = myRenderer->GetWorldPoint(); |
913a4c4a |
159 | if (aCoords[3] == 0.0) // Point at infinity in homogeneous coordinates |
160 | { |
161 | return false; |
162 | } |
163 | |
164 | theWorldPnt = gp_XYZ (aCoords[0] / aCoords[3], aCoords[1] / aCoords[3], aCoords[2] / aCoords[3]); |
165 | |
166 | return true; |
167 | } |
f751596e |
168 | |
169 | //================================================================ |
170 | // Function : GetWindowSize |
171 | // Purpose : |
172 | //================================================================ |
173 | void IVtkVTK_View::GetWindowSize (int& theX, int& theY) const |
174 | { |
175 | int* aSize = myRenderer->GetRenderWindow()->GetSize(); |
176 | theX = aSize[0]; |
177 | theY = aSize[1]; |
178 | } |
179 | |
180 | //================================================================ |
181 | // Function : GetCamera |
182 | // Purpose : |
183 | //================================================================ |
184 | void IVtkVTK_View::GetCamera (Graphic3d_Mat4d& theProj, |
185 | Graphic3d_Mat4d& theOrient, |
186 | Standard_Boolean& theIsOrtho) const |
187 | { |
188 | theIsOrtho = !IsPerspective(); |
189 | |
190 | vtkMatrix4x4* aCompositeProj = |
191 | myRenderer->GetActiveCamera()->GetCompositeProjectionTransformMatrix (myRenderer->GetTiledAspectRatio(), |
192 | 0, |
193 | 1); |
194 | for (Standard_Integer aRow = 0; aRow < 4; ++aRow) |
195 | { |
196 | for (Standard_Integer aCol = 0; aCol < 4; ++aCol) |
197 | { |
198 | theProj.SetValue (aRow, aCol, aCompositeProj->GetElement (aRow, aCol)); |
199 | } |
200 | } |
201 | |
202 | theOrient.InitIdentity(); |
203 | } |
204 | |
205 | //================================================================ |
206 | // Function : GetViewport |
207 | // Purpose : |
208 | //================================================================ |
209 | void IVtkVTK_View::GetViewport (Standard_Real& theX, |
210 | Standard_Real& theY, |
211 | Standard_Real& theWidth, |
212 | Standard_Real& theHeight) const |
213 | { |
214 | Standard_Real aViewport[4]; |
215 | myRenderer->GetViewport (aViewport); |
216 | theX = aViewport[0]; |
217 | theY = aViewport[1]; |
218 | theWidth = aViewport[2]; |
219 | theHeight = aViewport[3]; |
220 | } |