From: Carl Hetherington Date: Wed, 8 May 2019 23:49:58 +0000 (+0100) Subject: Basics of OpenGL viewer. X-Git-Tag: v2.15.1~18 X-Git-Url: https://main.carlh.net/gitweb/?p=dcpomatic.git;a=commitdiff_plain;h=a8e31120a793f09ab56cc2847d76944ba698ba95 Basics of OpenGL viewer. --- diff --git a/platform/windows/wscript b/platform/windows/wscript index 5ff31cf61..176e3840e 100644 --- a/platform/windows/wscript +++ b/platform/windows/wscript @@ -105,6 +105,7 @@ File "%static_deps%/bin/wxmsw30u_core_gcc_custom.dll" File "%static_deps%/bin/wxmsw30u_adv_gcc_custom.dll" File "%static_deps%/bin/wxmsw30u_richtext_gcc_custom.dll" File "%static_deps%/bin/wxmsw30u_html_gcc_custom.dll" +File "%static_deps%/bin/wxmsw30u_gl_gcc_custom.dll" File "%static_deps%/bin/wxbase30u_xml_gcc_custom.dll" File "%static_deps%/bin/libcairo-2.dll" File "%static_deps%/bin/libfreetype-6.dll" diff --git a/src/lib/exceptions.cc b/src/lib/exceptions.cc index 481d2e89d..c86f98da2 100644 --- a/src/lib/exceptions.cc +++ b/src/lib/exceptions.cc @@ -100,3 +100,9 @@ KDMError::KDMError (string s, string d) { } + +GLError::GLError (char const * last, int e) + : runtime_error (String::compose("%1 failed %2", last, e)) +{ + +} diff --git a/src/lib/exceptions.h b/src/lib/exceptions.h index fe87ababc..f6b3bd902 100644 --- a/src/lib/exceptions.h +++ b/src/lib/exceptions.h @@ -285,4 +285,11 @@ public: KDMAsContentError (); }; +class GLError : public std::runtime_error +{ +public: + GLError (char const * last, int e); +}; + + #endif diff --git a/src/wx/film_viewer.cc b/src/wx/film_viewer.cc index 48fbf9fdc..5af2d7462 100644 --- a/src/wx/film_viewer.cc +++ b/src/wx/film_viewer.cc @@ -27,6 +27,7 @@ #include "playhead_to_frame_dialog.h" #include "wx_util.h" #include "closed_captions_dialog.h" +#include "gl_video_view.h" #include "lib/film.h" #include "lib/ratio.h" #include "lib/util.h" @@ -77,7 +78,8 @@ rtaudio_callback (void* out, void *, unsigned int frames, double, RtAudioStreamS } FilmViewer::FilmViewer (wxWindow* p) - : _panel (new wxPanel (p)) + /* XXX: make this configurable */ + : _video_view (new GLVideoView(p)) , _coalesce_player_changes (false) , _audio (DCPOMATIC_RTAUDIO_API) , _audio_channels (0) @@ -96,15 +98,8 @@ FilmViewer::FilmViewer (wxWindow* p) , _state_timer ("viewer") , _gets (0) { -#ifndef __WXOSX__ - _panel->SetDoubleBuffered (true); -#endif - - _panel->SetBackgroundStyle (wxBG_STYLE_PAINT); - _panel->SetBackgroundColour (*wxBLACK); - - _panel->Bind (wxEVT_PAINT, boost::bind (&FilmViewer::paint_panel, this)); - _panel->Bind (wxEVT_SIZE, boost::bind (&FilmViewer::panel_sized, this, _1)); + /* XXX: maybe this should be proxied through the VideoView */ + _video_view->get()->Bind (wxEVT_SIZE, boost::bind (&FilmViewer::video_view_sized, this)); _timer.Bind (wxEVT_TIMER, boost::bind (&FilmViewer::timer, this)); set_film (shared_ptr ()); @@ -148,7 +143,7 @@ FilmViewer::set_film (shared_ptr film) _player->set_dcp_decode_reduction (_dcp_decode_reduction); } } catch (bad_alloc &) { - error_dialog (_panel, _("There is not enough free memory to do that.")); + error_dialog (_video_view->get(), _("There is not enough free memory to do that.")); _film.reset (); return; } @@ -214,10 +209,14 @@ FilmViewer::recreate_butler () void FilmViewer::refresh_panel () { + /* XXX */ + + /* _state_timer.set ("refresh-panel"); _panel->Refresh (); _panel->Update (); _state_timer.unset (); + */ } void @@ -282,7 +281,10 @@ FilmViewer::display_player_video () */ _state_timer.set ("get image"); + + /* XXX: do we need to store _frame? */ _frame = _player_video.first->image (bind(&PlayerVideo::force, _1, AV_PIX_FMT_RGB24), false, true); + _video_view->set_image (_frame); _state_timer.set ("ImageChanged"); ImageChanged (_player_video.first); @@ -324,6 +326,7 @@ FilmViewer::timer () bool #ifdef DCPOMATIC_VARIANT_SWAROOP +XXX FilmViewer::maybe_draw_background_image (wxPaintDC& dc) { optional bg = Config::instance()->player_background_image(); @@ -343,81 +346,6 @@ FilmViewer::maybe_draw_background_image (wxPaintDC &) } #endif -void -FilmViewer::paint_panel () -{ - _state_timer.set ("paint-panel"); - - wxPaintDC dc (_panel); - -#ifdef DCPOMATIC_VARIANT_SWAROOP - if (_background_image) { - dc.Clear (); - maybe_draw_background_image (dc); - _state_timer.unset (); - return; - } -#endif - - if (!_out_size.width || !_out_size.height || !_film || !_frame || _out_size != _frame->size()) { - dc.Clear (); - } else { - - wxImage frame (_out_size.width, _out_size.height, _frame->data()[0], true); - wxBitmap frame_bitmap (frame); - dc.DrawBitmap (frame_bitmap, 0, max(0, (_panel_size.height - _out_size.height) / 2)); - -#ifdef DCPOMATIC_VARIANT_SWAROOP - DCPTime const period = DCPTime::from_seconds(Config::instance()->player_watermark_period() * 60); - int64_t n = _video_position.get() / period.get(); - DCPTime from(n * period.get()); - DCPTime to = from + DCPTime::from_seconds(Config::instance()->player_watermark_duration() / 1000.0); - if (from <= _video_position && _video_position <= to) { - if (!_in_watermark) { - _in_watermark = true; - _watermark_x = rand() % _panel_size.width; - _watermark_y = rand() % _panel_size.height; - } - dc.SetTextForeground(*wxWHITE); - string wm = Config::instance()->player_watermark_theatre(); - boost::posix_time::ptime t = boost::posix_time::second_clock::local_time(); - wm += "\n" + boost::posix_time::to_iso_extended_string(t); - dc.DrawText(std_to_wx(wm), _watermark_x, _watermark_y); - } else { - _in_watermark = false; - } -#endif - } - - if (_out_size.width < _panel_size.width) { - /* XXX: these colours are right for GNOME; may need adjusting for other OS */ - wxPen p (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240)); - wxBrush b (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240)); - dc.SetPen (p); - dc.SetBrush (b); - dc.DrawRectangle (_out_size.width, 0, _panel_size.width - _out_size.width, _panel_size.height); - } - - if (_out_size.height < _panel_size.height) { - wxPen p (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240)); - wxBrush b (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240)); - dc.SetPen (p); - dc.SetBrush (b); - int const gap = (_panel_size.height - _out_size.height) / 2; - dc.DrawRectangle (0, 0, _panel_size.width, gap); - dc.DrawRectangle (0, gap + _out_size.height + 1, _panel_size.width, gap + 1); - } - - if (_outline_content) { - wxPen p (wxColour (255, 0, 0), 2); - dc.SetPen (p); - dc.SetBrush (*wxTRANSPARENT_BRUSH); - dc.DrawRectangle (_inter_position.x, _inter_position.y + (_panel_size.height - _out_size.height) / 2, _inter_size.width, _inter_size.height); - } - - _state_timer.unset (); -} - void FilmViewer::set_outline_content (bool o) { @@ -433,11 +361,8 @@ FilmViewer::set_eyes (Eyes e) } void -FilmViewer::panel_sized (wxSizeEvent& ev) +FilmViewer::video_view_sized () { - _panel_size.width = ev.GetSize().GetWidth(); - _panel_size.height = ev.GetSize().GetHeight(); - calculate_sizes (); if (!quick_refresh()) { slow_refresh (); @@ -454,16 +379,16 @@ FilmViewer::calculate_sizes () Ratio const * container = _film->container (); - float const panel_ratio = _panel_size.ratio (); + float const view_ratio = float(_video_view->get()->GetSize().x) / _video_view->get()->GetSize().y; float const film_ratio = container ? container->ratio () : 1.78; - if (panel_ratio < film_ratio) { + if (view_ratio < film_ratio) { /* panel is less widscreen than the film; clamp width */ - _out_size.width = _panel_size.width; + _out_size.width = _video_view->get()->GetSize().x; _out_size.height = lrintf (_out_size.width / film_ratio); } else { /* panel is more widescreen than the film; clamp height */ - _out_size.height = _panel_size.height; + _out_size.height = _video_view->get()->GetSize().y; _out_size.width = lrintf (_out_size.height * film_ratio); } @@ -471,6 +396,10 @@ FilmViewer::calculate_sizes () _out_size.width = max (64, _out_size.width); _out_size.height = max (64, _out_size.height); + /* Make OpenGL happy; XXX: only do this in GLVideoView? Is the round-to-4 constraint a thing? */ + _out_size.width &= ~3; + _out_size.height &= ~3; + _player->set_video_container_size (_out_size); } @@ -679,7 +608,7 @@ FilmViewer::config_changed (Config::Property p) } catch (RtAudioError& e) { #endif error_dialog ( - _panel, + _video_view->get(), _("Could not set up audio output. There will be no audio during the preview."), std_to_wx(e.what()) ); } diff --git a/src/wx/film_viewer.h b/src/wx/film_viewer.h index 0222d31c9..8b88638cc 100644 --- a/src/wx/film_viewer.h +++ b/src/wx/film_viewer.h @@ -22,6 +22,7 @@ * @brief FilmViewer class. */ +#include "video_view.h" #include "lib/film.h" #include "lib/config.h" #include "lib/player_text.h" @@ -47,9 +48,9 @@ public: FilmViewer (wxWindow *); ~FilmViewer (); - /** @return the panel showing the film's video */ - wxPanel* panel () const { - return _panel; + /** @return the window showing the film's video */ + wxWindow* panel () const { + return _video_view->get(); } void show_closed_captions (); @@ -114,8 +115,7 @@ public: boost::signals2::signal PlaybackPermitted; private: - void paint_panel (); - void panel_sized (wxSizeEvent &); + void video_view_sized (); void timer (); void calculate_sizes (); void player_change (ChangeType type, int, bool); @@ -136,8 +136,7 @@ private: boost::shared_ptr _film; boost::shared_ptr _player; - /** The area that we put our image in */ - wxPanel* _panel; + VideoView* _video_view; wxTimer _timer; bool _coalesce_player_changes; std::list _pending_player_changes; @@ -150,8 +149,6 @@ private: /** Size of our output (including padding if we have any) */ dcp::Size _out_size; - /** Size of the panel that we have available */ - dcp::Size _panel_size; RtAudio _audio; int _audio_channels; diff --git a/src/wx/gl_video_view.cc b/src/wx/gl_video_view.cc new file mode 100644 index 000000000..ce17c0329 --- /dev/null +++ b/src/wx/gl_video_view.cc @@ -0,0 +1,138 @@ +/* + Copyright (C) 2018-2019 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +#include "gl_video_view.h" +#include "lib/image.h" +#include "lib/dcpomatic_assert.h" +#include "lib/exceptions.h" +#include +#include + +#ifdef DCPOMATIC_OSX +#include +#include +#else +#include +#include +#endif + +using std::cout; +using boost::shared_ptr; + +GLVideoView::GLVideoView (wxWindow *parent) +{ + _canvas = new wxGLCanvas (parent, wxID_ANY, 0, wxDefaultPosition, wxDefaultSize, wxFULL_REPAINT_ON_RESIZE); + _context = new wxGLContext (_canvas); + _canvas->Bind (wxEVT_PAINT, boost::bind(&GLVideoView::paint, this, _1)); + + glGenTextures (1, &_id); + glBindTexture (GL_TEXTURE_2D, _id); + glPixelStorei (GL_UNPACK_ALIGNMENT, 1); +} + +GLVideoView::~GLVideoView () +{ + glDeleteTextures (1, &_id); + delete _context; + delete _canvas; +} + +static void +check_gl_error (char const * last) +{ + GLenum const e = glGetError (); + if (e != GL_NO_ERROR) { + throw GLError (last, e); + } +} + +void +GLVideoView::paint (wxPaintEvent &) +{ + _canvas->SetCurrent (*_context); + wxPaintDC dc (_canvas); + glClear (GL_COLOR_BUFFER_BIT | GL_DEPTH_BUFFER_BIT); + check_gl_error ("glClear"); + + glClearColor (0.0f, 0.0f, 0.0f, 1.0f); + check_gl_error ("glClearColor"); + glEnable (GL_TEXTURE_2D); + check_gl_error ("glEnable GL_TEXTURE_2D"); + glEnable (GL_COLOR_MATERIAL); + check_gl_error ("glEnable GL_COLOR_MATERIAL"); + glEnable (GL_BLEND); + check_gl_error ("glEnable GL_BLEND"); + glDisable (GL_DEPTH_TEST); + check_gl_error ("glDisable GL_DEPTH_TEST"); + glBlendFunc (GL_SRC_ALPHA, GL_ONE_MINUS_SRC_ALPHA); + + glViewport (0, 0, _canvas->GetSize().x, _canvas->GetSize().y); + glMatrixMode (GL_PROJECTION); + glLoadIdentity (); + + gluOrtho2D (0, _canvas->GetSize().x, _canvas->GetSize().y, 0); + glMatrixMode (GL_MODELVIEW); + glLoadIdentity (); + + glTranslatef (0, 0, 0); + + if (_size) { + glBegin (GL_QUADS); + + glTexCoord2f (0, 1); + glVertex2f (0, _size->height); + glTexCoord2f (1, 1); + glVertex2f (_size->width, _size->height); + glTexCoord2f (1, 0); + glVertex2f (_size->width, 0); + glTexCoord2f (0, 0); + glVertex2f (0, 0); + + glEnd (); + } + + glFlush(); + _canvas->SwapBuffers(); +} + +void +GLVideoView::set_image (shared_ptr image) +{ + /* XXX: put this somewhere sensible */ + cout << glGetString (GL_VERSION) << "\n"; + + DCPOMATIC_ASSERT (image->pixel_format() == AV_PIX_FMT_RGB24); + DCPOMATIC_ASSERT (!image->aligned()); + + _size = image->size (); + glPixelStorei (GL_UNPACK_ALIGNMENT, 1); + glTexImage2D (GL_TEXTURE_2D, 0, GL_RGB8, _size->width, _size->height, 0, GL_RGB, GL_UNSIGNED_BYTE, image->data()[0]); + check_gl_error ("glTexImage2D"); + + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri (GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + check_gl_error ("glTexParameteri"); + + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameterf (GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + check_gl_error ("glTexParameterf"); + + _canvas->Refresh (); +} diff --git a/src/wx/gl_video_view.h b/src/wx/gl_video_view.h new file mode 100644 index 000000000..cdc9fd530 --- /dev/null +++ b/src/wx/gl_video_view.h @@ -0,0 +1,48 @@ +/* + Copyright (C) 2019 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +#include "video_view.h" +#include +#include +#include +#include + +#undef None +#undef Success + +class GLVideoView : public VideoView +{ +public: + GLVideoView (wxWindow* parent); + ~GLVideoView (); + + void set_image (boost::shared_ptr image); + wxWindow* get () const { + return _canvas; + } + +private: + void paint (wxPaintEvent& event); + + wxGLCanvas* _canvas; + wxGLContext* _context; + GLuint _id; + boost::optional _size; +}; diff --git a/src/wx/simple_video_view.cc b/src/wx/simple_video_view.cc new file mode 100644 index 000000000..895a072a0 --- /dev/null +++ b/src/wx/simple_video_view.cc @@ -0,0 +1,118 @@ +/* + Copyright (C) 2019 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +SimpleVideoView::SimpleVideoView (wxWindow* parent) +{ + _panel = new wxPanel (parent); + +#ifndef __WXOSX__ + _panel->SetDoubleBuffered (true); +#endif + + _panel->SetBackgroundStyle (wxBG_STYLE_PAINT); + _panel->SetBackgroundColour (*wxBLACK); + + _panel->Bind (wxEVT_PAINT, boost::bind (&SimpleVideoView::paint_panel, this)); + _panel->Bind (wxEVT_SIZE, boost::bind (&SimpleVideoView::panel_sized, this, _1)); +} + +void +SimpleVideoView::paint_panel () +{ + wxPaintDC dc (_panel); + +#ifdef DCPOMATIC_VARIANT_SWAROOP + if (_background_image) { + dc.Clear (); + maybe_draw_background_image (dc); + _state_timer.unset (); + return; + } +#endif + + if (!_out_size.width || !_out_size.height || !_film || !_frame || _out_size != _frame->size()) { + dc.Clear (); + } else { + + wxImage frame (_out_size.width, _out_size.height, _frame->data()[0], true); + wxBitmap frame_bitmap (frame); + dc.DrawBitmap (frame_bitmap, 0, max(0, (_panel_size.height - _out_size.height) / 2)); + +#ifdef DCPOMATIC_VARIANT_SWAROOP + DCPTime const period = DCPTime::from_seconds(Config::instance()->player_watermark_period() * 60); + int64_t n = _video_position.get() / period.get(); + DCPTime from(n * period.get()); + DCPTime to = from + DCPTime::from_seconds(Config::instance()->player_watermark_duration() / 1000.0); + if (from <= _video_position && _video_position <= to) { + if (!_in_watermark) { + _in_watermark = true; + _watermark_x = rand() % _panel_size.width; + _watermark_y = rand() % _panel_size.height; + } + dc.SetTextForeground(*wxWHITE); + string wm = Config::instance()->player_watermark_theatre(); + boost::posix_time::ptime t = boost::posix_time::second_clock::local_time(); + wm += "\n" + boost::posix_time::to_iso_extended_string(t); + dc.DrawText(std_to_wx(wm), _watermark_x, _watermark_y); + } else { + _in_watermark = false; + } +#endif + } + + if (_out_size.width < _panel_size.width) { + /* XXX: these colours are right for GNOME; may need adjusting for other OS */ + wxPen p (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240)); + wxBrush b (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240)); + dc.SetPen (p); + dc.SetBrush (b); + dc.DrawRectangle (_out_size.width, 0, _panel_size.width - _out_size.width, _panel_size.height); + } + + if (_out_size.height < _panel_size.height) { + wxPen p (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240)); + wxBrush b (_pad_black ? wxColour(0, 0, 0) : wxColour(240, 240, 240)); + dc.SetPen (p); + dc.SetBrush (b); + int const gap = (_panel_size.height - _out_size.height) / 2; + dc.DrawRectangle (0, 0, _panel_size.width, gap); + dc.DrawRectangle (0, gap + _out_size.height + 1, _panel_size.width, gap + 1); + } + + if (_outline_content) { + wxPen p (wxColour (255, 0, 0), 2); + dc.SetPen (p); + dc.SetBrush (*wxTRANSPARENT_BRUSH); + dc.DrawRectangle (_inter_position.x, _inter_position.y + (_panel_size.height - _out_size.height) / 2, _inter_size.width, _inter_size.height); + } +} + +void +SimpleVideoView::panel_sized (wxSizeEvent& ev) +{ + _panel_size.width = ev.GetSize().GetWidth(); + _panel_size.height = ev.GetSize().GetHeight(); + + calculate_sizes (); + if (!quick_refresh()) { + slow_refresh (); + } + PositionChanged (); +} diff --git a/src/wx/simple_video_view.h b/src/wx/simple_video_view.h new file mode 100644 index 000000000..2eb62ab5f --- /dev/null +++ b/src/wx/simple_video_view.h @@ -0,0 +1,34 @@ +/* + Copyright (C) 2019 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +class SimpleVideoView : public VideoView +{ +public: + SimpleVideoView (wxWindow* parent); + + void set_image (boost::shared_ptr image); + + wxWindow* get () const { + return _panel; + } + +private: + wxPanel* _panel; +}; diff --git a/src/wx/video_view.h b/src/wx/video_view.h new file mode 100644 index 000000000..f4dec9c68 --- /dev/null +++ b/src/wx/video_view.h @@ -0,0 +1,38 @@ +/* + Copyright (C) 2019 Carl Hetherington + + This file is part of DCP-o-matic. + + DCP-o-matic is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 2 of the License, or + (at your option) any later version. + + DCP-o-matic is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with DCP-o-matic. If not, see . + +*/ + +#ifndef DCPOMATIC_VIDEO_VIEW_H +#define DCPOMATIC_VIDEO_VIEW_H + +#include + +class Image; +class wxWindow; + +class VideoView +{ +public: + virtual ~VideoView () {} + + virtual void set_image (boost::shared_ptr image) = 0; + virtual wxWindow* get () const = 0; +}; + +#endif diff --git a/src/wx/wscript b/src/wx/wscript index 193093e14..580e49308 100644 --- a/src/wx/wscript +++ b/src/wx/wscript @@ -70,6 +70,7 @@ sources = """ full_config_dialog.cc gain_calculator_dialog.cc gdc_certificate_panel.cc + gl_video_view.cc hints_dialog.cc html_dialog.cc initial_setup_dialog.cc @@ -156,7 +157,7 @@ def configure(conf): conf.check_cfg(msg='Checking for wxWidgets using gtk2-unicode-3.0', package='', path=wx_config, - args='--cppflags --cxxflags --libs %s' % wx_libs, + args='--cppflags --cxxflags --libs %s --gl-libs' % wx_libs, uselib_store='WXWIDGETS', mandatory=True) except: @@ -165,7 +166,7 @@ def configure(conf): conf.check_cfg(msg='Checking for wxWidgets using wx-config-3.0-gtk2', package='', path=wx_config, - args='--cppflags --cxxflags --libs %s' % wx_libs, + args='--cppflags --cxxflags --libs %s --gl-libs' % wx_libs, uselib_store='WXWIDGETS', mandatory=True) except: @@ -173,7 +174,7 @@ def configure(conf): conf.check_cfg(msg='Checking for wxWidgets using wx-config', package='', path=wx_config, - args='--cppflags --cxxflags --libs %s' % wx_libs, + args='--cppflags --cxxflags --libs %s --gl-libs' % wx_libs, uselib_store='WXWIDGETS', mandatory=True) @@ -244,6 +245,13 @@ def configure(conf): define_name='DCPOMATIC_USE_RTERROR', mandatory=False) + if conf.env.TARGET_WINDOWS or conf.env.TARGET_LINUX: + conf.check_cfg(package='gl', args='--cflags --libs', uselib_store='GL', mandatory=True) + conf.check_cfg(package='glu', args='--cflags --libs', uselib_store='GLU', mandatory=True) + else: + conf.env.STLIB_GL = 'gl' + conf.env.STLIB_GLU = 'glu' + def build(bld): @@ -254,13 +262,13 @@ def build(bld): obj.name = 'libdcpomatic2-wx' obj.export_includes = ['..'] - obj.uselib = 'BOOST_FILESYSTEM BOOST_THREAD BOOST_REGEX WXWIDGETS DCP SUB ZIP CXML RTAUDIO ' + obj.uselib = 'BOOST_FILESYSTEM BOOST_THREAD BOOST_REGEX WXWIDGETS DCP SUB ZIP CXML RTAUDIO GL GLU ' if bld.env.TARGET_LINUX: - obj.uselib += 'GTK ' + obj.uselib += 'GTK GL GLU ' if bld.env.TARGET_WINDOWS: - obj.uselib += 'WINSOCK2 OLE32 DSOUND WINMM KSUSER ' + obj.uselib += 'WINSOCK2 OLE32 DSOUND WINMM KSUSER GL GLU ' if bld.env.TARGET_OSX: - obj.framework = ['CoreAudio'] + obj.framework = ['CoreAudio', 'OpenGL'] obj.use = 'libdcpomatic2' if bld.env.VARIANT == 'swaroop': obj.source = sources + " swaroop_controls.cc"