problems with multiple alpha blending (DX7)

Recommended Posts

Hello everyone. I'm trying to alpha blend using Direct3D7, working with VC++ 6.0. Futhermore, I'm working with sprites in a tile-based engine.
Now, I have seen routines that work. I mostly like the ones that copy pixel-by-pixel. Yet I cannot make them work when I deal with a surface with more then one type of sprite.
I load the entire bitmap into a temporary DD7 surface. I create a new DD7 surface in my array. Then I copy each pixel from the temporary DD7 surface to the new DD7 surface, region by region. Basically, I want to seperate a large DD7 surface with multiple sprites into an array of surfaces, and add alpha transparency for each of these surfaces.
My region values seem fair. I seperate all sprites with one line, column and row-wise.
recSearch.left = (TileDim * columncount) + columncount;
recSearch.top = (TileDim * rowcount) + rowcount;
recSearch.right = (TileDim * (columncount+1)) + columncount;
recSearch.bottom = (TileDim * (rowcount+1)) + rowcount;
This works with my background tiles, so it probably works here.
And this is how I set my vertices. Another programmer created the functions, and I'm sure some will recognize them. They work fine for now. ptiSpriteList is a pointer to the array of surfaces and vertices, and TileDim is the dimension of each sprite. They have to be square, and divisable by 32. As well, I added one extra row and column (making the 64x64 image 65x65) to add anchors (which are calculated correctly, I checked). That's why I subtract one from TileDim each time.
//set up vertices
//tiledim must be subtracted by 1 since anchors at +1
VERTEX_Set(&ptiSpriteList[tilenum].vertices[0],-ptAnchor.x,-ptAnchor.y,D3DRGB(1.0,1.0,1.0),0.0,0.0);
VERTEX_Set(&ptiSpriteList[tilenum].vertices[1],-ptAnchor.x+(TileDim-1),-ptAnchor.y,D3DRGB(1.0,1.0,1.0),1.0,0.0);
VERTEX_Set(&ptiSpriteList[tilenum].vertices[2],-ptAnchor.x,-ptAnchor.y+(TileDim-1),D3DRGB(1.0,1.0,1.0),0.0,1.0);
VERTEX_Set(&ptiSpriteList[tilenum].vertices[3],-ptAnchor.x+(TileDim-1),-ptAnchor.y+(TileDim-1),D3DRGB(1.0,1.0,1.0),1.0,1.0);
After this, we go into alpha blending. I used the assembly example found somewhere on this site. I added this, which is what you were suppose to do. Except I may have done something wrong.
DDSURFACEDESC2 ddsdSource;
DDSD_Clear(&ddsdSource);
DDSURFACEDESC2 ddsdDest;
DDSD_Clear(&ddsdDest);
//lock textures
lpddsSource->Lock(& region,&ddsdSource,DDLOCK_WAIT,NULL);
(*lpddsDest)->Lock(NULL,&ddsdDest,DDLOCK_WAIT,NULL);
DWORD ipitchsrc = ddsdSource.lPitch - (ddsdSource.dwWidth * 2);
DWORD ipitchdest = ddsdDest.lPitch - (ddsdDest.dwWidth * 2);
Region is a RECT that was gotten above (its recSearch). And yes, they are unlocked after the ASM routines. Note that I wrote & region because otherwise it'd look like &region.
Can anyone help me?
--gmx
Edited by - generalmx on August 7, 2001 4:03:22 AM