summaryrefslogtreecommitdiff
path: root/avmedia/source/opengl
diff options
context:
space:
mode:
authorZolnai Tamás <tamas.zolnai@collabora.com>2014-05-13 00:07:48 +0200
committerZolnai Tamás <tamas.zolnai@collabora.com>2014-05-13 00:09:11 +0200
commitbf703a7ef97008a19b7cd725acd98e3b86889283 (patch)
tree8ee8cf63d7196f70143abcab665293bfa6380316 /avmedia/source/opengl
parent01d3044d30283aec1b7a6908428691a6befe6783 (diff)
glTF rendering: first try to move camera position
SystemChildWindow can't handle events by its own that's why it's parent is used as an event handler. Mouse pointer specify the active model. This patch made for editing, in case of slideshow we have one less window. Change-Id: If8ac57176b9a0abab518f8d8a06a2a41177a4881
Diffstat (limited to 'avmedia/source/opengl')
-rw-r--r--avmedia/source/opengl/oglplayer.cxx2
-rw-r--r--avmedia/source/opengl/oglwindow.cxx87
-rw-r--r--avmedia/source/opengl/oglwindow.hxx7
3 files changed, 93 insertions, 3 deletions
diff --git a/avmedia/source/opengl/oglplayer.cxx b/avmedia/source/opengl/oglplayer.cxx
index f74162bbc5e3..43b8a71ef4ba 100644
--- a/avmedia/source/opengl/oglplayer.cxx
+++ b/avmedia/source/opengl/oglplayer.cxx
@@ -211,7 +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();
- OGLWindow* pWindow = new OGLWindow(m_pHandle, &m_aContext);
+ 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 31688741e639..35b1ab4d4a4f 100644
--- a/avmedia/source/opengl/oglwindow.cxx
+++ b/avmedia/source/opengl/oglwindow.cxx
@@ -14,9 +14,10 @@ using namespace com::sun::star;
namespace avmedia { namespace ogl {
-OGLWindow::OGLWindow( glTFHandle* pHandle, OpenGLContext* pContext )
+OGLWindow::OGLWindow( glTFHandle* pHandle, OpenGLContext* pContext, SystemChildWindow* pChildWindow )
: m_pHandle( pHandle )
, m_pContext( pContext )
+ , m_pEventHandler( pChildWindow->GetParent() )
, m_bVisible ( false )
, meZoomLevel( media::ZoomLevel_ORIGINAL )
{
@@ -122,7 +123,17 @@ void SAL_CALL OGLWindow::setVisible( sal_Bool bSet )
throw (uno::RuntimeException, std::exception)
{
if( bSet && !m_bVisible )
+ {
update();
+ m_pEventHandler->GetParent()->AddEventListener( LINK(this, OGLWindow, FocusGrabber));
+ m_pEventHandler->AddEventListener( LINK(this, OGLWindow, CameraHandler));
+ m_pEventHandler->GrabFocus();
+ }
+ else if( !bSet )
+ {
+ m_pEventHandler->GetParent()->RemoveEventListener( LINK(this, OGLWindow, FocusGrabber));
+ m_pEventHandler->RemoveEventListener( LINK(this, OGLWindow, CameraHandler));
+ }
m_bVisible = bSet;
}
@@ -196,6 +207,80 @@ void SAL_CALL OGLWindow::removePaintListener( const uno::Reference< awt::XPaintL
{
}
+IMPL_LINK(OGLWindow, FocusGrabber, VclWindowEvent*, pEvent)
+{
+ assert(m_pEventHandler);
+ if( pEvent->GetId() == VCLEVENT_WINDOW_MOUSEMOVE )
+ {
+ MouseEvent* pMouseEvt = (MouseEvent*)pEvent->GetData();
+ if(pMouseEvt)
+ {
+ const Point& rMousePos = pMouseEvt->GetPosPixel();
+ const Rectangle aWinRect(m_pEventHandler->GetPosPixel(),m_pEventHandler->GetSizePixel());
+ if( aWinRect.IsInside(rMousePos) )
+ {
+ if ( !m_pEventHandler->HasFocus() )
+ {
+ m_pEventHandler->GrabFocus();
+ }
+ }
+ else if ( m_pEventHandler->HasFocus() )
+ {
+ m_pEventHandler->GrabFocusToDocument();
+ }
+ }
+ }
+
+ return 0;
+}
+
+IMPL_LINK(OGLWindow, CameraHandler, VclWindowEvent*, pEvent)
+{
+ if( pEvent->GetId() == VCLEVENT_WINDOW_KEYINPUT )
+ {
+ KeyEvent* pKeyEvt = (KeyEvent*)pEvent->GetData();
+ if(pKeyEvt)
+ {
+ sal_uInt16 nCode = pKeyEvt->GetKeyCode().GetCode();
+ 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();
+ }
+ }
+ return 0;
+}
+
} // namespace ogl
} // namespace avmedia
diff --git a/avmedia/source/opengl/oglwindow.hxx b/avmedia/source/opengl/oglwindow.hxx
index 95767c04d52c..e7b0d3ab57d3 100644
--- a/avmedia/source/opengl/oglwindow.hxx
+++ b/avmedia/source/opengl/oglwindow.hxx
@@ -19,6 +19,7 @@
#include <libgltf.h>
#include <vcl/opengl/OpenGLContext.hxx>
+#include <vcl/syschild.hxx>
namespace avmedia { namespace ogl {
@@ -26,7 +27,7 @@ class OGLWindow : public ::cppu::WeakImplHelper2 < com::sun::star::media::XPlaye
com::sun::star::lang::XServiceInfo >
{
public:
- OGLWindow( glTFHandle* pHandle, OpenGLContext* pContext );
+ OGLWindow( glTFHandle* pHandle, OpenGLContext* pContext, SystemChildWindow* pChildWindow );
virtual ~OGLWindow();
virtual void SAL_CALL update() throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
@@ -61,8 +62,12 @@ public:
virtual void SAL_CALL removePaintListener( const com::sun::star::uno::Reference< com::sun::star::awt::XPaintListener >& xListener ) throw (com::sun::star::uno::RuntimeException, std::exception) SAL_OVERRIDE;
private:
+ DECL_LINK( FocusGrabber, VclWindowEvent* );
+ DECL_LINK( CameraHandler, VclWindowEvent* );
+
glTFHandle* m_pHandle;
OpenGLContext* m_pContext;
+ Window* m_pEventHandler;
bool m_bVisible;
com::sun::star::media::ZoomLevel meZoomLevel;
};