Visual Servoing Platform version 3.6.0
Loading...
Searching...
No Matches
vpViewer.cpp
1/****************************************************************************
2 *
3 * ViSP, open source Visual Servoing Platform software.
4 * Copyright (C) 2005 - 2023 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 https://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*****************************************************************************/
42#include <visp3/core/vpConfig.h>
43
44#ifdef VISP_HAVE_COIN3D_AND_GUI
45#include <visp3/ar/vpSimulator.h>
46#include <visp3/ar/vpViewer.h>
47
48#include <Inventor/events/SoKeyboardEvent.h>
49#include <Inventor/nodes/SoEventCallback.h>
50
51#if defined(VISP_HAVE_SOWIN)
53 : SoWinExaminerViewer(parent, (char *)NULL, false), viewerType(type), simu(_simu)
54#elif defined(VISP_HAVE_SOQT)
55vpViewer::vpViewer(QWidget *parent, vpSimulator *_simu, vpViewerType type)
56 : SoQtExaminerViewer(parent, (char *)NULL, false), viewerType(type), simu(_simu)
57#elif defined(VISP_HAVE_SOXT)
58vpViewer::vpViewer(Widget parent, vpSimulator *_simu, vpViewerType type)
59 : SoXtExaminerViewer(parent, (char *)NULL, false), viewerType(type), simu(_simu)
60#endif
61{
62 // Coin should not clear the pixel-buffer, so the background image
63 // is not removed.
64
65 this->setClearBeforeRender(FALSE, TRUE);
66 // this->setAntialiasing(true, 2) ;
67 setAutoRedraw(false);
68}
69
71
73{
74
75 {
76 const SbViewportRegion vp = this->getViewportRegion();
77 SbVec2s origin = vp.getViewportOriginPixels();
78 SbVec2s size = vp.getViewportSizePixels();
79 glViewport(origin[0], origin[1], size[0], size[1]);
80
81 const SbColor col = this->getBackgroundColor();
82 glClearColor(col[0], col[1], col[2], 0.0f);
83 glClear(GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT);
84
85 // this should be used only with the vpAR:vpSimulator
86 // to diplay an image background
87 if (simu->image_background != NULL) {
88 glPixelStorei(GL_UNPACK_ALIGNMENT, 1);
90 glDrawPixels((GLsizei)simu->getInternalWidth(), (GLsizei)simu->getInternalHeight(), (GLenum)GL_LUMINANCE,
91 GL_UNSIGNED_BYTE, simu->image_background);
92 else
93 glDrawPixels((GLsizei)simu->getInternalWidth(), (GLsizei)simu->getInternalHeight(), (GLenum)GL_RGB,
94 GL_UNSIGNED_BYTE, simu->image_background);
95
96 glEnable(GL_DEPTH_TEST);
97 glClear(GL_DEPTH_BUFFER_BIT); // clear the z-buffer
98 glClearDepth(100.0); // Profondeur du Z-Buf
99 }
100// Render normal scenegraph.
101#if defined(VISP_HAVE_SOWIN)
102 SoWinExaminerViewer::actualRedraw();
103#elif defined(VISP_HAVE_SOQT)
104 SoQtExaminerViewer::actualRedraw();
105#elif defined(VISP_HAVE_SOXT)
106 SoXtExaminerViewer::actualRedraw();
107#endif
108 glSwapBuffers();
109 if (viewerType == vpViewer::internalView) {
110 simu->get = 0;
111 glReadPixels(0, 0, (GLsizei)simu->getInternalWidth(), (GLsizei)simu->getInternalHeight(), (GLenum)GL_RGB,
112 GL_UNSIGNED_BYTE, simu->bufferView);
113 simu->get = 1;
114 }
115 }
116}
117
125void
126#if defined(VISP_HAVE_SOWIN) || defined(VISP_HAVE_SOQT)
127vpViewer::resize(int x, int y, bool fixed)
128#else
129vpViewer::resize(int x, int y, bool /*fixed*/)
130#endif
131{
132 SbVec2s size(x, y);
133 setSize(size);
134 setGLSize(size);
135
136#if defined(VISP_HAVE_SOWIN)
137 HWND parent = getParentWidget();
138
139 RECT rcClient, rcWindow;
140 POINT ptDiff;
141 GetClientRect(parent, &rcClient);
142 GetWindowRect(parent, &rcWindow);
143 ptDiff.x = (rcWindow.right - rcWindow.left) - rcClient.right;
144 ptDiff.y = (rcWindow.bottom - rcWindow.top) - rcClient.bottom;
145 MoveWindow(parent, rcWindow.left, rcWindow.top, x + ptDiff.x, y + ptDiff.y, TRUE);
146 if (fixed) {
147 DWORD dwStyle = GetWindowLong(parent, GWL_STYLE);
148 dwStyle &= ~(WS_SIZEBOX);
149 SetWindowLong(parent, GWL_STYLE, dwStyle);
150 }
151#elif defined(VISP_HAVE_SOQT)
152 if (fixed) {
153 QWidget *parent = getParentWidget();
154 parent->setFixedSize(x, y);
155 }
156#endif
157}
158
167SbBool vpViewer::processSoEvent(const SoEvent *const event)
168{
169 if (this->isViewing() && event->getTypeId() == SoKeyboardEvent::getClassTypeId()) {
170 SoKeyboardEvent *kbevent = (SoKeyboardEvent *)event;
171 switch (kbevent->getKey()) {
172 case SoKeyboardEvent::H:
173 if (kbevent->getState() == SoButtonEvent::DOWN) {
174 std::cout << "H : this help " << std::endl;
175 std::cout << "M : get and save the external camera location (matrix)" << std::endl;
176 std::cout << "V : get and save the external camera location (vector)" << std::endl;
177 std::cout << "M : load camera location (vector)" << std::endl;
178 std::cout << "P : get external camera location and set the internal one" << std::endl;
179 }
180 return TRUE;
181
182 case SoKeyboardEvent::M:
183 if (kbevent->getState() == SoButtonEvent::DOWN) {
185 simu->getExternalCameraPosition(cMf);
186 std::ofstream f("cMf.dat");
187 cMf.save(f);
188 f.close();
189 }
190 return TRUE;
191 case SoKeyboardEvent::V:
192 if (kbevent->getState() == SoButtonEvent::DOWN) {
194 simu->getExternalCameraPosition(cMf);
195 vpPoseVector vcMf(cMf);
196 std::ofstream f("vcMf.dat");
197 vcMf.save(f);
198 f.close();
199 }
200 return TRUE;
201 case SoKeyboardEvent::L:
202 if (kbevent->getState() == SoButtonEvent::DOWN) {
203 vpPoseVector vcMf;
204 std::ifstream f("vcMf.dat");
205 vcMf.load(f);
206 f.close();
207 vpHomogeneousMatrix cMf(vcMf);
208 simu->setCameraPosition(cMf);
209 simu->moveInternalCamera(cMf);
210 }
211 return TRUE;
212 case SoKeyboardEvent::P:
213 if (kbevent->getState() == SoButtonEvent::DOWN) {
215 simu->getExternalCameraPosition(cMf);
216 vpPoseVector vcMf(cMf);
217 vcMf.print();
218 simu->setCameraPosition(cMf);
219 simu->moveInternalCamera(cMf);
220 }
221 return TRUE;
222 default:
223 break;
224 }
225 }
226#if defined(VISP_HAVE_SOWIN)
227 return SoWinExaminerViewer::processSoEvent(event);
228#elif defined(VISP_HAVE_SOQT)
229 return SoQtExaminerViewer::processSoEvent(event);
230#elif defined(VISP_HAVE_SOXT)
231 return SoXtExaminerViewer::processSoEvent(event);
232#endif
233}
234
235#elif !defined(VISP_BUILD_SHARED_LIBS)
236// Work around to avoid warning: libvisp_ar.a(vpViewer.cpp.o) has no symbols
237void dummy_vpViewer(){};
238#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.
void load(std::ifstream &f)
void print() const
Implementation of a simulator based on Coin3d (www.coin3d.org).
Definition vpSimulator.h:99
unsigned int getInternalWidth() const
GLubyte * image_background
unsigned char * bufferView
image of the internal view
void moveInternalCamera(vpHomogeneousMatrix &cMf)
modify the position of the camera in the scene graph
vpImageType typeImage
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
Viewer used by the simulator.
Definition vpViewer.h:120
void resize(int x, int y, bool fixed=false)
Definition vpViewer.cpp:127
@ internalView
Definition vpViewer.h:125
virtual ~vpViewer()
Definition vpViewer.cpp:70
virtual void actualRedraw(void)
Definition vpViewer.cpp:72
vpViewer(HWND parent, vpSimulator *simu, vpViewerType type)
Definition vpViewer.cpp:52