diff options
author | David Robillard <d@drobilla.net> | 2021-05-24 09:16:08 -0400 |
---|---|---|
committer | David Robillard <d@drobilla.net> | 2021-05-24 09:42:59 -0400 |
commit | 3d78a073d90d8f232604fbdc76a6a583ffab364b (patch) | |
tree | 75233415a2ad06ae2927eb7118655c52a4490c15 /examples/pugl_cpp_demo.cpp | |
parent | 07ba65842428ad50367847c7236881d814620ef4 (diff) | |
download | pugl-3d78a073d90d8f232604fbdc76a6a583ffab364b.tar.gz pugl-3d78a073d90d8f232604fbdc76a6a583ffab364b.tar.bz2 pugl-3d78a073d90d8f232604fbdc76a6a583ffab364b.zip |
Consistently refer to C++ as "cpp" and fix installation
Diffstat (limited to 'examples/pugl_cpp_demo.cpp')
-rw-r--r-- | examples/pugl_cpp_demo.cpp | 148 |
1 files changed, 148 insertions, 0 deletions
diff --git a/examples/pugl_cpp_demo.cpp b/examples/pugl_cpp_demo.cpp new file mode 100644 index 0000000..e49c416 --- /dev/null +++ b/examples/pugl_cpp_demo.cpp @@ -0,0 +1,148 @@ +/* + Copyright 2012-2020 David Robillard <d@drobilla.net> + + Permission to use, copy, modify, and/or distribute this software for any + purpose with or without fee is hereby granted, provided that the above + copyright notice and this permission notice appear in all copies. + + THIS SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES + WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF + MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR + ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES + WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN + ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF + OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +*/ + +#include "cube_view.h" +#include "demo_utils.h" +#include "test/test_utils.h" + +#include "pugl/gl.hpp" +#include "pugl/pugl.h" +#include "pugl/pugl.hpp" + +#include <cmath> + +class CubeView : public pugl::View +{ +public: + explicit CubeView(pugl::World& world) + : pugl::View{world} + { + setEventHandler(*this); + } + + template<PuglEventType t, class Base> + pugl::Status onEvent(const pugl::Event<t, Base>&) noexcept + { + return pugl::Status::success; + } + + static pugl::Status onEvent(const pugl::ConfigureEvent& event) noexcept; + pugl::Status onEvent(const pugl::UpdateEvent& event) noexcept; + pugl::Status onEvent(const pugl::ExposeEvent& event) noexcept; + pugl::Status onEvent(const pugl::KeyPressEvent& event) noexcept; + pugl::Status onEvent(const pugl::CloseEvent& event) noexcept; + + bool quit() const { return _quit; } + +private: + double _xAngle{0.0}; + double _yAngle{0.0}; + double _lastDrawTime{0.0}; + bool _quit{false}; +}; + +pugl::Status +CubeView::onEvent(const pugl::ConfigureEvent& event) noexcept +{ + reshapeCube(static_cast<float>(event.width), + static_cast<float>(event.height)); + + return pugl::Status::success; +} + +pugl::Status +CubeView::onEvent(const pugl::UpdateEvent&) noexcept +{ + return postRedisplay(); +} + +pugl::Status +CubeView::onEvent(const pugl::ExposeEvent&) noexcept +{ + const double thisTime = world().time(); + const double dTime = thisTime - _lastDrawTime; + const double dAngle = dTime * 100.0; + + _xAngle = fmod(_xAngle + dAngle, 360.0); + _yAngle = fmod(_yAngle + dAngle, 360.0); + displayCube(cobj(), + 8.0f, + static_cast<float>(_xAngle), + static_cast<float>(_yAngle), + false); + + _lastDrawTime = thisTime; + + return pugl::Status::success; +} + +pugl::Status +CubeView::onEvent(const pugl::KeyPressEvent& event) noexcept +{ + if (event.key == PUGL_KEY_ESCAPE || event.key == 'q') { + _quit = true; + } + + return pugl::Status::success; +} + +pugl::Status +CubeView::onEvent(const pugl::CloseEvent&) noexcept +{ + _quit = true; + + return pugl::Status::success; +} + +int +main(int argc, char** argv) +{ + const PuglTestOptions opts = puglParseTestOptions(&argc, &argv); + if (opts.help) { + puglPrintTestUsage("pugl_cpp_demo", ""); + return 1; + } + + pugl::World world{pugl::WorldType::program}; + CubeView view{world}; + PuglFpsPrinter fpsPrinter{}; + + world.setClassName("PuglCppTest"); + + view.setWindowTitle("Pugl C++ Test"); + view.setDefaultSize(512, 512); + view.setMinSize(64, 64); + view.setMaxSize(256, 256); + view.setAspectRatio(1, 1, 16, 9); + view.setBackend(pugl::glBackend()); + view.setHint(pugl::ViewHint::resizable, opts.resizable); + view.setHint(pugl::ViewHint::samples, opts.samples); + view.setHint(pugl::ViewHint::doubleBuffer, opts.doubleBuffer); + view.setHint(pugl::ViewHint::swapInterval, opts.sync); + view.setHint(pugl::ViewHint::ignoreKeyRepeat, opts.ignoreKeyRepeat); + view.realize(); + view.show(); + + unsigned framesDrawn = 0; + while (!view.quit()) { + world.update(0.0); + + ++framesDrawn; + puglPrintFps(world.cobj(), &fpsPrinter, &framesDrawn); + } + + return 0; +} |