1 | /* |
2 | NanoGUI was developed by Wenzel Jakob <wenzel.jakob@epfl.ch>. |
3 | The widget drawing code is based on the NanoVG demo application |
4 | by Mikko Mononen. |
5 | |
6 | All rights reserved. Use of this source code is governed by a |
7 | BSD-style license that can be found in the LICENSE.txt file. |
8 | */ |
9 | /** |
10 | * \file nanogui/glcanvas.h |
11 | * |
12 | * \brief Canvas widget for rendering OpenGL content. This widget was |
13 | * contributed by Jan Winkler. |
14 | */ |
15 | |
16 | #pragma once |
17 | |
18 | #include <iostream> |
19 | |
20 | #include <nanogui/widget.h> |
21 | #include <nanogui/opengl.h> |
22 | #include <nanogui/glutil.h> |
23 | |
24 | NAMESPACE_BEGIN(nanogui) |
25 | |
26 | /** |
27 | * \class GLCanvas glcanvas.h nanogui/glcanvas.h |
28 | * |
29 | * \brief Canvas widget for rendering OpenGL content. This widget was |
30 | * contributed by Jan Winkler. |
31 | * |
32 | * Canvas widget that can be used to display arbitrary OpenGL content. This is |
33 | * useful to display and manipulate 3D objects as part of an interactive |
34 | * application. The implementation uses scissoring to ensure that rendered |
35 | * objects don't spill into neighboring widgets. |
36 | * |
37 | * \rst |
38 | * **Usage** |
39 | * Override :func:`nanogui::GLCanvas::drawGL` in subclasses to provide |
40 | * custom drawing code. See :ref:`nanogui_example_4`. |
41 | * |
42 | * \endrst |
43 | */ |
44 | class NANOGUI_EXPORT GLCanvas : public Widget { |
45 | public: |
46 | /** |
47 | * Creates a GLCanvas attached to the specified parent. |
48 | * |
49 | * \param parent |
50 | * The Widget to attach this GLCanvas to. |
51 | */ |
52 | GLCanvas(Widget *parent); |
53 | |
54 | /// Returns the background color. |
55 | const Color &backgroundColor() const { return mBackgroundColor; } |
56 | |
57 | /// Sets the background color. |
58 | void setBackgroundColor(const Color &backgroundColor) { mBackgroundColor = backgroundColor; } |
59 | |
60 | /// Set whether to draw the widget border or not. |
61 | void setDrawBorder(const bool bDrawBorder) { mDrawBorder = bDrawBorder; } |
62 | |
63 | /// Return whether the widget border gets drawn or not. |
64 | const bool &drawBorder() const { return mDrawBorder; } |
65 | |
66 | /// Draw the canvas. |
67 | virtual void draw(NVGcontext *ctx) override; |
68 | |
69 | /// Draw the GL scene. Override this method to draw the actual GL content. |
70 | virtual void drawGL() {} |
71 | |
72 | /// Save the state of this GLCanvas to the specified Serializer. |
73 | virtual void save(Serializer &s) const override; |
74 | |
75 | /// Set the state of this GLCanvas from the specified Serializer. |
76 | virtual bool load(Serializer &s) override; |
77 | |
78 | protected: |
79 | /// Internal helper function for drawing the widget border |
80 | void drawWidgetBorder(NVGcontext* ctx) const; |
81 | |
82 | protected: |
83 | /// The background color (what is used with ``glClearColor``). |
84 | Color mBackgroundColor; |
85 | |
86 | /// Whether to draw the widget border or not. |
87 | bool mDrawBorder; |
88 | |
89 | public: |
90 | EIGEN_MAKE_ALIGNED_OPERATOR_NEW |
91 | }; |
92 | |
93 | NAMESPACE_END(nanogui) |
94 | |