⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 cwater.cpp

📁 zip压缩,解压缩 英文版本的,大家凑货看
💻 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 + -