MCPcopy Create free account
hub / github.com/ValveSoftware/openvr / FindOrLoadRenderModel

Method FindOrLoadRenderModel

samples/hellovr_vulkan/hellovr_vulkan_main.cpp:3254–3358  ·  view source on GitHub ↗

----------------------------------------------------------------------------- Purpose: Finds a render model we've already loaded or loads a new one -----------------------------------------------------------------------------

Source from the content-addressed store, hash-verified

3252// Purpose: Finds a render model we've already loaded or loads a new one
3253//-----------------------------------------------------------------------------
3254VulkanRenderModel *CMainApplication::FindOrLoadRenderModel( vr::TrackedDeviceIndex_t unTrackedDeviceIndex, const char *pchRenderModelName )
3255{
3256 VulkanRenderModel *pRenderModel = NULL;
3257 // To simplify the Vulkan rendering code, create an instance of the model for each model name. This is less efficient
3258 // memory wise, but simplifies the rendering code so we can store the transform in a constant buffer associated with
3259 // the model itself. You would not want to do this in a production application.
3260 //for( std::vector< VulkanRenderModel * >::iterator i = m_vecRenderModels.begin(); i != m_vecRenderModels.end(); i++ )
3261 //{
3262 //if( !stricmp( (*i)->GetName().c_str(), pchRenderModelName ) )
3263 //{
3264 //pRenderModel = *i;
3265 //break;
3266 //}
3267 //}
3268
3269 // load the model if we didn't find one
3270 if( !pRenderModel )
3271 {
3272 vr::RenderModel_t *pModel;
3273 vr::EVRRenderModelError error;
3274 while ( 1 )
3275 {
3276 error = vr::VRRenderModels()->LoadRenderModel_Async( pchRenderModelName, &pModel );
3277 if ( error != vr::VRRenderModelError_Loading )
3278 break;
3279
3280 ThreadSleep( 1 );
3281 }
3282
3283 if ( error != vr::VRRenderModelError_None )
3284 {
3285 dprintf( "Unable to load render model %s - %s\n", pchRenderModelName, vr::VRRenderModels()->GetRenderModelErrorNameFromEnum( error ) );
3286 return NULL; // move on to the next tracked device
3287 }
3288
3289 vr::RenderModel_TextureMap_t *pTexture;
3290 while ( 1 )
3291 {
3292 error = vr::VRRenderModels()->LoadTexture_Async( pModel->diffuseTextureId, &pTexture );
3293 if ( error != vr::VRRenderModelError_Loading )
3294 break;
3295
3296 ThreadSleep( 1 );
3297 }
3298
3299 if ( error != vr::VRRenderModelError_None )
3300 {
3301 dprintf( "Unable to load render texture id:%d for render model %s\n", pModel->diffuseTextureId, pchRenderModelName );
3302 vr::VRRenderModels()->FreeRenderModel( pModel );
3303 return NULL; // move on to the next tracked device
3304 }
3305
3306 pRenderModel = new VulkanRenderModel( pchRenderModelName );
3307 VkDescriptorSet pDescriptorSets[ 2 ] =
3308 {
3309 m_pDescriptorSets[ DESCRIPTOR_SET_LEFT_EYE_RENDER_MODEL0 + unTrackedDeviceIndex ],
3310 m_pDescriptorSets[ DESCRIPTOR_SET_RIGHT_EYE_RENDER_MODEL0 + unTrackedDeviceIndex ],
3311 };

Callers

nothing calls this directly

Calls 8

ThreadSleepFunction · 0.70
dprintfFunction · 0.70
LoadRenderModel_AsyncMethod · 0.45
LoadTexture_AsyncMethod · 0.45
FreeRenderModelMethod · 0.45
BInitMethod · 0.45
FreeTextureMethod · 0.45

Tested by

no test coverage detected