From d431986bd49081581e86444af124d1d2ce90a407 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Zolnai=20Tam=C3=A1s?= Date: Fri, 29 Aug 2014 22:41:26 +0200 Subject: Upgrade libgltf to 0.0.1 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit News in this version: - Solve some limitations of walkthrough mode (fdo#81425) - Multisampling (better rendering quality, mainly at the edges) - Better error handling (no crash in case of invalid input file) Reviewed-on: https://gerrit.libreoffice.org/11179 Reviewed-by: Zolnai Tamás Tested-by: Zolnai Tamás Conflicts: download.lst external/libgltf/UnpackedTarball_libgltf.mk external/libgltf/pathces/append_shader_version.patch external/libgltf/pathces/missing_include.patch vcl/source/opengl/OpenGLContext.cxx Change-Id: I46fdf56b00476614487fbcc04178e43e33a01794 Reviewed-on: https://gerrit.libreoffice.org/11194 Reviewed-by: Christian Lohmaier Tested-by: Christian Lohmaier diff --git a/avmedia/source/opengl/oglframegrabber.hxx b/avmedia/source/opengl/oglframegrabber.hxx index 0d38224..5beb15b 100644 --- a/avmedia/source/opengl/oglframegrabber.hxx +++ b/avmedia/source/opengl/oglframegrabber.hxx @@ -14,11 +14,7 @@ #include #include -#ifdef SYSTEM_LIBGLTF -#include -#else #include -#endif namespace avmedia { namespace ogl { diff --git a/avmedia/source/opengl/oglplayer.cxx b/avmedia/source/opengl/oglplayer.cxx index a052dc9..d2e600b 100644 --- a/avmedia/source/opengl/oglplayer.cxx +++ b/avmedia/source/opengl/oglplayer.cxx @@ -269,6 +269,12 @@ uno::Reference< media::XPlayerWindow > SAL_CALL OGLPlayer::createPlayerWindow( c return uno::Reference< media::XPlayerWindow >(); } + if( !m_aContext.supportMultiSampling() ) + { + SAL_WARN("avmedia.opengl", "Context does not support multisampling!"); + return uno::Reference< media::XPlayerWindow >(); + } + if( !lcl_CheckOpenGLRequirements() ) { SAL_WARN("avmedia.opengl", "Your platform does not have the minimal OpenGL requiremenets!"); @@ -287,7 +293,7 @@ uno::Reference< media::XPlayerWindow > SAL_CALL OGLPlayer::createPlayerWindow( c releaseInputFiles(); if( nRet != 0 ) { - SAL_WARN("avmedia.opengl", "Error occured while parsing *.json file! Error code: " << nRet); + SAL_WARN("avmedia.opengl", "Error occured while setting up the scene! Error code: " << nRet); return uno::Reference< media::XPlayerWindow >(); } // The background color is white by default, but we need to separate the @@ -309,6 +315,12 @@ uno::Reference< media::XFrameGrabber > SAL_CALL OGLPlayer::createFrameGrabber() return uno::Reference< media::XFrameGrabber >(); } + if( !m_aContext.supportMultiSampling() ) + { + SAL_WARN("avmedia.opengl", "Context does not support multisampling!"); + return uno::Reference< media::XFrameGrabber >(); + } + if( !lcl_CheckOpenGLRequirements() ) { SAL_WARN("avmedia.opengl", "Your platform does not have the minimal OpenGL requiremenets!"); @@ -324,7 +336,7 @@ uno::Reference< media::XFrameGrabber > SAL_CALL OGLPlayer::createFrameGrabber() releaseInputFiles(); if( nRet != 0 ) { - SAL_WARN("avmedia.opengl", "Error occured while parsing *.json file! Error code: " << nRet); + SAL_WARN("avmedia.opengl", "Error occured while setting up the scene! Error code: " << nRet); return uno::Reference< media::XFrameGrabber >(); } glClearColor(0.5f, 0.5f, 0.5f, 0.5f); diff --git a/avmedia/source/opengl/oglplayer.hxx b/avmedia/source/opengl/oglplayer.hxx index 52aa395..465ed6b 100644 --- a/avmedia/source/opengl/oglplayer.hxx +++ b/avmedia/source/opengl/oglplayer.hxx @@ -14,11 +14,9 @@ #include #include #include -#ifdef SYSTEM_LIBGLTF -#include -#else + #include -#endif + #include #include diff --git a/avmedia/source/opengl/oglwindow.cxx b/avmedia/source/opengl/oglwindow.cxx index a770ff5..1092483 100644 --- a/avmedia/source/opengl/oglwindow.cxx +++ b/avmedia/source/opengl/oglwindow.cxx @@ -23,7 +23,6 @@ OGLWindow::OGLWindow( glTFHandle& rHandle, OpenGLContext& rContext, Window& rEve , meZoomLevel( media::ZoomLevel_ORIGINAL ) , m_aLastMousePos(Point(0,0)) , m_bIsOrbitMode( false ) - , m_fCameraDistance(0.0) { } @@ -267,15 +266,15 @@ IMPL_LINK(OGLWindow, CameraHandler, VclWindowEvent*, pEvent) glm::vec3 vMove = vView-vEye; vMove = glm::normalize(vMove); vMove *= 25.0f; - glm::vec3 vStrafe = glm::cross(vView-vEye, vUp); + glm::vec3 vStrafe = glm::cross(vMove, vUp); vStrafe = glm::normalize(vStrafe); vStrafe *= 25.0f; - glm::vec3 vMup = glm::cross(vView-vEye,glm::vec3(1.0f,0.0f,0.0f) ); - vMup = glm::normalize(vMup); - vMup *= 25.0f; + glm::vec3 vMup = vUp * 25.0f; if( !m_bIsOrbitMode ) { + if(nCode == KEY_E)vMoveBy += vMup*(0.0005f*fModelSize); + if(nCode == KEY_Q)vMoveBy -= vMup*(0.0005f*fModelSize); if(nCode == KEY_W)vMoveBy += vMove*(0.0005f*fModelSize); if(nCode == KEY_S)vMoveBy -= vMove*(0.0005f*fModelSize); if(nCode == KEY_A)vMoveBy -= vStrafe*(0.0005f*fModelSize); @@ -283,15 +282,24 @@ IMPL_LINK(OGLWindow, CameraHandler, VclWindowEvent*, pEvent) } else { - if(nCode == KEY_E)vMoveBy += vMove*(0.0005f*fModelSize); - if(nCode == KEY_Q)vMoveBy -= vMove*(0.0005f*fModelSize); + bool bZoomIn = false; + bool bZoomOut = false; + if(nCode == KEY_E) + { + vMoveBy += vMove*(0.0005f*fModelSize); + bZoomIn = true; + } + if(nCode == KEY_Q) + { + vMoveBy -= vMove*(0.0005f*fModelSize); + bZoomOut = true; + } // Limit zooming in orbit mode - m_fCameraDistance += vMoveBy.z; - if ((m_fCameraDistance < 0.5 * fModelSize && vMoveBy.z < 0.0 ) || - (m_fCameraDistance > 2 * fModelSize && vMoveBy.z > 0.0 )) + float fCameraDistFromModelGlobe = glm::length(vEye + vMoveBy - vView) - fModelSize / 2.0f; + if ((fCameraDistFromModelGlobe < 0.5 * fModelSize && bZoomIn ) || + (fCameraDistFromModelGlobe > 2 * fModelSize && bZoomOut )) { - m_fCameraDistance -= vMoveBy.z; vMoveBy = glm::vec3(0.0); } } @@ -333,12 +341,6 @@ IMPL_LINK(OGLWindow, CameraHandler, VclWindowEvent*, pEvent) { gltf_orbit_mode_start(&m_rHandle); m_bIsOrbitMode = true; - // Set default camera distance - glm::vec3 vEye; - glm::vec3 vView; - glm::vec3 vUp; - gltf_get_camera_pos(&m_rHandle, &vEye,&vView,&vUp); - m_fCameraDistance = vEye.z - gltf_get_model_center_pos(&m_rHandle)->z - (gltf_get_model_size(&m_rHandle)/2.0); } } else if(nCode == KEY_F) diff --git a/avmedia/source/opengl/oglwindow.hxx b/avmedia/source/opengl/oglwindow.hxx index ae86083..8b15813 100644 --- a/avmedia/source/opengl/oglwindow.hxx +++ b/avmedia/source/opengl/oglwindow.hxx @@ -17,11 +17,8 @@ #include #include -#ifdef SYSTEM_LIBGLTF -#include -#else #include -#endif + #include #include @@ -77,7 +74,6 @@ private: com::sun::star::media::ZoomLevel meZoomLevel; Point m_aLastMousePos; bool m_bIsOrbitMode; - double m_fCameraDistance; }; } // namespace ogl diff --git a/configure.ac b/configure.ac index b6e8124..9cd589b 100644 --- a/configure.ac +++ b/configure.ac @@ -10572,7 +10572,7 @@ if test "x$enable_gltf" != "xno" -a $_os != Darwin -a $_os != iOS -a $_os != And AC_DEFINE(HAVE_FEATURE_GLTF,1) if test "$with_system_libgltf" = "yes"; then SYSTEM_LIBGLTF=TRUE - PKG_CHECK_MODULES( LIBGLTF, libgltf-0.0 ) + PKG_CHECK_MODULES( LIBGLTF, [libgltf-0.0 >= 0.0.1] ) else BUILD_TYPE="$BUILD_TYPE LIBGLTF" fi diff --git a/include/vcl/opengl/OpenGLContext.hxx b/include/vcl/opengl/OpenGLContext.hxx index 8a7eb55..f1e0bd2 100644 --- a/include/vcl/opengl/OpenGLContext.hxx +++ b/include/vcl/opengl/OpenGLContext.hxx @@ -166,6 +166,8 @@ public: return mbInitialized; } + bool supportMultiSampling() const; + static SystemWindowData generateWinData(Window* pParent); private: SAL_DLLPRIVATE bool initWindow(); diff --git a/vcl/source/opengl/OpenGLContext.cxx b/vcl/source/opengl/OpenGLContext.cxx index 974f913..338edc3 100644 --- a/vcl/source/opengl/OpenGLContext.cxx +++ b/vcl/source/opengl/OpenGLContext.cxx @@ -833,4 +833,9 @@ void OpenGLContext::show() m_pWindow->Show(); } +bool OpenGLContext::supportMultiSampling() const +{ + return m_aGLWin.bMultiSampleSupported; +} + /* vim:set shiftwidth=4 softtabstop=4 expandtab: */ -- cgit v0.10.2