www.pudn.com > 3DRPG.rar > Sky.cpp
#include "stdafx.h"
#include "Sky.h"
CSky::CSky(LPDIRECT3DDEVICE9 d3dd)
{
m_pD3DDevice=d3dd;
m_pVb=NULL;
m_pSvb=NULL;
width=8000.0f;
segment=400;
kkk=0;
CreateSky();
}
CSky::~CSky()
{
m_pVb->Release();
//m_pSvb->Release();
m_pTxSizhou->Release();
m_pTxDingbu->Release();
m_pTxDibu->Release();
//m_pTxSky->Release();
}
void CSky::CreateSky()
{
void * pdata;
//void * pcloud;
VERTEX ppbData[] ={
{0.0F,width/10*3,0.0F,0.0F,0.0F,},
{0.0f,0.0f,0.0f,0.0f,1.0f,},
{width,width/10*3,0.0f,0.25f,0.0f,},
{width,0.0f,0.0f,0.25f,1.0f,},
{width,width/10*3,width,0.5f,0.0f,},
{width,0.0f,width,0.5f,1.0f,},
{0.0f,width/10*3,width,0.75f,0.0f,},
{0.0f,0.0f,width,0.75f,1.0f,},
{0.0f,width/10*3,0.0f,1.0f,0.0f,},
{0.0f,0.0f,0.0f,1.0f,1.0f,},//四周
{0.0f,width/10*3,0.0f,0.0f,0.0f,},
{width,width/10*3,0.0f,1.0f,0.0f,},
{0.0f,width/10*3,width,0.0f,1.0f,},
{width,width/10*3,width,1.0f,1.0f,},//顶部
{0.0f,0.0f,0.0f,0.0f,0.0f,},
{0.0f,0.0f,width,0.0f,1.0f,},
{width,0.0f,0.0f,1.0f,0.0f,},
{width,0.0f,width,1.0f,1.0f,}//底部
};
/*VERTEX SkyArray[(400+1)*2];
int k=-1;
int j=-1;
bool flag=true;
for(int i=0;i<((segment+1)*2);i++)
{
SkyArray[i].y=width-10.0F;
if(i%2==0)
{
SkyArray[i].tu=0.0f;
SkyArray[i].x=0.0f;
k++;
if(flag==true)
{j++;SkyArray[i].flag=true;}
else
{j--;SkyArray[i].flag=false;}
}
else
{
SkyArray[i].tu=1.0f;
SkyArray[i].x=width;
SkyArray[i].flag=SkyArray[i-1].flag;
}
SkyArray[i].z=k*(width/segment);
SkyArray[i].tv=j*(1.0/(segment));
if(j==segment)//SkyArray[i].tv>=1.0f
{flag=false;SkyArray[i].flag=false;}//SkyArray[i].flag=false;
if(j==0)//SkyArray[i].tv<=0.0f
{flag=true;SkyArray[i].flag=true;}//SkyArray[i].flag=true;
}*/
m_pD3DDevice->CreateVertexBuffer(sizeof(ppbData),D3DUSAGE_DYNAMIC,SKY_D3DFVF_VERTEXBUFFER,D3DPOOL_DEFAULT,&m_pVb,NULL);
m_pVb->Lock(0,sizeof(ppbData),(void **)&pdata,D3DLOCK_DISCARD);
memcpy(pdata,ppbData,sizeof(ppbData));
m_pVb->Unlock();
/*m_pD3DDevice->CreateVertexBuffer(sizeof(SkyArray),D3DUSAGE_DYNAMIC,SKY_D3DFVF_VERTEXBUFFER,D3DPOOL_DEFAULT,&m_pSvb,NULL);
m_pSvb->Lock(0,sizeof(SkyArray),(void **)&pcloud,D3DLOCK_DISCARD);
memcpy(pcloud,SkyArray,sizeof(SkyArray));
m_pSvb->Unlock();*/
/*m_pD3DDevice->CreateVertexBuffer((segment+1)*2*sizeof(VERTEX),D3DUSAGE_DYNAMIC,SKY_D3DFVF_VERTEXBUFFER,D3DPOOL_DEFAULT,&m_pSvb,NULL);
m_pSvb->Lock(0,(segment+1)*2*sizeof(VERTEX),(void **)&SkyArray,D3DLOCK_DISCARD);
int j=-1;
for(int i=0;i<((segment+1)*2);i++)
{
SkyArray[i].y=width-10.0f;
if(i%2==0)
{
SkyArray[i].tu=0.0f;
SkyArray[i].x=0.0f;
j++;
}
else
{
SkyArray[i].tu=1.0f;
SkyArray[i].x=width;
}
SkyArray[i].z=j*(width/segment);
SkyArray[i].tv=j*(1.0f/segment);
}
m_pSvb->Unlock();*/
SetTexture();
}
void CSky::SetTexture()
{
D3DXCreateTextureFromFileEx(m_pD3DDevice, "./res/sky.jpg", 0, 0, 0, 0,
D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT,
D3DX_DEFAULT, D3DCOLOR_XRGB(0,0,0), NULL, NULL, &m_pTxSizhou);
D3DXCreateTextureFromFileEx(m_pD3DDevice, "./res/ding.jpg", 0, 0, 0, 0,
D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT,
D3DX_DEFAULT, D3DCOLOR_XRGB(0,0,0), NULL, NULL, &m_pTxDingbu);
D3DXCreateTextureFromFileEx(m_pD3DDevice, "./res/ding.jpg", 0, 0, 0, 0,
D3DFMT_UNKNOWN, D3DPOOL_MANAGED, D3DX_DEFAULT,
D3DX_DEFAULT, D3DCOLOR_XRGB(0,0,0), NULL, NULL, &m_pTxDibu);
//D3DXCreateTextureFromFile(m_pD3DDevice,"./res/Cloud.tga", &m_pTxSky);
}
void CSky::RenderSky()
{
//VERTEX * pCloud;
SetMaterial();
//m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,FALSE);
// m_pD3DDevice->SetTextureStageState(0,D3DTSS_COLOROP,D3DTOP_BLENDTEXTUREALPHA); //使用透明贴图
//m_pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE,FALSE); //关闭深度写入
// m_pD3DDevice->SetTextureStageState(1,D3DTSS_COLOROP,D3DTOP_DISABLE);
m_pD3DDevice->SetStreamSource(0, m_pVb, 0, sizeof(VERTEX)); //设置顶点缓冲区
m_pD3DDevice->SetFVF(SKY_D3DFVF_VERTEXBUFFER); //设置自由顶点格式
m_pD3DDevice->SetTexture(0,m_pTxSizhou);
m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 0, 8); //四周
m_pD3DDevice->SetTexture(0,m_pTxDibu);
m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 14, 2);//底部
m_pD3DDevice->SetTexture(0,m_pTxDingbu);
m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP, 10, 2);//顶部
/*m_pD3DDevice->SetRenderState(D3DRS_ALPHABLENDENABLE,TRUE);
m_pD3DDevice->SetRenderState(D3DRS_SRCBLEND,D3DBLEND_SRCALPHA);
m_pD3DDevice->SetRenderState(D3DRS_DESTBLEND,D3DBLEND_INVSRCALPHA);
m_pD3DDevice->SetRenderState( D3DRS_ALPHATESTENABLE, TRUE );
m_pD3DDevice->SetRenderState( D3DRS_ALPHAREF, D3DCOLOR_XRGB(0,0,0) );
m_pD3DDevice->SetRenderState( D3DRS_ALPHAFUNC,D3DCMP_GREATEREQUAL );
m_pD3DDevice->SetStreamSource(0, m_pSvb, 0, sizeof(VERTEX)); //设置顶点缓冲区
m_pD3DDevice->SetFVF(SKY_D3DFVF_VERTEXBUFFER); //设置自由顶点格式
m_pD3DDevice->SetTexture(0,m_pTxSky);
m_pSvb->Lock(0,(segment+1)*2*sizeof(VERTEX),(void **)&pCloud,D3DLOCK_DISCARD);
for(int i=0;i<((segment+1)*2);i++)
{
if(pCloud[i].tv>=1.0f)
{pCloud[i].flag=false;}//pCloud[i].tv=1.0f;
if(pCloud[i].tv<=0.0f)
{pCloud[i].flag=true;}//pCloud[i].tv=0.0f;
if(pCloud[i].flag==true)
{
pCloud[i].tv+=(1.0/(segment));
}
else
{
pCloud[i].tv-=(1.0/(segment));
}
}
m_pSvb->Unlock();
m_pD3DDevice->DrawPrimitive(D3DPT_TRIANGLESTRIP,0,(segment*2));//cloud
m_pD3DDevice->SetRenderState( D3DRS_CLIPPLANEENABLE ,TRUE);
m_pD3DDevice->SetRenderState( D3DRS_ZWRITEENABLE,TRUE);*/
}
void CSky::Translate(POSITION pos)
{
D3DXMATRIX matTranslate,matWorld;
D3DXMATRIX matScale;
D3DXMatrixScaling(&matScale,5,5,5);
D3DXMatrixTranslation(&matTranslate,-2080.0f,0.0f,-2080.0f);
m_pD3DDevice->SetTransform(D3DTS_WORLD,&matTranslate);
}
void CSky::SetMaterial()
{
ZeroMemory(&material,sizeof(material));
material.Diffuse.r=material.Ambient.r=0.0f;
material.Diffuse.g=material.Ambient.g=0.0f;
material.Diffuse.b=material.Ambient.b=0.0f;
material.Diffuse.a=material.Ambient.a=0.0f;
material.Specular.r=0.0f;
material.Specular.g=0.0f;
material.Specular.b=0.0f;
material.Specular.a=0.0f;
material.Emissive.r=1.0f;
material.Emissive.g=1.0f;
material.Emissive.b=1.0f;
material.Emissive.a=0.5f;
m_pD3DDevice->SetMaterial(&material);
}