multiple index buffers for 1 tilemap array - headaches

Started by
8 comments, last by Raloth 20 years, 8 months ago
I am working on getting an index buffer for each of the different tiles in my tilemap so that I can blend in between them. I am sure that it's setting the array right so it knows which tiles go where, so it can only be the indices that are wrong. Can anyone spot a problem with this code?

	WORD *pGrassIndices,*pDirtIndices,*pSandIndices;
	
	if(grassIndices) if(FAILED(grassIndices->Lock(0,0,(BYTE**)&pGrassIndices,0))) return false;
	if(dirtIndices) if(FAILED(dirtIndices->Lock(0,0,(BYTE**)&pDirtIndices,0))) {
		grassIndices->Unlock();
		return false;
	}
	if(sandIndices) if(FAILED(sandIndices->Lock(0,0,(BYTE**)&pSandIndices,0))) {
		grassIndices->Unlock();
		dirtIndices->Unlock();
		return false;
	}
	
	int position = 0;
	for(int i=0;i<32;i++) {
		for(int j=0;j<32;j++) {
			if(tilelookup[i][j] & GrassID) {
				pGrassIndices[0] = position + 0;
				pGrassIndices[1] = position + 1;
				pGrassIndices[2] = position + 3;
				pGrassIndices[3] = position + 1;
				pGrassIndices[4] = position + 2;
				pGrassIndices[5] = position + 3;
				pGrassIndices += 6;
			}
			if(tilelookup[i][j] & DirtID) {
				pDirtIndices[0] = position + 0;
				pDirtIndices[1] = position + 1;
				pDirtIndices[2] = position + 3;
				pDirtIndices[3] = position + 1;
				pDirtIndices[4] = position + 2;
				pDirtIndices[5] = position + 3;
				pDirtIndices += 6;
			}
			if(tilelookup[i][j] & SandID) {
				pSandIndices[0] = position + 0;
				pSandIndices[1] = position + 1;
				pSandIndices[2] = position + 3;
				pSandIndices[3] = position + 1;
				pSandIndices[4] = position + 2;
				pSandIndices[5] = position + 3;
				pSandIndices += 6;
			}
			position += 4;
		}
	}
	
	if(sandIndices) sandIndices->Unlock();
	if(dirtIndices) dirtIndices->Unlock();
	if(grassIndices) grassIndices->Unlock();
GrassID is set to 1, DirtID is set to 2, and SandID is 4 so I can use | to set the tilelookup array to contain multiple types in one element. First I go through my base array and set the tiles to all grass. I then go and set the tilelookup array using the bits above for each adjacent tile. I ran some tests and everything works fine so far. However, if I try adding in a few random sand or dirt tiles, it won't render at all except for a few places at the beginning of the array. Any ideas? I'm so confused . [edited by - Raloth on August 13, 2003 9:54:07 PM]
____________________________________________________________AAAAA: American Association Against Adobe AcrobatYou know you hate PDFs...
Advertisement
The second parameter to Lock should be the size in bytes that you want to lock, ie. 32*32*6*sizeof(WORD) instead of zero ;->

You may be able to lock a smaller region if you''ve already counted how many tiles use each type ( which you need to know anyway when you draw the data ).
Why use a different set of indicies for each sand/dirt/grss when they are exsactly the same? O_o
quote:Original post by Osc
The second parameter to Lock should be the size in bytes that you want to lock, ie. 32*32*6*sizeof(WORD) instead of zero ;->

You may be able to lock a smaller region if you''ve already counted how many tiles use each type ( which you need to know anyway when you draw the data ).

If you give both parameters 0 then it locks the entire buffer.
quote:Original post by ACAC
Why use a different set of indicies for each sand/dirt/grss when they are exsactly the same? O_o

They aren''t the same...
____________________________________________________________AAAAA: American Association Against Adobe AcrobatYou know you hate PDFs...
Raloth,
I think you may want to consider only using 1 index buffer instead of splitting it into one for each texture type. The reason I had been splitting it before was because I wasn''t doing any blending. If you''re blending, however, you''re going to be rendering several textures for each "tile" so there''s no real point to splitting the index buffer. I think...
Thanks!
Well, I could render the entire map several times. The problem is once you get to things like 6 different texture types you end up rendering 4 times the number of tiles you need to...
____________________________________________________________AAAAA: American Association Against Adobe AcrobatYou know you hate PDFs...
A better way might be to create your index buffers in such a way that all geometry that will be rendered with 1 pass is in 1 buffer, 2 passes in another buffer, 3 passes in another, etc. That way, you''re only rendering a small portion of the geometry multiple times.
Thanks!
Erm...that''s why I need the separate index buffers .
____________________________________________________________AAAAA: American Association Against Adobe AcrobatYou know you hate PDFs...
Dont lock all your index buffers at 1 time, do them seperately. Your code is almost correct, BUT it over writing each IB.
TechleadEnilno, the Ultima 2 projectwww.dr-code.org/enilno
Ok, I will try it once I get my much more annoying alpha blending problem fixed. Thanks!

[edit] Are you sure about that? Because I gave each index buffer a separate pointer. Hmm...

[edited by - Raloth on August 14, 2003 11:52:46 PM]
____________________________________________________________AAAAA: American Association Against Adobe AcrobatYou know you hate PDFs...

This topic is closed to new replies.

Advertisement