[Fix] Silahlardaki Kronik Specular Bugu

  • Konuyu açan Konuyu açan Kaiser
  • Açılış Tarihi Açılış Tarihi
  • Yanıt Yanıt 1
  • Gösterim Gösterim 1K

Kaiser

Admin
Admin
Geliştirici
Yardımsever Üye
Mesaj
4.038
Çözümler
390
Beğeni
4.159
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++:
Genişlet Daralt Kopyala
float CGrannyMaterial::__GetSpecularPower() const
{
    return m_fSpecularPower;
}

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

Arayın:
C++:
Genişlet Daralt Kopyala
void CGrannyMaterial::__ApplySpecularRenderState()

İçinde bulun:
C++:
Genişlet Daralt Kopyala
STATEMANAGER.SetRenderState(D3DRS_TEXTUREFACTOR, D3DXCOLOR(g_fSpecularColor.r, g_fSpecularColor.g, g_fSpecularColor.b, __GetSpecularPower()));
Değiştirin:
C++:
Genişlet Daralt Kopyala
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++:
Genişlet Daralt Kopyala
float                    __GetSpecularPower() const;
Tekrar arayın:
C++:
Genişlet Daralt Kopyala
LPDIRECT3DTEXTURE8        GetD3DTexture(int iStage) const;
Altına ekleyin:
C++:
Genişlet Daralt Kopyala
float                    GetSpecularPower() const;

Client src/EterGrnLib/ModelInstance.cpp açın ve bulun:
C++:
Genişlet Daralt Kopyala
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++:
Genişlet Daralt Kopyala
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++:
Genişlet Daralt Kopyala
void CGrannyModelInstance::__Initialize()
    ....
    ....
    m_pgrnAni = NULL;

Altına ekleyin:
C++:
Genişlet Daralt Kopyala
material_data_ = {};

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

Altına ekleyin:
C++:
Genişlet Daralt Kopyala
SMaterialData material_data_;

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

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

Altına ekleyin:
C++:
Genişlet Daralt Kopyala
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