#include "basemodelentity.h" void C_BaseModelEntity::Precache() { } void C_BaseModelEntity::Spawn() { BaseClass::Spawn(); SetThink(Think); } void C_BaseModelEntity::Think( float fDelta ) { UpdateModel(); if (m_pInstance) { m_pInstance->SetPosition(GetAbsOrigin()); m_pInstance->SetRotation(GetAbsAngles()); m_pInstance->SetScale({GetScale(),GetScale(),GetScale()}); } } void C_BaseModelEntity::SetModel( const char *szName ) { V_memset(m_szModel, 0, 256); V_strncpy(m_szModel, szName, 255); } void C_BaseModelEntity::UpdateModel() { if (!V_strncmp(m_szModel, m_szCurrentModel, 256)) return; V_memset(m_szCurrentModel, 0, 256); V_strncpy(m_szCurrentModel, m_szModel, 255); if (m_hModelHandle) { g_pAssetManager->UnrefModel(m_hModelHandle); g_pWorldRenderer->DestroyMeshInstance( g_pAssetManager->GetMeshByIndex(m_pModel->m_hMesh)->m_pMesh, m_pInstance); } m_hModelHandle = g_pAssetManager->LoadModel(m_szCurrentModel); m_pModel = g_pAssetManager->GetModelByIndex(m_hModelHandle); CBaseMaterial *pMat = g_pAssetManager->GetMaterialByIndex(m_pModel->m_hMaterial)->m_pLayout; if (!m_pModel) { V_printf("Failed to load %u %s\n", V_strnlen(m_szCurrentModel,255), m_szCurrentModel); m_pInstance = NULL; return; } FunnyMesh_t *pMesh = g_pAssetManager->GetMeshByIndex(m_pModel->m_hMesh); m_pInstance = g_pWorldRenderer->CreateInstance(pMesh->m_pMesh); m_pInstance->SetPosition({0,0,0}); m_pInstance->SetRotation({0,0,0,1}); m_pInstance->SetMaterial(pMat); } C_BaseModelEntity::~C_BaseModelEntity() { if (m_pInstance) { FunnyMesh_t *pMesh = g_pAssetManager->GetMeshByIndex(m_pModel->m_hMesh); g_pWorldRenderer->DestroyMeshInstance(pMesh->m_pMesh, m_pInstance); g_pAssetManager->UnrefModel(m_hModelHandle); } } BEGIN_DATADESC(C_BaseModelEntity) DEFINE_KEYFIELD(m_szModel, FIELD_STRING, "model") END_DATADESC() IMPLEMENT_RECV_DT(C_BaseModelEntity) NetPropString(m_szModel) END_RECV_DT() IMPLEMENT_EMPTY_SEND_DT(C_BaseModelEntity) LINK_ENTITY_TO_CLASS(prop_physics, C_BaseModelEntity)