📄 cwater.cpp
字号:
#include "CWater.h"
#include <iostream>
using namespace std;
CWater::CWater():index(0.0f)
{
for(int i=0;i<16;++i)
tex[i]=0;
D3DXMatrixTranslation(&mat,-256.0f/2.0f,0.0f,-256.0f/2.0f);
pIB=0;
totalNum=0;
}
CWater::~CWater()
{
for(int i=0;i<16;++i)
{
SAFE_RELEASE(tex[i]);
}
SAFE_RELEASE(pIB);
}
HRESULT CWater::Create()
{
int totalVertex=256*256*6;
totalNum=256*256*2;
CGDevice *pDev=CGDevice::GetInstance();
if(FAILED(pDev->GetDev()->CreateVertexBuffer(totalVertex*sizeof(VERTEX_COLOR_TEXTURE),0,D3DFVF_XYZ_COLOR_TEXTURE,D3DPOOL_DEFAULT,&pIB,NULL)))
{
return S_FALSE;
}
VERTEX_COLOR_TEXTURE *pVer;
if(FAILED(pIB->Lock(0,0,(void**)&pVer,0)))
return S_FALSE;
int base;
float x1,x2,x3,x4;
float z1,z2,z3,z4;
float u1,u2,u3,u4;
float v1,v2,v3,v4;
int i;
int mode=16;
float textureU;
float textureV;
float step=1.0f/16.0f;
for(i=0;i<256;++i)
{
for(int j=0;j<256;++j)
{
textureU=float(j%mode);
textureV=float(i%mode);
base=6*256*i+j*6;
x1=(float)j;
x2=(float)j;
x3=(float)j+1.0f;
x4=(float)j+1.0f;
z1=(float)i;
z2=(float)i+1.0f;
z3=(float)i+1.0f;
z4=(float)i;
u1=step*textureU;
v1=step*textureV;
u2=step*textureU;
v2=step*textureV+step;
u3=step*textureU+step;
v3=step*textureV+step;
u4=step*textureU+step;
v4=step*textureV;
/*u1=0.0f;
v1=0.0f;
u2=0.0f;
v2=1.0f;
u3=1.0f;
v3=1.0f;
u4=1.0f;
v4=0.0f;*/
pVer[base]=SetVertex(x1,0.0f,z1,0xFFbcd5f2,u1,v1);
pVer[base+1]=SetVertex(x2,0.0f,z2,0xFFbcd5f2,u2,v2);
pVer[base+2]=SetVertex(x4,0.0f,z4,0xFFbcd5f2,u4,v4);
pVer[base+3]=pVer[base+1];
pVer[base+4]=SetVertex(x3,0.0f,z3,0xFFbcd5f2,u3,v3);
pVer[base+5]=pVer[base+2];
}
}
pIB->Unlock();
TCHAR str[16];
for(i=0;i<16;++i)
{
memset(str,0,sizeof(TCHAR)*16);
wsprintf(str,TEXT("%d.jpg"),i);
if(FAILED(D3DXCreateTextureFromFile(pDev->GetDev(),str,&(tex[i]))))
return S_FALSE;
}
return S_OK;
}
HRESULT CWater::Render()
{
index+=1.0f;
CGDevice *pDev=CGDevice::GetInstance();
LPDIRECT3DDEVICE9 dev=pDev->GetDev();
dev->SetTransform(D3DTS_WORLD,&mat);
dev->SetRenderState(D3DRS_CULLMODE,D3DCULL_NONE);
// dev->SetRenderState(D3DRS_FILLMODE,D3DFILL_WIREFRAME);
//启动alpha混合
dev->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
dev->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCCOLOR);
dev->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCCOLOR);
int i=(int)index;
if(i==16)
{
i=0;
index=0.0f;
}
dev->SetTexture(0,tex[i]);
//dev->SetTextureStageState(0,D3DTSS_COLORARG1,D3DTA_DIFFUSE);
//dev->SetTextureStageState(0,D3DTSS_COLORARG2,D3DTA_TEXTURE);
//dev->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_MODULATE);
dev->SetRenderState(D3DRS_ZFUNC,D3DCMP_LESS);
dev->SetRenderState(D3DRS_ZENABLE,TRUE);
dev->SetSamplerState(0, D3DSAMP_ADDRESSU, D3DTADDRESS_WRAP);
dev->SetSamplerState(0, D3DSAMP_ADDRESSV, D3DTADDRESS_WRAP);
if(FAILED(dev->SetStreamSource(0,pIB,0,sizeof(VERTEX_COLOR_TEXTURE))))
return S_FALSE;
if(FAILED(dev->SetFVF(D3DFVF_XYZ_COLOR_TEXTURE)))
return S_FALSE;
if(FAILED(dev->DrawPrimitive(D3DPT_TRIANGLELIST,0,totalNum)))
return S_FALSE;
//dev->SetTextureStageState(0,D3DTSS_COLOROP, D3DTOP_DISABLE );
dev->SetRenderState(D3DRS_ZENABLE,FALSE);
dev->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
return S_OK;
}
void CWater::SetTrans(float movex,float movey,float movez,float scalex,float scaley,float scalez)
{
D3DXMATRIX tempmat;
D3DXMatrixTranslation(&mat,-256.0f/2.0f,0.0f,-256.0f/2.0f);
D3DXMatrixScaling(&tempmat,scalex,scaley,scalez);
mat*=tempmat;
D3DXMatrixTranslation(&tempmat,movex,movey,movez);
mat*=tempmat;
}
void CWater::RockAndRoll(float deltaT,float speed,int dx,int dz)
{
deltaT=0.01f;
speed=1.0f;
const float A=(speed*deltaT/1.0f)*(speed*deltaT/1.0f);
const float B=2.0f-4.0f*A;
const float decrease=1.0f;
int i,j;
float temp;
z1.Set(1,rand()%250,rand()%250);
for(i=1;i<255;++i)
{
for(j=1;j<255;++j)
{
temp=A*(z.Get(i-1,j)+z.Get(i+1,j)+z.Get(i,j-1)+z.Get(i,j+1))+B*z.Get(i,j)-z1.Get(i,j);
z1.Set(temp,i,j);
z1.Set(z1.Get(i,j)*decrease,i,j);
}
}
WaterPoint::swap(&z,&z1);
//////////////////////
VERTEX_COLOR_TEXTURE *pVer;
pIB->Lock(0,0,(void**)&pVer,0);
int base;
int mode=16;
for(i=0;i<256;++i)
{
for(int j=0;j<256;++j)
{
base=6*256*i+j*6;
pVer[base].y=z1.Get(i,j);
pVer[base+1].y=z1.Get(i+1,j);
pVer[base+2].y=z1.Get(i+1,j+1);
pVer[base+3].y=z1.Get(i+1,j);
pVer[base+4].y=z1.Get(j,i+1);
pVer[base+5].y=z1.Get(i,j);
}
}
pIB->Unlock();
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -