Hikayeler

Reklam vermek için turkmmo@gmail.com

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

apikomt2

Level 6
Uzman
Developer
Katılım
11 May 2023
Konular
237
Mesajlar
1,032
Online süresi
1ay 23g
Reaksiyon Skoru
678
Altın Konu
1
Başarım Puanı
176
TM Yaşı
2 Yıl 11 Ay 15 Gün
MmoLira
503
DevLira
315

Metin2 EP, Valorant VP dahil tüm oyun ürünlerini en uygun fiyatlarla bulabilir, Item ve Karakterlerinizi hızlıca satabilirsiniz. HEMEN TIKLA!



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);
}
 
Paylaşım için teşekkürler
 
Paylaşım için teşekkürler Elinize sağlık.
 

Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)

Geri
Üst