示例#1
0
// Free the textures associated with a model if nobody else is using them
// Note : This assumes that the model textures aren't being used by
// anything other than models!
void CClientMgr::FreeUnusedModelTextures(LTObject *pObject) {
    ModelInstance *pInstance = pObject->ToModel();

    LTLink *pCur, *pListHead;
    SharedTexture *pTexture;
    uint32 nTextureLoop;

    // Handle the case where there are duplicate entries in the skins..
    for (nTextureLoop = 0; nTextureLoop < MAX_MODEL_TEXTURES; ++nTextureLoop)
    {
        for (uint32 nDupeLoop = nTextureLoop + 1; nDupeLoop < MAX_MODEL_TEXTURES; ++nDupeLoop)
        {
            if ((pInstance->m_pSkins[nTextureLoop] == pInstance->m_pSkins[nDupeLoop]) && (pInstance->m_pSkins[nTextureLoop]))
            {
                pInstance->m_pSkins[nDupeLoop] = LTNULL;
            }
        }
    }

    // Untag the textures used by this model
    for (nTextureLoop = 0; nTextureLoop < MAX_MODEL_TEXTURES; ++nTextureLoop)
    {
        pTexture = pInstance->m_pSkins[nTextureLoop];
        if (!pTexture)
            continue;
        // Make sure sprites don't get unloaded
        if (pInstance->m_pSprites[nTextureLoop])
            pTexture->SetFlags(pTexture->GetFlags() | ST_TAGGED);
        else
            pTexture->SetFlags(pTexture->GetFlags() & ~ST_TAGGED);
    }

    // Mark all client side model object textures as touched
    pListHead = &m_ObjectMgr.m_ObjectLists[OT_MODEL].m_Head;
    for (pCur=pListHead->m_pNext; pCur != pListHead; pCur=pCur->m_pNext)
    {
        ModelInstance *pFlagInstance = (ModelInstance*)pCur->m_pData;

        if (pFlagInstance == pInstance)
            continue;

        for (nTextureLoop = 0; nTextureLoop < MAX_MODEL_TEXTURES; ++nTextureLoop)
        {
            TagTexture(pFlagInstance->m_pSkins[nTextureLoop]);
        }
    }

    // Get rid of the model's textures if they haven't been tagged
    for (nTextureLoop = 0; nTextureLoop < MAX_MODEL_TEXTURES; ++nTextureLoop)
    {
        pTexture = pInstance->m_pSkins[nTextureLoop];
        if (!pTexture)
            continue;
        if ((pTexture->GetFlags() & ST_TAGGED) == 0)
        {
            FreeSharedTexture(pTexture);
            pInstance->m_pSkins[nTextureLoop] = LTNULL;
        }
    }
}
示例#2
0
void CClientMgr::UntagAllTextures() {
    LTLink *pListHead, *pCur;
    SharedTexture *pTexture;

    pListHead = &m_SharedTextures.m_Head;
    for (pCur=pListHead->m_pNext; pCur != pListHead; pCur=pCur->m_pNext)
    {
        pTexture = ((SharedTexture*)pCur->m_pData);
        pTexture->SetFlags(pTexture->GetFlags() & ~ST_TAGGED);
    }
}