avmedia/source/opengl/oglplayer.cxx | 1 avmedia/source/opengl/oglwindow.cxx | 93 ++++++++++++++-------- avmedia/source/opengl/oglwindow.hxx | 1 slideshow/source/engine/shapes/viewmediashape.cxx | 33 +++++-- slideshow/source/engine/shapes/viewmediashape.hxx | 5 - 5 files changed, 91 insertions(+), 42 deletions(-)
New commits: commit 3efddb093e72c100bc609ec691effb4563af2c20 Author: Zolnai Tamás <tamas.zol...@collabora.com> Date: Thu May 15 12:54:57 2014 +0200 OGLWindow: First try to rotate camera For now its too slow to render by mousemove so use mousebuttonup instead. It seems gltf_renderer_rotate_camera() method does not rotate the camera but set the new position of it. Change-Id: I0fe7895720dbf95acb0963a5ba6dd2a5840d8f6b diff --git a/avmedia/source/opengl/oglwindow.cxx b/avmedia/source/opengl/oglwindow.cxx index f32070a..ca2ffbf 100644 --- a/avmedia/source/opengl/oglwindow.cxx +++ b/avmedia/source/opengl/oglwindow.cxx @@ -20,6 +20,7 @@ OGLWindow::OGLWindow( glTFHandle* pHandle, OpenGLContext* pContext, SystemChildW , m_pEventHandler( pChildWindow->GetParent() ) , m_bVisible ( false ) , meZoomLevel( media::ZoomLevel_ORIGINAL ) + , m_aLastMousePos(Point()) { } @@ -276,12 +277,34 @@ IMPL_LINK(OGLWindow, CameraHandler, VclWindowEvent*, pEvent) if(nCode == KEY_W)vMoveBy -= vMup*(0.1f*fModelSize); if(nCode == KEY_S)vMoveBy += vMup*(0.1f*fModelSize); } - gltf_renderer_move_camera(vMoveBy.x,vMoveBy.y,vMoveBy.z,10.0); update(); } } } + else if( pEvent->GetId() == VCLEVENT_WINDOW_MOUSEBUTTONDOWN ) + { + MouseEvent* pMouseEvt = (MouseEvent*)pEvent->GetData(); + if(pMouseEvt && pMouseEvt->IsLeft() && pMouseEvt->GetClicks() == 1) + { + m_aLastMousePos = pMouseEvt->GetPosPixel(); + } + } + else if( pEvent->GetId() == VCLEVENT_WINDOW_MOUSEBUTTONUP ) + { + MouseEvent* pMouseEvt = (MouseEvent*)pEvent->GetData(); + if(pMouseEvt && pMouseEvt->IsLeft()) + { + const Point& aCurPos = pMouseEvt->GetPosPixel(); + + long nDeltaX = m_aLastMousePos.X()-aCurPos.X(); + long nDeltaY = aCurPos.Y()-m_aLastMousePos.Y(); + static const float fSensitivity = 4.0; + // TODO: It seems this method just moves the camera but not rotate it. + gltf_renderer_rotate_camera((float)nDeltaX*fSensitivity,(float)nDeltaY*fSensitivity,0.0,10.0); + update(); + } + } return 0; } diff --git a/avmedia/source/opengl/oglwindow.hxx b/avmedia/source/opengl/oglwindow.hxx index e7b0d3a..ba510e4 100644 --- a/avmedia/source/opengl/oglwindow.hxx +++ b/avmedia/source/opengl/oglwindow.hxx @@ -70,6 +70,7 @@ private: Window* m_pEventHandler; bool m_bVisible; com::sun::star::media::ZoomLevel meZoomLevel; + Point m_aLastMousePos; }; } // namespace ogl commit 882e1bb2db4d84d8349657153cfe14363d5d9da4 Author: Zolnai Tamás <tamas.zol...@collabora.com> Date: Wed May 14 10:49:10 2014 +0200 OGLWindow: use update function for redrawing. Change-Id: Icca39a44d6a4437f20d120b4032a39f7e74ac066 diff --git a/avmedia/source/opengl/oglwindow.cxx b/avmedia/source/opengl/oglwindow.cxx index f798718..f32070a 100644 --- a/avmedia/source/opengl/oglwindow.cxx +++ b/avmedia/source/opengl/oglwindow.cxx @@ -250,8 +250,6 @@ IMPL_LINK(OGLWindow, CameraHandler, VclWindowEvent*, pEvent) nCode == KEY_A || nCode == KEY_D || nCode == KEY_W || nCode == KEY_S ) { - m_pContext->makeCurrent(); - // Calculate movement glm::vec3 vMoveBy; { @@ -280,10 +278,7 @@ IMPL_LINK(OGLWindow, CameraHandler, VclWindowEvent*, pEvent) } gltf_renderer_move_camera(vMoveBy.x,vMoveBy.y,vMoveBy.z,10.0); - gltf_prepare_renderer(m_pHandle); - gltf_renderer(m_pHandle); - gltf_complete_renderer(); - m_pContext->swapBuffers(); + update(); } } } commit 9ba99cbfcf793539f47f34fd637a48f97a249920 Author: Zolnai Tamás <tamas.zol...@collabora.com> Date: Thu May 15 12:51:13 2014 +0200 OGLWindow: move camera only when one of the key candidates is pressed Change-Id: I52b3d100512cad569a53d10c9dc819e4548ba928 diff --git a/avmedia/source/opengl/oglwindow.cxx b/avmedia/source/opengl/oglwindow.cxx index 8f9eefa..f798718 100644 --- a/avmedia/source/opengl/oglwindow.cxx +++ b/avmedia/source/opengl/oglwindow.cxx @@ -246,40 +246,45 @@ IMPL_LINK(OGLWindow, CameraHandler, VclWindowEvent*, pEvent) if(pKeyEvt) { const sal_uInt16 nCode = pKeyEvt->GetKeyCode().GetCode(); - m_pContext->makeCurrent(); - - // Calculate movement - glm::vec3 vMoveBy; + if (nCode == KEY_Q || nCode == KEY_E || + nCode == KEY_A || nCode == KEY_D || + nCode == KEY_W || nCode == KEY_S ) { - glm::vec3 vEye; - glm::vec3 vView; - glm::vec3 vUp; - gltf_get_camera_pos(&vEye,&vView,&vUp); - float fModelSize =(float)gltf_get_model_size(); - - glm::vec3 vMove = vView-vEye; - vMove = glm::normalize(vMove); - vMove *= 25.0f; - glm::vec3 vStrafe = glm::cross(vView-vEye, vUp); - vStrafe = glm::normalize(vStrafe); - vStrafe *= 25.0f; - glm::vec3 vMup = glm::cross(vView-vEye,glm::vec3(1.f,0.f,0.f) ); - vMup = glm::normalize(vMup); - vMup *= 25.0f; - - if(nCode == KEY_Q)vMoveBy += vMove*(0.1f*fModelSize); - if(nCode == KEY_E)vMoveBy -= vMove*(0.1f*fModelSize); - if(nCode == KEY_A)vMoveBy -= vStrafe*(0.1f*fModelSize); - if(nCode == KEY_D)vMoveBy += vStrafe*(0.1f*fModelSize); - if(nCode == KEY_W)vMoveBy -= vMup*(0.1f*fModelSize); - if(nCode == KEY_S)vMoveBy += vMup*(0.1f*fModelSize); - } + m_pContext->makeCurrent(); + + // Calculate movement + glm::vec3 vMoveBy; + { + glm::vec3 vEye; + glm::vec3 vView; + glm::vec3 vUp; + gltf_get_camera_pos(&vEye,&vView,&vUp); + float fModelSize =(float)gltf_get_model_size(); + + glm::vec3 vMove = vView-vEye; + vMove = glm::normalize(vMove); + vMove *= 25.0f; + glm::vec3 vStrafe = glm::cross(vView-vEye, vUp); + vStrafe = glm::normalize(vStrafe); + vStrafe *= 25.0f; + glm::vec3 vMup = glm::cross(vView-vEye,glm::vec3(1.f,0.f,0.f) ); + vMup = glm::normalize(vMup); + vMup *= 25.0f; + + if(nCode == KEY_Q)vMoveBy += vMove*(0.1f*fModelSize); + if(nCode == KEY_E)vMoveBy -= vMove*(0.1f*fModelSize); + if(nCode == KEY_A)vMoveBy -= vStrafe*(0.1f*fModelSize); + if(nCode == KEY_D)vMoveBy += vStrafe*(0.1f*fModelSize); + if(nCode == KEY_W)vMoveBy -= vMup*(0.1f*fModelSize); + if(nCode == KEY_S)vMoveBy += vMup*(0.1f*fModelSize); + } - gltf_renderer_move_camera(vMoveBy.x,vMoveBy.y,vMoveBy.z,10.0); - gltf_prepare_renderer(m_pHandle); - gltf_renderer(m_pHandle); - gltf_complete_renderer(); - m_pContext->swapBuffers(); + gltf_renderer_move_camera(vMoveBy.x,vMoveBy.y,vMoveBy.z,10.0); + gltf_prepare_renderer(m_pHandle); + gltf_renderer(m_pHandle); + gltf_complete_renderer(); + m_pContext->swapBuffers(); + } } } return 0; commit a48251956973525f338d297b07aad100e346ee9d Author: Zolnai Tamás <tamas.zol...@collabora.com> Date: Thu May 15 12:50:40 2014 +0200 OGLWindow: remove event listeners also when window is disposed To avoid segmentation fault. Plus some comments. Change-Id: I7368b34a29b595f52975f41836d4fe1f63e4e859 diff --git a/avmedia/source/opengl/oglwindow.cxx b/avmedia/source/opengl/oglwindow.cxx index 7bef3b4..8f9eefa 100644 --- a/avmedia/source/opengl/oglwindow.cxx +++ b/avmedia/source/opengl/oglwindow.cxx @@ -25,6 +25,7 @@ OGLWindow::OGLWindow( glTFHandle* pHandle, OpenGLContext* pContext, SystemChildW OGLWindow::~OGLWindow() { + dispose(); } void SAL_CALL OGLWindow::update() throw (css::uno::RuntimeException, std::exception) @@ -81,6 +82,8 @@ uno::Sequence< OUString > SAL_CALL OGLWindow::getSupportedServiceNames() throw ( void SAL_CALL OGLWindow::dispose() throw (uno::RuntimeException, std::exception) { + m_pEventHandler->GetParent()->RemoveEventListener( LINK(this, OGLWindow, FocusGrabber)); + m_pEventHandler->RemoveEventListener( LINK(this, OGLWindow, CameraHandler)); } void SAL_CALL OGLWindow::addEventListener( const uno::Reference< lang::XEventListener >& ) @@ -216,6 +219,7 @@ IMPL_LINK(OGLWindow, FocusGrabber, VclWindowEvent*, pEvent) { const Point& rMousePos = pMouseEvt->GetPosPixel(); const Rectangle aWinRect(m_pEventHandler->GetPosPixel(),m_pEventHandler->GetSizePixel()); + // Grab focus to the OpenGL window when mouse pointer is over it if( aWinRect.IsInside(rMousePos) ) { if ( !m_pEventHandler->HasFocus() ) @@ -223,6 +227,7 @@ IMPL_LINK(OGLWindow, FocusGrabber, VclWindowEvent*, pEvent) m_pEventHandler->GrabFocus(); } } + // Move focus to the document when mouse is not over the OpenGL window else if ( m_pEventHandler->HasFocus() ) { m_pEventHandler->GrabFocusToDocument(); @@ -240,7 +245,7 @@ IMPL_LINK(OGLWindow, CameraHandler, VclWindowEvent*, pEvent) KeyEvent* pKeyEvt = (KeyEvent*)pEvent->GetData(); if(pKeyEvt) { - sal_uInt16 nCode = pKeyEvt->GetKeyCode().GetCode(); + const sal_uInt16 nCode = pKeyEvt->GetKeyCode().GetCode(); m_pContext->makeCurrent(); // Calculate movement commit 21a2ce0d09a34ca63aebb3821ce120a8e00e0d68 Author: Zolnai Tamás <tamas.zol...@collabora.com> Date: Thu May 15 12:49:57 2014 +0200 slideshow\glTF: add a parent window to the OpenGL window OpenGL window is a SystemChildWindow which doesn't handle window events as a vcl Window does (call it's event handler functions and the given event listeners), so I added a new parent which will handle window events and capture them from the slideshow's main window. Change-Id: I06ac87fb85e663e52f2691c1311605b3fd7d3afa diff --git a/slideshow/source/engine/shapes/viewmediashape.cxx b/slideshow/source/engine/shapes/viewmediashape.cxx index d854151..ab97235 100644 --- a/slideshow/source/engine/shapes/viewmediashape.cxx +++ b/slideshow/source/engine/shapes/viewmediashape.cxx @@ -75,7 +75,8 @@ namespace slideshow const uno::Reference< drawing::XShape >& rxShape, const uno::Reference< uno::XComponentContext >& rxContext ) : mpViewLayer( rViewLayer ), - mpMediaWindow(), + mpMediaWindow(0), + mpEventHandlerParent(0), maWindowOffset( 0, 0 ), maBounds(), mxShape( rxShape ), @@ -149,6 +150,7 @@ namespace slideshow } mpMediaWindow.reset(); + mpEventHandlerParent.reset(); // shutdown player if( mxPlayer.is() ) @@ -277,7 +279,15 @@ namespace slideshow if( mpMediaWindow.get() ) { - mpMediaWindow->SetPosSizePixel( aPosPixel, aSizePixel ); + if( mpEventHandlerParent ) + { + mpEventHandlerParent->SetPosSizePixel( aPosPixel, aSizePixel ); + mpMediaWindow->SetPosSizePixel( Point(0,0), aSizePixel ); + } + else + { + mpMediaWindow->SetPosSizePixel( aPosPixel, aSizePixel ); + } mxPlayerWindow->setPosSize( 0, 0, aSizePixel.Width(), aSizePixel.Height(), 0 ); @@ -463,16 +473,22 @@ namespace slideshow rRangePix.getMaxY() - rRangePix.getMinY() ); if( avmedia::IsModel(rMimeType) ) { - SystemWindowData aWinData = OpenGLContext::generateWinData(pWindow); - mpMediaWindow.reset(new SystemChildWindow(pWindow, 0, &aWinData)); + mpEventHandlerParent.reset(new Window(pWindow, WB_NOBORDER|WB_NODIALOGCONTROL)); + mpEventHandlerParent->SetPosSizePixel( Point( aAWTRect.X, aAWTRect.Y ), + Size( aAWTRect.Width, aAWTRect.Height ) ); + mpEventHandlerParent->Show(); + SystemWindowData aWinData = OpenGLContext::generateWinData(mpEventHandlerParent.get()); + mpMediaWindow.reset(new SystemChildWindow(mpEventHandlerParent.get(), 0, &aWinData)); + mpMediaWindow->SetPosSizePixel( Point( 0, 0 ), + Size( aAWTRect.Width, aAWTRect.Height ) ); } else { mpMediaWindow.reset( new SystemChildWindow( pWindow, WB_CLIPCHILDREN ) ); + mpMediaWindow->SetPosSizePixel( Point( aAWTRect.X, aAWTRect.Y ), + Size( aAWTRect.Width, aAWTRect.Height ) ); } mpMediaWindow->SetBackground( Color( COL_BLACK ) ); - mpMediaWindow->SetPosSizePixel( Point( aAWTRect.X, aAWTRect.Y ), - Size( aAWTRect.Width, aAWTRect.Height ) ); mpMediaWindow->SetParentClipMode( PARENTCLIPMODE_NOCLIP ); mpMediaWindow->EnableEraseBackground( false ); mpMediaWindow->EnablePaint( false ); @@ -504,6 +520,7 @@ namespace slideshow //if there was no playerwindow, then clear the mpMediaWindow too //so that we can draw a placeholder instead in that space mpMediaWindow.reset(); + mpEventHandlerParent.reset(); } } } diff --git a/slideshow/source/engine/shapes/viewmediashape.hxx b/slideshow/source/engine/shapes/viewmediashape.hxx index 609c36e..dc726f6 100644 --- a/slideshow/source/engine/shapes/viewmediashape.hxx +++ b/slideshow/source/engine/shapes/viewmediashape.hxx @@ -25,10 +25,12 @@ #include <boost/shared_ptr.hpp> #include <boost/utility.hpp> +#include <boost/scoped_ptr.hpp> #include "viewlayer.hxx" class SystemChildWindow; +class Window; namespace com { namespace sun { namespace star { namespace drawing { class XShape; @@ -145,7 +147,8 @@ namespace slideshow const ::com::sun::star::uno::Sequence< ::com::sun::star::uno::Any >& rVCLDeviceParams, const OUString& rMimeType ); ViewLayerSharedPtr mpViewLayer; - ::std::auto_ptr< SystemChildWindow > mpMediaWindow; + ::std::auto_ptr< SystemChildWindow > mpMediaWindow; + boost::scoped_ptr< Window > mpEventHandlerParent; mutable ::com::sun::star::awt::Point maWindowOffset; mutable ::basegfx::B2DRectangle maBounds; commit 8099056f50f4587cb03b76cf6bac7e876f6ff967 Author: Zolnai Tamás <tamas.zol...@collabora.com> Date: Tue May 13 14:05:13 2014 +0200 avmediaogl: call gltf_renderer_set_content() only once Change-Id: Ic4c4b886f5a60508e4f62eb3396850d09ae5d0a0 diff --git a/avmedia/source/opengl/oglplayer.cxx b/avmedia/source/opengl/oglplayer.cxx index 43b8a71..217fd88 100644 --- a/avmedia/source/opengl/oglplayer.cxx +++ b/avmedia/source/opengl/oglplayer.cxx @@ -211,6 +211,7 @@ uno::Reference< media::XPlayerWindow > SAL_CALL OGLPlayer::createPlayerWindow( c m_pHandle->viewport.y = 0; m_pHandle->viewport.width = aSize.Width(); m_pHandle->viewport.height = aSize.Height(); + gltf_renderer_set_content(m_pHandle); OGLWindow* pWindow = new OGLWindow(m_pHandle, &m_aContext, pChildWindow); return uno::Reference< media::XPlayerWindow >( pWindow ); } diff --git a/avmedia/source/opengl/oglwindow.cxx b/avmedia/source/opengl/oglwindow.cxx index 35b1ab4..7bef3b4 100644 --- a/avmedia/source/opengl/oglwindow.cxx +++ b/avmedia/source/opengl/oglwindow.cxx @@ -30,7 +30,6 @@ OGLWindow::~OGLWindow() void SAL_CALL OGLWindow::update() throw (css::uno::RuntimeException, std::exception) { m_pContext->makeCurrent(); - gltf_renderer_set_content(m_pHandle); gltf_prepare_renderer(m_pHandle); gltf_renderer(m_pHandle); gltf_complete_renderer(); commit 31095d231ad976a8ea36733c97a7b86288dc363f Author: Zolnai Tamás <tamas.zol...@collabora.com> Date: Tue May 13 13:02:47 2014 +0200 slideshow: update log messages Change-Id: Ifcf9941707a8770931296750b674fbccc1571f6d diff --git a/slideshow/source/engine/shapes/viewmediashape.cxx b/slideshow/source/engine/shapes/viewmediashape.cxx index 77b6443..d854151 100644 --- a/slideshow/source/engine/shapes/viewmediashape.cxx +++ b/slideshow/source/engine/shapes/viewmediashape.cxx @@ -299,7 +299,7 @@ namespace slideshow if( !mxPlayer.is() && mxShape.is() ) { ENSURE_OR_RETURN_FALSE( mpViewLayer->getCanvas(), - "ViewMediaShape::update(): Invalid layer canvas" ); + "ViewMediaShape::implInitialize(): Invalid layer canvas" ); uno::Reference< rendering::XCanvas > xCanvas( mpViewLayer->getCanvas()->getUNOCanvas() ); @@ -434,7 +434,7 @@ namespace slideshow const uno::Sequence< uno::Any >& rVCLDeviceParams, const OUString& rMimeType ) { - OSL_TRACE( "ViewMediaShape::implInitializeVCLBasedPlayerWindow" ); + OSL_TRACE( "ViewMediaShape::implInitializePlayerWindow" ); if( !mpMediaWindow.get() && !rBounds.isEmpty() ) { try
_______________________________________________ Libreoffice-commits mailing list libreoffice-comm...@lists.freedesktop.org http://lists.freedesktop.org/mailman/listinfo/libreoffice-commits