void UITexture::LoadTextureFromApplicationPackage( const char *assetPath ) { #if defined( OVR_OS_ANDROID ) Free(); Texture = OVR::LoadTextureFromApplicationPackage( assetPath, TextureFlags_t( TEXTUREFLAG_NO_DEFAULT ), Width, Height ); FreeTextureOfDestruct = true; #else MemBufferFile mbf(MemBufferFile::NoInit); if (mbf.LoadFile(assetPath)) { LoadTextureFromBuffer(assetPath, mbf); mbf.FreeData(); } #endif }
void * Queue1Thread( void * v ) { int result = pthread_setname_np( pthread_self(), "FileQueue1" ); if ( result != 0 ) { LOG( "InitFileQueue: pthread_setname_np failed %s", strerror( result ) ); } // Process incoming messages until queue is empty for ( ; ; ) { Queue1.SleepUntilMessage(); // If Queue3 hasn't finished our last output, sleep until it has. pthread_mutex_lock( &QueueMutex ); while ( !QueueHasCleared ) { // Atomically unlock the mutex and block until we get a message. pthread_cond_wait( &QueueWake, &QueueMutex ); } pthread_mutex_unlock( &QueueMutex ); const char * msg = Queue1.GetNextMessage(); char commandName[1024] = {}; sscanf( msg, "%s", commandName ); const char * filename = msg + strlen( commandName ) + 1; MessageQueue * queue = &Queue3; char const * suffix = strstr( filename, "_nz.jpg" ); if ( suffix != NULL ) { // cube map const char * const cubeSuffix[6] = { "_px.jpg", "_nx.jpg", "_py.jpg", "_ny.jpg", "_pz.jpg", "_nz.jpg" }; MemBufferFile mbfs[6] = { MemBufferFile( MemBufferFile::NoInit ), MemBufferFile( MemBufferFile::NoInit ), MemBufferFile( MemBufferFile::NoInit ), MemBufferFile( MemBufferFile::NoInit ), MemBufferFile( MemBufferFile::NoInit ), MemBufferFile( MemBufferFile::NoInit ) }; char filenameWithoutSuffix[1024]; int suffixStart = suffix - filename; strcpy( filenameWithoutSuffix, filename ); filenameWithoutSuffix[suffixStart] = '\0'; int side = 0; for ( ; side < 6; side++ ) { char sideFilename[1024]; strcpy( sideFilename, filenameWithoutSuffix ); strcat( sideFilename, cubeSuffix[side] ); if ( !mbfs[side].LoadFile( sideFilename ) ) { if ( !mbfs[ side ].LoadFileFromPackage( sideFilename ) ) { break; } } LOG( "Queue1 loaded '%s'", sideFilename ); } if ( side >= 6 ) { // if no error occured, post to next thread LOG( "%s.PostPrintf( \"%s %p %i %p %i %p %i %p %i %p %i %p %i\" )", "Queue3", commandName, mbfs[0].Buffer, mbfs[0].Length, mbfs[1].Buffer, mbfs[1].Length, mbfs[2].Buffer, mbfs[2].Length, mbfs[3].Buffer, mbfs[3].Length, mbfs[4].Buffer, mbfs[4].Length, mbfs[5].Buffer, mbfs[5].Length ); queue->PostPrintf( "%s %p %i %p %i %p %i %p %i %p %i %p %i", commandName, mbfs[0].Buffer, mbfs[0].Length, mbfs[1].Buffer, mbfs[1].Length, mbfs[2].Buffer, mbfs[2].Length, mbfs[3].Buffer, mbfs[3].Length, mbfs[4].Buffer, mbfs[4].Length, mbfs[5].Buffer, mbfs[5].Length ); for ( int i = 0; i < 6; ++i ) { // make sure we do not free the actual buffers because they're used in the next thread mbfs[i].Buffer = NULL; mbfs[i].Length = 0; } } else { // otherwise free the buffers we did manage to allocate for ( int i = 0; i < side; ++i ) { mbfs[i].FreeData(); } } } else { // non-cube map MemBufferFile mbf( filename ); if ( mbf.Length <= 0 || mbf.Buffer == NULL ) { if ( !mbf.LoadFileFromPackage( filename ) ) { continue; } } LOG( "%s.PostPrintf( \"%s %p %i\" )", "Queue3", commandName, mbf.Buffer, mbf.Length ); queue->PostPrintf( "%s %p %i", commandName, mbf.Buffer, mbf.Length ); mbf.Buffer = NULL; mbf.Length = 0; } free( (void *)msg ); } return NULL; }