Visual Servoing Platform version 3.5.0
vpViewer.cpp
1/****************************************************************************
2 *
3 * ViSP, open source Visual Servoing Platform software.
4 * Copyright (C) 2005 - 2019 by Inria. All rights reserved.
5 *
6 * This software is free software; you can redistribute it and/or modify
7 * it under the terms of the GNU General Public License as published by
8 * the Free Software Foundation; either version 2 of the License, or
9 * (at your option) any later version.
10 * See the file LICENSE.txt at the root directory of this source
11 * distribution for additional information about the GNU GPL.
12 *
13 * For using ViSP with software that can not be combined with the GNU
14 * GPL, please contact Inria about acquiring a ViSP Professional
15 * Edition License.
16 *
17 * See http://visp.inria.fr for more information.
18 *
19 * This software was developed at:
20 * Inria Rennes - Bretagne Atlantique
21 * Campus Universitaire de Beaulieu
22 * 35042 Rennes Cedex
23 * France
24 *
25 * If you have questions regarding the use of this file, please contact
26 * Inria at visp@inria.fr
27 *
28 * This file is provided AS IS with NO WARRANTY OF ANY KIND, INCLUDING THE
29 * WARRANTY OF DESIGN, MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
30 *
31 * Description:
32 * Simulator based on Coin3d.
33 *
34 * Authors:
35 * Eric Marchand
36 *
37 *****************************************************************************/
45#include <visp3/core/vpConfig.h>
46
47#ifdef VISP_HAVE_COIN3D_AND_GUI
48#include <visp3/ar/vpSimulator.h>
49#include <visp3/ar/vpViewer.h>
50
51#include <Inventor/events/SoKeyboardEvent.h>
52#include <Inventor/nodes/SoEventCallback.h>
53
54#if defined(VISP_HAVE_SOWIN)
56 : SoWinExaminerViewer(parent, (char *)NULL, false), viewerType(type), simu(_simu)
57#elif defined(VISP_HAVE_SOQT)
58vpViewer::vpViewer(QWidget *parent, vpSimulator *_simu, vpViewerType type)
59 : SoQtExaminerViewer(parent, (char *)NULL, false), viewerType(type), simu(_simu)
60#elif defined(VISP_HAVE_SOXT)
61vpViewer::vpViewer(Widget parent, vpSimulator *_simu, vpViewerType type)
62 : SoXtExaminerViewer(parent, (char *)NULL, false), viewerType(type), simu(_simu)
63#endif
64{
65 // Coin should not clear the pixel-buffer, so the background image
66 // is not removed.
67
68 this->setClearBeforeRender(FALSE, TRUE);
69 // this->setAntialiasing(true, 2) ;
70 setAutoRedraw(false);
71}
72
74
76{
77
78 {
79 const SbViewportRegion vp = this->getViewportRegion();
80 SbVec2s origin = vp.getViewportOriginPixels();
81 SbVec2s size = vp.getViewportSizePixels();
82 glViewport(origin[0], origin[1], size[0], size[1]);
83
84 const SbColor col = this->getBackgroundColor();
85 glClearColor(col[0], col[1], col[2], 0.0f);
86 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
87
88 // this should be used only with the vpAR:vpSimulator
89 // to diplay an image background
90 if (simu->image_background != NULL) {
91 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
93 glDrawPixels((GLsizei)simu->getInternalWidth(), (GLsizei)simu->getInternalHeight(), (GLenum)GL_LUMINANCE,
94 GL_UNSIGNED_BYTE, simu->image_background);
95 else
96 glDrawPixels((GLsizei)simu->getInternalWidth(), (GLsizei)simu->getInternalHeight(), (GLenum)GL_RGB,
97 GL_UNSIGNED_BYTE, simu->image_background);
98
99 glEnable(GL_DEPTH_TEST);
100 glClear(GL_DEPTH_BUFFER_BIT); // clear the z-buffer
101 glClearDepth(100.0); // Profondeur du Z-Buf
102 }
103// Render normal scenegraph.
104#if defined(VISP_HAVE_SOWIN)
105 SoWinExaminerViewer::actualRedraw();
106#elif defined(VISP_HAVE_SOQT)
107 SoQtExaminerViewer::actualRedraw();
108#elif defined(VISP_HAVE_SOXT)
109 SoXtExaminerViewer::actualRedraw();
110#endif
111 glSwapBuffers();
112 if (viewerType == vpViewer::internalView) {
113 simu->get = 0;
114 glReadPixels(0, 0, (GLsizei)simu->getInternalWidth(), (GLsizei)simu->getInternalHeight(), (GLenum)GL_RGB,
115 GL_UNSIGNED_BYTE, simu->bufferView);
116 simu->get = 1;
117 }
118 }
119}
120
128void
129#if defined(VISP_HAVE_SOWIN) || defined(VISP_HAVE_SOQT)
130vpViewer::resize(int x, int y, bool fixed)
131#else
132vpViewer::resize(int x, int y, bool /*fixed*/)
133#endif
134{
135 SbVec2s size(x, y);
136 setSize(size);
137 setGLSize(size);
138
139#if defined(VISP_HAVE_SOWIN)
140 HWND parent = getParentWidget();
141
142 RECT rcClient, rcWindow;
143 POINT ptDiff;
144 GetClientRect(parent, &rcClient);
145 GetWindowRect(parent, &rcWindow);
146 ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
147 ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
148 MoveWindow(parent, rcWindow.left, rcWindow.top, x + ptDiff.x, y + ptDiff.y, TRUE);
149 if (fixed) {
150 DWORD dwStyle = GetWindowLong(parent, GWL_STYLE);
151 dwStyle &= ~(WS_SIZEBOX);
152 SetWindowLong(parent, GWL_STYLE, dwStyle);
153 }
154#elif defined(VISP_HAVE_SOQT)
155 if (fixed) {
156 QWidget *parent = getParentWidget();
157 parent->setFixedSize(x, y);
158 }
159#endif
160}
161
170SbBool vpViewer::processSoEvent(const SoEvent *const event)
171{
172 if (this->isViewing() && event->getTypeId() == SoKeyboardEvent::getClassTypeId()) {
173 SoKeyboardEvent *kbevent = (SoKeyboardEvent *)event;
174 switch (kbevent->getKey()) {
175 case SoKeyboardEvent::H:
176 if (kbevent->getState() == SoButtonEvent::DOWN) {
177 std::cout << "H : this help " << std::endl;
178 std::cout << "M : get and save the external camera location (matrix)" << std::endl;
179 std::cout << "V : get and save the external camera location (vector)" << std::endl;
180 std::cout << "M : load camera location (vector)" << std::endl;
181 std::cout << "P : get external camera location and set the internal one" << std::endl;
182 }
183 return TRUE;
184
185 case SoKeyboardEvent::M:
186 if (kbevent->getState() == SoButtonEvent::DOWN) {
188 simu->getExternalCameraPosition(cMf);
189 std::ofstream f("cMf.dat");
190 cMf.save(f);
191 f.close();
192 }
193 return TRUE;
194 case SoKeyboardEvent::V:
195 if (kbevent->getState() == SoButtonEvent::DOWN) {
197 simu->getExternalCameraPosition(cMf);
198 vpPoseVector vcMf(cMf);
199 std::ofstream f("vcMf.dat");
200 vcMf.save(f);
201 f.close();
202 }
203 return TRUE;
204 case SoKeyboardEvent::L:
205 if (kbevent->getState() == SoButtonEvent::DOWN) {
206 vpPoseVector vcMf;
207 std::ifstream f("vcMf.dat");
208 vcMf.load(f);
209 f.close();
210 vpHomogeneousMatrix cMf(vcMf);
211 simu->setCameraPosition(cMf);
212 simu->moveInternalCamera(cMf);
213 }
214 return TRUE;
215 case SoKeyboardEvent::P:
216 if (kbevent->getState() == SoButtonEvent::DOWN) {
218 simu->getExternalCameraPosition(cMf);
219 vpPoseVector vcMf(cMf);
220 vcMf.print();
221 simu->setCameraPosition(cMf);
222 simu->moveInternalCamera(cMf);
223 }
224 return TRUE;
225 default:
226 break;
227 }
228 }
229#if defined(VISP_HAVE_SOWIN)
230 return SoWinExaminerViewer::processSoEvent(event);
231#elif defined(VISP_HAVE_SOQT)
232 return SoQtExaminerViewer::processSoEvent(event);
233#elif defined(VISP_HAVE_SOXT)
234 return SoXtExaminerViewer::processSoEvent(event);
235#endif
236}
237
238#elif !defined(VISP_BUILD_SHARED_LIBS)
239// Work arround to avoid warning: libvisp_ar.a(vpViewer.cpp.o) has no symbols
240void dummy_vpViewer(){};
241#endif
Implementation of an homogeneous matrix and operations on such kind of matrices.
void save(std::ofstream &f) const
Implementation of a pose vector and operations on poses.
Definition: vpPoseVector.h:152
void load(std::ifstream &f)
void print() const
Implementation of a simulator based on Coin3d (www.coin3d.org).
Definition: vpSimulator.h:100
unsigned int getInternalWidth() const
Definition: vpSimulator.h:174
GLubyte * image_background
Definition: vpSimulator.h:131
unsigned char * bufferView
image of the internal view
Definition: vpSimulator.h:279
void moveInternalCamera(vpHomogeneousMatrix &cMf)
modify the position of the camera in the scene graph
vpImageType typeImage
Definition: vpSimulator.h:129
void getExternalCameraPosition(vpHomogeneousMatrix &cMf)
get the external camera position
void setCameraPosition(vpHomogeneousMatrix &cMf)
set the camera position (from an homogeneous matrix)
unsigned int getInternalHeight() const
Definition: vpSimulator.h:180
Viewer used by the simulator.
Definition: vpViewer.h:123
void resize(int x, int y, bool fixed=false)
Definition: vpViewer.cpp:130
vpViewerType
Definition: vpViewer.h:128
@ internalView
Definition: vpViewer.h:128
virtual ~vpViewer()
Definition: vpViewer.cpp:73
virtual void actualRedraw(void)
Definition: vpViewer.cpp:75
vpViewer(HWND parent, vpSimulator *simu, vpViewerType type)
Definition: vpViewer.cpp:55