Исправление Соотношение сторон в Detail props

From Valve Developer Community
Jump to navigation Jump to search
English (en)Русский (ru)Translate (Translate)

В коде Valve's есть баг, который влияет на detail sprite(en) материалы, хранящиеся в другом месте, кроме detail\detailsprites. Соотношение сторон использующиеся при выборе субрегионов пользовательских текстур ошибочно всё время читаются из detail\detailsprites. Это означает, что соотношение сторон пользовательских текстур должно совпадать с оригиналами.

Это происходит потому, что соотношение сторон кода от Valve срабатывает раньше чем игровой мир загрузился, и о спрайтах становиться известно позже. Исправление делается в функции LevelInitPostEntity т.е. после загрузки.

Исправление

Перейдите к CDetailObjectSystem::LevelInitPreEntity() в client\detailobjectsystem.cpp и удалите этот блок кода из, примерно на полпути вниз:

if ( m_DetailObjects.Count() || m_DetailSpriteDict.Count() )
{
	// There are detail objects in the level, so precache the material
	PrecacheMaterial( DETAIL_SPRITE_MATERIAL );
	IMaterial *pMat = m_DetailSpriteMaterial;
	// adjust for non-square textures (cropped)
	float flRatio = pMat->GetMappingWidth() / pMat->GetMappingHeight();
	if ( flRatio > 1.0 )
	{
		for( int i = 0; i<m_DetailSpriteDict.Count(); i++ )
		{
			m_DetailSpriteDict[i].m_TexUL.y *= flRatio;
			m_DetailSpriteDict[i].m_TexLR.y *= flRatio;
			m_DetailSpriteDictFlipped[i].m_TexUL.y *= flRatio;
			m_DetailSpriteDictFlipped[i].m_TexLR.y *= flRatio;
		}
	}
}

Затем в функции void CDetailObjectSystem::LevelInitPostEntity() измените этот код:

	const char *pDetailSpriteMaterial = DETAIL_SPRITE_MATERIAL;
	C_World *pWorld = GetClientWorldEntity();
	if ( pWorld && pWorld->GetDetailSpriteMaterial() && *(pWorld->GetDetailSpriteMaterial()) )
	{
		pDetailSpriteMaterial = pWorld->GetDetailSpriteMaterial(); 
	}
	m_DetailSpriteMaterial.Init( pDetailSpriteMaterial, TEXTURE_GROUP_OTHER );

на этот:

if ( m_DetailObjects.Count() || m_DetailSpriteDict.Count() )
	{
		const char *pDetailSpriteMaterial = DETAIL_SPRITE_MATERIAL;
		C_World *pWorld = GetClientWorldEntity();
		if ( pWorld && pWorld->GetDetailSpriteMaterial() && *(pWorld->GetDetailSpriteMaterial()) )
			pDetailSpriteMaterial = pWorld->GetDetailSpriteMaterial(); 
 
		m_DetailSpriteMaterial.Init( pDetailSpriteMaterial, TEXTURE_GROUP_OTHER );
		PrecacheMaterial( pDetailSpriteMaterial );
		IMaterial *pMat = m_DetailSpriteMaterial;
 
		// adjust for non-square textures (cropped)
		float flRatio = pMat->GetMappingWidth() / pMat->GetMappingHeight();
		if ( flRatio > 1.0 )
		{
			for( int i = 0; i<m_DetailSpriteDict.Count(); i++ )
			{
				m_DetailSpriteDict[i].m_TexUL.y *= flRatio;
				m_DetailSpriteDict[i].m_TexLR.y *= flRatio;
				m_DetailSpriteDictFlipped[i].m_TexUL.y *= flRatio;
				m_DetailSpriteDictFlipped[i].m_TexLR.y *= flRatio;
			}
		}
	}

Перевод и маленькое редактирование статьи --Slam12f 23:29, 12 May 2013 (PDT)