From ad86a3029e645bec6f9bb3d721ddf4db750a091a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?R=C3=A9mi=20Bernon?= Date: Tue, 21 Jan 2025 11:22:52 +0100 Subject: [PATCH] vrclient: Use templates for IVRRenderModels unix side thunks. --- vrclient_x64/unix_vrrendermodels_manual.cpp | 182 ++++++-------------- vrclient_x64/unixlib.h | 15 ++ 2 files changed, 65 insertions(+), 132 deletions(-) diff --git a/vrclient_x64/unix_vrrendermodels_manual.cpp b/vrclient_x64/unix_vrrendermodels_manual.cpp index 387f0a59..db7f3df7 100644 --- a/vrclient_x64/unix_vrrendermodels_manual.cpp +++ b/vrclient_x64/unix_vrrendermodels_manual.cpp @@ -4,159 +4,77 @@ #pragma makedep unix #endif -/* LoadRenderModel(_Async) / FreeRenderModel */ - -NTSTATUS IVRRenderModels_IVRRenderModels_002_LoadRenderModel( void *args ) +template< typename Iface, typename Params > +static NTSTATUS IVRRenderModels_LoadRenderModel( Iface *iface, Params *params, bool wow64 ) { - struct IVRRenderModels_IVRRenderModels_002_LoadRenderModel_params *params = (struct IVRRenderModels_IVRRenderModels_002_LoadRenderModel_params *)args; - struct u_IVRRenderModels_IVRRenderModels_002 *iface = (struct u_IVRRenderModels_IVRRenderModels_002 *)params->u_iface; - struct render_model *model = params->ppRenderModel ? CONTAINING_RECORD( *params->ppRenderModel, struct render_model, w_0912 ) : NULL; - params->_ret = iface->LoadRenderModel( params->pchRenderModelName, params->ppRenderModel ? &model->u_0912 : nullptr ); - if (params->_ret == 0 && model) model->w_0912 = *model->u_0912; + static std::remove_reference_t< decltype(**params->ppRenderModel) > tag; + struct render_model *model = params->ppRenderModel ? render_model::from_w( *params->ppRenderModel ) : NULL; + params->_ret = iface->LoadRenderModel( params->pchRenderModelName, params->ppRenderModel ? &model->u_model( tag ) : nullptr ); + if (params->_ret == 0 && model) model->w_model( tag ) = *model->u_model( tag ); return 0; } -NTSTATUS IVRRenderModels_IVRRenderModels_002_FreeRenderModel( void *args ) +template< typename Iface, typename Params > +static NTSTATUS IVRRenderModels_FreeRenderModel( Iface *iface, Params *params, bool wow64 ) { - struct IVRRenderModels_IVRRenderModels_002_FreeRenderModel_params *params = (struct IVRRenderModels_IVRRenderModels_002_FreeRenderModel_params *)args; - struct u_IVRRenderModels_IVRRenderModels_002 *iface = (struct u_IVRRenderModels_IVRRenderModels_002 *)params->u_iface; - struct render_model *model = CONTAINING_RECORD( params->pRenderModel, struct render_model, w_0912 ); - iface->FreeRenderModel( model->u_0912 ); + static std::remove_reference_t< decltype(*params->pRenderModel) > tag; + struct render_model *model = params->pRenderModel ? render_model::from_w( params->pRenderModel ) : NULL; + iface->FreeRenderModel( model->u_model( tag ) ); return 0; } -NTSTATUS IVRRenderModels_IVRRenderModels_004_LoadRenderModel_Async( void *args ) +template< typename Iface, typename Params > +static NTSTATUS IVRRenderModels_LoadRenderModel_Async( Iface *iface, Params *params, bool wow64 ) { - struct IVRRenderModels_IVRRenderModels_004_LoadRenderModel_Async_params *params = (struct IVRRenderModels_IVRRenderModels_004_LoadRenderModel_Async_params *)args; - struct u_IVRRenderModels_IVRRenderModels_004 *iface = (struct u_IVRRenderModels_IVRRenderModels_004 *)params->u_iface; - struct render_model *model = params->ppRenderModel ? CONTAINING_RECORD( *params->ppRenderModel, struct render_model, w_0912 ) : NULL; - params->_ret = iface->LoadRenderModel_Async( params->pchRenderModelName, params->ppRenderModel ? &model->u_0912 : nullptr ); - if (params->_ret == 0 && model) model->w_0912 = *model->u_0912; + static std::remove_reference_t< decltype(**params->ppRenderModel) > tag; + struct render_model *model = params->ppRenderModel ? render_model::from_w( *params->ppRenderModel ) : NULL; + params->_ret = iface->LoadRenderModel_Async( params->pchRenderModelName, params->ppRenderModel ? &model->u_model( tag ) : nullptr ); + if (params->_ret == 0 && model) model->w_model( tag ) = *model->u_model( tag ); return 0; } -NTSTATUS IVRRenderModels_IVRRenderModels_004_FreeRenderModel( void *args ) +template< typename Iface, typename Params > +static NTSTATUS IVRRenderModels_LoadTexture( Iface *iface, Params *params, bool wow64 ) { - struct IVRRenderModels_IVRRenderModels_004_FreeRenderModel_params *params = (struct IVRRenderModels_IVRRenderModels_004_FreeRenderModel_params *)args; - struct u_IVRRenderModels_IVRRenderModels_004 *iface = (struct u_IVRRenderModels_IVRRenderModels_004 *)params->u_iface; - struct render_model *model = CONTAINING_RECORD( params->pRenderModel, struct render_model, w_0912 ); - iface->FreeRenderModel( model->u_0912 ); + static std::remove_reference_t< decltype(**params->ppTexture) > tag; + struct render_model_texture_map *map = params->ppTexture ? render_model_texture_map::from_w( *params->ppTexture ) : NULL; + params->_ret = iface->LoadTexture( params->textureId, params->ppTexture ? &map->u_map( tag ) : nullptr ); + if (params->_ret == 0 && map) map->w_map( tag ) = *map->u_map( tag ); return 0; } -NTSTATUS IVRRenderModels_IVRRenderModels_005_LoadRenderModel_Async( void *args ) +template< typename Iface, typename Params > +static NTSTATUS IVRRenderModels_FreeTexture( Iface *iface, Params *params, bool wow64 ) { - struct IVRRenderModels_IVRRenderModels_005_LoadRenderModel_Async_params *params = (struct IVRRenderModels_IVRRenderModels_005_LoadRenderModel_Async_params *)args; - struct u_IVRRenderModels_IVRRenderModels_005 *iface = (struct u_IVRRenderModels_IVRRenderModels_005 *)params->u_iface; - struct render_model *model = params->ppRenderModel ? CONTAINING_RECORD( *params->ppRenderModel, struct render_model, w_0912 ) : NULL; - params->_ret = iface->LoadRenderModel_Async( params->pchRenderModelName, params->ppRenderModel ? &model->u_0912 : nullptr ); - if (params->_ret == 0 && model) model->w_0912 = *model->u_0912; + static std::remove_reference_t< decltype(*params->pTexture) > tag; + struct render_model_texture_map *map = params->pTexture ? render_model_texture_map::from_w( params->pTexture ) : NULL; + iface->FreeTexture( map->u_map( tag ) ); return 0; } -NTSTATUS IVRRenderModels_IVRRenderModels_005_FreeRenderModel( void *args ) +template< typename Iface, typename Params > +static NTSTATUS IVRRenderModels_LoadTexture_Async( Iface *iface, Params *params, bool wow64 ) { - struct IVRRenderModels_IVRRenderModels_005_FreeRenderModel_params *params = (struct IVRRenderModels_IVRRenderModels_005_FreeRenderModel_params *)args; - struct u_IVRRenderModels_IVRRenderModels_005 *iface = (struct u_IVRRenderModels_IVRRenderModels_005 *)params->u_iface; - struct render_model *model = CONTAINING_RECORD( params->pRenderModel, struct render_model, w_0912 ); - iface->FreeRenderModel( model->u_0912 ); + static std::remove_reference_t< decltype(**params->ppTexture) > tag; + struct render_model_texture_map *map = params->ppTexture ? render_model_texture_map::from_w( *params->ppTexture ) : NULL; + params->_ret = iface->LoadTexture_Async( params->textureId, params->ppTexture ? &map->u_map( tag ) : nullptr ); + if (params->_ret == 0 && map) map->w_map( tag ) = *map->u_map( tag ); return 0; } -NTSTATUS IVRRenderModels_IVRRenderModels_006_LoadRenderModel_Async( void *args ) -{ - struct IVRRenderModels_IVRRenderModels_006_LoadRenderModel_Async_params *params = (struct IVRRenderModels_IVRRenderModels_006_LoadRenderModel_Async_params *)args; - struct u_IVRRenderModels_IVRRenderModels_006 *iface = (struct u_IVRRenderModels_IVRRenderModels_006 *)params->u_iface; - struct render_model *model = params->ppRenderModel ? CONTAINING_RECORD( *params->ppRenderModel, struct render_model, w_0912 ) : NULL; - params->_ret = iface->LoadRenderModel_Async( params->pchRenderModelName, params->ppRenderModel ? &model->u_0912 : nullptr ); - if (params->_ret == 0 && model) model->w_0912 = *model->u_0912; - return 0; -} - -NTSTATUS IVRRenderModels_IVRRenderModels_006_FreeRenderModel( void *args ) -{ - struct IVRRenderModels_IVRRenderModels_006_FreeRenderModel_params *params = (struct IVRRenderModels_IVRRenderModels_006_FreeRenderModel_params *)args; - struct u_IVRRenderModels_IVRRenderModels_006 *iface = (struct u_IVRRenderModels_IVRRenderModels_006 *)params->u_iface; - struct render_model *model = CONTAINING_RECORD( params->pRenderModel, struct render_model, w_0912 ); - iface->FreeRenderModel( model->u_0912 ); - return 0; -} - - -/* LoadTexture(_Async) / FreeTexture */ - -NTSTATUS IVRRenderModels_IVRRenderModels_002_LoadTexture( void *args ) -{ - struct IVRRenderModels_IVRRenderModels_002_LoadTexture_params *params = (struct IVRRenderModels_IVRRenderModels_002_LoadTexture_params *)args; - struct u_IVRRenderModels_IVRRenderModels_002 *iface = (struct u_IVRRenderModels_IVRRenderModels_002 *)params->u_iface; - struct render_model_texture_map *map = params->ppTexture ? CONTAINING_RECORD( *params->ppTexture, struct render_model_texture_map, w_090 ) : NULL; - params->_ret = iface->LoadTexture( params->textureId, params->ppTexture ? &map->u_090 : nullptr ); - if (params->_ret == 0 && map) map->w_090 = *map->u_090; - return 0; -} - -NTSTATUS IVRRenderModels_IVRRenderModels_002_FreeTexture( void *args ) -{ - struct IVRRenderModels_IVRRenderModels_002_FreeTexture_params *params = (struct IVRRenderModels_IVRRenderModels_002_FreeTexture_params *)args; - struct u_IVRRenderModels_IVRRenderModels_002 *iface = (struct u_IVRRenderModels_IVRRenderModels_002 *)params->u_iface; - struct render_model_texture_map *map = CONTAINING_RECORD( params->pTexture, struct render_model_texture_map, w_090 ); - iface->FreeTexture( map->u_090 ); - return 0; -} - -NTSTATUS IVRRenderModels_IVRRenderModels_004_LoadTexture_Async( void *args ) -{ - struct IVRRenderModels_IVRRenderModels_004_LoadTexture_Async_params *params = (struct IVRRenderModels_IVRRenderModels_004_LoadTexture_Async_params *)args; - struct u_IVRRenderModels_IVRRenderModels_004 *iface = (struct u_IVRRenderModels_IVRRenderModels_004 *)params->u_iface; - struct render_model_texture_map *map = params->ppTexture ? CONTAINING_RECORD( *params->ppTexture, struct render_model_texture_map, w_090 ) : NULL; - params->_ret = iface->LoadTexture_Async( params->textureId, params->ppTexture ? &map->u_090 : nullptr ); - if (params->_ret == 0 && map) map->w_090 = *map->u_090; - return 0; -} - -NTSTATUS IVRRenderModels_IVRRenderModels_004_FreeTexture( void *args ) -{ - struct IVRRenderModels_IVRRenderModels_004_FreeTexture_params *params = (struct IVRRenderModels_IVRRenderModels_004_FreeTexture_params *)args; - struct u_IVRRenderModels_IVRRenderModels_004 *iface = (struct u_IVRRenderModels_IVRRenderModels_004 *)params->u_iface; - struct render_model_texture_map *map = CONTAINING_RECORD( params->pTexture, struct render_model_texture_map, w_090 ); - iface->FreeTexture( map->u_090 ); - return 0; -} - -NTSTATUS IVRRenderModels_IVRRenderModels_005_LoadTexture_Async( void *args ) -{ - struct IVRRenderModels_IVRRenderModels_005_LoadTexture_Async_params *params = (struct IVRRenderModels_IVRRenderModels_005_LoadTexture_Async_params *)args; - struct u_IVRRenderModels_IVRRenderModels_005 *iface = (struct u_IVRRenderModels_IVRRenderModels_005 *)params->u_iface; - struct render_model_texture_map *map = params->ppTexture ? CONTAINING_RECORD( *params->ppTexture, struct render_model_texture_map, w_090 ) : NULL; - params->_ret = iface->LoadTexture_Async( params->textureId, params->ppTexture ? &map->u_090 : nullptr ); - if (params->_ret == 0 && map) map->w_090 = *map->u_090; - return 0; -} - -NTSTATUS IVRRenderModels_IVRRenderModels_005_FreeTexture( void *args ) -{ - struct IVRRenderModels_IVRRenderModels_005_FreeTexture_params *params = (struct IVRRenderModels_IVRRenderModels_005_FreeTexture_params *)args; - struct u_IVRRenderModels_IVRRenderModels_005 *iface = (struct u_IVRRenderModels_IVRRenderModels_005 *)params->u_iface; - struct render_model_texture_map *map = CONTAINING_RECORD( params->pTexture, struct render_model_texture_map, w_090 ); - iface->FreeTexture( map->u_090 ); - return 0; -} - -NTSTATUS IVRRenderModels_IVRRenderModels_006_LoadTexture_Async( void *args ) -{ - struct IVRRenderModels_IVRRenderModels_006_LoadTexture_Async_params *params = (struct IVRRenderModels_IVRRenderModels_006_LoadTexture_Async_params *)args; - struct u_IVRRenderModels_IVRRenderModels_006 *iface = (struct u_IVRRenderModels_IVRRenderModels_006 *)params->u_iface; - struct render_model_texture_map *map = params->ppTexture ? CONTAINING_RECORD( *params->ppTexture, struct render_model_texture_map, w_1237 ) : NULL; - params->_ret = iface->LoadTexture_Async( params->textureId, params->ppTexture ? &map->u_1237 : nullptr ); - if (params->_ret == 0 && map) map->w_1237 = *map->u_1237; - return 0; -} - -NTSTATUS IVRRenderModels_IVRRenderModels_006_FreeTexture( void *args ) -{ - struct IVRRenderModels_IVRRenderModels_006_FreeTexture_params *params = (struct IVRRenderModels_IVRRenderModels_006_FreeTexture_params *)args; - struct u_IVRRenderModels_IVRRenderModels_006 *iface = (struct u_IVRRenderModels_IVRRenderModels_006 *)params->u_iface; - struct render_model_texture_map *map = CONTAINING_RECORD( params->pTexture, struct render_model_texture_map, w_1237 ); - iface->FreeTexture( map->u_1237 ); - return 0; -} +VRCLIENT_UNIX_IMPL( IVRRenderModels, 002, FreeRenderModel ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 002, FreeTexture ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 002, LoadRenderModel ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 002, LoadTexture ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 004, FreeRenderModel ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 004, FreeTexture ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 004, LoadRenderModel_Async ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 004, LoadTexture_Async ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 005, FreeRenderModel ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 005, FreeTexture ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 005, LoadRenderModel_Async ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 005, LoadTexture_Async ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 006, FreeRenderModel ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 006, FreeTexture ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 006, LoadRenderModel_Async ); +VRCLIENT_UNIX_IMPL( IVRRenderModels, 006, LoadTexture_Async ); diff --git a/vrclient_x64/unixlib.h b/vrclient_x64/unixlib.h index e0f732ba..e762a778 100644 --- a/vrclient_x64/unixlib.h +++ b/vrclient_x64/unixlib.h @@ -30,6 +30,12 @@ struct render_model { u_RenderModel_t_0912 *u_0912; }; + +#ifdef __cplusplus + static struct render_model *from_w( w_RenderModel_t_0912 const* w_map ) { return CONTAINING_RECORD( w_map, struct render_model, w_0912 ); } + u_RenderModel_t_0912*& u_model( w_RenderModel_t_0912 const& ) { return this->u_0912; } + w_RenderModel_t_0912& w_model( w_RenderModel_t_0912 const& ) { return this->w_0912; } +#endif /* __cplusplus */ }; struct render_model_texture_map @@ -44,6 +50,15 @@ struct render_model_texture_map u_RenderModel_TextureMap_t_090 *u_090; u_RenderModel_TextureMap_t_1237 *u_1237; }; + +#ifdef __cplusplus + static struct render_model_texture_map *from_w( const w_RenderModel_TextureMap_t_090* w_map ) { return CONTAINING_RECORD( w_map, struct render_model_texture_map, w_090 ); } + static struct render_model_texture_map *from_w( const w_RenderModel_TextureMap_t_1237* w_map ) { return CONTAINING_RECORD( w_map, struct render_model_texture_map, w_1237 ); } + u_RenderModel_TextureMap_t_090*& u_map( w_RenderModel_TextureMap_t_090 const& ) { return this->u_090; } + u_RenderModel_TextureMap_t_1237*& u_map( w_RenderModel_TextureMap_t_1237 const& ) { return this->u_1237; } + w_RenderModel_TextureMap_t_090& w_map( w_RenderModel_TextureMap_t_090 const& ) { return this->w_090; } + w_RenderModel_TextureMap_t_1237& w_map( w_RenderModel_TextureMap_t_1237 const& ) { return this->w_1237; } +#endif /* __cplusplus */ }; struct vrclient_init_params