- 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 14 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);
}
- Katılım
- 22 Nis 2024
- Konular
- 25
- Mesajlar
- 166
- Online süresi
- 7g 62744s
- Reaksiyon Skoru
- 232
- Altın Konu
- 0
- Başarım Puanı
- 74
- TM Yaşı
- 1 Yıl 12 Ay 2 Gün
- MmoLira
- 2,255
- DevLira
- 39
Paylaşım için teşekkürler
Şu an konuyu görüntüleyenler (Toplam : 1, Üye: 0, Misafir: 1)
Benzer konular
- Cevaplar
- 4
- Görüntüleme
- 501
- Cevaplar
- 8
- Görüntüleme
- 261
- Cevaplar
- 18
- Görüntüleme
- 2K











