BALL 1.5.0
Loading...
Searching...
No Matches
renderSetup.h
Go to the documentation of this file.
1// -*- Mode: C++; tab-width: 2; -*-
2// vi: set ts=2:
3//
4
5#ifndef BALL_VIEW_RENDERING_RENDERSETUP_H
6#define BALL_VIEW_RENDERING_RENDERSETUP_H
7
8#ifndef BALL_VIEW_RENDERING_GLRENDERER_H
10#endif
11
12#ifndef BALL_VIEW_RENDERING_RENDERTARGET_H
14#endif
15
16#ifndef BALL_VIEW_RENDERING_GLRENDERWINDOW_H
18#endif
19
20#ifndef BALL_SYSTEM_MUTEX_H
21# include <BALL/SYSTEM/mutex.h>
22#endif
23
24#include <QtCore/QThread>
25#include <QtCore/QWaitCondition>
26
27#include <boost/enable_shared_from_this.hpp>
28
29#include <deque>
30
31class QImage;
32
33namespace BALL {
34 namespace VIEW {
35
36 class ColorMap;
37 class Scene;
38
45 : public QThread, public boost::enable_shared_from_this<RenderSetup>
46 {
47 public:
48 RenderSetup(Renderer* r, RenderTarget* t, Scene* scene, const Stage* stage);
49
51
52 virtual ~RenderSetup();
53
54 const RenderSetup& operator = (const RenderSetup& rs);
55
56 // TODO: this should be boost smart pointers!
59
63 {
65 UNKNOWN_RENDERER = 0,
66
69
72
75
78
81
83 RTFACT_RENDERER
84 };
85
89 RIGHT_EYE
90 };
91
94 void init();
95
98 void resize(Size width, Size height);
99
106 void pauseRendering() { rendering_paused_ = true; }
107
113 void startRendering() { rendering_paused_ = false; }
114
117 bool isPaused() const { return rendering_paused_; }
118
121 RendererType getRendererType() { return renderer_type_; }
122
138 void setReceiveBufferUpdates(bool do_receive) { receive_updates_ = do_receive; }
139
142 bool receivesBufferUpdates() const { return receive_updates_; };
143
149 void updateCamera(const Camera* camera = 0);
150
156 void setOffset(const Vector3& offset);
157
164 void setStereoMode(STEREO_SETUP stereo) { stereo_setup_ = stereo; };
165
171
177
185
188 bool exportPNG(const String& filename);
189
192 void setLights(bool reset_all = false);
193
197
200 void setupEnvironmentMap(const QImage& image);
201
208
215
220
225
228 void pickObjects(Position x1, Position y1, Position x2, Position y2, std::list<GeometricObject*>& objects);
229
238 void showRuler(bool show);
239
241
245
248 void useContinuousLoop(bool use_loop);
249
254 void stop() { MutexLocker ml(&render_mutex_); about_to_quit_ = true; }
255
258 bool isAboutToQuit() { return about_to_quit_; }
259
262 bool isContinuous() { return use_continuous_loop_; }
263
272 void setTimeToLive(int ttl) { ttl_ = ttl; }
273
276 int getTimeToLive() const { return ttl_; }
277
280 void exportPNGAfterTTL(String filename) { export_after_ttl_ = true; export_after_ttl_filename_ = filename; }
281
288 virtual void makeCurrent();
289
290 virtual void run();
291
292 void lock() { render_mutex_.lock(); }
293 void unlock() { render_mutex_.unlock(); }
294
295 mutable QWaitCondition wait_for_render;
296 // locks the renderer before the next render call
298
300 bool bufferIsReady() { return buffer_is_ready_; }
301
304
306 void setBufferReady(bool is_ready) { buffer_is_ready_ = is_ready; }
307
309 std::deque<boost::shared_ptr<RenderSetup> >& getDependentRenderers() { return keep_in_sync_; }
310
312 void makeDependentOn(boost::shared_ptr<RenderSetup>& partner) { keep_in_sync_.push_back(partner); }
313
314 protected:
315 // does the hard work and can be called from a continuous loop as well as from event-based rendering
317
318 void initType_();
319
323
325
328
330
331 // switches between rendering continously and rendering upon events
333
335 Stage const* stage_;
336
337 // locks the renderer during updates and rendering
339
341
342 // This pointer is used to avoid uneccessary RTTI calls and casting. If the target is not a
343 // GLRenderWindow or one of its derived classes, this pointer will simply be NULL
345
346 // This pointer is used to avoid uneccessary RTTI calls and casting. If the renderer is not a
347 // GLRenderer or one of its derived classes, this pointer will simply be NULL
349
350 // The number of render operations to perform before destruction
351 int ttl_;
352
355
356 // a list of render setups that should be synchronized with this one so that buffer
357 // swaps only happen simulatneously
358 std::deque<boost::shared_ptr<RenderSetup> > keep_in_sync_;
359
361
362 // the type of the encapsulated renderer
364 };
365
369 : public QEvent
370 {
371 public:
372 RenderToBufferFinishedEvent(boost::shared_ptr<RenderSetup> renderer)
373 : QEvent(static_cast<QEvent::Type>(RENDER_TO_BUFFER_FINISHED_EVENT)),
374 renderer_(renderer)
375 {};
376
377 boost::shared_ptr<RenderSetup> getRenderer() { return renderer_; }
378
379 protected:
380 boost::shared_ptr<RenderSetup> renderer_;
381 };
382
383 }
384}
385
386#endif
TMutexLocker< BALL_DEFAULT_MUTEXLOCKER_TYPE, BALL_DEFAULT_MUTEX_TYPE > MutexLocker
Definition mutex.h:226
@ RENDER_TO_BUFFER_FINISHED_EVENT
Event posted by renderers after a new buffer is available.
@ TILING_RENDERER
Used for offscreen rendering.
Definition renderSetup.h:80
@ STL_RENDERER
Renders into an STL file.
Definition renderSetup.h:77
@ OPENGL_RENDERER
Standard OpenGL renderer.
Definition renderSetup.h:68
@ POV_RENDERER
Renders into a POVRay file.
Definition renderSetup.h:71
@ VRML_RENDERER
Renders into a VRML file (deprecated)
Definition renderSetup.h:74
RenderSetup(const RenderSetup &rs)
void setReceiveBufferUpdates(bool do_receive)
void updateCamera(const Camera *camera=0)
bool exportPNG(const String &filename)
void setLights(bool reset_all=false)
void setBufferReady(bool is_ready)
void setStereoMode(STEREO_SETUP stereo)
std::deque< boost::shared_ptr< RenderSetup > > keep_in_sync_
void useContinuousLoop(bool use_loop)
Vector3 mapViewportTo3D(Position x, Position y)
bool isReadyToSwap()
Returns true iff bufferIsReady() holds for this renderer and all dependent ones.
Position prepareGridTextures(const RegularData3D &grid, const ColorMap &map)
void exportPNGAfterTTL(String filename)
void setupEnvironmentMap(const QImage &image)
QWaitCondition wait_for_render
RenderSetup(Renderer *r, RenderTarget *t, Scene *scene, const Stage *stage)
std::deque< boost::shared_ptr< RenderSetup > > & getDependentRenderers()
Vector2 map3DToViewport(const Vector3 &vec)
GLRenderer * gl_renderer_
void pickObjects(Position x1, Position y1, Position x2, Position y2, std::list< GeometricObject * > &objects)
bool bufferIsReady()
Returns true if the buffer has been filled and just waits for painting.
RenderTarget * target
Definition renderSetup.h:58
STEREO_SETUP stereo_setup_
RendererType renderer_type_
void bufferRepresentation(const Representation &rep)
void removeRepresentation(const Representation &rep)
void resize(Size width, Size height)
void setTimeToLive(int ttl)
void removeGridTextures(const RegularData3D &grid)
void makeDependentOn(boost::shared_ptr< RenderSetup > &partner)
void showRuler(bool show)
bool receivesBufferUpdates() const
void setOffset(const Vector3 &offset)
RendererType getRendererType()
void updateMaterialForRepresentation(const Representation *rep)
GLRenderWindow * gl_target_
virtual void makeCurrent()
boost::shared_ptr< RenderSetup > getRenderer()
RenderToBufferFinishedEvent(boost::shared_ptr< RenderSetup > renderer)
boost::shared_ptr< RenderSetup > renderer_
#define BALL_VIEW_EXPORT