From c1baaddd8feac01fb2da48c140d4a96c201d7213 Mon Sep 17 00:00:00 2001 From: Zolnai Tamás Date: Sun, 20 Apr 2014 10:27:13 +0200 Subject: avmediaogl: load all needed files into buffers for gltf rendering Change-Id: I00fe209f3b0061dd67240eb1a490fb62530ffb55 --- RepositoryExternal.mk | 2 ++ avmedia/Library_avmediaogl.mk | 36 ++++++++++++++++++++- avmedia/source/opengl/oglplayer.cxx | 62 +++++++++++++++++++++++++++++++++++++ avmedia/source/opengl/oglplayer.hxx | 2 ++ 4 files changed, 101 insertions(+), 1 deletion(-) diff --git a/RepositoryExternal.mk b/RepositoryExternal.mk index f11407e54486..e0a7fef34596 100644 --- a/RepositoryExternal.mk +++ b/RepositoryExternal.mk @@ -3090,9 +3090,11 @@ endif # DESKTOP ifeq ($(ENABLE_GLTF),TRUE) +# !! We need to avoid setting src as include (changes needed in libgltf) define gb_LinkTarget__use_libgltf $(call gb_LinkTarget_set_include,$(1),\ -I$(call gb_UnpackedTarball_get_dir,libgltf)/inc \ + -I$(call gb_UnpackedTarball_get_dir,libgltf)/src \ $$(INCLUDE) \ ) diff --git a/avmedia/Library_avmediaogl.mk b/avmedia/Library_avmediaogl.mk index 34677b571c6c..ca1497de2306 100644 --- a/avmedia/Library_avmediaogl.mk +++ b/avmedia/Library_avmediaogl.mk @@ -13,7 +13,17 @@ $(eval $(call gb_Library_set_componentfile,avmediaogl,avmedia/source/opengl/avme $(eval $(call gb_Library_use_sdk_api,avmediaogl)) -$(eval $(call gb_Library_use_external,avmediaogl,boost_headers)) +# Avoid warnings until libgltf's interface is minimized +$(eval $(call gb_Library_add_cxxflags,avmediaogl,-w)) + +$(eval $(call gb_Library_use_externals,avmediaogl, \ + boost_headers \ + libgltf \ + mesa_headers \ + glew \ + zlib \ + freetype \ +)) $(eval $(call gb_Library_use_libraries,avmediaogl,\ comphelper \ @@ -23,9 +33,14 @@ $(eval $(call gb_Library_use_libraries,avmediaogl,\ salhelper \ tl \ vcl \ + vclopengl \ $(gb_UWINAPI) \ )) +$(eval $(call gb_Library_set_include,avmediaogl,\ + $$(INCLUDE) \ +)) + $(eval $(call gb_Library_add_exception_objects,avmediaogl,\ avmedia/source/opengl/oglframegrabber \ avmedia/source/opengl/oglmanager \ @@ -34,4 +49,23 @@ $(eval $(call gb_Library_add_exception_objects,avmediaogl,\ avmedia/source/opengl/oglwindow \ )) +ifeq ($(strip $(OS)),WNT) +$(eval $(call gb_Library_use_system_win32_libs,avmediaogl,\ + opengl32 \ + gdi32 \ + glu32 \ +)) +else ifeq ($(OS),MACOSX) +$(eval $(call gb_Library_use_system_darwin_frameworks,avmediaogl,\ + OpenGL \ +)) +else ifeq ($(OS),LINUX) +$(eval $(call gb_Library_add_libs,avmediaogl,\ + -ldl \ + -lGL \ + -lGLU \ + -lX11 \ +)) +endif + # vim: set noet sw=4 ts=4: diff --git a/avmedia/source/opengl/oglplayer.cxx b/avmedia/source/opengl/oglplayer.cxx index a59573521a93..d0ffde395229 100644 --- a/avmedia/source/opengl/oglplayer.cxx +++ b/avmedia/source/opengl/oglplayer.cxx @@ -12,6 +12,11 @@ #include "oglwindow.hxx" #include +#include +#include +#include +#include +#include using namespace com::sun::star; @@ -26,9 +31,66 @@ OGLPlayer::~OGLPlayer() { } +static bool lcl_LoadFile( glTFFile* io_pFile, const OUString& rURL) +{ + SvFileStream aStream( rURL, STREAM_READ ); + if( !aStream.IsOpen() ) + return false; + + const sal_Int64 nBytes = aStream.remainingSize(); + char* pBuffer = new char[nBytes]; + aStream.Read( pBuffer, nBytes ); + aStream.Close(); + + io_pFile->buffer = pBuffer; + io_pFile->size = nBytes; + + return true; +} + bool OGLPlayer::create( const OUString& rURL ) { m_sURL = rURL; + + // Load *.json file and init renderer + glTFFile aJsonFile; + aJsonFile.type = GLTF_JSON; + OString sFileName = OUStringToOString(m_sURL.copy(m_sURL.lastIndexOf("/")+1),RTL_TEXTENCODING_UTF8); + aJsonFile.filename = (char*)sFileName.getStr(); + if( !lcl_LoadFile(&aJsonFile, m_sURL) ) + return false; + + m_pHandle = gltf_renderer_init(&aJsonFile); + + if( !m_pHandle || !m_pHandle->files ) + return false; + + // Load external resources + for( size_t i = 0; i < m_pHandle->size; ++i ) + { + glTFFile* pFile = m_pHandle->files[i]; + if( pFile && pFile->filename ) + { + const OUString sFilesURL = m_sURL.copy(0,m_sURL.lastIndexOf("/")+1) + + OStringToOUString(OString(pFile->filename),RTL_TEXTENCODING_UTF8); + if( pFile->type == GLTF_IMAGE ) + { + // Load images as bitmaps + GraphicFilter aFilter; + Graphic aGraphic; + aFilter.ImportGraphic(aGraphic, INetURLObject(sFilesURL)); + const BitmapEx aBitmapEx = aGraphic.GetBitmapEx(); + pFile->buffer = (char*)OpenGLHelper::ConvertBitmapExToRGBABuffer(aBitmapEx); + pFile->imagewidth = aBitmapEx.GetSizePixel().Width(); + pFile->imageheight = aBitmapEx.GetSizePixel().Height(); + } + else if( pFile->type == GLTF_BINARY || pFile->type == GLTF_GLSL ) + { + if( !lcl_LoadFile(pFile, sFilesURL) ) + return false; + } + } + } return true; } diff --git a/avmedia/source/opengl/oglplayer.hxx b/avmedia/source/opengl/oglplayer.hxx index 50a9190b930b..cf8ac2cdb222 100644 --- a/avmedia/source/opengl/oglplayer.hxx +++ b/avmedia/source/opengl/oglplayer.hxx @@ -14,6 +14,7 @@ #include #include #include +#include namespace avmedia { namespace ogl { @@ -54,6 +55,7 @@ public: private: OUString m_sURL; + glTFHandle* m_pHandle; }; } // namespace ogl -- cgit