Neler yeni
XenForo Bannerlar
Modern AdBlock Uyarısı

Foruma hoş geldin, Ziyaretçi

Forum içeriğine ve tüm hizmetlerimize erişim sağlamak için foruma kayıt olmalı ya da giriş yapmalısınız. Foruma üye olmak tamamen ücretsizdir.

Kod akarsu karaya doğru aksın durgun olmasın

Fatih Bulut

Süper Üye
Katılım
6 Kas 2021
Mesajlar
4,111
Tepkime puanı
5,532
Puanları
113
Yaş
32
Konum
Türkiye
Dc
fatihbulut

mapotudorwater.cpp ilgili yeri değiştir.​
Kod:
#include <cmath>
void CMapOutdoor::RenderWater()
{
    if (m_PatchVector.empty())
        return;

    if (!IsVisiblePart(PART_WATER))
        return;

    // Zamanı C++20 mantığıyla alıp saniyeye çeviriyoruz (Hem dalga hem akıntı için kullanılacak)
    const float fCurrentTimeSec = static_cast<float>(CTimer::Instance().GetCurrentMillisecond()) / 1000.0f;

    //////////////////////////////////////////////////////////////////////////
    // RenderState
    STATEMANAGER.SaveRenderState(D3DRS_ZWRITEENABLE, FALSE);
    STATEMANAGER.SaveRenderState(D3DRS_ALPHABLENDENABLE, TRUE);
    STATEMANAGER.SaveRenderState(D3DRS_CULLMODE, D3DCULL_NONE);
    STATEMANAGER.SaveRenderState(D3DRS_DIFFUSEMATERIALSOURCE, D3DMCS_COLOR1);
    STATEMANAGER.SaveRenderState(D3DRS_COLORVERTEX, TRUE);

    STATEMANAGER.SetTexture(0, m_WaterInstances[((ELTimer_GetMSec() / 70) % 30)].GetTexturePointer()->GetD3DTexture());

    // --- 1. YENİLİK: Akıntı (UV Scrolling) Efekti ---
    constexpr float kWaterFlowSpeedU = 0.03f; // X eksenindeki akış hızı (sağ-sol)
    constexpr float kWaterFlowSpeedV = 0.05f; // Y eksenindeki akış hızı (ileri-geri)
    
    D3DXMATRIX matTexScale, matTexTranslate, matTexTransformWater;
    
    // Kaplamayı boyutlandırıyoruz
    D3DXMatrixScaling(&matTexScale, m_fWaterTexCoordBase, -m_fWaterTexCoordBase, 0.0f);
    
    // Kaplamayı zamana bağlı olarak kaydırıyoruz (Akıntı hissi verir)
    D3DXMatrixTranslation(&matTexTranslate, fCurrentTimeSec * kWaterFlowSpeedU, fCurrentTimeSec * kWaterFlowSpeedV, 0.0f);
    
    // Matrisleri birleştirip View matrisi ile çarpıyoruz
    D3DXMatrixMultiply(&matTexTransformWater, &matTexScale, &matTexTranslate);
    D3DXMatrixMultiply(&matTexTransformWater, &m_matViewInverse, &matTexTransformWater);
    // ------------------------------------------------

    STATEMANAGER.SaveTransform(D3DTS_TEXTURE0, &matTexTransformWater);
    STATEMANAGER.SaveVertexShader(D3DFVF_XYZ|D3DFVF_DIFFUSE);

    STATEMANAGER.SaveTextureStageState(0, D3DTSS_TEXCOORDINDEX, D3DTSS_TCI_CAMERASPACEPOSITION);
    STATEMANAGER.SaveTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS, D3DTTFF_COUNT2);
    STATEMANAGER.SaveTextureStageState(0, D3DTSS_MINFILTER, D3DTEXF_LINEAR);
    STATEMANAGER.SaveTextureStageState(0, D3DTSS_MAGFILTER, D3DTEXF_LINEAR);
    STATEMANAGER.SaveTextureStageState(0, D3DTSS_MIPFILTER, D3DTEXF_LINEAR);
    STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSU, D3DTADDRESS_WRAP);
    STATEMANAGER.SaveTextureStageState(0, D3DTSS_ADDRESSV, D3DTADDRESS_WRAP);

    STATEMANAGER.SetTextureStageState(0, D3DTSS_COLORARG1, D3DTA_TEXTURE);
    STATEMANAGER.SetTextureStageState(0, D3DTSS_COLOROP, D3DTOP_SELECTARG1);
    STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAARG1, D3DTA_DIFFUSE);
    STATEMANAGER.SetTextureStageState(0, D3DTSS_ALPHAOP, D3DTOP_SELECTARG1);

    STATEMANAGER.SetTexture(1, NULL);
    STATEMANAGER.SetTextureStageState(1, D3DTSS_COLOROP, D3DTOP_DISABLE);
    STATEMANAGER.SetTextureStageState(1, D3DTSS_ALPHAOP, D3DTOP_DISABLE);
    //////////////////////////////////////////////////////////////////////////


    // --- 2. YENİLİK: C++20 Trigonometrik Okyanus Dalgası (Smooth Wave) ---
    // Eski random_range ile zıplayan sistem yerine, sinüs dalgası kullanarak suyun yavaşça inip kalkmasını sağlıyoruz.
    constexpr float kWaveAmplitude = 7.0f; // Dalganın maksimum yüksekliği
    constexpr float kWaveSpeed     = 1.5f; // Dalganın inip çıkma hızı
    
    // Sinüs dalgası oluştur: -kWaveAmplitude ile +kWaveAmplitude arasında yumuşakça gidip gelir
    const float fWaterHeightCurrent = std::sin(fCurrentTimeSec * kWaveSpeed) * kWaveAmplitude;

    m_matWorldForCommonUse._43 = fWaterHeightCurrent; // Z ekseni (Yükseklik)
    m_matWorldForCommonUse._41 = 0.0f;
    m_matWorldForCommonUse._42 = 0.0f;
    STATEMANAGER.SetTransform(D3DTS_WORLD, &m_matWorldForCommonUse);
    // ----------------------------------------------------------------------


    float fFogDistance = __GetFogDistance();

    std::vector<std::pair<float, long> >::iterator i;

    for(i = m_PatchVector.begin(); i != m_PatchVector.end(); ++i)
    {
        if (i->first < fFogDistance)
            DrawWater(i->second);
    }

    STATEMANAGER.SetTexture(0, NULL);
    STATEMANAGER.SetRenderState(D3DRS_ALPHABLENDENABLE, FALSE);

    for(i = m_PatchVector.begin(); i != m_PatchVector.end(); ++i)
    {
        if (i->first >= fFogDistance)
            DrawWater(i->second);
    }

    m_matWorldForCommonUse._43 = 0.0f;

    //////////////////////////////////////////////////////////////////////////
    // RenderState Restore (Değişmedi)
    STATEMANAGER.RestoreVertexShader();
    STATEMANAGER.RestoreTransform(D3DTS_TEXTURE0);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MINFILTER);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MAGFILTER);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_MIPFILTER);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ADDRESSU);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_ADDRESSV);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_TEXCOORDINDEX);
    STATEMANAGER.RestoreTextureStageState(0, D3DTSS_TEXTURETRANSFORMFLAGS);

    STATEMANAGER.RestoreRenderState(D3DRS_DIFFUSEMATERIALSOURCE);
    STATEMANAGER.RestoreRenderState(D3DRS_COLORVERTEX);
    STATEMANAGER.RestoreRenderState(D3DRS_ZWRITEENABLE);
    STATEMANAGER.RestoreRenderState(D3DRS_ALPHABLENDENABLE);
    STATEMANAGER.RestoreRenderState(D3DRS_CULLMODE);
}
 

Forumdan daha fazla yararlanmak için giriş yapın yada üye olun!

Forumdan daha fazla yararlanmak için giriş yapın veya kayıt olun!

Kayıt ol

Forumda bir hesap oluşturmak tamamen ücretsizdir.

Şimdi kayıt ol
Giriş yap

Eğer bir hesabınız var ise lütfen giriş yapın

Giriş yap

Tema düzenleyici

Tema özelletirmeleri

Grafik arka planlar

Granit arka planlar