[Fix] Silahlardaki Kronik Specular Bugu

Kaiser

⋞ 〈 ☪ 〉 ⋟
Site yetkilisi
Admin
Premium Üye
Geliştirici
Yardımsever Üye
Mesaj
3.712
Çözümler
350
Beğeni
3.608
Puan
1.849
Ticaret Puanı
0
Merhabalar, fix bana ait değil ancak şimdilik denenip onaylandı. Ben de dahil bu bug'ın farkında olanlar diğer platformlarda uzun zamandır bunun fixini arıyordu ve @rid nickli bir arkadaş bu fixi ücretsiz olarak yayınlamış. Bu bug yanılmıyorsam bütün fileslerde mevcut, yine de aşağıdaki açıklamalarla beraber test edebilirsiniz.

Kontrollere devam ediyorum, eğer bir sorun yakalarsam konu altından bildiririm. Sizler de fark ettiğiniz sorunları belirtebilirsiniz.

Öncelikle bugdan haberi olmayanlar için kısa bir özet geçeyim; görseli inceleyiniz.
.gif
Görseldeki render target sistemine sahip olanlar test edebilir. Karakterin eline +9 bir silah verin ve aynı silahın +0'ı envanterde olsun.
Envanterdeki +0 silahın üzerine gelindiğinde, eldeki +9 silahın specuları(parlaması) sönüyor.
Dipnot: Bu bug'ın render target sistemi ile alakası yoktur.

Eğer render target yoksa; 2 tane client açın ve iki karaktere giriş yapın. İki karakterin de elinde aynı silahın +9'u olsun.
Sonra iki karakterden birine aynı silahın +0ını giydirin. Diğer clientteki +9 silah takılı olan karakterin silahında da specular efekti sönecektir.
Bkz:


Gelelim fixe.

Client src/EterGrnLib/Material.cpp açın ve bulun:
C++:
float CGrannyMaterial::__GetSpecularPower() const
{
    return m_fSpecularPower;
}

Değiştirin:
C++:
float CGrannyMaterial::GetSpecularPower() const
{
    return m_fSpecularPower;
}

Arayın:
C++:
void CGrannyMaterial::__ApplySpecularRenderState()

İçinde bulun:
C++:
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, D3DXCOLOR(g_fSpecularColor.r, g_fSpecularColor.g, g_fSpecularColor.b, __GetSpecularPower()));
Değiştirin:
C++:
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, D3DXCOLOR(g_fSpecularColor.r, g_fSpecularColor.g, g_fSpecularColor.b, GetSpecularPower()));

Client src/EterGrnLib/Material.h açın ve bulun ve silin:
C++:
float                    __GetSpecularPower() const;
Tekrar arayın:
C++:
LPDIRECT3DTEXTURE8        GetD3DTexture(int iStage) const;
Altına ekleyin:
C++:
float                    GetSpecularPower() const;

Client src/EterGrnLib/ModelInstance.cpp açın ve bulun:
C++:
void CGrannyModelInstance::SetMaterialData(const char* c_szImageName, const SMaterialData& c_rkMaterialData)
{
    m_kMtrlPal.SetMaterialData(c_szImageName, c_rkMaterialData);
}

Aşağıdaki gibi ekleme yapın:
C++:
void CGrannyModelInstance::SetMaterialData(const char* c_szImageName, const SMaterialData& c_rkMaterialData)
{
    m_kMtrlPal.SetMaterialData(c_szImageName, c_rkMaterialData);
    material_data_ = c_rkMaterialData; //bu satırı ekleyin
}

Bulun:
C++:
void CGrannyModelInstance::__Initialize()
    ....
    ....
    m_pgrnAni = NULL;

Altına ekleyin:
C++:
material_data_ = {};

Client src/EterGrnLib/ModelInstance.h açın ve arayın:
C++:
CGrannyModelInstance** m_ppkSkeletonInst;

Altına ekleyin:
C++:
SMaterialData material_data_;

Client src/EterGrnLib/ModelInstanceRender.cpp açın ve arayın:
C++:
void CGrannyModelInstance::RenderMeshNodeListWithOneTexture(CGrannyMesh::EType e

İçinde bulun:
C++:
CGrannyMaterial& rkMtrl=m_kMtrlPal.GetMaterialRef(pTriGroupNode->mtrlIndex);

Altına ekleyin:
C++:
if (!material_data_.pImage)
{
    if (std::fabs(rkMtrl.GetSpecularPower() - material_data_.fSpecularPower) >= std::numeric_limits<float>::epsilon())
        rkMtrl.SetSpecularInfo(material_data_.isSpecularEnable, material_data_.fSpecularPower, material_data_.bSphereMapIndex);
}

Build alın ve test edin.

Kaynak:
Linkleri görebilmek için giriş yap veya kayıt ol.
 
Geri
Üst