|
|
发表于 2008-10-20 10:49:00
|
显示全部楼层
Re:在地形编辑中,大家是如何做纹理刷的??
//编辑地形的纹理
bool Terrain::EditTerrainTex(const D3DXVECTOR3& picketPoint, float radius ,float strengthPower, float strengthArc,int alpha_NO)
{
if(!gDInput->MouseButtonDown(0))
{
return false;
}
//已编辑标志,防止block边界双倍编辑
bool *bEditedflag = new bool[mTerrainParam.tilesize * mTerrainParam.tilesize];
mlock.lock();
for(list<TerrainTile *>::iterator it = m_VisitedTiles.begin(); it!= m_VisitedTiles.end(); it++)
{
TerrainTile * tile = *it;
if(tile && tile->m_bLoaded )
{
IDirect3DTexture9 * alphaA = tile->GetAlphaTexA();
IDirect3DTexture9 * alphaB = tile->GetAlphaTexB();
D3DLOCKED_RECT d3dlrA, d3dlrB;
alphaA->LockRect( 0, &d3dlrA, 0, 0 );
alphaB->LockRect( 0, &d3dlrB, 0, 0 );
blockset::iterator itor;
ZeroMemory(bEditedflag, mTerrainParam.tilesize * mTerrainParam.tilesize * sizeof(bool));
for(itor= tile->DisplayBlockSet.begin(); itor!= tile->DisplayBlockSet.end(); itor++)
{
// 1:rA 2:gA 3:bA 4:aA
// 5:rB 6:gB 7:bB 8:aB
LodBlock *p = (*itor);
BYTE* lpSrcA = (BYTE*)d3dlrA.pBits;
BYTE* lpSrcB = (BYTE*)d3dlrB.pBits;
for(int i = 0; i < mTerrainParam.blocksize; i ++)
{
for(int j = 0; j < mTerrainParam.blocksize; j++)
{
float tx = tile->GetTopX();
float tz = tile->GetTopZ();
int row = p->GetNz() * (mTerrainParam.blocksize - 1) + i;
int col = p->GetNx() * (mTerrainParam.blocksize - 1) + j;
float x = tx + col * mTerrainParam.ftCell_len;
float z = tz - row * mTerrainParam.ftCell_len;
float delta = 0.0f;
if(!bEditedflag[row * mTerrainParam.tilesize + col] && UpOrDownPoint(picketPoint, x, delta, z, radius, strengthPower, strengthArc))
{
DWORD pixel = 0;
memcpy(&pixel, lpSrcA + (row * d3dlrA.Pitch + 4*col), 4);
DWORD rA = (pixel & 0xFF000000) >> 24;
DWORD gA = (pixel & 0x00FF0000) >> 16;
DWORD bA = (pixel & 0x0000FF00) >> 8;
DWORD aA = (pixel & 0x000000FF) >> 0;
memcpy(&pixel, lpSrcB + (row * d3dlrB.Pitch + 4*col), 4);
DWORD rB = (pixel & 0xFF000000) >> 24;
DWORD gB = (pixel & 0x00FF0000) >> 16;
DWORD bB = (pixel & 0x0000FF00) >> 8;
DWORD aB = (pixel & 0x000000FF) >> 0;
if(alpha_NO == 1)
adjvalue(delta, rA, gA, bA, rB, gB, bB);
else if(alpha_NO == 2)
adjvalue(delta, gA, rA, bA, rB, gB, bB);
else if(alpha_NO == 3)
adjvalue(delta, bA, rA, gA, rB, gB, bB);
else if(alpha_NO == 5)
adjvalue(delta, rB, rA, gA, bA, gB, bB);
else if(alpha_NO == 6)
adjvalue(delta, gB, rA, gA, bA, rB, bB);
else if(alpha_NO == 7)
adjvalue(delta, bB, rA, gA, bA, rB, gB);
pixel = 0x00000000 + (rA << 24) + (gA << 16) + (bA << 8) + (aA << 0);
memcpy(lpSrcA + (row * d3dlrA.Pitch + 4*col), &pixel, 4);
pixel = 0x00000000 + (rB << 24) + (gB << 16) + (bB << 8) + (aB << 0);
memcpy(lpSrcB + (row * d3dlrB.Pitch + 4*col), &pixel, 4);
tile->m_bTexEdited = true;
RegistEditTile(tile);
bEditedflag[row * mTerrainParam.tilesize + col] = 1; //已经编辑过了,防止block边界双倍编辑
}
}
}
}
alphaA->UnlockRect(0);
alphaB->UnlockRect(0);
}
}
mlock.unlock();
DEL(bEditedflag);
return true;
} |
|