1 /******************************************************************************
2
3 This source file is part of the Avogadro project.
4
5 Copyright 2013 Kitware, Inc.
6
7 This source code is released under the New BSD License, (the "License").
8
9 Unless required by applicable law or agreed to in writing, software
10 distributed under the License is distributed on an "AS IS" BASIS,
11 WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
12 See the License for the specific language governing permissions and
13 limitations under the License.
14
15 ******************************************************************************/
16
17 #include "vtkAvogadroActor.h"
18
19 #include <avogadro/core/matrix.h>
20 #include <avogadro/core/vector.h>
21 #include <avogadro/rendering/camera.h>
22 #include <avogadro/rendering/scene.h>
23 #include <avogadro/rendering/avogadrogl.h>
24 #include <avogadro/rendering/glrendervisitor.h>
25
26 #include <vtkObjectFactory.h>
27 #include <vtkViewport.h>
28
29 using Eigen::Affine3f;
30 using Avogadro::Vector3f;
31 using Avogadro::Rendering::Camera;
32 using Avogadro::Rendering::GLRenderVisitor;
33
vtkStandardNewMacro(vtkAvogadroActor)34 vtkStandardNewMacro(vtkAvogadroActor)
35
36 vtkAvogadroActor::vtkAvogadroActor()
37 : m_scene(nullptr), m_initialized(false)
38 {
39 for (short i = 0; i < 6; ++i)
40 m_bounds[i] = 0.0;
41 }
42
~vtkAvogadroActor()43 vtkAvogadroActor::~vtkAvogadroActor()
44 {
45 }
46
RenderOpaqueGeometry(vtkViewport *)47 int vtkAvogadroActor::RenderOpaqueGeometry(vtkViewport *)
48 {
49 if (!m_initialized) {
50 GLenum result = glewInit();
51 if (result != GLEW_OK) {
52 cout << "Error, could not initialize GLEW." << endl;
53 return 0;
54 }
55 if (!GLEW_VERSION_2_1) {
56 cout << "GL version 2.1 is not supported by your GPU." << endl;
57 return 0;
58 }
59 m_initialized = true;
60 }
61 if (!m_scene)
62 return 0;
63
64 // Figure out the current model view and projection matrices for our camera.
65 Camera camera;
66 Affine3f mv, proj;
67 glGetFloatv(GL_MODELVIEW_MATRIX, mv.matrix().data());
68 glGetFloatv(GL_PROJECTION_MATRIX, proj.matrix().data());
69 camera.setModelView(mv);
70 camera.setProjection(proj);
71
72 // Render the Avogadro scene using the GLRenderVisitor and return.
73 GLRenderVisitor visitor(camera);
74 visitor.setRenderPass(Avogadro::Rendering::OpaquePass);
75 m_scene->rootNode().accept(visitor);
76
77 return 1;
78 }
79
RenderTranslucentPolygonalGeometry(vtkViewport *)80 int vtkAvogadroActor::RenderTranslucentPolygonalGeometry(vtkViewport *)
81 {
82 // Figure out the current model view and projection matrices for our camera.
83 Camera camera;
84 Affine3f mv, proj;
85 glGetFloatv(GL_MODELVIEW_MATRIX, mv.matrix().data());
86 glGetFloatv(GL_PROJECTION_MATRIX, proj.matrix().data());
87 camera.setModelView(mv);
88 camera.setProjection(proj);
89
90 // Render the Avogadro scene using the GLRenderVisitor and return.
91 GLRenderVisitor visitor(camera);
92 visitor.setRenderPass(Avogadro::Rendering::TranslucentPass);
93 m_scene->rootNode().accept(visitor);
94
95 return 1;
96 }
97
HasTranslucentPolygonalGeometry()98 int vtkAvogadroActor::HasTranslucentPolygonalGeometry()
99 {
100 return 1;
101 }
102
GetBounds()103 double * vtkAvogadroActor::GetBounds()
104 {
105 if (!m_scene)
106 return m_bounds;
107
108 Vector3f center = m_scene->center();
109 float radius = m_scene->radius();
110 m_bounds[0] = center[0] - radius;
111 m_bounds[1] = center[0] + radius;
112 m_bounds[2] = center[1] - radius;
113 m_bounds[3] = center[1] + radius;
114 m_bounds[4] = center[2] - radius;
115 m_bounds[5] = center[2] + radius;
116
117 return m_bounds;
118 }
119
setScene(Avogadro::Rendering::Scene * scene)120 void vtkAvogadroActor::setScene(Avogadro::Rendering::Scene *scene)
121 {
122 m_scene = scene;
123 }
124
PrintSelf(ostream & os,vtkIndent indent)125 void vtkAvogadroActor::PrintSelf(ostream &os, vtkIndent indent)
126 {
127 Superclass::PrintSelf(os, indent);
128 }
129